[
  {
    "path": ".eslintignore",
    "content": "src\r\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\r\n\r\ngithub: # [mengshukeji]\r\npatreon: mengshukeji\r\nopen_collective: luckysheet\r\nko_fi: # Replace with a single Ko-fi username\r\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\r\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\r\nliberapay: # Replace with a single Liberapay username\r\nissuehunt: # Replace with a single IssueHunt username\r\notechie: # Replace with a single Otechie username\r\ncustom: ['https://www.paypal.me/wbfsa']\r\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\r\nname: Bug report\r\nabout: Create a report to help us improve\r\ntitle: \"[BUG]Find a bug\"\r\nlabels: ''\r\nassignees: ''\r\n\r\n---\r\n\r\n<!--- Thank you for your attention and submit the issue, we hope that besides submitting the issue, you can also help us to understand your user case of Luckysheet, please help fill out the following solicitation form -->\r\n\r\n<!-- Wanted: Who is using Luckysheet https://github.com/mengshukeji/Luckysheet/issues/230 -->\r\n\r\n<!-- The following is the issues template -->\r\n\r\n**Describe the bug**\r\n<!--- A clear and concise description of what the bug is. -->\r\n\r\n**To Reproduce**\r\n<!--- Steps to reproduce the behavior. -->\r\n1. The first step:\r\n2. The second step:\r\n3. The third step:\r\n4. See error:\r\n\r\n**What is expected?**\r\n<!--- A clear and concise description of what you expected to happen. -->\r\n\r\n**Screenshots or demo**\r\n<!--- If applicable, add screenshots or online demo to help explain your problem.We will be more accurate when we retest. -->\r\n\r\n**Environment**\r\n - OS: <!--- [e.g. Windows,Mac,Linux] -->\r\n - Browser Version: <!---[e.g. Chrome Version 84.0.4147.105 (Official Build) (64-bit), Safari,Firefox,Edge] -->\r\n - Luckysheet Version: <!---[e.g. 1.0.1,latest] -->\r\n\r\n**Additional context**\r\n<!--- Add any other context about the problem here. -->\r\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report_zh.md",
    "content": "---\r\nname: '错误报告'\r\nabout: 创建报告帮助我们改进\r\ntitle: '[BUG]发现了个bug'\r\nlabels: ''\r\nassignees: ''\r\n\r\n---\r\n\r\n<!--- 感谢您的关注并发现问题,我们希望除了提交问题,还能帮助我们对您使用Luckysheet做进一步的了解,请帮忙填写以下征集表 -->\r\n\r\n<!-- 征求：谁在使用Luckysheet https://github.com/mengshukeji/Luckysheet/issues/230 -->\r\n\r\n<!-- 以下是issues正文模板 -->\r\n\r\n**描述错误**\r\n<!--- 清楚简洁地描述错误是什么 -->\r\n\r\n**重现**\r\n<!--- 重现错误的步骤 -->\r\n1. 第一步操作:\r\n2. 第二步操作:\r\n3. 第三步操作:\r\n4. 最后看到了什么错误:\r\n\r\n**期望的结果**\r\n<!--- 对您期望发生的结果简洁明了的描述 -->\r\n\r\n**屏幕截图或演示**\r\n<!--- 方便的话，贴上屏幕截图或在线链接复现问题，我们复测时会更精准 -->\r\n\r\n**环境：**\r\n  - 操作系统：<!--- [例如 Windows，Mac，Linux] -->\r\n  - 浏览器 版本号：<!--- [例如 Chrome 版本 84.0.4147.105（正式版本） （64 位），Safari，Firefox，Edge] -->\r\n  - Luckysheet版本：<!--- [例如 1.0.1，最新] -->\r\n\r\n**备注**\r\n<!--- 其他说明 -->\r\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\r\nname: Feature request\r\nabout: Suggest an idea for this project\r\ntitle: \"[Feature request]I have an idea\"\r\nlabels: ''\r\nassignees: ''\r\n\r\n---\r\n\r\n<!--- Thank you for your attention and submit the issue, we hope that besides submitting the issue, you can also help us to understand your user case of Luckysheet, please help fill out the following solicitation form -->\r\n\r\n<!-- Wanted: Who is using Luckysheet https://github.com/mengshukeji/Luckysheet/issues/230 -->\r\n\r\n<!-- The following is the issues template -->\r\n\r\n**Is your feature request related to a problem? Please describe.**\r\n<!--- A clear and concise description of what the problem is. -->\r\n\r\n**Describe the solution you'd like**\r\n<!--- A clear and concise description of what you want to happen. -->\r\n\r\n**Additional context**\r\n<!--- Add any other context or screenshots about the feature request here. -->\r\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request_zh.md",
    "content": "---\r\nname: 功能要求\r\nabout: 为这个项目提出想法\r\ntitle: \"[Feature request]我有个点子\"\r\nlabels: ''\r\nassignees: ''\r\n\r\n---\r\n\r\n<!--- 感谢您的关注并发现问题,我们希望除了提交问题,还能帮助我们对您使用Luckysheet做进一步的了解,请帮忙填写以下征集表 -->\r\n\r\n<!-- 征求：谁在使用Luckysheet https://github.com/mengshukeji/Luckysheet/issues/230 -->\r\n\r\n<!-- 以下是issues正文模板 -->\r\n\r\n**您的功能请求与问题有关吗？**\r\n<!--- 清楚简洁地说明问题 -->\r\n\r\n\r\n**描述您想要的解决方案**\r\n<!--- 对您想要的功能效果简洁明了的描述 -->\r\n\r\n**其他内容**\r\n<!--- 其他说明 -->\r\n"
  },
  {
    "path": ".github/workflows/gitee-mirror.yml",
    "content": "# 使用 GitHub Action 来解决手动同步到 Gitee 的问题\r\n# 效果：github repo 代码更新之后，会自动同步至 gitee\r\n# 使用到的 GitHub Action：https://github.com/Yikun/hub-mirror-action\r\n\r\n# This is a basic workflow to help you get started with Actions\r\n\r\nname: gitee-mirror<sync2gitee.com>\r\n\r\n# Controls when the action will run. Triggers the workflow on push or pull request\r\n# events but only for the master branch\r\non:\r\n  push:\r\n    branches:\r\n      - '*'\r\n\r\njobs:\r\n  # This workflow contains a single job called \"build\"\r\n  build:\r\n    # The type of runner that the job will run on\r\n    runs-on: ubuntu-latest\r\n\r\n    # Steps represent a sequence of tasks that will be executed as part of the job\r\n    steps:\r\n    - name: Mirror the Github organization repos to Gitee.\r\n      uses: Yikun/hub-mirror-action@master\r\n      with:\r\n        src: github/mengshukeji\r\n        dst: gitee/mengshukeji\r\n        # 这里请填写与gitee上公钥匹配的的 ssh private key，参见：https://gitee.com/profile/sshkeys\r\n        # 填写地址：https://github.com/ly525/luban-h5/settings/secrets\r\n        dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}\r\n        # 这里请填写 gitee的令牌，参见：https://gitee.com/profile/personal_access_tokens\r\n        # 填写地址：https://github.com/ly525/luban-h5/settings/secrets\r\n        dst_token: ${{ secrets.GITEE_TOKEN }}\r\n        # 项目同步白名单，可以选择填写多个，以英文逗号分割\r\n        static_list: \"Luckyexcel,Luckysheet,LuckysheetDemo,LuckyexcelDemo,LuckysheetDocs,chartMix,LuckysheetServer\"\r\n        # 是否强制同步\r\n        force_update: true\r\n        # 账号类型：对 luban-h5 而言是 user，因为是个人项目；如果是企业项目，请填写 org，因为是组织下的项目\r\n        account_type: user\r\n"
  },
  {
    "path": ".github/workflows/github-demo.yml",
    "content": "name: Luckysheet demo github pages deploy\r\n\r\non:\r\n  push:\r\n    tags:\r\n      - 'v*'\r\n\r\njobs:\r\n  publish:\r\n    runs-on: ubuntu-latest\r\n    steps:\r\n      - name: Checkout # 检查项目\r\n        uses: actions/checkout@v2\r\n      \r\n      - name: Set up Node.js  # Nodejs版本\r\n        uses: actions/setup-node@master\r\n        with:\r\n          node-version: 12.13.0\r\n      \r\n      - name: Install dependencies & Generate static files # 安装依赖打包demo和文档\r\n        run: |\r\n          node -v\r\n          npm install\r\n          npm install gulp -g\r\n          npm run build\r\n      \r\n      - name: Deploy LuckysheetDemo to GitHub Pages # 发布demo 到github pages\r\n        if: success()\r\n        uses: crazy-max/ghaction-github-pages@v2\r\n        with:\r\n          repo: mengshukeji/LuckysheetDemo\r\n          target_branch: gh-pages\r\n          build_dir: dist\r\n        env:\r\n          GITHUB_TOKEN: ${{ secrets.GIT_TOKEN }}"
  },
  {
    "path": ".github/workflows/github-doc.yml",
    "content": "name: Luckysheet docs github pages deploy\r\n\r\non:\r\n  push:\r\n    tags:\r\n      - 'doc*'\r\n\r\njobs:\r\n  publish:\r\n    runs-on: ubuntu-latest\r\n    steps:\r\n      - name: Checkout # 检查项目\r\n        uses: actions/checkout@v2\r\n      \r\n      - name: Set up Node.js  # Nodejs版本\r\n        uses: actions/setup-node@master\r\n        with:\r\n          node-version: 12.13.0\r\n      \r\n      - name: Install dependencies & Generate static files # 安装依赖打包demo和文档\r\n        run: |\r\n          node -v\r\n          npm install\r\n          npm install gulp -g\r\n          npm run docs:build\r\n      \r\n      - name: Deploy LuckysheetDocs to GitHub Pages # 发布docs 到github pages\r\n        if: success()\r\n        uses: crazy-max/ghaction-github-pages@v2\r\n        with:\r\n          repo: mengshukeji/LuckysheetDocs\r\n          target_branch: gh-pages\r\n          build_dir: docs/.vuepress/dist\r\n        env:\r\n          GITHUB_TOKEN: ${{ secrets.GIT_TOKEN }}"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\r\nnode_modules\r\npackage-lock.json\r\nyarn.lock\r\ndist\r\ndocs/.vuepress/dist\r\nsrc/expendPlugins/print/print.js\r\n\r\n.idea\r\n.history\r\n.vs\r\n.vscode"
  },
  {
    "path": ".prettierignore",
    "content": "dist\n\n*.css\n*.html\n*.md\n*.yml\n*.min.js\npackage.json\npackage-lock.json\n"
  },
  {
    "path": ".prettierrc.json",
    "content": "{\n  \"printWidth\": 80,\n  \"trailingComma\": \"es5\",\n  \"tabWidth\": 2,\n  \"semi\": true,\n  \"singleQuote\": false,\n  \"arrowParens\": \"avoid\"\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\r\n\r\nAll notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.\r\n\r\n### [2.1.13](https://github.com/mengshukeji/Luckysheet/compare/v2.1.12...v2.1.13) (2021-01-19)\r\n\r\n\r\n### Bug Fixes\r\n\r\n* **bug:** bug ([025823b](https://github.com/mengshukeji/Luckysheet/commit/025823b9f386c8048aa44b62f076a739eaa980c0)), closes [#435](https://github.com/mengshukeji/Luckysheet/issues/435)\r\n* **bug:** bug ([a8ff967](https://github.com/mengshukeji/Luckysheet/commit/a8ff967be9cdcf3bbcb0045888951a26a852500a)), closes [#398](https://github.com/mengshukeji/Luckysheet/issues/398)\r\n* **bug:** bug ([deb3a96](https://github.com/mengshukeji/Luckysheet/commit/deb3a965b881d747f9a2171f7d9c9f967d671901))\r\n* **bug:** bug ([5ce1f4a](https://github.com/mengshukeji/Luckysheet/commit/5ce1f4a0b753b7a95569b5285d749389e4d8b943)), closes [#433](https://github.com/mengshukeji/Luckysheet/issues/433)\r\n* **bug:** bug ([932e821](https://github.com/mengshukeji/Luckysheet/commit/932e8215563248f97547ad21a429ef3f8ed0682b)), closes [#423](https://github.com/mengshukeji/Luckysheet/issues/423) [#424](https://github.com/mengshukeji/Luckysheet/issues/424)\r\n* **bug:** bug ([06636f6](https://github.com/mengshukeji/Luckysheet/commit/06636f6a3c08128fe50aa880baabc9420fce4092)), closes [#154](https://github.com/mengshukeji/Luckysheet/issues/154) [#410](https://github.com/mengshukeji/Luckysheet/issues/410) [#416](https://github.com/mengshukeji/Luckysheet/issues/416)\r\n* **bug:** history bug ([973eec8](https://github.com/mengshukeji/Luckysheet/commit/973eec8b71ea963bb23c9fe35c985e86c85ef019))\r\n* **bug:** setRangeFormat history ([065148b](https://github.com/mengshukeji/Luckysheet/commit/065148b5a97e9090479f401463c548c3346757ec))\r\n* **bug:** setRangeShow api ([5bbc45b](https://github.com/mengshukeji/Luckysheet/commit/5bbc45b68e807a2c58c328d93fe8079f3e56fa9f))\r\n* bug ([7412c5b](https://github.com/mengshukeji/Luckysheet/commit/7412c5b4f5aa0afd93f3e0210d3f3fe182c67273))\r\n* **bug:** 文本自动换行bug ([bc926e5](https://github.com/mengshukeji/Luckysheet/commit/bc926e5c49f008c14b4b5e1fdf13713fd6e995b5))\r\n* 换行 ([94022a4](https://github.com/mengshukeji/Luckysheet/commit/94022a48b6407523c5924e94c86fb2ada0fab301))\r\n* **bug:** 渲染换行空行 ([4162b7a](https://github.com/mengshukeji/Luckysheet/commit/4162b7a049f109715a9246ce610d05882d5a5f12))\r\n* **hook:** cellrender ([d444980](https://github.com/mengshukeji/Luckysheet/commit/d44498086fcd3b1b2bf75e95c6a236bc79a1df13))\r\n* **let:** let declar ([71ade32](https://github.com/mengshukeji/Luckysheet/commit/71ade32abd3989230db609ec37f92e931a4473f0))\r\n* **pivottable:** fix ([7cecb12](https://github.com/mengshukeji/Luckysheet/commit/7cecb12ae3a1a0bd0d5bdce803429d4464388e31)), closes [#439](https://github.com/mengshukeji/Luckysheet/issues/439) [#447](https://github.com/mengshukeji/Luckysheet/issues/447)\r\n* **pivottable:** init ([5b19e8b](https://github.com/mengshukeji/Luckysheet/commit/5b19e8b06bdd95c2b799d2cc1d6ae677b96617cd))\r\n* **pivottable:** refresh ([78330c9](https://github.com/mengshukeji/Luckysheet/commit/78330c95db2735c8139b0320c2e81ee6f438adea))\r\n\r\n### [2.1.12](https://github.com/mengshukeji/Luckysheet/compare/v2.1.11...v2.1.12) (2020-12-22)\r\n\r\n\r\n### Features\r\n\r\n* **api:** find ([ea97233](https://github.com/mengshukeji/Luckysheet/commit/ea97233a668b3a682f6f0b1ad3fec251b01c33ab))\r\n\r\n\r\n### Bug Fixes\r\n\r\n* **bug:** bug ([9357792](https://github.com/mengshukeji/Luckysheet/commit/9357792fd1c49737398cf86cdf87d9dbfe35df26)), closes [#359](https://github.com/mengshukeji/Luckysheet/issues/359) [#360](https://github.com/mengshukeji/Luckysheet/issues/360) [#376](https://github.com/mengshukeji/Luckysheet/issues/376) [#382](https://github.com/mengshukeji/Luckysheet/issues/382)\r\n* **bug:** bug ([19560eb](https://github.com/mengshukeji/Luckysheet/commit/19560eba3fe36cce4ee65ba3e8ac80ab7ec8d620)), closes [#367](https://github.com/mengshukeji/Luckysheet/issues/367) [#370](https://github.com/mengshukeji/Luckysheet/issues/370)\r\n* **bug:** bug ([0f257e8](https://github.com/mengshukeji/Luckysheet/commit/0f257e8f153bb6c0cf38fb85200c587aabac164c)), closes [#361](https://github.com/mengshukeji/Luckysheet/issues/361) [#364](https://github.com/mengshukeji/Luckysheet/issues/364) [#365](https://github.com/mengshukeji/Luckysheet/issues/365)\r\n* **bug:** copy bug ([2bcbab9](https://github.com/mengshukeji/Luckysheet/commit/2bcbab9a9f4727fd03930962a2dbdcaec3401597))\r\n* **feature:** functionButton ([5983cb0](https://github.com/mengshukeji/Luckysheet/commit/5983cb015e092e2edc1d3f27dba2d585fb4db099)), closes [#336](https://github.com/mengshukeji/Luckysheet/issues/336) [#381](https://github.com/mengshukeji/Luckysheet/issues/381)\r\n* copy ([d177cc8](https://github.com/mengshukeji/Luckysheet/commit/d177cc8f5ee01d32932d1137920883209ec24be4))\r\n\r\n### [2.1.10](https://github.com/mengshukeji/Luckysheet/compare/v2.1.9...v2.1.10) (2020-12-18)\r\n\r\n\r\n### Bug Fixes\r\n\r\n* **rowtitle:** bug ([8faeffe](https://github.com/mengshukeji/Luckysheet/commit/8faeffee08840a5e8119d9fc8ac7204248105616))\r\n\r\n### [2.1.9](https://github.com/mengshukeji/Luckysheet/compare/v2.1.8...v2.1.9) (2020-12-17)\r\n\r\n\r\n### Bug Fixes\r\n\r\n* **bug:** bug ([54ae143](https://github.com/mengshukeji/Luckysheet/commit/54ae143aa268b5ce0253752a2a92b2ab22601b42)), closes [#222](https://github.com/mengshukeji/Luckysheet/issues/222) [#355](https://github.com/mengshukeji/Luckysheet/issues/355)\r\n* **numeral:** userInfo ([871d381](https://github.com/mengshukeji/Luckysheet/commit/871d3819f7c734b604f19da1ba81bf5ee0ea0814)), closes [#338](https://github.com/mengshukeji/Luckysheet/issues/338)\r\n\r\n### [2.1.8](https://github.com/mengshukeji/Luckysheet/compare/v2.1.7...v2.1.8) (2020-12-16)\r\n\r\n\r\n### ⚠ BREAKING CHANGES\r\n\r\n* **bug:** n\r\n\r\n### Features\r\n\r\n* **api add:** image ([16131b2](https://github.com/mengshukeji/Luckysheet/commit/16131b2776cd278bb7bddae674c206aa739f3a46)), closes [#270](https://github.com/mengshukeji/Luckysheet/issues/270)\r\n* **changlang:** changLang ([cbc81e9](https://github.com/mengshukeji/Luckysheet/commit/cbc81e9e17ca56e09f9e697e5372650f3d6a476b)), closes [#318](https://github.com/mengshukeji/Luckysheet/issues/318)\r\n* **collaborative editing:** collaborative editing ([6fe8726](https://github.com/mengshukeji/Luckysheet/commit/6fe87260e8986cd83e7bcf655594389c01739107)), closes [#199](https://github.com/mengshukeji/Luckysheet/issues/199) [#201](https://github.com/mengshukeji/Luckysheet/issues/201) [#202](https://github.com/mengshukeji/Luckysheet/issues/202)\r\n* **condition format:** formula condition ([6c98bde](https://github.com/mengshukeji/Luckysheet/commit/6c98bded8dcf16aab4bcc89a63a62d3878c06cd3)), closes [#186](https://github.com/mengshukeji/Luckysheet/issues/186)\r\n* **demo:** proxy ([bc64807](https://github.com/mengshukeji/Luckysheet/commit/bc64807de9e3f8f60ddc529c6b795c95aff1884c))\r\n* **feature:** closeWebsocket api and ctrl ; ([9153bc7](https://github.com/mengshukeji/Luckysheet/commit/9153bc799db2aea947f2ba70a7b947daca55b844)), closes [#328](https://github.com/mengshukeji/Luckysheet/issues/328) [#326](https://github.com/mengshukeji/Luckysheet/issues/326)\r\n* **hook:** add ([2c6b1c2](https://github.com/mengshukeji/Luckysheet/commit/2c6b1c21b3ad6535671745fd7483d9318f7e55ec))\r\n* **print feature:** develop ([a0921b6](https://github.com/mengshukeji/Luckysheet/commit/a0921b62d73b8b3edcaf1c72dd9e35cd43848f2f))\r\n\r\n\r\n### Bug Fixes\r\n\r\n* **add forcecaculation config:** add ([e96d210](https://github.com/mengshukeji/Luckysheet/commit/e96d210fe544caa8b912720a274374bccb0cef7d))\r\n* **bug:** bug ([95e26c3](https://github.com/mengshukeji/Luckysheet/commit/95e26c3fa07fa74c238c0c7b96b5b7ff91b79889)), closes [#330](https://github.com/mengshukeji/Luckysheet/issues/330)\r\n* **bug:** bug ([c003f8a](https://github.com/mengshukeji/Luckysheet/commit/c003f8a4281f346c89226061851f71693208574a)), closes [#184](https://github.com/mengshukeji/Luckysheet/issues/184) [#337](https://github.com/mengshukeji/Luckysheet/issues/337)\r\n* **bug:** bug ([4900b4a](https://github.com/mengshukeji/Luckysheet/commit/4900b4a0f2a82528e130d7281bb1f153ed3297fe)), closes [#331](https://github.com/mengshukeji/Luckysheet/issues/331)\r\n* **bug:** bug ([b93ea6b](https://github.com/mengshukeji/Luckysheet/commit/b93ea6b66e444d387f230602dd02034b4b237369)), closes [#284](https://github.com/mengshukeji/Luckysheet/issues/284) [#296](https://github.com/mengshukeji/Luckysheet/issues/296)\r\n* **bug:** bug ([57ff2b9](https://github.com/mengshukeji/Luckysheet/commit/57ff2b959b4be8d5cad559624d92f00e996d315f)), closes [#182](https://github.com/mengshukeji/Luckysheet/issues/182) [#220](https://github.com/mengshukeji/Luckysheet/issues/220)\r\n* **bug:** bug ([31bdc4f](https://github.com/mengshukeji/Luckysheet/commit/31bdc4feae0037c92074b244e9e52363298b164d)), closes [#263](https://github.com/mengshukeji/Luckysheet/issues/263)\r\n* **bug:** bug ([385bc03](https://github.com/mengshukeji/Luckysheet/commit/385bc039c91727655ea771c7a48d6f0890a275fb)), closes [#243](https://github.com/mengshukeji/Luckysheet/issues/243) [#226](https://github.com/mengshukeji/Luckysheet/issues/226)\r\n* **bug:** bug ([88aa6c5](https://github.com/mengshukeji/Luckysheet/commit/88aa6c5b59964078c6a9cfffb41308c196a44953)), closes [#278](https://github.com/mengshukeji/Luckysheet/issues/278) [#276](https://github.com/mengshukeji/Luckysheet/issues/276) [#267](https://github.com/mengshukeji/Luckysheet/issues/267) [#215](https://github.com/mengshukeji/Luckysheet/issues/215)\r\n* **bug:** copy to excel ([5cf72ec](https://github.com/mengshukeji/Luckysheet/commit/5cf72ec0781f0e3b2ddc77eac228812507ce66a2)), closes [#319](https://github.com/mengshukeji/Luckysheet/issues/319)\r\n* **bug:** data verification range select ([6d60679](https://github.com/mengshukeji/Luckysheet/commit/6d606791abaa5d410ce68cfb49f8bc9c2dfaf609))\r\n* **cell:** render ([ba21140](https://github.com/mengshukeji/Luckysheet/commit/ba2114055ba62b0401c76075054588642fa4fbf1))\r\n* **demo:** websocket url ([cf77ec3](https://github.com/mengshukeji/Luckysheet/commit/cf77ec3307c0d44bc5303f606762c003d4f50b86))\r\n* **dynamic array refresh fix:** fix ([b7d634f](https://github.com/mengshukeji/Luckysheet/commit/b7d634f0425dd8cb337784b10094d0952edc460a))\r\n* **fix #209:** highlight ([ab2d8b7](https://github.com/mengshukeji/Luckysheet/commit/ab2d8b7b5467200e12c8d4c1ece014ebfc6ee7cc)), closes [#209](https://github.com/mengshukeji/Luckysheet/issues/209)\r\n* **fix #209 ,fix #219:** highlight follow checkout keep highlight ([c547596](https://github.com/mengshukeji/Luckysheet/commit/c5475964e41eb7bb12d87b679dffba4b988abb30)), closes [#209](https://github.com/mengshukeji/Luckysheet/issues/209) [#219](https://github.com/mengshukeji/Luckysheet/issues/219)\r\n* **fix #209 fix #219:** highlight follow checkout page ([0a5ca86](https://github.com/mengshukeji/Luckysheet/commit/0a5ca86ab808d2cb1da8cb14d93c5d787c50f540)), closes [#209](https://github.com/mengshukeji/Luckysheet/issues/209) [#219](https://github.com/mengshukeji/Luckysheet/issues/219)\r\n* **fix #209 fix #219:** highlight follow, checkout keep highlight ([2c7b0bb](https://github.com/mengshukeji/Luckysheet/commit/2c7b0bbdf5adf1b2a6fc537e37825ab01ee3cf96)), closes [#209](https://github.com/mengshukeji/Luckysheet/issues/209) [#219](https://github.com/mengshukeji/Luckysheet/issues/219)\r\n* **fix #290:** userinfo ([80d67e1](https://github.com/mengshukeji/Luckysheet/commit/80d67e157d010f8e59c472b2e6046c04efe9b966)), closes [#290](https://github.com/mengshukeji/Luckysheet/issues/290)\r\n* **fix #290:** userinfo ([dddfc8f](https://github.com/mengshukeji/Luckysheet/commit/dddfc8f9418991466025682309e73950da6611cd)), closes [#290](https://github.com/mengshukeji/Luckysheet/issues/290)\r\n* **fix #290:** userinfo ([27a770e](https://github.com/mengshukeji/Luckysheet/commit/27a770ee863356d2ef120970723bb048c510d9aa)), closes [#290](https://github.com/mengshukeji/Luckysheet/issues/290)\r\n* **main canvas:** bottom space ([23c8a78](https://github.com/mengshukeji/Luckysheet/commit/23c8a78cb3bd387c7c609250de41b187105475b5))\r\n* **tojson:** bug ([1c94783](https://github.com/mengshukeji/Luckysheet/commit/1c94783677bcfe6488caf39028f18e5b2505a737))\r\n*  setCellValue API 可设置自定义的属性，不显式设置v, v 不会丢失 ([6d45cf2](https://github.com/mengshukeji/Luckysheet/commit/6d45cf2ce63dca282f4a40ce5aaf628f94bfc8d1))\r\n* jfrefreshgrid 函数第二个参数应该是个数组 ([c7cf87a](https://github.com/mengshukeji/Luckysheet/commit/c7cf87a49b1b8ce64fb21249cd05950fabc0e546))\r\n* setCellFormat data  引用 ([ed50e47](https://github.com/mengshukeji/Luckysheet/commit/ed50e47b44e079bc76419ba3f96f04d964c70610))\r\n* setCellValue 刷新页面时的历史记录问题 ([a2cf969](https://github.com/mengshukeji/Luckysheet/commit/a2cf96978f97b289d603aa404bcfaf8a0d64f87b))\r\n* 修复alert ([94e0020](https://github.com/mengshukeji/Luckysheet/commit/94e0020acd49aed50810e6c133688c950690ab3c))\r\n* 修复主动关闭socket仍然alert弹窗 ([e0bdb2c](https://github.com/mengshukeji/Luckysheet/commit/e0bdb2c4015355e428c5e8d567196d607606a38e))\r\n* 修复主动关闭socket定时器仍运行问题 ([82a8731](https://github.com/mengshukeji/Luckysheet/commit/82a87319342c698c1a1a58972a9d59ab3b7e91cd))\r\n* 初始化表单状态下标调整 ([3a54312](https://github.com/mengshukeji/Luckysheet/commit/3a54312c93a6daebf575639dd612e0d01be2a296))\r\n* 复制选区虚线框正确显示 ([9d6a2ee](https://github.com/mengshukeji/Luckysheet/commit/9d6a2eed05ae660fb65515217e156817fc4d6443))\r\n* 解决单击非时间日期单元格后还会跳出日期时间弹框 ([fc9eb4e](https://github.com/mengshukeji/Luckysheet/commit/fc9eb4e7984af6991b79acae6a2a5c0bbea5254f))\r\n* **fix forcecaculation feature:** complete ([7568ceb](https://github.com/mengshukeji/Luckysheet/commit/7568ceb442acdfdedeb6d6e4d623bdcd2a8c4018))\r\n* **formula contain text bug:** add iscell method ([89358d3](https://github.com/mengshukeji/Luckysheet/commit/89358d36045baca791f2b5e9d2152349bf5903cf))\r\n* **formula update fix:** formula update only one level, when cell value change. Fix it ([cf6c5be](https://github.com/mengshukeji/Luckysheet/commit/cf6c5be8a45616e1002db0ff4b04b47c3ed4c38e))\r\n\r\n### [2.1.7](https://github.com/mengshukeji/Luckysheet/compare/v2.1.6...v2.1.7) (2020-11-26)\r\n\r\n\r\n### Features\r\n\r\n* **demo:** tool function ([3baf93c](https://github.com/mengshukeji/Luckysheet/commit/3baf93cdb57238ee73ace3e7b9bca142fad81584))\r\n* 修改日期能够正常的弹出格式框和设置对应格式的日期时间 ([2c27044](https://github.com/mengshukeji/Luckysheet/commit/2c2704473c1c5a77091acda45a46f39ebbad3592))\r\n* 修改日期能够正常的弹出格式框和设置对应格式的日期时间 ([67c44e7](https://github.com/mengshukeji/Luckysheet/commit/67c44e7a68d948fcb90bd499ecc15cfb2bea5127))\r\n\r\n\r\n### Bug Fixes\r\n\r\n* **formula:** function ([dad6e2b](https://github.com/mengshukeji/Luckysheet/commit/dad6e2b2d144a31f4cfaaf84c90588e1a02ee006))\r\n* **formular:** docs ([ddac582](https://github.com/mengshukeji/Luckysheet/commit/ddac582f696898a1a46fc0ce3eb5d245d20077ae))\r\n* **hook:** function ([fb43a56](https://github.com/mengshukeji/Luckysheet/commit/fb43a56222c3d4c77b84efa9ff37eed8e1333a1a))\r\n* **hook function:** cellupdate ([5e8f71f](https://github.com/mengshukeji/Luckysheet/commit/5e8f71f32e5104769dbe6e0c61de3cd26b286344))\r\n* ie11右下角菜单图标会出现错位 ([34fd6e7](https://github.com/mengshukeji/Luckysheet/commit/34fd6e74cb87f9563ff28979d9f5f8a192fb558a))\r\n* 重复create会出现很多问题 ([8f22790](https://github.com/mengshukeji/Luckysheet/commit/8f227904fe9600ea17fdc346924d73c3bc81a041))\r\n\r\n### [2.1.6](https://github.com/mengshukeji/Luckysheet/compare/v2.1.5...v2.1.6) (2020-11-23)\r\n\r\n\r\n### ⚠ BREAKING CHANGES\r\n\r\n* yes\r\n\r\nq\r\n\r\n### Features\r\n\r\n* **api:** hook function ([a0db530](https://github.com/mengshukeji/Luckysheet/commit/a0db530295bca24b81b02171a073f6b6f1227ce6))\r\n* **hook:** add hook function ([215dec2](https://github.com/mengshukeji/Luckysheet/commit/215dec27d796ee9b5be7857a425093a53db84332))\r\n* q ([54a42a2](https://github.com/mengshukeji/Luckysheet/commit/54a42a274a96eb3334602fd0de65e1d4b2fc492a))\r\n* **bottom alignment of english letters:** fix ([a596d2f](https://github.com/mengshukeji/Luckysheet/commit/a596d2fcd617cac196e3336a8dfe8ac9ba58c9f7))\r\n* **config:** sheetRightClickConfig ([59c7cb3](https://github.com/mengshukeji/Luckysheet/commit/59c7cb34a33450e59023fd1ae5e615f3e40ef0d9))\r\n* add underline button ([df56ba6](https://github.com/mengshukeji/Luckysheet/commit/df56ba6f359bb12eb765b26b973100c554601eca))\r\n* use npm dependencies ([e4bd439](https://github.com/mengshukeji/Luckysheet/commit/e4bd439a0e96dbec0cb3a45e01aaecb129fab2ad))\r\n* **row and column width:** batch change the height and width of the selected row and column ([956bd2a](https://github.com/mengshukeji/Luckysheet/commit/956bd2a01012b429c58a14b5b88d02a02350b662))\r\n\r\n\r\n### Bug Fixes\r\n\r\n* **bug fix:** [#26](https://github.com/mengshukeji/Luckysheet/issues/26) [#91](https://github.com/mengshukeji/Luckysheet/issues/91) ([a26ffd8](https://github.com/mengshukeji/Luckysheet/commit/a26ffd8ac388db475dfd38e4ae83098eeeee8bc8))\r\n* **cooperative:** bug ([9e48c72](https://github.com/mengshukeji/Luckysheet/commit/9e48c72a47022188d387558b5b5f3a6250878c65))\r\n* **demo:** ie11 ([e7ddc39](https://github.com/mengshukeji/Luckysheet/commit/e7ddc397c8b1e421c63f3e9f661ced99a3d81556)), closes [#234](https://github.com/mengshukeji/Luckysheet/issues/234)\r\n* **fix #212:** cancel highlight ([289d3ef](https://github.com/mengshukeji/Luckysheet/commit/289d3ef46ebadf9662d272109a1f24d2a8b0dc1d)), closes [#212](https://github.com/mengshukeji/Luckysheet/issues/212)\r\n* **fix #219:** checkout ([15dca04](https://github.com/mengshukeji/Luckysheet/commit/15dca040840d228f6326d4eecad917df38e15f04)), closes [#219](https://github.com/mengshukeji/Luckysheet/issues/219)\r\n* **fix #219:** clear info ([080f027](https://github.com/mengshukeji/Luckysheet/commit/080f0275b80143026cc30e8450c901715fc51c19)), closes [#219](https://github.com/mengshukeji/Luckysheet/issues/219)\r\n* sheet menu position ([a40f679](https://github.com/mengshukeji/Luckysheet/commit/a40f679fde6700c90cd66c66bb070afabb31fb83))\r\n* **iconfont:** conflict ([bf4d539](https://github.com/mengshukeji/Luckysheet/commit/bf4d539dddc4cef232f8eae602b39980ded5b208))\r\n* **mousemove hook error:** fix ([89b93e7](https://github.com/mengshukeji/Luckysheet/commit/89b93e71460750be8f736df0dbc13675daf5d72d))\r\n\r\n### [2.1.5](https://github.com/mengshukeji/Luckysheet/compare/v2.1.4...v2.1.5) (2020-11-03)\r\n\r\n\r\n### Features\r\n\r\n* **cell date picker:** cell date picker and bug solve ([2996ae9](https://github.com/mengshukeji/Luckysheet/commit/2996ae9cab724714903d00e0b63022abc4a1a3b6))\r\n* **cell hooks add:** go to document for detail ([927ff46](https://github.com/mengshukeji/Luckysheet/commit/927ff46949f688a5bcffcb3fe48dc6b4b12b61c9))\r\n* **config:** custom menu button config ([14eb78e](https://github.com/mengshukeji/Luckysheet/commit/14eb78e153cbce726adf9e093702f9b93af1fa03))\r\n* **config:** sheetbar ([3555746](https://github.com/mengshukeji/Luckysheet/commit/3555746f4cc8ef2c1fe163a34edd428f1a6377ed))\r\n* **date format:** date format Chinese ([8f8d0cb](https://github.com/mengshukeji/Luckysheet/commit/8f8d0cb8c5563a31afba3fe11b525e6bccd5eb56))\r\n* **hyperlink:** add hyperlink function ([439dff4](https://github.com/mengshukeji/Luckysheet/commit/439dff4330ab5053643331286091d44ae910fb8d))\r\n* **hyperlink:** perfect hyperlink function ([5adfc60](https://github.com/mengshukeji/Luckysheet/commit/5adfc6055bf4cfed7f1ff40933d292057196bc7e))\r\n* **statisticbar:** config docs ([c1ed417](https://github.com/mengshukeji/Luckysheet/commit/c1ed417074e89e665f9ef39ee186db9106904c4e))\r\n* **tojson:** api/docs ([8e410f5](https://github.com/mengshukeji/Luckysheet/commit/8e410f5d3cd61724230b3024898d6de3c6c41101))\r\n\r\n\r\n### Bug Fixes\r\n\r\n* **bug:** bug ([ad73f9a](https://github.com/mengshukeji/Luckysheet/commit/ad73f9a679d77721d8af0a483dffe70b90e56412)), closes [#129](https://github.com/mengshukeji/Luckysheet/issues/129)\r\n* **bug:** bug ([801cbe5](https://github.com/mengshukeji/Luckysheet/commit/801cbe5a8040d80f2e672b3607c0b92c922281a9))\r\n* **bug:** bug ([f8716c1](https://github.com/mengshukeji/Luckysheet/commit/f8716c18db05c7ab8bf59d1feb0dc4c3b364c560)), closes [#67](https://github.com/mengshukeji/Luckysheet/issues/67) [#85](https://github.com/mengshukeji/Luckysheet/issues/85)\r\n* **bug:** bug ([0909f5e](https://github.com/mengshukeji/Luckysheet/commit/0909f5e4c957e3d3248a8c86d6e092c5a5396112)), closes [#142](https://github.com/mengshukeji/Luckysheet/issues/142) [#132](https://github.com/mengshukeji/Luckysheet/issues/132)\r\n* **bug:** dataVerification and sheet move and delete cell bug ([4815d86](https://github.com/mengshukeji/Luckysheet/commit/4815d86ce564da43aa1ced3b48d38e88afc39f77))\r\n* **conflict:** conflict ([b11de26](https://github.com/mengshukeji/Luckysheet/commit/b11de26c4d2dbdd7e9d4363558e95d4433f26585))\r\n* **conflict:** toolbar ([8cfa6ac](https://github.com/mengshukeji/Luckysheet/commit/8cfa6ac1bec8bcb156fe45e8c488aa7026b65738))\r\n* **fix  bug with inline string rotate wrap:** add change to max, fix height error ([1988687](https://github.com/mengshukeji/Luckysheet/commit/198868719ffb19738ee5ecc1ee060a0840fa92df))\r\n* **hide row/column:** right click menu ([8070858](https://github.com/mengshukeji/Luckysheet/commit/8070858f6c35f11ee8cf2692d8828d0e78c46d92)), closes [#37](https://github.com/mengshukeji/Luckysheet/issues/37)\r\n* **restore demo:** restore demo ([e799862](https://github.com/mengshukeji/Luckysheet/commit/e7998627400b82bf082bad3c984f4d26e3c9f43a))\r\n\r\n### [2.1.3](https://github.com/mengshukeji/Luckysheet/compare/v2.1.2...v2.1.3) (2020-10-22)\r\n\r\n\r\n### Features\r\n\r\n* **api add:** getRowHeight getColumnWidth getDefaultRowHeight getDefaultColumnWidth ([a72f38b](https://github.com/mengshukeji/Luckysheet/commit/a72f38b641a999bdf15281029777222e0bf79e85))\r\n* **api add:** setRowHeight setColumnWidth setSheetZoom setDataVerification deleteDataVerification ([0fd06cc](https://github.com/mengshukeji/Luckysheet/commit/0fd06cc4d7f465967b3bcc91e0b2484ba61b71f6))\r\n* **api add:** setSheetOrder refresh getScreenshot setWorkbookName undo redo ([b2a4617](https://github.com/mengshukeji/Luckysheet/commit/b2a46171c2cfcd9682537a801a1ea68e7e2d3ba0))\r\n* **api and config:** api exitEditMode() scroll() config defaultFontSize ([5eedc48](https://github.com/mengshukeji/Luckysheet/commit/5eedc48a764727bebe09fd626087b158b2979c1e))\r\n* **support spanish:** support Spanish ([41c527c](https://github.com/mengshukeji/Luckysheet/commit/41c527c6f39a8cb3a99d3fc70603f29ab7ba0a82))\r\n\r\n\r\n### Bug Fixes\r\n\r\n* **api:** api ([14d72eb](https://github.com/mengshukeji/Luckysheet/commit/14d72ebe56a2f87f0df5d14595c60e41fe9af077))\r\n* **bug:** postil image zoom ([76dbb5c](https://github.com/mengshukeji/Luckysheet/commit/76dbb5cc613c8290696e917c554aff934050b6a2))\r\n* **destroy function repaire:** repair ([02b9fe7](https://github.com/mengshukeji/Luckysheet/commit/02b9fe75f28a87a475bd0593522b20d030d31b85))\r\n* **event name:** fix ([f64ba54](https://github.com/mengshukeji/Luckysheet/commit/f64ba54455e2a757c72fb4c0110fef2cc5ccdaab))\r\n* **fix focus after formula edit:** fix ([0ee5f31](https://github.com/mengshukeji/Luckysheet/commit/0ee5f31f5ce84c1a7fab2af17ff102790603e3bb))\r\n* **fix text whole text wrap bug:** fix ([ef3d324](https://github.com/mengshukeji/Luckysheet/commit/ef3d324e80bc648080b1e5a53108b30dccf74520))\r\n* **function array value error:** fix it ([31e4b3d](https://github.com/mengshukeji/Luckysheet/commit/31e4b3d9e4cf16f005f8cede059b7cb1cab05031))\r\n* **function update fix:** fix bug ([28835bb](https://github.com/mengshukeji/Luckysheet/commit/28835bb7533087eb16866b4cdaebe94231c7832b))\r\n* **image:** resize and change row or column size ([05c49a2](https://github.com/mengshukeji/Luckysheet/commit/05c49a2fad21706ee7e232fe75d213fed3724109))\r\n* **image fuzzy:** fix it ([8fb1a88](https://github.com/mengshukeji/Luckysheet/commit/8fb1a88669d772a0067edb614e5974ada7301c9c))\r\n* **image zoom:** fix ([1337178](https://github.com/mengshukeji/Luckysheet/commit/1337178a991b4aa99a6e255e50d69e2c8ca47b82))\r\n* **index offset indirect fix:** improve the overall execution efficiency of the function ([7a2f8d0](https://github.com/mengshukeji/Luckysheet/commit/7a2f8d02daf2cc0180adc56dafcfb1d1f6d022ec))\r\n* **inline style:** inline style cell delete bug ([8067a01](https://github.com/mengshukeji/Luckysheet/commit/8067a012ec59a39c5a389d357c3ba2c19bc6acb9))\r\n* **lineheight change to 0.5:** similar to excel ([760378b](https://github.com/mengshukeji/Luckysheet/commit/760378b369b9bf71da0182ea3b413a0accb23c38))\r\n* **more btn:** fix more btn align middle ([c5112e9](https://github.com/mengshukeji/Luckysheet/commit/c5112e9700cd89d4820cbbbefdc0e1d3d0ed940a))\r\n* **more formats toolbar:** fix more formats toolbar can't sync with cell, fix mac delete button can't delete cell, fix can't delete cell with inline-style ([23fcb13](https://github.com/mengshukeji/Luckysheet/commit/23fcb137cb594cfb4bc6dfe2ac86d306c42427f9))\r\n* **selection bug:** fix it ([b83447d](https://github.com/mengshukeji/Luckysheet/commit/b83447d61805192d0310b20e97821eb01b790fb7))\r\n* **setcellvalue delete function fix:** fix it ([00b351f](https://github.com/mengshukeji/Luckysheet/commit/00b351fa0dc01c32cf9c6b8852937e7d2ceb292d))\r\n* **sheet name contains squotes bug:** formla can not execute, when sheet name contains squotes ([fc1dd83](https://github.com/mengshukeji/Luckysheet/commit/fc1dd837d4a3d1639914923201e853e55a865143))\r\n* **text wrap postion bug:** wrap and rotation postion wrong ([9538972](https://github.com/mengshukeji/Luckysheet/commit/9538972f910ed77e02ccb55c0b96386fcf87297b))\r\n* **the bug with first word is space:** fix ti ([6ae8319](https://github.com/mengshukeji/Luckysheet/commit/6ae83196cb50fafbf5657104babd124fac27b818))\r\n* **update number add quote automatically:** similar to excel ([05b01a6](https://github.com/mengshukeji/Luckysheet/commit/05b01a6c95a5d0736c51c5c1ca41e9eb463122d8))\r\n* **validation of \"0\" values:** fix ([7255c51](https://github.com/mengshukeji/Luckysheet/commit/7255c51d7b46523ff423ee5560b78d18f8535821))\r\n\r\n## [2.1.0](https://github.com/mengshukeji/Luckysheet/compare/v2.0.0...v2.1.0) (2020-10-10)\r\n\r\n\r\n### ⚠ BREAKING CHANGES\r\n\r\n* **frozen,docs:** when init workbook and sheet has frozen row or column,you need init sheet's\r\nproperty frozen\r\n\r\n### Features\r\n\r\n* **add autocalculationmerge sheet attribute:** it can auto calculate merge infomation ([f7e30cf](https://github.com/mengshukeji/Luckysheet/commit/f7e30cf946f9c5945fd7e69bf4a3273f54e2616f))\r\n* **add force cacultion  formula:** add forceCaculate parameter ([4dd82ad](https://github.com/mengshukeji/Luckysheet/commit/4dd82ad131e0a936c040852657b05ffd53e4b465))\r\n* **api:** add some api functions ([37910ab](https://github.com/mengshukeji/Luckysheet/commit/37910abea38dc37fcb5cc5b905c7b028e3390c10))\r\n* **api:** api ([6f7ca26](https://github.com/mengshukeji/Luckysheet/commit/6f7ca26ba22c47ed0746363dccfd1e392040aed9))\r\n* **api:** api ([66aecbe](https://github.com/mengshukeji/Luckysheet/commit/66aecbe7fe16be03c9c62e1ebbf941c1a9f4bac7))\r\n* **api:** provides an api for users ([b176753](https://github.com/mengshukeji/Luckysheet/commit/b176753ceacba3ab8a243bfe27c5ea8d9455d617))\r\n* **api add:** api add ([e4198fa](https://github.com/mengshukeji/Luckysheet/commit/e4198fa5bda4f6787a3153a113d2be10cfe64fd5))\r\n* **api add:** deleteRangeConditionalFormat clearRange deleteRange ([44cf72a](https://github.com/mengshukeji/Luckysheet/commit/44cf72a1c7592ac5227a92c3e325e7f5088bca30))\r\n* **api add:** setSheetDelete setSheetCopy setSheetHide setSheetShow setSheetName setSheetColor ([62f641f](https://github.com/mengshukeji/Luckysheet/commit/62f641fe7f519b8679c4e006427a74e2e17a8f98))\r\n* **data verification:** data verification ([a661d30](https://github.com/mengshukeji/Luckysheet/commit/a661d303101ee6ebedf22aabb60f7a5a50722b0e))\r\n* **data verification:** data verification ([9cbbbce](https://github.com/mengshukeji/Luckysheet/commit/9cbbbce556444182536bf0a0641c5db22d4a6007))\r\n* **delete cell:** delete cell ([d7de718](https://github.com/mengshukeji/Luckysheet/commit/d7de718d5e6e6308cae1ccf7a7699c3f7d790d8f))\r\n* **draw use sacle:** cancel manual devicePixRatio, use context sacle ([c832283](https://github.com/mengshukeji/Luckysheet/commit/c832283c9709a8393f2c6b74d50e984c7720bb34))\r\n* **drawmain efficiency optimization:** efficiency optimization ([37080fa](https://github.com/mengshukeji/Luckysheet/commit/37080faa39dccb23539d346080baf07ad367c2d7))\r\n* **editor box position fit:** show diffrent position acording to align ([636046d](https://github.com/mengshukeji/Luckysheet/commit/636046dbb2f005c2e6110b3559b72a59a7c67d87))\r\n* **fix:** fix ([9830714](https://github.com/mengshukeji/Luckysheet/commit/983071467d21a5eb1a35c0c427005e95364128db))\r\n* **hide column:** hide column ([9f05959](https://github.com/mengshukeji/Luckysheet/commit/9f05959d4d5fea7fc26e0cedb7217f0be92bcae9))\r\n* **image:** copy and paste ([33d6c96](https://github.com/mengshukeji/Luckysheet/commit/33d6c961bb2d88fa1ba73448c2b808957f750544))\r\n* **image insert:** image insert ([4232dfc](https://github.com/mengshukeji/Luckysheet/commit/4232dfc7832846013e623d13f6157ee1e371bda3))\r\n* **inline string:** finished ([325b66c](https://github.com/mengshukeji/Luckysheet/commit/325b66ccd0e7508535f16a7dfc51acba622cfc14))\r\n* **inline string:** operation like excel ([9ac9f08](https://github.com/mengshukeji/Luckysheet/commit/9ac9f08acf088b614b5318000df2e0d442df21fd))\r\n* **inline string:** when focus cell, show inline string content ([713805c](https://github.com/mengshukeji/Luckysheet/commit/713805cd031ccdf3e5ef1b70da504b635fed85fa))\r\n* **inline string render finished:** begin to develop edit feature ([2ffd9ae](https://github.com/mengshukeji/Luckysheet/commit/2ffd9aedd82e9abaf32b374337503f25d56fd9da))\r\n* **insert image:** insert image ([cf3ba93](https://github.com/mengshukeji/Luckysheet/commit/cf3ba930cadc90e3fc753ac30154974e74089cfc))\r\n* **insert image perfect:** insert image perfect ([ad0a88a](https://github.com/mengshukeji/Luckysheet/commit/ad0a88a8d412202692ce1611f6ac7fe4ac30d2e9))\r\n* **mobile touch event optimized:** very smooth, good experience ([0ed0bf6](https://github.com/mengshukeji/Luckysheet/commit/0ed0bf63ba06895a2ea39c581d0180db6c0d9266))\r\n* **new style:** new style ([5c8d603](https://github.com/mengshukeji/Luckysheet/commit/5c8d603fc41e9c214cb3dca84a147b39f2f6ce06))\r\n* **optimization function:** setCellvalue support any cell param ([9b208e4](https://github.com/mengshukeji/Luckysheet/commit/9b208e4e2eeeaae09dbe75b245c989f98747613a))\r\n* **protection feature:** protection feature similar to Excel ([a71c92a](https://github.com/mengshukeji/Luckysheet/commit/a71c92a5f05aaed6c3df1556a81fc1b2ed97419a))\r\n* **zoom feature beta:** zoom in and zoom out sheet ([249aa02](https://github.com/mengshukeji/Luckysheet/commit/249aa02fa6c74eb854034ee0913a73267b6057cc))\r\n* **zoom gui:** zoom plus and minus, restore origin, slider ([d70dab4](https://github.com/mengshukeji/Luckysheet/commit/d70dab4938ff33e1fcefdd15492279347efe6b33))\r\n* **zoom redo undo suport:** redo undo ([4d03906](https://github.com/mengshukeji/Luckysheet/commit/4d0390675f3aa021f7e15bf529a8102830878202))\r\n\r\n\r\n### Bug Fixes\r\n\r\n* **a few bug fix:** fix ([f07e25d](https://github.com/mengshukeji/Luckysheet/commit/f07e25d0010775b71c1e73cd3ed2db6413d661ca))\r\n* **add button bug:** fix ([3250ef6](https://github.com/mengshukeji/Luckysheet/commit/3250ef69606d24518d7b615806c1210c2ce0a684))\r\n* **allowedit dont work ,when press del:** allowEdit dont work ,when press DEL ([10dccec](https://github.com/mengshukeji/Luckysheet/commit/10dcceccc7f5f04afe70adebb4db59046382abb6))\r\n* **array unique very slow:** fix it ([20f3cb3](https://github.com/mengshukeji/Luckysheet/commit/20f3cb3e2028e455b49a4d1947ac8f02186363af))\r\n* **big data slowly:** speed up ([5109873](https://github.com/mengshukeji/Luckysheet/commit/5109873500996ac4e17abb95899f1fe5950f33b9))\r\n* **blank border position:** fix ([d285d9f](https://github.com/mengshukeji/Luckysheet/commit/d285d9fb5e3ff74385debaf493ad6125173644a4))\r\n* **bug:** bug ([6bb113b](https://github.com/mengshukeji/Luckysheet/commit/6bb113bb4421fc0497f7cf833975e4e2e7544aaa))\r\n* **bug:** bug ([4806de8](https://github.com/mengshukeji/Luckysheet/commit/4806de8de501c08bde6e69be1779b3327ecf2364))\r\n* **bug:** bug ([0cb1ec2](https://github.com/mengshukeji/Luckysheet/commit/0cb1ec23c26e2393a14475d982349a310587e7a7))\r\n* **bug:** bug ([735d1c8](https://github.com/mengshukeji/Luckysheet/commit/735d1c8b5c3777615b20795f70e867e576b8afbf))\r\n* **bug:** bug ([ad1ac61](https://github.com/mengshukeji/Luckysheet/commit/ad1ac6154502193a7e34177a08ce678522d08a03))\r\n* **bug:** bug ([27d1be0](https://github.com/mengshukeji/Luckysheet/commit/27d1be0037c2bd5ba290e7b0f9db229de04582d9))\r\n* **bug:** bug ([dea7bbf](https://github.com/mengshukeji/Luckysheet/commit/dea7bbf44414be31191841443119a3505003522e))\r\n* **bug:** bug ([061ea20](https://github.com/mengshukeji/Luckysheet/commit/061ea2003dca838dffb9ee92d1c43f28c64a9978))\r\n* **bug:** bug ([ba0b047](https://github.com/mengshukeji/Luckysheet/commit/ba0b04752f35f32df82229339bdb3f295fbcecb2))\r\n* **bug:** bug ([7263008](https://github.com/mengshukeji/Luckysheet/commit/726300811a9fdb6e36d19187764aa73daacfc7b7))\r\n* **bug:** bug ([c578c0e](https://github.com/mengshukeji/Luckysheet/commit/c578c0e34b6e589dba2ef29146d894b5c6333676))\r\n* **bug:** bug ([fc8f61b](https://github.com/mengshukeji/Luckysheet/commit/fc8f61b0154f2220c233e680eaf814edfce3a52b))\r\n* **bug:** bug ([fb3b512](https://github.com/mengshukeji/Luckysheet/commit/fb3b5122a5f4e333cca581251ef6d672da767b37))\r\n* **bug:** bug ([6236e5e](https://github.com/mengshukeji/Luckysheet/commit/6236e5e8d6621c0ad829206704bdc2fac684d3bc))\r\n* **bug:** bug ([f057d7d](https://github.com/mengshukeji/Luckysheet/commit/f057d7d281fccc7094c4f806c4590dca39cfbaa0))\r\n* **bug fix:** [#55](https://github.com/mengshukeji/Luckysheet/issues/55) [#50](https://github.com/mengshukeji/Luckysheet/issues/50) [#54](https://github.com/mengshukeji/Luckysheet/issues/54) ([5caf2b0](https://github.com/mengshukeji/Luckysheet/commit/5caf2b028c962e8ca2e6bd1c92fed3e6a9fb462d))\r\n* **bug fix:** pivotTable blank title disapear, merge cell is recognized as range ([47fe25c](https://github.com/mengshukeji/Luckysheet/commit/47fe25c32107e719115a98ceef2ed97ae6161f3b))\r\n* **bugs:** fix issue [#27](https://github.com/mengshukeji/Luckysheet/issues/27) [#29](https://github.com/mengshukeji/Luckysheet/issues/29) ([5d57267](https://github.com/mengshukeji/Luckysheet/commit/5d572676d46692719309c20e536d001ccfe2cd2f))\r\n* **celloverflow border bug:** celloverflow border bug ([86403c2](https://github.com/mengshukeji/Luckysheet/commit/86403c20b329ea4106d6498c33927b714e22941b))\r\n* **change sheet:** change sheet must setTimeOut ([e51457e](https://github.com/mengshukeji/Luckysheet/commit/e51457ef492ae74b77a0298931268b9f14feaa44))\r\n* **change sheet bug:** multiple refresh canvas bug ([7a625e0](https://github.com/mengshukeji/Luckysheet/commit/7a625e0dae187cc7af8e10e3449abf666fd332eb))\r\n* **change sheet scroll bar fix:** change sheet scroll bar dont restore ([02d2655](https://github.com/mengshukeji/Luckysheet/commit/02d26557a52b7cef0cb3b2b8d14996eb29fafa51))\r\n* **chart:** chart ([2be467d](https://github.com/mengshukeji/Luckysheet/commit/2be467d6a4b385d7d7bb0585c9be7a227614a04b))\r\n* **cloumn and row highlight bug:** column and row highlight bar disapear ([c806211](https://github.com/mengshukeji/Luckysheet/commit/c80621118e28f711b1513c869da36989c1a70c8f))\r\n* **columlen:** columlen ([b656c27](https://github.com/mengshukeji/Luckysheet/commit/b656c27a3971b756ea809f4c1010ae28310569da))\r\n* **copy cut paste bug:** bug fix ([ade56d5](https://github.com/mengshukeji/Luckysheet/commit/ade56d5b5ff38dd5095234b71bc89927841fa387))\r\n* **demo fix:** fix ([3d17426](https://github.com/mengshukeji/Luckysheet/commit/3d174260e27793d1634c5f15b83a4aa9ca4100de))\r\n* **demo fix:** fix ([732f678](https://github.com/mengshukeji/Luckysheet/commit/732f6788bcff9ddcf4b0e6bc266b3be9e28eea41))\r\n* **demo fontlist url change:** local path ([feb89b3](https://github.com/mengshukeji/Luckysheet/commit/feb89b301b116745e82a2b17071909d7a4873562))\r\n* **filter option bug:** position error ([3324512](https://github.com/mengshukeji/Luckysheet/commit/33245124be8972d1e011c047caf657275ac76916))\r\n* **fix:** bug fix ([52375dc](https://github.com/mengshukeji/Luckysheet/commit/52375dcb416f435a1adea1fa3abeb486a73d513f))\r\n* **fix:** fix ([194dea1](https://github.com/mengshukeji/Luckysheet/commit/194dea17672cc15e76b364b788f0818299b5e64c))\r\n* **fix bug:** param dont remenber change ([0425e4e](https://github.com/mengshukeji/Luckysheet/commit/0425e4eef2c585873a61efe9ee34496aab40b810))\r\n* **fix bugs:** fix ([bbaafe0](https://github.com/mengshukeji/Luckysheet/commit/bbaafe0d68d670b7621d616db5f91394ded8f573))\r\n* **fix index.html:** fix ([e980cd9](https://github.com/mengshukeji/Luckysheet/commit/e980cd91afee781a004d7e207283e41990b4e45c))\r\n* **fix number to column title bug:** if column title is big , it will show undefined ([2d6e73e](https://github.com/mengshukeji/Luckysheet/commit/2d6e73eb3fba5ebd85b76d22ba4ffdc9c5197b58))\r\n* **fix touch:** touch fix ([d884a69](https://github.com/mengshukeji/Luckysheet/commit/d884a698d6f62aa21bea7d76705682e7406e7973))\r\n* **fix wrap bug:** alt + enter twice bug ([789bab5](https://github.com/mengshukeji/Luckysheet/commit/789bab5e5d712af889577ed141387c02a049f21f))\r\n* **float calculate bug:** fix it ([ef2a96a](https://github.com/mengshukeji/Luckysheet/commit/ef2a96a7cd6d341810b99698f26063862cf33e35))\r\n* **fonts bug on ie:** fit it ([f9a1546](https://github.com/mengshukeji/Luckysheet/commit/f9a1546ca783c058994759dc3443d2e0d9929267))\r\n* **format of  formula cell bug fix:** if cell has format , it is no effect ([1f6ebad](https://github.com/mengshukeji/Luckysheet/commit/1f6ebad36da9de608bc32bddc945a5e3bb68528d))\r\n* **formula -(1-2) error:** fix it ([dee2333](https://github.com/mengshukeji/Luckysheet/commit/dee2333b295aa63fae544c075a98f993c1c3e84c))\r\n* **formula bug:** formula bug ([6c84420](https://github.com/mengshukeji/Luckysheet/commit/6c84420ad4461281ba87378af41cde0e5a7fee93))\r\n* **formula efficiency up:** speed up ([d05151f](https://github.com/mengshukeji/Luckysheet/commit/d05151f474145cb765a60b2f118c222f8b488efb))\r\n* **formula initialization bug:** if formula has cross sheet param, initial this ([c5f6254](https://github.com/mengshukeji/Luckysheet/commit/c5f6254bccd89a90abfa3a6d6728416983ebbb4c))\r\n* **frozen bug:** fix ([91daa07](https://github.com/mengshukeji/Luckysheet/commit/91daa07ec94255f9135d423aa17d9425c0ffe58d))\r\n* **frozen bug and style change:** fix bug ([7cfd0d9](https://github.com/mengshukeji/Luckysheet/commit/7cfd0d914c8999cfd4dbb2bca50f5766645cb108))\r\n* **frozen,docs:** frozen,docs ([e1bd844](https://github.com/mengshukeji/Luckysheet/commit/e1bd844749fa05a7b178565a90bbdba0c81ce1fe))\r\n* **function box input bug:** editor box and function box fix ([4ebb79d](https://github.com/mengshukeji/Luckysheet/commit/4ebb79d67f50dc46f97bc64a0cef0ba8d44e5c12))\r\n* **green label size fix:** fix ([b0734b5](https://github.com/mengshukeji/Luckysheet/commit/b0734b57bb42c55e99eb831c0ca24053ea4aa6a8))\r\n* **hide row and column fix:** add lines ([c430d66](https://github.com/mengshukeji/Luckysheet/commit/c430d6625a23b0f4b8ef903ae62e82833ed0618f))\r\n* **hot key bug fix:** range bug when formula move selection ([f4625d1](https://github.com/mengshukeji/Luckysheet/commit/f4625d1dc38d6f69fddb0ae131d54f65bd7bcbd7))\r\n* **image background opacity:** fix ([d61d3a0](https://github.com/mengshukeji/Luckysheet/commit/d61d3a07e55978350e9e5171537fee1457847209))\r\n* **image,config:** image,config ([2dddfaa](https://github.com/mengshukeji/Luckysheet/commit/2dddfaa8f1a13476f512db0e0d27742ebebb7f35))\r\n* **inline string bug:** style lost when change cell to inline string, input error ([405d90b](https://github.com/mengshukeji/Luckysheet/commit/405d90bfec0c7b47dee64e2034aeec8686c53e32))\r\n* **inline string finished:** fix some bus ([57e7518](https://github.com/mengshukeji/Luckysheet/commit/57e75188ffb718e92251cb9813ae47b467410889))\r\n* **inline string space dont recognize:** fix it ([ddc5c5d](https://github.com/mengshukeji/Luckysheet/commit/ddc5c5dde9a4d4db2ee42207383d696c12c58249))\r\n* **input range bug:** fix it ([5412721](https://github.com/mengshukeji/Luckysheet/commit/5412721675598979689e4de31ec37c2e807c7c16))\r\n* **jquery error:** jquery error ([1a2fed9](https://github.com/mengshukeji/Luckysheet/commit/1a2fed99871d79bcb895af1796909ee3e286e05f))\r\n* **menubutton.js fonts:** fix bug ([1e62de3](https://github.com/mengshukeji/Luckysheet/commit/1e62de3d2f358e99373259600c736ca83601d2ba))\r\n* **mobile text dose not display:** fix bug ([19922c7](https://github.com/mengshukeji/Luckysheet/commit/19922c76dd6afc4991ca3816262d40a6659baa5f))\r\n* **mobile touch:** moubile touch fix ([04e2b8e](https://github.com/mengshukeji/Luckysheet/commit/04e2b8e06965673f807a46fbcda2a403711ec7ea))\r\n* **my english is pool:** fix ([26ff1fd](https://github.com/mengshukeji/Luckysheet/commit/26ff1fd21180e2c795dcc24ed4d4aa2d5ba1f689))\r\n* **no fullscreen bug:** when no fullscreen , div go to top ([64f7d0e](https://github.com/mengshukeji/Luckysheet/commit/64f7d0e6c44c24f21e6e7d8d16beac6f23a5d770))\r\n* **normal style change bug:** fit error ([f24eb7f](https://github.com/mengshukeji/Luckysheet/commit/f24eb7f69c5c9ae53832f130a27473a686720e72))\r\n* **offset indirect formula fix:** fix bug ([d8dfe50](https://github.com/mengshukeji/Luckysheet/commit/d8dfe50782108745e5f132c0bbb1438f7180d198))\r\n* **old chrome dont surport actualboundingboxascent:** fix it and make it beautiful ([5c503d8](https://github.com/mengshukeji/Luckysheet/commit/5c503d851945d5ece1d69c2da8fa26c330d13930))\r\n* **paste bug:** fixed ([76d966f](https://github.com/mengshukeji/Luckysheet/commit/76d966f27eb7632061b97a438d07a63f88704878))\r\n* **pivot table bug:** bug ([9fcc209](https://github.com/mengshukeji/Luckysheet/commit/9fcc209b936eed2057a09b1f070d62832c9801b1))\r\n* **pivot table change sheet bug:** if prevous sheet is pivot table and pennel is closed, change bug ([7cac8e6](https://github.com/mengshukeji/Luckysheet/commit/7cac8e62631d90bea0521498e9980234fde88fc3))\r\n* **pivot table filter bug:** change sheet bug ,after filter pivot table ([c7c1999](https://github.com/mengshukeji/Luckysheet/commit/c7c1999081289c70b6e575e9e37fae82bdfe438c))\r\n* **pivot table show error:** when column area have field and row area is null,pivot table show error ([04bc51c](https://github.com/mengshukeji/Luckysheet/commit/04bc51cf8dc5ff24fc5d71b3bbf755a9787ca57d))\r\n* **remain cell style in inline string mode:** click cell and change cell style like to Excel ([7d0438a](https://github.com/mengshukeji/Luckysheet/commit/7d0438a10db44f371c23daccb9c066f30773e307))\r\n* **render:** render ([40550d6](https://github.com/mengshukeji/Luckysheet/commit/40550d6e59c44e0f47e23f8b5fac4c5e79a5c122))\r\n* **render bug fix:** new render method ([a1bcf81](https://github.com/mengshukeji/Luckysheet/commit/a1bcf81562ebc8c8327baad01d5e814e23fae647))\r\n* **rotate text position mistake, when sheet zoom:** fix zoom bug, fix strike and underline bug ([6680a13](https://github.com/mengshukeji/Luckysheet/commit/6680a134252a65b346b0a99142998ced277e8adf))\r\n* **scroll bug:** scroll bug ([3637fa4](https://github.com/mengshukeji/Luckysheet/commit/3637fa4121340e6278f12104e7877c450e92d511))\r\n* **several bug and new feature:** formula calculation , quotePrefix add ([5a95304](https://github.com/mengshukeji/Luckysheet/commit/5a95304289714d130501faae352dc07fb21dbf68))\r\n* **sheet change arrow:** fix bug ([4a7850b](https://github.com/mengshukeji/Luckysheet/commit/4a7850b86ef1086fe18fa7961a62bbc622ed760d))\r\n* **splines and dynamicarray bug fix:** formula calculation update is finished ([a59aa04](https://github.com/mengshukeji/Luckysheet/commit/a59aa04e4db70e3d90c6109a18ea6a7d2747c156))\r\n* **ssf column resize:** change ([2a09f59](https://github.com/mengshukeji/Luckysheet/commit/2a09f5977e35a388c42d4b43d7fbe6df891234db))\r\n* **store cache:** bug fix ([cbd9014](https://github.com/mengshukeji/Luckysheet/commit/cbd90140e0aae293b40724bce692b861047d47c3))\r\n* **text get wrong height when zoom:** fix height ([106f1fd](https://github.com/mengshukeji/Luckysheet/commit/106f1fd111a75778a2c61424290f33295cec9964))\r\n* **toolbar:** menu button style ([d18478c](https://github.com/mengshukeji/Luckysheet/commit/d18478c0e11cdce994d585be216b9ad95836f073))\r\n* **underline and cancelline:** add and fix ([d3f23ff](https://github.com/mengshukeji/Luckysheet/commit/d3f23fffd72f95b241710e9fdf1a70113502a815))\r\n* **undo redo bug fix:** formula update bug ([373dc4f](https://github.com/mengshukeji/Luckysheet/commit/373dc4f464d8bd106408ce28bd48b9e44b310b5f))\r\n* **update demo:** fix ([e101b91](https://github.com/mengshukeji/Luckysheet/commit/e101b91c4a4a427a83ef727f2e8c2e8166124485))\r\n* **updatecell bug fix:** fix undo redo ([d8b76ce](https://github.com/mengshukeji/Luckysheet/commit/d8b76ce52f25d9fc487ca62b7007c049a4a80160))\r\n* **websocket bux:** bug ([4eda52a](https://github.com/mengshukeji/Luckysheet/commit/4eda52ac89587515d6a20574c0711fe22de0a8c0))\r\n* **zoom scroll position wrong:** fix ([5830e9a](https://github.com/mengshukeji/Luckysheet/commit/5830e9af5a9c8757f55a18b34af2f08ce02f2351))\r\n* **zoom slider drag lag:** fix lag ([17ddd13](https://github.com/mengshukeji/Luckysheet/commit/17ddd13b2e87d3879fa49e1f3569f062400eb251))\r\n\r\n## [2.0.0](https://github.com/mengshukeji/Luckysheet/compare/v2.0.0-0...v2.0.0) (2020-07-31)\r\n\r\n\r\n### ⚠ BREAKING CHANGES\r\n\r\n* **api:** 1. luckysheet.flowdata change to luckysheet.flowdata() 2.all apis list in\r\ndocumentation\r\n* **gulp:** demo index.html's js and css refrence change\r\n* **bug:** bug\r\n\r\nbug\r\n* **chart:** add new config : plugins, array\r\n* **main:** bug\r\n\r\n### Features\r\n\r\n* **cell overflow:** cell overflow ([c3e4f39](https://github.com/mengshukeji/Luckysheet/commit/c3e4f39919e68d99ad72c6a0ae104926acce6b23))\r\n* **chart:** chart ([9991702](https://github.com/mengshukeji/Luckysheet/commit/999170251810720fc4d44012bcc7c70c124463fd))\r\n* **chart:** chart plugin ([196362d](https://github.com/mengshukeji/Luckysheet/commit/196362db053a25ea0deaff14b5019e1450902ceb))\r\n* d ([07d004f](https://github.com/mengshukeji/Luckysheet/commit/07d004f9d63962dc3ad09a32a1d3c61866de5525))\r\n* **allowedit support:** allowEdit support ([59561bb](https://github.com/mengshukeji/Luckysheet/commit/59561bb3453469cbf86703672ec770187545459d))\r\n* **bug fix:** bu ([f23ba5d](https://github.com/mengshukeji/Luckysheet/commit/f23ba5df9b967cd9d8188680723c903ee467bb29))\r\n* **canvas:** canvas ([c63871f](https://github.com/mengshukeji/Luckysheet/commit/c63871fbeabb47d766320800d3bb8be47604690b))\r\n* **chart:** add chart ([139bc6e](https://github.com/mengshukeji/Luckysheet/commit/139bc6ea8510667c4900db6d1b5b26a33fb52734))\r\n* **gloabe improve and bug fix:** global improve and bug fix,include formula,find and replace,filter ([e6cfa31](https://github.com/mengshukeji/Luckysheet/commit/e6cfa3156ac2ec8989f3716601dc27bcfbdc4d13))\r\n* **globalization fix:** pivot table , drop cell ([55d4cf2](https://github.com/mengshukeji/Luckysheet/commit/55d4cf29868787a94377ea2e659da9e74e062628))\r\n* **locale:** locale ([4cd2ee4](https://github.com/mengshukeji/Luckysheet/commit/4cd2ee4cb3f115be9e2455a626469711d8be2c2e))\r\n* **move:** move chart ([cda6df0](https://github.com/mengshukeji/Luckysheet/commit/cda6df0209fb1d440e54d663de682f4749660917))\r\n* **optimiz:** optimization ([abbf592](https://github.com/mengshukeji/Luckysheet/commit/abbf592d2df320d8a44eb5375075cd65f4ef4066))\r\n* **rightclick menu perfect:** add rows and cols  delete rows and cols  hide rows and cols ([32f94a7](https://github.com/mengshukeji/Luckysheet/commit/32f94a72285d6051df87ce45390cb4e5a4cc49b2))\r\n* **scroll style fix beautify:** scroll,sheet color and style ([63f2630](https://github.com/mengshukeji/Luckysheet/commit/63f2630b95ab811807199670db6eee332af882a8))\r\n* **split handler.js to small file:** split handler.js file to seven files ([0a62ff0](https://github.com/mengshukeji/Luckysheet/commit/0a62ff0565d4116ae66a758386ef8d84dcfceba5))\r\n* **zh en:** zh en ([040bfe4](https://github.com/mengshukeji/Luckysheet/commit/040bfe4b456eb910dc7ddbcc3f5ae0e42d440951))\r\n* **zh-cn:** zh-cn ([907226c](https://github.com/mengshukeji/Luckysheet/commit/907226c74297882896f527b9c54a88a11d592a4d))\r\n* **zh-cn:** zh-cn ([01f9521](https://github.com/mengshukeji/Luckysheet/commit/01f9521ed37e11b2e9630b01b84583a45302fc77))\r\n\r\n\r\n### Bug Fixes\r\n\r\n* **bug:** bug ([7dff640](https://github.com/mengshukeji/Luckysheet/commit/7dff64086aaf034a8c427e37ef7b15da96e1123c))\r\n* **bug:** bug ([8baf378](https://github.com/mengshukeji/Luckysheet/commit/8baf378407f67684b77e62bacf6894e4359ed2d3))\r\n* **bug:** bug ([5ebd31e](https://github.com/mengshukeji/Luckysheet/commit/5ebd31e4a455c7547e46c418838e2e3a16def6a7))\r\n* **bug:** bug ([f53addb](https://github.com/mengshukeji/Luckysheet/commit/f53addbf70e96b45d73014d8e181c2712820b5c3))\r\n* **bug:** bug ([9cc36cf](https://github.com/mengshukeji/Luckysheet/commit/9cc36cf40ebb5a4f41b52f230e35d253f8261f69))\r\n* **bug:** bug ([186e3c9](https://github.com/mengshukeji/Luckysheet/commit/186e3c9a557a555d1737d456abf872622004f052))\r\n* **bug:** bug ([447735c](https://github.com/mengshukeji/Luckysheet/commit/447735c7ea365c2c292dd98a4fba8813a9a62d34))\r\n* **bug:** bug ([74639a8](https://github.com/mengshukeji/Luckysheet/commit/74639a8b719db028ab856f95a80d82553c0d919c))\r\n* **bug:** bug ([1082ab0](https://github.com/mengshukeji/Luckysheet/commit/1082ab0e2e84c7863ab29c7b68bb2d9934dcf11c))\r\n* **bug fix:** sparkLines, pivot Table, change to sheet ([69aee1a](https://github.com/mengshukeji/Luckysheet/commit/69aee1aec3200c75cb4897f0f782a945c2ef9fd1))\r\n* **canvas:** canvas,function ([2445ff5](https://github.com/mengshukeji/Luckysheet/commit/2445ff5094fe8da9f7d56612ceb06dd86b75b30e))\r\n* **fix:** fix ([bd6a9bd](https://github.com/mengshukeji/Luckysheet/commit/bd6a9bdd31cefe00a6470fbec9d10471d21fac9f))\r\n* **fix:** fix byg ([d9fb5fe](https://github.com/mengshukeji/Luckysheet/commit/d9fb5fe4c48637d2ac947fe8aa21d6a7ccde0264))\r\n* **fix allowedit:** fix allowEdit attribute ([35820b3](https://github.com/mengshukeji/Luckysheet/commit/35820b3c2ea8437036cfc32911acde9ff32c2fea))\r\n* **from github:** github ([abd44e8](https://github.com/mengshukeji/Luckysheet/commit/abd44e882e39bfb85c0e213e049325754bc3ba4f))\r\n* **hot key and mousemove:** hot key fix ([1ad40cf](https://github.com/mengshukeji/Luckysheet/commit/1ad40cf5521b7b3bd804c2c1f5f13fe6860ab95e))\r\n* **internationalization:** internationalization,formula ([c6901fc](https://github.com/mengshukeji/Luckysheet/commit/c6901fc884d14c5fb8f48a60192f1eb8ad26a485))\r\n* **linestyle bug:** lineStyle ([27ba0a3](https://github.com/mengshukeji/Luckysheet/commit/27ba0a3010865aa0e28158e661bcd6196bc1cfe4))\r\n* **locale:** locale bug ([3bd0cae](https://github.com/mengshukeji/Luckysheet/commit/3bd0cae0502e14c329304bfbf8c0f98c8e7b284e))\r\n* **locale finished and bug fix:** locale finished, condition bug fix , multi range bug fix ([0aa9b3b](https://github.com/mengshukeji/Luckysheet/commit/0aa9b3baa51c818ec2415b9d1c2e838ef32bdc85))\r\n* **locale,formula:** locale,formula ([b11b862](https://github.com/mengshukeji/Luckysheet/commit/b11b86295108d8b25ad2cd7b1ba016b3555cee0d))\r\n* **mac scroll x reverse fix:** mac scroll x reverse fix and scroll optimization ([8eb68e8](https://github.com/mengshukeji/Luckysheet/commit/8eb68e82e2898b1be2702f463c326a304bc96106))\r\n* **main:** bug ([67ebe19](https://github.com/mengshukeji/Luckysheet/commit/67ebe1978bf067c17c74e5b3b7b048055c53c0b4))\r\n* **pivot table bug:** uni ([56181e6](https://github.com/mengshukeji/Luckysheet/commit/56181e610085604666d96aa6068944e05355ec7d))\r\n\r\n\r\n### build\r\n\r\n* **gulp:** gulpfile,index.html,pack js css ([8be0467](https://github.com/mengshukeji/Luckysheet/commit/8be0467dea483be7be2a5af1bc3545a04a67ea72))\r\n\r\n\r\n* **api:** api ([f19a26e](https://github.com/mengshukeji/Luckysheet/commit/f19a26eab08bc44a5c380afd883d4e730f681062))\r\n\r\n### [1.0.1-6](https://github.com/mengshukeji/Luckysheet/compare/v1.0.1-2...v1.0.1-6) (2020-07-14)\r\n\r\n\r\n### Bug Fixes\r\n\r\n* **core.js:** core function ([6e63969](https://github.com/mengshukeji/Luckysheet/commit/6e639699e117abd241532de5530a533b80d547bb))\r\n\r\n### [1.0.1-2](https://github.com/mengshukeji/Luckysheet/compare/v1.0.1-1...v1.0.1-2) (2020-07-14)\r\n\r\n### [1.0.1-1](https://github.com/mengshukeji/Luckysheet/compare/v1.0.1-0...v1.0.1-1) (2020-07-14)\r\n\r\n### 1.0.1-0 (2020-07-14)\r\n\r\n## 2.0.0-0 (2020-07-24)\r\n\r\n\r\n### ⚠ BREAKING CHANGES\r\n\r\n* **all project:** File name change\r\n\r\n* **all project:** modular,Document promotion,Some bugs ([37c3070](https://github.com/mengshukeji/Luckysheet/commit/37c307087cb50efa9eb3e1f3a22a356024aa43b5)), closes [#11](https://github.com/mengshukeji/Luckysheet/issues/11) [#2](https://github.com/mengshukeji/Luckysheet/issues/2)\r\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\r\n\r\nCopyright (c) 2020-present, Mengshukeji\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE."
  },
  {
    "path": "README-zh.md",
    "content": "<div align=\"center\">\r\n\r\n![logo](/docs/.vuepress/public/img/logo_text.png)\r\n\r\n</div>\r\n\r\n简体中文 | [English](./README.md)\r\n\r\n# Luckysheet 已不再维护，推荐使用升级版 [Univer](https://univer.short.gy/LuckysheetRepository) 用于生产环境部署，新版解决了大数据量加载，图表样式，透视表，公式计算等方面的问题，做了很多优化设计，增加了导入，导出，打印，协同等功能，提高了表格性能，更有专业技术团队进行技术支持。\r\n\r\n点击 [#1454](https://github.com/dream-num/Luckysheet/issues/1454) 查看更多详情。\r\n\r\n\r\n## 介绍\r\n🚀Luckysheet ，一款纯前端类似excel的在线表格，功能强大、配置简单、完全开源。\r\n\r\n\r\n## 相关链接\r\n | 源码   | 文档 | Demo | 论坛 |\r\n | ------ | -------- | ------ | ------ |\r\n | [Github](https://github.com/mengshukeji/Luckysheet)| [在线文档](https://dream-num.github.io/LuckysheetDocs/zh/) | [在线Demo](https://dream-num.github.io/LuckysheetDemo) / [协同编辑Demo](http://luckysheet.lashuju.com/demo/) | [中文论坛](https://support.qq.com/product/288322) |\r\n | [Gitee镜像](https://gitee.com/mengshukeji/Luckysheet)| [Gitee在线文档](https://mengshukeji.gitee.io/LuckysheetDocs/zh/) | [Gitee在线Demo](https://mengshukeji.gitee.io/luckysheetdemo/) | [Google Group](https://groups.google.com/g/luckysheet) |\r\n\r\n![演示](/docs/.vuepress/public/img/LuckysheetDemo.gif)\r\n\r\n## 插件\r\n\r\n导入导出、打印等高级功能请使用 [Univer](https://github.com/dream-num/univer/)\r\n\r\n## 生态\r\n\r\n| 工程 | 描述 |\r\n|---------|-------------|\r\n| [Luckysheet Vue]          | 在vue cli 3项目中使用Luckysheet和Luckyexcel|\r\n| [Luckysheet Vue3]          | 在vue3, vite项目中使用Luckysheet和Luckyexcel|\r\n| [Luckysheet React]          | 在React项目中使用Luckysheet |\r\n| [Luckyexcel Node]          | 在koa2中使用Luckyexcel |\r\n| [Luckysheet Server]          | Java后台Luckysheet Server |\r\n| [Luckysheet Server Starter]          | LuckysheetServer 一键docker部署 |\r\n\r\n[Luckysheet Vue]: https://gitee.com/mengshukeji/luckysheet-vue\r\n[Luckysheet Vue3]: https://gitee.com/hjwforever/luckysheet-vue3-vite.git\r\n[Luckysheet React]: https://gitee.com/mengshukeji/luckysheet-react\r\n[Luckyexcel Node]: https://gitee.com/mengshukeji/Luckyexcel-node\r\n[Luckysheet Server]: https://gitee.com/mengshukeji/LuckysheetServer\r\n[Luckysheet Server Starter]: https://gitee.com/mengshukeji/LuckysheetServerStarter\r\n\r\n## 特性\r\n\r\n- **格式设置**：样式，条件格式，文本对齐及旋转，文本截断、溢出、自动换行，多种数据类型，单元格内多样式\r\n- **单元格**：拖拽，下拉填充，多选区，查找和替换，定位，合并单元格，数据验证\r\n- **行和列操作**：隐藏、插入、删除行或列，冻结，文本分列\r\n- **操作体验**：撤销、重做，复制、粘贴、剪切，快捷键，格式刷，选区拖拽\r\n- **公式和函数**：内置公式，远程公式，自定义公式\r\n- **表格操作**：筛选，排序\r\n- **增强功能**：数据透视表，图表，评论，共享编辑，插入图片，矩阵计算，截图，复制到其他格式，EXCEL导入及导出等\r\n\r\n更详细的功能列表，请查阅：[特性](https://dream-num.github.io/LuckysheetDocs/zh/guide/#%E7%89%B9%E6%80%A7)\r\n\r\n## 📖 学习资源\r\n\r\n- 新用户优先阅读：[用户指引](https://github.com/mengshukeji/Luckysheet/wiki/User-Guide)\r\n- 社区提供的教程、学习资料及配套解决方案请查阅：[教程与资源](https://dream-num.github.io/LuckysheetDocs/zh/guide/resource.html)\r\n\r\n## 📜 更新日志\r\n\r\n每个版本的详细更改都记录在 [CHANGELOG.md](CHANGELOG.md) 中。\r\n\r\n## ❗️ 问题反馈\r\n\r\n在反馈问题之前，请确保仔细阅读 [如何提交问题](https://dream-num.github.io/LuckysheetDocs/zh/guide/contribute.html#如何提交问题)。 不符合准则的问题可能会立即被移除。\r\n\r\n## ✅ 开发计划\r\n\r\n通过 [GitHub Projects](https://github.com/mengshukeji/Luckysheet/projects/1) 管理\r\n\r\n## 💪 贡献\r\n\r\n在提交PR之前，请确保仔细阅读 [贡献指南](https://dream-num.github.io/LuckysheetDocs/zh/guide/contribute.html)。\r\n\r\n## 用法\r\n\r\n### 第一步\r\n通过CDN引入依赖\r\n\r\n```\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/css/pluginsCss.css' />\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/plugins.css' />\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/css/luckysheet.css' />\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/assets/iconfont/iconfont.css' />\r\n<script src=\"https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/js/plugin.js\"></script>\r\n<script src=\"https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/luckysheet.umd.js\"></script>\r\n```\r\n### 第二步\r\n指定一个表格容器\r\n```\r\n<div id=\"luckysheet\" style=\"margin:0px;padding:0px;position:absolute;width:100%;height:100%;left: 0px;top: 0px;\"></div>\r\n```\r\n### 第三步\r\n创建一个表格\r\n```\r\n<script>\r\n    $(function () {\r\n        //配置项\r\n        var options = {\r\n            container: 'luckysheet' //luckysheet为容器id\r\n        }\r\n        luckysheet.create(options)\r\n    })\r\n</script>\r\n```\r\n## 开发\r\n\r\n### 环境\r\n[Node.js](https://nodejs.org/en/) Version >= 6 \r\n\r\n### 安装\r\n```\r\nnpm install\r\nnpm install gulp -g\r\n```\r\n### 开发\r\n```\r\nnpm run dev\r\n```\r\n### 打包\r\n```\r\nnpm run build\r\n```\r\n\r\n## 合作项目\r\n\r\n- [h5-Dooring](https://github.com/MrXujiang/h5-Dooring)\r\n\r\n## 交流\r\n\r\n- [官网](http://lucky.lashuju.com/index.html)\r\n- [Github 论坛](https://github.com/mengshukeji/Luckysheet/discussions)\r\n- 以下扫码加入官方微信群或者QQ群\r\n\r\n加小编微信: msuniver，备注:加群\r\n\r\n<img src=\"https://gcore.jsdelivr.net/gh/mengshukeji/LuckyResources@master/assets/img/wechat/univer-wechat.jpg\" width=\"200\" />\r\n\r\n\r\n[英文社群](./README.md)\r\n\r\n## 赞助\r\n\r\nLuckysheet是MIT许可的开源项目，其持续稳定的开发离不开这些优秀的 [**支持者**](https://dream-num.github.io/LuckysheetDocs/zh/about/sponsor.html#%E8%B5%9E%E5%8A%A9%E8%80%85%E5%88%97%E8%A1%A8)。 如果您想加入他们，请考虑：\r\n\r\n- [成为Patreon的支持者或赞助商](https://www.patreon.com/mengshukeji)\r\n- [成为Open Collective的支持者或赞助商](https://opencollective.com/luckysheet)\r\n- 通过PayPal，微信或支付宝一次性捐赠\r\n\r\n| PayPal |  微信  | 支付宝 |\r\n|---|---|---|\r\n| [Paypal Me](https://www.paypal.me/wbfsa) | <img src=\"https://cdn.jsdelivr.net/gh/mengshukeji/LuckyResources@master/assets/img/wechat/wechat.jpg\" width=\"200\" />| <img src=\"https://cdn.jsdelivr.net/gh/mengshukeji/LuckyResources@master/assets/img/wechat/alipay.jpg\" width=\"200\" /> |\r\n\r\n### Patreon和OpenCollective有什么区别？\r\n\r\n通过Patreon捐赠的资金将直接用于支持menshshukeji在Luckysheet上的工作。 通过OpenCollective捐赠的资金由透明费用管理，将用于补偿核心团队成员的工作和费用或赞助社区活动。 通过在任一平台上捐款，您的姓名/徽标将得到适当的认可和曝光。\r\n\r\n## 赞助者列表\r\n\r\n（按时间顺序排列）\r\n- *涛 ¥ 200\r\n- popo ¥ 1\r\n- 孔垂善 ¥ 5\r\n- Shawn文 ¥ 99\r\n- 幸运的小路易 ¥ 1\r\n- 冯启俊 ¥ 88\r\n- mxb ¥ 10\r\n- 祭阳 ¥ 20\r\n- *勇 ¥ 30\r\n- 虚我 ¥ 200\r\n- 甜党 ¥ 50\r\n- Alphabet(Google)-gcf ¥ 1\r\n- **平 ¥ 100\r\n- **东 ¥ 10\r\n- debugger ¥ 20\r\n- 烦了烦 ¥ 10\r\n- 文顶顶 ¥ 200\r\n- yangxshn ¥ 10\r\n- 爱乐 ¥ 100\r\n- 小李飞刀刀 ¥ 66\r\n- 张铭 ¥ 200\r\n- 曹治军 ¥ 1\r\n- *特 ¥ 10\r\n- **权 ¥ 9.9\r\n- **sdmq ¥ 20\r\n- *旭 ¥ 10\r\n- Quentin ¥ 20\r\n- 周宇凡 ¥ 100\r\n- *超 ¥ 10\r\n- 维宁 ¥ 100\r\n- hyy ¥ 20\r\n- 雨亭寒江月 ¥ 50\r\n- **功 ¥ 10\r\n- **光 ¥ 20\r\n- terrywan ¥ 100\r\n- 王晓洪 ¥ 10\r\n- Sun ¥ 10\r\n- 忧绣 ¥ 100\r\n- Jasonx ¥ 10\r\n- 国勇 ¥ 66.6\r\n- 郎志 ¥ 100\r\n- 匿名 ¥ 1\r\n- ni ¥ 100\r\n- 苏 ¥ 50\r\n- Mads_chan ¥ 1\r\n- LK ¥ 100\r\n- 智连方舟 李汪石 ¥ 168\r\n- **发 ¥ 260\r\n- *超 ¥ 10\r\n- *勇 ¥ 10\r\n- *腾 ¥ 15\r\n- 名字好难起 ¥ 20\r\n- 大山 ¥ 1\r\n- waiting ¥ 1000\r\n- **宇 ¥ 10.00\r\n- 刘小帅的哥哥 ¥ 20.00\r\n- 宁静致远 ¥ 10.00\r\n- Eleven ¥ 1.00\r\n- **帆 ¥ 188\r\n- henry ¥ 100\r\n- .波罗 ¥ 50\r\n- 花落有家 ¥ 50\r\n- 踏遍南水北山 ¥ 1\r\n- LC ¥ 5\r\n- **明 ¥ 8.80\r\n- *军 ¥ 20\r\n- 张彪 ¥ 50\r\n- 企业文档云@肖敏 ¥ 10\r\n- 匿名 ¥ 50\r\n- 逍遥行 ¥ 10\r\n- z.wasaki ¥ 50\r\n- Make Children ¥ 20\r\n- Foam ¥ 20\r\n- 奥特曼( o|o)ノ三 ¥ 50\r\n- **凯 ¥ 10\r\n- **兵 ¥ 20\r\n- **川 ¥ 1\r\n- 二万 ¥ 50\r\n- 蔚然成林 ¥ 10\r\n- 邹杰 ¥ 10\r\n- 张永强 ¥ 50\r\n- 鱼得水 ¥ 270\r\n- Ccther ¥ 1\r\n- Eric Cheng ¥ 10\r\n- 佚名 ¥ 1\r\n- 花叶 ¥ 50\r\n- GT ¥ 20\r\n- 菜菜心 ¥ 10\r\n- fisher ¥ 1\r\n- JC ¥ 5\r\n- 佚名 ¥ 20\r\n- 独孤一剑 ¥ 50\r\n- mxt ¥ 20\r\n- 一叶迷山 ¥ 100\r\n- Jeff ¥ 100\r\n- 八千多条狗🐶 ¥ 100\r\n- 晓峰 ¥ 10\r\n- 戒 ¥ 1\r\n- 浪里个浪 ¥ 1\r\n- 回调函数 ¥ 50\r\n- 赖瓜子 ¥ 5\r\n- Milo•J ¥ 20\r\n- 可道云 ¥ 200\r\n- *程 ¥ 10\r\n- 来一杯卡布酸奶 ¥ 5\r\n- 刘久胜 ¥ 100\r\n- 快意江湖 ¥ 50\r\n- *新 ¥ 9.9\r\n- **龙 ¥ 100\r\n- **江 ¥ 100\r\n- **威 ¥ 9.8\r\n- **涛 ¥ 500\r\n- **嘉 ¥ 10\r\n- *涛 ¥ 1\r\n- *兵 ¥ 5\r\n- *阳 ¥ 200\r\n- *辉 ¥ 1\r\n- *帆 ¥ 30\r\n- **旺 ¥ 10\r\n- **麟 ¥ 20\r\n- *霖 ¥ 9.9\r\n- *帅 ¥ 10\r\n- *鑫 ¥ 6.66\r\n- ~朴:shu ¥ 29.79\r\n- 未来 ¥ 1\r\n- 国勇 ¥ 0.1\r\n- 用心灵听雨 ¥ 10\r\n- 钊 ¥ 5\r\n- 星稀 ¥ 5\r\n\r\n## 贡献者和感谢\r\n\r\n### 核心团队活跃成员\r\n- [@wbfsa](https://github.com/wbfsa)\r\n- [@eiji-th](https://github.com/eiji-th)\r\n- [@fly-95](https://github.com/fly-95)\r\n- [@tonytonychopper123](https://github.com/tonytonychopper123)\r\n- [@Dushusir](https://github.com/Dushusir)\r\n- [@iamxuchen800117](https://github.com/iamxuchen800117)\r\n- [@wpxp123456](https://github.com/wpxp123456)\r\n- [@c19c19i](https://weibo.com/u/3884623955)\r\n- [@zhangchen915](https://github.com/zhangchen915)\r\n- [@jerry-f](https://github.com/jerry-f)\r\n- [@flowerField](https://github.com/flowerField)\r\n\r\n### 社区伙伴\r\n- [@yiwasheng](https://github.com/yiwasheng)\r\n- [@danielcai1987](https://github.com/danielcai1987)\r\n- [@qq6690876](https://github.com/qq6690876)\r\n- [@javahuang](https://github.com/javahuang)\r\n- [@TimerGang](https://github.com/TimerGang)\r\n- [@gsw945](https://github.com/gsw945)\r\n- [@swen-xiong](https://github.com/swen-xiong)\r\n- [@lzmch](https://github.com/lzmch)\r\n- [@kdevilpf](https://github.com/kdevilpf)\r\n- [@WJWM0316](https://github.com/WJWM0316)\r\n\r\n## 版权信息\r\n[MIT](http://opensource.org/licenses/MIT)\r\n\r\nCopyright (c) 2020-present, mengshukeji\r\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"center\">\r\n\r\n![logo](/docs/.vuepress/public/img/logo_text.png)\r\n\r\n[![Join the chat at https://gitter.im/mengshukeji/Luckysheet](https://badges.gitter.im/mengshukeji/Luckysheet.svg)](https://gitter.im/mengshukeji/Luckysheet?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\r\n<a href=\"https://twitter.com/intent/follow?screen_name=luckysheet\">\r\n        <img src=\"https://img.shields.io/twitter/follow/luckysheet?style=social&logo=twitter\"\r\n            alt=\"follow on Twitter\"></a>\r\n\r\n</div>\r\n\r\nEnglish| [简体中文](./README-zh.md)\r\n\r\n# Luckysheet is no longer maintained. It is recommended to use the upgraded version of [Univer](https://univer.short.gy/LuckysheetRepository) for production environment deployment. The new version solves problems such as large data loading, chart styles, pivot tables, formula calculations, etc., and has made many optimization designs, added import, export, printing, collaboration and other functions, improved table performance, and has a professional technical team to provide technical support.\r\n\r\nFollow the [#1454](https://github.com/dream-num/Luckysheet/issues/1454) issue for more details.\r\n\r\n## Introduction\r\n🚀Luckysheet is an online spreadsheet like excel that is powerful, simple to configure, and completely open source.\r\n\r\n\r\n## Links\r\n | Source Code   | Documentation | Demo | Forum |\r\n | ------ | -------- | ------ | ------ |\r\n | [Github](https://github.com/mengshukeji/Luckysheet)| [Online Documentation](https://dream-num.github.io/LuckysheetDocs/) | [Online Demo](https://dream-num.github.io/LuckysheetDemo) / [Cooperative editing demo](http://luckysheet.lashuju.com/demo/) | [Chinese Forum](https://support.qq.com/product/288322)  |\r\n | [Gitee Mirror](https://gitee.com/mengshukeji/Luckysheet)| [Gitee Online Documentation](https://mengshukeji.gitee.io/LuckysheetDocs/) | [Gitee Online Demo](https://mengshukeji.gitee.io/luckysheetdemo/) | [Google Group](https://groups.google.com/g/luckysheet) |\r\n\r\n![Demo](/docs/.vuepress/public/img/LuckysheetDemo.gif)\r\n\r\n## Plugins\r\n\r\nFor advanced features like import, export, and printing, please use [Univer](https://github.com/dream-num/univer/)\r\n\r\n## Ecosystem\r\n\r\n| Project | Description |\r\n|---------|-------------|\r\n| [Luckysheet Vue]          | Luckysheet and Luckyexcel in a vue cli3 project |\r\n| [Luckysheet Vue3]          | Luckysheet and Luckyexcel in a vue3 project with vite|\r\n| [Luckysheet React]          | Luckysheet in a React project |\r\n| [Luckyexcel Node]          | Use Luckyexcel in koa2 |\r\n| [Luckysheet Server]          | Java backend Luckysheet Server |\r\n| [Luckysheet Server Starter]          | LuckysheetServer docker deployment startup template |\r\n\r\n[Luckysheet Vue]: https://github.com/mengshukeji/luckysheet-vue\r\n[Luckysheet Vue3]: https://github.com/hjwforever/luckysheet-vue3-vite\r\n[Luckysheet React]: https://github.com/mengshukeji/luckysheet-react\r\n[Luckyexcel Node]: https://github.com/mengshukeji/Luckyexcel-node\r\n[Luckysheet Server]: https://github.com/mengshukeji/LuckysheetServer\r\n[Luckysheet Server Starter]: https://github.com/mengshukeji/LuckysheetServerStarter\r\n\r\n\r\n## Features\r\n\r\n- **Formatting**: style, conditional formatting, text alignment and rotation, text truncation, overflow, automatic line wrapping, multiple data types, cell segmentation style\r\n- **Cells**: drag and drop, fill handle, multiple selection, find and replace, location, merge cells, data verification\r\n- **Row & column**: hide, insert, delete rows or columns, freeze, and split text\r\n- **Operation**: undo, redo, copy, paste, cut, hot key, format painter, drag and drop selection\r\n- **Formulas & Functions**: Built-in, remote and custom formulas\r\n- **Tables**: filter, sort\r\n- **Enhanced functions**: Pivot tables, charts, comments, cooperative editing, insert picture, matrix calculations, screenshots, copying to other formats, EXCEL import and export, etc.\r\n\r\nFor a more detailed feature list, please refer to: [Features](https://dream-num.github.io/LuckysheetDocs/guide/#features)\r\n\r\n## 📖 Resources\r\n- Priority reading for new users: [User Guide](https://github.com/mengshukeji/Luckysheet/wiki/User-Guide)\r\n- For the tutorials, learning materials and supporting solutions provided by the community, please refer to: [Tutorials and Resources](https://dream-num.github.io/LuckysheetDocs/guide/resource.html)\r\n\r\n## 📜 Changelog\r\n\r\nDetailed changes for each release are documented in the [CHANGELOG.md](CHANGELOG.md).\r\n\r\n## ❗️ Issues\r\n\r\nPlease make sure to read the [Issue Reporting Checklist](https://dream-num.github.io/LuckysheetDocs/guide/contribute.html#how-to-submit-issues) before opening an issue. Issues not conforming to the guidelines may be closed immediately.\r\n\r\n## ✅ TODO\r\n\r\nManaged with [GitHub Projects](https://github.com/mengshukeji/Luckysheet/projects/1)\r\n\r\n## 💪Contribution\r\n\r\nPlease make sure to read the[ Contributing Guide](https://dream-num.github.io/LuckysheetDocs/guide/contribute.html) before making a pull request.\r\n\r\n## Usage\r\n\r\n### First step\r\nIntroduce dependencies through CDN\r\n```\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/css/pluginsCss.css' />\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/plugins.css' />\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/css/luckysheet.css' />\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/assets/iconfont/iconfont.css' />\r\n<script src=\"https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/js/plugin.js\"></script>\r\n<script src=\"https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/luckysheet.umd.js\"></script>\r\n```\r\n### Second step\r\nSpecify a table container\r\n```\r\n<div id=\"luckysheet\" style=\"margin:0px;padding:0px;position:absolute;width:100%;height:100%;left: 0px;top: 0px;\"></div>\r\n```\r\n### Third step\r\nCreate a table\r\n```\r\n<script>\r\n    $(function () {\r\n        //Configuration item\r\n        var options = {\r\n            container: 'luckysheet' //luckysheet is the container id\r\n        }\r\n        luckysheet.create(options)\r\n    })\r\n</script>\r\n```\r\n\r\n## Development\r\n\r\n### Requirements\r\n[Node.js](https://nodejs.org/en/) Version >= 6 \r\n\r\n### Installation\r\n```\r\nnpm install\r\nnpm install gulp -g\r\n```\r\n### Development\r\n```\r\nnpm run dev\r\n```\r\n### Package\r\n```\r\nnpm run build\r\n```\r\n\r\n## Partner project\r\n\r\n- [h5-Dooring](https://github.com/MrXujiang/h5-Dooring)\r\n\r\n## Communication\r\n\r\n- [WebSite](http://lucky.lashuju.com/index.html)\r\n- [Github Discussions](https://github.com/mengshukeji/Luckysheet/discussions)\r\n- [Gitter](https://gitter.im/mengshukeji/Luckysheet)\r\n\r\n[Chinese community](./README-zh.md)\r\n\r\n## Sponsor\r\n\r\nLuckysheet is an MIT-licensed open source project with its ongoing development made possible entirely by the support of these awesome [backers](https://dream-num.github.io/LuckysheetDocs/about/sponsor.html#sponsors-list). If you'd like to join them, please consider:\r\n\r\n- [Become a backer or sponsor on Patreon](https://www.patreon.com/mengshukeji).\r\n- [Become a backer or sponsor on Open Collective](https://opencollective.com/luckysheet).\r\n- One-time donation via PayPal, WeChat or Alipay\r\n\r\n| PayPal |  WeChat  | Alipay |\r\n|---|---|---|\r\n| [Paypal Me](https://www.paypal.me/wbfsa) | <img src=\"https://cdn.jsdelivr.net/gh/mengshukeji/LuckyResources@master/assets/img/wechat/wechat.jpg\" width=\"140\" />| <img src=\"https://cdn.jsdelivr.net/gh/mengshukeji/LuckyResources@master/assets/img/wechat/alipay.jpg\" width=\"130\" /> |\r\n\r\n### What's the difference between Patreon and OpenCollective?\r\n\r\nFunds donated via Patreon go directly to support mengshukeji's work on Luckysheet. Funds donated via OpenCollective are managed with transparent expenses and will be used for compensating work and expenses for core team members or sponsoring community events. Your name/logo will receive proper recognition and exposure by donating on either platform.\r\n\r\n## Sponsors List\r\n\r\n(Sort by time)\r\n- *涛 ¥ 200\r\n- popo ¥ 1\r\n- 孔垂善 ¥ 5\r\n- Shawn文 ¥ 99\r\n- 幸运的小路易 ¥ 1\r\n- 冯启俊 ¥ 88\r\n- mxb ¥ 10\r\n- 祭阳 ¥ 20\r\n- *勇 ¥ 30\r\n- 虚我 ¥ 200\r\n- 甜党 ¥ 50\r\n- Alphabet(Google)-gcf ¥ 1\r\n- **平 ¥ 100\r\n- **东 ¥ 10\r\n- debugger ¥ 20\r\n- 烦了烦 ¥ 10\r\n- 文顶顶 ¥ 200\r\n- yangxshn ¥ 10\r\n- 爱乐 ¥ 100\r\n- 小李飞刀刀 ¥ 66\r\n- 张铭 ¥ 200\r\n- 曹治军 ¥ 1\r\n- *特 ¥ 10\r\n- **权 ¥ 9.9\r\n- **sdmq ¥ 20\r\n- *旭 ¥ 10\r\n- Quentin ¥ 20\r\n- 周宇凡 ¥ 100\r\n- *超 ¥ 10\r\n- 维宁 ¥ 100\r\n- hyy ¥ 20\r\n- 雨亭寒江月 ¥ 50\r\n- **功 ¥ 10\r\n- **光 ¥ 20\r\n- terrywan ¥ 100\r\n- 王晓洪 ¥ 10\r\n- Sun ¥ 10\r\n- 忧绣 ¥ 100\r\n- Jasonx ¥ 10\r\n- 国勇 ¥ 66.6\r\n- 郎志 ¥ 100\r\n- 匿名 ¥ 1\r\n- ni ¥ 100\r\n- 苏 ¥ 50\r\n- Mads_chan ¥ 1\r\n- LK ¥ 100\r\n- 智连方舟 李汪石 ¥ 168\r\n- **发 ¥ 260\r\n- *超 ¥ 10\r\n- *勇 ¥ 10\r\n- *腾 ¥ 15\r\n- 名字好难起 ¥ 20\r\n- 大山 ¥ 1\r\n- waiting ¥ 1000\r\n- **宇 ¥ 10.00\r\n- 刘小帅的哥哥 ¥ 20.00\r\n- 宁静致远 ¥ 10.00\r\n- Eleven ¥ 1.00\r\n- **帆 ¥ 188\r\n- henry ¥ 100\r\n- .波罗 ¥ 50\r\n- 花落有家 ¥ 50\r\n- 踏遍南水北山 ¥ 1\r\n- LC ¥ 5\r\n- **明 ¥ 8.80\r\n- *军 ¥ 20\r\n- 张彪 ¥ 50\r\n- 企业文档云@肖敏 ¥ 10\r\n- 匿名 ¥ 50\r\n- 逍遥行 ¥ 10\r\n- z.wasaki ¥ 50\r\n- Make Children ¥ 20\r\n- Foam ¥ 20\r\n- 奥特曼( o|o)ノ三 ¥ 50\r\n- **凯 ¥ 10\r\n- **兵 ¥ 20\r\n- **川 ¥ 1\r\n- 二万 ¥ 50\r\n- 蔚然成林 ¥ 10\r\n- 邹杰 ¥ 10\r\n- 张永强 ¥ 50\r\n- 鱼得水 ¥ 50\r\n- Ccther ¥ 1\r\n- Eric Cheng ¥ 10\r\n- 佚名 ¥ 1\r\n- 花叶 ¥ 50\r\n- GT ¥ 20\r\n- 菜菜心 ¥ 10\r\n- fisher ¥ 1\r\n- JC ¥ 5\r\n- 佚名 ¥ 20\r\n- 独孤一剑 ¥ 50\r\n- mxt ¥ 20\r\n- 一叶迷山 ¥ 100\r\n- Jeff ¥ 100\r\n- 八千多条狗🐶 ¥ 100\r\n- 晓峰 ¥ 10\r\n- 戒 ¥ 1\r\n- 浪里个浪 ¥ 1\r\n- 回调函数 ¥ 50\r\n- 赖瓜子 ¥ 5\r\n- Milo•J ¥ 20\r\n- 可道云 ¥ 200\r\n- *程 ¥ 10\r\n- 来一杯卡布酸奶 ¥ 5\r\n- 刘久胜 ¥ 100\r\n- 快意江湖 ¥ 50\r\n- *新 ¥ 9.9\r\n- **龙 ¥ 100\r\n- **江 ¥ 100\r\n- **威 ¥ 9.8\r\n- **涛 ¥ 500\r\n- **嘉 ¥ 10\r\n- *涛 ¥ 1\r\n- *兵 ¥ 5\r\n- *阳 ¥ 200\r\n- *辉 ¥ 1\r\n- *帆 ¥ 30\r\n- **旺 ¥ 10\r\n- **麟 ¥ 20\r\n- *霖 ¥ 9.9\r\n- *帅 ¥ 10\r\n- *鑫 ¥ 6.66\r\n- ~朴:shu ¥ 29.79\r\n- 未来 ¥ 1\r\n- 国勇 ¥ 0.1\r\n- 用心灵听雨 ¥ 10\r\n- 钊 ¥ 5\r\n- 星稀 ¥ 5\r\n\r\n## Authors and acknowledgment\r\n\r\n### Active Core Team Members\r\n- [@wbfsa](https://github.com/wbfsa)\r\n- [@eiji-th](https://github.com/eiji-th)\r\n- [@fly-95](https://github.com/fly-95)\r\n- [@tonytonychopper123](https://github.com/tonytonychopper123)\r\n- [@Dushusir](https://github.com/Dushusir)\r\n- [@iamxuchen800117](https://github.com/iamxuchen800117)\r\n- [@wpxp123456](https://github.com/wpxp123456)\r\n- [@c19c19i](https://weibo.com/u/3884623955)\r\n- [@zhangchen915](https://github.com/zhangchen915)\r\n- [@jerry-f](https://github.com/jerry-f)\r\n- [@flowerField](https://github.com/flowerField)\r\n\r\n### Community Partners\r\n- [@yiwasheng](https://github.com/yiwasheng)\r\n- [@danielcai1987](https://github.com/danielcai1987)\r\n- [@qq6690876](https://github.com/qq6690876)\r\n- [@javahuang](https://github.com/javahuang)\r\n- [@TimerGang](https://github.com/TimerGang)\r\n- [@gsw945](https://github.com/gsw945)\r\n- [@swen-xiong](https://github.com/swen-xiong)\r\n- [@lzmch](https://github.com/lzmch)\r\n- [@kdevilpf](https://github.com/kdevilpf)\r\n- [@WJWM0316](https://github.com/WJWM0316)\r\n\r\n## License\r\n[MIT](http://opensource.org/licenses/MIT)\r\n\r\nCopyright (c) 2020-present, mengshukeji\r\n"
  },
  {
    "path": "commitlint.config.js",
    "content": "module.exports = {\r\n    extends: ['@commitlint/config-conventional']\r\n}\r\n"
  },
  {
    "path": "deploy.bat",
    "content": "# deploy Demo\r\nnpm run build\r\ncd dist\r\ngit init\r\ngit remote add origin https://github.com/mengshukeji/LuckysheetDemo.git\r\ngit config --local user.email \"1414556676@qq.com\"\r\ngit config --local user.name \"Dushusir\"\r\ngit add .\r\ngit commit -m 'deploy Luckysheet demo'\r\ngit push -f origin master:gh-pages\r\n\r\n# ===============================================\r\n\r\n# deploy Docs\r\nnpm run docs:build\r\ncd docs/.vuepress/dist\r\ngit init\r\ngit remote add origin https://github.com/mengshukeji/LuckysheetDocs.git\r\ngit add .\r\ngit commit -m 'deploy Luckysheet docs'\r\ngit push -f origin master:gh-pages\r\n\r\n# ===============================================\r\n\r\n# add a tags\r\ngit tag -a doc -m \"doc\"\r\n\r\n\r\n# replease\r\nnpm run build\r\nnpm run release -- --release-as patch\r\ngit push --follow-tags origin master\r\nnpm publish\r\n\r\n# only publish\r\nnpm run build\r\ngit add .\r\nnpm run commit\r\nnpm version patch\r\ngit push -u origin master\r\nnpm publish\r\n\r\n\r\n# ==============================================\r\n\r\n# test feature branch\r\ngit checkout -b fea origin/feature\r\ngit pull\r\n\r\n## After some test, create PR merge feature to master branch\r\n\r\ngit checkout master\r\ngit branch -d fea\r\n\r\n# ===============================================\r\n\r\n# test pull request: https://docs.github.com/cn/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/checking-out-pull-requests-locally\r\n\r\n# 139 is ID, dev is branch name\r\ngit fetch origin pull/139/head:test-139\r\ngit checkout test-139\r\n# test code\r\ngit push origin test-139\r\n# create new PR ,merge test-139 to master\r\n\r\n# list all remote and local branchs\r\ngit branch -a\r\n# delete remote branch\r\ngit push origin --delete dev\r\ngit checkout master\r\n# delete local branch\r\ngit branch -d dev\r\n\r\n# pr\r\n## 1. fork 到自己的仓库\r\n\r\n## 2. git clone 到本地\r\n\r\n## 3. 上游建立连接\r\ngit remote add upstream https://github.com/mengshukeji/Luckysheet.git\r\n\r\n## 4. 创建开发分支\r\ngit checkout -b dev\r\n\r\n## 5. 修改提交代码\r\ngit add . \r\ngit commit -m \"add\" \r\ngit push origin dev\r\n\r\n## 6. 同步代码，将最新代码同步到本地\r\ngit fetch upstream \r\ngit rebase upstream/master\r\n\r\n## 7. 如果有冲突（没有可以略过）\r\ngit status # 查看冲突文件，并修改冲突\r\ngit add .\r\ngit rebase --continue\r\n\r\n## 8.提交分支代码\r\ngit push origin dev\r\n\r\n## 7. 提交pr\r\n去自己github仓库对应fork的项目下new pull request"
  },
  {
    "path": "docs/.vuepress/config.js",
    "content": "module.exports = {\r\n\tbase: '/LuckysheetDocs/',\r\n\tlocales: {\r\n\t\t// 键名是该语言所属的子路径\r\n\t\t// 作为特例，默认语言可以使用 '/' 作为其路径。\r\n\t\t'/': {\r\n\t\t\tlang: 'en-US', // 将会被设置为 <html> 的 lang 属性\r\n\t\t\ttitle: 'Luckysheet Document',\r\n\t\t\tdescription: 'Luckysheet is an online spreadsheet like excel that is powerful, simple to configure, and completely open source.This site contains official configuration document, API, and tutorial.'\r\n\t\t},\r\n\t\t'/zh/': {\r\n\t\t\tlang: 'zh-CN',\r\n\t\t\ttitle: 'Luckysheet文档',\r\n\t\t\tdescription: 'Luckysheet ，一款纯前端类似excel的在线表格，功能强大、配置简单、完全开源。本站包含官方配置文档,API,教程。'\r\n\t\t},\r\n\t\t\r\n\t},\r\n\tthemeConfig: {\r\n\t\tdomain: 'https://dream-num.github.io/LuckysheetDemo',\r\n\t\tlogo: '/img/logo.png',\r\n\t\tauthor: 'Luckysheet',\r\n\t\t// 仓库地址\r\n\t\trepo: 'mengshukeji/Luckysheet',\r\n\t\t// 允许编辑链接文字\r\n\t\teditLinks: true,\r\n\t\t// 仓库的文档目录 \r\n\t\tdocsDir: 'docs',\r\n\t\t// 页面滚动\r\n\t\tsmoothScroll: true,\r\n\t\tlocales: {\r\n\t\t\t'/': {\r\n\t\t\t\tselectText: 'Languages',\r\n\t\t\t\tlabel: 'English',\r\n\t\t\t\tariaLabel: 'Select language',\r\n\t\t\t\teditLinkText: 'Edit this page on GitHub',\r\n\t\t\t\tlastUpdated: 'Last Updated',\r\n\t\t\t\tserviceWorker: {\r\n\t\t\t\t\tupdatePopup: {\r\n\t\t\t\t\t\tmessage: \"New content is available.\",\r\n\t\t\t\t\t\tbuttonText: \"Refresh\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tnav: [\r\n\t\t\t\t\t{ text: 'Home', link: '/' },\r\n\t\t\t\t\t{ text: 'Guide', link: '/guide/' },\r\n\t\t\t\t\t{ text: 'Demo', link: 'https://dream-num.github.io/LuckysheetDemo/' },\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ttext: 'More',\r\n\t\t\t\t\t\tariaLabel: 'More',\r\n\t\t\t\t\t\titems: [\r\n\t\t\t\t\t\t  { text: 'About', link: '/about/' }\r\n\t\t\t\t\t\t]\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\t// 侧边栏 \r\n\t\t\t\tsidebar: {\r\n\t\t\t\t\t'/guide/': [\r\n\t\t\t\t\t\t'',\r\n\t\t\t\t\t\t'config',\r\n\t\t\t\t\t\t'sheet',\r\n\t\t\t\t\t\t'cell',\r\n\t\t\t\t\t\t'operate',\r\n\t\t\t\t\t\t'api',\r\n\t\t\t\t\t\t'resource',\r\n\t\t\t\t\t\t'FAQ',\r\n\t\t\t\t\t\t'contribute'\r\n\t\t\t\t\t],\r\n\t\t\t\t\t'/about/': [\r\n\t\t\t\t\t\t'',\r\n\t\t\t\t\t\t'sponsor',\r\n\t\t\t\t\t\t'company'\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\t'/zh/': {\r\n\t\t\t\t// 多语言下拉菜单的标题\r\n\t\t\t\tselectText: '选择语言',\r\n\t\t\t\t// 该语言在下拉菜单中的标签\r\n\t\t\t\tlabel: '简体中文',\r\n\t\t\t\tariaLabel: '选择语言',\r\n\t\t\t\t// 编辑链接文字\r\n\t\t\t\teditLinkText: '在 GitHub 上编辑此页',\r\n\t\t\t\tlastUpdated: '上次更新',\r\n\t\t\t\t// Service Worker 的配置\r\n\t\t\t\tserviceWorker: {\r\n\t\t\t\t\tupdatePopup: {\r\n\t\t\t\t\t\tmessage: \"发现新内容可用.\",\r\n\t\t\t\t\t\tbuttonText: \"刷新\"\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t// 导航栏\r\n\t\t\t\tnav: [\r\n\t\t\t\t\t{ text: '首页', link: '/zh/' },\r\n\t\t\t\t\t{ text: '指南', link: '/zh/guide/' },\r\n\t\t\t\t\t{ text: '演示', link: 'https://dream-num.github.io/LuckysheetDemo/' },\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ttext: '了解更多',\r\n\t\t\t\t\t\tariaLabel: '了解更多',\r\n\t\t\t\t\t\titems: [\r\n\t\t\t\t\t\t  { text: '关于', link: '/zh/about/' }\r\n\t\t\t\t\t\t]\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t\t// 侧边栏 \r\n\t\t\t\tsidebar: {\r\n\t\t\t\t\t'/zh/guide/': [\r\n\t\t\t\t\t\t'',\r\n\t\t\t\t\t\t'config',\r\n\t\t\t\t\t\t'sheet',\r\n\t\t\t\t\t\t'cell',\r\n\t\t\t\t\t\t'operate',\r\n\t\t\t\t\t\t'api',\r\n\t\t\t\t\t\t'resource',\r\n\t\t\t\t\t\t'FAQ',\r\n\t\t\t\t\t\t'contribute'\r\n\t\t\t\t\t],\r\n\t\t\t\t\t'/zh/about/': [\r\n\t\t\t\t\t\t'',\r\n\t\t\t\t\t\t'sponsor',\r\n\t\t\t\t\t\t'company'\r\n\t\t\t\t\t],\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\t\r\n\t\t},\t\r\n\t},\r\n\tplugins: {\r\n\t\t'vuepress-plugin-baidu-autopush': {},\r\n\t\t'sitemap': {\r\n\t\t\thostname: 'https://dream-num.github.io/LuckysheetDocs'\r\n\t\t},\r\n\t\t'vuepress-plugin-code-copy': true,\r\n\t\t'seo': {\r\n\t\t\tsiteTitle: (_, $site) => $site.title,\r\n\t\t\ttitle: $page => $page.title,\r\n\t\t\tdescription: $page => $page.frontmatter.description,\r\n\t\t\tauthor: (_, $site) => $site.themeConfig.author,\r\n\t\t\ttags: $page => $page.frontmatter.tags,\r\n\t\t\ttwitterCard: _ => 'summary_large_image',\r\n\t\t\ttype: $page => ['guide'].some(folder => $page.regularPath.startsWith('/' + folder)) ? 'article' : 'website',\r\n\t\t\turl: (_, $site, path) => ($site.themeConfig.domain || '') + path,\r\n\t\t\timage: ($page, $site) => $page.frontmatter.image && (($site.themeConfig.domain && !$page.frontmatter.image.startsWith('http') || '') + $page.frontmatter.image),\r\n\t\t\tpublishedAt: $page => $page.frontmatter.date && new Date($page.frontmatter.date),\r\n\t\t\tmodifiedAt: $page => $page.lastUpdated && new Date($page.lastUpdated),\r\n\t\t}\r\n\t}\r\n}"
  },
  {
    "path": "docs/README.md",
    "content": "---\r\nhome: true\r\nheroText: Luckysheet\r\ntagline: Configuration Document · API · Tutorial\r\nactionText: Get Started →\r\nactionLink: /guide/\r\nfeatures:\r\n- title: Powerful Features\r\n  details: Contains a large number of commonly used spreadsheet functions to replace your excel\r\n- title: Simple Configuration\r\n  details: Get started with minimal configuration\r\n- title: Open Source\r\n  details: Community driven, work together to improve your ideas\r\nfooter: MIT Licensed | Copyright © 2020-present Mengshukeji\r\n---"
  },
  {
    "path": "docs/about/README.md",
    "content": "# Meet the Team\r\n\r\nLuckysheet is a project led by an individual and jointly developed by several friends with the same interests.\r\n\r\n### Active Core Team Members\r\n- [@wbfsa](https://github.com/wbfsa)\r\n- [@eiji-th](https://github.com/eiji-th)\r\n- [@fly-95](https://github.com/fly-95)\r\n- [@tonytonychopper123](https://github.com/tonytonychopper123)\r\n- [@Dushusir](https://github.com/Dushusir)\r\n- [@iamxuchen800117](https://github.com/iamxuchen800117)\r\n- [@wpxp123456](https://github.com/wpxp123456)\r\n- [@c19c19i](https://weibo.com/u/3884623955)\r\n- [@zhangchen915](https://github.com/zhangchen915)\r\n- [@jerry-f](https://github.com/jerry-f)\r\n- [@flowerField](https://github.com/flowerField)\r\n\r\n### Community Partners\r\n- [@yiwasheng](https://github.com/yiwasheng)\r\n- [@danielcai1987](https://github.com/danielcai1987)\r\n- [@qq6690876](https://github.com/qq6690876)\r\n- [@javahuang](https://github.com/javahuang)\r\n- [@TimerGang](https://github.com/TimerGang)\r\n- [@gsw945](https://github.com/gsw945)\r\n- [@swen-xiong](https://github.com/swen-xiong)\r\n- [@lzmch](https://github.com/lzmch)\r\n- [@kdevilpf](https://github.com/kdevilpf)\r\n- [@WJWM0316](https://github.com/WJWM0316)"
  },
  {
    "path": "docs/about/company.md",
    "content": "# Community case\r\n\r\nWe collected a lot of case feedback from the community, and also discovered Luckysheet usage scenarios that we did not expect before.\r\n\r\nIt is our responsibility to actively listen to the voice of the community, and to continuously update and iterate with your support and feedback.\r\n\r\n\r\n## Company Case\r\n\r\n<table>\r\n  <tbody>\r\n    <tr>\r\n      <td align=\"center\" valign=\"middle\">\r\n        <a href=\"https://www.zpy360.com/\" target=\"_blank\">\r\n          <img width=\"222px\" src=\"https://cdn.jsdelivr.net/npm/luckyresources/assets/img/community_case/Zhiping_Cloud.png\">\r\n        </a>\r\n        <p>雄安智评云数字科技有限公司</p>\r\n      </td>\r\n      <td align=\"center\" valign=\"middle\">\r\n        <a href=\"https://code-the-future.com/\" target=\"_blank\">\r\n          <img width=\"222px\" src=\"https://cdn.jsdelivr.net/npm/luckyresources/assets/img/community_case/code_the_future.png\">\r\n        </a>\r\n        <p>Code the Future</p>\r\n      </td>\r\n      <td align=\"center\" valign=\"middle\">\r\n        <a href=\"http://www.jackyun.com/\" target=\"_blank\">\r\n          <img width=\"222px\" src=\"https://cdn.jsdelivr.net/npm/luckyresources/assets/img/community_case/jackyun.png\">\r\n        </a>\r\n        <p>吉客云</p>\r\n      </td>\r\n      <td align=\"center\" valign=\"middle\">\r\n        <a href=\"https://www.huawei.com/cn/\" target=\"_blank\">\r\n          <img width=\"222px\" src=\"https://cdn.jsdelivr.net/npm/luckyresources/assets/img/community_case/huawei.png\">\r\n        </a>\r\n        <p>华为</p>\r\n      </td>\r\n    </tr>\r\n    <tr>\r\n      <td align=\"center\" valign=\"middle\">\r\n      </td>\r\n      <td align=\"center\" valign=\"middle\">\r\n      </td>\r\n      <td align=\"center\" valign=\"middle\">\r\n      </td>\r\n      <td align=\"center\" valign=\"middle\">\r\n      </td>\r\n    </tr>\r\n  </tbody>\r\n</table>"
  },
  {
    "path": "docs/about/sponsor.md",
    "content": "# Sponsor\r\n\r\n## Why sponsor\r\n\r\nIf you run a business and is using Luckysheet in a revenue-generating product, it would make business sense to sponsor Luckysheet development: it ensures the project that your product relies on stays healthy and actively maintained. It can also help your exposure in the Luckysheet community and more people pay attention to your products.\r\n\r\nOf course, individual users are also welcome to buy author a glass of juice if Luckysheet has helped you in your work or personal projects 😋.\r\n\r\n## How to sponsor\r\n\r\nLuckysheet is an MIT-licensed open source project with its ongoing development made possible entirely by the support of these awesome [**backers**](#sponsors-list). If you'd like to join them, please consider:\r\n\r\n- [Become a backer or sponsor on Patreon](https://www.patreon.com/mengshukeji).\r\n- [Become a backer or sponsor on Open Collective](https://opencollective.com/luckysheet).\r\n- One-time donation via PayPal, WeChat or Alipay\r\n\r\n| PayPal |  WeChat  | Alipay |\r\n|---|---|---|\r\n| [Paypal Me](https://www.paypal.me/wbfsa) | <img src=\"https://minio.cnbabylon.com/public/luckysheet/wechat.jpg\" width=\"140\" />| <img src=\"https://minio.cnbabylon.com/public/luckysheet/alipay.jpg\" width=\"130\" /> |\r\n\r\n### What's the difference between Patreon and OpenCollective?\r\n\r\nFunds donated via Patreon go directly to support mengshukeji's work on Luckysheet. Funds donated via OpenCollective are managed with transparent expenses and will be used for compensating work and expenses for core team members or sponsoring community events. Your name/logo will receive proper recognition and exposure by donating on either platform.\r\n\r\n## Sponsors List\r\n\r\n(Sort by time)\r\n- *涛 ¥ 200\r\n- popo ¥ 1\r\n- 孔垂善 ¥ 5\r\n- Shawn文 ¥ 99\r\n- 幸运的小路易 ¥ 1\r\n- 冯启俊 ¥ 88\r\n- mxb ¥ 10\r\n- 祭阳 ¥ 20\r\n- *勇 ¥ 30\r\n- 虚我 ¥ 200\r\n- 甜党 ¥ 50\r\n- Alphabet(Google)-gcf ¥ 1\r\n- **平 ¥ 100\r\n- **东 ¥ 10\r\n- debugger ¥ 20\r\n- 烦了烦 ¥ 10\r\n- 文顶顶 ¥ 200\r\n- yangxshn ¥ 10\r\n- 爱乐 ¥ 100\r\n- 小李飞刀刀 ¥ 66\r\n- 张铭 ¥ 200\r\n- 曹治军 ¥ 1\r\n- *特 ¥ 10\r\n- **权 ¥ 9.9\r\n- **sdmq ¥ 20\r\n- *旭 ¥ 10\r\n- Quentin ¥ 20\r\n- 周宇凡 ¥ 100\r\n- *超 ¥ 10\r\n- 维宁 ¥ 100\r\n- hyy ¥ 20\r\n- 雨亭寒江月 ¥ 50\r\n- **功 ¥ 10\r\n- **光 ¥ 20\r\n- terrywan ¥ 100\r\n- 王晓洪 ¥ 10\r\n- Sun ¥ 10\r\n- 忧绣 ¥ 100\r\n- Jasonx ¥ 10\r\n- 国勇 ¥ 66.6\r\n- 郎志 ¥ 100\r\n- 匿名 ¥ 1\r\n- ni ¥ 100\r\n- 苏 ¥ 50\r\n- Mads_chan ¥ 1\r\n- LK ¥ 100\r\n- 智连方舟 李汪石 ¥ 168\r\n- **发 ¥ 260\r\n- *超 ¥ 10\r\n- *勇 ¥ 10\r\n- *腾 ¥ 15\r\n- 名字好难起 ¥ 20\r\n- 大山 ¥ 1\r\n- waiting ¥ 1000\r\n- **宇 ¥ 10.00\r\n- 刘小帅的哥哥 ¥ 20.00\r\n- 宁静致远 ¥ 10.00\r\n- Eleven ¥ 1.00\r\n- **帆 ¥ 188\r\n- henry ¥ 100\r\n- .波罗 ¥ 50\r\n- 花落有家 ¥ 50\r\n- 踏遍南水北山 ¥ 1\r\n- LC ¥ 5\r\n- **明 ¥ 8.80\r\n- *军 ¥ 20\r\n- 张彪 ¥ 50\r\n- 企业文档云@肖敏 ¥ 10\r\n- 匿名 ¥ 50\r\n- 逍遥行 ¥ 10\r\n- z.wasaki ¥ 50\r\n- Make Children ¥ 20\r\n- Foam ¥ 20\r\n- 奥特曼( o|o)ノ三 ¥ 50\r\n- **凯 ¥ 10\r\n- **兵 ¥ 20\r\n- **川 ¥ 1\r\n- 二万 ¥ 50\r\n- 蔚然成林 ¥ 10\r\n- 邹杰 ¥ 10\r\n- 张永强 ¥ 50\r\n- 鱼得水 ¥ 50\r\n- Ccther ¥ 1\r\n- Eric Cheng ¥ 10\r\n- 佚名 ¥ 1\r\n- 花叶 ¥ 50\r\n- GT ¥ 20\r\n- 菜菜心 ¥ 10\r\n- fisher ¥ 1\r\n- JC ¥ 5\r\n- 佚名 ¥ 20\r\n- 独孤一剑 ¥ 50\r\n- mxt ¥ 20\r\n- 一叶迷山 ¥ 100\r\n- Jeff ¥ 100\r\n- 八千多条狗🐶 ¥ 100\r\n- 晓峰 ¥ 10\r\n- 戒 ¥ 1\r\n- 浪里个浪 ¥ 1\r\n- 回调函数 ¥ 50\r\n- 赖瓜子 ¥ 5\r\n- Milo•J ¥ 20\r\n- 可道云 ¥ 200\r\n- *程 ¥ 10\r\n- 来一杯卡布酸奶 ¥ 5\r\n- 刘久胜 ¥ 100\r\n- 快意江湖 ¥ 50\r\n- *新 ¥ 9.9\r\n- **龙 ¥ 100\r\n- **江 ¥ 100\r\n- **威 ¥ 9.8\r\n- **涛 ¥ 500\r\n- **嘉 ¥ 10\r\n- *涛 ¥ 1\r\n- *兵 ¥ 5\r\n- *阳 ¥ 200\r\n- *辉 ¥ 1\r\n- *帆 ¥ 30\r\n- **旺 ¥ 10\r\n- **麟 ¥ 20\r\n- *霖 ¥ 9.9\r\n- *帅 ¥ 10\r\n- *鑫 ¥ 6.66\r\n- ~朴:shu ¥ 29.79\r\n- 未来 ¥ 1\r\n- 国勇 ¥ 0.1\r\n- 用心灵听雨 ¥ 10\r\n- 钊 ¥ 5\r\n- 星稀 ¥ 5"
  },
  {
    "path": "docs/guide/FAQ.md",
    "content": "# FAQ\r\n\r\nThe content of this chapter collects the common problems that everyone has feedback. If the official documents and this list can’t answer your questions, I recommend you to [Official Forum](https://github.com/mengshukeji/Luckysheet/discussions)\r\n\r\n## What is the difference between data and celldata in luckysheetfile?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Use one-dimensional array format [celldata](/guide/sheet.html#celldata), after the initialization is completed, the data converted into a two-dimensional array format is used for storage and update, and celldata is no longer used.\r\n\r\nIf you need to take out `data` as initial data, you need to execute [transToCellData(data)](/guide/api.html#transtocelldata-data-setting) to convert it to celldata data.\r\nAmong them, the celldata in `{ r, c, v }` format is converted to a two-dimensional array using [transToData(celldata)](/guide/api.html#transtodata-celldata-setting)\r\n\r\nSummarized as follows:\r\n```js\r\n// data => celldata two-dimensional array data into {r, c, v} format one-dimensional array\r\nluckysheet.transToCellData(data)\r\n\r\n// celldata => data to generate the two-dimensional array required for the table\r\nluckysheet.transToData(celldata)\r\n```\r\n\r\n------------\r\n\r\n## What are the cell types?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Refer to [Cell Format List](/guide/cell.html), with examples of available cell formats\r\n\r\n------------\r\n\r\n## How to use Luckysheet in Vue/React project?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Check\r\n\r\n- Vue case: [luckysheet-vue](https://github.com/mengshukeji/luckysheet-vue)\r\n- React case: [luckysheet-react](https://github.com/mengshukeji/luckysheet-react)\r\n\r\n------------\r\n\r\n## Why will the formula in the table not be triggered after initialization?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Refer to [Table data format](/guide/sheet.html#calcchain) ,just set the calcChain corresponding to the cell data.\r\n\r\n------------\r\n\r\n## Is the remote loading data loadUrl or updateUrl?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: [loadUrl](/guide/config.html#loadurl). Configure loadUrl, Luckysheet will request the entire table data through ajax, and updateUrl will be used as the interface address for collaborative editing in real-time saving.\r\nNote: Initial data needs to be configured with loadUrl parameter, while for collaborative editing, the four parameters of loadUrl, updateUrl and allowUpdate can be configured to take effect.\r\n\r\n------------\r\n\r\n## What is the difference between `index` and `order` for each sheet page?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Each sheet page has a unique id, which is `index`, which can be incremented by numbers or a random string. And `order` is the sorting situation of all sheets, starting from 0, can only be numbers `0,1,2...`.\r\n\r\n------------\r\n\r\n## Why can’t I run the project directly under the dist folder?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Need to start the local server\r\n\r\n- [Node build a local server](https://github.com/JacksonTian/anywhere)\r\n- [Python build local server](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/set_up_a_local_testing_server)\r\n\r\n------------\r\n\r\n## How to import and export excel?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: The excel import and export library developed with Luckysheet-[Luckyexcel](https://github.com/mengshukeji/Luckyexcel) has realized the excel import function, and the export function is under development.You can refer to these 2 blog posts for excel export at this stage:\r\n\r\n- [Development of Excel download function based on LuckySheet online form](https://www.cnblogs.com/recode-hyh/p/13168226.html)\r\n- [Use exceljs to export luckysheet form](https://blog.csdn.net/csdn_lsy/article/details/107179708)\r\n\r\n------------\r\n\r\n## How to merge cells during initialization?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Refer to the following case:\r\n- [How Luckysheet initializes the data with merged cells](https://www.cnblogs.com/DuShuSir/p/13272397.html)\r\n\r\n------------\r\n\r\n## How does 'Luckysheet' save the data from the table to the database? Is there a soulution for storage and collaboration?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: There are two options:\r\n\r\n- 1. after the table operation is completed, you can use `luckysheet.getAllSheets()` to get all sheet data that stroed in the back-end.\r\n- 2. enable the collaborative editing function to transmit data to the back-end in real-time.\r\nrefer this article:\r\n[How Luckysheet saves the data in the table to the database](https://www.cnblogs.com/DuShuSir/p/13857874.html)\r\n\r\n------------\r\n\r\n## How to monitor cell hover or click events? how to monitor `cellRenderAfter` in real-time?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: We have collected the secondary development requirements for cell events, and planned the cell-related hook functions, refer to [cell hook function](/guide/config.html#cellrenderafter) (the TODO displayed is not yet open)\r\n\r\n------------\r\n\r\n## How to customize the top toolbar?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: \r\nreference: [options.showtoolbarconfig](/guide/config.html#showtoolbarconfig)(TODO means waiting to developed)\r\n\r\n------------\r\n\r\n## Does the project use jQuery?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: yes. At the beginning, Luckysheet uses jQuery。The packaging tool will package the jQuery to this file `./plugins/js/plugin.js`\r\n\r\nIf your project (such as react / Vue) also references jQuery globally and causes conflicts, you can try to remove a jQuery.\r\n\r\nif you want to remove jQuery in `Luckysheet`, you can find `jQuery` in source code folder `gulpfile.js`: [src/plugins/js/jquery.min.js](https://github.com/mengshukeji/Luckysheet/blob/master/gulpfile.js)，then delete information related to jQuery.\r\n\r\n------------\r\n\r\n## How to add a field to a cell object?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: reference [cell object format](/guide/cell.html)，then read this annotation[src/controllers/postil.js](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/postil.js)。the annotation is a configuration in a cell object.\r\n\r\n------------\r\n\r\n## The toolbar icon is on the loading stage all the time. \r\n\r\n**<span style=\"font-size:20px;\">A</span>**: The luckysheet use iconfont icon in this project, if any icon cannot be loaded ,plz check your iconfont.css. we are so sorry that we did not describe it clearly in the old version documents.\r\n\r\nNow the documents have been updated.[official documents](/guide/#steps-for-usage)\r\n\r\n------------\r\n\r\n## Can't run Luckyexcel after package. \r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Terminal does not show `end`, but if the `dist` folder has this file `luckyexcel.js`, it is normal.\r\n\r\nLucky excel is an excel import and export library. The project uses `gulp` as a packaging tool. There is a problem with the old version of the packaging tool, but it is fixed now. if this problem still troubles you, plz check the following steps:\r\n1. pull the latest code.\r\n2. `npm i`\r\n3. `npm run build`\r\n\r\nmore information: [Luckyexcel](https://github.com/mengshukeji/Luckyexcel/)\r\n\r\n------------\r\n\r\n## How to disable editing of cells？How to open sheet protection?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Sheet protection includes disable editing of cells that you need to make some configurations on each sheets. `config.authority`, the latest configurations[sheet protection](/guide/sheet.html#config-authority)。\r\n\r\nIn order to make it easier for you to understand the function of sheet protection, the following video shows how to make the whole sheet uneditable, but allow a column of cells to be edited:\r\n\r\n<iframe frameborder=\"0\" src=\"https://v.qq.com/txp/iframe/player.html?vid=g3162sacwn6\" allowFullScreen=\"true\"></iframe>\r\n\r\nIn you local browser, you can open the control pannel, use `luckysheet.getLuckysheetfile()[0].config.authority` to get the configuration parameters.\r\n\r\n------------\r\n\r\n## How to configure data validation?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: there is the configuration of data validation，[data validation](/guide/sheet.html#dataVerification)。Also there is the API that you can use `data validation` in any time. [setDataVerification](/guide/api.html#setdataverification-optionitem-setting).\r\n\r\n------------\r\n\r\n## Is there a case for using Luckysheet with CDN?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Luckysheet supports CDN. reference: [The case of using luckysheet by CDN](https://www.cnblogs.com/DuShuSir/p/13859103.html)\r\n\r\n------------\r\n\r\n## how to limit the adaptive height of a picture in a cell？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: First of all, you need to move the picture and adjust the cell size, and then there are the following situations:\r\n\r\n- if the cell contains a picture and you expand the cell, the picure will not be expanded.\r\n- if the cell contains a picture and you shorten the cell to the edge of the picture, the picture will shrink.\r\n- When the picture exceeds the border of the cell, the size of this picture will change with the size of the cell.\r\n\r\nif you want to get the position of the picture, you can overlap the picture with the border of the cell.(in the source code, it needs to overlap more than 2px.)The following demo video shows how to limit the image to the adaptive width and height of the cell.\r\n\r\n<iframe frameborder=\"0\" src=\"https://v.qq.com/txp/iframe/player.html?vid=y3163ya0q6c\" allowFullScreen=\"true\"></iframe>\r\n\r\n------------\r\n\r\n## How to get the default row height and column width of the worksheet?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: There are two ways to get it\r\n\r\n- 1. use `luckysheet.getLuckysheetfile()` to get all configuration data, so you can get the `defaultRowHeight` and `defaultColWidth` in the sheet configuration data。\r\n- 2. use API to get the default row height [getDefaultRowHeight](/guide/api.html#getdefaultrowheight-setting) and column width.[getDefaultColWidth](/guide/api.html#getdefaultcolwidth-setting)\r\n\r\n------------\r\n\r\n## How to hide the add row button and the back to top button below the worksheet?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Configuration is open\r\n- Allow adding rows [enableAddRow](/guide/config.html#enableaddrow)\r\n- Allow back to top [enableAddBackTop](/guide/config.html#enableAddBackTop)\r\n\r\n------------\r\n\r\n## How to hide the row and column headings of the worksheet?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Configuration is open\r\n- The width of the row header area [rowHeaderWidth](/guide/config.html#rowheaderwidth)\r\n- The height of the column header area [columnHeaderHeight](/guide/config.html#columnHeaderHeight)\r\n\r\n------------\r\n\r\n## What method can be called to set `config.merge`?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Three methods\r\n- Interface operation\r\n- Use API: [setRangeMerge](/guide/api.html#setrangemerge-type-setting)\r\n- Manually assemble merge parameters\r\n\r\n------------\r\n\r\n## Why is the official new feature ineffective?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: The first step is to check whether you have used CDN to import,\r\n\r\nThe CDN link used in the Luckysheet tutorial is the service provided by [jsdelivr](https://www.jsdelivr.com/package/npm/luckysheet), and the code is from [npmjs.com](https://www.npmjs.com/) automatically sync the past, not from [Github](https://github.com/mengshukeji/Luckysheet/). Because our newly submitted code still needs to be tested for a period of time, it will not be released to npm immediately, causing the npm code to lag behind Github.\r\n\r\nIf you need to try the latest code, we strongly recommend that you pull the code from the [Luckysheet Github](https://github.com/mengshukeji/Luckysheet/) main repository. After our version is stable, we will consider releasing the npm package in real time.\r\n\r\nThe second step, if it is to import the packaged code of the github repository, test to determine whether there is a bug, you can find the problem and try to fix it, and then [submit a PR](https://github.com/mengshukeji/Luckysheet/pulls), if can't fix it, please [submit issues](https://github.com/mengshukeji/Luckysheet/issues).\r\n\r\n------------\r\n\r\n## `npm run dev` reported an error: ʻError: Cannot find module'rollup'`?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: It may be a problem with the npm package installation, try the following steps:\r\n1. `npm cache clean --force`\r\n2. `npm i rimraf -g`\r\n3. `rimraf node_modules`\r\n4. Delete the package-lock.json file\r\n5. `npm i`\r\n6. `npm run dev`\r\n\r\nTip: Most other npm installation problems can also be solved by trying above steps.\r\n\r\n------------\r\n\r\n## How to carry out secondary development of Luckysheet in Vue project?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: The [luckysheet-vue](https://github.com/mengshukeji/luckysheet-vue) case is to provide an application integration solution.\r\n\r\nIf directly developed locally:\r\n1. Start both the Luckysheet project and your own Vue project. For example, the Luckysheet project is at http://localhost:3001\r\n2. Import Luckysheet to use in the Vue project through `http://localhost:3001`\r\n\r\nIn this case, after Luckysheet is modified in real time, the changes can be seen in the Vue project\r\n\r\n------------\r\n\r\n## Error reporting `Store.createChart` when creating chart?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: You need to introduce a chart plugin to use it. You should configure the chart plugin to use when the workbook is initialized. Refer to\r\n\r\n- Plugins configuration [plugins](/guide/config.html#plugins)\r\n- 或 官方demo [src/index.html](https://github.com/mengshukeji/Luckysheet/blob/master/src/index.html)\r\n\r\n------------\r\n\r\n## Can cells add custom attributes?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: The custom attributes directly assigned to the cell object will be filtered. To make the custom attributes take effect, you need to edit the code to remove the filter attributes.\r\n\r\n------------\r\n\r\n## How to enter text starting with `'='`? For example, `=currentDate('YYYY-MM-DD')`, it will remove the function by default, how to prohibit the function?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Just add a single quotation mark in front of it, and it will be forcibly recognized as a string, which is consistent with excel. For example: `'=currentDate('YYYY-MM-DD')`\r\n\r\n------------\r\n\r\n## Why does the create callback have no effect?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: The API method `luckysheet.create()` does not have a callback, but Luckysheet provides a hook function to execute the callback method at a specified location, such as:\r\n- Triggered before the workbook is created [workbookCreateBefore](/guide/config.html#workbookcreatebefore)\r\n- Triggered after the workbook is created [workbookCreateAfter](/guide/config.html#workbookcreateafter)\r\n\r\n------------\r\n\r\n## When create, the first cell is selected by default, how to remove it?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: When the cell is selected, it is highlighted by default, just remove the highlight, use API: [setRangeShow](/guide/api.html#setrangeshow-range-setting)\r\n\r\n```js\r\nluckysheet.setRangeShow(\"A2\",{show:false})\r\n```\r\n\r\n------------\r\n\r\n## Where is the right-click event bound?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: In the source code [src/controllers/hander.js](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/handler.js), search for `event.which == \"3\"` to find the code executed by the right-click event.\r\n\r\n------------\r\n\r\n## How to add a custom toolbar?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: No configuration is currently provided, you can refer to the implementation of the print button in the toolbar to modify the source code:\r\n1. Search for `luckysheet-icon-print` globally to find the implementation of the print button, in [src/controllers/constant.js](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/constant.js) add a similar template string, you need to customize a unique id\r\n2. Modify [src/controllers/resize.js](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/resize.js) and add a new record in the toobarConfig object\r\n3. Modify [src/controllers/menuButton.js](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/menuButton.js) to add an event listener\r\n\r\n------------\r\n\r\n## How to add custom formulas?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Two source codes need to be modified:\r\n1. Add a formula to the `functionImplementation` object in the [src/function/functionImplementation.js](https://github.com/mengshukeji/Luckysheet/blob/master/src/function/functionImplementation.js) file, format refer to formulas such as `SUM`/`AVERAGE`\r\n2. Modify all the language packs in the [src/locale](https://github.com/mengshukeji/Luckysheet/blob/master/src/locale) file directory, and add the new formula description to the `functionlist` array in. Among them, `t` is the category of the function, `m` is the number of parameters, the minimum number of parameters and the maximum number of parameters.\r\n\r\n------------\r\n\r\n## Is there a similar loadData interface, I want to load 10 records first, and then dynamically load the data, these data are appended to the table?\r\n\r\n**<span style=\"font-size:20px;\">A</span>**: Yes. Our `loadSheetUrl` provides this function, which can be turned on by initializing `options.enablePage = true`.\r\n\r\nSearching for `enablePage` in the source code, you can see that there is a `method.addDataAjax` method, which contains an ajax request to dynamically load data, which will be appended to the worksheet.\r\n\r\nThis function is now hidden in the document, because when we made this interface, the interface parameters were matched according to our actual business, which may not be universal. We are going to abstract and release it for everyone to use. If you want to use it yourself you can change it based on this.\r\n\r\nIt is recommended that you consider writing your own interface to load the data, and then use `setRangeValue` to append the data at the specified location, which has a higher degree of customization.\r\n\r\n------------"
  },
  {
    "path": "docs/guide/README.md",
    "content": "# Luckysheet is no longer maintained, please use [Univer](https://github.com/dream-num/univer) instead!\r\n\r\n# Get started\r\n\r\n## Introduction\r\nLuckysheet is an online spreadsheet like excel that is powerful, simple to configure, and completely open source.\r\n\r\n## Demo\r\n[Online demo](https://dream-num.github.io/LuckysheetDemo/)\r\n\r\n![Demo](/LuckysheetDocs/img/LuckysheetDemo.gif)\r\n\r\n## Online Case\r\n\r\n- [Cooperative editing demo](http://luckysheet.lashuju.com/demo/)(Note: The official Java backend will also be open source after finishing,using OT algorithm. Please do not operate frequently to prevent the server from crashing)\r\n\r\n## Features\r\n\r\n### 🛠️Formatting\r\n+ **Styling** (Change font style, size, color, or apply effects)\r\n+ **Conditional formatting** (highlight interesting cells or ranges of cells, emphasize unusual values, and visualize data by using data bars, color scales, and icon sets that correspond to specific variations in the data)\r\n+ **Align or rotate text** \r\n+ **Support text truncation, overflow, automatic line wrapping**\r\n+ **Data types** \r\n\t+ **currency, percentages, decimals, dates** \r\n\t+ **Custom** (E.g `##,###0.00` , `$1,234.56$##,###0.00_);[Red]($##,###0.00)`, `_($* ##,###0.00_);_(...($* \"-\"_);_(@_)`, `08-05 PM 01:30MM-dd AM/PM hh:mm` )\r\n+ **Cell segmentation style** (Alt+Enter line break, sub,super, in-cell style)\r\n\r\n### 🧬Cells\r\n+ **Move cells by drag and dropping** (Operate on selection)\r\n+ **Fill handle** (For a series like 1, 2, 3, 4, 5..., type 1 and 2 in the first two cells. For the series 2, 4, 6, 8..., type 2 and 4. Support arithmetic sequence, geometric sequence,date, week,chinese numbers)\r\n+ **Auto Fill Options** (Fill copy, sequence, only format, no format, day, month, year)\r\n+ **Multiple selection** (Hold Ctrl Selecting multiple cells, copy and paste)\r\n+ **Find and replace** (Such as a particular number or text string, Support regular expression, whole word, case sensitive)\r\n+ **Location** (Cells can be selected according to the data type)\r\n+ **Merge cells**\r\n+ **Data validation**  (Checkbox, drop-down list, datePicker)\r\n\r\n### 🖱️Row & columns\r\n+ **Hide, Insert, Delete rows and columns** \r\n+ **Frozen rows and columns** (First row, first column, Frozen to selection, freeze adjustment lever can be dragged)\r\n+ **Split text** (Split text into different columns with the Convert Text to Columns Wizard)\r\n\r\n### 🔨Operation\r\n+ **Undo/Redo**\r\n+ **Copy/Paste/Cut** (Copy from excel to Luckysheet with format, vice versa)\r\n+ **Hot key** (The operating experience is consistent with excel, if there are differences or missing, please feedback to us)\r\n+ **Format Painter** (Similar to google sheet)\r\n+ **Selection by drag and dropping** (Change the parameters of formula and chart through selection)\r\n\r\n### ⚙️Formulas & functions\r\n+ **Built-in formulas**\r\n\t+ Math (SUMIFS, AVERAGEIFS, SUMIF, SUM, etc.)\r\n\t+ Text (CONCATENATE, REGEXMATCH, MID)\r\n\t+ Date (DATEVALUE, DATEDIF, NOW, WEEKDAY, etc.)\r\n\t+ Financial (PV, FV, IRR, NPV, etc.)\r\n\t+ Logical (IF, AND, OR, IFERROR, etc.)\r\n\t+ Lookup (VLOOKUP, HLOOkUP, INDIRECT, OFFSET, etc.)\r\n\t+ Dynamic Array (Excel2019 new formulas, SORT,FILTER,UNIQUE,RANDARRAY,SEQUENCE)\r\n+ **Array** (={1,2,3,4,5,6}, Crtl+Shift+Enter)\r\n+ **Remote formulas** (DM_TEXT_TFIDF, DM_TEXT_TEXTRANK,DATA_CN_STOCK_CLOSE etc. Need remote interface, can realize complex calculation)\r\n+ **Custom**  (Some formula suitable for use in China have been added. AGE_BY_IDCARD, SEX_BY_IDCARD, BIRTHDAY_BY_IDCARD, PROVINCE_BY_IDCARD, CITY_BY_IDCARD, etc. You can define any formula you want)\r\n\r\n### 📐Tables\r\n+ **Filters** (Support color , numerical, date, text filtering)\r\n+ **Sort** (Sort multiple fields simultaneously)\r\n\r\n### 📈Pivot table\r\n+ **Arrange fields** (Add fileds to rows, columns, values, area, it is similar to excel)\r\n+ **Aggregation**  (Surport Sum,Count,CountA,CountUnique,Average,Max,Min,Median,Product,Stdev,Stdevp,Var,VarP etc.)\r\n+ **Filter data** (Add fileds to filters area and analyze the desired data )\r\n+ **Drill down** (Double click pivot table cell to drill down for detail data )\r\n+ **Create a PivotChart** (Pivot table can create a chart )\r\n\r\n### 📊Chart\r\n+ **Support types** (Line, Column, Area, Bar, Pie, comming soon Scatter, Radar, Gauge, Funnel etc.) \r\n+ **Chart Plugins**  (Link to another project [ChartMix](https://github.com/mengshukeji/chartMix)(MIT): ECharts is currently supported,Highcharts, Ali G2, amCharts, googleChart, chart.js are being developed gradually)\r\n+ **Sparklines** (Support by formula : Line, Pie, Box, Pie etc.)\r\n\r\n### ✍️Share\r\n+ **Comments** (Add, delete, update)\r\n+ **Collaborate** (Simultaneous editing by multiple users)\r\n\r\n### 📚Insert object\r\n+ **Insert picture** (JPG,PNG,SVG and so on)\r\n\r\n### ⚡Luckysheet\r\n+ **Matrix operation** (Operate selection through the right-click menu: transpose, rotate, numerical calculation)\r\n+ **Screenshot** (Take a screenshot with selection)\r\n+ **Copy to** (In the right-click menu, copy selection to json, array etc.)\r\n+ **EXCEL import/export** (Specially adapted to Luckysheet, export is under development)\r\n\r\n### ⏱️Coming soon\r\n+ **Print** (Like excel print option, save to PDF)\r\n+ **Tree menu** (Just like the outline (group)  function of excel)\r\n+ **Table new Features** (filter, slicer)\r\n+ **CSV,TXT import/export** (Specially adapted to Luckysheet)\r\n+ **Insert Shapes** ([Pen tool](https://github.com/mengshukeji/Pentool) Shapes)\r\n+ **Documentation** (Improve documentation and API)\r\n+ **More...** (Please advise us)\r\n\r\n## Development model\r\n\r\n### Requirements\r\n[Node.js](https://nodejs.org/en/) Version >= 6 \r\n\r\n### Installation\r\n```shell\r\nnpm install\r\nnpm install gulp -g\r\n```\r\n\r\n### Development\r\n```shell\r\nnpm run dev\r\n```\r\n\r\n### Package\r\n```shell\r\nnpm run build\r\n```\r\n\r\n## Steps for usage\r\n\r\n### First step\r\n\r\nThere are two ways to introduce dependencies\r\n\r\n#### CDN\r\n```html\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/css/pluginsCss.css' />\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/plugins.css' />\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/css/luckysheet.css' />\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/assets/iconfont/iconfont.css' />\r\n<script src=\"https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/js/plugin.js\"></script>\r\n<script src=\"https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/luckysheet.umd.js\"></script>\r\n```\r\n\r\nNote that the path of `https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/luckysheet.umd.js` means that the latest luckysheet code will be pulled, but if Luckysheet has just been released, the jsdelivr website may not have time Synchronize from npm, so using this path will still pull to the previous version. We recommend that you directly specify the latest version.\r\n\r\nTo specify the Luckysheet version, please add the version number after all CDN dependent files, such as: `https://cdn.jsdelivr.net/npm/luckysheet@2.1.12/dist/luckysheet.umd.js`.\r\n\r\n> How do I know which version is the latest version? View the latest [release record](https://github.com/mengshukeji/Luckysheet/releases) or [package.json](https://github.com/mengshukeji/Luckysheet/blob/master/package.json)` version` field.\r\n\r\nIf it is not convenient to access jsdelivr.net, you can also import it locally\r\n\r\n#### Import locally\r\nAfter `npm run build`, all files in the `dist` folder are copied to the project directory\r\n```html\r\n<link rel='stylesheet' href='./plugins/css/pluginsCss.css' />\r\n<link rel='stylesheet' href='./plugins/plugins.css' />\r\n<link rel='stylesheet' href='./css/luckysheet.css' />\r\n<link rel='stylesheet' href='./assets/iconfont/iconfont.css' />\r\n<script src=\"./plugins/js/plugin.js\"></script>\r\n<script src=\"./luckysheet.umd.js\"></script>\r\n```\r\n### Second step\r\nSpecify a table container\r\n```html\r\n<div id=\"luckysheet\" style=\"margin:0px;padding:0px;position:absolute;width:100%;height:100%;left: 0px;top: 0px;\"></div>\r\n```\r\n### Third step\r\nCreate a table\r\n```javascript\r\n<script>\r\n    $(function () {\r\n        //Configuration item\r\n        var options = {\r\n            container: 'luckysheet' //luckysheet is the container id\r\n        }\r\n        luckysheet.create(options)\r\n    })\r\n</script>\r\n```\r\n\r\n## Structure\r\n\r\n### Format\r\n\r\nThe data format of a complete Luckysheet table file is: luckysheetfile, a table file contains several sheet files, corresponding to excel sheet0, sheet1, etc.\r\n\r\nAn example of a Luckysheet file is as follows, the table contains 3 sheets:`\r\nluckysheetfile = [{sheet1 settings}, {sheet2 settings}, {sheet3 settings}]`\r\nEquivalent to 3 sheets of excel\r\n\r\n![excel sheet](/LuckysheetDocs/img/excel.png)\r\n\r\nAn example of a sheet in the file is as follows:\r\n```javascript\r\nluckysheetfile[0] = \r\n{\r\n\t\"name\": \"Cell\", //Worksheet name\r\n\t\"color\": \"\", //Worksheet color\r\n\t\"config\": {}, //Table row height, column width, merged cells, borders, hidden rows and other settings\r\n\t\"index\": \"0\", //Worksheet index\r\n\t\"chart\": [], //Chart configuration\r\n\t\"status\": \"1\", //Activation status\r\n\t\"order\": \"0\", //The order of the worksheet\r\n\t\"hide\": 0,//whether to hide\r\n\t\"column\": 18, //Number of columns\r\n\t\"row\": 36, //number of rows\r\n\t\"celldata\": [], //Original cell data set\r\n\t\"visibledatarow\": [], //The position of all rows\r\n\t\"visibledatacolumn\": [], //The position of all columns\r\n\t\"ch_width\": 2322, //The width of the worksheet area\r\n\t\"rh_height\": 949, //The height of the worksheet area\r\n\t\"scrollLeft\": 0, //Left and right scroll bar position\r\n\t\"scrollTop\": 315, //Up and down scroll bar position\r\n\t\"luckysheet_select_save\": [], //selected area\r\n\t\"luckysheet_conditionformat_save\": {},//Conditional format\r\n\t\"calcChain\": [],//Formula chain\r\n\t\"isPivotTable\":false,//Whether to pivot table\r\n\t\"pivotTable\":{},//Pivot table settings\r\n\t\"filter_select\": null,//Filter range\r\n\t\"filter\": null,//Filter configuration\r\n\t\"luckysheet_alternateformat_save\": [], //Alternate colors\r\n\t\"luckysheet_alternateformat_save_modelCustom\": []//Customize alternate colors\r\n}\r\n```\r\n### View method\r\nView in chrome's console\r\n`luckysheet.getluckysheetfile()`\r\nYou can see the complete settings\r\n`[{shee1}, {sheet2}, {sheet3}]`\r\n\r\n## Keyboard shortcuts\r\n\r\n| Keyboard shortcuts | Features |\r\n| ------------ | ------------ |\r\n|  CTRL + C | Copy cell |\r\n|  CTRL + V | Paste cell |\r\n|  CTRL + X | Cut cell |\r\n|  CTRL + Z | Undo |\r\n|  CTRL + Y | Redo |\r\n|  CTRL + A | Select all |\r\n|  CTRL + B | Bold |\r\n|  CTRL + F | Find |\r\n|  CTRL + H | Replace |\r\n|  CTRL + I | Italic |\r\n|  CTRL + UP/DOWN/LEFT/RIGHT | Quickly adjust cell marquee |\r\n|  SHIFT + UP/DOWN/LEFT/RIGHT | Adjust selection area |\r\n|  CTRL + Left mouse click | Multiple selection cell |\r\n|  SHIFT + Left mouse click | Adjust selection area |\r\n|  UP/DOWN/LEFT/RIGHT | Move cell selection box |\r\n|  ENTER | Edit cell |\r\n|  TAB | Move cell selection box to the right |\r\n|  DELETE | Clear cell data |\r\n\r\n## Guide\r\n\r\nIf you encounter problems with Luckysheet, follow the steps below to find the answer\r\n\r\n1. Use Doge or Google to search for common technical issues\r\n2. For Luckysheet related issues, please view [Luckysheet Official Document](https://dream-num.github.io/LuckysheetDocs/)(Note that the function of marking TODO has not yet been implemented)\r\n3. Search [FAQ List](https://dream-num.github.io/LuckysheetDocs/guide/FAQ.html)\r\n4. Search [Official Forum](https://groups.google.com/g/luckysheet) to see if anyone has encountered it\r\n5. Try to check or experiment by yourself to find the answer\r\n6. Please try to read the source code to find the answer,\r\n\r\nIf none of the above methods solve your problem, you can consider:\r\n\r\n- Go to [Official Forum](https://groups.google.com/g/luckysheet) to ask questions\r\n- Go to [Gitter](https://gitter.im/mengshukeji/Luckysheet) to ask questions\r\n- If there are obvious problems or the needs cannot be met, please submit [issues](https://github.com/mengshukeji/Luckysheet/issues)\r\n\r\n> Recommended reading [How To Ask Questions The Smart Way](http://www.catb.org/~esr/faqs/smart-questions.html)\r\n\r\nAt the same time, we strongly recommend you to help us enrich the Luckysheet community\r\n\r\n- If you find a problem with the documentation or code, you can contribute by submitting a PR. All reasonable changes, optimizations, amendments, or document amendments or updates related to submissions will be accepted\r\n- When you have some experience in using or secondary developing Luckysheet, we encourage you to share it through blog posts"
  },
  {
    "path": "docs/guide/api.md",
    "content": "# API\r\n\r\nLuckysheet has opened up the main function API for common data operation requirements, and developers can do any docking development according to their needs.\r\n\r\nUse note:\r\n1. When script is introduced globally, all APIs are mounted under the window.luckysheet object, which can be printed and seen in the browser console; when npm is introduced, all APIs are also mounted under the luckysheet object\r\n2. The first parameter of the `success` callback function is the return value of the API method\r\n3. If you need a new API, please submit it to github [Issues](https://github.com/mengshukeji/Luckysheet/issues/new/choose), and decide whether to open the new API according to the number of likes\r\n4. The required `order` parameter in the API method is the value of `order` in the worksheet object, not `index`\r\n\r\n## Cell operation\r\n\r\n### getCellValue(row, column [,setting])<div id='getCellValue'></div>\r\n \r\n\r\n- **Parameter**：\r\n\r\n\t- {Number} [row]: The row number of the cell; an integer starting from 0, 0 means the first row\r\n\t- {Number} [column]: The number of the column where the cell is located; an integer starting from 0, 0 means the first column\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {String} [type]: The value type of the cell, which can be set to the original value `v` or the display value `m`; the default value is `v`, which means to get the actual value of the cell\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\r\n- **Explanation**：\r\n\t\r\n\tGet the value of the cell.\r\n\r\n\tIn special cases, the cell format is `yyyy-MM-dd`, when `type` is `'v'`, the display value of `'m'` will be forced\r\n\r\n- **Usage**:\r\n\r\n\t- Returns the v value of the data in the first row and first column of the current worksheet\r\n\t\t\r\n\t\t`luckysheet.getCellValue(0, 0)`\r\n\r\n\t- Returns the original value of the cell in the second row and second column of the specified data.\r\n\t\t\r\n\t\t`luckysheet.getCellValue(1, 1, {type:\"m\"})`\r\n\r\n------------\r\n\r\n### setCellValue(row, column, value [,setting])\r\n \r\n- **Parameter**:\r\n\r\n\t- {Number} [row]: The row number of the cell; an integer starting from 0, 0 means the first row\r\n\t- {Number} [column]: The number of the column where the cell is located; an integer starting from 0, 0 means the first column\r\n\t- {Object| String| Number} [value]: The value to be set; it can be a string or a number, or an object conforming to the Luckysheet cell format, refer to [cell attribute table](/zh/guide/cell.html )\r\n\t- {PlainObject} [setting]: Optional parameters\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n    \t+ {Boolean} [isRefresh]: Whether to refresh the interface; the default is `true`; used to control throttling when multiple cells are assigned, the previous cell should be set to `false`, and the last cell is set Is `true`.\r\n    \t+ {Function} [success]: The callback function for the end of the operation\r\n\r\n- **Explanation**:\r\n\r\n\tSet the value of a cell, you can also set the entire cell object, which is used to set multiple cell properties at the same time.\r\n\r\n\tIf you need to update the formula, you can also assign a value here. Luckysheet will actively calculate this formula internally and add it to the formula chain, and finally refresh the interface.\r\n\r\n- **Usage**:\r\n\r\n  - Set the value of cell \"A1\" in the current worksheet to \"1\"\r\n  `luckysheet.setCellValue(0, 0, 1);`\r\n\r\n  - Set the current worksheet \"B1\" cell value to the formula \"=sum(A1)\"\r\n  `luckysheet.setCellValue(0, 1, \"=sum(A1)\");`\r\n\r\n  - Set the cell \"C1\" of the current worksheet to the formula \"=sum(A1:B1\" with a red background. The cell object can have no `v` and `m` values. Luckysheet will automatically calculate the result according to the formula information. With `v` and `m` values ​​that have not been updated or are non-formula results, Luckysheet will still calculate the prepared results based on the data actually associated with the formula.\r\n  \t`luckysheet.setCellValue(0, 2, {f: \"=sum(A1:B1)\", bg:\"#FF0000\"})`\r\n\r\n\tSet the \"C1\" cell again and the new formula can still take effect\r\n\t\t`luckysheet.setCellValue(0, 2, {f: \"=sum(A1)\", bg:\"#00FF00\"})`\r\n\r\n------------\r\n### clearCell(row, column [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\r\n\t- {Number} [row]: The row number of the cell; an integer starting from 0, 0 means the first row\r\n\t- {Number} [column]: The number of the column where the cell is located; an integer starting from 0, 0 means the first column\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tClear the contents of the specified cell of the specified worksheet, return the cleared data, which is different from the function of deleting the cell, no need to set the cell movement\r\n\r\n- **Usage**:\r\n\r\n    - Clear the contents of cell `B2`\r\n      `luckysheet.clearCell(1,1)`\r\n    \r\n------------\r\n\r\n### deleteCell(move, row, column [,setting])\r\n \r\n\r\n- **Parameter**:\r\n  - {String} [move]: After deleting, whether the cells on the right or below move\r\n    \r\n  Possible values of `move` are:\r\n   \r\n      + `\"left\"`: Move the right cell to the left\r\n      + `\"up\"`: Move the lower cell up\r\n   \r\n  - {Number} [row]: The row number of the cell; an integer starting from 0, 0 means the first row\r\n  - {Number} [column]: The number of the column where the cell is located; an integer starting from 0, 0 means the first column\r\n  - {PlainObject} [setting]: optional parameters\r\n      + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n      + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tDelete the specified cell of the specified worksheet, return the deleted data, and at the same time, specify whether to move the right cell to the left or the bottom cell to move up\r\n\r\n- **Usage**:\r\n\r\n    - Delete the current cell and after deleting, the right cell moves to the left\r\n      `luckysheet.deleteCell('left')`\r\n    \r\n------------\r\n\r\n### setCellFormat(row, column, attr, value [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Number} [row]: The row number of the cell; an integer starting from 0, 0 means the first row\r\n    - {Number} [column]: The number of the column where the cell is located; an integer starting from 0, 0 means the first column\r\n    - {String} [attr]: attribute type, refer to attribute value of [cell attribute table](/zh/guide/cell.html)\r\n    - {String | Number | Object} [value]: Specific setting value, one attribute will correspond to multiple values, refer to the value example of [cell attribute table](/zh/guide/cell.html), if the attribute type is ` Attr` is the cell format `ct`, then the setting value `value` should provide a ct object, such as: `{fa:\"General\", t:\"g\"}`, for example, set the format of cell A1 to percentage format:\r\n\t  \r\n  \t  `luckysheet.setCellFormat(0, 0, \"ct\", {fa:\"0.00%\", t:\"n\"})`\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n        + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n        + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSet the properties of a cell. If you want to set the value of a cell or set multiple cell properties at the same time, it is recommended to use `setCellValue`\r\n\r\n\tSpecial settings\r\n    \r\n\tWhen setting the border, attr is `\"bd\"`, value is a key/value object, and the border type: `borderType`/border thickness:`style`/border color:`color` need to be set at the same time, such as setting A1 unit The border of the grid is all/red/thin:\r\n\r\n\t`luckysheet.setCellFormat(0, 0, \"bd\", {borderType: \"border-right\",style: \"1\", color: \"#ff0000\"})`\r\n\r\n\tThe complete optional setting parameters are as follows:\r\n\r\n    + Border Type `borderType: \"border-left\" | \"border-right\" | \"border-top\" | \"border-bottom\" | \"border-all\" | \"border-outside\" | \"border-inside\" | \"border -horizontal\" | \"border-vertical\" | \"border-none\"`,\r\n    + Border thickness `style: 1 Thin | 2 Hair | 3 Dotted | 4 Dashed | 5 DashDot | 6 DashDotDot | 7 Double | 8 Medium | 9 MediumDashed | 10 MediumDashDot | 11 MediumDashDotDot | 12 SlantedDashDot | 13 Thick`\r\n    + Border color `color: hexadecimal color value`\r\n\r\n- **Usage**:\r\n\r\n    - Set the current worksheet A1 cell text bold\r\n    `luckysheet.setCellFormat(0, 0, \"bl\", 1)`\r\n    - Set the B2 cell background of the second worksheet to red\r\n    `luckysheet.setCellFormat(1, 1, \"bg\", \"#ff0000\", {order:1})`\r\n    - Set the value of cell \"A1\" of the current worksheet to \"abc\"\r\n    `luckysheet.setCellFormat(0, 0,'v','abc');`\r\n\r\n------------\r\n\r\n### find(content [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\t\r\n\t- {String} [content]: the content to find\r\n    - {PlainObject} [setting]: optional parameters\r\n        + {Boolean} [isRegularExpression]: Whether to match the regular expression; the default is `false`\r\n        + {Boolean} [isWholeWord]: Whether to match the whole word; the default is `false`\r\n        + {Boolean} [isCaseSensitive]: Whether to match case sensitively; the default is `false`\r\n        + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n        + {String} [type]: cell attribute; the default value is `\"m\"`\r\n\r\n- **Explanation**：\r\n\t\r\n\tFind the specified content in a worksheet and return a one-bit array of cells composed of the found content, the data format is the same as `celldata`.\r\n\r\n- **Usage**:\r\n\r\n    - Find the string `\"value\"` in the current worksheet\r\n    `luckysheet.find(\"value\")`\r\n\t- Find cells in the current worksheet whose formula contains `\"SUM\"`\r\n    `luckysheet.find(\"SUM\",{type:\"f\"})`\r\n\r\n------------\r\n\r\n### replace(content, replaceContent [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\t\r\n\t- {String} [content]: the content to find\r\n\t- {String} [replaceContent]: The content to be replaced\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Boolean} [isRegularExpression]: Whether to match the regular expression; the default is `false`\r\n    \t+ {Boolean} [isWholeWord]: Whether to match the whole word; the default is `false`\r\n    \t+ {Boolean} [isCaseSensitive]: Whether to match case sensitively; the default is `false`\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tFind the specified content in a worksheet and replace it with new content, and return a one-bit array of cells composed of the replaced content. The data format is the same as `celldata`.\r\n\r\n- **Usage**:\r\n\r\n     - Find the string `\"value\"` in the current worksheet and replace it with `\"out\"`\r\n    \t`luckysheet.replace(\"value\", \"out\")`\r\n\r\n------------\r\n\r\n### exitEditMode([,setting])\r\n \r\n\r\n- **Parameter**：\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n        + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tExit edit mode. After double-clicking the cell with the mouse, it will enter the cell editing mode. After the editing is completed, when the mouse clicks on the input box elsewhere to lose focus, the editing mode will be exited, and the value of the cell will be saved. This Api is the operation of automatically exiting the editing mode, mainly to trigger the automatic saving of cells.\r\n\r\n- **Usage**:\r\n\r\n   - Manually trigger to exit edit mode\r\n   \t\t`luckysheet.exitEditMode()`\r\n\r\n------------\r\n\r\n## Row and column operations\r\n\r\n### setHorizontalFrozen(isRange [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Boolean} [isRange]: Whether to freeze rows to selection\r\n\t\tPossible values of `isRange` are:\r\n \r\n        + `\"false\"`: Freeze the first line\r\n        + `\"true\"`: freeze line to selection\r\n    - {PlainObject} [setting]: optional parameters\r\n        + {Array | Object | String} [range]: Set when `isRange` is `true`, open the frozen cell position, the format is `{ row_focus:0, column_focus:0 }`, which means the currently activated cell The number of rows and columns of the grid; the default is obtained from the last selection of the current selection\r\n        + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n        + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tFreeze row operation\r\n\r\n\tPay special attention to the setting of `range` in `setting` only when `isRange` is set to `true`, which is different from the general range format.\r\n\r\n- **Usage**:\r\n\r\n   - Freeze the first row\r\n\r\n\t\t`luckysheet.setHorizontalFrozen(false)`\r\n\r\n   - Frozen to `B5` selection\r\n\r\n\t\t`luckysheet.setHorizontalFrozen(true, { range: 'B5' })`\r\n\r\n------------\r\n\r\n### setVerticalFrozen(isRange [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Boolean} [isRange]: Whether to freeze the selection\r\n\t\tPossible values of `isRange` are:\r\n\t\t\r\n\t\t+ `\"false\"`: Freeze the first column\r\n\t\t+ `\"true\"`: Freeze column to selection\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Array | Object | String} [range]: Set when `isRange` is `true`, open the frozen cell position, the format is `{ row_focus:0, column_focus:0 }`, which means the currently activated cell The number of rows and columns of the grid; the default is obtained from the last selection of the current selection\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tFreeze column operation\r\n\r\n\tPay special attention to the setting of `range` in `setting` only when `isRange` is set to `true`, which is different from the general range format.\r\n\r\n- **Usage**:\r\n\r\n   - Freeze the first column\r\n\r\n\t\t`luckysheet.setVerticalFrozen(false)`\r\n\r\n------------\r\n\r\n### setBothFrozen(isRange [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Boolean} [isRange]: Whether to freeze the ranks to the selection\r\n\t\tPossible values of `isRange` are:\r\n\t\t\r\n\t\t+ `\"false\"`: Freeze ranks\r\n\t\t+ `\"true\"`: Freeze ranks to selection\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Array | Object | String} [range]: Set when `isRange` is `true`, open the frozen cell position, the format is `{ row_focus:0, column_focus:0 }`, which means the currently activated cell The number of rows and columns of the grid; the default is obtained from the last selection of the current selection\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tFreeze rank operation\r\n\r\n\tPay special attention to the setting of `range` in `setting` only when `isRange` is set to `true`, which is different from the general range format.\r\n\r\n\tIf you want to use this API to set the freeze after the workbook is initialized, you can execute it in the hook function after the workbook is created, such as:\r\n\t```js\r\n\tluckysheet.create({\r\n\t\thook:{\r\n\t\t\tworkbookCreateAfter:function(){\r\n\t\t\t\tluckysheet.setBothFrozen(false);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n- **Usage**:\r\n\r\n   - Frozen ranks\r\n\r\n\t\t`luckysheet.setBothFrozen(false)`\r\n\r\n------------\r\n\r\n### cancelFrozen([setting])\r\n \r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n        + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n        + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tCancel freeze operation\r\n\r\n- **Usage**:\r\n\r\n   - Cancel freeze\r\n\r\n\t\t`luckysheet.cancelFrozen()`\r\n\r\n------------\r\n\r\n### insertRow(row [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\r\n\t- {Number} [row]: Insert a blank row in the first few rows, starting from 0\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [number]: The number of blank rows inserted; the default is 1\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tInsert a blank line in the `number` line at the position of the `row` line\r\n\r\n- **Usage**:\r\n\r\n   - Insert a blank line at the position of line 2\r\n\r\n\t\t`luckysheet.insertRow(1)`\r\n\r\n------------\r\n\r\n### insertColumn( column [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\r\n\t- {Number} [column]: Insert a blank column in the first column\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [number]: The number of blank columns to insert; the default is 1\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tInsert a blank column in column `number` at the position of column `column`\r\n\r\n- **Usage**:\r\n\r\n   - Insert 3 blank rows in column 1\r\n\r\n\t\t`luckysheet.insertRow(0, { number: 3 })`\r\n\r\n------------\r\n\r\n### deleteRow(rowStart, rowEnd [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Number} [rowStart]: the starting row to delete\r\n\t- {Number} [rowEnd]: the end row to be deleted\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tDelete the specified row\r\n\r\n\tSpecial reminder, after deleting the row, the serial number of the row will not change, the following row will be added to the above, pay attention to observe whether the data is deleted correctly.\r\n\r\n- **Usage**:\r\n\r\n   - Delete 2-4 lines\r\n\r\n\t\t`luckysheet.deleteRow(1, 3)`\r\n\r\n------------\r\n\r\n### deleteColumn(columnStart, columnEnd [,setting])\r\n \r\n- **Parameter**：\r\n\t\r\n\t- {Number} [columnStart]: the starting column to be deleted\r\n\t- {Number} [columnEnd]: the end column to be deleted\r\n\tTo\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tDelete the specified column\r\n\r\n\tSpecial reminder, after deleting the column, the serial number of the column will not change, the right column will be added to the left, pay attention to whether the data is deleted correctly.\r\n\r\n- **Usage**:\r\n\r\n   - Delete 2-4 columns\r\n\r\n\t\t`luckysheet.deleteColumn(1, 3)`\r\n\r\n------------\r\n\r\n### hideRow(rowStart, rowEnd [,setting])\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Number} [rowStart]: The starting row to be hidden\r\n\t- {Number} [rowEnd]: the end row to be hidden\r\n\tTo\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tHide the specified row\r\n\r\n\tSpecial reminder, after the row is hidden, the row number will change.\r\n\r\n- **Usage**:\r\n\r\n   - Hide 2-4 rows\r\n\r\n\t\t`luckysheet.hideRow(1, 3)`\r\n\r\n------------\r\n\r\n### hideColumn(columnStart, columnEnd [,setting])(TODO)\r\n \r\n- **Parameter**：\r\n\t\r\n\t- {Number} [columnStart]: the starting column to be hidden\r\n\t- {Number} [columnEnd]: the end column to be hidden\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tHide the specified column\r\n\r\n\tSpecial reminder, after hiding the column, the sequence number of the column will change.\r\n\r\n- **Usage**:\r\n\r\n   - Hide 2-4 columns\r\n\r\n\t\t`luckysheet.hideColumn(1, 3)`\r\n\r\n------------\r\n\r\n### showRow(rowStart, rowEnd [,setting])\r\n \r\n- **Parameter**：\r\n\t\r\n\t- {Number} [rowStart]: the starting row to be displayed\r\n\t- {Number} [rowEnd]: the end row to be displayed\r\n\tTo\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tShow the specified row\r\n\r\n- **Usage**:\r\n\r\n   - Display 2-4 lines\r\n\r\n\t\t`luckysheet.showRow(1, 3)`\r\n\r\n------------\r\n\r\n### showColumn(columnStart, columnEnd [,setting])(TODO)\r\n \r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Number} [columnStart]: the starting column to be displayed\r\n\t- {Number} [columnEnd]: the end column to be displayed\r\n\tTo\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tShow the specified column\r\n\r\n- **Usage**:\r\n\r\n   - Display 2-4 columns\r\n\r\n\t\t`luckysheet.showColumn(1, 3)`\r\n\r\n------------\r\n\r\n### setRowHeight(rowInfo [,setting])\r\n\r\n(TODO)\r\n \r\n- **Parameter**：\r\n\t\r\n\t- {Object} [rowInfo]: Correspondence between number of rows and height\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n        + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSet the height of the specified ~~row~~\r\n\r\n- **Usage**:\r\n\r\n   - Set the height of the first row to 50px and the height of the second row to 60px\r\n\r\n\t\t`luckysheet.setRowHeight({0：50，1：60})`\r\n\r\n------------\r\n\r\n### setColumnWidth(columnInfo [,setting])\r\n\r\n(TODO)\r\n \r\n- **Parameter**：\r\n\t\r\n\t- {Object} [columnInfo]: Correspondence between the number of columns and the width\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n        + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSet the width of the specified column\r\n\r\n- **Usage**:\r\n\r\n   - Set the width of the first column to 50px and the width of the second column to 60px\r\n\r\n\t\t`luckysheet.setColumnWidth({0：50，1：60})`\r\n\r\n------------\r\n\r\n### getRowHeight(rowInfo [,setting])\r\n\r\n(TODO)\r\n \r\n- **Parameter**：\r\n\t\r\n\t- {Array} [rowInfo]: The number of rows\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n        + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tGet the height of the specified row, get the object corresponding to the number of rows and height\r\n\r\n- **Usage**:\r\n\r\n   - The height of the first row is 50px, the height of the second row is 60px, get these values\r\n\r\n\t\t`luckysheet.getRowHeight([0,1])`\r\n\t\tReturn to get\r\n\t\t`{0：50，1：60}`\r\n\r\n------------\r\n\r\n### getColumnWidth(columnInfo [,setting])\r\n\r\n(TODO)\r\n \r\n- **Parameter**：\r\n\t\r\n\t- {Array} [columnInfo]: The number of columns\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n        + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tGet the width of the specified column, get the object of the corresponding relationship between the number of columns and the width\r\n\r\n- **Usage**:\r\n\r\n   - The width of the first column is 50px, the width of the second column is 60px, get these values\r\n\r\n\t\t`luckysheet.getColumnWidth([0,1])`\r\n\t\tReturn to get\r\n\t\t`{0：50，1：60}`\r\n\r\n------------\r\n\r\n### getDefaultRowHeight([,setting])\r\n\r\n(TODO)\r\n \r\n- **Parameter**：\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n        + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tGet the default row height of the specified worksheet\r\n\r\n- **Usage**:\r\n\r\n   - Returns the default row height of the current worksheet\r\n\r\n\t\t`luckysheet.getDefaultRowHeight()`\r\n\t\tReturn to get\r\n\t\t`19`\r\n\r\n------------\r\n\r\n### getDefaultColWidth([,setting])\r\n\r\n(TODO)\r\n \r\n- **Parameter**：\r\n\t\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n        + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tGet the default column width of the specified worksheet\r\n\r\n- **Usage**:\r\n\r\n   - Returns the default column width of the current worksheet\r\n\r\n\t\t`luckysheet.getDefaultColWidth()`\r\n\t\tReturn to get\r\n\t\t`73`\r\n\r\n------------\r\n\r\n## Selection operation\r\n\r\n### getRange()\r\n \r\n\r\n- **Explanation**：\r\n\r\n\tReturns an array of current selection objects, there may be multiple selections. The format of each selection area is an object composed of row/column information `{row:[0,1],column:[0,1]}`\r\n\r\n- **Usage**:\r\n\r\n\t- The current selection is \"A1:B2\" and \"B4:C5\", execute\r\n\t\t\r\n\t\t`luckysheet.getRange()`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{ \"row\": [0,1], \"column\": [0,1] },\r\n\t\t\t{ \"row\": [3,4], \"column\": [1,2] }\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n\r\n### getRangeWithFlatten()\r\n \r\n- **Explanation**：\r\n\r\n\tReturns an array representing the positions of all cells in the specified area, which is different from the getrange method, which organizes the data of the selection by cell (rather than a continuous area).\r\n\r\n- **Usage**:\r\n\r\n\t- Select the specified area in the table, and then execute\r\n\t\t\r\n\t\t`luckysheet.getRange()`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\"row\":[0,0],\"column\":[0,2]},\r\n\t\t\t{\"row\":[1,1],\"column\":[0,0]},\r\n\t\t\t{\"row\":[3,3],\"column\":[0,0]}\r\n\t\t]\r\n\t\t```\r\n\t\tWhere，{\"row\":[0,0],\"column\":[0,2]} denote a whole continuous region.\r\n\r\n\t- Select the area above in the table and execute\r\n\t\t\r\n\t\t`luckysheet.getRangeWithFlatten()`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\"r\":0,\"c\":0},\r\n\t\t\t{\"r\":0,\"c\":1},\r\n\t\t\t{\"r\":0,\"c\":2},\r\n\t\t\t{\"r\":1,\"c\":0},\r\n\t\t\t{\"r\":3,\"c\":0}\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n\r\n### getRangeValuesWithFlatte()\r\n \r\n- **Explanation**：\r\n\r\n\tReturns an array of objects representing the contents of all cells in a specified range\r\n\r\n- **Usage**:\r\n\r\n\t- Select the specified area in the table, and then execute\r\n\t\t\r\n\t\t`luckysheet.getRange()`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\"row\":[0,0],\"column\":[0,2]},\r\n\t\t\t{\"row\":[1,1],\"column\":[0,0]},\r\n\t\t\t{\"row\":[3,3],\"column\":[0,0]}\r\n\t\t]\r\n\t\t```\r\n\t\tWhere，{\"row\":[0,0],\"column\":[0,2]} denote a whole continuous region.\r\n\r\n\t- Select the area above in the table and execute\r\n\t\t\r\n\t\t`luckysheet.getRangeValuesWithFlatte()`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\r\n\t\t\t\t\"bg\": null,\r\n\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\"it\": 0,\r\n\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\"vt\": 1,\r\n\t\t\t\t\"v\": 1,\r\n\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t},\r\n\t\t\t\t\"m\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"bg\": null,\r\n\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\"it\": 0,\r\n\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\"vt\": 1,\r\n\t\t\t\t\"v\": 2,\r\n\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t},\r\n\t\t\t\t\"m\": \"2\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"bg\": null,\r\n\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\"it\": 0,\r\n\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\"vt\": 1,\r\n\t\t\t\t\"v\": 3,\r\n\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t},\r\n\t\t\t\t\"m\": \"3\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"v\": \"Background\",\r\n\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t},\r\n\t\t\t\t\"m\": \"Background\",\r\n\t\t\t\t\"bg\": null,\r\n\t\t\t\t\"bl\": 1,\r\n\t\t\t\t\"it\": 0,\r\n\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\"vt\": 1\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"v\": \"Border\",\r\n\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t},\r\n\t\t\t\t\"m\": \"Border\",\r\n\t\t\t\t\"bg\": null,\r\n\t\t\t\t\"bl\": 1,\r\n\t\t\t\t\"it\": 0,\r\n\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\"vt\": 1\r\n\t\t\t}\r\n\t\t]\r\n\t\t```\r\n------------\r\n\r\n### getRangeAxis()\r\n \r\n- **Explanation**：\r\n\r\n\tReturns an array of coordinate strings corresponding to the current selection. Multiple selections may exist. Each selection may be a single cell (such as A1) or a rectangular region of multiple cells (such as D9: E12)\r\n\r\n- **Usage**:\r\n\r\n\t- The current selection is\"E10:E14\"、\"A7:B13\"、\"C4\"、 \"A3\" and \"C6:D9\", execute\r\n\t\t\r\n\t\t`luckysheet.getRangeAxis()`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\"E10:E14\", \"A7:B13\", \"C4\", \"A3\", \"C6:D9\"]\r\n\t\t```\r\n\r\n------------\r\n\r\n### getRangeValue([setting])\r\n \r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n        + {Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column:[0 ,1]}`, can only be a single selection; the default is the current selection\r\n        + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\r\n- **Explanation**：\r\n\t\r\n\tReturns the data of a two-dimensional array of cells in the specified range of the specified worksheet, each cell is an object.\r\n\r\n\t[Cell Object Format Reference](/zh/guide/cell.html)\r\n\r\n- **Usage**:\r\n\r\n\t- The current selection is \"A1:B2\", execute\r\n\t\t\r\n\t\t`luckysheet.getRangeValue()`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"v\": \"vaule1\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"m\": \"vaule1\",\r\n\t\t\t\t\t\"bg\": \"rgba(255,255,255)\",\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 1,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 0\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"v\": \"value3\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"m\": \"value3\",\r\n\t\t\t\t\t\"bg\": \"rgba(255,255,255)\",\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 1,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 0\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"v\": \"vaule2\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"m\": \"vaule2\",\r\n\t\t\t\t\t\"bg\": \"rgba(255,255,255)\",\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 1,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 0\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"v\": \"value4\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"m\": \"value4\",\r\n\t\t\t\t\t\"bg\": \"rgba(255,255,255)\",\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 1,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 0\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n### getRangeHtml([setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n        + {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, allows an array of multiple selections; the default is the current selection\r\n        + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\r\n- **Explanation**：\r\n\t\r\n\tCopy the data in the specified cell area of the specified worksheet and return the data containing the `<table>`html format, which can be used to paste into excel to maintain the cell style.\r\n \r\n\tNote that if you copy multiple selections, these selections must have the same row or the same column to copy, and the copied results will also be automatically merged into a concatenated array, for example, multiple selections `\"C18:C20\"` / `\"E18:E20\"` / `\"G18:H20\"` is allowed, but multiple selections of `\"C18:C20\"` / `\"E18:E21\"` are not allowed\r\n\r\n- **Usage**:\r\n\r\n\t- The current selection is \"A1:B2\", execute\r\n\t\t\r\n\t\t`luckysheet.getRangeHtml()`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```html\r\n\t\t<table data-type=\"luckysheet_copy_action_table\">\r\n\t\t\t<colgroup width=\"72px\">\r\n\t\t\t</colgroup>\r\n\t\t\t<colgroup width=\"72px\">\r\n\t\t\t</colgroup>\r\n\t\t\t<tr>\r\n\t\t\t\t<td style=\"height:19px;\">\r\n\t\t\t\t\tvalue1\r\n\t\t\t\t</td>\r\n\t\t\t\t<td style=\"\">\r\n\t\t\t\t\tvalue3\r\n\t\t\t\t</td>\r\n\t\t\t</tr>\r\n\t\t\t<tr>\r\n\t\t\t\t<td style=\"height:19px;\">\r\n\t\t\t\t\tvalue2\r\n\t\t\t\t</td>\r\n\t\t\t\t<td style=\"\">\r\n\t\t\t\t\tvalue4\r\n\t\t\t\t</td>\r\n\t\t\t</tr>\r\n\t\t</table>\r\n\t\t```\r\n\r\n------------\r\n\r\n### getRangeJson(title [,setting])\r\n\r\n- **Parameter**：\r\n\r\n    - {Boolean} [title]: Whether the first line is the title\r\n\r\n    \tPossible values of `title` are:\r\n    \t\r\n    \t+ `\"true\"`: first row is title\r\n    \t+ `\"false\"`: The first row is not title\r\n    - {PlainObject} [setting]: optional parameters\r\n        + {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, can only be a single selection; the default is the current selection\r\n        + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\r\n- **Explanation**：\r\n\r\n\tCopy the data in the specified cell area of the specified worksheet and return the data in `json` format\r\n\r\n- **Usage**:\r\n\r\n\t- The current selection is \"A1:B2\", the first row is the title to get json\r\n\t\t\r\n\t\t`luckysheet.getRangeJson(true)`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{ \"value1\": \"value2\", \"value3\": \"value4\" }\r\n\t\t]\r\n\t\t```\r\n\r\n\t- The current selection is \"A1:B2\", the first row is not title to get json\r\n\t\t\r\n\t\t`luckysheet.getRangeJson(false)`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{ \"A\": \"value1\", \"B\": \"value3\" },\r\n\t\t\t{ \"A\": \"value2\", \"B\": \"value4\" }\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n### getRangeArray(dimensional [,setting])\r\n\r\n[todo]\r\n\r\n- **Parameter**：\r\n\r\n    - {String} [dimensional]: array dimension\r\n \r\n\t\tPossible values of `dimensional` are:\r\n\t\t\r\n\t\t+ `\"oneDimensional\"`: one-dimensional array\r\n\t\t+ `\"twoDimensional\"`: two-dimensional array\r\n\t\t+ `\"custom\"`: a two-dimensional array of custom rows and columns\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [row]: Set when `dimensional` is `custom`, the number of rows in the multidimensional array\r\n    \t+ {Number} [column]: Set when `dimensional` is `custom`, the number of columns in the multidimensional array\r\n    \t+ {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, can only be a single selection; the default is the current selection\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\r\n- **Explanation**：\r\n\t\r\n\tCopy the data in the specified cell area of the specified worksheet, and return the data in a one-dimensional, two-dimensional, or two-dimensional array of custom rows and columns.\r\n\r\n\tPay special attention to the setting of `row` and `column` in `setting` only when `dimensional` is set to `custom`\r\n\r\n- **Usage**:\r\n\r\n\t- The current selection is \"A1:B2\", a one-dimensional array\r\n\t\t\r\n\t\t`luckysheet.getRangeArray('oneDimensional')`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\"value1\",\"value3\",\"value2\",\"value4\"]\r\n\t\t```\r\n\r\n\t- The current selection is \"A1:B2\", a two-dimensional array\r\n\t\t\r\n\t\t`luckysheet.getRangeArray('twoDimensional')`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t[ \"value1\", \"value3\" ],\r\n\t\t\t[ \"value2\", \"value4\" ]\r\n\t\t]\r\n\t\t```\r\n\r\n\t- The current selection area is \"A1:C5\", which is composed of values from'value1' to'value15', and obtains a two-dimensional array data with 3 rows and 2 columns\r\n\t\t\r\n\t\t`luckysheet.getRangeArray('custom', { row: 3, column: 2 })`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"m\": \"value1\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value1\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value6\",\r\n\t\t\t\t\t\"m\": \"value6\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value11\",\r\n\t\t\t\t\t\"m\": \"value11\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"m\": \"value2\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value2\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value7\",\r\n\t\t\t\t\t\"m\": \"value7\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value12\",\r\n\t\t\t\t\t\"m\": \"value12\"\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n### getRangeDiagonal(type [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\r\n\t- {String} [type]: diagonal or diagonal offset\r\n \r\n\t\tPossible values of `type` are:\r\n\t\t\r\n\t\t+ `\"normal\"`: diagonal\r\n\t\t+ `\"anti\"`: anti-diagonal\r\n\t\t+ `\"offset\"`: diagonal offset\r\n    - {PlainObject} [setting]: optional parameters\r\n    - {Number} [column]: Set when `type` is `offset`, the number of columns for diagonal offset\r\n        + {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, can only be a single selection; the default is the current selection\r\n        + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\r\n- **Explanation**：\r\n\t\r\n\tCopy the data in the specified cell area of the specified worksheet, and return the diagonal or diagonal offset data from the `column` column.\r\n\r\n\tPay special attention to the setting of `column` in `setting` only when `type` is set to `offset`.\r\n\r\n- **Usage**:\r\n\r\n\t- The current selection is \"A1:B2\", diagonal\r\n\t\t\r\n\t\t`luckysheet.getRangeDiagonal('normal')`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\r\n\t\t\t\t\"m\": \"value1\",\r\n\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\"v\": \"value1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"m\": \"value4\",\r\n\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\"v\": \"value4\"\r\n\t\t\t}\r\n\t\t]\r\n\t\t```\r\n\r\n\t- The current selection is \"A1:B2\", against the diagonal\r\n\t\t\r\n\t\t`luckysheet.getRangeDiagonal('anti')`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\r\n\t\t\t\t\"m\": \"value3\",\r\n\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\"v\": \"value3\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"m\": \"value2\",\r\n\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\"v\": \"value2\"\r\n\t\t\t}\r\n\t\t]\r\n\t\t```\r\n\t- The current selection is \"A1:B2\", and the diagonal is offset by 1 column\r\n\t\t\r\n\t\t`luckysheet.getRangeDiagonal('offset', { column: 1 })`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\r\n\t\t\t\t\"m\": \"value3\",\r\n\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\"v\": \"value3\"\r\n\t\t\t}\r\n\t\t]\r\n\t\t```\r\n------------\r\n\r\n### getRangeBoolean([setting])\r\n \r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n        + {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, can only be a single selection; the default is the current selection\r\n        + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\r\n- **Explanation**：\r\n\t\r\n\tCopy the data in the specified cell area of the specified worksheet, and return the data of Boolean value\r\n\r\n- **Usage**:\r\n\r\n\t- The current selection is \"A1:B2\"\r\n\t\t\r\n\t\t`luckysheet.getRangeBoolean()`\r\n\t\t\r\n\t\tThe returned result is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t[ false, false ],\r\n\t\t\t[ false, false ]\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n### setRangeShow(range [,setting])<div id='setRangeShow'></div>\r\n\r\n- **Parameter**：\r\n\r\n\t- {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, allows an array of multiple selections; the default is the current selection\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Boolean} [show]: Whether to show the highlight selection effect; the default value is `true`\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSpecify one or more selection areas in the worksheet to be selected and choose whether to highlight or not. Multiple format settings are supported.\r\n\r\n\tSpecial reminder, the selection range setting involved in Luckysheet can refer to this setting\r\n\r\n- **Usage**:\r\n\r\n     + Set the current worksheet selection area `A1:B2`: \r\n      \r\n\t\t`luckysheet.setRangeShow(\"A1:B2\")`\r\n     + Set selection range `A1:B2`:\r\n  \t\t\r\n\t\t`luckysheet.setRangeShow([\"A1:B2\"])`\r\n     + Set selection range `A1:B2`: \r\n  \r\n  \t\t`luckysheet.setRangeShow({row:[0,1],column:[0,1]})`\r\n     + Set selection range `A1:B2`:\r\n  \r\n  \t\t`luckysheet.setRangeShow([{row:[0,1],column:[0,1]}])`\r\n     + Set the selection range `A1:B2` and `C3:D4`:\r\n  \r\n\t\t`luckysheet.setRangeShow([\"A1:B2\",\"C3:D4\"])`\r\n     + Set the selection range `A1:B2` and `D3`:\r\n  \r\n  \t\t`luckysheet.setRangeShow([{row:[0,1],column:[0,1]},{row:[2,2],column:[3,3]}])`\r\n\r\n------------\r\n\r\n### setRangeValue(data [,setting])\r\n\r\n- **Parameter**：\r\n\r\n\t- {Array} [data]: The data of a two-dimensional array of cells to be assigned. The value of each cell can be a string or a number, or an object conforming to the Luckysheet format. Refer to [cell attribute table](/zh /guide/cell.html)\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, can only be a single selection; the default is the current selection\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n    \t+ {Boolean} [isRefresh]: Whether to refresh the interface; the default is `true`; used to control throttling when multiple cells are assigned, the previous cell should be set to `false`, and the last cell is set Is `true`.\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tAssign a cell array data to the specified area, the data format is the same as the data obtained by the `getRangeValue` method.\r\n\r\n\tNote that usually the `getRangeValue` method only obtains the selection data, but does not include the border and merged cell information. When the `setRangeValue` is executed, it will dynamically determine whether the previous step has executed the `getRangeValue`, if executed, the border will be Obtained from Luckysheet configuration together with the merged cell information.\r\n\r\n- **Usage**:\r\n\r\n     + Assign value to current selection\r\n      \r\n\t\t```js\r\n\t\tconst data = [\r\n\t\t\t\t[\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t\"m\": \"value1\",\r\n\t\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"v\": \"value1\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t\"m\": \"value3\",\r\n\t\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"v\": \"value3\"\r\n\t\t\t\t\t}\r\n\t\t\t\t],\r\n\t\t\t\t[\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t\"m\": \"value2\",\r\n\t\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"v\": \"value2\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t\"m\": \"value4\",\r\n\t\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"v\": \"value4\"\r\n\t\t\t\t\t}\r\n\t\t\t\t]\r\n\t\t\t]\r\n\t\tluckysheet.setRangeValue(data,{range:\"A1:B2\"})\r\n\t\t```\r\n\r\n------------\r\n\r\n### setRangeFormat(attr, value [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\r\n    - {String} [attr]: attribute type,\r\n   \tRefer to the attribute value of [cell attribute table](/zh/guide/cell.html)\r\n\t- {String | Number | Object} [value]: Specific setting value, one attribute will correspond to multiple values, refer to the value example of [cell attribute table](/zh/guide/cell.html), special case: if The attribute type `attr` is the cell format `ct`, then the setting value `value` should provide `ct.fa`, for example, set the cell format of `\"A1:B2\"` to percentage format:\r\n\tTo\r\n\t`luckysheet.setRangeFormat(\"ct\", \"0.00%\", {range:\"A1:B2\"})`\r\n\r\n    - {PlainObject} [setting]: optional parameters\r\n        + {Object | String} [range]: Set the target selection range of the parameter. The supported selection format is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1], column:[0,1]}`, allows an array of multiple selections; the default is the current selection\r\n        + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t  \r\n\tSet the cell format of the specified range, generally used as a processing format, the assignment operation recommends using the `setRangeValue` method\r\n    \r\n  \tWhen setting the border, attr is `\"bd\"`, value is a key/value object, and the border type: `borderType`/border thickness:`style`/border color:`color` need to be set at the same time, such as setting `\" A1:B2\"`The border of the cell is all/red/thin:\r\n\t\r\n\t`luckysheet.setRangeFormat(\"bd\", {borderType: \"border-right\",style: \"1\", color: \"#ff0000\"}, {range:[\"A1:B2\"]})`\r\n\t\r\n\tThe complete optional setting parameters are as follows:\r\n\r\n    + Border Type `borderType: \"border-left\" | \"border-right\" | \"border-top\" | \"border-bottom\" | \"border-all\" | \"border-outside\" | \"border-inside\" | \"border -horizontal\" | \"border-vertical\" | \"border-none\"`,\r\n    + Border thickness `style: 1 Thin | 2 Hair | 3 Dotted | 4 Dashed | 5 DashDot | 6 DashDotDot | 7 Double | 8 Medium | 9 MediumDashed | 10 MediumDashDot | 11 MediumDashDotDot | 12 SlantedDashDot | 13 Thick`\r\n    + Border color `color: hexadecimal color value`\r\n\r\n- **Usage**:\r\n\r\n   - Set the cell text in the current worksheet `\"A1:B2\"` range to be bold\r\n\t\t\r\n\t\t`luckysheet.setRangeFormat(\"bl\", 1, {range:\"A1:B2\"})`\r\n   - Set the background of the cells in the range of `\"B2\"` and `\"C4:D5\"` of the second worksheet to red\r\n\t\t\r\n\t\t`luckysheet.setRangeFormat(\"bg\", \"#ff0000\", {range:[\"B2\",\"C4:D5\"], order:1})`\r\n\r\n------------\r\n\r\n### setRangeFilter(type [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {String} [type]: Turn on or off the filtering function\r\n\t \r\n\t\tPossible values of `type` are:\r\n\t\t\r\n\t\t+ `\"open\"`: Open the filter function and return the current filtered range object\r\n\t\t+ `\"close\"`: Close the filter function and return to the scope of the filter before closing\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, can only be a single selection; the default is the current selection\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tFor the worksheet of the specified subscript, the filter function is turned on or off for the selected range\r\n\r\n- **Usage**:\r\n\r\n\t- Open the filter function of the second worksheet \"A1:B2\"\r\n\t`luckysheet.setRangeFilter(\"open\",{range:\"A1:B2\",order:1})`\r\n\r\n------------\r\n\r\n### setRangeMerge(type [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\t\r\n\t- {String} [type]: merge cell type\r\n \r\n\t\tPossible values of `type` are:\r\n\t\t\r\n\t\t+ `\"all\"`: Merge all, all cells in the area are merged into one large cell\r\n\t\t+ `\"horizontal\"`: merge horizontally, cells in the same row in the area are merged into one cell\r\n\t\t+ `\"vertical\"`: merge vertically, the cells in the same column in the area are merged into one cell\r\n \r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, allows an array of multiple selections; the default is the current selection\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSet the merged cells for the worksheet with the specified subscript and the selected range\r\n\r\n- **Usage**:\r\n\r\n\t- The current selection'A1:B2' is set to merge cells, the type is merge all\r\n\t\t\r\n\t\t`luckysheet.setRangeMerge(\"all\")`\r\n\t\tThe data of'A1:B1' is:\r\n\t\t```json\r\n\t\t[\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"m\": \"value1\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value1\",\r\n\t\t\t\t\t\"mc\": { \"r\": 0, \"c\": 0, \"rs\": 2, \"cs\": 2 }\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"mc\": { \"r\": 0, \"c\": 0 }\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"mc\": { \"r\": 0, \"c\": 0 }\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"mc\": { \"r\": 0, \"c\": 0 }\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n### cancelRangeMerge( [setting])\r\n \r\n\r\n- **Parameter**：\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, allows an array of multiple selections; the default is the current selection\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tUnmerge cells in the selected range for the worksheet with the specified subscript\r\n\r\n- **Usage**:\r\n\r\n\t- The current selection'A1:B2' is already a merged cell, now you want to cancel the merge\r\n\t\t\r\n\t\t`luckysheet.cancelRangeMerge()`\r\n\t\t\r\n------------\r\n\r\n### setRangeSort(type [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\r\n\t- {String} [type]: sort type\r\n\t\r\n\t\tPossible values of `type` are:\r\n\t\t\r\n\t\t+ `\"asc\"`: ascending order\r\n\t\t+ `\"des\"`: descending order\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\r\n        + {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, can only be a single selection; the default is the current selection\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tFor the worksheet of the specified subscript, the sort function is turned on for the selected range, and the sorted data of the selected range is returned.\r\n\r\n- **Usage**:\r\n\r\n   - Set the current selection of the current worksheet to ascending order\r\n   `luckysheet.setRangeSort(\"asc\")`\r\n\r\n------------\r\n\r\n### setRangeSortMulti(title, sort [,setting])\r\n \r\n\r\n- **Parameter**：\r\n\r\n\t- {Boolean} [title]: Does the data have a title row\r\n\t- {Array} [sort]: Column setting, set the column index and sort method to be sorted, the format is like: `[{ i:0,sort:'asc' },{ i:1,sort:'des' }] `\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t \r\n\t\t+ {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, can only be a single selection; the default is the current selection\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tFor the worksheet of the specified subscript, the selected range enables the multi-column custom sorting function to return the sorted data of the selected range.\r\n\r\n- **Usage**:\r\n\r\n   - Set the current selection of the current worksheet to a custom sort, the data has a header row, and it is sorted according to the rules of the first column ascending order and the second column descending order\r\n   `luckysheet.setRangeSortMulti(true,[{ i:0,sort:'asc' },{ i:1,sort:'des' }])`\r\n\r\n------------\r\n\r\n### setRangeConditionalFormatDefault(conditionName, conditionValue [,setting])\r\n\r\n- **Parameter**：\r\n\r\n\t- {String} [conditionName]: Conditional format rule type\r\n\t\r\n\t\tPossible values ​​of `conditionName` are:\r\n\t\t\r\n\t\t+ `\"greaterThan\"`: greater than (conditionValue value is numeric or cell range)\r\n\t\t+ `\"lessThan\"`: Less than (conditionValue value is numeric value or cell range)\r\n\t\t+ `\"betweenness\"`: between (conditionValue value is numeric value or cell range)\r\n\t\t+ `\"equal\"`: equal to (conditionValue value is numeric value or cell range)\r\n\t\t+ `\"textContains\"`: text contains (conditionValue value is text or cell range)\r\n\t\t+ `\"occurrenceDate\"`: date of occurrence (conditionValue value is date)\r\n\t\t+ `\"duplicateValue\"`: Duplicate value (conditionValue value is '0': duplicate value, '1': unique value)\r\n\t\t+ `\"top10\"`: the first N items (conditionValue value is 1~1000)\r\n\t\t+ `\"top10%\"`: Top N% (conditionValue value is 1~1000)\r\n\t\t+ `\"last10\"`: the last N items (conditionValue is 1~1000)\r\n\t\t+ `\"last10%\"`: Last N% (conditionValue value is 1~1000)\r\n\t\t+ `\"AboveAverage\"`: above average (conditionValue can be an empty array)\r\n\t\t+ `\"SubAverage\"`: below average (conditionValue can be an empty array)\r\n\t\r\n\t- {Array} [conditionValue]: You can set condition cells or condition values\r\n\t\tValue rules (at least one value in the condition value array and at most two values)\r\n\t\t```js\r\n\t\t[2]\r\n\t\t```\r\n\t\tOr (if the value is the cell range, take the cell value in the upper left corner)\r\n\t\t```js\r\n\t\t['A1']\r\n\t\t```\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\r\n\t\t+ {Object} [format]: color setting\r\n\t\t\r\n    \t\t* Set the text color and cell color; the default value is `{\r\n\t\t\t\t\"textColor\": \"#000000\",\r\n\t\t\t\t\"cellColor\": \"#ff0000\"\r\n\t\t\t}`\r\n\t\t+ {Array | Object | String} [cellrange]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, allows an array of multiple selections; the default is the current selection\r\n\t\t\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tFor the worksheet of the specified subscript, the conditional formatting is enabled for the selected range, and some cells are highlighted according to the set conditional formatting rules, and the data after the conditional formatting is enabled is returned.\r\n\r\n- **Usage**:\r\n\r\n    - Highlight cells with content greater than the number 2\r\n      `luckysheet.setRangeConditionalFormatDefault(\"greaterThan\",{ type: 'value', content: [2] })`\r\n    \r\n\t- Highlight the cells whose content is less than the content of cell A1\r\n\t  `luckysheet.setRangeConditionalFormatDefault(\"lessThan\",{ type: 'range', content: ['A1'] })`\r\n\r\n\t- Highlight cells with content between 2 and 10\r\n\t  `luckysheet.setRangeConditionalFormatDefault(\"betweenness\",{ type: 'value', content: [2,10] })`\r\n\t\r\n\t- Highlight the cell whose content is equal to the content of cell A1\r\n\t  `luckysheet.setRangeConditionalFormatDefault(\"equal\",{ type: 'range', content: ['A1'] })`\r\n\t\r\n\t- Highlight the cell that contains the content of cell A1\r\n\t  `luckysheet.setRangeConditionalFormatDefault(\"textContains\",{ type: 'range', content: ['A1'] })`\r\n\t\r\n\t- Highlight cells with dates between `2020/09/24-2020/10/15`\r\n      `luckysheet.setRangeConditionalFormatDefault(\"occurrenceDate\",{ type: 'value', content: ['2020/09/24 - 2020/10/15'] })`\r\n\r\n\t- Highlight cells with repeated values, content is 0\r\n      `luckysheet.setRangeConditionalFormatDefault(\"duplicateValue\",{ type: 'value', content: [0] })`\r\n\r\n\t- Highlight the cell with unique value, content is 1\r\n      `luckysheet.setRangeConditionalFormatDefault(\"duplicateValue\",{ type: 'value', content: [1] })`\r\n\t\r\n\t- Highlight the top 20 cells\r\n      `luckysheet.setRangeConditionalFormatDefault(\"top\",{ type: 'value', content: [20] })`\r\n\t\r\n\t- Highlight the top 30% of cells\r\n      `luckysheet.setRangeConditionalFormatDefault(\"topPercent\",{ type: 'value', content: [30] })`\r\n\t\r\n\t- Highlight the bottom 15 cells\r\n      `luckysheet.setRangeConditionalFormatDefault(\"last\",{ type: 'value', content: [15] })`\r\n\t\r\n\t- Highlight the bottom 15% of cells\r\n      `luckysheet.setRangeConditionalFormatDefault(\"lastPercent\",{ type: 'value', content: [15] })`\r\n\t\r\n\t- Highlight cells that are above average\r\n      `luckysheet.setRangeConditionalFormatDefault(\"AboveAverage\",{ type: 'value', content: ['AboveAverage'] })`\r\n\t\r\n\t- Highlight cells below average\r\n\t  `luckysheet.setRangeConditionalFormatDefault(\"SubAverage\",{ type: 'value', content: ['SubAverage'] })`\r\n\r\n------------\r\n\r\n### setRangeConditionalFormat(type [,setting])\r\n\r\n- **Parameter**：\r\n\r\n\t- {String} [type]: Conditional formatting rule type\r\n \r\n\t\tPossible values ​​of `type` are:\r\n\t\t\r\n\t\t+ `\"dataBar\"`: data bar\r\n\t\t+ `\"icons\"`: icon set\r\n\t\t+ `\"colorGradation\"`: Color Gradation\r\n\t\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\r\n\t\t+ {Array | String} [format]: Color setting\r\n\t\t\r\n        \t* When `type` is `dataBar`, the gradient color should be set; the default value is blue-white gradient` [\"#638ec6\", \"#ffffff\"]`\r\n\r\n\t\t\t\tRecommended shortcut value:\r\n\t\t\t\t```js\r\n\t\t\t\t[\"#638ec6\", \"#ffffff\"], //Blue-white gradient data bar\r\n\t\t\t\t[\"#63c384\", \"#ffffff\"], //Green-white gradient data bar\r\n\t\t\t\t[\"#ff555a\", \"#ffffff\"], //Red-white gradient data bar\r\n\t\t\t\t[\"#ffb628\", \"#ffffff\"], //Orange-white gradient data bar\r\n\t\t\t\t[\"#008aef\", \"#ffffff\"], //Light blue-white gradient data bar\r\n\t\t\t\t[\"#d6007b\", \"#ffffff\"], //Purple-white gradient data bar\r\n\t\t\t\t[\"#638ec6\"], //Blue data bar\r\n\t\t\t\t[\"#63c384\"], //green data bar\r\n\t\t\t\t[\"#ff555a\"], //Red data bar\r\n\t\t\t\t[\"#ffb628\"], //Orange data bar\r\n\t\t\t\t[\"#008aef\"], //Light blue data bar\r\n\t\t\t\t[\"#d6007b\"] //Purple data bar\r\n\t\t\t\t```\r\n        \t\r\n        \t* When `type` is `icons`, the icon type should be set; the default value is \"threeWayArrowMultiColor\": the three-way arrow color,\r\n\r\n\t\t\t\tPossible values ​​are:\r\n\t\t\t\t\r\n\t\t\t\t`threeWayArrowMultiColor`: three-way arrow (color),\r\n\t\t\t\t\r\n\t\t\t\t`threeTriangles`: 3 triangles,\r\n\r\n\t\t\t\t`fourWayArrowMultiColor`: four-way arrow (color),\r\n\r\n\t\t\t\t`fiveWayArrowMultiColor`: five-way arrow (color),\r\n\r\n\t\t\t\t`threeWayArrowGrayColor`: three-way arrow (gray),\r\n\r\n\t\t\t\t`fourWayArrowGrayColor`: four-way arrow (gray),\r\n\r\n\t\t\t\t`fiveWayArrowGrayColor`: five-way arrow (gray),\r\n\r\n\t\t\t\t`threeColorTrafficLightRimless`: three-color traffic light (no border),\r\n\r\n\t\t\t\t`threeSigns`: three signs,\r\n\r\n\t\t\t\t`greenRedBlackGradient`: green-red-black gradient,\r\n\r\n\t\t\t\t`threeColorTrafficLightBordered`: three-color traffic light (with border),\r\n\r\n\t\t\t\t`fourColorTrafficLight`: Four-color traffic light,\r\n\r\n\t\t\t\t`threeSymbolsCircled`: three symbols (with a circle),\r\n\r\n\t\t\t\t`tricolorFlag`: tricolor flag,\r\n\r\n\t\t\t\t`threeSymbolsnoCircle`: three symbols (no circle),\r\n\r\n\t\t\t\t`threeStars`: 3 stars,\r\n\r\n\t\t\t\t`fiveQuadrantDiagram`: five-quadrant diagram,\r\n\r\n\t\t\t\t`fiveBoxes`: 5 boxes,\r\n\r\n\t\t\t\t`grade4`: Four grades,\r\n\r\n\t\t\t\t`grade5`: Five grades,\r\n\r\n        \t* When `type` is `colorGradation`, the color value of the color scale should be set; the default value is green-yellow-red scale` [\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\", \"rgb(248, 105, 107)\"]`\r\n\r\n\t\t\t\tRecommended shortcut value:\r\n\t\t\t\t```js\r\n\t\t\t\t[\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\", \"rgb(248, 105, 107)\"], //green-yellow-red level\r\n\t\t\t\t[\"rgb(248, 105, 107)\", \"rgb(255, 235, 132)\", \"rgb(99, 190, 123)\"], //red-yellow-green level\r\n\r\n\t\t\t\t[\"rgb(99, 190, 123)\", \"rgb(252, 252, 255)\", \"rgb(248, 105, 107)\"], //green-white-red level\r\n\t\t\t\t[\"rgb(248, 105, 107)\", \"rgb(252, 252, 255)\", \"rgb(99, 190, 123)\"], //red-white-green level\r\n\t\t\t\t\r\n\t\t\t\t[\"rgb(90, 138, 198)\", \"rgb(252, 252, 255)\", \"rgb(248, 105, 107)\"], //blue-white-red level\r\n\t\t\t\t[\"rgb(248, 105, 107)\", \"rgb(252, 252, 255)\", \"rgb(90, 138, 198)\"], //red-white-blue level\r\n\t\t\t\t\r\n\t\t\t\t[\"rgb(252, 252, 255)\", \"rgb(248, 105, 107)\"], //white-red level\r\n\t\t\t\t[\"rgb(248, 105, 107)\", \"rgb(252, 252, 255)\"], //red-white level\r\n\r\n\t\t\t\t[\"rgb(99, 190, 123)\", \"rgb(252, 252, 255)\"], //green-white level\r\n\t\t\t\t[\"rgb(252, 252, 255)\", \"rgb(99, 190, 123)\"], //white-green level\r\n\r\n\t\t\t\t[\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\"], //green-yellow level\r\n\t\t\t\t[\"rgb(255, 235, 132)\", \"rgb(99, 190, 123)\"] //Yellow-green level\r\n\t\t\t\t```\r\n\t\r\n    \t+ {Array | Object | String} [cellrange]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, allows an array of multiple selections; the default is the current selection\r\n    \t\t\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tFor the worksheet of the specified subscript, the conditional format is turned on for the selected range, and the data after the conditional format is turned on is returned.\r\n\r\n- **Usage**:\r\n\r\n    - Conditional formatting is enabled for the current selection area, showing gradient\r\n      `luckysheet.setRangeConditionalFormat(\"dataBar\", { format: [\"#63c384\", \"#ffffff\"] })`\r\n\r\n------------\r\n\r\n### deleteRangeConditionalFormat(itemIndex [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n\t- {Number} [itemIndex]: Conditional format rule index\r\n \r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tFor the worksheet of the specified subscript, delete the conditional format rule, and return the deleted conditional format rule.\r\n\r\n- **Usage**:\r\n\r\n    - Delete the third conditional formatting rule\r\n      `luckysheet.deleteRangeConditionalFormat(2)`\r\n    \r\n------------\r\n\r\n### clearRange([setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n        + {Array | Object | String} [range]: The range of the selection to be cleared. The format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1] ,column:[0,1]}`, allows an array of multiple selections; the default is the current selection\r\n        + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n        + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tClear the contents of the specified cell area of the specified worksheet, return the cleared data, which is different from the function of deleting the selection area, no need to set the cell movement\r\n\r\n- **Usage**:\r\n\r\n    - Clear the content of the current selection\r\n      `luckysheet.clearRange()`\r\n    \r\n------------\r\n\r\n### deleteRange(move [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {String} [move]: After deleting, whether the cells on the right or below move\r\n\r\n\t\tPossible values of `move` are:\r\n\r\n\t\t+ `\"left\"`: Move the right cell to the left\r\n\t\t+ `\"up\"`: Move the lower cell up\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Array | Object | String} [range]: The range of the selection to be deleted, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1] ,column:[0,1]}`, allows an array composed of multiple selections; the default is the current selection\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tDelete the specified cell range of the specified worksheet, return the deleted data, and at the same time, specify whether to move the right cell to the left or the bottom cell to move up\r\n\r\n- **Usage**:\r\n\r\n    - Delete the current selection and after deleting, the right cell moves to the left\r\n      `luckysheet.deleteRange('left')`\r\n    \r\n------------\r\n\r\n### insertRange(move [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {String} [move]: Move the active cell right or down\r\n \r\n\t\tPossible values of `move` are:\r\n\t\t\r\n\t\t+ `\"right\"`: Move the active cell to the right\r\n\t\t+ `\"bottom\"`: move the active cell down\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Array} [data]: The data of a two-dimensional array of cells assigned to the range area, [Cell Object Format Reference](/zh/guide/cell.html); the default value is an empty array, that is, a blank area is inserted\r\n    \t+ {Array | Object | String} [range]: The position to be inserted, the range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0, 1],column:[0,1]}`, the default is the current selection\r\n    \t\t\r\n    \tWhen data data is not set, an array composed of multiple selections is allowed, and the blank area inserted is the area of these selections.\r\n    \t\r\n    \tWhen the data data is set, it can only be a single selection, and the data data will be inserted into the first cell position of the current selection\r\n    \t\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tIn the specified cell area of the specified worksheet, assign cell data, or create a new blank area, return data data, and at the same time, specify the active cell to move right or down\r\n\r\n- **Usage**:\r\n\r\n    - Insert a blank cell at the current selection position, and move the current selection cell to the right after inserting\r\n      `luckysheet.insertRange('right')`\r\n    \r\n------------\r\n\r\n### matrixOperation(type [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {String} [type]: the type of matrix operation\r\n \r\n\t\tPossible values of `type` are:\r\n\t\t\r\n\t\t+ `\"flipUpDown\"`: flip up and down\r\n\t\t+ `\"flipLeftRight\"`: flip left and right\r\n\t\t+ `\"flipClockwise\"`: rotate clockwise\r\n\t\t+ `\"flipCounterClockwise\"`: rotate counterclockwise\r\n\t\t+ `\"transpose\"`: Transpose\r\n\t\t+ `\"deleteZeroByRow\"`: delete 0 values at both ends by row\r\n\t\t+ `\"deleteZeroByColumn\"`: delete zero values at both ends by column\r\n\t\t+ `\"removeDuplicateByRow\"`: delete duplicate values by row\r\n\t\t+ `\"removeDuplicateByColumn\"`: remove duplicate values by column\r\n\t\t+ `\"newMatrix\"`: Produce a new matrix\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, can only be a single selection; the default is the current selection\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSpecify the data in the specified cell area of the worksheet to perform matrix operations, and return the result data after the operation is successful\r\n\r\n- **Usage**:\r\n\r\n    - Flip current selection upside down\r\n    \t\t\r\n\t\t`luckysheet.matrixOperation('flipUpDown')`\r\n\r\n\t\tCopy the original selection as a two-dimensional array:\r\n\t\t\r\n\t\t`[[\"value1\",\"value3\"],[\"value2\",\"value4\"]]`\r\n\t\t\r\n\t\tAfter flipping up and down, the selection is copied as a two-dimensional array:\r\n\t\t\r\n\t\t`[[\"value2\",\"value4\"],[\"value1\",\"value3\"]]`\r\n    \r\n------------\r\n\r\n### matrixCalculation(type, number [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\t- {String} [type]: calculation method\r\n\t\r\n\t\tPossible values of `type` are:\r\n\t\t\r\n\t\t+ `\"plus\"`: add\r\n\t\t+ `\"minus\"`: subtract\r\n\t\t+ `\"multiply\"`: multiply\r\n\t\t+ `\"divided\"`: Divide\r\n\t\t+ `\"power\"`: power\r\n\t\t+ `\"root\"`: power root\r\n\t\t+ `\"log\"`: log\r\n\t- {Number} [number]: Calculate the number, such as: 2\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, can only be a single selection; the default is the current selection\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSpecify the data in the specified cell area of the worksheet for matrix calculation, and return the result data after the calculation is successful\r\n\r\n- **Usage**:\r\n\r\n    - Add 2 to the value of all cells in the current selection\r\n    \t\t\r\n\t\t`luckysheet.matrixCalculation('plus', 2)`\r\n\r\n\t\tCopy the original selection as a two-dimensional array:\r\n\t\t\r\n\t\t`[[1,2],[3,4]]`\r\n\t\t\r\n\t\tAfter adding 2, the selection is copied as a two-dimensional array:\r\n\t\t\r\n\t\t`[[3,4],[5,6]]`\r\n    \r\n------------\r\n\r\n## Worksheet operations\r\n\r\n### getAllSheets()\r\n\r\n\r\n- **Explanation**：\r\n\r\n\tReturn all worksheet configurations, the format is the same as the worksheet configuration, and the results obtained can be used as options.data when the form is initialized.\r\n\r\n\tTherefore, this API is suitable for manually operating and configuring a table, and then taking out all the worksheet information to save it, and then use it for table creation in other places. If you want to get all the workbook data including the workbook configuration, it is recommended to use [toJson](#toJson()), and it can be directly used to initialize Luckysheet.\r\n\r\n- **Usage**:\r\n\r\n\t- Get all the basic information of the first worksheet\r\n\t`luckysheet.getAllSheets()[0]`\r\n\t\r\n------------\r\n\r\n### getLuckysheetfile()\r\n\r\n- **Explanation**：\r\n\r\n\tReturns a one-dimensional array `luckysheetfile` of all table data structures. Unlike the `getAllSheets` method, the worksheet parameters obtained by this method will contain many internal variables. The most obvious difference is that the table data operation will maintain `luckysheetfile[i]. data`, and the initialization data uses `options.data[i].celldata`, so `luckysheetfile` can be used for debugging, but the initialization table is not applicable.\r\n\r\n\tIn addition, a `load = 1` will be added to the loaded worksheet parameters, this parameter needs to be set to 0 when initializing the data. Therefore, to initialize the workbook with the data obtained by `getLuckysheetfile()`, two tasks need to be done:\r\n\r\n    - Convert celldata to data, refer to: [transToData](/zh/guide/api.html#transtodata-celldata-setting)\r\n    - Load reset to 0 or delete this field\r\n\r\n\tNow there is `getAllSheets` to complete this work, no need to manually convert the data.\r\n\r\n- **Usage**:\r\n\r\n\t- Get all the debugging information of the first worksheet\r\n\t`luckysheet.getLuckysheetfile()[0]`\r\n\t\r\n------------\r\n\r\n### getSheet([setting])\r\n\r\n[todo]\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [index]: worksheet index; the default value is the current worksheet index\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Number} [name]: Worksheet name; the default value is the current worksheet name\r\n\r\n- **Explanation**：\r\n\r\n\tAccording to index/order/name, quickly return the configuration of the specified worksheet, same as `luckysheetfile[i]`. If multiple parameters are set, the priority is: index> order> name.\r\n\t\r\n------------\r\n\r\n### getSheetData([setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\r\n- **Explanation**：\r\n\r\n\tQuickly return the data of the specified worksheet, same as `luckysheetfile[i].data`\r\n\t\r\n------------\r\n\r\n### getConfig([setting])\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\r\n- **Explanation**：\r\n\r\n\tQuickly return to the config configuration of the specified worksheet, same as `luckysheetfile[i].config`\r\n\r\n------------\r\n\r\n### setConfig([setting])\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\t\r\n- **Explanation**：\r\n\r\n\tQuickly set the current worksheet config configuration\r\n\r\n------------\r\n### updataSheet([setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: optional parameters\r\n    \t+ {Array} [data]: Worksheet Configuration\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\t\r\n- **说明**：\r\n\r\n\tUpdate the corresponding sheet according to the set sheet configuration\r\n\r\n------------\r\n\r\n### setSheetAdd([setting])\r\n\r\n- **Parameter**：\r\n\r\n    - {PlainObject} [setting]: optional parameters\r\n        + {Object} [sheetObject]: The data of the newly added worksheet; the default value is an empty object.Worksheet data format reference [options.data](/guide/sheet.html#initial)\r\n        + {Number} [order]: New worksheet subscript; the default value is the last subscript\r\n        + {Function} [success]: callback function for the end of the operation\r\n\t\r\n- **Explanation**：\r\n\r\n\tAdd a sheet and return the newly added worksheet object. The optional setting data in `setting` is `sheetObject`, and a blank worksheet will be added if `sheetObject` is not passed.\r\n\r\n- **Usage**:\r\n\r\n\t- Add a blank worksheet at the subscript position of the last worksheet\r\n\t`luckysheet.setSheetAdd()`\r\n\t\r\n------------\r\n\r\n### setSheetDelete([setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\t\r\n- **Explanation**：\r\n\r\n\tDelete the worksheet of the specified subscript and return the deleted worksheet object\r\n\r\n- **Usage**:\r\n\r\n\t- Delete current worksheet\r\n\t`luckysheet.setSheetDelete()`\r\n\t\t\t\r\n------------\r\n\r\n### setSheetCopy([setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t+ {Number} [targetOrder]: The target index position of the newly copied worksheet; the default value is the next index position of the current worksheet index (incremental)\r\n\t\t+ {Number} [order]: The subscript of the copied worksheet; the default value is the subscript of the current worksheet\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\t\r\n- **Explanation**：\r\n\r\n\tCopy the worksheet with the specified subscript to the specified subscript position, optionally set the specified subscript position `targetOrder` in `setting`, and return the newly copied worksheet object\r\n\r\n- **Usage**:\r\n\r\n\t- Copy the current worksheet to the next subscript position\r\n\t`luckysheet.setSheetCopy()`\r\n\r\n------------\r\n\r\n### setSheetHide([setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: The hidden worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tHide the worksheet of the specified subscript and return the hidden worksheet object\r\n\r\n- **Usage**:\r\n\r\n\t- Hide current worksheet\r\n\t`luckysheet.setSheetHide(true)`\r\n\t- Hide the third worksheet\r\n\t`luckysheet.setSheetHide({order:2})`\r\n\r\n------------\r\n\r\n### setSheetShow([setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: The subscript of the unhidden worksheet; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tUnhide the worksheet of the specified subscript, and return the unhidden worksheet object\r\n\r\n- **Usage**:\r\n\r\n\t- Unhide the third worksheet\r\n\t`luckysheet.setSheetShow({order:2})`\r\n\r\n------------\r\n\r\n### setSheetActive(order [,setting])\r\n\r\n[todo]\r\n\r\n- **Parameter**：\r\n\r\n\t- {Number} [order]: The subscript of the worksheet to be activated\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSet the worksheet of the specified subscript as the current worksheet (active state), that is, switch to the specified worksheet and return the activated worksheet object\r\n\r\n- **Usage**:\r\n\r\n\t- Switch to the second worksheet\r\n\t`luckysheet.setSheetActive(1)`\r\n\r\n------------\r\n\r\n### setSheetName(name [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n\t- {String} [name]: new worksheet name\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\t\r\n- **Explanation**：\r\n\t\r\n\tModify worksheet name\r\n\r\n- **Usage**:\r\n\r\n\t- Modify the name of the current worksheet to \"CellSheet\"\r\n\t`luckysheet.setSheetName(\"CellSheet\")`\r\n\r\n------------\r\n\r\n### setSheetColor(color [,setting])\r\n\r\n[todo]\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {String} [color]: Worksheet color\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSet the color at the worksheet name\r\n\r\n- **Usage**:\r\n\r\n\t- Modify the color of the current worksheet name to red\r\n\t`luckysheet.setSheetColor(\"#ff0000\")`\r\n\r\n------------\r\n\r\n### setSheetMove(type [,setting])\r\n\r\n- **Parameter**：\r\n\r\n\t- {String | Number} [type]: The moving direction of the worksheet or the subscript of the moving target,\r\n\t \r\n\t\tPossible values of `type` are:\r\n\t\t\r\n\t\t+ `\"left\"`: to the left\r\n\t\t+ `\"right\"`: to the right\r\n\t\t+ `1`/`2`/`3`/...: Specify subscript\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSpecify the worksheet to move one position to the left or right, or specify subscript, and return the specified worksheet object\r\n\r\n- **Usage**:\r\n\r\n\t- Move the current worksheet one position to the left\r\n\t`luckysheet.setSheetMove(\"left\")`\r\n\t- Move the second worksheet to the subscript position of the fourth worksheet\r\n\t`luckysheet.setSheetMove(3,{order:1})`\r\n\r\n------------\r\n\r\n### setSheetOrder(orderList [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n\t- {Array} [orderList]: Worksheet order, set the index and order of the worksheet to specify the position, such as:\r\n\t \r\n\t```json\r\n\t[\r\n\t\t{index:'sheet_01',order: 2},\r\n\t\t{index:'sheet_02',order: 1},\r\n\t\t{index:'sheet_03',order: 0},\r\n\t]\r\n\t```\r\n\tThe order in the array is not important, the key is to specify the correspondence between sheet index and order.\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tReorder the positions of all worksheets and specify an array of worksheet order.\r\n\r\n\r\n- **Usage**:\r\n\r\n\t- Rearrange the worksheets, this workbook contains 3 worksheets\r\n\t```js\r\n\tluckysheet.setSheetOrder([\r\n\t\t{index:'sheet_01',order: 2},\r\n\t\t{index:'sheet_02',order: 1},\r\n\t\t{index:'sheet_03',order: 0},\r\n\t])\r\n\t```\r\n\r\n------------\r\n\r\n### setSheetZoom(zoom [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n    - {Number} [zoom]: Worksheet zoom ratio\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSet worksheet zoom ratio\r\n\r\n\r\n- **Usage**:\r\n\r\n\t- Set the current worksheet zoom ratio to 0.5\r\n\t```js\r\n\tluckysheet.setSheetZoom(0.5)\r\n\t```\r\n\r\n------------\r\n\r\n### showGridLines([setting])\r\n\r\n- **Parameter**：\r\n\r\n    - {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [order]: The subscript of the worksheet that needs to show the grid lines; the default value is the subscript of the current worksheet\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tShow the grid lines of the specified subscript worksheet, and return the worksheet object of the operation\r\n\r\n- **Usage**:\r\n\r\n\t- Show the grid lines of the current worksheet\r\n\t`luckysheet.showGridLines()`\r\n\t- Show the grid lines of the third worksheet\r\n\t`luckysheet.showGridLines({order:2})`\r\n\r\n------------\r\n\r\n### hideGridLines([setting])\r\n\r\n- **Parameter**：\r\n\r\n    - {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [order]: The subscript of the worksheet that needs to hdie the grid lines; the default value is the subscript of the current worksheet\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tHide the grid lines of the specified subscript worksheet, and return the worksheet object of the operation\r\n\r\n- **Usage**:\r\n\r\n\t- Hide grid lines of current worksheet\r\n\t`luckysheet.hideGridLines()`\r\n\t- Hide the grid lines of the third worksheet\r\n\t`luckysheet.hideGridLines({order:2})`\r\n\r\n------------\r\n\r\n## Workbook operations\r\n\r\n### create(options [,setting])\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Object} [options]: All configuration information of the table\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Function} [success]: callback function after the table is created successfully\r\n\r\n- **Explanation**：\r\n\t\r\n\tInitialize a Luckysheet, which can contain multiple worksheets, refer to [Configuration List](/zh/guide/config.html)\r\n\r\n------------\r\n\r\n### refresh([setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Function} [success]: The callback function after the table is refreshed successfully\r\n\r\n- **Explanation**：\r\n\t\r\n\tRefresh canvas\r\n\r\n------------\r\n\r\n### scroll([setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Number} [scrollWidth]: horizontal scroll value. The default is the current horizontal scroll position.\r\n\t\t+ {Number} [scrollHeight]: Vertical scroll value. The default is the current vertical scroll position.\r\n\t\t+ {Number} [targetRow]: Scroll vertically to the specified row number. The default is the current vertical scroll position.\r\n\t\t+ {Number} [targetColumn]: scroll horizontally to the specified column number. The default is the current horizontal scroll position.\r\n\t\t+ {Function} [success]: The callback function after the table is refreshed successfully\r\n\r\n- **说明**：\r\n\t\r\n\tScroll current worksheet position\r\n\r\n------------\r\n\r\n### resize([setting])\r\n\r\n- **Parameter**：\r\n\t\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tAutomatically resize the canvas according to the window size\r\n\r\n------------\r\n\r\n### destroy([setting])\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Function} [success]: callback function after the table is released successfully\r\n\r\n- **Explanation**：\r\n\t\r\n\tDelete and release table\r\n\r\n------------\r\n\r\n### getScreenshot([setting])\r\n\r\n[todo]\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Array | Object | String} [range]: The range of the selection, the format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1],column: [0,1]}`, can only be a single selection; the default is the current selection\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n\r\n- **Explanation**：\r\n\t\r\n\tReturns the base64 format image generated after the screenshot of the specified selection\r\n\r\n------------\r\n\r\n### setWorkbookName(name [,setting])\r\n\r\n- **Parameter**：\r\n\r\n\t- {Number} [name]: Workbook name\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSet workbook name\r\n\r\n------------\r\n\r\n### getWorkbookName(name [,setting])\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n\t\t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tget workbook name\r\n\r\n------------\r\n\r\n### undo([setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n         + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tUndo the current operation and return the operation object that was just undone\r\n\r\n------------\r\n\r\n### redo([setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n         + {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tRedo the current operation and return the operation object that was just redone\r\n\r\n------------\r\n\r\n### refreshFormula([setting])\r\n\r\n- **Parameter**：\r\n\r\n\t-  {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tForce refresh formula. When you directly modify the values of multiple cells without triggering a refresh, and these cells are associated with formulas, you can use this API to force a formula refresh to be triggered at the end.\r\n\r\n------------\r\n\r\n### refreshMenuButtonFocus([data],[r],[c],[success])\r\n\r\n- **Parameter**：\r\n\r\n\t- {Array}  [data]: Operational data\r\n\t- {Number} [r]: Specified row\r\n\t- {Number} [c]: Specified column\r\n\t- {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tRefreshes the top status bar status of the specified cell.\r\n\r\n------------\r\n\r\n### checkTheStatusOfTheSelectedCells(type,status)\r\n\r\n- **Parameter**：\r\n\r\n\t- {String} type: type\r\n\t- {String} status: Target state value\r\n\r\n- **Explanation**：\r\n\t\r\n\tCheck whether the status of all specified types of cells in the selection meets the conditions (mainly bold, italics, strikeouts, underscores, etc.).\r\n\r\n------------\r\n\r\n## Chart\r\n\r\n### insertChart([setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Array | Object | String} [range]: The selection range of the chart data. The format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1] ,column:[0,1]}`, can only be a single selection; the default is the current selection\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tGenerate a chart in the specified selection area of the specified worksheet, and return the chart parameter object, including the chart id\r\n\r\n------------\r\n\r\n### setChart(chartId, attr, value [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {String} [chartId]: Specify the id of the chart to be modified\r\n\t- {String} [attr]: attribute type\r\n\t\r\n\t\tPossible values of `attr` are:\r\n\t\t\r\n\t\t+ `\"left\"`: the distance from the left to the edge of the worksheet\r\n\t\t+ `\"top\"`: the distance from the top edge to the edge of the worksheet\r\n\t\t+ `\"width\"`: the width of the chart frame\r\n\t\t+ `\"height\"`: the height of the chart outline\r\n\t\t+ `\"chartOptions\"`: detailed settings for the chart\r\n\t\t\r\n\t- {Number | Object}} [value]: attribute value, when `attr` is `chartOptions`, directly set the configuration object of the entire chart\r\n\t \r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tModify the parameters of the specified id chart and return the modified parameters of the entire chart\r\n\r\n------------\r\n\r\n### getChart(chartId)\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {String} [chartId]: Specify the chart id to be obtained\r\n\r\n- **Explanation**：\r\n\t\r\n\tGet the parameters of the specified id chart\r\n\r\n------------\r\n\r\n### deleteChart(chartId [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {String} [chartId]: the id of the chart to be deleted\r\n\tTo\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tDelete the chart with the specified id and return the parameters of the deleted chart\r\n\r\n------------\r\n\r\n## Data Verification\r\n\r\n### setDataVerification(option, [setting])\r\n\r\n[todo]\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Object} [option]: Configuration information for data verification\r\n    - {PlainObject} [setting]: optional parameters\r\n        + {Array | Object | String} [range]: The selection area for data verification, The format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1] ,column:[0,1]}`, can only be a single selection; the default is the current selection\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSpecify the worksheet range to set the data verification function and set the parameters\r\n\r\n------------\r\n\r\n### deleteDataVerification([setting])\r\n\r\n[todo, to be confirmed whether it is reasonable]\r\n\r\n- **Parameter**：\r\n\t\r\n    - {PlainObject} [setting]: optional parameters\r\n\t\t+ {Array | Object | String} [range]: The selection area for data verification, The format of the supported selection is `\"A1:B2\"`, `\"sheetName!A1:B2\"` or `{row:[0,1] ,column:[0,1]}`, can only be a single selection; the default is the current selection\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSpecify the worksheet range to delete the data verification function\r\n\r\n------------\r\n\r\n## Worksheet Protection\r\n\r\n\r\n### setProtection(option, [setting])\r\n\r\n[todo]\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Object} [option]: Configuration information for worksheet protection\r\n    - {PlainObject} [setting]: optional parameters\r\n    \t+ {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tSpecify the worksheet to set the worksheet protection\r\n\r\n------------\r\n\r\n## Public method\r\n\r\n### transToCellData(data [,setting])<div id='transToCellData'></div>\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Array} [data]: data\r\n\tTo\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tdata => celldata, data two-dimensional array data is converted into a one-dimensional array in {r, c, v} format\r\n\r\n------------\r\n\r\n### transToData(celldata [,setting])<div id='transToData'></div>\r\n\r\n[todo]\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Array} [celldata]: data\r\n\tTo\r\n\t- {PlainObject} [setting]: optional parameters\r\n    \t+ {Function} [success]: callback function for the end of the operation\r\n\r\n- **Explanation**：\r\n\t\r\n\tcelldata => data, the celldata one-dimensional array data is converted into the two-dimensional array required by the table\r\n\r\n------------\r\n\r\n### toJson()\r\n\r\n- **Explanation**：\r\n\t\r\n\tThe exported json string can be directly used as the parameter `options` when the workbook is initialized by `luckysheet.create(options)`. The usage scenario is to manually save all the parameters after the user manipulates the table, and then initialize the table elsewhere. Use, similar to the import and export of a luckysheet proprietary format.\r\n\r\n------------\r\n\r\n## Legacy API\r\n\r\n::: warning\r\nTo maintain compatibility, the old version of the API is still supported, but its use is deprecated.\r\n:::\r\n\r\n### getcellvalue([r] [,c] [,data] [,type])\r\n\r\n- **Parameter**：\r\n\r\n\t- {Number} [r]: The row number of the cell; optional value; an integer starting from 0, 0 means the first row\r\n\t- {Number} [c]: The number of the column where the cell is located; optional value; an integer starting from 0, 0 means the first column\r\n\t- {Array} [data]: table data, two-dimensional array; optional value; default value is the current table data\r\n\t- {String} [type]: cell attribute value; optional value; the default value is'v', which means to get the actual value of the cell\r\n\r\n- **Explanation**：\r\n\r\n\tThis method is to get the value of the cell.\r\n\r\n\t- luckysheet.getcellvalue(): returns all data of the current worksheet;\r\n\t- luckysheet.getcellvalue(0): returns the data of the first row of the current worksheet;\r\n\t- luckysheet.getcellvalue(null,0): returns the data in the first column of the current worksheet;\r\n\t- luckysheet.getcellvalue(0,0): returns the v value of the cell data in the first row and the first column of the current worksheet;\r\n\t- luckysheet.getcellvalue(1,1,null,'m'): Returns the original value of the cell in the second row and second column of the specified data.\r\n\t \r\n\tSpecial case: the cell format is yyyy-MM-dd, when the type is'v', the display value of'm' will be mandatory\r\n\r\n\t> Recommend to use the new API: <a href='#getCellValue'>getCellValue</a>\r\n\r\n------------\r\n\r\n### getluckysheetfile()\r\n\r\n- **Explanation**：\r\n\r\n\tReturns a one-dimensional array `luckysheetfile` of all table data structures\r\n\r\n\t> Recommend to use new API: [getLuckysheetfile](#getLuckysheetfile())\r\n\r\n------------\r\n\r\n### getconfig()\r\n\r\n- **Explanation**：\r\n\r\n\tQuickly return to the current sheet config configuration, the config information of each worksheet is still contained in the luckysheetfile.\r\n\t \r\n\t> Recommend to use new API: [getConfig](#getConfig([setting]))\r\n\r\n------------\r\n\r\n### getluckysheet_select_save()\r\n\r\n- **Explanation**：\r\n\r\n\tReturns an array of current selection objects, there may be multiple selections.\r\n\r\n\t> Recommend to use new API: [getRange](#getRange())\r\n\r\n------------\r\n\r\n### getdatabyselection([range] [,sheetOrder])\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Object} [range]: Selection object, `object: {row: [r1, r2], column: [c1, c2] }`; the default is the current first selection.\r\n\t- {Number} [sheetOrder]: Table subscript, an integer starting from 0, 0 means the first table; the default is the current table subscript.\r\n\r\n- **Explanation**：\r\n\r\n\tReturns the data of the first selection in a table.\r\n\t- `luckysheet.getdatabyselection()`: Returns the data of the current selection of the current worksheet\r\n\t- `luckysheet.getdatabyselection(null,1)`: Returns the data of the current selection of the second worksheet\r\n\r\n\t> Recommend to use the new API: [getRangeValue](#getRangeValue([setting]))\r\n\r\n------------\r\n\r\n### luckysheetrefreshgrid(scrollWidth, scrollHeight)\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Number} [scrollWidth]: horizontal scroll value. The default is the current horizontal scroll position.\r\n\t- {Number} [scrollHeight]: Vertical scroll value. The default is the current vertical scroll position.\r\n\r\n- **Explanation**：\r\n\r\n\tRefresh the canvas display data according to scrollWidth and scrollHeight.\r\n\r\n------------\r\n\r\n### setcellvalue(r, c, d, v)\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Number} [r]: The row number of the cell; an integer starting from 0, 0 means the first row.\r\n\t- {Number} [c]: The number of the column where the cell is located; an integer starting from 0, 0 means the first column.\r\n\t- {Array} [d]: table data; optional value; two-dimensional array.\r\n\t- {Object | String | Number} [v]: The value to be set; it can be an object, and the object must conform to the cell object format.\r\n\r\n- **Explanation**：\r\n\r\n\tSet the value of a cell. Can be used with `luckysheet.jfrefreshgrid()` to refresh and view cell value changes.\r\n\r\n\t```js\r\n\tluckysheet.setcellvalue(0, 0, luckysheet.flowdata(), 'abc');\r\n\tluckysheet.jfrefreshgrid();\r\n\t```\r\n\r\n------------\r\n\r\n### jfrefreshgrid()\r\n\r\n- **Explanation**：\r\n\r\n\tRefresh canvas\r\n\r\n\t> Recommended new API: [refresh](#refresh([setting]))\r\n\t\t\r\n------------\r\n\r\n### setluckysheet_select_save(v)\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Array} [v]：The selection value (array) to be set. Comply with the selection format rules, such as `[{ row: [r1, r2], column: [c1, c2] }]`.\r\n\r\n- **Explanation**：\r\n\t\r\n\tSet the value of the current table selection area. With `luckysheet.selectHightlightShow()`, you can view the selection changes in the interface.\r\n\t```js\r\n\tluckysheet.setluckysheet_select_save([{ row: [0, 1], column: [0, 1] }]);\r\n\tluckysheet.selectHightlightShow();\r\n\t```\r\n\r\n\t> Recommend to use new API:<a href='#setRangeShow'>setRangeShow</a>\r\n\t\r\n------------\r\n\r\n### selectHightlightShow()\r\n\r\n- **Explanation**：\r\n\r\n\tHighlight the current selection\r\n\r\n\t> Recommend to use new API:<a href='#setRangeShow'>setRangeShow</a>\r\n\r\n------------\r\n\r\n### flowdata()\r\n\r\n- **Explanation**：\r\n\t\r\n\tQuickly get the data of the current table\r\n\r\n\t> Recommend to use new API:[getSheetData](#getSheetData())\r\n\r\n------------\r\n\r\n### buildGridData(file)\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Object} [file]：[luckysheetfile](/zh/guide/sheet.html)\r\n\r\n- **Explanation**：\r\n\t\r\n\tGenerate a two-dimensional array that the table can recognize\r\n\r\n\t> Recommend to use new API:<a href='#transToData'>transToData</a>\r\n\r\n------------\r\n\r\n### getGridData(data)\r\n\r\n- **Parameter**：\r\n\t\r\n\t- {Array} [data]: Two-dimensional array data of the worksheet\r\n\r\n- **Explanation**：\r\n\t\r\n\tConvert two-dimensional array data into `{r, c, v}` format one-dimensional array\r\n\r\n\t> Recommend to use new API:<a href='#transToCellData'>transToCellData</a>"
  },
  {
    "path": "docs/guide/cell.md",
    "content": "# Format attributes\r\n\r\n## Cell attributes table\r\n\r\n<table>\r\n    <tr>\r\n        <td>Attribute value</td>\r\n        <td>Full name</td>\r\n        <td><div style=\"width:100px\">Explanation</div></td>\r\n        <td>Example value</td>\r\n        <td>Aspose method or attribute</td>\r\n    </tr>\r\n    <tr>\r\n        <td>ct</td>\r\n        <td>celltype</td>\r\n        <td>Cell value format: text, time, etc.</td>\r\n        <td><a href=\"#cellStyle\">Cell format</a></td>\r\n        <td></td>\r\n    </tr>\r\n    <tr>\r\n        <td>bg</td>\r\n        <td>background</td>\r\n        <td>background color</td>\r\n        <td>#fff000</td>\r\n        <td>setBackgroundColor</td>\r\n    </tr>\r\n    <tr>\r\n        <td>ff</td>\r\n        <td>fontfamily</td>\r\n        <td>Font</td>\r\n        <td>0 Times New Roman, 1 Arial, 2 Tahoma, 3 Verdana, 4 Microsoft Yahei, 5 Song, 6 ST Heiti, 7 ST Kaiti, 8 ST FangSong, 9 ST Song, 10 Chinese New Wei, 11 Chinese Xingkai, 12 Chinese Lishu</td>\r\n        <td>Style.Font object's Name property.</td>\r\n    </tr>\r\n    <tr>\r\n        <td>fc</td>\r\n        <td>fontcolor</td>\r\n        <td>font color</td>\r\n        <td>#fff000</td>\r\n        <td>Style.Font object's Color property</td>\r\n    </tr>\r\n    <tr>\r\n        <td>bl</td>\r\n        <td>bold</td>\r\n        <td>Bold</td>\r\n        <td>0 Regular, 1 Bold</td>\r\n        <td>Style.Font object's IsBold property to true.</td>\r\n    </tr>\r\n    <tr>\r\n        <td>it</td>\r\n        <td>italic</td>\r\n        <td>Italic</td>\r\n        <td>0 Regular, 1 Italic</td>\r\n        <td></td>\r\n    </tr>\r\n    <tr>\r\n        <td>fs</td>\r\n        <td>fontsize</td>\r\n        <td>font size</td>\r\n        <td>14</td>\r\n        <td>Style.Font object's Size property.</td>\r\n    </tr>\r\n    <tr>\r\n        <td>cl</td>\r\n        <td>cancelline</td>\r\n        <td>Cancelline</td>\r\n        <td>0 Regular, 1 Cancelline</td>\r\n        <td>Style.Font object's Underline property</td>\r\n    </tr>\r\n    <tr>\r\n        <td>vt</td>\r\n        <td>verticaltype</td>\r\n        <td>Vertical alignment</td>\r\n        <td>0 middle, 1 up, 2 down</td>\r\n        <td>setVerticalAlignment</td>\r\n    </tr>\r\n    <tr>\r\n        <td>ht</td>\r\n        <td>horizontaltype</td>\r\n        <td>Horizontal alignment</td>\r\n        <td>0 center, 1 left, 2 right</td>\r\n        <td>setHorizontalAlignment</td>\r\n    </tr>\r\n    <tr>\r\n        <td>mc</td>\r\n        <td>mergecell</td>\r\n        <td>Merge Cells</td>\r\n        <td>{rs: 10, cs:5} indicates that the cells from this cell to 10 rows and 5 columns are merged.</td>\r\n        <td>Merge</td>\r\n    </tr>\r\n    <tr>\r\n        <td>tr</td>\r\n        <td>textrotate</td>\r\n        <td>Text rotation</td>\r\n        <td>0:  0、1:  45 、2: -45、3 Vertical text、4:  90 、5: -90</td>\r\n        <td>setRotationAngle</td>\r\n    </tr>\r\n    <tr>\r\n        <td>tb</td>\r\n        <td>textbeak</td>\r\n        <td>Text wrap</td>\r\n        <td>0 truncation, 1 overflow, 2 word wrap</td>\r\n        <td>2: setTextWrapped <br> 0和1: IsTextWrapped =&nbsp;true</td>\r\n    </tr>\r\n    <tr>\r\n        <td>v</td>\r\n        <td>value</td>\r\n        <td>Original value</td>\r\n        <td></td>\r\n        <td></td>\r\n    </tr>\r\n    <tr>\r\n        <td>m</td>\r\n        <td>monitor</td>\r\n        <td>Display value</td>\r\n        <td></td>\r\n        <td></td>\r\n    </tr>\r\n    <tr>\r\n        <td>f</td>\r\n        <td>function</td>\r\n        <td>formula</td>\r\n        <td></td>\r\n        <td>setFormula <br> setArrayFormula <br> workbook.calculateFormula();</td>\r\n    </tr>\r\n</table>\r\n\r\n\r\nThe following is the storage of 3 cells:\r\n```json\r\n[\r\n    {\r\n        \"r\": 10,\r\n        \"c\": 11,\r\n        \"v\": {\r\n            \"f\": \"=MAX(A7:A9)\",\r\n            \"ct\": {\r\n                \"fa\": \"General\",\r\n                \"t\": \"n\"\r\n            },\r\n            \"v\": 100,\r\n            \"m\": \"100\"\r\n        }\r\n    },\r\n    {\r\n        \"r\": 0,\r\n        \"c\": 1,\r\n        \"v\": {\r\n            \"v\": 12,\r\n            \"f\": \"=SUM(A2)\",\r\n            \"bg\": \"#fff000\"\r\n        }\r\n    },\r\n    {\r\n        \"r\": 10,\r\n        \"c\": 11,\r\n        \"v\": \"值2\"\r\n    }\r\n]\r\n```\r\n\r\n## <div id='cellStyle'>Cell format</div>\r\n\r\nReference[Aspose.Cells](https://docs.aspose.com/display/cellsnet/List+of+Supported+Number+Formats#ListofSupportedNumberFormats-Aspose.Cells)\r\n\r\nThe format is set to:\r\n\r\n```json\r\n{\r\n    \"ct\": {\r\n        \"fa\": \"General\",\r\n        \"t\": \"g\"\r\n    },\r\n    \"m\": \"2424\",\r\n    \"v\": 2424\r\n}\r\n```\r\n\r\n|Parameter|Explanation|Value|\r\n| ------------ | ------------ | ------------ |\r\n|fa|Format definition string| such as \"General\"|\r\n|t|Type|Such as \"g\"|\r\n\r\nThe available settings are as follows:\r\n| Format | ct.fa | ct.t | Example of m value | Remarks |\r\n|----------|----------|-------------------------|------------------------- |------------------------- |\r\n| Automatic | General | g | Luckysheet |Automatic format, which is also the default format; When the cell content is a number, the value of `m` is `'n'`|\r\n| Plain text | @ | s | Luckysheet ||\r\n| <br><br><br>**Number Format** | | | | |\r\n| Integer | 0 | n | 1235 | 0 decimal places |\r\n| One decimal place of the number | 0.0 | n | 1234.6 | The number of 0 after the dot represents the number of decimal places. If the original number is large, the number of digits will be rounded to the nearest hour |\r\n| Two decimal places | 0.00 | n | 1234.56 ||\r\n| Percentage integer | 0% | n | 123456% |The usage of #0% is also supported|\r\n| Percentage | 0.00% | n | 123456.00% |The usage of #0.00% is also supported. The number of 0 after the dot represents the number of decimal places|\r\n| Scientific Notation | 0.00E+00 | n | 1.23E+03 ||\r\n| Scientific Notation | ##0.0E+0 | n | 1.2E+3 ||\r\n| Fractions | # ?/? | n | 1234 5/9 ||\r\n| Score | # ??/?? | n | 1234 14/25 ||\r\n| Ten thousand | w | n |123 thousand and 456||\r\n| Ten thousand two decimal places | w0.00 | n |123 thousand and 3456.00 ||\r\n| Accounting | ¥(0.00) | n ||\r\n| More number formats | #,##0 | n | 1,235 ||\r\n| More number formats | #,##0.00 | n | 1,234.56 ||\r\n| More number formats | `#,##0_);(#,##0)` | n | 1,235 ||\r\n| More number formats | `#,##0_);[Red](#,##0)` | n | 1,235 ||\r\n| More number formats | `#,##0.00_);(#,##0.00)` | n | 1,234.56 ||\r\n| More number formats | `#,##0.00_);[Red](#,##0.00)` | n | 1,234.56 ||\r\n| More number formats | $#,##0_);($#,##0) | n | $1,235 ||\r\n| More number formats | `$#,##0_);[Red]($#,##0)` | n | $1,235 ||\r\n| More number formats | $#,##0.00_);($#,##0.00) | n | $1,234.56 ||\r\n| More number formats | `$#,##0.00_);[Red]($#,##0.00)` | n | $1,234.56 ||\r\n| More number formats | _($* #,##0_);_(...($* \"-\"_);_(@_) | n | $ 1,235 ||\r\n| More number formats | _(* #,##0_);_(*..._(* \"-\"_);_(@_) | n | 1,235 ||\r\n| More number formats | _($* #,##0.00_);_(...($* \"-\"_);_(@_) | n | $ 1,234.56 ||\r\n| More number formats | _(* #,##0.00_);...* \"-\"??_);_(@_) | n | 1,234.56 ||\r\n| <br><br><br>**Time and Date Format** | | | | |\r\n| Time | hh:mm AM/PM | d |10:23 AM||\r\n| Time 24H | hh:mm | d |10:23||\r\n| Date Time | yyyy-MM-dd hh:mm AM/PM | d |2020-07-29 10:23 AM||\r\n| Date Time 24H | yyyy-MM-dd hh:mm | d |2020-07-29 10:23||\r\n| Date | yyyy-MM-dd | d | 1930-08-05 ||\r\n| Date | yyyy/MM/dd | d | 1930/8/5 ||\r\n| Date | yyyy \"year\" M\" month \"d\" day\" | d | August 5, 1930 ||\r\n| Date | MM-dd | d | 08-05 ||\r\n| Date | M-d | d | 8-5 ||\r\n| Date | M\"Month\"d\"Day\" | d | August 5th ||\r\n| Date | h:mm:ss | d | 13:30:30 ||\r\n| Date | h:mm | d | 13:30 ||\r\n| Date | AM/PM hh:mm | d | 01:30 PM ||\r\n| Date | AM/PM h:mm | d | 1:30 PM ||\r\n| Date | AM/PM h:mm:ss | d | 1:30:30 PM ||\r\n| Date | MM-dd AM/PM hh:mm | d | Next 08-05 01:30 PM ||\r\n| <br><br><br>**Currency Format** | | | | |\r\n| Currency: RMB | \"¥\" 0.00 | n | ¥ 123.00 | Also supports ¥ #.00 or ¥0.00|\r\n| Currency: US Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Euro | \"€\" 0.00 | n | € 123.00 ||\r\n| Currency: British Pound | \"￡\" 0.00 | n | ￡ 123.00 ||\r\n| Currency: Hong Kong Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Japanese Yen | \"￥\" 0.00 | n | ￥123.00 ||\r\n| Currency: Albanian Lek | \"Lek\" 0.00 | n | Lek 123.00 ||\r\n| Currency: Algerian Dinar | \"din\" 0.00 | n | din 123.00 ||\r\n| Currency: Afghani | \"Af\" 0.00 | n | Af 123.00 ||\r\n| Currency: Argentine Peso | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: United Arab Emirates Dirham | \"dh\" 0.00 | n | dh 123.00 ||\r\n| Currency: Aruban Florin | \"Afl\" 0.00 | n | Afl 123.00 ||\r\n| Currency: Omani Rial | \"Rial\" 0.00 | n | Rial 123.00 ||\r\n| Currency: Azerbaijani Manat | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Egyptian Pound | \"￡\" 0.00 | n | ￡ 123.00 ||\r\n| Currency: Ethiopian Birr | \"Birr\" 0.00 | n | Birr 123.00 ||\r\n| Currency: Angolan Kwanza | \"Kz\" 0.00 | n | Kz 123.00 ||\r\n| Currency: Australian Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Macau Patacas | \"MOP\" 0.00 | n | MOP 123.00 ||\r\n| Currency: Barbadian Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Papua New Guinea Kina | \"PGK\" 0.00 | n | PGK 123.00 ||\r\n| Currency: Bahamian Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Pakistani Rupee | \"Rs\" 0.00 | n | Rs 123.00 ||\r\n| Currency: Paraguayan Guarani | \"Gs\" 0.00 | n | Gs 123.00 ||\r\n| Currency: Bahraini Dinar | \"din\" 0.00 | n | din 123.00 ||\r\n| Currency: Panamanian Balboa | \"B/\" 0.00 | n | B/ 123.00 ||\r\n| Currency: Brazilian Riyal | \"R$\" 0.00 | n | R$ 123.00 ||\r\n| Currency: Belarusian ruble | \"р\" 0.00 | n | р 123.00 ||\r\n| Currency: Bermudian Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Bulgarian Lev | \"lev\" 0.00 | n | lev 123.00 ||\r\n| Currency: Iceland Krona | \"kr\" 0.00 | n | kr 123.00 ||\r\n| Currency: Bosnia and Herzegovina convertible mark | \"KM\" 0.00 | n | KM 123.00 ||\r\n| Currency: Polish Zloty | \"z?\" 0.00 | n | z? 123.00 ||\r\n| Currency: Boliviano | \"Bs\" 0.00 | n | Bs 123.00 ||\r\n| Currency: Belize Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Botswana Pula | \"P\" 0.00 | n | P 123.00 ||\r\n| Currency: Bhutan Nusam | \"Nu\" 0.00 | n | Nu 123.00 ||\r\n| Currency: Burundian Franc | \"FBu\" 0.00 | n | FBu 123.00 ||\r\n| Currency: North Korean Won | \"?KP\" 0.00 | n | ?KP 123.00 ||\r\n| Currency: Danish Krone | \"kr\" 0.00 | n | kr 123.00 ||\r\n| Currency: East Caribbean Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Dominican Peso | \"RD$\" 0.00 | n | RD$ 123.00 ||\r\n| Currency: Russian ruble | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Eritrean Nakfa | \"Nfk\" 0.00 | n | Nfk 123.00 ||\r\n| Currency: CFA franc | \"CFA\" 0.00 | n | CFA 123.00 ||\r\n| Currency: Philippine Peso | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Fijian Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Cape Verde Escudo | \"CVE\" 0.00 | n | CVE 123.00 ||\r\n| Currency: Falkland Islands Pound | \"￡\" 0.00 | n | ￡ 123.00 ||\r\n| Currency: Gambia Dalasi | \"GMD\" 0.00 | n | GMD 123.00 ||\r\n| Currency: Congolese Franc | \"FrCD\" 0.00 | n | FrCD 123.00 ||\r\n| Currency: Colombian Peso | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Costa Rican Colon | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Cuban Peso | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Cuban Convertible Peso | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Guyana Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Kazakhstan tenge | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Haitian Gourde | \"HTG\" 0.00 | n | HTG 123.00 ||\r\n| Currency: Korean Won | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Netherlands Antilles Guild | \"NAf.\" 0.00 | n | NAf. 123.00 ||\r\n| Currency: Honduras Lalempira | \"L\" 0.00 | n | L 123.00 ||\r\n| Currency: Djiboutian Franc | \"Fdj\" 0.00 | n | Fdj 123.00 ||\r\n| Currency: Kyrgyzstan Som | \"KGS\" 0.00 | n | KGS 123.00 ||\r\n| Currency: Guinean Franc | \"FG\" 0.00 | n | FG 123.00 ||\r\n| Currency: Canadian Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Ghanaian Cedi | \"GHS\" 0.00 | n | GHS 123.00 ||\r\n| Currency: Cambodian Riel | \"Riel\" 0.00 | n | Riel 123.00 ||\r\n| Currency: Czech Koruna | \"K?\" 0.00 | n | K? 123.00 ||\r\n| Currency: Zimbabwe dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Qatari Rial | \"Rial\" 0.00 | n | Rial 123.00 ||\r\n| Currency: Cayman Islands Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Comorian Franc | \"CF\" 0.00 | n | CF 123.00 ||\r\n| Currency: Kuwaiti Dinar | \"din\" 0.00 | n | din 123.00 ||\r\n| Currency: Croatian Kuna | \"kn\" 0.00 | n | kn 123.00 ||\r\n| Currency: Kenyan Shilling | \"Ksh\" 0.00 | n | Ksh 123.00 ||\r\n| Currency: Lesotho Loti | \"LSL\" 0.00 | n | LSL 123.00 ||\r\n| Currency: Lao Kip | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Lebanese Pound | \"L￡\" 0.00 | n | L￡ 123.00 ||\r\n| Currency: Lithuanian Litas | \"Lt\" 0.00 | n | Lt 123.00 ||\r\n| Currency: Libyan Dinar | \"din\" 0.00 | n | din 123.00 ||\r\n| Currency: Libyan Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Rwandan franc | \"RF\" 0.00 | n | RF 123.00 ||\r\n| Currency: Romanian Lei | \"RON\" 0.00 | n | RON 123.00 ||\r\n| Currency: Madagascar Ariary | \"Ar\" 0.00 | n | Ar 123.00 ||\r\n| Currency: Maldivian Rufiyaa | \"Rf\" 0.00 | n | Rf 123.00 ||\r\n| Currency: Malawian Kwacha | \"MWK\" 0.00 | n | MWK 123.00 ||\r\n| Currency: Malaysian Ringgit | \"RM\" 0.00 | n | RM 123.00 ||\r\n| Currency: Macedonian Dinar | \"din\" 0.00 | n | din 123.00 ||\r\n| Currency: Mauritian Rupee | \"MURs\" 0.00 | n | MURs 123.00 ||\r\n| Currency: Mauritania Ouguiya | \"MRO\" 0.00 | n | MRO 123.00 ||\r\n| Currency: Mongolian Tugrik | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Bangladeshi Taka | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Peruvian New Sol | \"S/\" 0.00 | n | S/ 123.00 ||\r\n| Currency: Myanmar Kyat | \"K\" 0.00 | n | K 123.00 ||\r\n| Currency: Moldovan Lei | \"MDL\" 0.00 | n | MDL 123.00 ||\r\n| Currency: Moroccan Dirham | \"dh\" 0.00 | n | dh 123.00 ||\r\n| Currency: Mozambique Metical | \"MTn\" 0.00 | n | MTn 123.00 ||\r\n| Currency: Mexican Peso | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Namibian Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: South African Rand | \"R\" 0.00 | n | R 123.00 ||\r\n| Currency: South Sudanese Pound | \"￡\" 0.00 | n | ￡ 123.00 ||\r\n| Currency: Nicaragua Cordoba | \"C$\" 0.00 | n | C$ 123.00 ||\r\n| Currency: Nepalese Rupee | \"Rs\" 0.00 | n | Rs 123.00 ||\r\n| Currency: Nigerian Naira | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Norwegian Krone | \"kr\" 0.00 | n | kr 123.00 ||\r\n| Currency: Georgia Lari | \"GEL\" 0.00 | n | GEL 123.00 ||\r\n| Currency: RMB (Offshore) | \"￥\" 0.00 | n | ￥123.00 ||\r\n| Currency: Swedish Krona | \"kr\" 0.00 | n | kr 123.00 ||\r\n| Currency: Swiss Franc | \"CHF\" 0.00 | n | CHF 123.00 ||\r\n| Currency: Serbian Dinar | \"din\" 0.00 | n | din 123.00 ||\r\n| Currency: Sierra Leone Leone | \"SLL\" 0.00 | n | SLL 123.00 ||\r\n| Currency: Seychelles Rupee | \"SCR\" 0.00 | n | SCR 123.00 ||\r\n| Currency: Saudi Riyal | \"Rial\" 0.00 | n | Rial 123.00 ||\r\n| Currency: Sao Tome Dobra | \"Db\" 0.00 | n | Db 123.00 ||\r\n| Currency: St. Helena Pound | \"￡\" 0.00 | n | ￡ 123.00 ||\r\n| Currency: Sri Lankan Rupee | \"Rs\" 0.00 | n | Rs 123.00 ||\r\n| Currency: Swaziland Lilangeni | \"SZL\" 0.00 | n | SZL 123.00 ||\r\n| Currency: Sudanese Pound | \"SDG\" 0.00 | n | SDG 123.00 ||\r\n| Currency: Surinamese Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Solomon Islands Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Somali Shilling | \"SOS\" 0.00 | n | SOS 123.00 ||\r\n| Currency: Tajikistani Somoni | \"Som\" 0.00 | n | Som 123.00 ||\r\n| Currency: Pacific Franc | \"FCFP\" 0.00 | n | FCFP 123.00 ||\r\n| Currency: Thai Baht | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Tanzanian Shilling | \"TSh\" 0.00 | n | TSh 123.00 ||\r\n| Currency: Tongan Paanga | \"T$\" 0.00 | n | T$ 123.00 ||\r\n| Currency: Trinidad and Tobago Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Tunisian Dinar | \"din\" 0.00 | n | din 123.00 ||\r\n| Currency: Turkish Lira | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Vanuatu Vatu | \"VUV\" 0.00 | n | VUV 123.00 ||\r\n| Currency: Guatemalan Quetzal | \"Q\" 0.00 | n | Q 123.00 ||\r\n| Currency: Venezuelan Bolivar | \"Bs\" 0.00 | n | Bs 123.00 ||\r\n| Currency: Brunei Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Ugandan Shilling | \"UGX\" 0.00 | n | UGX 123.00 ||\r\n| Currency: Ukrainian Hryvnia | \"грн.\" 0.00 | n | грн. 123.00 ||\r\n| Currency: Uruguayan Peso | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Uzbekistani Sum | \"so?m\" 0.00 | n | so?m 123.00 ||\r\n| Currency: Western Samoa Tala | \"WST\" 0.00 | n | WST 123.00 ||\r\n| Currency: Singapore Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: New Taiwan Dollar | \"NT$\" 0.00 | n | NT$ 123.00 ||\r\n| Currency: New Zealand Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Hungarian Forint | \"Ft\" 0.00 | n | Ft 123.00 ||\r\n| Currency: Syrian Pound | \"￡\" 0.00 | n | ￡ 123.00 ||\r\n| Currency: Jamaican Dollar | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: Armenian Dram | \"Dram\" 0.00 | n | Dram 123.00 ||\r\n| Currency: Yemeni Rial | \"Rial\" 0.00 | n | Rial 123.00 ||\r\n| Currency: Iraqi Dinar | \"din\" 0.00 | n | din 123.00 ||\r\n| Currency: Iranian Rial | \"Rial\" 0.00 | n | Rial 123.00 ||\r\n| Currency: Israeli New Shekel | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Indian Rupee | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Indonesian Rupiah | \"Rp\" 0.00 | n | Rp 123.00 ||\r\n| Currency: Jordanian Dinar | \"din\" 0.00 | n | din 123.00 ||\r\n| Currency: Vietnamese Dong | \"?\" 0.00 | n |? 123.00 ||\r\n| Currency: Zambian Kwacha | \"ZMW\" 0.00 | n | ZMW 123.00 ||\r\n| Currency: Gibraltar Pound | \"￡\" 0.00 | n | ￡ 123.00 ||\r\n| Currency: Chilean Peso | \"$\" 0.00 | n | $ 123.00 ||\r\n| Currency: China-Africa Financial Cooperation Franc | \"FCFA\" 0.00 | n | FCFA 123.00 ||\r\n\r\nNotice: Import/export only considers the data style that the user sees. For example, the way to process the date format in excel is to convert the date into a number: 42736 represents 2017-1-1."
  },
  {
    "path": "docs/guide/config.md",
    "content": "# Overall configuration\r\n\r\n## Basic Structure\r\n\r\nWhen initializing the workbook, you can set an object configuration string ʻoptions` to customize the configuration of Luckysheet.\r\n\r\nThe following is a simple configuration example:\r\n\r\n```js\r\n// Configuration item\r\nconst options = {\r\n     container:'luckysheet', // set the id of the DOM container\r\n     title:'Luckysheet Demo', // set the name of the table\r\n     lang:'zh' // set language\r\n\r\n     // More other settings...\r\n}\r\n\r\n// Initialize the table\r\nluckysheet.create(options)\r\n```\r\n\r\nThe `options` configuration item here will affect the entire workbook. In particular, the configuration of a single worksheet needs to be set in the `options.data` array to set corresponding more detailed parameters. Refer to [Worksheet Configuration](/zh/guide/sheet.html)\r\n\r\nFor personalized needs, in addition to allowing configuration information bar ([showinfobar](#showinfobar)), toolbar ([showtoolbar](#showtoolbar)), bottom sheet bar ([showsheetbar](#showsheetbar)), bottom count bar ([ShowstatisticBar](#showstatisticBar)),\r\nLuckysheet has opened more detailed custom configuration options, which are as follows:\r\n\r\n- Customize the toolbar ([showtoolbarConfig](#showtoolbarConfig))\r\n- Customize the bottom sheet bar ([showsheetbarConfig](#showsheetbarConfig))\r\n- Customize the counting bar ([showstatisticBarConfig](#showstatisticBarConfig))\r\n- Custom cell right-click menu ([cellRightClickConfig](#cellRightClickConfig))\r\n- Customize the right-click menu of the bottom sheet bar ([sheetRightClickConfig](#sheetRightClickConfig))\r\n\r\n## Configuration item\r\n\r\nThe following are all supported setting parameters\r\n\r\n- Container ID [container](#container)\r\n- Workbook name [title](#title)\r\n- Language [lang](#lang)\r\n- Unique key [gridKey](#gridKey)\r\n- Load the entire workbook [loadUrl](#loadUrl)\r\n- Load other worksheet celldata [loadSheetUrl](#loadSheetUrl)\r\n- Allow updates [allowUpdate](#allowUpdate)\r\n- Update address [updateUrl](#updateUrl)\r\n- Thumbnail update address [updateImageUrl](#updateImageUrl)\r\n- Worksheet configuration [data](#data)\r\n- Plugins [plugins](#plugins)\r\n- Number of columns [column](#column)\r\n- Number of rows [row](#row)\r\n- Billion format [autoFormatw](#autoFormatw)\r\n- Accuracy [accuracy](#accuracy)\r\n- Allow copying [allowCopy](#allowCopy)\r\n- Toolbar [showtoolbar](#showtoolbar)\r\n- Customize Toolbar [showtoolbarConfig](#showtoolbarConfig)\r\n- Information bar [showinfobar](#showinfobar)\r\n- Bottom sheet bar [showsheetbar](#showsheetbar)\r\n- Customize the bottom sheet bar [showsheetbarConfig](#showsheetbarConfig)\r\n- The bottom count bar [showstatisticBar](#showstatisticBar)\r\n- Custom Count Bar [showstatisticBarConfig](#showstatisticBarConfig)\r\n- Allow adding rows [enableAddRow](#enableAddRow)\r\n- Allow back to top [enableAddBackTop](#enableAddBackTop)\r\n- User Info [userInfo](#userInfo)\r\n- User Information Menu [userMenuItem](#userMenuItem)\r\n- Back button link [myFolderUrl](#myFolderUrl)\r\n- Ratio [devicePixelRatio](#devicePixelRatio)\r\n- Function Button [functionButton](#functionButton)\r\n- Auto-indent interface [showConfigWindowResize](#showConfigWindowResize)\r\n- Refresh formula [forceCalculation](#forceCalculation)\r\n- Custom cell right-click menu [cellRightClickConfig](#cellRightClickConfig)\r\n- Customize the right-click menu of the bottom sheet bar [sheetRightClickConfig](#sheetRightClickConfig)\r\n- The width of the row header area [rowHeaderWidth](#rowHeaderWidth)\r\n- The height of the column header area [columnHeaderHeight](#columnHeaderHeight)\r\n- Whether to show the formula bar [sheetFormulaBar](#sheetFormulaBar)\r\n- Initialize the default font size [defaultFontSize](#defaultFontSize)\r\n- Pager [pager](#pager)\r\n\r\n### container\r\n- Type: String\r\n- Default: \"luckysheet\"\r\n- Usage: Container ID\r\n  \r\n------------\r\n### title\r\n- Type: String\r\n- Default: \"Luckysheet Demo\"\r\n- Usage：Workbook name\r\n\r\n------------\r\n### lang\r\n- Type: String\r\n- Default: \"en\"\r\n- Usage: Internationalization settings, allow to set the language of the table, support simplified Chinese (\"zh\"), English (\"en\") and traditional Chinese (\"zh_tw\") and Spanish (\"es\")\r\n\r\n------------\r\n### gridKey\r\n- Type: String\r\n- Default: \"\"\r\n- Usage: Workbook unique identifier\r\n\r\n------------\r\n### loadUrl\r\n- Type: String\r\n- Default: \"\"\r\n- Usage: Configure the address of `loadUrl` and use it in conjunction with `loadSheetUrl`, which is generally used when the amount of data is large. You can also not use the interface parameters provided by Luckysheet, and use the [data](#data) parameter to prepare all table data for initialization in advance.\r\n\r\n    Luckysheet will request the entire workbook data through ajax, and load all `celldata` in the worksheet data with status 1 by default, and load all the fields except the `celldata` field in the rest of the worksheets. However, considering that some formulas, charts and pivot tables will reference data from other worksheets, the front end will add a judgment. If the current worksheet references data from other worksheets, it will request data through the interface address configured by `loadSheetUrl` , And load the data of the related worksheets. Because `loadUrl` is only responsible for the current worksheet data, it is also necessary to configure `loadSheetUrl` as an interface for asynchronously loading data.\r\n\r\n------------\r\n### loadSheetUrl\r\n- Type: String\r\n- Default: \"\"\r\n- Usage: Configure the address of `loadSheetUrl`, the parameters are `gridKey` (workbook primary key) and `index` (worksheet primary key collection, the format is `[\"sheet_01\",\"sheet_02\",\"sheet_03\"]`), the returned data is the `celldata` field data collection of the worksheet. In order to load performance considerations, except for the first load of the celldata data of the current worksheet, the data of the other worksheets will be requested only when the worksheet is switched to that worksheet.\r\n\r\n------------\r\n### allowUpdate\r\n- Type: Boolean\r\n- Default: false\r\n- Usage: Whether to allow back-end update after operating the table, used in conjunction with `updateUrl`\r\n\r\n------------\r\n### updateUrl\r\n- Type: String\r\n- Default: \"\"\r\n- Usage: The back-end update address after operating the workbook will be valid only when `allowUpdate` is `true`. This interface is also the interface address for shared editing.\r\n\r\nNote that you also need to configure `loadUrl` and `loadSheetUrl` to take effect.\r\n\r\n------------\r\n### updateImageUrl\r\n- Type: String\r\n- Default: \"\"\r\n- Usage: Update address of thumbnail\r\n\r\n------------\r\n### data\r\n- Type: Array\r\n- Default: [{ \"name\": \"Sheet1\", color: \"\", \"status\": \"1\", \"order\": \"0\", \"data\": [], \"config\": {}, \"index\":0 }, { \"name\": \"Sheet2\", color: \"\", \"status\": \"0\", \"order\": \"1\", \"data\": [], \"config\": {}, \"index\":1  }, { \"name\": \"Sheet3\", color: \"\", \"status\": \"0\", \"order\": \"2\", \"data\": [], \"config\": {}, \"index\":2  }]\r\n- Usage: When `loadUrl` and `loadSheetUrl` are not configured, you need to manually configure all the sheet data passed to the entire client `[shee1, sheet2, sheet3]`. For detailed parameter settings, please refer to [worksheet configuration](/zh/guide/sheet.html)\r\n\r\n------------\r\n### plugins\r\n- Type: Array\r\n- Default: []\r\n- Usage: Configure plug-in, support chart: \"chart\"\r\n\r\n------------\r\n### column\r\n- Type: Number\r\n- Default: 60\r\n- Usage: The default number of columns in an empty workbook\r\n\r\n------------\r\n### row\r\n- Type: Number\r\n- Default: 84\r\n- Usage: The default number of rows in an empty workbook\r\n\r\n------------\r\n### autoFormatw\r\n- Type: Boolean\r\n- Default: false\r\n- Usage: Automatically format numbers with more than 4 digits into \"billion format\", for example: true or \"true\" or \"TRUE\"\r\n\r\n------------\r\n### accuracy\r\n- Type: Number\r\n- Default: undefined\r\n- Usage: Set the precision, the number of digits after the decimal point. The parameter is a number or a string of numbers, for example: \"0\" or 0\r\n\r\n------------\r\n### allowCopy\r\n- Type: Boolean\r\n- Default: true\r\n- Usage: Whether to allow copy\r\n\r\n------------\r\n### showtoolbar\r\n- Type: Boolean\r\n- Default: true\r\n- Usage: Whether to show the toolbar\r\n\r\n------------\r\n### showtoolbarConfig\r\n\r\n- Type: Object\r\n- Default: {}\r\n- Usage: Custom configuration toolbar,can be used in conjunction with `showtoolbar`, `showtoolbarConfig` has a higher priority.\r\n- Format:\r\n    ```json\r\n    {\r\n        undoRedo: false, //Undo redo\r\n        paintFormat: false, //Format brush\r\n        currencyFormat: false, //currency format\r\n        percentageFormat: false, //Percentage format\r\n        numberDecrease: false, //'Decrease the number of decimal places'\r\n        numberIncrease: false, //'Increase the number of decimal places\r\n        moreFormats: false, //'More Formats'\r\n        font: false, //'font'\r\n        fontSize: false, //'Font size'\r\n        bold: false, //'Bold (Ctrl+B)'\r\n        italic: false, //'Italic (Ctrl+I)'\r\n        strikethrough: false, //'Strikethrough (Alt+Shift+5)'\r\n\t\tunderline: false, // 'Underline (Alt+Shift+6)'\r\n\t\ttextColor: false, //'Text color'\r\n        fillColor: false, //'Cell color'\r\n        border: false, //'border'\r\n        mergeCell: false, //'Merge cells'\r\n        horizontalAlignMode: false, //'Horizontal alignment'\r\n        verticalAlignMode: false, //'Vertical alignment'\r\n        textWrapMode: false, //'Wrap mode'\r\n        textRotateMode: false, //'Text Rotation Mode'\r\n\t\timage:false, // 'Insert picture'\r\n\t\tlink:false, // 'Insert link'\r\n\t\tchart: false, //'chart' (the icon is hidden, but if the chart plugin is configured, you can still create a new chart by right click)\r\n\t\tpostil: false, //'comment'\r\n\t\tpivotTable: false, //'PivotTable'\r\n\t\tfunction: false, //'formula'\r\n\t\tfrozenMode: false, //'freeze mode'\r\n\t\tsortAndFilter: false, //'Sort and filter'\r\n\t\tconditionalFormat: false, //'Conditional Format'\r\n\t\tdataVerification: false, // 'Data Verification'\r\n\t\tsplitColumn: false, //'Split column'\r\n\t\tscreenshot: false, //'screenshot'\r\n\t\tfindAndReplace: false, //'Find and Replace'\r\n\t\tprotection:false, // 'Worksheet protection'\r\n\t\tprint:false, // 'Print'\r\n    }\r\n    ```\r\n- Example:\r\n\t- Show only the `undo/redo` and `font` buttons:\r\n\t\t\r\n\t\t```js\r\n\t\t\t//options\r\n\t\t\t{\r\n\t\t\t\tshowtoolbar: false,\r\n\t\t\t\tshowtoolbarConfig:{\r\n\t\t\t\t\tundoRedo: true,\r\n\t\t\t\t\tfont: true,\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t```\r\n\t- Hide only the `image` and `print` buttons:\r\n\t\t\r\n\t\t```js\r\n\t\t\t//options\r\n\t\t\t{\r\n\t\t\t\tshowtoolbar: true, // The default is true, you can leave it unset\r\n\t\t\t\tshowtoolbarConfig:{\r\n\t\t\t\t\timage: false,\r\n\t\t\t\t\tprint: false,\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t```\r\n\r\n------------\r\n### showinfobar\r\n- Type: Boolean\r\n- Default: true\r\n- Usage: Whether to show the top information bar\r\n\r\n------------\r\n### showsheetbar\r\n- Type: Boolean\r\n- Default: true\r\n- Usage: Whether to show the bottom sheet button\r\n\r\n------------\r\n### showsheetbarConfig\r\n\r\n- Type: Object\r\n- Default: {}\r\n- Usage: Custom configuration bottom sheet button, can be used in conjunction with `showsheetbar`, `showsheetbarConfig` has a higher priority.\r\n- Format: \r\n    ```json\r\n    {\r\n        add: false, //Add worksheet\r\n        menu: false, //Worksheet management menu\r\n        sheet: false //Worksheet display\r\n    }\r\n    ```\r\n- Example:\r\n\t- Only display the `Add worksheet` button:\r\n\t\t\r\n\t\t```js\r\n\t\t\t//options\r\n\t\t\t{\r\n\t\t\t\tshowsheetbar: false,\r\n\t\t\t\tshowsheetbarConfig:{\r\n\t\t\t\t\tadd: true,\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t```\r\n\t- Only hide the `Add worksheet` and `Worksheet management menu` buttons:\r\n\t\t\r\n\t\t```js\r\n\t\t\t//options\r\n\t\t\t{\r\n\t\t\t\tshowsheetbar: true, // The default is true, you can leave it unset\r\n\t\t\t\tshowsheetbarConfig:{\r\n\t\t\t\t\tadd: false,\r\n\t\t\t\t\tmenu: false,\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t```\r\n\r\n------------\r\n### showstatisticBar\r\n- Type: Boolean\r\n- Default: true\r\n- Usage: Whether to show the bottom count bar\r\n\r\n------------\r\n### showstatisticBarConfig\r\n\r\n- Type: Object\r\n- Default: {}\r\n- Usage: Customize the bottom count bar, can be used in conjunction with `showstatisticBar`, `showstatisticBarConfig` has a higher priority.\r\n- Format: \r\n    ```json\r\n    {\r\n\t\tcount: false, // Count bar\r\n\t\tview: false, // Print view\r\n        zoom: false // Zoom\r\n    }\r\n\t```\r\n- Example:\r\n\t- Only display the `Zoom` button:\r\n\t\t\r\n\t\t```js\r\n\t\t\t//options\r\n\t\t\t{\r\n\t\t\t\tshowstatisticBar: false,\r\n\t\t\t\tshowstatisticBarConfig:{\r\n\t\t\t\t\tzoom: true,\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t```\r\n\t- Only hide the `print view` button:\r\n\t\t\r\n\t\t```js\r\n\t\t\t//options\r\n\t\t\t{\r\n\t\t\t\tshowstatisticBar: true, // The default is true, you can leave it unset\r\n\t\t\t\tshowstatisticBarConfig:{\r\n\t\t\t\t\tview: false,\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t```\t\r\n------------\r\n### enableAddRow\r\n- Type: Boolean\r\n- Default: true\r\n- Usage: Allow additional rows\r\n\r\n------------\r\n### enableAddBackTop\r\n- Type: Boolean\r\n- Default: true\r\n- Usage: Allow back to top\r\n\r\n------------\r\n### userInfo\r\n- Type: String | Boolean | Object\r\n- Default: false\r\n- Usage: User information display style in the upper right corner,Support the following three formats\r\n\t1. HTML template string, such as:\r\n\t\r\n\t```js\r\n\toptions:{\r\n\t\t// Other configuration\r\n\t\tuserInfo:'<i style=\"font-size:16px;color:#ff6a00;\" class=\"fa fa-taxi\" aria-hidden=\"true\"></i> Lucky',\r\n\t}\r\n\t```\r\n\r\n\tOr an ordinary string, such as:\r\n\t\r\n\t```js\r\n\toptions:{\r\n\t\t// Other configuration\r\n\t\tuserInfo:'Lucky',\r\n\t}\r\n\t```\r\n \r\n\t2. Boolean type, such as:\r\n   \t\r\n\t`false`: Do not show\r\n\t```js\r\n\toptions:{\r\n\t\t// Other configuration\r\n\t\tuserInfo:false, // Do not display user information\r\n\t}\r\n\r\n\t```\r\n\t`true`: Show the default string\r\n\t```js\r\n\toptions:{\r\n\t\t// Other configuration\r\n\t\tuserInfo:true, // Show HTML:'<i style=\"font-size:16px;color:#ff6a00;\" class=\"fa fa-taxi\" aria-hidden=\"true\"></i> Lucky'\r\n\t}\r\n\r\n\t```\r\n\t3. Object format, set `userImage`: user avatar address and `userName`: user name, such as:\r\n\t```js\r\n\toptions:{\r\n\t\t// Other configuration\r\n\t\tuserImage:'https://cdn.jsdelivr.net/npm/luckyresources@1.0.3/assets/img/logo/logo.png', // Avatar url\r\n\t\tuserName:'Lucky', // username\r\n\t}\r\n\t```\r\n\t4. Note that if set to `undefined` or not set, the same as setting `false`\r\n\r\n------------\r\n### userMenuItem\r\n- Type: Array\r\n- Default: `[{url:\"www.baidu.com\", \"icon\":'<i class=\"fa fa-folder\" aria-hidden=\"true\"></i>', \"name\":\"我的表格\"}, {url:\"www.baidu.com\", \"icon\":'<i class=\"fa fa-sign-out\" aria-hidden=\"true\"></i>', \"name\":\"退出登陆\"}]`\r\n- Usage: Click the pop-up menu of user information in the upper right corner\r\n\r\n------------\r\n### myFolderUrl\r\n- Type: String\r\n- Default: \"www.baidu.com\"\r\n- Usage: The link of the `<` back button in the upper left corner\r\n\r\n------------\r\n### devicePixelRatio\r\n- Type: Number\r\n- Default: window.devicePixelRatio\r\n- Usage: Device ratio, the larger the ratio, the higher the resolution of the workbook\r\n\r\n------------\r\n### functionButton\r\n- Type: String\r\n- Default: \"\"\r\n- Usage: Function buttons in the upper right corner, for example:`'<button id=\"\" class=\"btn btn-primary\" style=\"padding:3px 6px;font-size: 12px;margin-right: 10px;\">download</button>    <button id=\"\" class=\"btn btn-primary btn-danger\" style=\"    padding:3px 6px;    font-size: 12px;    margin-right: 10px;\">share</button>    <button id=\"luckysheet-share-btn-title\" class=\"btn btn-primary btn-danger\" style=\"    padding:3px 6px;    font-size: 12px;    margin-right: 10px;\">show data</button>'`\r\n\r\n------------\r\n### showConfigWindowResize\r\n- Type: Boolean\r\n- Default: true\r\n- Usage: The configuration of the chart or pivot table will pop up on the right, set whether the workbook will be automatically indented after popping up\r\n\r\n------------\r\n### forceCalculation\r\n- Type: Boolean\r\n- Default: false\r\n- Usage: Force refresh formula.\r\n\r\n     By default, in order to improve loading performance, when the table is initialized, cells containing formulas will directly obtain `v` and `m` as data results by default without real-time calculation.\r\n    \r\n     If the data of the cell associated with the formula has changed, or the result of the cell data where the formula is located has changed, it will cause the calculated result of the associated cell to be inconsistent with the actual displayed result. This requires the formula refresh to be turned on to ensure the data The accuracy of real-time calculations.\r\n    \r\n     ⚠️Reminder, there will be performance problems when there are more formulas, use it with caution!\r\n\r\n------------\r\n### cellRightClickConfig\r\n\r\n- Type: Object\r\n- Default: {}\r\n- Usage: Custom configuration cell right-click menu\r\n- Format: \t\r\n\t```json\r\n    {\r\n\t\tcopy: false, // copy\r\n\t\tcopyAs: false, // copy as\r\n\t\tpaste: false, // paste\r\n\t\tinsertRow: false, // insert row\r\n\t\tinsertColumn: false, // insert column\r\n\t\tdeleteRow: false, // delete the selected row\r\n\t\tdeleteColumn: false, // delete the selected column\r\n\t\tdeleteCell: false, // delete cell\r\n\t\thideRow: false, // hide the selected row and display the selected row\r\n\t\thideColumn: false, // hide the selected column and display the selected column\r\n\t\trowHeight: false, // row height\r\n\t\tcolumnWidth: false, // column width\r\n\t\tclear: false, // clear content\r\n\t\tmatrix: false, // matrix operation selection\r\n\t\tsort: false, // sort selection\r\n\t\tfilter: false, // filter selection\r\n\t\tchart: false, // chart generation\r\n\t\timage: false, // insert picture\r\n\t\tlink: false, // insert link\r\n\t\tdata: false, // data verification\r\n\t\tcellFormat: false // Set cell format\r\n\t}\r\n\t```\r\n\t\r\n\tIn addition to the cells, the configuration here also includes the row header right-click menu, the column header right-click menu, and the column header drop-down arrow menu. The specific configuration relationships are as follows:\r\n\t\r\n\t|Right-click menu configuration|Cell|Row header|Column header|Column arrow|\r\n\t| ------------ | ------------ | ------------ | ----------- | ------------ |\r\n\t|copy|copy|copy|copy|copy|\r\n\t|copyAs|copy as|copy as|copy as|copy as|\r\n\t|paste|paste|paste|paste|paste|\r\n\t|insertRow|Insert a row|Increase N rows upwards and N rows downwards|-|-|\r\n\t|insertColumn|Insert Column|-|Add N columns to the left and N columns to the right|Add N columns to the left and N columns to the right|\r\n\t|deleteRow|Delete selected row|Delete selected row|-|-|\r\n\t|deleteColumn|Delete selected column|-|Delete selected column|Delete selected column|\r\n\t|deleteCell|Delete cell|-|-|-|\r\n\t|hideRow|-|Hide the selected row and show the selected row|-|-|\r\n\t|hideColumn|-|-|Hide the selected column and show the selected column|Hide the selected column and show the selected column|\r\n\t|rowHeight|-|row height|-|-|\r\n\t|columnWidth|-|-|Column Width|Column Width|\r\n\t|clear|clear content|clear content|clear content|-|\r\n\t|matrix|Matrix Operation Selection|Matrix Operation Selection|Matrix Operation Selection|-|\r\n\t|sort|Sort selection|Sort selection|Sort selection|A-Z sort and Z-A sort|\r\n\t|filter|Filter selection|Filter selection|Filter selection|-|\r\n\t|chart|chart generation|chart generation|chart generation|-|\r\n\t|image|Insert Picture|Insert Picture|Insert Picture|-|\r\n\t|link|Insert link|Insert link|Insert link|-|\r\n\t|data|Data Verification|Data Verification|Data Verification|-|\r\n\t|cellFormat|Set cell format|Set cell format|Set cell format|-|\r\n\r\n------------\r\n### sheetRightClickConfig\r\n\r\n- Type: Object\r\n- Default: {}\r\n- Usage: Customize the right-click menu of the bottom sheet bar\r\n- Format: \r\n    ```json\r\n    {   \r\n        delete: false, //Delete\r\n        copy: false, //Copy\r\n        rename: false, //Rename\r\n        color: false, //Change color\r\n        hide: false, //Hide, unhide\r\n        move: false, //Move to the left, move to the right\r\n    }\r\n\r\n------------\r\n### rowHeaderWidth\r\n- Type: Number\r\n- Default: 46\r\n- Usage: The width of the row header area, if set to 0, it means to hide the row header\r\n\r\n------------\r\n### columnHeaderHeight\r\n- Type: Number\r\n- Default: 20\r\n- Usage: The height of the column header area, if set to 0, it means hide the column header\r\n\r\n------------\r\n### sheetFormulaBar\r\n- Type: Boolean\r\n- Default: true\r\n- Usage: Whether to show the formula bar\r\n\r\n------------\r\n### defaultFontSize\r\n- Type：Number\r\n- Default：11\r\n- Usage：Initialize the default font size\r\n\r\n------------\r\n\r\n### limitSheetNameLength\r\n- Type: Boolean\r\n- Default: true\r\n- Usage：Is the length of the sheet name limited in scenarios such as sheet renaming\r\n\r\n------------\r\n\r\n### defaultSheetNameMaxLength\r\n- Type：Number\r\n- Default：31\r\n- Usage：Default maximum allowed sheet name length\r\n\r\n------------\r\n\r\n### pager\r\n- Type：Object\r\n- Default：null\r\n- Usage：Pager button settings, the first version of the solution is directly used jquery plug-in [sPage](https://github.com/jvbei/sPage)\r\n\tClicking the paging button will trigger the hook function `onTogglePager`, which returns the current page number, which is the same as the `backFun` method of `sPage`. This pager setting is only responsible for the UI part. For the specific data request and data rendering after switching paging, please enter the `onTogglePager` custom processing in the number of hook lines.\r\n\t```js\r\n\tpager: {\r\n\t\tpageIndex: 1, //Current page number\r\n\t\tpageSize: 10, //How many rows of data are displayed on each page\r\n\t\ttotal: 50, //Total number of rows of data\r\n\t\tselectOption: [10, 20] //Options that allow setting the number of rows per page\r\n\t}\r\n\t```\r\n\r\n------------\r\n\r\n## Hook Function (TODO)\r\n\r\nWhen the hook function is used in secondary development, hooks will be implanted in each common mouse or keyboard operation, and the function passed in by the developer will be called to expand the function of Luckysheet.\r\n\r\nThe hook functions are uniformly configured under ʻoptions.hook`, and configuration hooks can be created separately for cells, sheet pages, and tables.\r\n\r\n## Cell\r\n\r\n### cellEditBefore\r\n\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered before entering the cell editing mode. When a cell is selected and in the non-editing state, there are usually the following three conventional methods to trigger the edit mode\r\n   - Double click the cell\r\n   - Hit Enter\r\n   - Use API: enterEditMode\r\n- Parameter: \r\n\t- {Array} [range]: Current selection range\r\n\r\n------------\r\n### cellUpdateBefore\r\n\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered before updating this cell value, `return false` will not perform subsequent updates. After modifying the cell in the editing state, this hook is triggered before exiting the editing mode and updating the data.\r\n- Parameter: \r\n\t- {Number} [r]: The row number of the cell\r\n\t- {Number} [c]: The column number of the cell\r\n\t- {Object | String | Number} [value]: The content of the cell to be modified\r\n\t- {Boolean} [isRefresh]: Whether to refresh the entire table\r\n\r\n------------\r\n### cellUpdated\r\n\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered after updating this cell\r\n- Parameter: \r\n\t- {Number} [r]: The row number of the cell\r\n\t- {Number} [c]: The column number of the cell\r\n\t- {Object} [oldValue]: Cell object before modification\r\n\t- {Object} [newValue]: Modified cell object\r\n\t- {Boolean} [isRefresh]: Whether to refresh the entire table\r\n\r\n------------\r\n### cellRenderBefore\r\n\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered before the cell is rendered, `return false` will not render the cell\r\n- Parameter: \r\n\t- {Object} [cell]:Cell object\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [r]: The row number of the cell\r\n\t\t+ {Number} [c]: The column number of the cell\r\n\t\t+ {Number} [start_r]: The horizontal coordinate of the upper left corner of the cell\r\n\t\t+ {Number} [start_c]: The vertical coordinate of the upper left corner of the cell\r\n\t\t+ {Number} [end_r]: The horizontal coordinate of the lower right corner of the cell\r\n\t\t+ {Number} [end_c]: The vertical coordinate of the lower right corner of the cell\r\n\t- {Object} [sheet]: Current sheet object\r\n\t- {Object} [ctx]: The context of the current canvas\r\n\r\n------------\r\n### cellRenderAfter\r\n\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered after the cell rendering ends, `return false` will not render the cell\r\n- Parameter: \r\n\t- {Object} [cell]: Cell object\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [r]: The row number of the cell\r\n\t\t+ {Number} [c]: The column number of the cell\r\n\t\t+ {Number} [start_r]: The horizontal coordinate of the upper left corner of the cell\r\n\t\t+ {Number} [start_c]: The vertical coordinate of the upper left corner of the cell\r\n\t\t+ {Number} [end_r]: The horizontal coordinate of the lower right corner of the cell\r\n\t\t+ {Number} [end_c]: The vertical coordinate of the lower right corner of the cell\r\n\t- {Object} [sheet]: Current worksheet object\r\n\t- {Object} [ctx]: The context of the current canvas\r\n\r\n- Example:\r\n\r\n\tA case of drawing two pictures in the upper left corner and lower right corner of cell D1\r\n\t:::::: details\r\n\t```js\r\n\tluckysheet.create({\r\n            hook: {\r\n                cellRenderAfter: function (cell, position, sheetFile, ctx) {\r\n                    var r = position.r;\r\n                    var c = position.c;\r\n                    if (r === 0 && c === 3) { // Specify to process cell D1\r\n                        if (!window.storeUserImage) {\r\n                            window.storeUserImage = {}\r\n                        }\r\n\t\t\t\t\t\t\r\n                        if (!window.storeUserImage[r + '_' + c]) {\r\n                            window.storeUserImage[r + '_' + c] = {}\r\n                        }\r\n\r\n                        var img = null;\r\n                        var imgRight = null;\r\n\r\n                        if (window.storeUserImage[r + '_' + c].image && window.storeUserImage[r + '_' + c].imgRight) {\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// Fetch directly after loading\r\n                            img = window.storeUserImage[r + '_' + c].image;\r\n                            imgRight = window.storeUserImage[r + '_' + c].imgRight;\r\n\r\n                        } else {\r\n\r\n                            img = new Image();\r\n                            imgRight = new Image();\r\n\r\n                            img.src = 'https://www.dogedoge.com/favicon/developer.mozilla.org.ico';\r\n                            imgRight.src = 'https://www.dogedoge.com/static/icons/twemoji/svg/1f637.svg';\r\n\r\n\t\t\t\t\t\t\t// The picture is cached in the memory, fetched directly next time, no need to reload\r\n                            window.storeUserImage[r + '_' + c].image = img;\r\n                            window.storeUserImage[r + '_' + c].imgRight = imgRight;\r\n\r\n                        }\r\n\r\n\t\t\t\t\t\t\r\n                        if (img.complete) { //Direct rendering that has been loaded\r\n                            ctx.drawImage(img, position.start_c, position.start_r, 10, 10);\r\n                        } else {\r\n                            img.onload = function () {\r\n                                ctx.drawImage(img, position.start_c, position.start_r, 10, 10);\r\n                            }\r\n\r\n                        }\r\n\r\n                        if (imgRight.complete) {\r\n                            ctx.drawImage(imgRight, position.end_c - 10, position.end_r - 10, 10, 10);\r\n                        } else {\r\n\r\n                            imgRight.onload = function () {\r\n                                ctx.drawImage(imgRight, position.end_c - 10, position.end_r - 10, 10, 10);\r\n                            }\r\n                        }\r\n\r\n                    }\r\n                }\r\n            }\r\n        })\r\n\t```\r\n\t:::\r\n\r\n------------\r\n### cellAllRenderBefore\r\n\r\n- Type: Function\r\n- Default: null\r\n- Usage:The method executed before all cells are rendered. Internally, this method is added before `luckysheetDrawMain` renders the table.\r\n- Parameter: \r\n\t- {Object} [data]: Two-dimensional array data of the current worksheet\r\n\t- {Object} [sheet]: Current worksheet object\r\n\t- {Object} [ctx]: The context of the current canvas\r\n\r\n------------\r\n### rowTitleCellRenderBefore\r\n\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered before the row header cell is rendered, `return false` will not render the row header\r\n- Parameter: \r\n\t- {String} [rowNum]: Row number\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [r]: The row number of the cell\r\n\t\t+ {Number} [top]: The vertical coordinate of the upper left corner of the cell\r\n\t\t+ {Number} [width]: Cell width\r\n\t\t+ {Number} [height]: Cell height\r\n\t- {Object} [ctx]: The context of the current canvas\r\n\r\n------------\r\n### rowTitleCellRenderAfter\r\n\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered after the row header cell is rendered, `return false` will not render the row header\r\n- Parameter: \r\n\t- {String} [rowNum]: Row number\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [r]: The row number of the cell\r\n\t\t+ {Number} [top]: The vertical coordinate of the upper left corner of the cell\r\n\t\t+ {Number} [width]: Cell width\r\n\t\t+ {Number} [height]: Cell height\r\n\t- {Object} [ctx]: The context of the current canvas\r\n\r\n------------\r\n### columnTitleCellRenderBefore\r\n\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered before the column header cell is rendered, `return false` will not render the column header\r\n- Parameter: \r\n\t- {Object} [columnAbc]: Column header characters\r\n\t- {Object} [position]:\r\n\t\t- {Number} [c]: The column number of the cell\r\n\t\t- {Number} [left]: The horizontal coordinate of the upper left corner of the cell\r\n\t\t- {Number} [width]: Cell width\r\n\t\t- {Number} [height]: Cell height\r\n\t- {Object} [ctx]: The context of the current canvas\r\n\r\n------------\r\n### columnTitleCellRenderAfter\r\n\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered after the column header cell is rendered, `return false` will not render the column header\r\n- Parameter: \r\n\t- {Object} [columnAbc]: Column header characters\r\n\t- {Object} [position]:\r\n\t\t- {Number} [c]: The column number of the cell\r\n\t\t- {Number} [left]: The horizontal coordinate of the upper left corner of the cell\r\n\t\t- {Number} [width]: Cell width\r\n\t\t- {Number} [height]: Cell height\r\n\t- {Object} [ctx]: The context of the current canvas\r\n\r\n------------\r\n\r\n## Selected area\r\n\r\n### rangeSelect\r\n- Type: Function\r\n- Default: null\r\n- Usage: Frame selection or trigger after setting selection\r\n- Parameter: \r\n\t- {Object} [sheet]: Current worksheet object\r\n\t- {Object | Array} [range]: Selection area, may be multiple selection areas\r\n\r\n------------\r\n\r\n### rangeMoveBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before moving the selection, include a single cell\r\n- Parameter: \r\n\t- {Array} [range]: The current selection area, can only be a single selection area\r\n\r\n------------\r\n### rangeMoveAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After moving the selection, include a single cell\r\n- Parameter: \r\n\t- {Array} [oldRange]: The current selection range before moving, can only be a single selection\r\n\t- {Array} [newRange]: The current selection range after moving, can only be a single selection\r\n\r\n------------\r\n### rangeEditBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before the selection\r\n- Parameter: \r\n\t- {Object | Array} [range]: Selection area, may be multiple selection areas\r\n\t- {Object} [data]: Data corresponding to the selection area\r\n\r\n------------\r\n### rangeEditAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After the selection is modified\r\n- Parameter: \r\n\t- {Object | Array} [range]: Selection area, may be multiple selection areas\r\n    - {Object} [oldData]: Before modification, the data corresponding to the selection area\r\n    - {Object} [newData]: After modification, the data corresponding to the selection area\r\n\r\n------------\r\n### rangeCopyBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before copying selection\r\n- Parameter: \r\n\t- {Object | Array} [range]: Selection area, may be multiple selection areas\r\n\t- {Object} [data]: Data corresponding to the selection area\r\n\r\n------------\r\n### rangeCopyAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After copying selection\r\n- Parameter: \r\n\t- {Object | Array} [range]: Selection area, may be multiple selection areas\r\n\t- {Object} [data]: Data corresponding to the selection area\r\n\r\n------------\r\n### rangePasteBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before pasting the selection\r\n- Parameter: \r\n\t- {Object | Array} [range]: Selection area, may be multiple selection areas\r\n\t- {Object} [data]: The data corresponding to the selection area to be pasted\r\n\r\n------------\r\n### rangePasteAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After pasting the selection\r\n- Parameter: \r\n\t- {Object | Array} [range]: Selection area, may be multiple selection areas\r\n\t- {Object} [originData]: The data corresponding to the selection area to be pasted\r\n\t- {Object} [pasteData]: Data to paste\r\n\r\n------------\r\n### rangeCutBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before selection cut\r\n- Parameter: \r\n\t- {Array} [range]: Selection range, can only be a single range\r\n\t- {Object} [data]: The data corresponding to the selection area to be cut\r\n\r\n------------\r\n### rangeCutAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After selection cut\r\n- Parameter: \r\n\t- {Array} [range]: Selection range, can only be a single range\r\n\t- {Object} [data]: The data corresponding to the selection area to be cut\r\n\r\n------------\r\n### rangeDeleteBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before the selection is deleted\r\n- Parameter: \r\n\t- {Array} [range]: Selection range, can only be a single range\r\n\t- {Object} [data]: The data corresponding to the selection area to be deleted\r\n\r\n------------\r\n### rangeDeleteAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After the selection is deleted\r\n- Parameter: \r\n\t- {Array} [range]: Selection range, can only be a single range\r\n\t- {Object} [data]: The data corresponding to the selection area to be deleted\r\n\r\n------------\r\n### rangeClearBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before the selection is cleared\r\n- Parameter: \r\n\t- {Object | Array} [range]: Selection area, may be multiple selection areas\r\n\t- {Object} [data]: The data corresponding to the selection area to be cleared\r\n\r\n------------\r\n### rangeClearAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After the selection is cleared\r\n- Parameter: \r\n\t- {Object | Array} [range]: Selection area, may be multiple selection areas\r\n\t- {Object} [data]: The data corresponding to the selection area to be cleared\r\n\r\n------------\r\n### rangePullBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before selection drop down\r\n- Parameter: \r\n\t- {Array} [range]: The current selection range, can only be a single range\r\n\r\n------------\r\n### rangePullAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After selection drop down\r\n- Parameter: \r\n\t- {Array} [range]: The selection range after the drop-down can only be a single range\r\n\r\n------------\r\n\r\n## Worksheet\r\n\r\n### sheetCreatekBefore\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered before the worksheet is created, the new worksheet also includes the new pivot table\r\n\r\n------------\r\n### sheetCreateAfter\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered after the worksheet is created, the new worksheet also includes the new pivot table\r\n- Parameter: \r\n\t- {Object} [sheet]: The configuration of the newly created worksheet\r\n\r\n------------\r\n### sheetMoveBefore\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before the worksheet is moved\r\n- Parameter: \r\n\t- {Number} [i]: `index` of current worksheet\r\n\t- {Number} [order]: `Order` of current worksheet\r\n\r\n------------\r\n### sheetMoveAfter\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage: After the worksheet is moved\r\n- Parameter: \r\n\t- {Number} [i]: `index` of current worksheet\r\n\t- {Number} [oldOrder]: Before modification, the `order` of the current worksheet\r\n\t- {Number} [newOrder]: After modification, the `order` of the current worksheet\r\n\r\n------------\r\n### sheetDeleteBefore\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before the worksheet is deleted\r\n- Parameter: \r\n\t- {Object} [sheet]: Configuration of the worksheet to be deleted\r\n\r\n------------\r\n### sheetDeleteAfter\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage: After the worksheet is deleted\r\n- Parameter: \r\n\t- {Object} [sheet]: Configuration of deleted worksheet\r\n\r\n------------\r\n### sheetEditNameBefore\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before changing the name of the worksheet\r\n- Parameter: \r\n\t- {Number} [i]: `index` of current worksheet\r\n\t- {String} [name]: Current worksheet name\r\n\r\n------------\r\n### sheetEditNameAfter\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage: After changing the name of the worksheet\r\n- Parameter: \r\n\t- {Number} [i]: `index` of current worksheet\r\n\t- {String} [oldName]: Before modification, the current worksheet name\r\n\t- {String} [newName]: After modification, the current worksheet name\r\n\r\n------------\r\n### sheetEditColorBefore\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before changing the color of the worksheet\r\n- Parameter: \r\n\t- {Number} [i]: `index` of current worksheet\r\n\t- {String} [color]: Current worksheet color\r\n\r\n------------\r\n### sheetEditColorAfter\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage: After changing the color of the worksheet\r\n- Parameter: \r\n\t- {Number} [i]: `index` of current worksheet\r\n\t- {String} [oldColor]: Before modification, the current worksheet color\r\n\t- {String} [newColor]: After modification, the current worksheet color\r\n\r\n------------\r\n### sheetZoomBefore\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before worksheet zoom\r\n- Parameter: \r\n\t- {Number} [i]: `index` of current worksheet\r\n\t- {String} [zoom]: Current worksheet zoom ratio\r\n\r\n------------\r\n### sheetZoomAfter\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage: After worksheet zoom\r\n- Parameter: \r\n\t- {Number} [i]: `index` of current worksheet\r\n\t- {String} [oldZoom]: Before modification, the current worksheet zoom ratio\r\n\t- {String} [newZoom]: After modification, the current worksheet zoom ratio\r\n\r\n------------\r\n### sheetActivateBefore\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage：Before worksheet activate\r\n- Parameter：\r\n\t- {Number} [i]: `index` of current worksheet\r\n\r\n------------\r\n### sheetActivateAfter\r\n(TODO)\r\n- Type: Function\r\n- Default: null\r\n- Usage：After worksheet activate\r\n- Parameter：\r\n\t- {Number} [i]: `index` of current worksheet\r\n\r\n------------\r\n### sheetDeactivateBefore\r\n（TODO）\r\n- Type: Function\r\n- Default: null\r\n- Usage：Before the worksheet changes from active to inactive\r\n- Parameter：\r\n\t- {Number} [i]: `index` of current worksheet\r\n\r\n------------\r\n### sheetDeactivateAfter\r\n（TODO）\r\n- Type: Function\r\n- Default: null\r\n- Usage：After the worksheet is changed from active to inactive\r\n- Parameter：\r\n\t- {Number} [i]: `index` of current worksheet\r\n\r\n------------\r\n\r\n## Workbook\r\n\r\n### workbookCreateBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered before the worksheet is created. The old hook function is called `beforeCreateDom`\r\n- Parameter: \r\n\t- {Object} [book]:Configuration of the entire workbook (options)\r\n    \r\n------------\r\n### workbookCreateAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered after the workbook is created\r\n- Parameter: \r\n\t- {Object} [book]:Configuration of the entire workbook (options)\r\n     \r\n------------\r\n### workbookDestroyBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered before the workbook is destroyed\r\n- Parameter: \r\n\t- {Object} [book]:Configuration of the entire workbook (options)\r\n    \r\n------------\r\n### workbookDestroyAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: Triggered after the workbook is destroyed\r\n- Parameter: \r\n\t- {Object} [book]:Configuration of the entire workbook (options)\r\n    \r\n------------\r\n### updated\r\n- Type: Function\r\n- Default: null\r\n- Usage: The method executed after each operation is updated is executed after the canvas rendering, monitor changes in worksheet content, that is, every time the client performs a workbook operation, Luckysheet saves the operation in the history and triggers it. When undoing and redoing, it is also an operation, of course, the hook function will be triggered.\r\n- Parameter: \r\n\t- {Object} [operate]: The history information of this operation will have different history records according to different operations. Refer to the source code [History](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/controlHistory.js )\r\n    \r\n------------\r\n### resized\r\n- Type: Function\r\n- Default: null\r\n- Usage: After resize is executed\r\n- Parameter: \r\n\t- {Object} [size]: The width and height of the entire workbook area\r\n    \r\n------------\r\n\r\n## Cooperative\r\n\r\n### cooperativeMessage\r\n\r\n- Type：Function\r\n- Default：null\r\n- Usage：Receive the cooperation message, secondary development. Expanding cooperative message instruction set\r\n- Params:\r\n\t- {Object} : Receives the entire collaboration message body object sent by the server\r\n\r\n## Image\r\n\r\n### imageInsertBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before the picture is inserted\r\n- Parameter: \r\n\t- {Object} [url]: Picture address\r\n    \r\n------------\r\n### imageInsertAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After the picture is inserted\r\n- Parameter: \r\n\t- {Object} [item]]: Picture address, width and height, location and other information\r\n    \r\n------------\r\n### imageUpdateBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before the picture is modified, the modified content includes operations such as width and height, position, and cropping\r\n- Parameter: \r\n\t- {Object} [item]]: Picture address, width and height, location and other information\r\n    \r\n------------\r\n### imageUpdateAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After the picture is modified, the modified content includes operations such as width and height, position, and cropping\r\n- Parameter: \r\n\t- {Object} [oldItem]]: Before modification, the picture address, width and height, location and other information\r\n\t- {Object} [newItem]]: After modification, the picture address, width and height, location and other information\r\n    \r\n------------\r\n### imageDeleteBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before the picture is deleted\r\n- Parameter: \r\n\t- {Object} [item]]: Picture address, width and height, location and other information\r\n    \r\n------------\r\n### imageDeleteAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After the picture is deleted\r\n- Parameter: \r\n\t- {Object} [item]]: Picture address, width and height, location and other information\r\n    \r\n------------\r\n\r\n## Comment\r\n\r\n### commentInsertBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before inserting comments\r\n- Parameter: \r\n\t- {Object} [cell]: The cell information of the comment to be inserted, such as:`{ r:0,c:2,v:{m:'233',v:'233'}}`\r\n\r\n------------\r\n### commentInsertAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After inserting comments\r\n- Parameter: \r\n\t- {Object} [cell]: The cell information where the comment is inserted, such as:`{ r:0,c:2,v:{m:'233',v:'233'}}`, contains comment information\r\n    \r\n------------\r\n### commentDeleteBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before deleting comments\r\n- Parameter: \r\n\t- {Object} [cell]: The cell information of the comment to be deleted, such as:`{ r:0,c:2,v:{m:'233',v:'233'}}`\r\n\r\n------------\r\n### commentDeleteAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After deleting the comment\r\n- Parameter: \r\n\t- {Object} [cell]: The cell information of the deleted comment, such as:`{ r:0,c:2,v:{m:'233',v:'233'}}`\r\n    \r\n------------\r\n### commentUpdateBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before modifying comments\r\n- Parameter: \r\n\t- {Object} [cell]: The cell information of the comment, such as:`{ r:0,c:2,v:{m:'233',v:'233'}}`\r\n\r\n------------\r\n### commentUpdateAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After modifying the comment\r\n- Parameter: \r\n\t- {Object} [oldCell]: Before modification, the cell information where the comment is located, such as:`{ r:0,c:2,v:{m:'233',v:'233'}}`\r\n\t- {Object} [newCell]: After modification, the cell information where the comment is located, such as:`{ r:0,c:2,v:{m:'233',v:'233'}}`\r\n    \r\n------------\r\n\r\n## Pivot table\r\n\r\n### pivotTableEditBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before modifying the PivotTable, operations such as dragging fields, etc.\r\n- Parameter: \r\n\t- {Object} [sheet]: Worksheet configuration where the pivot table is located\r\n\r\n------------\r\n### pivotTableEditAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After modifying the PivotTable, operations such as dragging fields, etc.\r\n- Parameter: \r\n\t- {Object} [oldSheet]: Before modification, the worksheet configuration where the pivot table is located\r\n\t- {Object} [newSheet]: After modification, the worksheet configuration where the pivot table is located\r\n    \r\n------------\r\n\r\n## Freeze\r\n\r\n### frozenCreateBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before setting freeze\r\n- Parameter: \r\n\t- {Object} [frozen]: Freeze type information\r\n\r\n------------\r\n### frozenCreateAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After setting freeze\r\n- Parameter: \r\n\t- {Object} [frozen]: Freeze type information\r\n    \r\n------------\r\n### frozenCancelBefore\r\n- Type: Function\r\n- Default: null\r\n- Usage: Before unfreezing\r\n- Parameter: \r\n\t- {Object} [frozen]: Freeze type information\r\n\r\n------------\r\n### frozenCancelAfter\r\n- Type: Function\r\n- Default: null\r\n- Usage: After unfreezing\r\n- Parameter: \r\n\t- {Object} [frozen]: Freeze type information\r\n    \r\n------------\r\n\r\n#### Legacy Hook Function\r\n\r\n### fireMousedown\r\n- Type: Function\r\n- Default: null\r\n- Usage: Customized method of drilling down cell data, note that this hook function is mounted under options: `options.fireMousedown`\r\n\r\n------------\r\n\r\n## Pager\r\n\r\n### onTogglePager\r\n\r\n- Type: Function\r\n- Default: null\r\n- Usage: Click the page button to call back the function, return the current page number, refer to [sPage backFun](https://github.com/jvbei/sPage)\r\n- Parameter:\r\n\t- {Object} [page]: Return the current page object\r\n\r\n------------\r\n"
  },
  {
    "path": "docs/guide/contribute.md",
    "content": "\r\n# Contribution guide  \r\n\r\nwelcome! We are very happy that you are here and look forward to your interest in participating in Luckysheet contributions. Of course, before you participate in the Luckysheet contribution, please make sure to read the following full text:\r\n\r\n## Our code of conduct\r\n\r\n1. We promise to respect all those who participated in the contribution, not limited to those who raised questions, contributed documents and code, resolved bugs and other contributions;\r\n\r\n2. We are obliged to abide by local laws and regulations, and we reject all behaviors with legal risks;\r\n3. We oppose any participant's derogatory comments, personal attacks, harassment or insult to others, and other non-professional behaviors;\r\n4. We have the right and responsibility to delete or edit content that does not comply with this code of conduct, not limited to code, issues, wikis, documents and others. Participants who do not comply with the code of conduct may be removed from the team;\r\n5. We accept the supervision of anyone, and anyone can report to us the facts that are found to be inconsistent with this code of conduct through problem feedback.\r\n\r\n## How to participate in contributing?\r\n\r\n* Contributed documents: Browsing the document can deepen your understanding of Luckysheet. Once you find that the document is not clearly written or the logic is confusing, you can correct, modify, and supplement. You can go to [Google Forum](https://groups.google.com/g/luckysheet) to give feedback\r\n* Contributing code: Welcome everyone to contribute code to the Luckysheet community, you are welcome to claim the Open state [Issues](https://github.com/mengshukeji/Luckysheet/issues) and unfinished features, submit a PR, and become one of the contributors If you find that some functions cannot meet your needs or have problems during use, please record in Issues\r\n* Participate in the issue discussion: you can post your suggestions under any [Issues](https://github.com/mengshukeji/Luckysheet/issues)\r\n* Review code: You can see PR submitted by all contributors on [Github](https://github.com/mengshukeji/Luckysheet), you can review their code and post your suggestions\r\n\r\n## How to submit issues\r\n\r\nBefore you submit features/improvements, you should pay attention to the following points:\r\n\r\n* Please confirm whether the feature/improvement has been submitted by others\r\n* An easy-to-understand title to explain the bug/submission feature/improvement you submitted\r\n* If it is a bug, describe the cause of the bug in detail. If it can be reproduced, please try to provide complete reproduction steps\r\n* If it is a feature, then the feature should have wide applicability, suitable for most users, and it is best to provide detailed design documents\r\n* If it is an improvement, describe the benefits of this improvement as clearly as possible\r\n\r\nSpecific steps:\r\n\r\n* Create [Issues](https://github.com/mengshukeji/Luckysheet/issues) and describe the issue clearly\r\n* If you want to solve the issue, assign the issue to your own name. If you just submit a bug/feature/improvement and don’t have time to contribute code, set assignne to empty\r\n* If it is a relatively large feature/improvement, try to output the design document first and follow the [Luckysheet RFC](https://github.com/mengshukeji/Luckysheet-rfcs) process for others to review\r\n\r\n## How to claim Issues\r\n\r\nIn Luckysheet's [Issues](https://github.com/mengshukeji/Luckysheet/issues) list, there are many issues created by others that have not been repaired. If you are interested, you can claim these issues. The steps to claim are as follows:\r\n\r\n* Leave a message under the issue, express the idea of claiming the task, and specify **@I can solve it**\r\n* If the submitter has no comments, assign the issue to your own name and update the progress in time\r\n* If it is a relatively large feature, try to output the design document first and follow the [Luckysheet RFC](https://github.com/mengshukeji/Luckysheet-rfcs) process for others to review\r\n* Develop the code and submit the code to github\r\n\r\n## How to submit code\r\n\r\n1. Fork to own warehouse\r\n\r\nGo to the Github page of [Luckysheet](https://github.com/mengshukeji/Luckysheet), and click the Fork button in the upper right corner to proceed.\r\n\r\n2. Git clone to local\r\n\r\n```shell\r\ngit clone https://github.com/<your_github_name>/Luckysheet.git\r\n```\r\n\r\n3. Establish a connection upstream\r\n\r\n```shell\r\n\r\ncd Luckysheet\r\ngitremote add upstream https://github.com/mengshukeji/Luckysheet.git\r\n```\r\n    \r\n4. Create a development branch\r\n\r\n```shell\r\ngit checkout -b dev\r\n```\r\n\r\n5. Modify the submission code\r\n\r\n```shell\r\ngit add.\r\nnpm run commit\r\ngit push origin dev\r\n```\r\n\r\n6. Sync code, synchronize the latest code to the local\r\n\r\n```shell\r\ngit fetch upstream\r\ngit rebase upstream/master\r\n```\r\n\r\n7. If there is a conflict (nothing can be ignored)\r\n\r\n```shell\r\ngit status # View conflict files and modify conflicts\r\ngit add.\r\ngit rebase --continue\r\n```\r\nWhen submitting the git rebase --continue command, if vim prompts to edit the commit information, you can add your changes, then save and exit\r\n> For vim commands, please refer to the [vim](https://www.runoob.com/linux/linux-vim.html) \r\n\r\n8. Submit branch code\r\n\r\n```shell\r\ngit push origin dev\r\n```\r\n\r\nIf you are prompted to pull first, you can pull it before submitting\r\n```shell\r\ngit pull origin dev\r\ngit push origin dev\r\n```\r\nIf the vim prompt to edit the commit information pops up, you can exit directly through the vim command\r\n> For vim commands, please refer to [vim](https://www.runoob.com/linux/linux-vim.html)\r\n\r\n9. Submit pr\r\nGo to the fork project in your github warehouse, switch to the branch you just created and modified, click new pull request, and add the corresponding description, and finally click Create pull request to submit\r\n    \r\n## Code Specification\r\n\r\n> General code specification example\r\n\r\n* Keep the block depth to a minimum. Avoid nested If conditions as much as possible\r\n```js\r\n// CORRECT\r\nif (!comparison) return\r\n\r\nif (variable) {\r\n  for (const item of items) {}\r\n} else if (variable2) {\r\n  // Do something here\r\n}\r\n\r\n// INCORRECT\r\nif (comparison) {\r\n  if (variable) {\r\n    for (const item in items) {}\r\n  } else if (variable2) {\r\n    // Do something here\r\n  }\r\n} else {\r\n  return\r\n}\r\n```\r\n\r\n* Do not use operands for chain comparison\r\n```js\r\n// CORRECT\r\n\r\nif (cb) cb()\r\nif (!cb || (cb === fn)) cb()\r\n\r\n// INCORRECT\r\n\r\ncb && cb()\r\n(!cb || (cb === fn)) && cb()\r\n```\r\n\r\n* All variables should be declared at the beginning of the block in alphabetical order\r\n```js\r\n// CORRECT\r\nfunction foo () {\r\n  const foo ='bar'\r\n  const bar ='foo'\r\n\r\n        if (conditional) {}\r\n\r\n  ...\r\n\r\n  return foo\r\n}\r\n\r\n// INCORRECT\r\n\r\nfunction foo () {\r\n  const foo ='bar'\r\n\r\n        if (conditional) {}\r\n\r\n  const bar ='foo'\r\n\r\n  ...\r\n\r\n  return foo\r\n}\r\n```\r\n\r\n* Return as soon as possible\r\n```js\r\n// CORRECT\r\nif (condition) return'foo'\r\nif (condition2) return'bar'\r\n// Return must have a blank line above\r\nreturn'fizz'\r\n\r\n// INCORRECT\r\nconst variable =''\r\n\r\nif (condition) {\r\n  variable ='foo'\r\n} else if (condition2) {\r\n  variable ='bar'\r\n} else {\r\n  variable ='fizz'\r\n}\r\n\r\nreturn variable\r\n```\r\n\r\n## How to contribute documents\r\n\r\n## How to become Luckysheet Committer\r\n\r\nAs long as anyone contributes to the Luckysheet project, you are the officially recognized Contributor of the Luckysheet project. There is no exact standard for growing from Contributor to Committer, and there is no expected timetable, but Committer candidates are generally A long-term active contributor, becoming Committer does not require a huge architectural improvement contribution, or how many lines of code contributions, contributing code, contributing documents, participating in mailing list discussions, helping to answer questions, etc., are all ways to increase their influence .\r\n\r\nList of potential contributions (in no particular order):\r\n\r\n* Submit the bugs, features, and improvements you found to the issue\r\n* Update the official documents so that the project documents are the most recent, the best practices for writing Luckysheet, and various useful documents for the users\r\n* Perform test and report test results, performance test and other MQ performance comparison test, etc.\r\n* Review the work of others (including code and non-code) and publish your own suggestions\r\n* Guide new contributors and be familiar with the community process\r\n* Post a blog about Luckysheet\r\n* Any contribution to the development of the Luckysheet community\r\n* ......\r\n"
  },
  {
    "path": "docs/guide/data.md",
    "content": "# Table Data\r\n\r\n## Get table data\r\n\r\n- **Configuration**：\r\n\r\n    Configure the address of `updateUrl`, Luckysheet will request the table data through ajax. By default, all `data` in the sheet data with status 1 is loaded, and the rest of the sheet loads all fields except the `data` field.\r\n\r\n- **Format**：\r\n    Through the global method `luckysheet.getluckysheetfile()`, the configuration information of all worksheets can be obtained.\r\n\r\n    The luckysheetfile example is as follows:\r\n    ```json\r\n    [\r\n        {\r\n            \"name\": \"Cell\", //Worksheet name\r\n            \"color\": \"\", //Worksheet color\r\n            \"index\": \"0\", //Worksheet index\r\n            \"status\": \"1\", //Activation status\r\n            \"order\": \"0\", //The order of the worksheet\r\n            \"hide\": 0,//whether to hide\r\n            \"row\": 36, //number of rows\r\n            \"column\": 18, //Number of columns\r\n            \"config\": {\r\n                \"merge\":{}, //merged cells\r\n                \"rowlen\":{}, //Table row height\r\n                \"columnlen\":{}, //Table column width\r\n                \"rowhidden\":{}, //hidden rows\r\n                \"colhidden\":{}, //hidden columns\r\n                \"borderInfo\":{}, //borders\r\n            },\r\n            \"celldata\": [], //initialize the cell data\r\n            \"data\": [], //Update and store the cell data \r\n            \"scrollLeft\": 0, //Left and right scroll bar position\r\n            \"scrollTop\": 315, //Up and down scroll bar position\r\n            \"luckysheet_select_save\": [], //selected area\r\n            \"luckysheet_conditionformat_save\": {},//Conditional format\r\n            \"calcChain\": [],//Formula chain\r\n            \"isPivotTable\":false,//Whether to pivot table\r\n            \"pivotTable\":{},//Pivot table configuration\r\n            \"filter_select\": null,//Filter range\r\n            \"filter\": null,//Filter configuration\r\n            \"luckysheet_alternateformat_save\": [], //Alternate colors\r\n            \"luckysheet_alternateformat_save_modelCustom\": [], //Customize alternate colors\r\n            \"chart\": [], //Chart configuration\r\n            \"visibledatarow\": [], //The position of all rows\r\n            \"visibledatacolumn\": [], //The position of all columns\r\n            \"ch_width\": 2322, //The width of the worksheet area\r\n            \"rh_height\": 949, //The height of the worksheet area\r\n        },\r\n        {\r\n            \"name\": \"Sheet2\",\r\n            \"color\": \"\",\r\n            \"status\": \"0\",\r\n            \"order\": \"1\",\r\n            \"data\": [],\r\n            \"config\": {},\r\n            \"index\": 1\r\n        },\r\n        {\r\n            \"name\": \"Sheet3\",\r\n            \"color\": \"\",\r\n            \"status\": \"0\",\r\n            \"order\": \"2\",\r\n            \"data\": [],\r\n            \"config\": {},\r\n            \"index\": 2\r\n        }\r\n    ]\r\n    ```\r\n- **Explanation**：\r\n           \r\n    ## name\r\n    - Type：String\r\n    - Default：\"Sheet1\"\r\n    - Usage：Worksheet name\r\n    \r\n    ------------\r\n    ## color\r\n    - Type：String\r\n    - Default：\"##f20e0e\"\r\n    - Usage：Worksheet color, there will be a bottom border under the worksheet name\r\n    \r\n    ------------\r\n    ## index\r\n    - Type：Number\r\n    - Default：0\r\n    - Usage：Worksheet index, starting from 0\r\n    \r\n    ------------\r\n    ## status\r\n    - Type：Number\r\n    - Default：1\r\n    - Usage：Active state, there is only one active worksheet which number will be 1 and the other worksheets are 0\r\n    \r\n    ------------\r\n    ## order\r\n    - Type：Number\r\n    - Default：0\r\n    - Usage： The index of the worksheets is starting from 0. it will increase when a worksheet is added.\r\n    \r\n    ------------\r\n    ## hide\r\n    - Type：Number\r\n    - Default：0\r\n    - Usage： Whether to hide, `0` means not to hide, `1` means to hide\r\n\r\n    ------------\r\n    ## row\r\n    - Type：Number\r\n    - Default：36\r\n    - Usage： The number of cell rows\r\n    \r\n    ------------\r\n    ## column\r\n    - Type：Number\r\n    - Default：18\r\n    - Usage： The number of cell columns\r\n    \r\n    ------------\r\n    ## scrollLeft\r\n    - Type：Number\r\n    - Default：0\r\n    - Usage： Left and right scroll bar position\r\n    \r\n    ------------\r\n    ## scrollTop\r\n    - Type：Number\r\n    - Default：0\r\n    - Usage： Up and down scroll bar position\r\n\r\n    ------------\r\n    ## config\r\n    - Type: Object\r\n    - Default: {}\r\n    - Usage: Table row height, column width, merged cells, borders, hidden rows and other settings\r\n\r\n    ### config.merge\r\n    - Type：Object\r\n    - Default：{}\r\n    - Usage：Merge cell settings\r\n    - example:\r\n        ```js\r\n        {\r\n                \"13_5\": {\r\n                    \"r\": 13,\r\n                    \"c\": 5,\r\n                    \"rs\": 3,\r\n                    \"cs\": 1\r\n                },\r\n                \"13_7\": {\r\n                    \"r\": 13,\r\n                    \"c\": 7,\r\n                    \"rs\": 3,\r\n                    \"cs\": 2\r\n                },\r\n                \"14_2\": {\r\n                    \"r\": 14,\r\n                    \"c\": 2,\r\n                    \"rs\": 1,\r\n                    \"cs\": 2\r\n                }\r\n            }\r\n        ```\r\n    The `key` in the object is the spliced value of `r +'_' + c`, and the `value` is the cell information in the upper left corner: r: number of rows, c: number of columns, rs: number of merged rows, cs: merge Number of columns\r\n\r\n    ### config.rowlen\r\n    - Type：Object\r\n    - Default：{}\r\n    - Usage：The row height of each cell \r\n    - example:\r\n        ```js\r\n        \"rowlen\": {\r\n                    \"0\": 20,\r\n                    \"1\": 20,\r\n                    \"2\": 20\r\n                }\r\n        ```\r\n\r\n    ### config.columnlen\r\n    - Type：Object\r\n    - Default：{}\r\n    - Usage：The column width of each cell\r\n    -  example:\r\n        ```js\r\n        \"columnlen\": {\r\n                    \"0\": 97,\r\n                    \"1\": 115,\r\n                    \"2\": 128\r\n                }\r\n        ```\r\n    \r\n    ### config.rowhidden\r\n    - Type：Object\r\n    - Default：{}\r\n    - Usage：Hidden row information, Rows：`rowhidden[Rows]: 0`,\r\n        \r\n        you should specify the number of rows by `key`,`value` is always `0`\r\n    - example:\r\n        ```js\r\n        \"rowhidden\": {\r\n                    \"30\": 0,\r\n                    \"31\": 0\r\n                }\r\n        ```\r\n        \r\n    ### config.colhidden\r\n    - Type：Object\r\n    - Default：{}\r\n    - Usage：Hidden column information, Columns：`colhidden[Columns]: 0`,\r\n        \r\n        `key` specify the number of columns,`value` is always `0`\r\n    - example:\r\n        ```js\r\n        \"colhidden\": {\r\n                    \"30\": 0,\r\n                    \"31\": 0\r\n                }\r\n        ```\r\n\r\n    ### config.borderInfo\r\n    - Type：Array\r\n    - Default：{}\r\n    - Usage：The border information of the cell\r\n    - example:\r\n        ```js\r\n        \"borderInfo\": [{\r\n                        \"rangeType\": \"cell\",\r\n                        \"value\": {\r\n                            \"row_index\": 3,\r\n                            \"col_index\": 3,\r\n                            \"l\": {\r\n                                \"style\": 10,\r\n                                \"color\": \"rgb(255, 0, 0)\"\r\n                            },\r\n                            \"r\": {\r\n                                \"style\": 10,\r\n                                \"color\": \"rgb(255, 0, 0)\"\r\n                            },\r\n                            \"t\": {\r\n                                \"style\": 10,\r\n                                \"color\": \"rgb(255, 0, 0)\"\r\n                            },\r\n                            \"b\": {\r\n                                \"style\": 10,\r\n                                \"color\": \"rgb(255, 0, 0)\"\r\n                            }\r\n                        }\r\n                    },\r\n                    {\r\n                        \"rangeType\": \"range\",\r\n                        \"borderType\": \"border-all\",\r\n                        \"style\": \"3\",\r\n                        \"color\": \"#0000ff\",\r\n                        \"range\": [{\r\n                            \"row\": [7, 8],\r\n                            \"column\": [2, 3]\r\n                        }]\r\n                    }, {\r\n                        \"rangeType\": \"range\",\r\n                        \"borderType\": \"border-inside\",\r\n                        \"style\": \"3\",\r\n                        \"color\": \"#0000ff\",\r\n                        \"range\": [{\r\n                            \"row\": [7, 8],\r\n                            \"column\": [8, 9]\r\n                        }]\r\n                    }]\r\n        ```\r\n    The range type can be divided into single cell and selected area\r\n    1. selection `rangeType: \"range\"`\r\n\r\n       + Border type `borderType：\"border-left\" | \"border-right\" | \"border-top\" | \"border-bottom\" | \"border-all\" | \"border-outside\" | \"border-inside\" | \"border-horizontal\" | \"border-vertical\" | \"border-none\"`,\r\n       + Border thickness `style:  1 Thin | 2 Hair | 3 Dotted | 4 Dashed | 5 DashDot | 6 DashDotDot | 7 Double | 8 Medium | 9 MediumDashed | 10 MediumDashDot | 11 MediumDashDotDot | 12 SlantedDashDot | 13 Thick`\r\n       + Border color `color: Hexadecimal color value`\r\n       + Selection area `range: Row and column information array`\r\n    \r\n    2. Single cell `rangeType：\"cell\"` \r\n       + Number of rows and columns `value.row_index: number,value.col_index: number`\r\n       + Four border objects `value.l:Left border,value.r:Right border,value.t:Top border,value.b:Bottom border`\r\n       + Border thickness `value.l.style: 1 Thin | 2 Hair | 3 Dotted | 4 Dashed | 5 DashDot | 6 DashDotDot | 7 Double | 8 Medium | 9 MediumDashed | 10 MediumDashDot | 11 MediumDashDotDot | 12 SlantedDashDot | 13 Thick`\r\n       + Border color `value.l.color: Hexadecimal color value`\r\n\r\n    - 示例\r\n      + ```js\r\n        {\r\n            \"rangeType\": \"range\",\r\n            \"borderType\": \"border-all\",\r\n            \"style\": \"3\",\r\n            \"color\": \"#0000ff\",\r\n            \"range\": [{\r\n                \"row\": [7, 8],\r\n                \"column\": [2, 3]\r\n            }]\r\n        }\r\n        ```\r\n        Represents a selection with a setting range of `{\"row\": [7, 8], \"column\": [2, 3]}`, the type is all borders, the border thickness is `Dotted`, and the color is `\"#0000ff\"`\r\n\r\n      + ```js\r\n         {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 3,\r\n                    \"col_index\": 3,\r\n                    \"l\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n         }\r\n         ```\r\n         Means to set the cell `\"D4\"`, the upper border/lower border/left border/right border are all border thicknesses `\"MediumDashDot\"`, color is `\"rgb(255, 0, 0)\"`\r\n\r\n    ------------\r\n    ## celldata\r\n    - Type：Array\r\n    - Default：[]\r\n    - Usage： The original cell data set is a set containing `{r:0,c:0,v:{m:\"value\",v:\"value\",ct: {fa: \"General\", t: \"g\"}} }`The one-dimensional array of format cell information is only used during initialization. After the table is initialized with celldata, the data is converted to the same level field data in the luckysheetfile, such as `luckysheetfile[0].data`, the subsequent operation of the table Data update will be updated to this data field, and celldata is no longer used. Example:\r\n    ```js\r\n    [{\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\tct: {fa: \"General\", t: \"g\"},\r\n\t\t\tm:\"value1\",\r\n\t\t\tv:\"value1\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\tct: {fa: \"General\", t: \"g\"},\r\n\t\t\tm:\"value2\",\r\n\t\t\tv:\"value2\"\r\n\t\t}\r\n\t}]\r\n    ```\r\n\r\n    ------------\r\n    ## luckysheet_select_save\r\n    - Type：Array\r\n    - Default：[]\r\n    - Usage： The selected area supports multiple selections and is a one-dimensional array containing multiple selection objects. Example:\r\n    ```js\r\n    [\r\n        {\r\n            \"left\": 0,\r\n            \"width\": 97,\r\n            \"top\": 0,\r\n            \"height\": 20,\r\n            \"left_move\": 0,\r\n            \"width_move\": 97,\r\n            \"top_move\": 0,\r\n            \"height_move\": 41,\r\n            \"row\": [ 0, 1 ],\r\n            \"column\": [ 0, 0 ],\r\n            \"row_focus\": 0,\r\n            \"column_focus\": 0\r\n        },\r\n        {\r\n            \"left\": 98,\r\n            \"width\": 73,\r\n            \"top\": 63,\r\n            \"height\": 20,\r\n            \"left_move\": 98,\r\n            \"width_move\": 189,\r\n            \"top_move\": 63,\r\n            \"height_move\": 41,\r\n            \"row\": [ 3, 4 ],\r\n            \"column\": [ 1, 2 ],\r\n            \"row_focus\": 3,\r\n            \"column_focus\": 1\r\n        },\r\n        {\r\n            \"left\": 288,\r\n            \"width\": 128,\r\n            \"top\": 21,\r\n            \"height\": 20,\r\n            \"left_move\": 288,\r\n            \"width_move\": 128,\r\n            \"top_move\": 21,\r\n            \"height_move\": 62,\r\n            \"row\": [ 1, 3 ],\r\n            \"column\": [ 3, 3 ],\r\n            \"row_focus\": 1,\r\n            \"column_focus\": 3\r\n        }\r\n    ]\r\n    ```\r\n\r\n    ------------\r\n    ## luckysheet_conditionformat_save\r\n    - Type：Array\r\n    - Default：[]\r\n    - Usage： Conditional format configuration information, a one-dimensional array containing multiple conditional format configuration objects,\r\n    \r\n    type: \"default\": Highlight cell rules and project selection rules,\r\n\r\n    \"dataBar\": Data bar,\r\n    \r\n    \"icons\": Icon set,\r\n    \r\n    \"colorGradation\": Color scale\r\n\r\n    Example:\r\n    ```js\r\n    [\r\n        {\r\n            \"type\": \"default\",\r\n            \"cellrange\": [\r\n                {\r\n                    \"row\": [ 2, 7 ],\r\n                    \"column\": [ 2, 2 ]\r\n                }\r\n            ],\r\n            \"format\": {\r\n                \"textColor\": \"#000000\",\r\n                \"cellColor\": \"#ff0000\"\r\n            },\r\n            \"conditionName\": \"betweenness\",\r\n            \"conditionRange\": [\r\n                {\r\n                    \"row\": [ 4, 4 ],\r\n                    \"column\": [ 2, 2 ]\r\n                },\r\n                {\r\n                    \"row\": [ 6, 6 ],\r\n                    \"column\": [ 2, 2 ]\r\n                }\r\n            ],\r\n            \"conditionValue\": [ 2, 4\r\n            ]\r\n        },\r\n        {\r\n            \"type\": \"dataBar\",\r\n            \"cellrange\": [\r\n                {\r\n                    \"row\": [ 10, 15 ],\r\n                    \"column\": [ 10, 11 ]\r\n                }\r\n            ],\r\n            \"format\": [\r\n                \"#6aa84f\",\r\n                \"#ffffff\"\r\n            ]\r\n        },\r\n        {\r\n            \"type\": \"icons\",\r\n            \"cellrange\": [\r\n                {\r\n                    \"row\": [ 19, 23 ],\r\n                    \"column\": [ 2, 2 ]\r\n                }\r\n            ],\r\n            \"format\": {\r\n                \"len\": \"3\",\r\n                \"leftMin\": \"0\",\r\n                \"top\": \"0\"\r\n            }\r\n        },\r\n        {\r\n            \"type\": \"colorGradation\",\r\n            \"cellrange\": [\r\n                {\r\n                    \"left\": 422,\r\n                    \"width\": 100,\r\n                    \"top\": 210,\r\n                    \"height\": 20,\r\n                    \"left_move\": 422,\r\n                    \"width_move\": 100,\r\n                    \"top_move\": 210,\r\n                    \"height_move\": 125,\r\n                    \"row\": [ 10, 15 ],\r\n                    \"column\": [ 6, 6 ],\r\n                    \"row_focus\": 10,\r\n                    \"column_focus\": 6\r\n                }\r\n            ],\r\n            \"format\": [\r\n                \"rgb(99, 190, 123)\",\r\n                \"rgb(255, 235, 132)\",\r\n                \"rgb(248, 105, 107)\"\r\n            ]\r\n        }\r\n    ]\r\n    ```\r\n        \r\n    ------------\r\n    ## calcChain\r\n    - Type：Array\r\n    - Default：[]\r\n    - Usage：Formula chain, used when the cell linked by the formula is changed, all formulas referencing this cell will be refreshed, example:\r\n    ```js\r\n    [{\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 3,\r\n\t\t\"index\": 1,\r\n\t\t\"func\": [true, 23.75, \"=AVERAGE(D3:D6)\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 3,\r\n\t\t\"index\": 1,\r\n\t\t\"func\": [true, 30, \"=MAX(D3:D6)\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}]\r\n    ```\r\n    \r\n    ------------\r\n    ## isPivotTable\r\n    - Type：Boolean\r\n    - Default：false\r\n    - Usage： Whether PivotTable\r\n    \r\n    ------------\r\n    ## pivotTable\r\n    - Type：Object\r\n    - Default：{}\r\n    - Usage： Pivot table settings, example:\r\n    ```js\r\n    {\r\n\t\t\"pivot_select_save\": {\r\n\t\t\t\"left\": 0,\r\n\t\t\t\"width\": 73,\r\n\t\t\t\"top\": 0,\r\n\t\t\t\"height\": 19,\r\n\t\t\t\"left_move\": 0,\r\n\t\t\t\"width_move\": 369,\r\n\t\t\t\"top_move\": 0,\r\n\t\t\t\"height_move\": 259,\r\n\t\t\t\"row\": [0, 12],\r\n\t\t\t\"column\": [0, 4],\r\n\t\t\t\"row_focus\": 0,\r\n\t\t\t\"column_focus\": 0\r\n\t\t},\r\n\t\t\"pivotDataSheetIndex\": 6, //The sheet index where the source data is located\r\n\t\t\"column\": [{\r\n\t\t\t\"index\": 3,\r\n\t\t\t\"name\": \"subject\",\r\n\t\t\t\"fullname\": \"subject\"\r\n\t\t}],\r\n\t\t\"row\": [{\r\n\t\t\t\"index\": 1,\r\n\t\t\t\"name\": \"student\",\r\n\t\t\t\"fullname\": \"student\"\r\n\t\t}],\r\n\t\t\"filter\": [],\r\n\t\t\"values\": [{\r\n\t\t\t\"index\": 4,\r\n\t\t\t\"name\": \"score\",\r\n\t\t\t\"fullname\": \"count:score\",\r\n\t\t\t\"sumtype\": \"COUNTA\",\r\n\t\t\t\"nameindex\": 0\r\n\t\t}],\r\n\t\t\"showType\": \"column\",\r\n\t\t\"pivotDatas\": [\r\n\t\t\t[\"count:score\", \"science\", \"mathematics\", \"foreign language\", \"English\", \"total\"],\r\n\t\t\t[\"Alex\", 1, 1, 1, 1, 4],\r\n\t\t\t[\"Joy\", 1, 1, 1, 1, 4],\r\n\t\t\t[\"Tim\", 1, 1, 1, 1, 4],\r\n\t\t\t[\"total\", 3, 3, 3, 3, 12]\r\n\t\t],\r\n\t\t\"drawPivotTable\": false,\r\n\t\t\"pivotTableBoundary\": [5, 6]\r\n\t}\r\n    ```\r\n    \r\n    ------------\r\n    ## filter_select\r\n    - Type：Object\r\n    - Default：{}\r\n    - Usage：Filter range, a selection area, a sheet has only one filter range, similar to the `luckysheet_select_save` example:\r\n    ```js\r\n    {\r\n        \"left\": 74,\r\n        \"width\": 73,\r\n        \"top\": 40,\r\n        \"height\": 19,\r\n        \"left_move\": 74,\r\n        \"width_move\": 221,\r\n        \"top_move\": 40,\r\n        \"height_move\": 99,\r\n        \"row\": [\r\n            2,\r\n            6\r\n        ],\r\n        \"column\": [\r\n            1,\r\n            3\r\n        ],\r\n        \"row_focus\": 2,\r\n        \"column_focus\": 1\r\n    }\r\n    ```\r\n    \r\n    ------------\r\n    ## filter\r\n    - Type：Object\r\n    - Default：{}\r\n    - Usage： Specific settings for filtering, examples:\r\n    ```js\r\n    {\r\n        \"0\": {\r\n            \"caljs\": {},\r\n            \"rowhidden\": {\r\n                \"3\": 0,\r\n                \"4\": 0\r\n            },\r\n            \"optionstate\": true,\r\n            \"str\": 2,\r\n            \"edr\": 6,\r\n            \"cindex\": 1,\r\n            \"stc\": 1,\r\n            \"edc\": 3\r\n        },\r\n        \"1\": {\r\n            \"caljs\": {},\r\n            \"rowhidden\": {\r\n                \"6\": 0\r\n            },\r\n            \"optionstate\": true,\r\n            \"str\": 2,\r\n            \"edr\": 6,\r\n            \"cindex\": 2,\r\n            \"stc\": 1,\r\n            \"edc\": 3\r\n        }\r\n    }\r\n    ```\r\n    \r\n    ------------\r\n    ## luckysheet_alternateformat_save\r\n    - Type：Array\r\n    - Default：[]\r\n    - Usage： Alternating color configuration, example:\r\n    ```js\r\n    [{\r\n\t\t\"cellrange\": {\r\n\t\t\t\"row\": [1, 6],\r\n\t\t\t\"column\": [1, 5]\r\n\t\t},\r\n\t\t\"format\": {\r\n\t\t\t\"head\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#5ed593\"\r\n\t\t\t},\r\n\t\t\t\"one\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#ffffff\"\r\n\t\t\t},\r\n\t\t\t\"two\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#e5fbee\"\r\n\t\t\t},\r\n\t\t\t\"foot\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#a5efcc\"\r\n\t\t\t}\r\n\t\t},\r\n\t\t\"hasRowHeader\": false,\r\n\t\t\"hasRowFooter\": false\r\n\t}, {\r\n\t\t\"cellrange\": {\r\n\t\t\t\"row\": [1, 6],\r\n\t\t\t\"column\": [8, 12]\r\n\t\t},\r\n\t\t\"format\": {\r\n\t\t\t\"head\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#5599fc\"\r\n\t\t\t},\r\n\t\t\t\"one\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#ffffff\"\r\n\t\t\t},\r\n\t\t\t\"two\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#ecf2fe\"\r\n\t\t\t},\r\n\t\t\t\"foot\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#afcbfa\"\r\n\t\t\t}\r\n\t\t},\r\n\t\t\"hasRowHeader\": false,\r\n\t\t\"hasRowFooter\": false\r\n\t}]\r\n    ```\r\n    \r\n    ------------\r\n    ## luckysheet_alternateformat_save_modelCustom\r\n    - Type：Array\r\n    - Default：[]\r\n    - Usage：Custom alternate colors, including multiple custom alternate colors configuration, example:\r\n    ```js\r\n    [{\r\n\t\t\"head\": {\r\n\t\t\t\"fc\": \"#6aa84f\",\r\n\t\t\t\"bc\": \"#ffffff\"\r\n\t\t},\r\n\t\t\"one\": {\r\n\t\t\t\"fc\": \"#000\",\r\n\t\t\t\"bc\": \"#ffffff\"\r\n\t\t},\r\n\t\t\"two\": {\r\n\t\t\t\"fc\": \"#000\",\r\n\t\t\t\"bc\": \"#e5fbee\"\r\n\t\t},\r\n\t\t\"foot\": {\r\n\t\t\t\"fc\": \"#000\",\r\n\t\t\t\"bc\": \"#a5efcc\"\r\n\t\t}\r\n\t}]\r\n    ```\r\n\r\n    ------------\r\n    ## chart\r\n    - Type：Array\r\n    - Default：[]\r\n    - Usage： Chart configuration (under development)\r\n    \r\n    ------------\r\n    ## visibledatarow\r\n    - Type：Number\r\n    - Default：[]\r\n    - Usage： Position information of all rows, incremental row position data, No need to set up for initialization\r\n    \r\n    ------------\r\n    ## visibledatacolumn\r\n    - Type：Number\r\n    - Default：[]\r\n    - Usage： Position information of all columns, incremental column position data, No need to set up for initialization\r\n    \r\n    ------------\r\n    ## ch_width\r\n    - Type：Number\r\n    - Default：2322\r\n    - Usage：The width of the entire worksheet area (the gray area including the border), No need to set up for initialization\r\n    \r\n    ------------\r\n    ## rh_height\r\n    - Type：Number\r\n    - Default：2322\r\n    - Usage：The height of the entire worksheet area (the gray area containing the border), No need to set up for initialization\r\n    \r\n    ------------\r\n\r\n## Get sheet data\r\n\r\n- **Configuration**：\r\n\r\n    Configure the address of `loadSheetUrl`, the parameters are `gridKey` (table primary key) and `index` (sheet primary key collection, format is `[1,2,3]`), the returned data is the `data` field set of sheet\r\n\r\n- **Format**：\r\n\r\n    ```json\r\n    {\r\n        \"1\":  [{r:0, c:1, v:\"value 1\"},{r:10, c:11, v:\"value 2\"}],\r\n        \"2\":  [data],\r\n        \"3\":  [data],\r\n    }\r\n    ```\r\n- **Explanation**：\r\n\r\n    `r` stands for row, `c` stands for column, and `v` stands for the value of the cell. The value can be a character, number, or json string.\r\n    \r\n    The data will only be loaded once, generally speaking, there is only one primary key, but considering that some formulas, charts and pivot tables will refer to the data of other sheets, the front desk will add a judgment, if the current sheet refers to the data of other sheets, then complete the data of the referenced sheet together.\r\n\r\n## Update data\r\n\r\n- **Configuration**：\r\n\r\n    Configure the address of `updateUrl`, and the parameter sent to the backend is a json string.\r\n\r\n- **Format**：\r\n\r\n    ```json\r\n    {\r\n        compress: false, \r\n        gridKey:10004,\r\n        data: [update data]\r\n    }\r\n    ```\r\n\r\n- **Explanation**：\r\n\r\n    | Parameter | Explanation | Example |\r\n    | ------------ | ------------ | ------------ |\r\n    |  compress | Luckysheet uses client pako for zlib parameter compression, which is true if the browser supports compression, otherwise false. The backend can decide whether to decompress the data content based on this parameter  | The process of obtaining parameters on the server side: 1. Serialize json string 2. Decode the data field if the compress field is TRUE 3. Decode the data string URLDecoder.decode(utf-8) |\r\n    |  gridKey | Luckysheet file identifier | none |\r\n    |  data | An array containing updated data. For the parameter format in the array, please see the introduction below. In the example: `t` indicates the update type, `i` is the index of the sheet, `c` is the row number, `r` is the column number, and `v` is the value  | `data: [{ t : 'cell', i:0, c : 0,  r : 0 , v: 2 }]` |\r\n"
  },
  {
    "path": "docs/guide/operate.md",
    "content": "# Table Operation\r\n`luckysheet` stores all operations in the history to `undo` and `redo`. If `allowupdate` is set to true and `updateURL` is available in initial, operations will be updated on the backend in real-time via webSocket. And every one can edit same sheet on the same time.\r\n\r\n>Source code [`src/controllers/server.js`] (https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/server.js) The module shows us the function of background saving.\r\n\r\nIn general, shared editing(or collaborative editing) is controled by the account system created by developers to control permissions.\r\n\r\nThe following are all types of operations that support transferring to the background. In this case, I use mongodb as a storage example to explain how front-end and back-end interacts with eachother.\r\n\r\nPay attention, `i` in the object is the `index` of the sheet rather than `order`.\r\n## Cell refresh\r\n### single cell refresh\r\n- **Format**：\r\n\r\n    ```json\r\n    {\r\n        \"t\": \"v\",\r\n        \"i\": \"Sheet_0554kKiKl4M7_1597974810804\",\r\n        \"v\": {\r\n            \"v\": 233,\r\n            \"ct\": { \"fa\": \"General\", \"t\": \"n\" },\r\n            \"m\": \"233\"\r\n        },\r\n        \"r\": 0,\r\n        \"c\": 1\r\n    }\r\n    ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |i|The index value of the current sheet|\r\n    |v|Cell value, refer to [单元格属性表](/zh/guide/cell.html#基本单元格)|\r\n    |r|Row number of cell|\r\n    |c|The column number of the cell|\r\n\r\n- **Backend update**：\r\n\r\n    The cell update is mainly to update the `luckysheetfile[i].celldata` parameter, which is an array:\r\n    ```json\r\n    [\r\n        {r:0, c:1, v: \"value1\"},\r\n        {r:10, c:11, v:\"value2\"},\r\n        {r:10, c:11, v:{f:\"=sum\", v:\"100\"}}\r\n    ]\r\n    ```\r\n    Store the values in all the cells in the sheet, Luckysheet will create a new table data according to the number of rows and columns in `luckysheetfile[i].row` and `luckysheetfile[i].column` when it is created, and then use `data[ r][c]=v` to fill the table data, empty data cells are represented by null.\r\n\r\n    When saving the data posted by the frontend, the backend needs to convert the parameters to the format of `{r:0, c:1:v:100}` first, and then update the field of `luckysheetfile[i].celldata`, if the cell exists the cell is updated, if not, it is added, and if the cell exists but `v` is null, the cell is deleted.\r\n\r\n- **Frontend view**：\r\n\r\n    You can modify the value of any cell, and then go to the chrome console to view the operation of `\"t\"==\"v\"`.\r\n  \r\n## Config operation\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"cg\",\r\n    \"i\": 3,\r\n    \"v\": {\r\n        \"7\": 192\r\n    },\r\n    \"k\": \"rowlen\"\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |i|The index value of the current sheet|\r\n    |v|The internal key-value that needs to be updated|\r\n    |k|Operation key name|\r\n\r\n- **Backend update**：\r\n\r\n    Update `luckysheetfile[i].config.[k][v.key] = v.value`, if `k` does not exist in `config`, then create a new `k` attribute and set it to empty, If there is no `v.key` in `k`, create a new `v.key` and update `v.value`.\r\n\r\n    1. Examples of modifying row height:\r\n       - Enter: `{\"t\":\"cg\",\"i\":3,\"v\":{\"3\":10, \"5\":70, \"10\":100},\"k\":\" rowlen\"}`\r\n       - Update: `luckysheetfile[3].config.[\"rowlen\"][\"3\"] = 10`\r\n\r\n    2. Examples of modifying column width:\r\n       - Enter: `{\"t\":\"cg\",\"i\":1,\"v\":{\"20\":74, \"15\":170, \"6\":40},\"k\":\" columnlen\"}`\r\n       - Update: `luckysheetfile[1].config.[\"columnlen\"][\"20\"] = 74`\r\n        \r\n    3. Examples of merged cells:\r\n       - Enter: `{\"t\":\"cg\",\"i\":1,\"v\":{\"5_10\":{row:[1,3], column:[3,5]},\"k\":\" merge \"}`\r\n       - Update: `luckysheetfile[1].config.[\"merge\"][\"5_10\"] = {row:[1,3], column:[3,5]}`\r\n \r\n## General save\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"all\",\r\n    \"i\": 3,\r\n    \"v\": {\r\n        \"v\": 1,\r\n        \"m\":1,\r\n    },\r\n    \"k\": \"freezen\",\r\n    \"s\": false\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |i|The index value of the current sheet|\r\n    |v|The internal key-value that needs to be updated|\r\n    |k|The `value` in the key-value that needs to be saved|\r\n    |s|If it is `true` then `v` is saved as a string, otherwise it is saved according to the object|\r\n\r\n- **Backend update**：\r\n\r\n    `luckysheetfile[3].[k]= v`\r\n    If `s` is `true`, it is `luckysheetfile[3].[k]= JSON.stringify(v)`\r\n\r\n    1. Pivot table:\r\n       - Enter: `{\"t\":\"all\",\"i\":1,\"v\":{………},\"k\":\"pivotTable\", \"s\": false}`\r\n       - Update: `luckysheetfile[1].[\"pivotTable\"] = {………}`\r\n\r\n    2. Freeze rows and columns:\r\n       - Enter: `{\"t\":\"all\",\"i\":3,\"v\":{………},\"k\":\"freezen\", \"s\": false}`\r\n       - Update: `luckysheetfile[3].[\"freezen\"] = {………}`\r\n\r\n    3. Filter range:\r\n       - Enter: `{\"t\":\"all\",\"i\":3,\"v\":{………},\"k\":\"filter_select\", \"s\": true }`\r\n       - Update: `luckysheetfile[3].[\"filter_select\"] = JSON.stringify ({………})`\r\n        \r\n    4. Sheet name:\r\n       - Enter: `{\"t\":\"all\",\"i\":1,\"v\":\"doc\",\"k\":\"name\", \"s\": false}`\r\n       - Update: `luckysheetfile[1].[\"name\"] = \"doc\"`\r\n\r\n    5. Sheet color:\r\n       - Enter:  `{\"t\":\"all\",\"i\":2,\"v\":\"#FFF000\",\"k\":\"color\", \"s\": false}`\r\n       - Update: `luckysheetfile[2].[\"color\"] = \"#FFF000\"`\r\n\r\n## Function chain operation\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"fc\",\r\n    \"i\": 0,\r\n    \"v\": {\r\n        \"r\": 3,\r\n        \"c\": 7,\r\n        \"index\": 0,\r\n        \"func\": [\r\n            true,\r\n            187282,\r\n            \"=SUM(E4:G4)\"\r\n        ]\r\n    },\r\n    \"op\": \"add\",\r\n    \"pos\": 0\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |i|The index value of the current sheet|\r\n    |v|Object value, the internal fields of the object do not need to be updated separately, so save as text|\r\n    |op|Operation type, `add` is add, `update` is update, and `del` is delete|\r\n    |pos|Updated or deleted function location|\r\n\r\n- **Backend update**：\r\n\r\n    calcChain is an array\r\n    - If the value of `op` is `add` then add to the end `luckysheetfile[i].calcChain.push (v)`， \r\n    - If the value of `op` is `update` then update  `luckysheetfile[i].calcChain[pos]= v`，\r\n    - If the value of `op` is `del` then delete `luckysheetfile[i].calcChain.splice(pos, 1)`。\r\n\r\n- **Frontend view**：\r\n\r\n    You can modify the value of any cell, and then go to the chrome console to view the operation of `\"t\"==\"v\"`.\r\n\r\n## Row and column operations\r\n\r\n### Delete rows or columns\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"drc\",\r\n    \"i\": 3,\r\n    \"v\": {\r\n        \"index\": 6,\r\n        \"len\": 2\r\n    },\r\n    \"rc\": \"r\"\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    <table>\r\n        <tr>\r\n            <td colspan=\"2\">Parameter</td> \r\n            <td>Explanation</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">t</td> \r\n            <td>Operation type symbol</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">i</td> \r\n            <td>The index value of the current sheet</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">rc</td> \r\n            <td>Row operation or column operation, the value `r` stands for row, and `c` stands for column</td> \r\n        </tr>\r\n        <tr>\r\n            <td rowspan=\"2\">v</td> \r\n            <td>index</td> \r\n            <td>Delete from which row or column</td> \r\n        </tr>\r\n        <tr>\r\n            <td>len</td> \r\n            <td>Number of rows or columns deleted</td> \r\n        </tr>\r\n        \r\n    </table>\r\n\r\n- **Backend update**：\r\n  \r\n    If the value of `rc` is `'r'` then delete the row, if the value of `rc` is `'c'` then delete the column, eg `rc='r'`, `index=4`, `len= 5`, means to delete the next 5 lines (4, 5, 6, 7, 8) from the 4th line.\r\n\r\n     Mainly operate on the cells in `luckysheetfile[i].celldata`, delete the qualified cells described in the parameters and update the row and column values of other cells. Taking the above as an example, first find the `r` in the cell Delete all the cells with values from 4 to 8, and then subtract the value of 5 from the original cell number 9 and later, and finally subtract 5 from `luckysheetfile[i].row`.\r\n     If the `v` value is `\"#__qkdelete#\"` (without quotes), then this is the cell to be deleted.\r\n\r\n- **Front view**：\r\n\r\n    You can delete rows or columns, and then go to the chrome console to view the operation of `\"t\"==\"drc\"`.\r\n\r\n### Add rows or columns\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"arc\",\r\n    \"i\": 0,\r\n    \"v\": {\r\n        \"index\": 5,\r\n        \"len\": 10,\r\n        \"data\": []\r\n    },\r\n    \"rc\": \"c\"\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    <table>\r\n        <tr>\r\n            <td colspan=\"2\">Parameter</td> \r\n            <td>Explanation</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">t</td> \r\n            <td>Operation type symbol</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">i</td> \r\n            <td>The index value of the current sheet</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">rc</td> \r\n            <td>Row operation or column operation, the value `r` stands for row, and `c` stands for column</td> \r\n        </tr>\r\n        <tr>\r\n            <td rowspan=\"3\">v</td> \r\n            <td>index</td> \r\n            <td>Start from which row or column</td> \r\n        </tr>\r\n        <tr>\r\n            <td>len</td> \r\n            <td>How many rows or columns to add</td> \r\n        </tr>\r\n        <tr>\r\n            <td>data</td> \r\n            <td>New row or column content</td> \r\n        </tr>\r\n        \r\n    </table>\r\n\r\n- **Backend update**：\r\n    \r\n    If the value of `rc` is `r`, add a new row. If the value of `rc` is `c`, add a new column. For example, `rc=r, index=4, len=5` then it means increase 5 lines from line 4. If `data` is empty, add an empty line. If `data` is not empty, use the array in `data` to add a new line.\r\n\r\n    Mainly operate on the cells in `luckysheetfile[i].celldata`. Taking the above as an example, first add 5 to `luckysheetfile[i].row`, and then add `r` greater than 4 to the entire cell`r `Value +5, if `data` is empty, add an empty line to end, if `data` is not empty, convert the two-dimensional array `data` to `{r:0,c:0,v:100}` Format and added to `celldata`, the pseudo code for conversion is as follows:\r\n\r\n    ```javascript\r\n    var ret = [];\r\n    for(var r=0;r<data.length;r++){\r\n        for(var c=0;c<data[0].length;c++){\r\n            if(d[r][c]==null){\r\n                continue;\r\n            }\r\n            ret.push({r:r+5, c:c, v: data[r][c]});\r\n        }\r\n    }\r\n    return ret;\r\n    ```\r\n\r\n- **Front view**：\r\n    You can add rows or columns, and then go to the chrome console to view the operation of `\"t\"==\"arc\"`. If you want to view the operation with the value of `data`, you can delete some rows or columns, and then undelete (Ctrl+Z), you can see.\r\n\r\n## Filter operating\r\n\r\n### Select filter condition\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"f\",\r\n    \"i\": 0,\r\n    \"v\": \"{\\\"caljs\\\":{},\\\"selected\\\":{\\\"Qingdao\\\":\\\"1\\\",\\\"Guangxi\\\":\\\"1\\\",\\\"Chongqing\\\":\\\"1\\\"},\\\"rowhidden\\\":{\\\"1\\\":0,\\\"2\\\":0,\\\"3\\\":0,\\\"4\\\":0,\\\"6\\\":0,\\\"7\\\":0,\\\"8\\\":0,\\\"9\\\":0,\\\"10\\\":0,\\\"11\\\":0,\\\"12\\\":0,\\\"13\\\":0,\\\"14\\\":0,\\\"15\\\":0,\\\"16\\\":0,\\\"17\\\":0,\\\"18\\\":0,\\\"19\\\":0,\\\"21\\\":0,\\\"22\\\":0,\\\"24\\\":0,\\\"25\\\":0,\\\"26\\\":0,\\\"27\\\":0,\\\"28\\\":0,\\\"29\\\":0,\\\"30\\\":0,\\\"31\\\":0,\\\"32\\\":0,\\\"33\\\":0,\\\"34\\\":0,\\\"35\\\":0}}\",\r\n    \"op\": \"upOrAdd\",\r\n    \"pos\": 1\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |i|The index value of the current sheet|\r\n    |v|Object value, the internal fields of the object do not need to be updated separately, so save as text|\r\n    |op|The operation type `upOrAdd` is update, if it does not exist, it is added, and `del` is delete|\r\n    |pos|Updated or deleted `option` location|\r\n\r\n- **Backend update**：\r\n  \r\n   Update `luckysheetfile[i].filter = {pos: v }`, the value of `v` is a string in JSON format. `filter` is a key-value pair, `key` is the index value (in characters) of the option position, and `v` is a json string parameter. `filter` represents a set of filter conditions.\r\n\r\n### Clear filter\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"fsc\",\r\n    \"i\": 0,\r\n    \"v\": null\r\n  }\r\n  ```\r\n\r\n- **Backend update**：\r\n  \r\n    Clear `luckysheetfile[i]. filter = null` ， `luckysheetfile[i]. filter_select = null`。\r\n\r\n### Restore filter\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"fsr\",\r\n    \"i\": 0,\r\n    \"v\": {\r\n        \"filter\": [],\r\n        \"filter_select\": {}\r\n    }\r\n  }\r\n  ```\r\n\r\n- **Backend update**：\r\n  \r\n    Clear `luckysheetfile[i]. filter = v.filter`， `luckysheetfile[i]. filter_select = v. filter_select`。\r\n\r\n## Sheet operation\r\n\r\n### New sheet\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"sha\",\r\n    \"i\": null,\r\n    \"v\": {\r\n        \"name\": \"Sheet4\",\r\n        \"color\": \"\",\r\n        \"status\": \"0\",\r\n        \"order\": 3,\r\n        \"index\": 3,\r\n        \"data\": [],\r\n        \"config\": {},\r\n        \"pivotTable\": null,\r\n        \"isPivotTable\": false\r\n    }\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    <table>\r\n        <tr>\r\n            <td colspan=\"2\">Parameter</td> \r\n            <td>Explanation</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">t</td> \r\n            <td>Operation type symbol</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">i</td> \r\n            <td>The index value of the current sheet</td> \r\n        </tr>\r\n        <tr>\r\n            <td rowspan=\"9\">v</td> \r\n            <td>name</td> \r\n            <td>The index value of the sheet jumped after hiding</td> \r\n        </tr>\r\n        <tr>\r\n            <td>color</td> \r\n            <td>Sheet color</td> \r\n        </tr>\r\n        <tr>\r\n            <td>status</td> \r\n            <td>Active state</td> \r\n        </tr>\r\n        <tr>\r\n            <td>order</td> \r\n            <td>Sheet order</td> \r\n        </tr>\r\n        <tr>\r\n            <td>index</td> \r\n            <td>Sheet Index</td> \r\n        </tr>\r\n        <tr>\r\n            <td>celldata</td> \r\n            <td>Cell dataset</td> \r\n        </tr>\r\n        <tr>\r\n            <td>config</td> \r\n            <td>Setting</td> \r\n        </tr>\r\n        <tr>\r\n            <td>pivotTable</td> \r\n            <td>Pivot table settings</td> \r\n        </tr>\r\n        <tr>\r\n            <td>isPivotTable</td> \r\n            <td>Whether the pivot table</td> \r\n        </tr>\r\n        \r\n    </table>\r\n\r\n- **Backend update**：\r\n  \r\n    Add a line (a document) to the database.\r\n\r\n### Copy sheet\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"shc\",\r\n    \"i\": \"New sheet location\",\r\n    \"v\": {\r\n        \"copyindex\": \"copyindex\"\r\n    }\r\n  }\r\n  ```\r\n\r\n- **Backend update**：\r\n  \r\n    Copy the sheet index value in the table, set it to `copyindex` and add it to the database, set the `index` of the new document to the value corresponding to `i`.\r\n\r\n### Delete sheet\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"shd\",\r\n    \"i\": null,\r\n    \"v\": {\r\n        \"deleIndex\": 0\r\n    }\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    <table>\r\n        <tr>\r\n            <td colspan=\"2\">Parameter</td> \r\n            <td>Explanation</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">t</td> \r\n            <td>Operation type symbol</td> \r\n        </tr>\r\n        <tr>\r\n            <td rowspan=\"2\">v</td> \r\n            <td>deleIndex</td> \r\n            <td>The sheet index to be deleted</td> \r\n        </tr>\r\n                \r\n    </table>\r\n\r\n- **Backend update**：\r\n  \r\n    Delete the sheet whose index is the value corresponding to `deleIndex`.\r\n\r\n### restore from a deleted sheet\r\n\r\n- **format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"shre\",\r\n    \"i\": null,\r\n    \"v\": {\r\n        \"reIndex\": \"0\"\r\n    }\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    <table>\r\n        <tr>\r\n            <td colspan=\"2\">Parameter</td> \r\n            <td>Explanation</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">t</td> \r\n            <td>Operation type symbol</td> \r\n        </tr>\r\n        <tr>\r\n            <td rowspan=\"2\">v</td> \r\n            <td>deleIndex</td> \r\n            <td>需要恢复的sheet索引</td> \r\n        </tr>\r\n                \r\n    </table>\r\n\r\n- **Backend update**：\r\n  \r\n    restore the sheet whose index is the number of `reIndex`.\r\n\r\n### Position\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"shr\",\r\n    \"i\": null,\r\n    \"v\": {\r\n        \"0\": 1,\r\n        \"1\": 0,\r\n        \"2\": 2,\r\n        \"3\": 3,\r\n        \"4\": 4,\r\n        \"5\": 5,\r\n        \"6\": 6,\r\n        \"7\": 7,\r\n        \"Sheet_6az6nei65t1i_1596209937084\": 8\r\n    }\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |v|Set the sorting of Sheet as a key-value pair, `key` represents the index of the sheet, and `value` represents the order value. The format is: `{\"1\": 3, \"2\":1, \"0\": 2, \"3\":0}`|\r\n\r\n- **Backend update**：\r\n  \r\n    For the page where the `index` of the sheet is equal to the `key`, set its `order` attribute to the `value`. Examples:\r\n\r\n    `luckysheetfile[key1].order = value1`\r\n    `luckysheetfile[key2].order = value2`\r\n    `luckysheetfile[key3].order = value3`\r\n\r\n### switch to the specified sheet\r\n\r\n- **format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"shs\",\r\n    \"i\": null,\r\n    \"v\": 1\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |v|index of the specified sheet|\r\n\r\n- **Backend update**：\r\n  \r\n    setting the `status` = `1`, when the `index` of a sheet is eaqul to `v`：\r\n\r\n    `luckysheetfile[v].status = 1`\r\n\r\n## Sheet attributes (hide or show)\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"sh\",\r\n    \"i\": 0,\r\n    \"v\": 1,\r\n    \"op\": \" hide\",\r\n    \"cur\": 2\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |i|The index value of the current sheet|\r\n    |op|Operation options include hide and show|\r\n    |v|Hide if `hide` is `1`, show if `0` or empty|\r\n    |cur|After hiding, set sheet which index corresponding to the `cur` to the active state|\r\n\r\n- **Backend update**：\r\n  \r\n    The `hide` field of the root path of the sheet corresponding to `i` is updated to `v`. When hidden, the `status` value is `0`. When displayed, it is `1`. If hidden, the sheet which `cur` corresponds to  `index`, its `status` is updated to `1`.\r\n\r\n## Table information change\r\n\r\n### Table name\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"na\",\r\n    \"i\": null,\r\n    \"v\": \"Data\"\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |v|The name of the table|\r\n\r\n- **Backend update**：\r\n  \r\n    Update the table name in the database according to gridkey.\r\n\r\n### Thumbnail\r\n\r\n- **Format**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"thumb\",\r\n    \"img\": \"base64\",\r\n    \"curindex\": \"curindx\"\r\n  }\r\n  ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |img|Thumbnail of current table, base64 string|\r\n    |curindex|The current sheet opened by default|\r\n\r\n- **Backend update**：\r\n  \r\n    According to gridkey, update the thumbnail field of the table in mysql to the img value, and update the status field of the sheet whose index is the curindex value to 1, and set the status value of other sheets to 0.\r\n    \r\n## Chart(TODO)\r\n\r\nThere are four types of chart operations: add new chart -\"add\", move chart position-\"xy\", zoom chart-\"wh\", and update chart configuration-\"update\".\r\n\r\n### new chart\r\n\r\n- **format**：\r\n\r\n    ```json\r\n    {\r\n        \"t\": \"c\",\r\n        \"i\": 0,\r\n        \"op\":\"add\",\r\n        \"v\": {\r\n            \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n            \"width\": 400,\r\n            \"height\": 250,\r\n            \"left\": 20,\r\n            \"top\": 120,\r\n            \"sheetIndex\": \"Sheet_6az6nei65t1i_1596209937084\",\r\n            \"needRangeShow\": true,\r\n            \"chartOptions\": {\r\n                \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n                \"chartAllType\": \"echarts|line|default\",\r\n                \"rangeArray\": [ { \"row\": [ 0, 4 ], \"column\": [ 0, 7 ] } ],\r\n                \"rangeColCheck\": { \"exits\": true, \"range\": [ 0, 0 ] },\r\n                \"rangeRowCheck\": { \"exits\": true, \"range\": [ 0, 0 ] },\r\n                \"rangeConfigCheck\": false,\r\n                \"defaultOption\": {\r\n                    \"title\": {\r\n                        \"show\": true,\r\n                        \"text\": \"default title\"\r\n                    }\r\n                }\r\n            },\r\n            \"isShow\": true\r\n        }\r\n    }\r\n    ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |i|The index value of the current sheet|\r\n    |op|Operation options include hide and show|\r\n    |v|configuration information of charts|\r\n\r\n- **Backend update**：\r\n  \r\n    update the chart settings in the current sheet,if`luckysheetfile[i].chart` is null，the array should be `[]` on initial.\r\n\r\n    ```json\r\n    luckysheetfile[0].chart.push(v)\r\n    ```\r\n\r\n### move chart position\r\n\r\n- **format**：\r\n\r\n    ```json\r\n    {\r\n        \"t\": \"c\",\r\n        \"i\": 0,\r\n        \"op\":\"xy\",\r\n        \"v\": {\r\n            \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n            \"left\": 20,\r\n            \"top\": 120\r\n        }\r\n    }\r\n    ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |i|The index value of the current sheet|\r\n    |op|Operation options include hide and show|\r\n    |v|configuration information of charts|\r\n\r\n- **Backend update**：\r\n  \r\n    update the chart settings in the current sheet\r\n\r\n    ```js\r\n    luckysheetfile[0].chart[v.chart_id].left = v.left;\r\n    luckysheetfile[0].chart[v.chart_id].top = v.top;\r\n    ```\r\n\r\n### zoom chart\r\n\r\n- **format**：\r\n\r\n    ```json\r\n    {\r\n        \"t\": \"c\",\r\n        \"i\": 0,\r\n        \"op\":\"wh\",\r\n        \"v\": {\r\n            \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n            \"width\": 400,\r\n            \"height\": 250,\r\n            \"left\": 20,\r\n            \"top\": 120\r\n        }\r\n    }\r\n    ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |i|The index value of the current sheet|\r\n    |op|Operation options include hide and show|\r\n    |v|configuration information of charts|\r\n\r\n- **Backend update**：\r\n  \r\n    update the chart settings in the current sheet\r\n\r\n    ```js\r\n    luckysheetfile[0].chart[v.chart_id].left = v.left;\r\n    luckysheetfile[0].chart[v.chart_id].top = v.top;\r\n    luckysheetfile[0].chart[v.chart_id].width = v.width;\r\n    luckysheetfile[0].chart[v.chart_id].height = v.height;\r\n    ```\r\n\r\n### change the configuration of charts\r\n\r\n- **format**：\r\n\r\n    ```json\r\n    {\r\n        \"t\": \"c\",\r\n        \"i\": 0,\r\n        \"op\":\"update\",\r\n        \"v\": {\r\n            \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n            \"width\": 400,\r\n            \"height\": 250,\r\n            \"left\": 20,\r\n            \"top\": 120,\r\n            \"sheetIndex\": \"Sheet_6az6nei65t1i_1596209937084\",\r\n            \"needRangeShow\": true,\r\n            \"chartOptions\": {\r\n                \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n                \"chartAllType\": \"echarts|line|default\",\r\n                \"rangeArray\": [ { \"row\": [ 0, 4 ], \"column\": [ 0, 7 ] } ],\r\n                \"rangeColCheck\": { \"exits\": true, \"range\": [ 0, 0 ] },\r\n                \"rangeRowCheck\": { \"exits\": true, \"range\": [ 0, 0 ] },\r\n                \"rangeConfigCheck\": false,\r\n                \"defaultOption\": {\r\n                    \"title\": {\r\n                        \"show\": true,\r\n                        \"text\": \"default title\"\r\n                    }\r\n                }\r\n            },\r\n            \"isShow\": true\r\n        }\r\n    }\r\n    ```\r\n\r\n- **Explanation**：\r\n\r\n    |Parameter|Explanation|\r\n    | ------------ | ------------ |\r\n    |t|Operation type symbol|\r\n    |i|The index value of the current sheet|\r\n    |op|Operation options include hide and show|\r\n    |v|configuration information of charts|\r\n\r\n- **Backend update**：\r\n  \r\n    update the chart settings in the current sheet\r\n\r\n    ```js\r\n    luckysheetfile[0].chart[v.chart_id] = v;\r\n    ```\r\n\r\n## Backend return format\r\n\r\nData format returned by websocket backend\r\n```js\r\n{\r\n     createTime: command sending time\r\n     data:{} modified command\r\n     id: \"7a\" websocket id\r\n     returnMessage: \"success\"\r\n     status: \"0\" 0 tells the front end to modify according to the data command 1 meaningless\r\n     type: 0: connection is successful, 1: send to the currently connected user, 2: send information to other users, 3: send selection location information, 999: user disconnected\r\n     username: username\r\n}\r\n```"
  },
  {
    "path": "docs/guide/resource.md",
    "content": "# Tutorials and resources\r\n\r\nOpen source software is inseparable from the contribution of the community. Here will be a list of tutorials, learning materials and supporting solutions provided by the community.\r\n\r\nIf you have written or found an excellent tutorial and want to recommend it to us, please directly [edit this page](https://github.com/mengshukeji/Luckysheet/edit/master/docs/guide/resource.md) submit a PR.\r\n\r\n## Blog\r\n- [How Luckysheet initializes the data with merged cells](https://www.cnblogs.com/DuShuSir/p/13272397.html)[Pending translation]\r\n- [How Luckysheet saves the data in the table to the database](https://www.cnblogs.com/DuShuSir/p/13857874.html)[Pending translation]\r\n- [Case of introducing Luckysheet into local HTML using CDN loading](https://www.cnblogs.com/DuShuSir/p/13859103.html)[Pending translation]\r\n- [Basic usage of Luckysheet, use `loadUrl` to load server data](https://blog.csdn.net/DCDC2020/article/details/108486525)\r\n- [Luckysheet import and export implementation-Java background processing](https://blog.csdn.net/u014632228/article/details/109738221)\r\n\r\n## Front-end case\r\n\r\n### Community Case\r\n- [luckysheet-vue-importAndExport](https://github.com/oy-paddy/luckysheet-vue-importAndExport/tree/master/)\r\n\r\n## Back-end case\r\n\r\n### Official case\r\n- [Java backend Luckysheet Server](https://github.com/mengshukeji/LuckysheetServer)\r\n\r\n### Community Case\r\n- [Luckysheet save and restore](https://gitee.com/ichiva/luckysheet-saved-in-recovery) (Java version)\r\n- [Online form for collaborative editing based on Luckysheet](https://github.com/DilemmaVi/ecsheet) (Java version)\r\n- [Simple Express.js server example template for individual use](https://github.com/TitanRGB/Luckysheet-ExpressReact-Example) (Node-Express version)\r\n- [Use .net core 3.1 and Npoi to make a basic export based on LuckSheet](https://gitee.com/xiong-kangli/luck-sheet_.-net-core) (.NET version)\r\n- [Collaborative editing in go language version](https://github.com/fandypeng/excel2config)（Go version）\r\n\r\n## Learning Materials\r\n\r\n- [How to build a web data analysis report from 0 to 1](https://github.com/mengshukeji/LuckyResources/blob/master/ppt/%E5%A6%82%E4%BD%95%E4%BB%8E0%E5%88%B01%E6%90%AD%E5%BB%BA%20Web%20%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E6%8A%A5%E8%A1%A8.pptx)[Pending translation]\r\n"
  },
  {
    "path": "docs/guide/sheet.md",
    "content": "# Sheet Configuration\r\n\r\n## Initial\r\nif you want to initial the `options`, you need to arrange every sheet data to `options.data`\r\n\r\n> when the initialization is done, you can use [`luckysheet.getAllSheets()`](/zh/guide/api.html#getAllSheets([setting])) to get all working sheet configurations.\r\n\r\neg: options.data：\r\n```json\r\n[\r\n    {\r\n        \"name\": \"Cell\", //Worksheet name\r\n        \"color\": \"\", //Worksheet color\r\n        \"index\": 0, //Worksheet index\r\n        \"status\": 1, //Worksheet active status\r\n        \"order\": 0, //The order of the worksheet\r\n        \"hide\": 0,//Whether worksheet hide \r\n        \"row\": 36, //the number of rows in a sheet\r\n        \"column\": 18, //the number of columns in a sheet\r\n        \"defaultRowHeight\": 19, //Customized default row height\r\n        \"defaultColWidth\": 73, //Customized default column width\r\n        \"celldata\": [], //Initial the cell data\r\n        \"config\": {\r\n            \"merge\":{}, //merged cells\r\n            \"rowlen\":{}, //Table row height\r\n            \"columnlen\":{}, //Table column width\r\n            \"rowhidden\":{}, //hidden rows\r\n            \"colhidden\":{}, //hidden columns\r\n            \"borderInfo\":{}, //borders\r\n            \"authority\":{}, //Worksheet protection\r\n        },\r\n        \"scrollLeft\": 0, //Left and right scroll bar position\r\n        \"scrollTop\": 315, //Up and down scroll bar position\r\n        \"luckysheet_select_save\": [], //selected area\r\n        \"calcChain\": [],//Formula chain\r\n        \"isPivotTable\":false,//Whether is pivot table\r\n        \"pivotTable\":{},//Pivot table settings\r\n        \"filter_select\": {},//Filter range\r\n        \"filter\": null,//Filter configuration\r\n        \"luckysheet_alternateformat_save\": [], //Alternate colors\r\n        \"luckysheet_alternateformat_save_modelCustom\": [], //Customize alternate colors\t\r\n        \"luckysheet_conditionformat_save\": {},//condition format\r\n        \"frozen\": {}, //freeze row and column configuration\r\n        \"chart\": [], //Chart configuration\r\n        \"zoomRatio\":1, // zoom ratio\r\n        \"image\":[], //image\r\n        \"showGridLines\": 1, //Whether to show grid lines\r\n    },\r\n    {\r\n        \"name\": \"Sheet2\",\r\n        \"color\": \"\",\r\n        \"index\": 1,\r\n        \"status\": 0,\r\n        \"order\": 1,\r\n        \"celldata\": [],\r\n        \"config\": {}\r\n    },\r\n    {\r\n        \"name\": \"Sheet3\",\r\n        \"color\": \"\",\r\n        \"index\": 2,\r\n        \"status\": 0,\r\n        \"order\": 2,\r\n        \"celldata\": [],\r\n        \"config\": {},\r\n    }\r\n]\r\n```\r\n        \r\n### name\r\n- type：String\r\n- default：\"Sheet1\"\r\n- usage：the name of a sheet\r\n\r\n------------\r\n### color\r\n- type：String\r\n- default：\"##f20e0e\"\r\n- usage：Sheet color, with a bottom border below the sheet name\r\n\r\n------------\r\n### index\r\n- type：String\r\n- default：\"\"\r\n- usage：The worksheet index is used as a unique key value, and a random string is automatically assigned when a worksheet is added. Note that `index` is not the order of worksheets, and is distinguished from `order`.\r\n\r\n------------\r\n### status\r\n- type：Number\r\n- default：1\r\n- usage：Active state, there is only one active worksheet which number will be 1 and the other worksheets are 0\r\n\r\n------------\r\n### order\r\n- type：Number\r\n- default：0\r\n- usage：The subscript of the worksheet represents the order in which the worksheet is displayed in the sheet bar at the bottom. It will increase when a worksheet is added, starting from 0\r\n\r\n------------\r\n### hide\r\n- type：Number\r\n- default：0\r\n- usage： is the sheet is hidden. `0` means not to hide, `1` means hide\r\n\r\n------------\r\n### row\r\n- type：Number\r\n- default：36\r\n- usage： Number of cell rows\r\n\r\n------------\r\n### column\r\n- type：Number\r\n- default：18\r\n- usage： Number of cell columns\r\n\r\n------------\r\n### defaultRowHeight\r\n- type：Number\r\n- default：19\r\n- usage： Customized default row height, unit is px\r\n\r\n------------\r\n### defaultColWidth\r\n- type：Number\r\n- default：73\r\n- usage： Customized default column width, unit is px\r\n\r\n------------\r\n### celldata\r\n- type：Array\r\n- default：[]\r\n- usage： The original cell data set is a set containing `{r:0,c:0,v:{m:\"value\",v:\"value\",ct: {fa: \"General\", t: \"g\"}} }`The one-dimensional array of format cell information is only used during initialization.\r\n\r\n    `r` represents the row, `c` represents the column, and `v` represents the value of the cell. value could be string, number, or object\r\n\r\n    The luckysheet creates a sheet data based on the number of `options.data[i].row` and  `options.data[i].column`, then uses `data[r][c]=v` to fullfill tables. Empty data cells are represented as null.\r\n\r\n    After initializing the table with celldata,the data is converted to the field [data](#data)in the luckyshetfile such as `luckysheetfile[i].data`. `data` stores the following update data and celldata will no longer be used.\r\n\r\n- example：\r\n    ```js\r\n    [{\r\n        \"r\": 0,\r\n        \"c\": 0,\r\n        \"v\": {\r\n            ct: {fa: \"General\", t: \"g\"},\r\n            m:\"value1\",\r\n            v:\"value1\"\r\n        }\r\n    }, {\r\n        \"r\": 0,\r\n        \"c\": 1,\r\n        \"v\": {\r\n            ct: {fa: \"General\", t: \"g\"},\r\n            m:\"value2\",\r\n            v:\"value2\"\r\n        }\r\n    }]\r\n    ```\r\n> more detail [cell format](/zh/guide/cell.html)\r\n\r\n------------\r\n### config\r\n- type：Object\r\n- default：{}\r\n- usage：Table row height, column width, merged cells, borders, hidden rows and other settings\r\n        please be careful, config must be empty object `{}`, rather than empty string `\"\"` or `null`\r\n    \r\n\r\n#### config.merge\r\n- type：Object\r\n- default：{}\r\n- usage：Merge cell settings\r\n- example：\r\n    ```js\r\n    {\r\n            \"13_5\": {\r\n                \"r\": 13,\r\n                \"c\": 5,\r\n                \"rs\": 3,\r\n                \"cs\": 1\r\n            },\r\n            \"13_7\": {\r\n                \"r\": 13,\r\n                \"c\": 7,\r\n                \"rs\": 3,\r\n                \"cs\": 2\r\n            },\r\n            \"14_2\": {\r\n                \"r\": 14,\r\n                \"c\": 2,\r\n                \"rs\": 1,\r\n                \"cs\": 2\r\n            }\r\n        }\r\n    ```\r\n    The `key` in the object is the spliced value of `r +'_' + c`, and the `value` is the cell information in the upper left corner: r: number of rows, c: number of columns, rs: number of merged rows, cs: merge Number of columns\r\n\r\n#### config.rowlen\r\n- type：Object\r\n- default：{}\r\n- usage：The row height of each cell\r\n- example：\r\n    ```js\r\n    \"rowlen\": {\r\n                \"0\": 20,\r\n                \"1\": 20,\r\n                \"2\": 20\r\n            }\r\n    ```\r\n\r\n#### config.columnlen\r\n- type：Object\r\n- default：{}\r\n- usage：The column width of each cell\r\n- example：\r\n    ```js\r\n    \"columnlen\": {\r\n                \"0\": 97,\r\n                \"1\": 115,\r\n                \"2\": 128\r\n            }\r\n    ```\r\n\r\n#### config.rowhidden\r\n- type：Object\r\n- default：{}\r\n- usage：Hidden row information, Rows：`rowhidden[Rows]: 0`,\r\n\r\n    you should specify the number of rows by `key`,`value` is always `0`\r\n- example：\r\n    ```js\r\n    \"rowhidden\": {\r\n                \"30\": 0,\r\n                \"31\": 0\r\n            }\r\n    ```\r\n\r\n#### config.colhidden\r\n- type：Object\r\n- default：{}\r\n- usage：Hidden row information, Rows：`rowhidden[Rows]: 0`,\r\n    format：`colhidden[Cols]: 0`,\r\n\r\n        `key` specify the number of columns,`value` is always `0`\r\n- example：\r\n    ```js\r\n    \"colhidden\": {\r\n                \"30\": 0,\r\n                \"31\": 0\r\n            }\r\n    ```\r\n\r\n#### config.borderInfo\r\n- type：Array\r\n- default：{}\r\n- usage：The border information of the cell\r\n- example：\r\n    ```js\r\n    \"borderInfo\": [{\r\n            \"rangeType\": \"cell\",\r\n            \"value\": {\r\n                \"row_index\": 3,\r\n                \"col_index\": 3,\r\n                \"l\": {\r\n                    \"style\": 10,\r\n                    \"color\": \"rgb(255, 0, 0)\"\r\n                },\r\n                \"r\": {\r\n                    \"style\": 10,\r\n                    \"color\": \"rgb(255, 0, 0)\"\r\n                },\r\n                \"t\": {\r\n                    \"style\": 10,\r\n                    \"color\": \"rgb(255, 0, 0)\"\r\n                },\r\n                \"b\": {\r\n                    \"style\": 10,\r\n                    \"color\": \"rgb(255, 0, 0)\"\r\n                }\r\n            }\r\n        },\r\n        {\r\n            \"rangeType\": \"range\",\r\n            \"borderType\": \"border-all\",\r\n            \"style\": \"3\",\r\n            \"color\": \"#0000ff\",\r\n            \"range\": [{\r\n                \"row\": [7, 8],\r\n                \"column\": [2, 3]\r\n            }]\r\n        }, {\r\n            \"rangeType\": \"range\",\r\n            \"borderType\": \"border-inside\",\r\n            \"style\": \"3\",\r\n            \"color\": \"#0000ff\",\r\n            \"range\": [{\r\n                \"row\": [7, 8],\r\n                \"column\": [8, 9]\r\n            }]\r\n        }]\r\n    ```\r\n    The range type can be divided into single cell and selected area\r\n    1. selection `rangeType: \"range\"`\r\n\r\n       + Border type `borderType：\"border-left\" | \"border-right\" | \"border-top\" | \"border-bottom\" | \"border-all\" | \"border-outside\" | \"border-inside\" | \"border-horizontal\" | \"border-vertical\" | \"border-none\"`,\r\n       + Border thickness `style:  1 Thin | 2 Hair | 3 Dotted | 4 Dashed | 5 DashDot | 6 DashDotDot | 7 Double | 8 Medium | 9 MediumDashed | 10 MediumDashDot | 11 MediumDashDotDot | 12 SlantedDashDot | 13 Thick`, If it corresponds to the value of getLineStyle() of aspose.cells, you need to make a conversion yourself, refer to [aspose.cells](https://apireference.aspose.com/cells/net/aspose.cells/cellbordertype)\r\n       + Border color `color: Hexadecimal color value`\r\n       + Selection area `range: Row and column information array`\r\n\r\n    2. Single cell `rangeType：\"cell\"` \r\n       + Number of rows and columns `value.row_index: number,value.col_index: number`\r\n       + Four border objects `value.l:Left border,value.r:Right border,value.t:Top border,value.b:Bottom border`\r\n       + Border thickness `value.l.style: 1 Thin | 2 Hair | 3 Dotted | 4 Dashed | 5 DashDot | 6 DashDotDot | 7 Double | 8 Medium | 9 MediumDashed | 10 MediumDashDot | 11 MediumDashDotDot | 12 SlantedDashDot | 13 Thick`\r\n       + Border color `value.l.color: Hexadecimal color value`\r\n\r\n    templates：\r\n\r\n        + ```js\r\n        {\r\n            \"rangeType\": \"range\",\r\n            \"borderType\": \"border-all\",\r\n            \"style\": \"3\",\r\n            \"color\": \"#0000ff\",\r\n            \"range\": [{\r\n                \"row\": [7, 8],\r\n                \"column\": [2, 3]\r\n            }]\r\n        }\r\n        ```\r\n        Represents a selection with a setting range of `{\"row\": [7, 8], \"column\": [2, 3]}`, the type is all borders, the border thickness is `Dotted`, and the color is `\"#0000ff\"`\r\n\r\n        + ```js\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 3,\r\n                    \"col_index\": 3,\r\n                    \"l\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            }\r\n            ```\r\n         Means to set the cell `\"D4\"`, the upper border/lower border/left border/right border are all border thicknesses `\"MediumDashDot\"`, color is `\"rgb(255, 0, 0)\"`\r\n\r\n#### config.authority\r\n- type：Object\r\n- default：{}\r\n- usage：Worksheet protection, you can set that the entire worksheet is not allowed to be edited or some areas are not editable. If you want to apply for editing permission, you need to enter a password, and customize the types of operations that users can operate.\r\n- example：\r\n    ```js        \r\n    \"authority\":{//Permission configuration of the current worksheet\r\n        selectLockedCells:1, //Select locked cells\r\n        selectunLockedCells:1, //Select unlocked cells\r\n        formatCells:1, //Format cells\r\n        formatColumns:1, //Format columns\r\n        formatRows:1, //Format rows\r\n        insertColumns:1, //Insert columns\r\n        insertRows:1, //Insert rows\r\n        insertHyperlinks:1, //Insert hyperlinks\r\n        deleteColumns:1, //Delete columns\r\n        deleteRows:1, //Delete rows\r\n        sort:1, //Sort\r\n        filter:1, //Filter\r\n        usePivotTablereports:1, //Use Pivot Table reports\r\n        editObjects:1, //Edit objects\r\n        editScenarios:1, //Edit scenarios   \r\n        sheet:1, //If it is 1 or true, the worksheet is protected; if it is 0 or false, the worksheet is not protected.\r\n        hintText:\"\", //The text of the pop-up prompt\r\n        algorithmName:\"None\",//Encryption scheme: MD2,MD4,MD5,RIPEMD-128,RIPEMD-160,SHA-1,SHA-256,SHA-384,SHA-512,WHIRLPOOL\r\n        saltValue:null, //The salt parameter for password decryption is a random value set by yourself\r\n        \r\n        allowRangeList:[{ //Range protection\r\n            name:\"area\", //Name\r\n            password:\"1\", //Password\r\n            hintText:\"\", //Prompt text\r\n            algorithmName:\"None\",//Encryption scheme: MD2,MD4,MD5,RIPEMD-128,RIPEMD-160,SHA-1,SHA-256,SHA-384,SHA-512,WHIRLPOOL\r\n            saltValue:null, //The salt parameter for password decryption is a random value set by yourself\r\n            sqref:\"$C$1:$D$5\" //Protected range\r\n        }],\r\n    },\r\n    ```\r\n\r\n------------\r\n### scrollLeft\r\n- type：Number\r\n- default：0\r\n- usage： Left and right scroll bar position\r\n\r\n------------\r\n### scrollTop\r\n- type：Number\r\n- default：0\r\n- usage： Up and down scroll bar position\r\n\r\n------------\r\n### luckysheet_select_save\r\n- type：Array\r\n- default：[]\r\n- usage： The selected area supports multiple selections and is a one-dimensional array containing multiple selection objects. \r\n- example：\r\n    ```js\r\n    [\r\n        {\r\n            \"row\": [ 0, 1 ],\r\n            \"column\": [ 0, 0 ]\r\n        },\r\n        {\r\n            \"row\": [ 3, 4 ],\r\n            \"column\": [ 1, 2 ]\r\n        },\r\n        {\r\n            \"row\": [ 1, 3 ],\r\n            \"column\": [ 3, 3 ]\r\n        }\r\n    ]\r\n    ```\r\n\r\n------------\r\n### calcChain\r\n- type：Array\r\n- default：[]\r\n- usage： Formula chain, used when the cell linked by the formula is changed, all formulas referencing this cell will be refreshed.\r\n- example：\r\n    ```js\r\n    [{\r\n        \"r\": 6, //the number of rows\r\n        \"c\": 3, //the number of columns\r\n        \"index\": 1, //sheet id\r\n        \"func\": [true, 23.75, \"=AVERAGE(D3:D6)\"], //Formula information, including formula calculation results and formula string\r\n        \"color\": \"w\", //\"w\"：use Depth-First-Search \"b\":Normal search\r\n        \"parent\": null,\r\n        \"chidren\": {},\r\n        \"times\": 0\r\n    }, {\r\n        \"r\": 7,\r\n        \"c\": 3,\r\n        \"index\": 1,\r\n        \"func\": [true, 30, \"=MAX(D3:D6)\"],\r\n        \"color\": \"w\",\r\n        \"parent\": null,\r\n        \"chidren\": {},\r\n        \"times\": 0\r\n    }]\r\n    ```\r\n\r\n------------\r\n### isPivotTable\r\n- type：Boolean\r\n- default：false\r\n- usage： is PivotTable\r\n\r\n------------\r\n### pivotTable\r\n- type：Object\r\n- default：{}\r\n- usage： Pivot table settings\r\n- example：\r\n    ```js\r\n    {\r\n        \"pivot_select_save\": {\r\n            \"row\": [0, 12],\r\n            \"column\": [0, 4]\r\n        },\r\n        \"pivotDataSheetIndex\": 6, //The sheet index where the source data is located\r\n        \"column\": [{\r\n            \"index\": 3,\r\n            \"name\": \"subject\",\r\n            \"fullname\": \"subject\"\r\n        }],\r\n        \"row\": [{\r\n            \"index\": 1,\r\n            \"name\": \"student\",\r\n            \"fullname\": \"student\"\r\n        }],\r\n        \"filter\": [],\r\n        \"values\": [{\r\n            \"index\": 4,\r\n            \"name\": \"score\",\r\n            \"fullname\": \"count:score\",\r\n            \"sumtype\": \"COUNTA\",\r\n            \"nameindex\": 0\r\n        }],\r\n        \"showType\": \"column\",\r\n        \"pivotDatas\": [ //Source data for PivotTable\r\n            [\"count:score\", \"science\", \"mathematics\", \"foreign language\", \"English\", \"total\"],\r\n            [\"Alex\", 1, 1, 1, 1, 4],\r\n            [\"Joy\", 1, 1, 1, 1, 4],\r\n            [\"Tim\", 1, 1, 1, 1, 4],\r\n            [\"total\", 3, 3, 3, 3, 12]\r\n        ],\r\n        \"drawPivotTable\": false,\r\n        \"pivotTableBoundary\": [5, 6]\r\n    }\r\n    ```\r\n\r\n------------\r\n### filter_select\r\n- type：Object\r\n- default：{}\r\n- usage：Filter range. A selection and a sheet have only one filter range, similar to `luckysheet_select_save`. If you just create a selection to turn on the filter function, you can configure this range. If you need to set further detailed filter conditions, you need to configure the [filter](#filter) property of the same level.\r\n- example：\r\n    ```js\r\n    {\r\n        \r\n        \"row\": [ 2, 6 ],\r\n        \"column\": [ 1, 3 ]\r\n    }\r\n    ```\r\n\r\n------------\r\n### filter\r\n- type：Object\r\n- default：{}\r\n- usage：The specific settings of the filter match with the filter range of `filter_select`. When you create a filter area on the first sheet, you can also see the filter configuration information of the first sheet through `luckysheet.getLuckysheetfile()[0].filter`.\r\n\r\n    The following is a complete filter configuration example\r\n    ```js\r\n    {   \r\n        //\"0\" means the first column\r\n        \"0\": {\r\n            \"caljs\": { // Filter by condition\r\n                \"value\": \"cellnull\", // Filter type\r\n                \"text\": \"Is empty\", // Type description\r\n                \"type\": \"0\" // Filter categories\r\n            },\r\n            \"rowhidden\": { \"3\": 0, \"4\": 0 }, // Hidden row information\r\n            \"optionstate\": true, // Whether to enable configuration\r\n            \"cindex\": 1, // The current range column order, here is the first column\r\n            \"str\": 2, // Range, start row\r\n            \"edr\": 6, // Range, end row\r\n            \"stc\": 1, // Range, start column\r\n            \"edc\": 3 // Range, end column\r\n        },\r\n        //\"1\" means the second column\r\n        \"1\": {\r\n            \"caljs\": {},\r\n            \"rowhidden\": { \"1\": 0},\r\n            \"optionstate\": true,\r\n            \"cindex\": 2, // The current range column order, here is the second column\r\n            \"str\": 2,\r\n            \"edr\": 6,\r\n            \"stc\": 1,\r\n            \"edc\": 3\r\n        }\r\n    }\r\n    ```\r\n    1. The `key` value of `filter[key]` means the column index, starting from 0, the `cindex` in the specific setting item starts from 1, which has the same meaning as the `key` here.\r\n    2. `caljs` is used to set the filter type and the corresponding value. After the setting takes effect, the hidden row information will be calculated and stored in `rowhidden`. The following are all the types that can be set, among which `value1` and `value2` are the text information filled in by the user:\r\n       + `caljs:{value: null, text: \"None\", type: \"0\"}`\r\n       + `caljs:{value: \"cellnull\", text: \"Is empty\", type: \"0\"}`\r\n       + `caljs:{value: \"cellnonull\", text: \"Is not empty\", type: \"0\"}`\r\n       + `caljs:{value: \"textinclude\", text: \"Text contains\", type: \"1\", value1: \"Lucky\"}`\r\n       + `caljs:{value: \"textnotinclude\", text: \"Text does not contain\", type: \"1\", value1: \"Lucky\"}`\r\n       + `caljs:{value: \"textstart\", text: \"Text starts with\", type: \"1\", value1: \"Lucky\"}`\r\n       + `caljs:{value: \"textend\", text: \"Text ends with\", type: \"1\", value1: \"Lucky\"}`\r\n       + `caljs:{value: \"textequal\", text: \"Text is exactly\", type: \"1\", value1: \"Lucky\"}`\r\n       + `caljs:{value: \"dateequal\", text: \"Date is\", type: \"1\", value1: \"2020-10-16\"}`\r\n       + `caljs:{value: \"datelessthan\", text: \"Date is before\", type: \"1\", value1: \"2020-10-16\"}`\r\n       + `caljs:{value: \"datemorethan\", text: \"Date is after\", type: \"1\", value1: \"2020-10-16\"}`\r\n       + `caljs:{value: \"morethan\", text: \"Greater than\", type: \"1\", value1: \"10\"}`\r\n       + `caljs:{value: \"moreequalthan\", text: \"Greater than or equal to\", type: \"1\", value1: \"10\"}`\r\n       + `caljs:{value: \"lessthan\", text: \"Less than\", type: \"1\", value1: \"10\"}`\r\n       + `caljs:{value: \"lessequalthan\", text: \"Less than or equal to\", type: \"1\", value1: \"10\"}`\r\n       + `caljs:{value: \"equal\", text: \"Is equal to\", type: \"1\", value1: \"10\"}`\r\n       + `caljs:{value: \"noequal\", text: \"Is not equal to\", type: \"1\", value1: \"10\"}`\r\n       + `caljs:{value: \"include\", text: \"Is between\", type: \"2\", value1: \"15\", value2: \"25\"}`\r\n       + `caljs:{value: \"noinclude\", text: \"Is not between\", type: \"2\", value1: \"15\", value2: \"25\"}`\r\n    3. `rowhidden` is stored hidden row information, but if `caljs` is not set to filter by conditions, it means that color filtering (if there is a color distinction between the rows) and filtering by value are set. So it can be seen that the priority of `caljs` is greater than that of `rowhidden`.\r\n    4. `optionstate` indicates whether to enable the configuration, this is an internal flag, just set `true` directly.\r\n    5. `cindex` represents the column order currently set, counting from 1 and corresponding to the `key` value of `filter[key]`, and the result is `key`+1.\r\n    6. `str` is the start row, `edr` is the end row, `stc` is the start column, and `edc` is the end column. The four numbers represent the entire filter range, which should be consistent with the content of `filter_select`.\r\n\r\n------------\r\n### luckysheet_alternateformat_save\r\n- type：Array\r\n- default：[]\r\n- usage： Alternating color configuration\r\n- example：\r\n    ```js\r\n    [{\r\n        \"cellrange\": { //cell range\r\n            \"row\": [1, 6],\r\n            \"column\": [1, 5]\r\n        },\r\n        \"format\": {\r\n            \"head\": { //Header color\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#5ed593\"\r\n            },\r\n            \"one\": { //The first color\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#ffffff\"\r\n            },\r\n            \"two\": { //The second color\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#e5fbee\"\r\n            },\r\n            \"foot\": { //Footers color\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#a5efcc\"\r\n            }\r\n        },\r\n        \"hasRowHeader\": false, //is included header\r\n        \"hasRowFooter\": false //is included footer\r\n    }, {\r\n        \"cellrange\": {\r\n            \"row\": [1, 6],\r\n            \"column\": [8, 12]\r\n        },\r\n        \"format\": {\r\n            \"head\": {\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#5599fc\"\r\n            },\r\n            \"one\": {\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#ffffff\"\r\n            },\r\n            \"two\": {\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#ecf2fe\"\r\n            },\r\n            \"foot\": {\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#afcbfa\"\r\n            }\r\n        },\r\n        \"hasRowHeader\": false,\r\n        \"hasRowFooter\": false\r\n    }]\r\n    ```\r\n\r\n------------\r\n### luckysheet_alternateformat_save_modelCustom\r\n- type：Array\r\n- default：[]\r\n- usage：Custom alternate colors, including multiple custom alternate colors configuration\r\n- example：\r\n    ```js\r\n    [{\r\n        \"head\": { //Header color\r\n            \"fc\": \"#6aa84f\",\r\n            \"bc\": \"#ffffff\"\r\n        },\r\n        \"one\": { //The first color\r\n            \"fc\": \"#000\",\r\n            \"bc\": \"#ffffff\"\r\n        },\r\n        \"two\": { //The second color\r\n            \"fc\": \"#000\",\r\n            \"bc\": \"#e5fbee\"\r\n        },\r\n        \"foot\": { //The footer color\r\n            \"fc\": \"#000\",\r\n            \"bc\": \"#a5efcc\"\r\n        }\r\n    }]\r\n    ```\r\n\r\n------------\r\n### luckysheet_conditionformat_save\r\n- type：Array\r\n- default：[]\r\n- usage： Conditional format configuration information, a one-dimensional array containing multiple conditional format configuration objects,\r\n\r\n    type: \"default\": Highlight cell rules and project selection rules,\r\n\r\n    \"dataBar\":Data bar,\r\n\r\n    \"icons\":Icon set,\r\n\r\n    \"colorGradation\": Color scale\r\n\r\n    You can get more detail in this API page[API setRangeConditionalFormat](/zh/guide/api.html)\r\n- example：\r\n    ```js\r\n    [\r\n        {\r\n            \"type\": \"default\",\r\n            \"cellrange\": [ //cell range\r\n                {\r\n                    \"row\": [ 2, 7 ],\r\n                    \"column\": [ 2, 2 ]\r\n                }\r\n            ],\r\n            \"format\": { //when type is default, you should set the text color and cell color \r\n                \"textColor\": \"#000000\",\r\n                \"cellColor\": \"#ff0000\"\r\n            },\r\n            \"conditionName\": \"betweenness\", //type\r\n            \"conditionRange\": [ //condition value in the cell \r\n                {\r\n                    \"row\": [ 4, 4 ],\r\n                    \"column\": [ 2, 2 ]\r\n                },\r\n                {\r\n                    \"row\": [ 6, 6 ],\r\n                    \"column\": [ 2, 2 ]\r\n                }\r\n            ],\r\n            \"conditionValue\": [ 2, 4\r\n            ] //Customize the condition value\r\n        },\r\n        {\r\n            \"type\": \"dataBar\",\r\n            \"cellrange\": [\r\n                {\r\n                    \"row\": [ 10, 15 ],\r\n                    \"column\": [ 10, 11 ]\r\n                }\r\n            ],\r\n            \"format\": [\r\n                \"#6aa84f\",\r\n                \"#ffffff\"\r\n            ]\r\n        },\r\n        {\r\n            \"type\": \"icons\",\r\n            \"cellrange\": [\r\n                {\r\n                    \"row\": [ 19, 23 ],\r\n                    \"column\": [ 2, 2 ]\r\n                }\r\n            ],\r\n            \"format\": {\r\n                \"len\": \"3\",\r\n                \"leftMin\": \"0\",\r\n                \"top\": \"0\"\r\n            }\r\n        },\r\n        {\r\n            \"type\": \"colorGradation\",\r\n            \"cellrange\": [\r\n                {\r\n                    \"row\": [ 10, 15 ],\r\n                    \"column\": [ 6, 6 ]\r\n                }\r\n            ],\r\n            \"format\": [\r\n                \"rgb(99, 190, 123)\",\r\n                \"rgb(255, 235, 132)\",\r\n                \"rgb(248, 105, 107)\"\r\n            ]\r\n        }\r\n    ]\r\n    ```\r\n\r\n------------\r\n### frozen\r\n- type：Array\r\n- default：[]\r\n- usage： the settings of freeze row and column which is divided into 6 types\r\n    1. \"row\": the first freeze row\r\n    2. \"column\": the first freeze column\r\n    3. \"both\": the freeze rows and columns\r\n    4. \"rangeRow\": Freeze row to range\r\n    5. \"rangeColumn\": Freeze column to range\r\n    6. \"rangeBoth\": Freeze column and row to range\r\n    7. \"cancel\": cancel freeze\r\n\r\n    When setting the freezing to the selected area, you need to set the cell position to turn on the freezing. The format should like this`{ row_focus:0, column_focus:0 }`，which mean the rows and cols of an active cell.\r\n\r\n    The new configuration property of sheet, which stores more semantic configuration, is used to initialize and pass to the server.\r\n    \r\n    Be careful, you can find `freezenhorizontaldata` in the luckysheetfile that used for freezen, however `freezenhorizontaldata` is only for local debugging。\r\n\r\n- example：\r\n    - Freeze first line\r\n    ```json\r\n    {\r\n        type: 'row'\r\n    }\r\n    ```\r\n    - Freeze row and column to `'A1'`\r\n     ```json\r\n    {\r\n        type: 'rangeRow',\r\n        range: {row_focus: 0, column_focus: 0}\r\n    }\r\n    ```\r\n    - Freeze row and column to `'B2'`\r\n     ```json\r\n    {\r\n        type: 'rangeBoth',\r\n        range: {row_focus: 1, column_focus: 1}\r\n    }\r\n    ```\r\n\r\n------------\r\n### chart\r\n- type：Array\r\n- default：[]\r\n- usage： Chart configuration, plz refer to chartMix configuration. Allows you to set only the desired chart properties.\r\n- example：\r\n    :::::: details\r\n    ```json\r\n    {\r\n        \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n        \"width\": 400,\r\n        \"height\": 250,\r\n        \"left\": 20,\r\n        \"top\": 120,\r\n        \"sheetIndex\": \"Sheet_6az6nei65t1i_1596209937084\",\r\n        \"needRangeShow\": true,\r\n        \"chartOptions\": {\r\n            \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n            \"chartAllType\": \"echarts|line|default\",\r\n            \"rangeArray\": [ { \"row\": [ 0, 4 ], \"column\": [ 0, 7 ] } ],\r\n            \"rangeColCheck\": { \"exits\": true, \"range\": [ 0, 0 ] },\r\n            \"rangeRowCheck\": { \"exits\": true, \"range\": [ 0, 0 ] },\r\n            \"rangeConfigCheck\": false,\r\n            \"defaultOption\": {\r\n                \"title\": {\r\n                    \"show\": false,\r\n                    \"text\": \"default title\",\r\n                    \"label\": {\r\n                        \"fontSize\": 12,\r\n                        \"color\": \"#333\",\r\n                        \"fontFamily\": \"sans-serif\",\r\n                        \"fontGroup\": [],\r\n                        \"cusFontSize\": 12\r\n                    },\r\n                    \"position\": {\r\n                        \"value\": \"left-top\",\r\n                        \"offsetX\": 40,\r\n                        \"offsetY\": 50\r\n                    }\r\n                },\r\n                \"subtitle\": {\r\n                    \"show\": false,\r\n                    \"text\": \"\",\r\n                    \"label\": {\r\n                        \"fontSize\": 12,\r\n                        \"color\": \"#333\",\r\n                        \"fontFamily\": \"sans-serif\",\r\n                        \"fontGroup\": [],\r\n                        \"cusFontSize\": 12\r\n                    },\r\n                    \"distance\": {\r\n                        \"value\": \"auto\",\r\n                        \"cusGap\": 40\r\n                    }\r\n                },\r\n                \"config\": {\r\n                    \"color\": \"transparent\",\r\n                    \"fontFamily\": \"Sans-serif\",\r\n                    \"grid\": {\r\n                        \"value\": \"normal\",\r\n                        \"top\": 5,\r\n                        \"left\": 10,\r\n                        \"right\": 20,\r\n                        \"bottom\": 10\r\n                    }\r\n                },\r\n                \"legend\": {\r\n                    \"show\": true,\r\n                    \"selectMode\": \"multiple\",\r\n                    \"selected\": [\r\n                        {\r\n                            \"seriesName\": \"衣服\",\r\n                            \"isShow\": true\r\n                        },\r\n                        {\r\n                            \"seriesName\": \"食材\",\r\n                            \"isShow\": true\r\n                        },\r\n                        {\r\n                            \"seriesName\": \"图书\",\r\n                            \"isShow\": true\r\n                        }\r\n                    ],\r\n                    \"label\": {\r\n                        \"fontSize\": 12,\r\n                        \"color\": \"#333\",\r\n                        \"fontFamily\": \"sans-serif\",\r\n                        \"fontGroup\": [],\r\n                        \"cusFontSize\": 12\r\n                    },\r\n                    \"position\": {\r\n                        \"value\": \"left-top\",\r\n                        \"offsetX\": 40,\r\n                        \"offsetY\": 50,\r\n                        \"direction\": \"horizontal\"\r\n                    },\r\n                    \"width\": {\r\n                        \"value\": \"auto\",\r\n                        \"cusSize\": 25\r\n                    },\r\n                    \"height\": {\r\n                        \"value\": \"auto\",\r\n                        \"cusSize\": 14\r\n                    },\r\n                    \"distance\": {\r\n                        \"value\": \"auto\",\r\n                        \"cusGap\": 10\r\n                    },\r\n                    \"itemGap\": 10,\r\n                    \"data\": [\r\n                        \"Mon\",\r\n                        \"Tues\",\r\n                        \"Wed\",\r\n                        \"Thur\",\r\n                        \"Fri\",\r\n                        \"Sat\",\r\n                        \"Sun\"\r\n                    ]\r\n                },\r\n                \"tooltip\": {\r\n                    \"show\": true,\r\n                    \"label\": {\r\n                        \"fontSize\": 12,\r\n                        \"color\": \"#333\",\r\n                        \"fontFamily\": \"sans-serif\",\r\n                        \"fontGroup\": [],\r\n                        \"cusFontSize\": 12\r\n                    },\r\n                    \"backgroundColor\": \"rgba(50,50,50,0.7)\",\r\n                    \"triggerOn\": \"mousemove\",\r\n                    \"triggerType\": \"item\",\r\n                    \"axisPointer\": {\r\n                        \"type\": \"line\",\r\n                        \"style\": {\r\n                            \"color\": \"#555\",\r\n                            \"width\": \"normal\",\r\n                            \"type\": \"solid\"\r\n                        }\r\n                    },\r\n                    \"format\": [\r\n                        {\r\n                            \"seriesName\": \"衣服\",\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\"\r\n                        },\r\n                        {\r\n                            \"seriesName\": \"食材\",\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\"\r\n                        },\r\n                        {\r\n                            \"seriesName\": \"图书\",\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\"\r\n                        }\r\n                    ],\r\n                    \"position\": \"auto\"\r\n                },\r\n                \"axis\": {\r\n                    \"axisType\": \"xAxisDown\",\r\n                    \"xAxisUp\": {\r\n                        \"show\": false,\r\n                        \"title\": {\r\n                            \"showTitle\": false,\r\n                            \"text\": \"\",\r\n                            \"nameGap\": 15,\r\n                            \"rotate\": 0,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"fzPosition\": \"end\"\r\n                        },\r\n                        \"name\": \"显示X轴\",\r\n                        \"inverse\": false,\r\n                        \"tickLine\": {\r\n                            \"show\": true,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tick\": {\r\n                            \"show\": true,\r\n                            \"position\": \"outside\",\r\n                            \"length\": 5,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tickLabel\": {\r\n                            \"show\": true,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"rotate\": 0,\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"optimize\": 0,\r\n                            \"distance\": 0,\r\n                            \"min\": \"auto\",\r\n                            \"max\": \"auto\",\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\"\r\n                        },\r\n                        \"netLine\": {\r\n                            \"show\": false,\r\n                            \"width\": 1,\r\n                            \"type\": \"solid\",\r\n                            \"color\": \"auto\",\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            }\r\n                        },\r\n                        \"netArea\": {\r\n                            \"show\": false,\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            },\r\n                            \"colorOne\": \"auto\",\r\n                            \"colorTwo\": \"auto\"\r\n                        },\r\n                        \"axisLine\": {\r\n                            \"onZero\": false\r\n                        }\r\n                    },\r\n                    \"xAxisDown\": {\r\n                        \"show\": true,\r\n                        \"title\": {\r\n                            \"showTitle\": false,\r\n                            \"text\": \"\",\r\n                            \"nameGap\": 15,\r\n                            \"rotate\": 0,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"fzPosition\": \"end\"\r\n                        },\r\n                        \"name\": \"显示X轴\",\r\n                        \"inverse\": false,\r\n                        \"tickLine\": {\r\n                            \"show\": true,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tick\": {\r\n                            \"show\": true,\r\n                            \"position\": \"outside\",\r\n                            \"length\": 5,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tickLabel\": {\r\n                            \"show\": true,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"rotate\": 0,\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"optimize\": 0,\r\n                            \"distance\": 0,\r\n                            \"min\": null,\r\n                            \"max\": null,\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\"\r\n                        },\r\n                        \"netLine\": {\r\n                            \"show\": false,\r\n                            \"width\": 1,\r\n                            \"type\": \"solid\",\r\n                            \"color\": \"auto\",\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            }\r\n                        },\r\n                        \"netArea\": {\r\n                            \"show\": false,\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            },\r\n                            \"colorOne\": \"auto\",\r\n                            \"colorTwo\": \"auto\"\r\n                        },\r\n                        \"data\": [\r\n                            \"BUS\",\r\n                            \"UBER\",\r\n                            \"TAXI\",\r\n                            \"SUBWAY\"\r\n                        ],\r\n                        \"type\": \"category\"\r\n                    },\r\n                    \"yAxisLeft\": {\r\n                        \"show\": true,\r\n                        \"title\": {\r\n                            \"showTitle\": false,\r\n                            \"text\": \"\",\r\n                            \"nameGap\": 15,\r\n                            \"rotate\": 0,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"fzPosition\": \"end\"\r\n                        },\r\n                        \"name\": \"显示Y轴\",\r\n                        \"inverse\": false,\r\n                        \"tickLine\": {\r\n                            \"show\": true,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tick\": {\r\n                            \"show\": true,\r\n                            \"position\": \"outside\",\r\n                            \"length\": 5,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tickLabel\": {\r\n                            \"show\": true,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"rotate\": 0,\r\n                            \"formatter\": {\r\n                                \"prefix\": \"\",\r\n                                \"suffix\": \"\",\r\n                                \"ratio\": 1,\r\n                                \"digit\": \"auto\"\r\n                            },\r\n                            \"split\": 5,\r\n                            \"min\": null,\r\n                            \"max\": null,\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\",\r\n                            \"distance\": 0\r\n                        },\r\n                        \"netLine\": {\r\n                            \"show\": false,\r\n                            \"width\": 1,\r\n                            \"type\": \"solid\",\r\n                            \"color\": \"auto\",\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            }\r\n                        },\r\n                        \"netArea\": {\r\n                            \"show\": false,\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            },\r\n                            \"colorOne\": \"auto\",\r\n                            \"colorTwo\": \"auto\"\r\n                        },\r\n                        \"type\": \"value\"\r\n                    },\r\n                    \"yAxisRight\": {\r\n                        \"show\": false,\r\n                        \"title\": {\r\n                            \"showTitle\": false,\r\n                            \"text\": \"\",\r\n                            \"nameGap\": 15,\r\n                            \"rotate\": 0,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"fzPosition\": \"end\"\r\n                        },\r\n                        \"name\": \"显示Y轴\",\r\n                        \"inverse\": false,\r\n                        \"tickLine\": {\r\n                            \"show\": true,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tick\": {\r\n                            \"show\": true,\r\n                            \"position\": \"outside\",\r\n                            \"length\": 5,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tickLabel\": {\r\n                            \"show\": true,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"rotate\": 0,\r\n                            \"formatter\": {\r\n                                \"prefix\": \"\",\r\n                                \"suffix\": \"\",\r\n                                \"ratio\": 1,\r\n                                \"digit\": \"auto\"\r\n                            },\r\n                            \"split\": 5,\r\n                            \"min\": null,\r\n                            \"max\": null,\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\",\r\n                            \"distance\": 0\r\n                        },\r\n                        \"netLine\": {\r\n                            \"show\": false,\r\n                            \"width\": 1,\r\n                            \"type\": \"solid\",\r\n                            \"color\": \"auto\",\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            }\r\n                        },\r\n                        \"netArea\": {\r\n                            \"show\": false,\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            },\r\n                            \"colorOne\": \"auto\",\r\n                            \"colorTwo\": \"auto\"\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        },\r\n        \"isShow\": true\r\n    }\r\n    ```\r\n    :::\r\n\r\n------------\r\n### zoomRatio\r\n- type：Number\r\n- default：1\r\n- usage： the zoom ratio of a sheet, which is a two decimal digit between 0~1, like `0.1`、`0.56`.\r\n\r\n------------\r\n### image\r\n- type：Array\r\n- default：[]\r\n- usage： Insert the picture information in the table, including picture address, width and height, position, cropping and other information\r\n- example：\r\n    The following is an example of `imageItem`, usually there may be multiple images in a worksheet, so the format of `image` is array `[imageItem,imageItem,...]`\r\n    ```json\r\n    {\r\n        type: '3', //1 Move and resize the cell 2 Move and do not resize the cell 3 Don't move and resize the cell\r\n        src:'', //image url\r\n        originWidth: 1484, //The original width of the picture\r\n        originHeight: 834, //The original height of the picture\r\n        default: {\r\n            width: 293, //image width\r\n            height: 196, //image height\r\n            left: 409, //The position of the picture from the left of the table\r\n            top: 248, //The position of the picture from the top of the table\r\n        },\r\n        crop: {\r\n            width: 293, //The width of the picture after cropping\r\n            height: 196, //The height of the picture after cropping\r\n            offsetLeft: 0, //Displacement from the left of the picture after cropping\r\n            offsetTop: 0, //Displacement from the left of the picture after cropping\r\n        },\r\n        isFixedPos: false, //Fixed position\r\n        fixedLeft: 507, //Fixed position left displacement\r\n        fixedTop: 141, //fixed position right displacement\r\n        border: {\r\n            width: 0, //border width\r\n            radius: 0, //Border radius\r\n            style:'solid', //border type\r\n            color:'#000', //Border color\r\n        }\r\n    }\r\n    ```\r\n------------\r\n### showGridLines\r\n- Type: Number\r\n- Default: 1\r\n- Usage: Whether to show grid lines, `1` means show, `0` means hidden\r\n\r\n------------\r\n\r\n## debug information\r\nThe parameters required for initialization will be designed as simple as possible, but the parameters stored locally are different.\r\n\r\nAfter initialization, Luckysheet stores more and more local data in luckysheetfile as local parameter. It means that we can realize the usage of Store data center. For example, the format of Freezen's parameters will also change.\r\n\r\nAt this point, the lucky sheet file contains many local parameters that are not initialized and can be used to debug、analysis local status. you can use  `luckysheet.getluckysheetfile()` to get more information：\r\n\r\n::: details\r\n```json\r\n[\r\n    {\r\n        \"name\": \"Cell\", //Worksheet name\r\n        \"color\": \"\", //Worksheet color\r\n        \"index\": 0, //Worksheet index\r\n        \"status\": 1, //Worksheet active status\r\n        \"order\": 0, //The order of the worksheet\r\n        \"hide\": 0,//Whether worksheet hide \r\n        \"row\": 36, //The number of rows in a sheet\r\n        \"column\": 18, //The number of columns in a sheet\r\n        \"celldata\": [], //Initial the cell data\r\n        \"config\": {\r\n            \"merge\":{}, //Merged cells\r\n            \"rowlen\":{}, //Table row height\r\n            \"columnlen\":{}, //Table column width\r\n            \"rowhidden\":{}, //Hidden rows\r\n            \"colhidden\":{}, //Hidden columns\r\n            \"borderInfo\":{}, //Borders\r\n            \"authority\":{}, //Worksheet protection\r\n        },\r\n        \"scrollLeft\": 0, //Left and right scroll bar position\r\n        \"scrollTop\": 315, //Up and down scroll bar position\r\n        \"luckysheet_select_save\": [], //Selected area\r\n        \"calcChain\": [],//Formula chain\r\n        \"isPivotTable\":false,//Whether is pivot table\r\n        \"pivotTable\":{},//Pivot table settings\r\n        \"filter_select\": {},//Filter range\r\n        \"filter\": null,//Filter configuration\r\n        \"luckysheet_alternateformat_save\": [], //Alternate colors\r\n        \"luckysheet_alternateformat_save_modelCustom\": [], //Customize alternate colors\t\r\n        \"luckysheet_conditionformat_save\": {},//Condition format\r\n        \"frozen\": {}, //Freeze row and column configuration\r\n        \"freezen\": {}, //Storage freeze row and column rendering data\r\n        \"chart\": [], //Chart configuration\r\n        \"zoomRatio\":1, // Zoom ratio\r\n        \"image\":[], //image\r\n        \"showGridLines\": 1, //Whether to show grid lines\r\n        \r\n\r\n        \"visibledatarow\": [], //Positions of all rows\r\n        \"visibledatacolumn\": [], //Positions of all columns\r\n        \"ch_width\": 2322, //The width of a sheet\r\n        \"rh_height\": 949, //The heighSt of a sheet\r\n        \"load\": \"1\", //Check whether this sheed has been loaded\r\n        \"data\": [], // Store and update the cell data\r\n    },\r\n    {\r\n        \"name\": \"Sheet2\",\r\n        \"color\": \"\",\r\n        \"index\": 1,\r\n        \"status\": 0,\r\n        \"order\": 1,\r\n        \"celldata\": [],\r\n        \"config\": {}\r\n    },\r\n    {\r\n        \"name\": \"Sheet3\",\r\n        \"color\": \"\",\r\n        \"index\": 2,\r\n        \"status\": 0,\r\n        \"order\": 2,\r\n        \"celldata\": [],\r\n        \"config\": {},\r\n    }\r\n]\r\n```\r\n:::\r\n\r\n### visibledatarow\r\n- type：Number\r\n- default：[]\r\n- usage： Position information of all rows, incremental row position data, No need to set up for initialization\r\n\r\n------------\r\n### visibledatacolumn\r\n- type：Number\r\n- default：[]\r\n- usage： Position information of all columns, incremental column position data, No need to set up for initialization\r\n\r\n------------\r\n### ch_width\r\n- type：Number\r\n- default：2322\r\n- usage： The width of the entire worksheet area (the gray area including the border), No need to set up for initialization\r\n\r\n------------\r\n### rh_height\r\n- type：Number\r\n- default：2322\r\n- usage： The height of the entire worksheet area (the gray area containing the border), No need to set up for initialization\r\n\r\n------------\r\n### load\r\n- type：Number\r\n- default：0\r\n- usage： Check whether the current sheet has been loaded, internal indicator, initialization does not need to be set\r\n\r\n------------\r\n### data\r\n- type：Array\r\n- default：[]\r\n- usage： conveted from celldata in initialization stage. `data` will have the update operation data.Initialization does not need to be set\r\n- example：\r\n    Here is a two row, two column data\r\n    ```json\r\n    [\r\n        [{\r\n            ct: {fa: \"General\", t: \"g\"},\r\n            m:\"value1\",\r\n            v:\"value1\"\r\n        }, {\r\n            ct: {fa: \"General\", t: \"g\"},\r\n            m:\"value2\",\r\n            v:\"value2\"\r\n        }],\r\n        [{\r\n            ct: {fa: \"General\", t: \"g\"},\r\n            m:\"value3\",\r\n            v:\"value3\"\r\n        }, {\r\n            ct: {fa: \"General\", t: \"g\"},\r\n            m:\"value4\",\r\n            v:\"value4\"\r\n        }]\r\n    ]\r\n\r\n    ```\r\n\r\n------------\r\n"
  },
  {
    "path": "docs/zh/README.md",
    "content": "---\r\nhome: true\r\nheroText: Luckysheet\r\ntagline: 配置文档 · API · 教程\r\nactionText: 快速上手 →\r\nactionLink: /zh/guide/\r\nfeatures:\r\n- title: 功能强大\r\n  details: 包含大量常用电子表格功能,替代你的excel\r\n- title: 配置简单\r\n  details: 最少的配置就能开始上手使用\r\n- title: 完全开源\r\n  details: 社区驱动,共同来完善你的想法\r\nfooter: MIT Licensed | Copyright © 2020-present Mengshukeji\r\n---"
  },
  {
    "path": "docs/zh/about/README.md",
    "content": "# 认识团队\r\n\r\nLuckysheet是由个人主导、几个志同道合的小伙伴一同开发的项目。\r\n\r\n## 核心团队活跃成员\r\n- [@wbfsa](https://github.com/wbfsa)\r\n- [@eiji-th](https://github.com/eiji-th)\r\n- [@fly-95](https://github.com/fly-95)\r\n- [@tonytonychopper123](https://github.com/tonytonychopper123)\r\n- [@Dushusir](https://github.com/Dushusir)\r\n- [@iamxuchen800117](https://github.com/iamxuchen800117)\r\n- [@wpxp123456](https://github.com/wpxp123456)\r\n- [@c19c19i](https://weibo.com/u/3884623955)\r\n- [@zhangchen915](https://github.com/zhangchen915)\r\n- [@jerry-f](https://github.com/jerry-f)\r\n- [@flowerField](https://github.com/flowerField)\r\n\r\n## 社区伙伴\r\n- [@yiwasheng](https://github.com/yiwasheng)\r\n- [@danielcai1987](https://github.com/danielcai1987)\r\n- [@qq6690876](https://github.com/qq6690876)\r\n- [@javahuang](https://github.com/javahuang)\r\n- [@TimerGang](https://github.com/TimerGang)\r\n- [@gsw945](https://github.com/gsw945)\r\n- [@swen-xiong](https://github.com/swen-xiong)\r\n- [@lzmch](https://github.com/lzmch)\r\n- [@kdevilpf](https://github.com/kdevilpf)\r\n- [@WJWM0316](https://github.com/WJWM0316)"
  },
  {
    "path": "docs/zh/about/company.md",
    "content": "# 社区案例\r\n\r\n我们搜集到了很多来自社区的案例反馈，还发现了以前我们没有预想到的Luckysheet使用场景。\r\n\r\n积极聆听社区的声音，在大家的支持和反馈中不断更新迭代，已是我们的责任。\r\n\r\n\r\n## 公司案例\r\n\r\n<table>\r\n  <tbody>\r\n    <tr>\r\n      <td align=\"center\" valign=\"middle\">\r\n        <a href=\"https://www.zpy360.com/\" target=\"_blank\">\r\n          <img width=\"222px\" src=\"https://cdn.jsdelivr.net/npm/luckyresources/assets/img/community_case/Zhiping_Cloud.png\">\r\n        </a>\r\n        <p>雄安智评云数字科技有限公司</p>\r\n      </td>\r\n      <td align=\"center\" valign=\"middle\">\r\n        <a href=\"https://code-the-future.com/\" target=\"_blank\">\r\n          <img width=\"222px\" src=\"https://cdn.jsdelivr.net/npm/luckyresources/assets/img/community_case/code_the_future.png\">\r\n        </a>\r\n        <p>Code the Future</p>\r\n      </td>\r\n      <td align=\"center\" valign=\"middle\">\r\n        <a href=\"http://www.jackyun.com/\" target=\"_blank\">\r\n          <img width=\"222px\" src=\"https://cdn.jsdelivr.net/npm/luckyresources/assets/img/community_case/jackyun.png\">\r\n        </a>\r\n        <p>吉客云</p>\r\n      </td>\r\n      <td align=\"center\" valign=\"middle\">\r\n        <a href=\"https://www.huawei.com/cn/\" target=\"_blank\">\r\n          <img width=\"222px\" src=\"https://cdn.jsdelivr.net/npm/luckyresources/assets/img/community_case/huawei.png\">\r\n        </a>\r\n        <p>华为</p>\r\n      </td>\r\n    </tr>\r\n    <tr>\r\n      <td align=\"center\" valign=\"middle\">\r\n      </td>\r\n      <td align=\"center\" valign=\"middle\">\r\n      </td>\r\n      <td align=\"center\" valign=\"middle\">\r\n      </td>\r\n      <td align=\"center\" valign=\"middle\">\r\n      </td>\r\n    </tr>\r\n  </tbody>\r\n</table>"
  },
  {
    "path": "docs/zh/about/sponsor.md",
    "content": "# 赞助\r\n\r\n## 为什么赞助\r\n\r\n如果您经营一家企业并在盈利产品中使用Luckysheet，那么赞助Luckysheet开发将具有商业意义：它可确保您的产品所依赖的项目保持健康并得到积极维护。 它还可以帮助您在Luckysheet社区中曝光，使得更多的人关注您的产品。\r\n\r\n当然，如果Luckysheet在您的工作或个人项目中为您提供了帮助，也欢迎请作者喝杯果汁😋。\r\n\r\n## 赞助方式\r\n\r\nLuckysheet是MIT许可的开源项目，其持续稳定的开发离不开这些优秀的 [**支持者**](#赞助者列表)。 如果您想加入他们，请考虑：\r\n\r\n- [成为Patreon的支持者或赞助商](https://www.patreon.com/mengshukeji)\r\n- [成为Open Collective的支持者或赞助商](https://opencollective.com/luckysheet)\r\n- 通过PayPal，微信或支付宝一次性捐赠\r\n\r\n| PayPal |  微信  | 支付宝 |\r\n|---|---|---|\r\n| [Paypal Me](https://www.paypal.me/wbfsa) | <img src=\"https://minio.cnbabylon.com/public/luckysheet/wechat.jpg\" width=\"140\" />| <img src=\"https://minio.cnbabylon.com/public/luckysheet/alipay.jpg\" width=\"130\" /> |\r\n\r\n### Patreon和OpenCollective有什么区别？\r\n\r\n通过Patreon捐赠的资金将直接用于支持menshshukeji在Luckysheet上的工作。 通过OpenCollective捐赠的资金由透明费用管理，将用于补偿核心团队成员的工作和费用或赞助社区活动。 通过在任一平台上捐款，您的姓名/徽标将得到适当的认可和曝光。\r\n\r\n## 赞助者列表\r\n\r\n（按时间顺序排列）\r\n- *涛 ¥ 200\r\n- popo ¥ 1\r\n- 孔垂善 ¥ 5\r\n- Shawn文 ¥ 99\r\n- 幸运的小路易 ¥ 1\r\n- 冯启俊 ¥ 88\r\n- mxb ¥ 10\r\n- 祭阳 ¥ 20\r\n- *勇 ¥ 30\r\n- 虚我 ¥ 200\r\n- 甜党 ¥ 50\r\n- Alphabet(Google)-gcf ¥ 1\r\n- **平 ¥ 100\r\n- **东 ¥ 10\r\n- debugger ¥ 20\r\n- 烦了烦 ¥ 10\r\n- 文顶顶 ¥ 200\r\n- yangxshn ¥ 10\r\n- 爱乐 ¥ 100\r\n- 小李飞刀刀 ¥ 66\r\n- 张铭 ¥ 200\r\n- 曹治军 ¥ 1\r\n- *特 ¥ 10\r\n- **权 ¥ 9.9\r\n- **sdmq ¥ 20\r\n- *旭 ¥ 10\r\n- Quentin ¥ 20\r\n- 周宇凡 ¥ 100\r\n- *超 ¥ 10\r\n- 维宁 ¥ 100\r\n- hyy ¥ 20\r\n- 雨亭寒江月 ¥ 50\r\n- **功 ¥ 10\r\n- **光 ¥ 20\r\n- terrywan ¥ 100\r\n- 王晓洪 ¥ 10\r\n- Sun ¥ 10\r\n- 忧绣 ¥ 100\r\n- Jasonx ¥ 10\r\n- 国勇 ¥ 66.6\r\n- 郎志 ¥ 100\r\n- 匿名 ¥ 1\r\n- ni ¥ 100\r\n- 苏 ¥ 50\r\n- Mads_chan ¥ 1\r\n- LK ¥ 100\r\n- 智连方舟 李汪石 ¥ 168\r\n- **发 ¥ 260\r\n- *超 ¥ 10\r\n- *勇 ¥ 10\r\n- *腾 ¥ 15\r\n- 名字好难起 ¥ 20\r\n- 大山 ¥ 1\r\n- waiting ¥ 1000\r\n- **宇 ¥ 10.00\r\n- 刘小帅的哥哥 ¥ 20.00\r\n- 宁静致远 ¥ 10.00\r\n- Eleven ¥ 1.00\r\n- **帆 ¥ 188\r\n- henry ¥ 100\r\n- .波罗 ¥ 50\r\n- 花落有家 ¥ 50\r\n- 踏遍南水北山 ¥ 1\r\n- LC ¥ 5\r\n- **明 ¥ 8.80\r\n- *军 ¥ 20\r\n- 张彪 ¥ 50\r\n- 企业文档云@肖敏 ¥ 10\r\n- 匿名 ¥ 50\r\n- 逍遥行 ¥ 10\r\n- z.wasaki ¥ 50\r\n- Make Children ¥ 20\r\n- Foam ¥ 20\r\n- 奥特曼( o|o)ノ三 ¥ 50\r\n- **凯 ¥ 10\r\n- **兵 ¥ 20\r\n- **川 ¥ 1\r\n- 二万 ¥ 50\r\n- 蔚然成林 ¥ 10\r\n- 邹杰 ¥ 10\r\n- 张永强 ¥ 50\r\n- 鱼得水 ¥ 50\r\n- Ccther ¥ 1\r\n- Eric Cheng ¥ 10\r\n- 佚名 ¥ 1\r\n- 花叶 ¥ 50\r\n- GT ¥ 20\r\n- 菜菜心 ¥ 10\r\n- fisher ¥ 1\r\n- JC ¥ 5\r\n- 佚名 ¥ 20\r\n- 独孤一剑 ¥ 50\r\n- mxt ¥ 20\r\n- 一叶迷山 ¥ 100\r\n- Jeff ¥ 100\r\n- 八千多条狗🐶 ¥ 100\r\n- 晓峰 ¥ 10\r\n- 戒 ¥ 1\r\n- 浪里个浪 ¥ 1\r\n- 回调函数 ¥ 50\r\n- 赖瓜子 ¥ 5\r\n- Milo•J ¥ 20\r\n- 可道云 ¥ 200\r\n- *程 ¥ 10\r\n- 来一杯卡布酸奶 ¥ 5\r\n- 刘久胜 ¥ 100\r\n- 快意江湖 ¥ 50\r\n- *新 ¥ 9.9\r\n- **龙 ¥ 100\r\n- **江 ¥ 100\r\n- **威 ¥ 9.8\r\n- **涛 ¥ 500\r\n- **嘉 ¥ 10\r\n- *涛 ¥ 1\r\n- *兵 ¥ 5\r\n- *阳 ¥ 200\r\n- *辉 ¥ 1\r\n- *帆 ¥ 30\r\n- **旺 ¥ 10\r\n- **麟 ¥ 20\r\n- *霖 ¥ 9.9\r\n- *帅 ¥ 10\r\n- *鑫 ¥ 6.66\r\n- ~朴:shu ¥ 29.79\r\n- 未来 ¥ 1\r\n- 国勇 ¥ 0.1\r\n- 用心灵听雨 ¥ 10\r\n- 钊 ¥ 5\r\n- 星稀 ¥ 5"
  },
  {
    "path": "docs/zh/guide/FAQ.md",
    "content": "# 常见问题\r\n\r\n本章内容搜集了大家反馈的常见问题，如果官方文档和此列表都不能解答您的疑问，推荐到[官方论坛](https://github.com/mengshukeji/Luckysheet/discussions)反馈\r\n\r\n## luckysheetfile中的data和celldata有什么区别？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：表格初始化时使用一维数组格式的 [celldata](/zh/guide/sheet.html#celldata)，初始化完成后转化为二维数组格式的data作为存储更新使用，celldata不再使用。\r\n\r\n如果需要将`data`拿出来作为初始化数据，则需要执行 [transToCellData(data)](/zh/guide/api.html#transtocelldata-data-setting)转换为celldata数据。\r\n其中`{ r, c, v }`格式的celldata转换为二维数组使用的是[transToData(celldata)](/zh/guide/api.html#transtodata-celldata-setting)\r\n\r\n总结如下：\r\n```js\r\n// data => celldata 二维数组数据 转化成 {r, c, v}格式 一维数组\r\nluckysheet.transToCellData(data)\r\n\r\n// celldata => data 生成表格所需二维数组\r\nluckysheet.transToData(celldata)\r\n```\r\n\r\n------------\r\n\r\n## 单元格的类型有哪些？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：参考[单元格格式列表](/zh/guide/cell.html),例举了可用的单元格格式\r\n\r\n------------\r\n\r\n## 如何在Vue/React项目中使用Luckysheet？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：参考\r\n- Vue案例：[luckysheet-vue](https://github.com/mengshukeji/luckysheet-vue)\r\n- React案例：[luckysheet-react](https://github.com/mengshukeji/luckysheet-react)\r\n\r\n------------\r\n\r\n## 为什么初始化后表格里面的公式不会被触发？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：参考 [表格数据格式](/zh/guide/sheet.html#calcchain) ,设置单元格数据对应的calcChain即可。\r\n\r\n------------\r\n\r\n## 远端加载数据是loadUrl还是updateUrl？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：[loadUrl](/zh/guide/config.html#loadurl)。配置了loadUrl，Luckysheet会通过ajax请求整个表格数据，而updateUrl会作为协同编辑实时保存的接口地址。\r\n注意：初始化数据需要配置loadUrl参数，而协同编辑则在配置loadUrl、updateUrl和allowUpdate四个参数才能生效。\r\n\r\n------------\r\n\r\n## 每个sheet页的`index`和`order`有什么区别？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：每个sheet页都有一个唯一id，就是`index`，可以用数字递增，也可以使用随机字符串，而`order`是所有的sheet的排序情况，从0开始，只能为数字`0,1,2...`。\r\n\r\n------------\r\n\r\n## dist文件夹下为什么不能直接运行项目？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：需要启动本地服务器\r\n\r\n- [Node搭建本地服务器](https://github.com/JacksonTian/anywhere)\r\n- [Python搭建本地服务器](https://developer.mozilla.org/zh-CN/docs/Learn/Common_questions/set_up_a_local_testing_server)\r\n\r\n------------\r\n\r\n## excel导入导出怎么做？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：配合Luckysheet开发的excel导入导出库-[Luckyexcel](https://github.com/mengshukeji/Luckyexcel)已经实现了excel导入功能，导出功能正在开发当中。现阶段excel导出可以参考这2篇博文： \r\n\r\n- [基于LuckySheet在线表格的Excel下载功能开发](https://www.cnblogs.com/recode-hyh/p/13168226.html)\r\n- [使用exceljs导出luckysheet表格](https://blog.csdn.net/csdn_lsy/article/details/107179708)\r\n\r\n------------\r\n\r\n## 初始化时合并单元格怎么做？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：参考以下案例\r\n- [Luckysheet如何初始化含合并单元格的数据](https://www.cnblogs.com/DuShuSir/p/13272397.html)\r\n\r\n------------\r\n\r\n## Luckysheet如何把表格里的数据保存到数据库？有没有服务端存储和协作的解决方案？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：有两个方案：\r\n\r\n- 一是表格操作完成后，使用`luckysheet.getAllSheets()`方法获取到全部的工作表数据，全部发送到后台存储。\r\n- 二是开启协同编辑功能，实时传输数据给后端。\r\n具体的操作步骤参考这篇文章：[Luckysheet如何把表格里的数据保存到数据库](https://www.cnblogs.com/DuShuSir/p/13857874.html)\r\n\r\n------------\r\n\r\n## 如何监听单元格hover或者点击事件？`cellRenderAfter`如何实时监听变化？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：我们搜集到需要针对单元格事件的二次开发需求，规划了单元格相关的钩子函数，参考[单元格钩子函数](/zh/guide/config.html#cellrenderafter)（显示的TODO的暂未开放）\r\n\r\n------------\r\n\r\n## 顶部的工具栏不支持自定义配置？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：\r\n顶部工具栏的自定义配置使用初始[options.showtoolbarconfig](/zh/guide/config.html#showtoolbarconfig)(如果标注TODO表示暂未开发)\r\n\r\n------------\r\n\r\n## 项目使用了jQuery吗？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：是的。Luckysheet内部启动时间比开源的时间早很多，所以用到了jQuery。打包工具会把jQuery集成到打包目录的`./plugins/js/plugin.js`文件中。\r\n\r\n如果您的项目中（比如React/Vue）也自己全局引用了jQuery，且造成了冲突，可以尝试去掉一个jQuery。\r\n\r\n要想在Luckysheet里去除jQuery，需要在源码根目录下的`gulpfile.js`文件中找到打包jQuery的地方：[src/plugins/js/jquery.min.js](https://github.com/mengshukeji/Luckysheet/blob/master/gulpfile.js)，删除jQuery相关的信息即可。\r\n\r\n------------\r\n\r\n## 如何为单元格对象新增字段？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：首先参考[单元格对象格式](/zh/guide/cell.html)，然后参照源码批注的部分[src/controllers/postil.js](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/postil.js)。批注是一个加在单元格对象上的一个配置。\r\n\r\n------------\r\n\r\n## 工具栏图标加载不出来？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：工具栏及其他部分图标采用了iconfont图标，加载不出来是因为缺少了iconfont.css的引入，之前旧版官方文档未写清楚这一点对大家造成误导，很抱歉。\r\n\r\n详细的Luckysheet使用教程参考已经更新的[官方文档](/zh/guide/#使用步骤)\r\n\r\n------------\r\n\r\n## Luckyexcel打包后不动？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：打包的终端命令行不显示结束，但是如果`dist`文件夹内已经有了结果文件`luckyexcel.js`，则表明是正常的。\r\n\r\nLuckyexcel是excel导入导出库，项目采用了gulp作为打包工具，旧版打包工具有点问题在命令行显示这块有些问题，问题已经修复。请还出现此问题的小伙伴做如下更新操作：\r\n1. pull最新代码\r\n2. `npm i`\r\n3. `npm run build`\r\n\r\n更多详细信息关注：[Luckyexcel](https://github.com/mengshukeji/Luckyexcel/)\r\n\r\n------------\r\n\r\n## 单元格不可编辑如何控制？表格保护怎么操作？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：单元格不可编辑属于工作表保护的功能范畴，需要配置在每个sheet页中`config.authority`，最新的设置参数请参考[工作表保护](/zh/guide/sheet.html#config-authority)。\r\n\r\n为了大家便于理解工作表保护的功能使用，下方的视频演示了如何让当前整个工作表不可编辑，但是允许某一列单元格可编辑的功能：\r\n\r\n<iframe frameborder=\"0\" src=\"https://v.qq.com/txp/iframe/player.html?vid=g3162sacwn6\" allowFullScreen=\"true\"></iframe>\r\n\r\n跟着演示操作一下本地的工作表，然后打开浏览器控制台，使用`luckysheet.getLuckysheetfile()[0].config.authority`就可以获取到第一个工作表的工作表保护参数。\r\n\r\n------------\r\n\r\n## 数据验证怎么配置？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：最新文档已经提供了数据验证的配置信息，参考[数据验证配置](/zh/guide/sheet.html#dataVerification)。官方也提供了API方法 [setDataVerification](/zh/guide/api.html#setdataverification-optionitem-setting)，用于动态设置数据验证功能。\r\n\r\n------------\r\n\r\n## Luckysheet通过引入CDN有案例吗？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：Luckysheet支持CDN方式引入，参考：[本地HTML采用cdn加载方式引入Luckysheet的案例](https://www.cnblogs.com/DuShuSir/p/13859103.html)\r\n\r\n------------\r\n\r\n## 请问一下图片怎么限制在单元格里面自适应高度？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：首先需要对图片设置移动并调整单元格大小，然后有以下几种情况：\r\n\r\n- 如果图片位置完全在单元格内部时，当拉长单元格的宽度或高度的时候，图片不会随着单元格的变大而伸缩变大\r\n- 如果图片位置完全在单元格内部时，当拉短单元格的宽度或高度，贴到图片的边时，图片会随着单元格的变小而伸缩变小\r\n- 当这个图片超过单元格的边框时，图片可以跟随单元格大小变化\r\n\r\n根据图片的第二个特性，可以操作得到图片位置信息，原理就是将图片的位置设置成和单元格边框重叠（源码中，需要重叠超过2px），以下演示视频展示了怎么将图片限制在单元格里面自适应宽高。\r\n\r\n<iframe frameborder=\"0\" src=\"https://v.qq.com/txp/iframe/player.html?vid=y3163ya0q6c\" allowFullScreen=\"true\"></iframe>\r\n\r\n------------\r\n\r\n## 如何获取工作表默认的行高列宽？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：有两种方式可以获取\r\n\r\n- 一是使用`luckysheet.getLuckysheetfile()`获取到所有工作表配置后，在各个工作表的配置中直接取得默认行高`defaultRowHeight`和默认列宽`defaultColWidth`。\r\n- 二是开放了API可以获取到工作表默认的行高[getDefaultRowHeight](/zh/guide/api.html#getdefaultrowheight-setting)和列宽[getDefaultColWidth](/zh/guide/api.html#getdefaultcolwidth-setting)\r\n\r\n------------\r\n\r\n## 如何隐藏工作表下方的添加行按钮和回到顶部按钮？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：已开放配置\r\n- 允许添加行 [enableAddRow](/zh/guide/config.html#enableaddrow)\r\n- 允许回到顶部 [enableAddBackTop](/zh/guide/config.html#enableAddBackTop)\r\n\r\n------------\r\n\r\n## 如何隐藏工作表的行标题和列标题？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：已开放配置\r\n- 行标题区域的宽度 [rowHeaderWidth](/zh/guide/config.html#rowheaderwidth)\r\n- 列标题区域的高度 [columnHeaderHeight](/zh/guide/config.html#columnHeaderHeight)\r\n\r\n------------\r\n\r\n## 调用什么方法能设置`config.merge`？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：三个方法\r\n- 界面操作\r\n- 用API：[setRangeMerge](/zh/guide/api.html#setrangemerge-type-setting)\r\n- 手动组装merge参数\r\n\r\n------------\r\n\r\n## 为什么官方公布的新功能没有效果？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：第一步，检查下您是否使用了CDN的方式引入，\r\n\r\nLuckysheet教程里采用的CDN链接是 [jsdelivr](https://www.jsdelivr.com/package/npm/luckysheet) 提供的服务，代码是从 [npmjs.com](https://www.npmjs.com/) 自动同步过去的，不是从 [Github](https://github.com/mengshukeji/Luckysheet/) 同步过去的。因为我们新提交的代码，还需要经过一段时间的测试，所以不会立即发布到npm使用，导致了npm的代码稍滞后于Github。\r\n\r\n如果需要尝试最新代码，我们强烈建议您从 [Luckysheet Github](https://github.com/mengshukeji/Luckysheet/) 主仓库拉取代码。后续我们版本稳定了，会考虑实时发布npm包。\r\n\r\n第二步，如果是引用github仓库打包后的代码，测试判断是否有bug，您可以查找问题并尝试修复，再[提交PR](https://github.com/mengshukeji/Luckysheet/pulls)，如果修复不了，请[提交issues](https://github.com/mengshukeji/Luckysheet/issues)。\r\n\r\n------------\r\n\r\n## `npm run dev`报错：`Error: Cannot find module 'rollup'`？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：可能是npm包安装问题，尝试以下步骤：\r\n1. `npm cache clean --force`\r\n2. `npm i rimraf -g`\r\n3. `rimraf node_modules`\r\n4. 删除package-lock.json文件\r\n5. `npm i`\r\n6. `npm run dev`\r\n\r\n提示：大多数的其他npm安装问题，也可以尝试此步骤来解决。\r\n\r\n------------\r\n\r\n## 怎样在vue工程里对Luckysheet进行二次开发？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：[luckysheet-vue](https://github.com/mengshukeji/luckysheet-vue) 案例是提供一个应用集成的方案。\r\n\r\n如果本地直接开发的话：\r\n1. 把Luckysheet的工程和自己的Vue工程都启动起来，比如Luckysheet的工程在 `http://localhost:3001`\r\n2. 在Vue工程里面通过 `http://localhost:3001` 引入Luckysheet使用\r\n\r\n这样的话，Luckysheet实时修改后，Vue工程里是可以看到更改的\r\n\r\n------------\r\n\r\n## 创建图表时候报错`Store.createChart`？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：需要引入图表插件才能使用，工作簿初始化的时候应该配置图表插件使用，参考\r\n\r\n- 插件配置 [plugins](/zh/guide/config.html#配置项)\r\n- 或 官方demo [src/index.html](https://github.com/mengshukeji/Luckysheet/blob/master/src/index.html)\r\n\r\n通常，参考demo配置完后就可以和demo一样正常使用了，但是还是会偶现`chartmix is not defined`，这时需要在谷歌浏览器控制台的network里检查下图表的依赖是否都加载了，有5项依赖需要关注：`vue / vuex / element-ui / echarts / chartmix.umd.js`。\r\n\r\n------------\r\n\r\n## 单元格能增加自定义属性吗？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：直接赋值到单元格对象上的自定义属性会被过滤，要想使得自定义属性生效，需要二开去除过滤属性的代码。\r\n\r\n------------\r\n\r\n## 如何输入以`'='`开头的文本？例如`=currentDate('YYYY-MM-DD')`，它默认会去掉函数，函数怎么禁止？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：前面加一个单引号就行，会强制识别为字符串，和excel表现一致的。比如：`'=currentDate('YYYY-MM-DD')`\r\n\r\n------------\r\n\r\n## create回调为什么没有效果？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：API 方法`luckysheet.create()`这个方法没有回调，但是Luckysheet提供了钩子函数用于在指定位置执行回调方法，比如：\r\n- 表格创建之前触发 [workbookCreateBefore](/zh/guide/config.html#workbookcreatebefore)\r\n- 表格创建之后触发 [workbookCreateAfter](/zh/guide/config.html#workbookcreateafter)\r\n\r\n------------\r\n\r\n## create的时候默认选中第一个单元格，怎么去除？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：选中单元格时默认是高亮，把高亮去除即可，使用API: [setRangeShow](/zh/guide/api.html#setrangeshow-range-setting)\r\n\r\n```js\r\nluckysheet.setRangeShow(\"A2\",{show:false})\r\n```\r\n\r\n------------\r\n\r\n## 右键事件绑定在哪？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：在源码的 [src/controllers/hander.js](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/handler.js) 搜索`event.which == \"3\"`即可找到右键事件触发执行的代码。\r\n\r\n------------\r\n\r\n## 如何添加自定义工具栏？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：暂未提供配置，可以参照工具栏打印按钮的实现来修改源码：\r\n1. 全局搜索 `luckysheet-icon-print`即可找到打印按钮的实现，在 [src/controllers/constant.js](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/constant.js) 中增加一个类似的模板字符串，需要自定义一个唯一id\r\n2. 修改 [src/controllers/resize.js](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/resize.js) ，在toobarConfig对象中新增一条记录\r\n3. 修改 [src/controllers/menuButton.js](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/menuButton.js) ，新增一个事件监听\r\n\r\n------------\r\n\r\n## 如何添加自定义公式？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：需要修改两处源码：\r\n1. 在 [src/function/functionImplementation.js](https://github.com/mengshukeji/Luckysheet/blob/master/src/function/functionImplementation.js) 文件中的`functionImplementation`对象中增加一个公式，格式参考`SUM`/`AVERAGE`等公式\r\n2. 修改 [src/locale](https://github.com/mengshukeji/Luckysheet/blob/master/src/locale) 文件目录下所有的语言包，将自己新增的公式说明加到`functionlist`数组中。其中，`t`是函数的类别，`m`是参数的个数，最小参数个数和最大参数个数。\r\n\r\n------------\r\n\r\n## 有没有类似loadData接口，我想实现先加载10条记录，然后再动态加载数据，这些数据都追加到表格中？\r\n\r\n**<span style=\"font-size:20px;\">A</span>**：有的。我们`loadSheetUrl`提供了这个功能，初始化`options.enablePage = true`可以开启。\r\n\r\n源码里搜索`enablePage`可以看到，有个`method.addDataAjax`方法，里面就有一个ajax请求，用来动态加载数据，这些数据会追加到表格中。\r\n\r\n这个功能现在在文档上是隐藏的，是因为这个接口我们做的时候，接口参数是根据我们实际业务匹配的，可能不太通用，我们准备抽象后再放出来给大家用，如果您想自己用可以依据这个改下。\r\n\r\n推荐您考虑自己写接口来加载数据，然后使用`setRangeValue`来在指定位置追加数据，这样的自定义程度更高。\r\n\r\n------------\r\n"
  },
  {
    "path": "docs/zh/guide/README.md",
    "content": "# Luckysheet 已不再维护，推荐使用 [Univer](https://github.com/dream-num/univer) 替代\r\n\r\n# 快速上手\r\n\r\n## 基本介绍\r\nLuckysheet ，一款纯前端类似excel的在线表格，功能强大、配置简单、完全开源。\r\n\r\n## Demo\r\n[在线demo](https://dream-num.github.io/LuckysheetDemo/)\r\n\r\n![演示](/LuckysheetDocs/img/LuckysheetDemo.gif)\r\n\r\n## 在线案例\r\n\r\n- [协同编辑Demo](http://luckysheet.lashuju.com/demo/)\r\n\r\n## 特性\r\n\r\n### 🛠️格式设置\r\n+ **样式** (修改字体样式，字号，颜色或者其他通用的样式)\r\n+ **条件格式** (突出显示所关注的单元格或单元格区域；强调异常值；使用数据栏、色阶和图标集（与数据中的特定变体对应）直观地显示数据)\r\n+ **文本对齐及旋转** \r\n+ **支持文本的截断、溢出、自动换行** \r\n+ **数据类型** \r\n\t+ **货币, 百分比, 数字, 日期** \r\n\t+ **Custom** (和excel保持一致，例如： `##,###0.00` , `$1,234.56$##,###0.00_);[Red]($##,###0.00)`, `_($* ##,###0.00_);_(...($* \"-\"_);_(@_)`, `08-05 PM 01:30MM-dd AM/PM hh:mm` )\r\n+ **单元格内多样式** (Alt+Enter单元格内换行、上标、下标、单元格内可定义每个文字的不同样式)\r\n\r\n### 🧬单元格\r\n+ **拖拽选取来修改单元格** (对选区进行操作，可以拖动四边来移动选区，也可以在右下角对选区进行下拉填充操作)\r\n+ **选区下拉填充** (对于一个1,2,3,4,5的序列，将会按照间隔为1进行下拉填充，而对2,4,6,8将会以2作为间隔。支持等差数列，等比数列，日期，周，天，月，年，中文数字填充)\r\n+ **自动填充选项** (下拉填充后，会出现填充选项的菜单，支持选择复制，序列，仅格式，只填充格式，天，月，年的选择)\r\n+ **多选区操作** (可以按住Ctrl键进行单元格多选操作，支持多选区的复制粘贴)\r\n+ **查找和替换** (对内容进行查找替换，支持正则表达式，整词，大小写敏感)\r\n+ **定位** (可以根据单元格的数据类型进行自动定位并选中，选中后可以批量进行格式等操作)\r\n+ **合并单元格**\r\n+ **数据验证(表单功能)**  (支持Checkbox, drop-down list, datePicker)\r\n\r\n### 🖱️行和列操作\r\n+ **隐藏，插入，删除行或列** \r\n+ **冻结行或列** (支持冻结首行和首列，冻结到选区，冻结调节杆可以进行拖动操作)\r\n+ **文本分列** (可以把文本根据不同符号进行拆分，和excel的分列功能类似)\r\n\r\n### 🔨操作体验\r\n+ **撤销/重做**\r\n+ **复制/粘贴/剪切操作** (支持Luckysheet到excel和excel到Luckysheet带格式的互相拷贝)\r\n+ **快捷键支持** (快捷键操作保持与excel一致，如果有不同或者缺失请反馈给我们)\r\n+ **格式刷** (与google sheet类似)\r\n+ **任意选区拖拽** (选择单元格，输入公式，插入图表，会与选区相关，可以通过任意拖动和放大缩小选区来改变与之关联的参数)\r\n\r\n### ⚙️公式和函数\r\n+ **内置公式**\r\n\t+ 数学 (SUMIFS, AVERAGEIFS, SUMIF, SUM, etc.)\r\n\t+ 文本 (CONCATENATE, REGEXMATCH, MID)\r\n\t+ 日期 (DATEVALUE, DATEDIF, NOW, WEEKDAY, etc.)\r\n\t+ 财务 (PV, FV, IRR, NPV, etc.)\r\n\t+ 逻辑 (IF, AND, OR, IFERROR, etc.)\r\n\t+ 查找和引用 (VLOOKUP, HLOOkUP, INDIRECT, OFFSET, etc.)\r\n\t+ 动态数组 (Excel2019新函数，SORT,FILTER,UNIQUE,RANDARRAY,SEQUENCE)\r\n+ **公式支持数组** (={1,2,3,4,5,6}, Crtl+Shift+Enter)\r\n+ **远程公式** (DM_TEXT_TFIDF, DM_TEXT_TEXTRANK,DATA_CN_STOCK_CLOSE etc. Need remote interface, can realize complex calculation)\r\n+ **自定义公式**  (根据身份证识别年龄，性别，生日，省份，城市等. AGE_BY_IDCARD, SEX_BY_IDCARD, BIRTHDAY_BY_IDCARD, PROVINCE_BY_IDCARD, CITY_BY_IDCARD, etc. 可以任意加入自己的公式哦)\r\n\r\n### 📐表格操作\r\n+ **筛选** (支持颜色、数字、字符、日期的筛选)\r\n+ **排序** (同时加入多个字段进行排序)\r\n\r\n### 📈数据透视表\r\n+ **字段拖拽** (操作方式与excel类似，拖动字段到行、列、数值、筛选等4个区域)\r\n+ **聚合方式**  (支持汇总、计数、去重计数、平均、最大、最小、中位数、协方差、标准差、方差等计算)\r\n+ **筛选数据** (可对字段进行筛选后再进行汇总)\r\n+ **数据透视表下钻** (双击数据透视表中的数据，可以下钻查看到明细，操作方式与excel一致)\r\n+ **根据数据透视表新建图表** (数据透视表产生的数据也可以进行图表的制作)\r\n\r\n### 📊图表\r\n+ **支持的图表类型** (目前折线图、柱状图、面积图、条形图、饼图可以使用，散点图、雷达图、仪表盘、漏斗图正在接入，其他图表正在陆续开发中，请大家给予建议) \r\n+ **关于图表插件**  (图表使用了一个中间插件[ChartMix](https://github.com/mengshukeji/chartMix)(MIT协议): 目前支持ECharts，正在逐步接入Highcharts、阿里G2、amCharts、googleChart、chart.js)\r\n+ **Sparklines小图** (以公式的形式进行设置和展示，目前支持：折线图、面积图、柱状图、累积图、条形图、离散图、三态图、饼图、箱线图等)\r\n\r\n### ✍️分享及写作\r\n+ **评论** (评论的删除、添加、修改、隐藏)\r\n+ **共享编辑** (支持多用户共享编辑，内置API)\r\n\r\n### 📚插入对象\r\n+ **插入图片** (支持JPG,PNG,SVG的插入、修改和删除，并且随表格的变动而产生变化)\r\n\r\n### ⚡Luckysheet专有\r\n+ **矩阵计算** (通过右键菜单进行支持：对选区内的数据进行转置、旋转、数值计算)\r\n+ **截图** (把选区的内容进行截图展示)\r\n+ **复制到其他格式** (右键菜单的\"复制为\", 支持复制为json、array、对角线数据、去重等)\r\n+ **EXCEL导入及导出** (专为Luckysheet打造的导入导出插件，支持密码、水印、公式等的本地导入导出，导出正在开发)\r\n\r\n### ⏱️未来开发计划\r\n+ **打印及设置** (像excel一样进行打印设置，并导出为图片或者PDF)\r\n+ **树形菜单** (类似excel中的分级显示（分组）)\r\n+ **表格新功能** (类似excel中表格的筛选器和切片器)\r\n+ **CSV,TXT导入及导出** (专为Luckysheet打造的导入导出插件，支持密码、水印、公式等的本地导入导出)\r\n+ **插入svg形状** (支持[Pen tool](https://github.com/mengshukeji/Pentool)的插入、修改和删除，并且随表格的变动而产生变化)\r\n+ **文档** (完善文档和API)\r\n+ **敬请期待...** (可以提出好的建议给我们)\r\n\r\n## 开发模式\r\n\r\n### 环境\r\n[Node.js](https://nodejs.org/en/) Version >= 6 \r\n\r\n### 安装\r\n```shell\r\nnpm install\r\nnpm install gulp -g\r\n```\r\n\r\n### 开发\r\n```shell\r\nnpm run dev\r\n```\r\n\r\n### 打包\r\n```shell\r\nnpm run build\r\n```\r\n\r\n## 使用步骤\r\n\r\n### 第一步\r\n引入依赖，有2种方式\r\n\r\n#### CDN\r\n```html\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/css/pluginsCss.css' />\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/plugins.css' />\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/css/luckysheet.css' />\r\n<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/assets/iconfont/iconfont.css' />\r\n<script src=\"https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/plugins/js/plugin.js\"></script>\r\n<script src=\"https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/luckysheet.umd.js\"></script>\r\n```\r\n\r\n注意，`https://cdn.jsdelivr.net/npm/luckysheet@latest/dist/luckysheet.umd.js`这个路径意思是会拉取到最新的luckysheet代码，但是如果Luckysheet刚刚发布，jsdelivr网站可能还没来得及从npm上同步过去，故而使用这个路径还是会拉到上一个版本，我们推荐您直接指定最新版本。\r\n\r\n想要指定Luckysheet版本，请在所有的CDN依赖文件后面加上版本号，如：`https://cdn.jsdelivr.net/npm/luckysheet@2.1.12/dist/luckysheet.umd.js`。\r\n\r\n> 如何知道最新版本是哪一版？查看最新 [release记录](https://github.com/mengshukeji/Luckysheet/releases) 或者 [package.json](https://github.com/mengshukeji/Luckysheet/blob/master/package.json) 的`version`字段。\r\n\r\n如果不方便访问 jsdelivr.net，还可以采用本地方式引入\r\n\r\n#### 本地引入\r\n\r\n`npm run build`后`dist`文件夹下的所有文件复制到项目目录，然后通过相对路径引入\r\n\r\n```html\r\n<link rel='stylesheet' href='./plugins/css/pluginsCss.css' />\r\n<link rel='stylesheet' href='./plugins/plugins.css' />\r\n<link rel='stylesheet' href='./css/luckysheet.css' />\r\n<link rel='stylesheet' href='./assets/iconfont/iconfont.css' />\r\n<script src=\"./plugins/js/plugin.js\"></script>\r\n<script src=\"./luckysheet.umd.js\"></script>\r\n```\r\n### 第二步\r\n指定一个表格容器\r\n```html\r\n<div id=\"luckysheet\" style=\"margin:0px;padding:0px;position:absolute;width:100%;height:100%;left: 0px;top: 0px;\"></div>\r\n```\r\n### 第三步\r\n创建一个表格\r\n```javascript\r\n<script>\r\n    $(function () {\r\n        //配置项\r\n        var options = {\r\n            container: 'luckysheet' //luckysheet为容器id\r\n        }\r\n        luckysheet.create(options)\r\n    })\r\n</script>\r\n```\r\n\r\n## 整体结构\r\n\r\n### 格式\r\n\r\n一个完整的Luckysheet表格文件的数据格式为：luckysheetfile，一个表格文件包含若干个sheet文件，对应excel的sheet0、sheet1等。\r\n\r\n一个Luckysheet文件的示例如下，该表格包含3个sheet：`\r\nluckysheetfile = [ {sheet1设置},  {sheet2设置},  {sheet3设置} ]`\r\n相当于excel的3个sheet\r\n\r\n![excel sheet](/LuckysheetDocs/img/excel.png)\r\n\r\n文件中的一个sheet的数据`luckysheetfile[0]`的结构如下：\r\n```json\r\n{\r\n\t\"name\": \"Cell\", //工作表名称\r\n\t\"color\": \"\", //工作表颜色\r\n\t\"index\": \"0\", //工作表索引\r\n\t\"status\": \"1\", //激活状态\r\n\t\"order\": \"0\", //工作表的顺序\r\n\t\"hide\": 0,//是否隐藏\r\n\t\"row\": 36, //行数\r\n\t\"column\": 18, //列数\r\n\t\"config\": {\r\n\t\t\"merge\":{}, //合并单元格\r\n\t\t\"rowlen\":{}, //表格行高\r\n\t\t\"columnlen\":{}, //表格列宽\r\n\t\t\"rowhidden\":{}, //隐藏行\r\n\t\t\"colhidden\":{}, //隐藏列\r\n\t\t\"borderInfo\":{}, //边框\r\n\t},\r\n\t\"celldata\": [], //初始化使用的单元格数据\r\n\t\"data\": [], //更新和存储使用的单元格数据\r\n\t\"scrollLeft\": 0, //左右滚动条位置\r\n\t\"scrollTop\": 315, //上下滚动条位置\r\n\t\"luckysheet_select_save\": [], //选中的区域\r\n\t\"luckysheet_conditionformat_save\": {},//条件格式\r\n\t\"calcChain\": [],//公式链\r\n\t\"isPivotTable\":false,//是否数据透视表\r\n\t\"pivotTable\":{},//数据透视表设置\r\n\t\"filter_select\": {},//筛选范围\r\n\t\"filter\": null,//筛选配置\r\n\t\"luckysheet_alternateformat_save\": [], //交替颜色\r\n\t\"luckysheet_alternateformat_save_modelCustom\": [], //自定义交替颜色\t\r\n\t\"freezen\": {}, //冻结行列\r\n\t\"chart\": [], //图表配置\r\n\t\"visibledatarow\": [], //所有行的位置\r\n\t\"visibledatacolumn\": [], //所有列的位置\r\n\t\"ch_width\": 2322, //工作表区域的宽度\r\n\t\"rh_height\": 949, //工作表区域的高度\r\n\t\"load\": \"1\", //已加载过此sheet的标识\r\n}\r\n```\r\n### 查看方式\r\n在chrome的console中查看\r\n`luckysheet.getluckysheetfile()`\r\n可以看到完整设置\r\n`[{shee1}, {sheet2}, {sheet3}]`\r\n\r\n## 快捷键\r\n\r\n| 快捷键 | 功能 |\r\n| ------------ | ------------ |\r\n|  CTRL + C | 复制单元格 |\r\n|  CTRL + V | 粘贴单元格 |\r\n|  CTRL + X | 剪切单元格 |\r\n|  CTRL + Z | 撤销 |\r\n|  CTRL + Y | 重做 |\r\n|  CTRL + A | 全选 |\r\n|  CTRL + B | 加粗 |\r\n|  CTRL + F | 查找 |\r\n|  CTRL + H | 替换 |\r\n|  CTRL + I | 斜体 |\r\n|  CTRL + UP/DOWN/LEFT/RIGHT | 快捷调整单元格选框 |\r\n|  SHIFT + UP/DOWN/LEFT/RIGHT | 调整选区 |\r\n|  CTRL + 鼠标左击 | 多选单元格 |\r\n|  SHIFT + 鼠标左击 | 调整选区 |\r\n|  UP/DOWN/LEFT/RIGHT | 移动单元格选框 |\r\n|  ENTER | 编辑单元格 |\r\n|  TAB | 向右移动单元格选框 |\r\n|  DELETE | 清除单元格数据 |\r\n\r\n## 指引\r\n\r\n如果您使用Luckysheet遇到了问题，按以下步骤来寻找答案\r\n\r\n1. 使用多吉或者Google搜索常见技术问题\r\n2. Luckysheet相关的问题优先查看[Luckysheet官方文档](https://dream-num.github.io/LuckysheetDocs/zh/)（注意标注TODO的功能暂未实现）\r\n3. 搜索[常见问题列表](https://dream-num.github.io/LuckysheetDocs/zh/guide/FAQ.html)\r\n4. 搜索[官方论坛](https://support.qq.com/product/288322)，看看有没有人已经遇到过\r\n5. 尝试自己检查或试验以找到答案\r\n6. 请尝试阅读源代码以找到答案，\r\n\r\n如果以上方法都没有解决您的问题，可以考虑：\r\n\r\n- 去[官方论坛](https://support.qq.com/product/288322)提问\r\n- 去Luckysheet官方微信群或者QQ群提问\r\n- 发现有明显问题的或者需求无法满足的，直接提交[issues](https://github.com/mengshukeji/Luckysheet/issues)\r\n\r\n> 推荐阅读 [提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md)\r\n\r\n同时，我们强烈推荐您帮助我们丰富Luckysheet社区\r\n\r\n- 如果您发现文档或者代码有问题，您可以通过提交PR来贡献。所有合理的改动、优化、修正，或者文档的修正、更新相关的提交都会被接受\r\n- 当您有了一部分使用或者二次开发Luckysheet的经验，我们鼓励您通过博文分享出来"
  },
  {
    "path": "docs/zh/guide/api.md",
    "content": "# API\r\n\r\nLuckysheet针对常用的数据操作需求，开放了主要功能的API，开发者可以根据需要进行任意对接开发。\r\n\r\n使用注意：\r\n1. script全局引入时，所有API均挂载到window.luckysheet对象下面，可以在浏览器控制台打印看到；npm引入时，API也全部挂载在luckysheet对象下\r\n2. `success`回调函数第一个参数为API方法的返回值\r\n3. 需要新的API请到github [Issues](https://github.com/mengshukeji/Luckysheet/issues/new/choose)中提交，根据点赞数决定是否开放新API\r\n4. API方法中所需的`order`参数为工作表对象中的`order`的值，而不是`index`\r\n\r\n## 单元格操作\r\n\r\n### getCellValue(row, column [,setting])<div id='getCellValue'></div>\r\n \r\n\r\n- **参数**：\r\n\r\n\t- {Number} [row]: 单元格所在行数；从0开始的整数，0表示第一行\r\n\t- {Number} [column]: 单元格所在列数；从0开始的整数，0表示第一列\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {String} [type]: 单元格的值类型，可以设置为原始值`v`或者显示值`m`；默认值为`v`,表示获取单元格的实际值\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\r\n- **说明**：\r\n\t\r\n\t获取单元格的值。\r\n\r\n\t特殊情况，单元格格式为`yyyy-MM-dd`，`type`为`'v'`时会强制取`'m'`显示值\r\n\r\n- **示例**:\r\n\r\n\t- 返回当前工作表第1行第1列单元格的数据的v值\r\n\t\t\r\n\t\t`luckysheet.getCellValue(0, 0)`\r\n\r\n\t- 返回指定data数据的第2行第2列单元格的显示值。\r\n\t\t\r\n\t\t`luckysheet.getCellValue(1, 1, {type:\"m\"})`\r\n\r\n------------\r\n\r\n### setCellValue(row, column, value [,setting])\r\n \r\n\r\n- **参数**：\r\n\r\n\t- {Number} [row]: 单元格所在行数；从0开始的整数，0表示第一行\r\n\t- {Number} [column]: 单元格所在列数；从0开始的整数，0表示第一列\r\n\t- {Object | String | Number} [value]: 要设置的值；可以为字符串或数字，或为符合Luckysheet单元格格式的对象，参考 [单元格属性表](/zh/guide/cell.html)\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Boolean} [isRefresh]: 是否刷新界面；默认为`true`；用于多个单元格赋值时候控制节流，前面单元格赋值的时候应设置为\t`false`，最后一个单元格赋值时设置为`true`。\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\r\n\t设置某个单元格的值，也可以设置整个单元格对象，用于同时设置多个单元格属性。\r\n\t\r\n\t如果需要更新公式，也可以在这里赋值，Luckysheet在内部会主动把这个公式做计算并加入到公式链中，最后重刷界面。\r\n\r\n- **示例**:\r\n\r\n\t- 设置当前工作表\"A1\"单元格的值为\"1\"\r\n    \t`luckysheet.setCellValue(0, 0, 1);`\r\n\t\r\n\t- 设置当前工作表\"B1\"单元格的值为公式\"=sum(A1)\"\r\n    \t`luckysheet.setCellValue(0, 1, \"=sum(A1)\");`\r\n\t\r\n\t- 设置当前工作表\"C1\"单元格的值为公式\"=sum(A1:B1\"，并带有红色背景，单元格对象可以不带`v`和`m`值，Luckysheet会根据公式信息自动计算结果，如果带了未更新或者是非公式结果的`v`和`m`值，Luckysheet也仍然会根据公式实际关联的数据计算出准备的结果。\r\n    \t`luckysheet.setCellValue(0, 2, {f: \"=sum(A1:B1)\", bg:\"#FF0000\"})`\r\n\r\n\t\t再次设置\"C1\"单元格新的公式仍然可以生效\r\n\t\t\r\n\t\t`luckysheet.setCellValue(0, 2, {f: \"=sum(A1)\", bg:\"#00FF00\"})`\r\n\r\n------------\r\n\r\n### clearCell(row, column [,setting])\r\n \r\n\r\n- **参数**：\r\n\r\n\t- {Number} [row]: 单元格所在行数；从0开始的整数，0表示第一行\r\n\t- {Number} [column]: 单元格所在列数；从0开始的整数，0表示第一列\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t清除指定工作表指定单元格的内容，返回清除掉的数据，不同于删除单元格的功能，不需要设定单元格移动情况\r\n\r\n- **示例**:\r\n\r\n    - 清空单元格`B2`内容\r\n      `luckysheet.clearCell(1,1)`\r\n    \r\n------------\r\n\r\n### deleteCell(move, row, column [,setting])\r\n \r\n\r\n- **参数**：\r\n\t- {String} [move]: 删除后，右侧还是下方的单元格移动\r\n\t\r\n\t\t`move`可能的值有：\r\n\t\t\r\n\t\t+ `\"left\"`: 右侧单元格左移\r\n\t\t+ `\"up\"`: 下方单元格上移\r\n\t\r\n\t- {Number} [row]: 单元格所在行数；从0开始的整数，0表示第一行\r\n\t- {Number} [column]: 单元格所在列数；从0开始的整数，0表示第一列\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t删除指定工作表指定单元格，返回删除掉的数据，同时，指定是右侧单元格左移还是下方单元格上移\r\n\r\n- **示例**:\r\n\r\n    - 删除当前单元格并且在删除后，右侧单元格左移\r\n      `luckysheet.deleteCell('left')`\r\n    \r\n------------\r\n\r\n### setCellFormat(row, column, attr, value [,setting])\r\n \r\n\r\n- **参数**：\r\n\t\r\n\t- {Number} [row]: 单元格所在行数；从0开始的整数，0表示第一行\r\n\t- {Number} [column]: 单元格所在列数；从0开始的整数，0表示第一列\r\n    - {String} [attr]: 属性类型，参考 [单元格属性表](/zh/guide/cell.html)的属性值\r\n\t- {String | Number | Object} [value]: 具体的设置值，一个属性会对应多个值，参考 [单元格属性表](/zh/guide/cell.html)的值示例，如果属性类型`attr`是单元格格式`ct`，则设置值`value`应提供ct对象，如：`{fa:\"General\", t:\"g\"}`，比如设置A1单元格的格式为百分比格式：\r\n\t  \r\n  \t  `luckysheet.setCellFormat(0, 0, \"ct\", {fa:\"0.00%\", t:\"n\"})`\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t设置某个单元格的属性，如果要设置单元格的值或者同时设置多个单元格属性，推荐使用`setCellValue`\r\n\t\r\n\t特殊的设置\r\n    \r\n  \t边框设置时，attr为`\"bd\"`，value为一个key/value对象，需要同时设置边框类型:`borderType`/边框粗细:`style`/边框颜色:`color`，比如设置A1单元格的边框为所有/红色/细：\r\n\t  \r\n\t`luckysheet.setCellFormat(0, 0, \"bd\", {borderType: \"border-right\",style: \"1\", color: \"#ff0000\"})`\r\n\t\r\n\t完整可选的设置参数如下：\r\n\r\n\t+ 边框类型 `borderType：\"border-left\" | \"border-right\" | \"border-top\" | \"border-bottom\" | \"border-all\" | \"border-outside\" | \"border-inside\" | \"border-horizontal\" | \"border-vertical\" | \"border-none\"`，\r\n\t+ 边框粗细 `style:  1 Thin | 2 Hair | 3 Dotted | 4 Dashed | 5 DashDot | 6 DashDotDot | 7 Double | 8 Medium | 9 MediumDashed | 10 MediumDashDot | 11 MediumDashDotDot | 12 SlantedDashDot | 13 Thick`\r\n\t+ 边框颜色 `color: 16进制颜色值`\r\n\r\n- **示例**:\r\n\r\n   - 设置当前工作表A1单元格文本加粗\r\n   \t\t`luckysheet.setCellFormat(0, 0, \"bl\", 1)`\r\n   - 设置第二个工作表的B2单元格背景为红色\r\n   \t\t`luckysheet.setCellFormat(1, 1, \"bg\", \"#ff0000\", {order:1})`\r\n   - 设置当前工作表\"A1\"单元格的值为\"abc\"\r\n   \t\t`luckysheet.setCellFormat(0, 0, 'v', 'abc');`\r\n\r\n------------\r\n\r\n### find(content [,setting])\r\n \r\n\r\n- **参数**：\r\n\t\r\n\t- {String} [content]: 要查找的内容\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Boolean} [isRegularExpression]: 是否正则表达式匹配；默认为 `false`\r\n\t\t+ {Boolean} [isWholeWord]: 是否整词匹配；默认为 `false`\r\n\t\t+ {Boolean} [isCaseSensitive]: 是否区分大小写匹配；默认为 `false`\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n    \t+ {String} [type]: 单元格属性；默认值为`\"m\"`\r\n\r\n- **说明**：\r\n\t\r\n\t查找一个工作表中的指定内容，返回查找到的内容组成的单元格一位数组，数据格式同`celldata`。\r\n\r\n- **示例**:\r\n\r\n   - 当前工作表查找`\"value\"`字符串\r\n   \t\t`luckysheet.find(\"value\")`\r\n   - 当前工作表查找公式包含`\"SUM\"`的单元格\r\n   \t\t`luckysheet.find(\"SUM\",{type:\"f\"})`\r\n\r\n------------\r\n\r\n### replace(content, replaceContent [,setting])\r\n \r\n\r\n- **参数**：\r\n\t\r\n\t- {String} [content]: 要查找的内容\r\n\t- {String} [replaceContent]: 要替换的内容\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Boolean} [isRegularExpression]: 是否正则表达式匹配；默认为 `false`\r\n\t\t+ {Boolean} [isWholeWord]: 是否整词匹配；默认为 `false`\r\n\t\t+ {Boolean} [isCaseSensitive]: 是否区分大小写匹配；默认为 `false`\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t查找一个工作表中的指定内容并替换成新的内容，返回替换后的内容组成的单元格一位数组，数据格式同`celldata`。\r\n\r\n- **示例**:\r\n\r\n   - 当前工作表查找`\"value\"`字符串并替换为`\"out\"`\r\n   \t\t`luckysheet.replace(\"value\", \"out\")`\r\n\r\n------------\r\n\r\n### exitEditMode([,setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t退出编辑模式。鼠标双击单元格后，会进入单元格编辑模式，编辑完成后，当鼠标再次点击别的地方输入框失焦的时候，则会退出编辑模式，随即单元格的值会进行保存。此Api就是自动退出编辑模式的操作，主要是为了触发自动保存单元格。\r\n\r\n- **示例**:\r\n\r\n   - 手动触发退出编辑模式\r\n   \t\t`luckysheet.exitEditMode()`\r\n\r\n------------\r\n\r\n## 行和列操作\r\n\r\n### setHorizontalFrozen(isRange [,setting])\r\n \r\n\r\n- **参数**：\r\n\t\r\n\t- {Boolean} [isRange]: 是否冻结行到选区\r\n\t\t`isRange`可能的值有：\r\n\t\t\r\n\t\t+ `\"false\"`: 冻结首行\r\n\t\t+ `\"true\"`: 冻结行到选区\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Array | Object | String} [range]: `isRange`为`true`的时候设置，开启冻结的单元格位置，格式为`{ row_focus:0, column_focus:0 }`，意为当前激活的单元格的行数和列数；默认从当前选区最后的一个选区中取得\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t冻结行操作\r\n\r\n\t特别注意，只有在`isRange`设置为`true`的时候，才需要设置`setting`中的`range`，且与一般的range格式不同。\r\n\r\n- **示例**:\r\n\r\n   - 冻结首行\r\n\r\n\t\t`luckysheet.setHorizontalFrozen(false)`\r\n\r\n   - 冻结到`B5`选区\r\n\r\n\t\t`luckysheet.setHorizontalFrozen(true, { range: 'B5' })`\r\n\r\n------------\r\n\r\n### setVerticalFrozen(isRange [,setting])\r\n \r\n\r\n- **参数**：\r\n\t\r\n\t- {Boolean} [isRange]: 是否冻结列到选区\r\n\t\t`isRange`可能的值有：\r\n\t\t\r\n\t\t+ `\"false\"`: 冻结首列\r\n\t\t+ `\"true\"`: 冻结列到选区\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Array | Object | String} [range]: `isRange`为`true`的时候设置，开启冻结的单元格位置，格式为`{ row_focus:0, column_focus:0 }`，意为当前激活的单元格的行数和列数；默认从当前选区最后的一个选区中取得\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t冻结列操作\r\n\r\n\t特别注意，只有在`isRange`设置为`true`的时候，才需要设置`setting`中的`range`，且与一般的range格式不同。\r\n\r\n- **示例**:\r\n\r\n   - 冻结首列\r\n\r\n\t\t`luckysheet.setVerticalFrozen(false)`\r\n\r\n------------\r\n\r\n### setBothFrozen(isRange [,setting])\r\n \r\n\r\n- **参数**：\r\n\t\r\n\t- {Boolean} [isRange]: 是否冻结行列到选区\r\n\t\t`isRange`可能的值有：\r\n\t\t\r\n\t\t+ `\"false\"`: 冻结行列\r\n\t\t+ `\"true\"`: 冻结行列到选区\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Array | Object | String} [range]: `isRange`为`true`的时候设置，开启冻结的单元格位置，格式为`{ row_focus:0, column_focus:0 }`，意为当前激活的单元格的行数和列数；默认从当前选区最后的一个选区中取得\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t冻结行列操作\r\n\r\n\t特别注意，只有在`isRange`设置为`true`的时候，才需要设置`setting`中的`range`，且与一般的range格式不同。\r\n\t\r\n\t如果想在工作簿初始化后使用此API设置冻结，可以在工作簿创建后的钩子函数中执行，比如：\r\n\t```js\r\n\tluckysheet.create({\r\n    \thook:{\r\n\t\t\t\tworkbookCreateAfter:function(){\r\n\t\t\t\t\tluckysheet.setBothFrozen(false);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t});\r\n\r\n\t```\r\n\r\n- **示例**:\r\n\r\n   - 冻结行列\r\n\r\n\t\t`luckysheet.setBothFrozen(false)`\r\n\r\n------------\r\n\r\n### cancelFrozen([setting])\r\n \r\n\r\n- **参数**：\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t取消冻结操作\r\n\r\n- **示例**:\r\n\r\n   - 取消冻结\r\n\r\n\t\t`luckysheet.cancelFrozen()`\r\n\r\n------------\r\n\r\n### insertRow(row [,setting])\r\n \r\n\r\n- **参数**：\r\n\r\n\t- {Number} [row]: 在第几行插入空白行，从0开始\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [number]: 插入的空白行数；默认为 1\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t在第`row`行的位置，插入`number`行空白行\r\n\r\n- **示例**:\r\n\r\n   - 在第2行的位置插入1行空白行\r\n\r\n\t\t`luckysheet.insertRow(1)`\r\n\r\n------------\r\n\r\n### insertColumn( column [,setting])\r\n \r\n\r\n- **参数**：\r\n\r\n\t- {Number} [column]: 在第几列插入空白列\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [number]: 插入的空白列数；默认为 1\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t在第`column`列的位置，插入`number`列空白列\r\n\r\n- **示例**:\r\n\r\n   - 在第1列的位置插入3行空白行\r\n\r\n\t\t`luckysheet.insertColumn(0, { number: 3 })`\r\n\r\n------------\r\n\r\n### deleteRow(rowStart, rowEnd [,setting])\r\n \r\n\r\n- **参数**：\r\n\t\r\n\t- {Number} [rowStart]: 要删除的起始行\r\n\t- {Number} [rowEnd]: 要删除的结束行\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t删除指定的行\r\n\r\n\t特别提醒，删除行之后，行的序号并不会变化，下面的行会补充到上面，注意观察数据是否被正确删除即可。\r\n\r\n- **示例**:\r\n\r\n   - 删除2-4行\r\n\r\n\t\t`luckysheet.deleteRow(1, 3)`\r\n\r\n------------\r\n\r\n### deleteColumn(columnStart, columnEnd [,setting])\r\n \r\n- **参数**：\r\n\t\r\n\t- {Number} [columnStart]: 要删除的起始列\r\n\t- {Number} [columnEnd]: 要删除的结束列\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t删除指定的列\r\n\r\n\t特别提醒，删除列之后，列的序号并不会变化，右边的列会补充到左边，注意观察数据是否被正确删除即可。\r\n\r\n- **示例**:\r\n\r\n   - 删除2-4列\r\n\r\n\t\t`luckysheet.deleteColumn(1, 3)`\r\n\r\n------------\r\n\r\n### hideRow(rowStart, rowEnd [,setting])\r\n \r\n- **参数**：\r\n\t\r\n\t- {Number} [rowStart]: 要隐藏的起始行\r\n\t- {Number} [rowEnd]: 要隐藏的结束行\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t隐藏指定的行\r\n\r\n\t特别提醒，隐藏行之后，行的序号会变化。\r\n\r\n- **示例**:\r\n\r\n   - 隐藏2-4行\r\n\r\n\t\t`luckysheet.hideRow(1, 3)`\r\n\r\n------------\r\n\r\n### hideColumn(columnStart, columnEnd [,setting])(TODO)\r\n \r\n- **参数**：\r\n\t\r\n\t- {Number} [columnStart]: 要隐藏的起始列\r\n\t- {Number} [columnEnd]: 要隐藏的结束列\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t隐藏指定的列\r\n\r\n\t特别提醒，隐藏列之后，列的序号会变化。\r\n\r\n- **示例**:\r\n\r\n   - 隐藏2-4列\r\n\r\n\t\t`luckysheet.hideColumn(1, 3)`\r\n\r\n------------\r\n\r\n### showRow(rowStart, rowEnd [,setting])\r\n \r\n- **参数**：\r\n\t\r\n\t- {Number} [rowStart]: 要显示的起始行\r\n\t- {Number} [rowEnd]: 要显示的结束行\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t显示指定的行\r\n\r\n- **示例**:\r\n\r\n   - 显示2-4行\r\n\r\n\t\t`luckysheet.showRow(1, 3)`\r\n\r\n------------\r\n\r\n### showColumn(columnStart, columnEnd [,setting])(TODO)\r\n \r\n- **参数**：\r\n\t\r\n\t- {Number} [columnStart]: 要显示的起始列\r\n\t- {Number} [columnEnd]: 要显示的结束列\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t显示指定的列\r\n\r\n- **示例**:\r\n\r\n   - 显示2-4列\r\n\r\n\t\t`luckysheet.showColumn(1, 3)`\r\n\r\n------------\r\n\r\n### setRowHeight(rowInfo [,setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {Object} [rowInfo]: 行数和高度对应关系\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t设置指定行的高度\r\n\r\n- **示例**:\r\n\r\n   - 设置第一行高度为50px，第二行高度为60px\r\n\r\n\t\t`luckysheet.setRowHeight({0：50，1：60})`\r\n\r\n------------\r\n\r\n### setColumnWidth(columnInfo [,setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {Object} [columnInfo]: 列数和宽度对应关系\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t设置指定列的宽度\r\n\r\n- **示例**:\r\n\r\n   - 设置第一列宽度为50px，第二列宽度为60px\r\n\r\n\t\t`luckysheet.setColumnWidth({0：50，1：60})`\r\n\r\n------------\r\n\r\n### getRowHeight(rowInfo [,setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {Array} [rowInfo]: 行号下标组成的数组；行号下标从0开始；\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t获取指定工作表指定行的高度，得到行号和高度对应关系的对象（第一行行号为0）\r\n\r\n- **示例**:\r\n\r\n   - 第一行高度为50px，第二行高度为60px，获取这些值\r\n\r\n\t\t`luckysheet.getRowHeight([0,1])`\r\n\t\t返回得到\r\n\t\t`{0：50，1：60}`\r\n\r\n------------\r\n\r\n### getColumnWidth(columnInfo [,setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {Array} [columnInfo]: 列号下标组成的数组；列号下标从0开始；\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t获取指定工作表指定列的宽度，得到列号和宽度对应关系的对象（第一列列号为0）\r\n\r\n- **示例**:\r\n\r\n   - 第一列宽度为50px，第二列宽度为60px，获取这些值\r\n\r\n\t\t`luckysheet.getColumnWidth([0,1])`\r\n\t\t返回得到\r\n\t\t`{0：50，1：60}`\r\n\r\n------------\r\n\r\n### getDefaultRowHeight([,setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t获取工作表的默认行高\r\n\r\n- **示例**:\r\n\r\n   - 返回工作表的默认行高\r\n\r\n\t\t`luckysheet.getDefaultRowHeight()`\r\n\t\t返回得到\r\n\t\t`19`\r\n\r\n------------\r\n\r\n### getDefaultColWidth([,setting])\r\n\r\n- **参数**：\r\n\t\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n        + {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t获取工作表的默认列宽\r\n\r\n- **示例**:\r\n\r\n   - 返回工作表的默认列宽\r\n\r\n\t\t`luckysheet.getDefaultColWidth()`\r\n\t\t返回得到\r\n\t\t`73`\r\n\r\n------------\r\n\r\n## 选区操作\r\n\r\n### getRange()\r\n \r\n- **说明**：\r\n\r\n\t返回当前选区对象的数组，可能存在多个选区。每个选区的格式为row/column信息组成的对象`{row:[0,1],column:[0,1]}`\r\n\r\n- **示例**:\r\n\r\n\t- 当前选区为\"A1:B2\"和\"B4:C5\"，执行\r\n\t\t\r\n\t\t`luckysheet.getRange()`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{ \"row\": [0,1], \"column\": [0,1] },\r\n\t\t\t{ \"row\": [3,4], \"column\": [1,2] }\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n### getRangeWithFlatten()\r\n \r\n- **说明**：\r\n\r\n\t返回表示指定区域内所有单元格位置的数组，区别getRange方法，该方法以cell单元格(而非某块连续的区域)为单位来组织选区的数据。\r\n\r\n- **示例**:\r\n\r\n\t- 在表格中选择指定的区域，然后执行\r\n\t\t\r\n\t\t`luckysheet.getRange()`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\"row\":[0,0],\"column\":[0,2]},\r\n\t\t\t{\"row\":[1,1],\"column\":[0,0]},\r\n\t\t\t{\"row\":[3,3],\"column\":[0,0]}\r\n\t\t]\r\n\t\t```\r\n\t\t其中，{\"row\":[0,0],\"column\":[0,2]} 表示的是一整块连续的区域。\r\n\r\n\t- 在表格中选择上面的区域，然后执行\r\n\t\t\r\n\t\t`luckysheet.getRangeWithFlatten()`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\"r\":0,\"c\":0},\r\n\t\t\t{\"r\":0,\"c\":1},\r\n\t\t\t{\"r\":0,\"c\":2},\r\n\t\t\t{\"r\":1,\"c\":0},\r\n\t\t\t{\"r\":3,\"c\":0}\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n### getRangeValuesWithFlatte()\r\n \r\n- **说明**：\r\n\r\n\t返回表示指定区域内所有单元格内容的对象数组\r\n\r\n- **示例**:\r\n\r\n\t- 在表格中选择指定的区域，然后执行\r\n\t\t\r\n\t\t`luckysheet.getRange()`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\"row\":[0,0],\"column\":[0,2]},\r\n\t\t\t{\"row\":[1,1],\"column\":[0,0]},\r\n\t\t\t{\"row\":[3,3],\"column\":[0,0]}\r\n\t\t]\r\n\t\t```\r\n\t\t其中，{\"row\":[0,0],\"column\":[0,2]} 表示的是一整块连续的区域。\r\n\r\n\t- 在表格中选择上面的区域，然后执行\r\n\t\t\r\n\t\t`luckysheet.getRangeValuesWithFlatte()`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\r\n\t\t\t\t\"bg\": null,\r\n\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\"it\": 0,\r\n\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\"vt\": 1,\r\n\t\t\t\t\"v\": 1,\r\n\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t},\r\n\t\t\t\t\"m\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"bg\": null,\r\n\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\"it\": 0,\r\n\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\"vt\": 1,\r\n\t\t\t\t\"v\": 2,\r\n\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t},\r\n\t\t\t\t\"m\": \"2\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"bg\": null,\r\n\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\"it\": 0,\r\n\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\"vt\": 1,\r\n\t\t\t\t\"v\": 3,\r\n\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t},\r\n\t\t\t\t\"m\": \"3\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"v\": \"Background\",\r\n\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t},\r\n\t\t\t\t\"m\": \"Background\",\r\n\t\t\t\t\"bg\": null,\r\n\t\t\t\t\"bl\": 1,\r\n\t\t\t\t\"it\": 0,\r\n\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\"vt\": 1\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"v\": \"Border\",\r\n\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t},\r\n\t\t\t\t\"m\": \"Border\",\r\n\t\t\t\t\"bg\": null,\r\n\t\t\t\t\"bl\": 1,\r\n\t\t\t\t\"it\": 0,\r\n\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\"vt\": 1\r\n\t\t\t}\r\n\t\t]\r\n\t\t```\r\n------------\r\n\r\n\r\n### getRangeAxis()\r\n \r\n- **说明**：\r\n\r\n\t返回对应当前选区的坐标字符串数组，可能存在多个选区。每个选区可能是单个单元格(如 A1)或多个单元格组成的矩形区域(如 D9:E12)\r\n\r\n- **示例**:\r\n\r\n\t- 当前选区为\"E10:E14\"、\"A7:B13\"、\"C4\"、 \"A3\"和\"C6:D9\"，执行\r\n\t\t\r\n\t\t`luckysheet.getRangeAxis()`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\"E10:E14\", \"A7:B13\", \"C4\", \"A3\", \"C6:D9\"]\r\n\t\t```\r\n\r\n------------\r\n\r\n### getRangeValue([setting])\r\n\r\n- **参数**：\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\r\n- **说明**：\r\n\t\r\n\t返回指定工作表指定范围的单元格二维数组数据，每个单元格为一个对象。\r\n\r\n\t[单元格对象格式参考](/zh/guide/cell.html)\r\n\r\n- **示例**:\r\n\r\n\t- 当前选区为\"A1:B2\"，执行\r\n\t\t\r\n\t\t`luckysheet.getRangeValue()`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"v\": \"vaule1\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"m\": \"vaule1\",\r\n\t\t\t\t\t\"bg\": \"rgba(255,255,255)\",\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 1,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 0\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"v\": \"value3\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"m\": \"value3\",\r\n\t\t\t\t\t\"bg\": \"rgba(255,255,255)\",\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 1,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 0\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"v\": \"vaule2\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"m\": \"vaule2\",\r\n\t\t\t\t\t\"bg\": \"rgba(255,255,255)\",\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 1,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 0\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"v\": \"value4\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"m\": \"value4\",\r\n\t\t\t\t\t\"bg\": \"rgba(255,255,255)\",\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 1,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 0\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n### getRangeHtml([setting])\r\n\r\n\r\n- **参数**：\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Array | Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，允许多个选区组成的数组；默认为当前选区\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\r\n- **说明**：\r\n\t\r\n\t复制指定工作表指定单元格区域的数据，返回包含`<table>`html格式的数据，可用于粘贴到excel中保持单元格样式。\r\n\t\r\n\t特别注意，如果复制多个选区，这几个选区必须有相同的行或者相同的列才能复制，复制出的结果也会自动合并成衔接的数组，比如，多选`\"C18:C20\"` / `\"E18:E20\"` / `\"G18:H20\"`是允许的，但是多选`\"C18:C20\"` / `\"E18:E21\"`是不允许的\r\n\r\n- **示例**:\r\n\r\n\t- 当前选区为\"A1:B2\"，执行\r\n\t\t\r\n\t\t`luckysheet.getRangeHtml()`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```html\r\n\t\t<table data-type=\"luckysheet_copy_action_table\">\r\n\t\t\t<colgroup width=\"72px\">\r\n\t\t\t</colgroup>\r\n\t\t\t<colgroup width=\"72px\">\r\n\t\t\t</colgroup>\r\n\t\t\t<tr>\r\n\t\t\t\t<td style=\"height:19px;\">\r\n\t\t\t\t\tvalue1\r\n\t\t\t\t</td>\r\n\t\t\t\t<td style=\"\">\r\n\t\t\t\t\tvalue3\r\n\t\t\t\t</td>\r\n\t\t\t</tr>\r\n\t\t\t<tr>\r\n\t\t\t\t<td style=\"height:19px;\">\r\n\t\t\t\t\tvalue2\r\n\t\t\t\t</td>\r\n\t\t\t\t<td style=\"\">\r\n\t\t\t\t\tvalue4\r\n\t\t\t\t</td>\r\n\t\t\t</tr>\r\n\t\t</table>\r\n\t\t```\r\n\r\n------------\r\n\r\n### getRangeJson(title [,setting])\r\n \r\n\r\n- **参数**：\r\n\r\n    - {Boolean} [title]: 是否首行为标题\r\n\r\n\t\t`title`可能的值有：\r\n\t\t\r\n\t\t+ `\"true\"`: 首行为标题\r\n\t\t+ `\"false\"`: 首行不为标题\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Array | Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\r\n- **说明**：\r\n\r\n\t复制指定工作表指定单元格区域的数据，返回`json`格式的数据\r\n\r\n- **示例**:\r\n\r\n\t- 当前选区为\"A1:B2\"，首行为标题取得json\r\n\t\t\r\n\t\t`luckysheet.getRangeJson(true)`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{ \"value1\": \"value2\", \"value3\": \"value4\" }\r\n\t\t]\r\n\t\t```\r\n\r\n\t- 当前选区为\"A1:B2\"，首行不为标题取得json\r\n\t\t\r\n\t\t`luckysheet.getRangeJson(false)`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{ \"A\": \"value1\", \"B\": \"value3\" },\r\n\t\t\t{ \"A\": \"value2\", \"B\": \"value4\" }\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n### getRangeArray(dimensional [,setting])\r\n\r\n\r\n- **参数**：\r\n\r\n    - {String} [dimensional]: 数组维度\r\n\t\t\r\n\t\t`dimensional`可能的值有：\r\n\t\t\r\n\t\t+ `\"oneDimensional\"`: 一维数组\r\n\t\t+ `\"twoDimensional\"`: 二维数组\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\r\n- **说明**：\r\n\t\r\n\t复制指定工作表指定单元格区域的数据，返回一维、二维或者自定义行列数的二维数组的数据。\r\n\r\n\t特别注意，只有在`dimensional`设置为`custom`的时候，才需要设置`setting`中的`row`和`column`\r\n\r\n- **示例**:\r\n\r\n\t- 当前选区为\"A1:B2\"，一维数组\r\n\t\t\r\n\t\t`luckysheet.getRangeArray('oneDimensional')`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\"value1\",\"value3\",\"value2\",\"value4\"]\r\n\t\t```\r\n\r\n\t- 当前选区为\"A1:B2\"，二维数组\r\n\t\t\r\n\t\t`luckysheet.getRangeArray('twoDimensional')`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t[ \"value1\", \"value3\" ],\r\n\t\t\t[ \"value2\", \"value4\" ]\r\n\t\t]\r\n\t\t```\r\n\r\n\t- 当前选区为\"A1:C5\"，由 'value1'到'value15'的值组成，得到3\t行2列的二维数组数据\r\n\t\t\r\n\t\t`luckysheet.getRangeArray('custom', { row: 3, column: 2 })`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"m\": \"value1\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value1\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value6\",\r\n\t\t\t\t\t\"m\": \"value6\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value11\",\r\n\t\t\t\t\t\"m\": \"value11\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"m\": \"value2\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value2\"\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value7\",\r\n\t\t\t\t\t\"m\": \"value7\"\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value12\",\r\n\t\t\t\t\t\"m\": \"value12\"\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n### getRangeDiagonal(type [,setting])\r\n \r\n\r\n- **参数**：\r\n\r\n\t- {String} [type]: 对角线还是对角线偏移\r\n\t\r\n\t\t`type`可能的值有：\r\n\t\t\r\n\t\t+ `\"normal\"`: 对角线\r\n\t\t+ `\"anti\"`: 反对角线\r\n\t\t+ `\"offset\"`: 对角线偏移\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t- {Number} [column]: `type`为`offset`的时候设置，对角偏移的列数\r\n\t\t+ {Array | Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\r\n- **说明**：\r\n\t\r\n\t复制指定工作表指定单元格区域的数据，返回对角线或者对角线偏移`column`列后的数据。\r\n\r\n\t特别注意，只有在`type`设置为`offset`的时候，才需要设置`setting`中的`column`。\r\n\r\n- **示例**:\r\n\r\n\t- 当前选区为\"A1:B2\"，对角线\r\n\t\t\r\n\t\t`luckysheet.getRangeDiagonal('normal')`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\r\n\t\t\t\t\"m\": \"value1\",\r\n\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\"v\": \"value1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"m\": \"value4\",\r\n\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\"v\": \"value4\"\r\n\t\t\t}\r\n\t\t]\r\n\t\t```\r\n\r\n\t- 当前选区为\"A1:B2\"，反对角线\r\n\t\t\r\n\t\t`luckysheet.getRangeDiagonal('anti')`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\r\n\t\t\t\t\"m\": \"value3\",\r\n\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\"v\": \"value3\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"m\": \"value2\",\r\n\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\"v\": \"value2\"\r\n\t\t\t}\r\n\t\t]\r\n\t\t```\r\n\t- 当前选区为\"A1:B2\"，对角线偏移1列\r\n\t\t\r\n\t\t`luckysheet.getRangeDiagonal('offset', { column: 1 })`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t{\r\n\t\t\t\t\"m\": \"value3\",\r\n\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\"v\": \"value3\"\r\n\t\t\t}\r\n\t\t]\r\n\t\t```\r\n------------\r\n\r\n### getRangeBoolean([setting])\r\n \r\n\r\n- **参数**：\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Array | Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\r\n- **说明**：\r\n\t\r\n\t复制指定工作表指定单元格区域的数据，返回布尔值的数据\r\n\r\n- **示例**:\r\n\r\n\t- 当前选区为\"A1:B2\"\r\n\t\t\r\n\t\t`luckysheet.getRangeBoolean()`\r\n\t\t\r\n\t\t则返回结果为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t[ false, false ],\r\n\t\t\t[ false, false ]\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n### setRangeShow(range [,setting])<div id='setRangeShow'></div>\r\n\r\n\r\n- **参数**：\r\n\r\n\t- {Array | Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，允许多个选区组成的数组；默认为当前选区\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Boolean} [show]: 是否显示高亮选中效果；默认值为 `true`\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t指定工作表选中一个或多个选区为选中状态并选择是否高亮，支持多种格式设置。\r\n\r\n\t特别提醒，Luckysheet中涉及到的选区范围设置都可以参考这个设置\r\n\r\n- **示例**:\r\n\r\n     + 设定当前工作表选区范围`A1:B2`: \r\n      \r\n\t\t`luckysheet.setRangeShow(\"A1:B2\")`\r\n     + 设定选区范围`A1:B2`: \r\n  \t\t\r\n\t\t`luckysheet.setRangeShow([\"A1:B2\"])`\r\n     + 设定选区范围`A1:B2`: \r\n  \r\n  \t\t`luckysheet.setRangeShow({row:[0,1],column:[0,1]})`\r\n     + 设定选区范围`A1:B2`: \r\n  \r\n  \t\t`luckysheet.setRangeShow([{row:[0,1],column:[0,1]}])`\r\n     + 设定选区范围`A1:B2`和`C3:D4`:  \r\n  \r\n\t\t`luckysheet.setRangeShow([\"A1:B2\",\"C3:D4\"])`\r\n     + 设定选区范围`A1:B2`和`D3`: \r\n  \r\n  \t\t`luckysheet.setRangeShow([{row:[0,1],column:[0,1]},{row:[2,2],column:[3,3]}])`\r\n\r\n------------\r\n\r\n### setRangeValue(data [,setting])\r\n \r\n- **参数**：\r\n\r\n\t- {Array} [data]: 要赋值的单元格二维数组数据，每个单元格的值，可以为字符串或数字，或为符合Luckysheet格式的对象，参考 [单元格属性表](/zh/guide/cell.html)\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Array | Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Boolean} [isRefresh]: 是否刷新界面；默认为`true`；用于多个单元格赋值时候控制节流，前面单元格赋值的时候应设置为\t`false`，最后一个单元格赋值时设置为`true`。\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t将一个单元格数组数据赋值到指定的区域，数据格式同`getRangeValue`方法取到的数据。\r\n\r\n\t注意一点，通常`getRangeValue`方法只是取得选区数据，但是不包含边框和合并单元格信息，当执行`setRangeValue`的时候，会动态判断上一步是否执行过`getRangeValue`，如果执行过，会将边框和合并单元格信息一并从Luckysheet配置中取得。\r\n\r\n- **示例**:\r\n\r\n     + 赋值到当前选区\r\n      \r\n\t\t```js\r\n\t\tconst data = [\r\n\t\t\t\t[\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t\"m\": \"value1\",\r\n\t\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"v\": \"value1\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t\"m\": \"value3\",\r\n\t\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"v\": \"value3\"\r\n\t\t\t\t\t}\r\n\t\t\t\t],\r\n\t\t\t\t[\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t\"m\": \"value2\",\r\n\t\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"v\": \"value2\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t\"m\": \"value4\",\r\n\t\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"v\": \"value4\"\r\n\t\t\t\t\t}\r\n\t\t\t\t]\r\n\t\t\t]\r\n\t\tluckysheet.setRangeValue(data,{range:\"A1:B2\"})\r\n\t\t```\r\n\r\n------------\r\n\r\n### setRangeFormat(attr, value [,setting])\r\n \r\n\r\n- **参数**：\r\n\r\n    - {String} [attr]: 属性类型，\r\n  \t参考 [单元格属性表](/zh/guide/cell.html)的属性值\r\n\t- {String | Number | Object} [value]: 具体的设置值，一个属性会对应多个值，参考 [单元格属性表](/zh/guide/cell.html)的值示例，特殊情况：如果属性类型`attr`是单元格格式`ct`，则设置值`value`应提供`ct.fa`，比如设置`\"A1:B2\"`单元格的格式为百分比格式：\r\n\t  \r\n  \t  `luckysheet.setRangeFormat(\"ct\", \"0.00%\", {range:\"A1:B2\"})`\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Object | String} [range]: 设置参数的目标选区范围，支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，允许多个选区组成的数组；默认为当前选区\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t  \r\n\t设置指定范围的单元格格式，一般用作处理格式，赋值操作推荐使用`setRangeValue`方法\r\n    \r\n  \t边框设置时，attr为`\"bd\"`，value为一个key/value对象，需要同时设置边框类型:`borderType`/边框粗细:`style`/边框颜色:`color`/，比如设置`\"A1:B2\"`单元格的边框为所有/红色/细：\r\n\t  \r\n\t`luckysheet.setRangeFormat(\"bd\", {borderType: \"border-right\",style: \"1\", color: \"#ff0000\"}, {range:[\"A1:B2\"]})`\r\n\t\r\n\t完整可选的设置参数如下：\r\n\r\n\t+ 边框类型 `borderType：\"border-left\" | \"border-right\" | \"border-top\" | \"border-bottom\" | \"border-all\" | \"border-outside\" | \"border-inside\" | \"border-horizontal\" | \"border-vertical\" | \"border-none\"`，\r\n\t+ 边框粗细 `style:  1 Thin | 2 Hair | 3 Dotted | 4 Dashed | 5 DashDot | 6 DashDotDot | 7 Double | 8 Medium | 9 MediumDashed | 10 MediumDashDot | 11 MediumDashDotDot | 12 SlantedDashDot | 13 Thick`\r\n\t+ 边框颜色 `color: 16进制颜色值`\r\n\r\n- **示例**:\r\n\r\n   - 设置当前工作表`\"A1:B2\"`范围的单元格文本加粗\r\n\t\t\r\n\t\t`luckysheet.setRangeFormat(\"bl\", 1, {range:\"A1:B2\"})`\r\n   - 设置第二个工作表的`\"B2\"`和`\"C4:D5\"`范围的单元格背景为红色\r\n\t\t\r\n\t\t`luckysheet.setRangeFormat(\"bg\", \"#ff0000\", {range:[\"B2\",\"C4:D5\"], order:1})`\r\n\r\n------------\r\n\r\n### setRangeFilter(type [,setting])\r\n\r\n\r\n- **参数**：\r\n\t\r\n\t- {String} [type]: 打开还是关闭筛选功能\r\n\t\r\n\t\t`type`可能的值有：\r\n\t\t\r\n\t\t+ `\"open\"`: 打开筛选功能，返回当前筛选的范围对象\r\n\t\t+ `\"close\"`: 关闭筛选功能，返回关闭前筛选的范围对象\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t为指定下标的工作表，选定的范围开启或关闭筛选功能\r\n\r\n- **示例**:\r\n\r\n\t- 打开第二个工作表\"A1:B2\"范围的筛选功能\r\n\t`luckysheet.setRangeFilter(\"open\",{range:\"A1:B2\",order:1})`\r\n\r\n------------\r\n\r\n### setRangeMerge(type [,setting])\r\n \r\n\r\n- **参数**：\r\n\t\r\n\t- {String} [type]: 合并单元格类型\r\n\t\r\n\t\t`type`可能的值有：\r\n\t\t\r\n\t\t+ `\"all\"`: 全部合并，区域内所有单元格合并成一个大的单元格\r\n\t\t+ `\"horizontal\"`: 水平合并，区域内在同一行的单元格合并成一个单元格\r\n\t\t+ `\"vertical\"`: 垂直合并，区域内在同一列的单元格合并成一个单元格\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Array | Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，允许多个选区组成的数组；默认为当前选区\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t为指定下标的工作表，选定的范围设定合并单元格\r\n\r\n- **示例**:\r\n\r\n\t- 当前选区 'A1:B2' 设置为合并单元格，类型为全部合并\r\n\t\t\r\n\t\t`luckysheet.setRangeMerge(\"all\")`\r\n\t\t得到 'A1:B1' 的数据为：\r\n\t\t```json\r\n\t\t[\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"m\": \"value1\",\r\n\t\t\t\t\t\"ct\": { \"fa\": \"General\", \"t\": \"g\" },\r\n\t\t\t\t\t\"v\": \"value1\",\r\n\t\t\t\t\t\"mc\": { \"r\": 0, \"c\": 0, \"rs\": 2, \"cs\": 2 }\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"mc\": { \"r\": 0, \"c\": 0 }\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\t[\r\n\t\t\t\t{\r\n\t\t\t\t\t\"mc\": { \"r\": 0, \"c\": 0 }\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"mc\": { \"r\": 0, \"c\": 0 }\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t]\r\n\t\t```\r\n\r\n------------\r\n\r\n### cancelRangeMerge( [setting])\r\n \r\n\r\n- **参数**：\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Array | Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，允许多个选区组成的数组；默认为当前选区\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t为指定下标的工作表，选定的范围取消合并单元格\r\n\r\n- **示例**:\r\n\r\n\t- 当前选区 'A1:B2' 已为合并单元格，现在要取消合并\r\n\t\t\r\n\t\t`luckysheet.cancelRangeMerge()`\r\n\t\t\r\n------------\r\n\r\n### setRangeSort(type [,setting])\r\n \r\n\r\n- **参数**：\r\n\r\n\t- {String} [type]: 排序类型\r\n\t\r\n\t\t`type`可能的值有：\r\n\t\t\r\n\t\t+ `\"asc\"`: 升序\r\n\t\t+ `\"des\"`: 降序\r\n\t\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t\r\n    \t+ {Array | Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t为指定下标的工作表，选定的范围开启排序功能，返回选定范围排序后的数据。\r\n\r\n- **示例**:\r\n\r\n   - 设置当前工作表当前选区为升序\r\n   `luckysheet.setRangeSort(\"asc\")`\r\n\r\n------------\r\n\r\n### setRangeSortMulti(title, sort [,setting])\r\n \r\n\r\n- **参数**：\r\n\r\n\t- {Boolean} [title]: 数据是否具有标题行\r\n\t- {Array} [sort]: 列设置，设置需要排序的列索引和排序方式，格式如：`[{ i:0,sort:'asc' },{ i:1,sort:'des' }]`\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t\r\n    \t+ {Array | Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t为指定下标的工作表，选定的范围开启多列自定义排序功能，返回选定范围排序后的数据。\r\n\r\n- **示例**:\r\n\r\n   - 设置当前工作表当前选区为自定义排序，数据具有标题行，且按第一列升序第二列降序的规则进行排序\r\n   `luckysheet.setRangeSortMulti(true,[{ i:0,sort:'asc' },{ i:1,sort:'des' }])`\r\n\r\n------------\r\n\r\n### setRangeConditionalFormatDefault(conditionName, conditionValue [,setting])\r\n\r\n- **参数**：\r\n\r\n\t- {String} [conditionName]: 条件格式规则类型\r\n\t\r\n\t\t`conditionName`可能的值有：\r\n\t\t\r\n\t\t+ `\"greaterThan\"`: 大于（conditionValue值为 数值或单元格范围）\r\n\t\t+ `\"lessThan\"`: 小于（conditionValue值为 数值或单元格范围）\r\n\t\t+ `\"betweenness\"`: 介于（conditionValue值为 数值或单元格范围）\r\n\t\t+ `\"equal\"`: 等于（conditionValue值为 数值或单元格范围）\r\n\t\t+ `\"textContains\"`: 文本包含（conditionValue值为 文本或单元格范围）\r\n\t\t+ `\"occurrenceDate\"`: 发生日期（conditionValue值为 日期）\r\n\t\t+ `\"duplicateValue\"`: 重复值(conditionValue值为 '0':重复值, '1':唯一值)\r\n\t\t+ `\"top10\"`: 前 N 项（conditionValue值为 1~1000）\r\n\t\t+ `\"top10%\"`: 前 N%（conditionValue值为 1~1000）\r\n\t\t+ `\"last10\"`: 后 N 项（conditionValue值为 1~1000）\r\n\t\t+ `\"last10%\"`: 后 N%（conditionValue值为 1~1000）\r\n\t\t+ `\"AboveAverage\"`: 高于平均值（conditionValue可为空数组）\r\n\t\t+ `\"SubAverage\"`: 低于平均值（conditionValue可为空数组）\r\n\t\t \r\n\t- {Array} [conditionValue]: 可以设置条件单元格或者条件值\r\n\t\t取值规则 （条件值数组最少一个值，最多两个值）\r\n\t\t```js\r\n\t\t[2]\r\n\t\t```\r\n\t\t或者 （若值为单元格范围，则取左上角单元格值）\r\n\t\t```js\r\n\t\t['A1']\r\n\t\t```\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t\r\n      \t+ {Object} [format]: 颜色设置\r\n      \t  \r\n    \t\t* 设置文本颜色和单元格颜色；默认值为` {\r\n\t\t\t\t\"textColor\": \"#000000\",\r\n\t\t\t\t\"cellColor\": \"#ff0000\"\r\n\t\t\t}`\r\n    \t+ {Array | Object | String} [cellrange]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，允许多个选区组成的数组；默认为当前选区\r\n    \t\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t为指定下标的工作表，选定的范围开启条件格式，根据设置的条件格式规则突出显示部分单元格，返回开启条件格式后的数据。\r\n\r\n- **示例**:\r\n\r\n    - 突出显示内容大于数字2的单元格\r\n      `luckysheet.setRangeConditionalFormatDefault(\"greaterThan\",{ type: 'value', content: [2] })`\r\n    \r\n\t- 突出显示内容小于单元格A1内容的单元格\r\n\t  `luckysheet.setRangeConditionalFormatDefault(\"lessThan\",{ type: 'range', content: ['A1'] })`\r\n\r\n\t- 突出显示内容介于2和10之间的单元格\r\n\t  `luckysheet.setRangeConditionalFormatDefault(\"betweenness\",{ type: 'value', content: [2,10] })`\r\n\t\r\n\t- 突出显示内容等于单元格A1内容的单元格\r\n\t  `luckysheet.setRangeConditionalFormatDefault(\"equal\",{ type: 'range', content: ['A1'] })`\r\n\t\r\n\t- 突出显示内容包含单元格A1内容的单元格\r\n\t  `luckysheet.setRangeConditionalFormatDefault(\"textContains\",{ type: 'range', content: ['A1'] })`\r\n\t\r\n\t- 突出显示日期在 `2020/09/24 - 2020/10/15` 之间的单元格\r\n      `luckysheet.setRangeConditionalFormatDefault(\"occurrenceDate\",{ type: 'value', content: ['2020/09/24 - 2020/10/15'] })`\r\n\r\n\t- 突出显示重复值的单元格，content为0\r\n      `luckysheet.setRangeConditionalFormatDefault(\"duplicateValue\",{ type: 'value', content: [0] })`\r\n\r\n\t- 突出显示唯一值的单元格，content为1\r\n      `luckysheet.setRangeConditionalFormatDefault(\"duplicateValue\",{ type: 'value', content: [1] })`\r\n\t\r\n\t- 突出显示排名前20名的单元格\r\n      `luckysheet.setRangeConditionalFormatDefault(\"top\",{ type: 'value', content: [20] })`\r\n\t\r\n\t- 突出显示排名前30%的单元格\r\n      `luckysheet.setRangeConditionalFormatDefault(\"topPercent\",{ type: 'value', content: [30] })`\r\n\t\r\n\t- 突出显示排名后15名的单元格\r\n      `luckysheet.setRangeConditionalFormatDefault(\"last\",{ type: 'value', content: [15] })`\r\n\t\r\n\t- 突出显示排名后15%的单元格\r\n      `luckysheet.setRangeConditionalFormatDefault(\"lastPercent\",{ type: 'value', content: [15] })`\r\n\t\r\n\t- 突出显示高于平均值的单元格\r\n      `luckysheet.setRangeConditionalFormatDefault(\"AboveAverage\",{ type: 'value', content: ['AboveAverage'] })`\r\n\t\r\n\t- 突出显示低于平均值的单元格\r\n\t  `luckysheet.setRangeConditionalFormatDefault(\"SubAverage\",{ type: 'value', content: ['SubAverage'] })`\r\n\r\n------------\r\n\r\n### setRangeConditionalFormat(type [,setting])\r\n\r\n- **参数**：\r\n\r\n\t- {String} [type]: 条件格式规则类型\r\n\t\r\n\t\t`type`可能的值有：\r\n\t\t\r\n\t\t+ `\"dataBar\"`: 数据条\r\n\t\t+ `\"icons\"`: 图标集\r\n\t\t+ `\"colorGradation\"`: 色阶\r\n\t\t \r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t\r\n      \t+ {Array | String} [format]: 颜色设置\r\n    \t \r\n\t\t \t* `type`为`dataBar`时，应设置渐变色；默认值为蓝-白渐变` [\"#638ec6\", \"#ffffff\"]`\r\n\r\n\t\t\t\t推荐的快捷取值：\r\n\t\t\t\t```js\r\n\t\t\t\t[\"#638ec6\", \"#ffffff\"],  //蓝-白渐变 数据条\r\n\t\t\t\t[\"#63c384\", \"#ffffff\"],  //绿-白渐变 数据条\r\n\t\t\t\t[\"#ff555a\", \"#ffffff\"],  //红-白渐变 数据条\r\n\t\t\t\t[\"#ffb628\", \"#ffffff\"],  //橙-白渐变 数据条\r\n\t\t\t\t[\"#008aef\", \"#ffffff\"],  //浅蓝-白渐变 数据条\r\n\t\t\t\t[\"#d6007b\", \"#ffffff\"],  //紫-白渐变 数据条\r\n\t\t\t\t[\"#638ec6\"],  //蓝色 数据条\r\n\t\t\t\t[\"#63c384\"],  //绿色 数据条\r\n\t\t\t\t[\"#ff555a\"],  //红色 数据条\r\n\t\t\t\t[\"#ffb628\"],  //橙色 数据条\r\n\t\t\t\t[\"#008aef\"],  //浅蓝色 数据条\r\n\t\t\t\t[\"#d6007b\"]   //紫色 数据条\r\n\t\t\t\t```\r\n\t\t\t\r\n\t\t\t* `type`为`icons`时，应设置图标类型；默认值为\"threeWayArrowMultiColor\"：三向箭头彩色，\r\n\r\n\t\t\t\t可取值为：\r\n\t\t\t\t\r\n\t\t\t\t`threeWayArrowMultiColor`：三向箭头（彩色），\r\n\t\t\t\t\r\n\t\t\t\t`threeTriangles`：3个三角形，\r\n\r\n\t\t\t\t`fourWayArrowMultiColor`：四向箭头（彩色），\r\n\r\n\t\t\t\t`fiveWayArrowMultiColor`：五向箭头（彩色），\r\n\r\n\t\t\t\t`threeWayArrowGrayColor`：三向箭头（灰色），\r\n\r\n\t\t\t\t`fourWayArrowGrayColor`：四向箭头（灰色），\r\n\r\n\t\t\t\t`fiveWayArrowGrayColor`：五向箭头（灰色），\r\n\r\n\t\t\t\t`threeColorTrafficLightRimless`：三色交通灯（无边框），\r\n\r\n\t\t\t\t`threeSigns`：三标志，\r\n\r\n\t\t\t\t`greenRedBlackGradient`：绿-红-黑渐变，\r\n\r\n\t\t\t\t`threeColorTrafficLightBordered`：三色交通灯（有边框），\r\n\r\n\t\t\t\t`fourColorTrafficLight`：四色交通灯，\r\n\r\n\t\t\t\t`threeSymbolsCircled`：三个符号（有圆圈），\r\n\r\n\t\t\t\t`tricolorFlag`：三色旗，\r\n\r\n\t\t\t\t`threeSymbolsnoCircle`：三个符号（无圆圈），\r\n\r\n\t\t\t\t`threeStars`：3个星形，\r\n\r\n\t\t\t\t`fiveQuadrantDiagram`：五象限图，\r\n\r\n\t\t\t\t`fiveBoxes`：5个框，\r\n\r\n\t\t\t\t`grade4`：四等级，\r\n\r\n\t\t\t\t`grade5`：五等级，\r\n\r\n\t\t\t* `type`为`colorGradation`时，应设置色阶颜色值；默认值为绿-黄-红色阶` [\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\", \"rgb(248, 105, 107)\"]`\r\n\r\n\t\t\t\t推荐的快捷取值：\r\n\t\t\t\t```js\r\n\t\t\t\t[\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\", \"rgb(248, 105, 107)\"],  //绿-黄-红色阶\r\n\t\t\t\t[\"rgb(248, 105, 107)\", \"rgb(255, 235, 132)\", \"rgb(99, 190, 123)\"],  //红-黄-绿色阶\r\n\r\n\t\t\t\t[\"rgb(99, 190, 123)\", \"rgb(252, 252, 255)\", \"rgb(248, 105, 107)\"],  //绿-白-红色阶\r\n\t\t\t\t[\"rgb(248, 105, 107)\", \"rgb(252, 252, 255)\", \"rgb(99, 190, 123)\"],  //红-白-绿色阶\r\n\t\t\t\t\r\n\t\t\t\t[\"rgb(90, 138, 198)\", \"rgb(252, 252, 255)\", \"rgb(248, 105, 107)\"],  //蓝-白-红色阶\r\n\t\t\t\t[\"rgb(248, 105, 107)\", \"rgb(252, 252, 255)\", \"rgb(90, 138, 198)\"],  //红-白-蓝色阶\r\n\t\t\t\t\r\n\t\t\t\t[\"rgb(252, 252, 255)\", \"rgb(248, 105, 107)\"],  //白-红色阶\r\n\t\t\t\t[\"rgb(248, 105, 107)\", \"rgb(252, 252, 255)\"],  //红-白色阶\r\n\r\n\t\t\t\t[\"rgb(99, 190, 123)\", \"rgb(252, 252, 255)\"],  //绿-白色阶\r\n\t\t\t\t[\"rgb(252, 252, 255)\", \"rgb(99, 190, 123)\"],  //白-绿色阶\r\n\r\n\t\t\t\t[\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\"],  //绿-黄色阶\r\n\t\t\t\t[\"rgb(255, 235, 132)\", \"rgb(99, 190, 123)\"]   //黄-绿色阶\r\n\t\t\t\t```\r\n\t\t\t\r\n\t\t+ {Array | Object | String} [cellrange]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，允许多个选区组成的数组；默认为当前选区\r\n    \t\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t为指定下标的工作表，选定的范围开启条件格式，返回开启条件格式后的数据。\r\n\r\n- **示例**:\r\n\r\n    - 当前选区范围开启条件格式，显示渐变色\r\n      `luckysheet.setRangeConditionalFormat(\"dataBar\", { format: [\"#63c384\", \"#ffffff\"] })`\r\n\r\n------------\r\n\r\n### deleteRangeConditionalFormat(itemIndex [,setting])\r\n\r\n- **参数**：\r\n\r\n\t- {Number} [itemIndex]: 条件格式规则索引\r\n\t\t \r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t  \t\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t为指定下标的工作表，删除条件格式规则，返回被删除的条件格式规则。\r\n\r\n- **示例**:\r\n\r\n    - 删除第三个条件格式规则\r\n      `luckysheet.deleteRangeConditionalFormat(2)`\r\n    \r\n------------\r\n\r\n### clearRange([setting])\r\n\r\n- **参数**：\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Array | Object | String} [range]: 要清除的选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，允许多个选区组成的数组；默认为当前选区\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t清除指定工作表指定单元格区域的内容，不同于删除选区的功能，不需要设定单元格移动情况\r\n\r\n- **示例**:\r\n\r\n    - 清空当前选区内容\r\n      `luckysheet.clearRange()`\r\n    \r\n------------\r\n\r\n### deleteRange(move [,setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {String} [move]: 删除后，右侧还是下方的单元格移动\r\n\t\r\n\t\t`move`可能的值有：\r\n\t\t\r\n\t\t+ `\"left\"`: 右侧单元格左移\r\n\t\t+ `\"up\"`: 下方单元格上移\r\n\t\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Object | String} [range]: 要删除的选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`；默认为当前选区\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t删除指定工作表指定单元格区域，同时，指定是右侧单元格左移还是下方单元格上移\r\n\r\n- **示例**:\r\n\r\n    - 删除当前选区并且在删除后，右侧单元格左移\r\n      `luckysheet.deleteRange('left')`\r\n    \r\n------------\r\n\r\n### insertRange(move [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **参数**：\r\n\t\r\n\t- {String} [move]: 活动单元格右移或者下移\r\n\t\r\n\t\t`move`可能的值有：\r\n\t\t\r\n\t\t+ `\"right\"`: 活动单元格右移\r\n\t\t+ `\"bottom\"`: 活动单元格下移\r\n\t\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Array} [data]: 赋值到range区域的单元格二维数组数据，[单元格对象格式参考](/zh/guide/cell.html)；默认值为空数组，即插入空白的区域\r\n\t\t+ {Array | Object | String} [range]: 要插入的位置，选区范围，支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，默认为当前选区\r\n    \t\r\n\t\t\t当未设置data数据时，允许多个选区组成的数组，插入的空白区域即为这些选区的区域，\r\n\t\t\t\r\n\t\t\t当设置了data数据，只能为单个选区，并且会把data数据插入到当前选区的第一个单元格位置\r\n\t\t\t\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t在指定工作表指定单元格区域，赋值单元格数据，或者新建一块空白区域，返回data数据，同时，指定活动单元格右移或者下移\r\n\r\n- **示例**:\r\n\r\n    - 当前选区位置插入空白单元格，并且插入后当前选区单元格右移\r\n      `luckysheet.insertRange('right')`\r\n    \r\n------------\r\n\r\n### matrixOperation(type [,setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {String} [type]: 矩阵操作的类型\r\n\t\r\n\t\t`type`可能的值有：\r\n\t\t\r\n\t\t+ `\"flipUpDown\"`: 上下翻转\r\n\t\t+ `\"flipLeftRight\"`: 左右翻转\r\n\t\t+ `\"flipClockwise\"`: 顺时针旋转\r\n\t\t+ `\"flipCounterClockwise\"`: 逆时针旋转api\r\n\t\t+ `\"transpose\"`: 转置\r\n\t\t+ `\"deleteZeroByRow\"`: 按行删除两端0值\r\n\t\t+ `\"deleteZeroByColumn\"`: 按列删除两端0值\r\n\t\t+ `\"removeDuplicateByRow\"`: 按行删除重复值\r\n\t\t+ `\"removeDuplicateByColumn\"`: 按列删除重复值\r\n\t\t+ `\"newMatrix\"`: 生产新矩阵\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Array | Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t指定工作表指定单元格区域的数据进行矩阵操作，返回操作成功后的结果数据\r\n\r\n- **示例**:\r\n\r\n    - 当前选区上下翻转\r\n    \t\t\r\n\t\t`luckysheet.matrixOperation('flipUpDown')`\r\n\r\n\t\t原来的选区复制为二维数组：\r\n\t\t\r\n\t\t`[[\"value1\",\"value3\"],[\"value2\",\"value4\"]]`\r\n\t\t\r\n\t\t上下翻转后选区复制为二维数组：\r\n\t\t\r\n\t\t`[[\"value2\",\"value4\"],[\"value1\",\"value3\"]]`\r\n    \r\n------------\r\n\r\n### matrixCalculation(type, number [,setting])\r\n\r\n- **参数**：\r\n\t- {String} [type]: 计算方式\r\n\t\r\n\t\t`type`可能的值有：\r\n\t\t\r\n\t\t+ `\"plus\"`: 加\r\n\t\t+ `\"minus\"`: 减\r\n\t\t+ `\"multiply\"`: 乘\r\n\t\t+ `\"divided\"`: 除\r\n\t\t+ `\"power\"`: 次方\r\n\t\t+ `\"root\"`: 次方根\r\n\t\t+ `\"log\"`: log\r\n\t- {Number} [number]: 计算数值，如: 2\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Array | Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t指定工作表指定单元格区域的数据进行矩阵计算，返回计算成功后的结果数据\r\n\r\n- **示例**:\r\n\r\n    - 当前选区所有单元格值加2\r\n    \t\t\r\n\t\t`luckysheet.matrixCalculation('plus', 2)`\r\n\r\n\t\t原来的选区复制为二维数组：\r\n\t\t\r\n\t\t`[[1,2],[3,4]]`\r\n\t\t\r\n\t\t加2后选区复制为二维数组：\r\n\t\t\r\n\t\t`[[3,4],[5,6]]`\r\n    \r\n------------\r\n\r\n## 工作表操作\r\n\r\n### getAllSheets()\r\n\r\n- **说明**：\r\n\r\n\t返回所有工作表配置，格式同工作表配置，得到的结果可用于表格初始化时作为options.data使用。\r\n\r\n\t所以此API适用于，手动操作配置完一个表格后，将所有工作表信息取出来自行保存，再用于其他地方的表格创建。如果想得到包括工作簿配置在内的所有工作簿数据，推荐使用 [toJson](#toJson())，并且可以直接用于初始化Luckysheet。\r\n\r\n- **示例**:\r\n\r\n\t- 取得第一个工作表的所有基本信息\r\n\t`luckysheet.getAllSheets()[0]`\r\n\t\r\n------------\r\n\r\n### getLuckysheetfile()\r\n\r\n- **说明**：\r\n\r\n\t返回所有表格数据结构的一维数组`luckysheetfile`，不同于`getAllSheets`方法，此方法得到的工作表参数会包含很多内部使用变量，最明显的区别是表格数据操作会维护`luckysheetfile[i].data`，而初始化数据采用的是`options.data[i].celldata`，所以`luckysheetfile`可用于调试使用，但是不适用初始化表格。\r\n\r\n\t除此之外，加载过的工作表参数中会增加一个`load = 1`，这个参数在初始化数据的时候需要置为0才行。所以，将`getLuckysheetfile()`得到的数据拿来初始化工作簿，需要做两个工作：\r\n\t\r\n\t- celldata转为data，参考:[transToData](/zh/guide/api.html#transtodata-celldata-setting)\r\n\t- load重置为0或者删除此字段\r\n\r\n\t现在已有`getAllSheets`来完成这个工作，无需再手动转化数据。\r\n\r\n- **示例**:\r\n\r\n\t- 取得第一个工作表的所有调试信息\r\n\t`luckysheet.getLuckysheetfile()[0]`\r\n\t\r\n------------\r\n\r\n### getSheet([setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Number} [index]: 工作表索引；默认值为当前工作表索引\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n    \t+ {Number} [name]: 工作表名称；默认值为当前工作表名称\r\n\r\n- **说明**：\r\n\r\n\t根据index/order/name，快捷返回指定工作表的配置，同 `luckysheetfile[i]`。如果设置多个参数，优先级为：index > order > name。\r\n\t\r\n------------\r\n\r\n### getSheetData([setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\r\n- **说明**：\r\n\r\n\t快捷返回指定工作表的数据，同 `luckysheetfile[i].data`\r\n\t\r\n------------\r\n\r\n### getConfig([setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\r\n- **说明**：\r\n\r\n\t快捷返回指定工作表的config配置，同 `luckysheetfile[i].config`\r\n\r\n------------\r\n\r\n### setConfig(cfg, [setting])\r\n\r\n- **参数**：\r\n\t- {Object} [cfg]: config配置\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n    \t+ {Function} [success]: 操作结束的回调函数\r\n\t\r\n- **说明**：\r\n\r\n\t快捷设置指定工作表config配置\r\n\r\n------------\r\n### updataSheet([setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Array} [data]: 需要更新的工作表配置，参考create这个API的option.data\r\n    \t+ {Function} [success]: 操作结束的回调函数\r\n\t\r\n- **说明**：\r\n\r\n\t根据所传的工作表配置，更新相应的工作表\r\n\r\n\t\r\n------------\r\n### setSheetAdd([setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Object} [sheetObject]: 新增的工作表的数据；默认值为空对象，工作表数据格式参考[options.data](/zh/guide/sheet.html#初始化配置)\r\n    \t+ {Number} [order]: 新增的工作表下标；默认值为最后一个下标位置\r\n    \t+ {Function} [success]: 操作结束的回调函数\r\n\t\r\n- **说明**：\r\n\r\n\t新增一个sheet，返回新增的工作表对象，`setting`中可选设置数据为 `sheetObject`，不传`sheetObject`则会新增一个空白的工作表。\r\n\r\n- **示例**:\r\n\r\n\t- 在最后一个工作表下标位置新增一个空白的工作表\r\n\t`luckysheet.setSheetAdd()`\r\n\t\r\n------------\r\n\r\n### setSheetDelete([setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n    \t+ {Function} [success]: 操作结束的回调函数\r\n\t\r\n- **说明**：\r\n\r\n\t删除指定下标的工作表，返回已删除的工作表对象\r\n\r\n- **示例**:\r\n\r\n\t- 删除当前工作表\r\n\t`luckysheet.setSheetDelete()`\r\n\t\t\t\r\n------------\r\n\r\n### setSheetCopy([setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [targetOrder]: 新复制的工作表目标下标位置；默认值为当前工作表下标的下一个下标位置（递增）\r\n    \t+ {Number} [order]: 被复制的工作表下标；默认值为当前工作表下标\r\n    \t+ {Function} [success]: 操作结束的回调函数\r\n\t\r\n- **说明**：\r\n\r\n\t复制指定下标的工作表到指定下标位置，在`setting`中可选设置指定下标位置`targetOrder`，返回新复制的工作表对象\r\n\r\n- **示例**:\r\n\r\n\t- 复制当前工作表到下一个下标位置\r\n\t`luckysheet.setSheetCopy()`\r\n\r\n------------\r\n\r\n### setSheetHide([setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Number} [order]: 被隐藏的工作表下标；默认值为当前工作表下标\r\n    \t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t隐藏指定下标的工作表，返回被隐藏的工作表对象\r\n\r\n- **示例**:\r\n\r\n\t- 隐藏当前工作表\r\n\t`luckysheet.setSheetHide()`\r\n\t- 隐藏第三个工作表\r\n\t`luckysheet.setSheetHide({order:2})`\r\n\r\n------------\r\n\r\n### setSheetShow([setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Number} [order]: 被取消隐藏的工作表下标；默认值为当前工作表下标\r\n    \t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t取消隐藏指定下标的工作表，返回被取消隐藏的工作表对象\r\n\r\n- **示例**:\r\n\r\n\t- 取消隐藏第三个工作表\r\n\t`luckysheet.setSheetShow({order:2})`\r\n\r\n------------\r\n\r\n### setSheetActive(order [,setting])\r\n\r\n- **参数**：\r\n\r\n\t- {Number} [order]: 要激活的工作表下标\r\n\t- {PlainObject} [setting]: 可选参数\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t设置指定下标的工作表为当前工作表（激活态），即切换到指定的工作表，返回被激活的工作表对象\r\n\r\n- **示例**:\r\n\r\n\t- 切换到第二个工作表\r\n\t`luckysheet.setSheetActive(1)`\r\n\r\n------------\r\n\r\n### setSheetName(name [,setting])\r\n\r\n- **参数**：\r\n\r\n    - {String} [name]: 新的工作表名称\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\t\r\n- **说明**：\r\n\t\r\n\t修改工作表名称\r\n\r\n- **示例**:\r\n\r\n\t- 修改当前工作表名称为\"CellSheet\"\r\n\t`luckysheet.setSheetName(\"CellSheet\")`\r\n\r\n------------\r\n\r\n### setSheetColor(color [,setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {String} [color]: 工作表颜色\r\n\t- {PlainObject} [setting]: 可选参数\r\n        + {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t设置工作表名称处的颜色\r\n\r\n- **示例**:\r\n\r\n\t- 修改当前工作表名称处的颜色为红色\r\n\t`luckysheet.setSheetColor(\"#ff0000\")`\r\n\r\n------------\r\n\r\n### setSheetMove(type [,setting])\r\n\r\n- **参数**：\r\n\r\n    - {String | Number} [type]: 工作表移动方向或者移动的目标下标，\r\n\t\t\r\n\t\t`type`可能的值有：\r\n\t\t\r\n\t\t+ `\"left\"`: 向左\r\n\t\t+ `\"right\"`: 向右\r\n\t\t+ `1`/`2`/`3`/...: 指定下标\r\n\t- {PlainObject} [setting]: 可选参数\r\n    \t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t指定工作表向左边或右边移动一个位置，或者指定下标，返回指定的工作表对象\r\n\r\n- **示例**:\r\n\r\n\t- 当前工作表向左移动一个位置\r\n\t`luckysheet.setSheetMove(\"left\")`\r\n\t- 第二个工作表移动到第四个工作表的下标位置\r\n\t`luckysheet.setSheetMove(3,{order:1})`\r\n\r\n------------\r\n\r\n### setSheetOrder(orderList [,setting])\r\n\r\n- **参数**：\r\n\r\n    - {Array} [orderList]: 工作表顺序，设置工作表的index和order来指定位置，如：\r\n\t\r\n\t```json\r\n\t[\r\n\t\t{index:'sheet_01',order: 2},\r\n\t\t{index:'sheet_02',order: 1},\r\n\t\t{index:'sheet_03',order: 0},\r\n\t]\r\n\t```\r\n\t数组中顺序并不重要，关键是指定sheet index和order的对应关系。\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t重新排序所有工作表的位置，指定工作表顺序的数组。\r\n\r\n\r\n- **示例**:\r\n\r\n\t- 重排工作表，此工作簿含有3个工作表\r\n\t```js\r\n\tluckysheet.setSheetOrder([\r\n\t\t{index:'sheet_01',order: 2},\r\n\t\t{index:'sheet_02',order: 1},\r\n\t\t{index:'sheet_03',order: 0},\r\n\t])\r\n\t```\r\n\r\n------------\r\n\r\n### setSheetZoom(zoom [,setting])\r\n\r\n- **参数**：\r\n\r\n    - {Number} [zoom]: 工作表缩放比例，值范围为0.1 ~ 4；\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t设置工作表缩放比例\r\n\r\n\r\n- **示例**:\r\n\r\n\t- 设置当前工作表缩放比例为0.5\r\n\t```js\r\n\tluckysheet.setSheetZoom(0.5)\r\n\t```\r\n\r\n------------\r\n\r\n### showGridLines([setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Number} [order]: 需要显示网格线的工作表下标；默认值为当前工作表下标\r\n    \t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t显示指定下标工作表的网格线，返回操作的工作表对象\r\n\r\n- **示例**:\r\n\r\n\t- 显示当前工作表的网格线\r\n\t`luckysheet.showGridLines()`\r\n\t- 显示第三个工作表的网格线\r\n\t`luckysheet.showGridLines({order:2})`\r\n\r\n------------\r\n\r\n### hideGridLines([setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Number} [order]: 需要隐藏网格线的工作表下标；默认值为当前工作表下标\r\n    \t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t隐藏指定下标工作表的网格线，返回操作的工作表对象\r\n\r\n- **示例**:\r\n\r\n\t- 隐藏当前工作表的网格线\r\n\t`luckysheet.hideGridLines()`\r\n\t- 隐藏第三个工作表的网格线\r\n\t`luckysheet.hideGridLines({order:2})`\r\n\r\n------------\r\n\r\n## 工作簿操作\r\n\r\n### create(options)\r\n\r\n- **参数**：\r\n\t\r\n\t- {Object} [options]:表格的所有配置信息\r\n\r\n- **说明**：\r\n\t\r\n\t初始化一个Luckysheet，可包含多个工作表，参考 [配置列表](/zh/guide/config.html)\r\n\r\n------------\r\n\r\n### refresh([setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Function} [success]: 表格刷新成功后的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t刷新canvas\r\n\r\n------------\r\n\r\n### scroll([setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [scrollLeft]：横向滚动值。默认为当前横向滚动位置。\r\n\t\t+ {Number} [scrollTop]：纵向滚动值。默认为当前纵向滚动位置。\r\n\t\t+ {Number} [targetRow]：纵向滚动到指定的行号。默认为当前纵向滚动位置。\r\n\t\t+ {Number} [targetColumn]：横向滚动到指定的列号。默认为当前横向滚动位置。\r\n\t\t+ {Function} [success]: 表格刷新成功后的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t滚动当前工作表位置\r\n\r\n------------\r\n\r\n### resize([setting])\r\n\r\n- **参数**：\r\n\t\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t根据窗口大小自动resize画布\r\n\r\n------------\r\n\r\n### destroy([setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Function} [success]: 表格释放成功后的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t删除并释放表格\r\n\r\n------------\r\n\r\n### getScreenshot([setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n\t\t+ {Object | String} [range]: 选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n\r\n- **说明**：\r\n\t\r\n\t返回当前表格指定选区截图后生成的base64格式的图片\r\n\r\n------------\r\n\r\n### setWorkbookName(name [,setting])\r\n\r\n- **参数**：\r\n\r\n    - {String} [name]: 工作簿名称\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t设置工作簿名称\r\n\r\n------------\r\n\r\n### getWorkbookName([,setting])\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n    \t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t获取工作簿名称\r\n\r\n------------\r\n\r\n### undo([setting])\r\n\r\n- **参数**：\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t撤销当前操作，返回刚刚撤销的操作对象\r\n\r\n------------\r\n\r\n### redo([setting])\r\n\r\n- **参数**：\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n        + {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t重做当前操作，返回刚刚重做的操作对象\r\n\r\n------------\r\n\r\n### refreshFormula([success])\r\n\r\n- **参数**：\r\n\r\n\t- {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t强制刷新公式。当你直接修改了多个单元格的值，且没有触发刷新，且这些单元格跟公式相关联，则可以使用这个api最后强制触发一次公式刷新。\r\n\r\n------------\r\n\r\n### pagerInit([setting])\r\n\r\n- **参数**：\r\n\r\n\t- {PlainObject} [setting]: 参数配置\r\n\t\t+ {Number} \t\t[pageIndex]:  当前的页码（必填）。\r\n\t\t+ {Number} \t\t[pageSize]:   每页显示多少条数据（必填）。\r\n\t\t+ {Number} \t\t[total]:  总条数（必填）。\r\n\t\t+ {Boolean} \t[showTotal]:  是否显示总数，默认关闭：false。\r\n\t\t+ {Boolean} \t[showSkip]:  是否显示跳页，默认关闭：false。\r\n\t\t+ {Boolean} \t[showPN]:  是否显示上下翻页，默认开启：true。\r\n\t\t+ {Array} \t\t[selectOption]:  选择分页的条数。\r\n\t\t+ {String} \t\t[prevPage]:  上翻页文字描述，默认\"上一页\"。\r\n\t\t+ {String} \t\t[nextPage]:  下翻页文字描述，默认\"下一页\"。\r\n\t\t+ {String} \t\t[totalTxt]:  数据总条数文字描述，默认\"总共：{total}\"。\r\n\r\n\r\n\r\n- **说明**：\r\n\t\r\n\t初始化分页器。ps：create阶段，可以直接配置options.pager参数，渲染阶段会将options.pager作为参数来初始化分页器，可通过钩子函数onTogglePager来监听页码的切换\r\n\r\n### refreshMenuButtonFocus([data],[r],[c],[success])\r\n\r\n- **参数**：\r\n\r\n\t- {Array}  [data]: 操作数据\r\n\t- {Number} [r]: 指定的行\r\n\t- {Number} [c]: 指定的列\r\n\t- {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t刷新指定单元格的顶部状态栏状态。\r\n\r\n------------\r\n\r\n### checkTheStatusOfTheSelectedCells(type,status)\r\n\r\n- **参数**：\r\n\r\n\t- {String} type: 类型\r\n\t- {String} status: 目标状态值\r\n\r\n- **说明**：\r\n\t\r\n\t检查选区内所有cell指定类型的状态是否满足条件（主要是粗体、斜体、删除线和下划线等等）。\r\n\r\n------------\r\n\r\n## 图表\r\n\r\n### insertChart([setting])\r\n\r\n[todo]\r\n\r\n\r\n- **参数**：\r\n\r\n    - {PlainObject} [setting]: 可选参数\r\n\t\t+ {Array | Object | String} [range]: 图表数据的选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t指定工作表指定选区范围生成一个图表，返回图表参数对象，包含图表唯一标识符chart id\r\n\r\n------------\r\n\r\n### setChart(chartId, attr, value [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **参数**：\r\n\t\r\n\t- {String} [chartId]: 指定要修改的图表id\r\n\t- {String} [attr]: 属性类型\r\n\t\t\r\n\t\t`attr`可能的值有：\r\n\t\t\r\n\t\t+ `\"left\"`: 左边到工作表边缘的距离\r\n\t\t+ `\"top\"`: 上边到工作表边缘的距离\r\n\t\t+ `\"width\"`: 图表外框的宽度\r\n\t\t+ `\"height\"`: 图表外框的高度\r\n\t\t+ `\"chartOptions\"`: 图表的详细设置项\r\n    \r\n\t- {Number | Object}} [value]: 属性值，当`attr`为`chartOptions`时，直接设置整个chart的配置对象\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t修改指定id图表的参数，返回修改后的整个图表参数\r\n\r\n------------\r\n\r\n### getChart(chartId)\r\n\r\n[todo]\r\n\r\n\r\n- **参数**：\r\n\t\r\n\t- {String} [chartId]: 指定要获取的图表id\r\n\r\n- **说明**：\r\n\t\r\n\t获取指定id图表的参数\r\n\r\n------------\r\n\r\n### deleteChart(chartId [,setting])\r\n\r\n[todo]\r\n\r\n\r\n- **参数**：\r\n\t\r\n\t- {String} [chartId]: 要删除的图表id\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t删除指定id图表，返回被删除的图表的参数\r\n\r\n------------\r\n\r\n## 数据验证\r\n\r\n### setDataVerification(optionItem, [setting])\r\n\r\n- **参数**：\r\n\t\r\n\t- {Object} [optionItem]: 数据验证的配置信息，具体详细的配置信息参考[dataVerification](/zh/guide/sheet.html#dataVerification)\r\n\t\t\r\n    - {PlainObject} [setting]: 可选参数\r\n        + {Object | String} [range]: 数据验证的选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t指定工作表范围设置数据验证功能，并设置参数\r\n\r\n------------\r\n\r\n### deleteDataVerification([setting])\r\n\r\n- **参数**：\r\n\t\r\n    - {PlainObject} [setting]: 可选参数\r\n\t\t+ {Object | String} [range]: 数据验证的选区范围,支持选区的格式为`\"A1:B2\"`、`\"sheetName!A1:B2\"`或者`{row:[0,1],column:[0,1]}`，只能为单个选区；默认为当前选区\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t指定工作表范围删除数据验证功能\r\n\r\n------------\r\n\r\n## 图片\r\n\r\n### insertImage(src, [setting])\r\n\r\n- **参数**：\r\n\r\n\t- {String} [src]: 图片src\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Number} [rowIndex]: 要插入图片的单元格行下标；默认为当前选区聚焦单元格行下标 || 0\r\n\t\t+ {Number} [colIndex]: 要插入图片的单元格列下标；默认为当前选区聚焦单元格列下标 || 0\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\r\n\t在指定的工作表中指定单元格位置插入图片\r\n\r\n### deleteImage([setting])\r\n\r\n- **参数**：\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {String | Array} [idList]: 要删除图片的id集合，也可为字符串`\"all\"`，all为所有的字符串；默认为`\"all\"`\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\r\n\t删除指定工作表中的图片\r\n\r\n### getImageOption([setting])\r\n\r\n- **参数**：\r\n\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\r\n\t获取指定工作表的图片配置\r\n\r\n## 工作表保护\r\n\r\n\r\n### setProtection(option, [setting])\r\n\r\n[todo]\r\n\r\n- **参数**：\r\n\t\r\n\t- {Object} [option]: 工作表保护的配置信息\r\n    - {PlainObject} [setting]: 可选参数\r\n\t\t+ {Number} [order]: 工作表下标；默认值为当前工作表下标\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\t指定工作表设置工作表保护功能\r\n\r\n------------\r\n\r\n## 工具方法\r\n\r\n### transToCellData(data [,setting])<div id='transToCellData'></div>\r\n\r\n- **参数**：\r\n\t\r\n\t- {Array} [data]: data数据\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\tdata => celldata ，data二维数组数据转化成 {r, c, v}格式一维数组\r\n\r\n------------\r\n\r\n### transToData(celldata [,setting])<div id='transToData'></div>\r\n\r\n- **参数**：\r\n\t\r\n\t- {Array} [celldata]: data数据\r\n\t\r\n\t- {PlainObject} [setting]: 可选参数\r\n\t\t+ {Function} [success]: 操作结束的回调函数\r\n\r\n- **说明**：\r\n\t\r\n\tcelldata => data ，celldata一维数组数据转化成表格所需二维数组\r\n\r\n------------\r\n\r\n### toJson()\r\n\r\n\r\n- **说明**：\r\n\t\r\n\t导出的json字符串可以直接当作`luckysheet.create(options)`初始化工作簿时的参数`options`使用，使用场景在用户自己操作表格后想要手动保存全部的参数，再去别处初始化这个表格使用，类似一个luckysheet专有格式的导入导出。\r\n\r\n------------\r\n\r\n### changLang([lang])\r\n\r\n- **参数**：\r\n\r\n\t+ {String} [lang]: 语言类型；暂支持`\"zh\"`、`\"en\"`、`\"es\"`；默认为`\"zh\"`；\r\n\r\n- **说明**：\r\n\r\n\t传入目标语言，切换到对应的语言界面\r\n\r\n### closeWebsocket()\r\n\r\n- **说明**：\r\n\r\n\t关闭websocket连接\r\n\r\n### openSearchDialog()\r\n\r\n- **说明**：\r\n\r\n  打开搜索/替换弹窗\r\n\r\n### getRangeByTxt([txt])\r\n\r\n- **说明**：\r\n\t\r\n\t将字符串格式的工作表范围转换为数组形式\r\n\r\n- **参数**：\r\n\r\n  \t+ {String} [txt]: 选区范围,支持选区的格式为`\"A1:B2\"`或者指定工作表名称的写法`\"sheetName!A1:B2\"`，只支持单个选区；默认为当前最后一个选区\r\n\r\n- **示例**:\r\n\r\n\t- 当前选区为`A1:B2`，`luckysheet.getRangeByTxt()`返回：`{column: (2) [0, 1],row: (2) [0, 1]}`\r\n\t- `luckysheet.getRangeByTxt(\"A1:B2\")`返回：`{column: (2) [0, 1],row: (2) [0, 1]}`\r\n    - `luckysheet.getRangeByTxt(\"Cell!A1:B2\")`返回：`{column: (2) [0, 1],row: (2) [0, 1]}`\r\n\r\n------------\r\n\r\n### getTxtByRange([range])\r\n\r\n- **说明**：\r\n\t\r\n\t将数组格式的工作表范围转换为字符串格式的形式\r\n\r\n- **参数**：\r\n\r\n  \t+ {Array | Object} [range]: 选区范围,支持选区的格式为`{row:[0,1],column:[0,1]}`，允许多个选区组成的数组；默认为当前选区\r\n\r\n- **示例**:\r\n\r\n\t- 当前选区为`A1:B3`，`luckysheet.getTxtByRange()`返回：当前选区`\"A1:B3\"`\r\n\t- `luckysheet.getTxtByRange({column:[0,1],row:[0,2]})`返回：`\"A1:B3\"`\r\n\t- `luckysheet.getTxtByRange([{column:[0,1],row:[0,2]}])`返回：`\"A1:B3\"`\r\n\t- `luckysheet.getTxtByRange([{column:[0,1],row:[0,2]},{column:[1,1],row:[1,2]}])`返回：`\"A1:B3,B2:B3\"`\r\n\r\n------------\r\n\r\n\r\n## 旧版API\r\n\r\n::: warning\r\n为保持兼容性，仍然支持旧版API，但是已不推荐使用。\r\n:::\r\n\r\n### getcellvalue([r] [,c] [,data] [,type])\r\n\r\n- **参数**：\r\n\t\r\n\t- {Number} [r]:单元格所在行数；可选值；从0开始的整数，0表示第一行\r\n\t- {Number} [c]:单元格所在列数；可选值；从0开始的整数，0表示第一列\r\n\t- {Array} [data]:表数据，二维数组；可选值；默认值为当前表格数据\r\n\t- {String} [type]:单元格属性值；可选值；默认值为'v',表示获取单元格的实际值\r\n\r\n- **说明**：\r\n\r\n\t此方法为获取单元格的值。\r\n\r\n\t- luckysheet.getcellvalue()：返回当前工作表的所有数据；\r\n\t- luckysheet.getcellvalue(0)：返回当前工作表第1行数据；\r\n\t- luckysheet.getcellvalue(null,0)：返回当前工作表第1列数据；\r\n\t- luckysheet.getcellvalue(0,0)：返回当前工作表第1行第1列单元格的数据的v值；\r\n\t- luckysheet.getcellvalue(1,1,null,'m'): 返回指定data数据的第2行第2列单元格的原始值。\r\n\t\r\n\t特殊情况：单元格格式为yyyy-MM-dd，type为'v'时会强制取'm'显示值\r\n\r\n\t> 推荐使用新API： <a href='#getCellValue'>getCellValue</a>\r\n\r\n------------\r\n\r\n### getluckysheetfile()\r\n\r\n- **说明**：\r\n\r\n\t返回所有表格数据结构的一维数组`luckysheetfile`\r\n\r\n\t> 推荐使用新API： [getLuckysheetfile](#getLuckysheetfile())\r\n\r\n------------\r\n\r\n### getconfig()\r\n\r\n- **说明**：\r\n\r\n\t快捷返回当前表格config配置，每个工作表的config信息仍然包含在luckysheetfile。\r\n\t\r\n\t> 推荐使用新API： [getConfig](#getConfig([setting]))\r\n\r\n------------\r\n\r\n### getluckysheet_select_save()\r\n\r\n- **说明**：\r\n\r\n\t返回当前选区对象的数组，可能存在多个选区。\r\n\r\n\t> 推荐使用新API： [getRange](#getRange())\r\n\r\n------------\r\n\r\n### getdatabyselection([range] [,sheetOrder])\r\n\r\n- **参数**：\r\n\t\r\n\t- {Object} [range]：选区对象，`object: { row: [r1, r2], column: [c1, c2] }`；默认为当前第一个选区。\r\n\t- {Number} [sheetOrder]：表格下标，从0开始的整数，0表示第一个表格；默认为当前表格下标。\r\n\r\n- **说明**：\r\n\r\n\t返回某个表格第一个选区的数据。\r\n\t- `luckysheet.getdatabyselection()`: 返回当前工作表当前选区的数据\r\n\t- `luckysheet.getdatabyselection(null,1)`: 返回第2个工作表的当前选区的数据\r\n\r\n\t> 推荐使用新API： [getRangeValue](#getRangeValue([setting]))\r\n\r\n------------\r\n\r\n### luckysheetrefreshgrid(scrollWidth, scrollHeight)\r\n\r\n- **参数**：\r\n\t\r\n\t- {Number} [scrollWidth]：横向滚动值。默认为当前横向滚动位置。\r\n\t- {Number} [scrollHeight]：纵向滚动值。默认为当前纵向滚动位置。\r\n\r\n- **说明**：\r\n\r\n\t按照scrollWidth, scrollHeight刷新canvas展示数据。\r\n\r\n\t> 推荐使用新API： [scroll](/zh/guide/api.html#scroll-setting)\r\n------------\r\n\r\n### setcellvalue(r, c, d, v)\r\n\r\n- **参数**：\r\n\t\r\n\t- {Number} [r]：单元格所在行数；从0开始的整数，0表示第一行。\r\n\t- {Number} [c]：单元格所在列数；从0开始的整数，0表示第一列。\r\n\t- {Array} [d]：表数据；可选值；二维数组。\r\n\t- {Object | String | Number} [v]：要设置的值；可为对象，对象是是要符合单元格对象格式。\r\n\r\n- **说明**：\r\n\r\n\t设置某个单元格的值。可配合`luckysheet.jfrefreshgrid()`刷新查看单元格值改变。\r\n\r\n\t```js\r\n\tluckysheet.setcellvalue(0, 0, luckysheet.flowdata(), 'abc');\r\n\tluckysheet.jfrefreshgrid();\r\n\t```\r\n\r\n------------\r\n\r\n### jfrefreshgrid()\r\n\r\n- **说明**：\r\n\r\n\t刷新canvas\r\n\r\n\t> 推荐使用新API： [refresh](#refresh([setting]))\r\n\t\r\n------------\r\n\r\n### setluckysheet_select_save(v)\r\n\r\n- **参数**：\r\n\t\r\n\t- {Array} [v]：要设置的选区值(数组)。符合选区格式规则，如`[{ row: [r1, r2], column: [c1, c2] }]`。\r\n\r\n- **说明**：\r\n\t\r\n\t设置当前表格选区的值。配合`luckysheet.selectHightlightShow()`可在界面查看选区改变。\r\n\t```js\r\n\tluckysheet.setluckysheet_select_save([{ row: [0, 1], column: [0, 1] }]);\r\n\tluckysheet.selectHightlightShow();\r\n\t```\r\n\r\n\t> 推荐使用新API：<a href='#setRangeShow'>setRangeShow</a>\r\n\t\r\n------------\r\n\r\n### selectHightlightShow()\r\n\r\n- **说明**：\r\n\r\n\t高亮当前选区\r\n\r\n\t> 推荐使用新API：<a href='#setRangeShow'>setRangeShow</a>\r\n\r\n------------\r\n\r\n### flowdata()\r\n\r\n- **说明**：\r\n\t\r\n\t快捷获取当前表格的数据\r\n\r\n\t> 推荐使用新API：[getSheetData](#getSheetData())\r\n\r\n------------\r\n\r\n### buildGridData(file)\r\n\r\n- **参数**：\r\n\t\r\n\t- {Object} [file]：[luckysheetfile](/zh/guide/sheet.html)\r\n\r\n- **说明**：\r\n\t\r\n\t生成表格可以识别的二维数组\r\n\r\n\t> 推荐使用新API：<a href='#transToData'>transToData</a>\r\n\r\n------------\r\n\r\n### getGridData(data)\r\n\r\n- **参数**：\r\n\t\r\n\t- {Array} [data]：工作表的二维数组数据\r\n\r\n- **说明**：\r\n\t\r\n\t二维数组数据转化成 `{r, c, v}` 格式 一维数组\r\n\r\n\t> 推荐使用新API：<a href='#transToCellData'>transToCellData</a>\r\n"
  },
  {
    "path": "docs/zh/guide/cell.md",
    "content": "# 单元格\r\n\r\n## 基本单元格\r\n\r\n单元格是Luckysheet中最基本的单位，每个单元格都会保存为一个对象，一个工作表的数据则会保存为一个由单元格对象组成的二维数组，并存入当前工作表的 `luckysheetfile[i].data`中。\r\n\r\n单元格对象包含以下单元格属性\r\n\r\n<table>\r\n    <tr>\r\n        <td>属性值</td>\r\n        <td>全称</td>\r\n        <td><div style=\"width:100px\">说明</div></td>\r\n        <td>值示例</td>\r\n        <td>Aspose方法或者属性</td>\r\n    </tr>\r\n    <tr>\r\n        <td>ct</td>\r\n        <td>celltype</td>\r\n        <td>单元格值格式：文本、时间等</td>\r\n        <td><code>{\r\n            \"fa\": \"General\",\r\n            \"t\": \"g\"\r\n        }</code><a href=\"#cellStyle\">单元格值格式</a></td>\r\n        <td></td>\r\n    </tr>\r\n    <tr>\r\n        <td>bg</td>\r\n        <td>background</td>\r\n        <td>背景颜色</td>\r\n        <td>#fff000</td>\r\n        <td>setBackgroundColor</td>\r\n    </tr>\r\n    <tr>\r\n        <td>ff</td>\r\n        <td>fontfamily</td>\r\n        <td>字体</td>\r\n        <td>0 Times New Roman、 1 Arial、2 Tahoma 、3 Verdana、4 微软雅黑、5 宋体（Song）、6 黑体（ST Heiti）、7 楷体（ST Kaiti）、 8 仿宋（ST FangSong）、9 新宋体（ST Song）、10 华文新魏、11 华文行楷、12 华文隶书</td>\r\n        <td>Style.Font object's Name property.</td>\r\n    </tr>\r\n    <tr>\r\n        <td>fc</td>\r\n        <td>fontcolor</td>\r\n        <td>字体颜色</td>\r\n        <td>#fff000</td>\r\n        <td>Style.Font object's Color property</td>\r\n    </tr>\r\n    <tr>\r\n        <td>bl</td>\r\n        <td>bold</td>\r\n        <td>粗体</td>\r\n        <td>0 常规 、 1加粗</td>\r\n        <td>Style.Font object's IsBold property to true.</td>\r\n    </tr>\r\n    <tr>\r\n        <td>it</td>\r\n        <td>italic</td>\r\n        <td>斜体</td>\r\n        <td>0 常规 、 1 斜体</td>\r\n        <td></td>\r\n    </tr>\r\n    <tr>\r\n        <td>fs</td>\r\n        <td>fontsize</td>\r\n        <td>字体大小</td>\r\n        <td>14</td>\r\n        <td>Style.Font object's Size property.</td>\r\n    </tr>\r\n    <tr>\r\n        <td>cl</td>\r\n        <td>cancelline</td>\r\n        <td>删除线</td>\r\n        <td>0 常规 、 1 删除线</td>\r\n        <td>Style.Font object's Underline property</td>\r\n    </tr>\r\n    <tr>\r\n        <td>un</td>\r\n        <td>underline</td>\r\n        <td>下划线</td>\r\n        <td>0 无 、 1 有</td>\r\n        <td></td>\r\n    </tr>\r\n    <tr>\r\n        <td>vt</td>\r\n        <td>verticaltype</td>\r\n        <td>垂直对齐</td>\r\n        <td>0 中间、1 上、2下</td>\r\n        <td>setVerticalAlignment</td>\r\n    </tr>\r\n    <tr>\r\n        <td>ht</td>\r\n        <td>horizontaltype</td>\r\n        <td>水平对齐</td>\r\n        <td>0 居中、1 左、2右</td>\r\n        <td>setHorizontalAlignment</td>\r\n    </tr>\r\n    <tr>\r\n        <td>mc</td>\r\n        <td>mergecell</td>\r\n        <td>合并单元格</td>\r\n        <td>主单元格{ r:0, c:0, rs: 2, cs:2 }，辅单元格{ r:0, c:0 }，<a href=\"#mergeCell\">合并单元格案例</a></td>\r\n        <td>Merge</td>\r\n    </tr>\r\n    <tr>\r\n        <td>tr</td>\r\n        <td>textrotate</td>\r\n        <td>竖排文字</td>\r\n        <td>3</td>\r\n        <td>setRotationAngle</td>\r\n    </tr>\r\n    <tr>\r\n        <td>rt</td>\r\n        <td>rotatetext</td>\r\n        <td>文字旋转角度</td>\r\n        <td>介于0~180之间的整数，包含0和180</td>\r\n        <td>setRotationAngle</td>\r\n    </tr>\r\n    <tr>\r\n        <td>tb</td>\r\n        <td>textbeak</td>\r\n        <td>文本换行</td>\r\n        <td>0 截断、1溢出、2 自动换行</td>\r\n        <td>2：setTextWrapped <br> 0和1：IsTextWrapped =&nbsp;true</td>\r\n    </tr>\r\n    <tr>\r\n        <td>v</td>\r\n        <td>value</td>\r\n        <td>原始值</td>\r\n        <td></td>\r\n        <td></td>\r\n    </tr>\r\n    <tr>\r\n        <td>m</td>\r\n        <td>monitor</td>\r\n        <td>显示值</td>\r\n        <td></td>\r\n        <td></td>\r\n    </tr>\r\n    <tr>\r\n        <td>f</td>\r\n        <td>function</td>\r\n        <td>公式</td>\r\n        <td></td>\r\n        <td>setFormula <br> setArrayFormula <br> workbook.calculateFormula();</td>\r\n    </tr>\r\n    <tr>\r\n        <td>ps</td>\r\n        <td>comment</td>\r\n        <td>批注</td>\r\n        <td>\r\n        <code>\r\n        {<br>\r\n            height: 140,//批注框高度 <br>\r\n            width: 73,//批注框宽度 <br>\r\n            left: 75,//批注框距离左边工作表边缘位置 <br>\r\n            top: 22,//批注框距离上边工作表边缘位置 <br>\r\n            isshow: true,//是否显示批注<br>\r\n            value: \"jhbk\"//批注内容<br>\r\n        }\r\n        </code>\r\n        </td>\r\n        <td></td>\r\n    </tr>\r\n</table>\r\n\r\n一个规范的单元格对象如下：\r\n\r\n```json\r\n{\r\n    \"ct\": { //单元格值格式\r\n        \"fa\": \"General\",  //格式名称为自动格式\r\n        \"t\": \"n\" //格式类型为数字类型\r\n    },\r\n    \"v\": 233, //内容的原始值为 233\r\n    \"m\": 233, //内容的显示值为 233\r\n    \"bg\": \"#f6b26b\", //背景为 \"#f6b26b\"\r\n    \"ff\": 1, // 字体为 \"Arial\"\r\n    \"fc\": \"#990000\", //字体颜色为 \"#990000\"\r\n    \"bl\": 1, //字体加粗\r\n    \"it\": 1, //字体斜体\r\n    \"fs\": 9, //字体大小为 9px\r\n    \"cl\": 1, //启用删除线\r\n    \"ht\": 0, //水平居中\r\n    \"vt\": 0, //垂直居中\r\n    \"tr\": 2, //文字旋转 -45°\r\n    \"tb\": 2, //文本自动换行\r\n    \"ps\": { //批注\r\n        \"left\": 92, //批注框左边距\r\n        \"top\": 10, //批注框上边距\r\n        \"width\": 91, //批注框宽度\r\n        \"height\": 48, //批注框高度\r\n        \"value\": \"I am a comment\", //批注内容\r\n        \"isshow\": true //批注框为显示状态\r\n    },\r\n    \"f\": \"=SUM(233)\" //单元格是一个求和公式\r\n}\r\n```\r\n\r\n### 为什么会有原始值 `v` 和显示值 `m` 的区分？\r\n\r\nLuckysheet在存储数字类型的内容时，支持多种格式转换，所以需要保留原始值来做更多处理，比如同样一个数字`1`，设置成百分比格式就是`\"100%\"`，设置成两位小数数字就是`\"1.00\"`，\r\n\r\n还有一个原因是日期和时间格式的内容原始值会存储为一个数字，默认情况下，Luckysheet把`1900-1-1 0:00:00`存储为`1`，把`1900-1-1 0:00:00`以后的每一个时刻存储为该时刻与`1900-1-1 0:00:00`这个时刻的差值（以天为单位）。比如`44127`就表示`2020-10-23`这一天。\r\n\r\n以下是特殊格式的例子：\r\n\r\n百分比 `100%`\r\n```json\r\n{\r\n    \"ct\": {\r\n        \"fa\": \"0%\",\r\n        \"t\": \"n\"\r\n    },\r\n    \"v\": 1,\r\n    \"m\": \"100%\"\r\n}\r\n```\r\n\r\n小数 `1.00`\r\n```json\r\n{\r\n    \"ct\": {\r\n        \"fa\": \"##0.00\",\r\n        \"t\": \"n\"\r\n    },\r\n    \"v\": 1,\r\n    \"m\": \"1.00\"\r\n}\r\n```\r\n\r\n日期 `2020-10-23`\r\n```json\r\n{\r\n    \"ct\": {\r\n        \"fa\": \"yyyy-MM-dd\",\r\n        \"t\": \"d\"\r\n    },\r\n    \"v\": 44127,\r\n    \"m\": \"2020-10-23\"\r\n}\r\n```\r\n\r\n## 合并单元格<div id='mergeCell'></div>\r\n\r\n设置一个合并单元格，需要处理两个地方，一是单元格对象中设置`mc`属性，二是在`config`中设置`merge`。\r\n\r\n比如，将\"A1:B2\"单元格合并为一个单元格\r\n\r\n- 第一步：先设置四个单元格的参数\r\n    ```json\r\n    [\r\n        [{\r\n            \"m\": \"merge cell\",\r\n            \"ct\": {\r\n                \"fa\": \"General\",\r\n                \"t\": \"g\"\r\n            },\r\n            \"v\": \"merge cell\",\r\n            \"mc\": { //合并单元格必备属性\r\n                \"r\": 0, //主单元格的行号\r\n                \"c\": 0, //主单元格的列号\r\n                \"rs\": 2, //合并单元格占的行数\r\n                \"cs\": 2 //合并单元格占的列数\r\n            }\r\n        }, {\r\n            \"mc\": {\r\n                \"r\": 0, //主单元格的行号\r\n                \"c\": 0, //主单元格的列号\r\n            }\r\n        }],\r\n        [{\r\n            \"mc\": {\r\n                \"r\": 0, //主单元格的行号\r\n                \"c\": 0, //主单元格的列号\r\n            }\r\n        }, {\r\n            \"mc\": {\r\n                \"r\": 0, //主单元格的行号\r\n                \"c\": 0, //主单元格的列号\r\n            }\r\n        }]\r\n    ]\r\n    ```\r\n\r\n    合并单元格的关键属性是`mc`，主单元格是选区范围中左上角的单元格，包含4个属性 r/c/rs/cs ,分别表示 row/column/rowspan/columnspan，在这里，就表示从主单元格A1（row 0 column 0）开始到右边2行下方2列的单元格进行合并，选区范围中的其他单元格则只需要设置主单元格位置即可。\r\n\r\n- 第二步：再设置`config.merge`\r\n    ```json\r\n    {\r\n        \"0_0\": {\r\n            \"r\": 0,\r\n            \"c\": 0,\r\n            \"rs\": 2,\r\n            \"cs\": 2\r\n        }\r\n    }\r\n    ```\r\n    对象中的key为 `r + '_' + c` 的拼接值，value同主单元格的`mc`设置: r:行数，c:列数，rs：合并的行数，cs:合并的列数\r\n\r\n> merge 详细参考：[表格数据config](/zh/guide/data.html#config)\r\n\r\n## 含边框单元格\r\n\r\n单元格的边框设置与合并单元格类似，需要在`config`中设置`borderInfo`，区别在于不需要设置单元格对象。\r\n加入\r\n\r\n比如，将\"A1\"单元格设置一个黑色细实线的全部边框\r\n\r\n设置`config.borderInfo`为\r\n```json\r\n{\r\n    \"rangeType\": \"range\",\r\n    \"borderType\": \"border-all\",\r\n    \"color\": \"#000\",\r\n    \"style\": \"1\",\r\n    \"range\": [\r\n        {\r\n            \"row\": [ 0, 0 ],\r\n            \"column\": [0, 0]\r\n        }\r\n    ]\r\n}\r\n```\r\n而其单元格对象不需要增加设置，如下只是基础的内容和格式设置\r\n```json\r\n[\r\n    [\r\n        {\r\n            \"m\": \"borderCell\",\r\n            \"ct\": {\r\n                \"fa\": \"General\",\r\n                \"t\": \"g\"\r\n            },\r\n            \"v\": \"borderCell\"\r\n        }\r\n    ]\r\n]\r\n```\r\n\r\n> borderInfo 详细参考：[config.borderInfo](/zh/guide/sheet.html#config-borderinfo)\r\n\r\n## 简化的单元格数据\r\n\r\n特别强调的是，表格初始化的时候，采用的是`r/c/v`对象组成的一维数组格式，其中`v`的值一般是设置为单元格对象。为了节约后台的存储空间，`v`的值支持简写格式，直接写为一个字符串即可，渲染进Luckysheet后自动识别为自动格式即，`\"ct\": { \"fa\": \"General\", \"t\": \"n\" }`\r\n\r\n以下为初始化3个单元格信息，第三个单元格即为简写格式：\r\n\r\n```json\r\n[\r\n    {\r\n        \"r\": 0,\r\n        \"c\": 0,\r\n        \"v\": {\r\n            \"f\": \"=MAX(A7:A9)\",\r\n            \"ct\": {\r\n                \"fa\": \"General\",\r\n                \"t\": \"n\"\r\n            },\r\n            \"v\": 100,\r\n            \"m\": \"100\"\r\n        }\r\n    },\r\n    {\r\n        \"r\": 0,\r\n        \"c\": 1,\r\n        \"v\": {\r\n            \"f\": \"=SUM(A2)\",\r\n            \"bg\": \"#fff000\",\r\n            \"v\": 12,\r\n            \"m\": \"12\"\r\n        }\r\n    },\r\n    {\r\n        \"r\": 0,\r\n        \"c\": 2,\r\n        \"v\": \"value 2\"\r\n    }\r\n]\r\n```\r\n> 了解 [celldata的使用](/zh/guide/data.html#celldata)\r\n\r\n## 单元格值格式<div id='cellStyle'></div>\r\n\r\n值格式即为单元格对象中 `ct` 的设置，\r\n\r\n如下为自动格式的单元格\r\n\r\n```json\r\n{\r\n    \"ct\": {\r\n        \"fa\": \"General\",\r\n        \"t\": \"g\"\r\n    },\r\n    \"m\": \"2424\",\r\n    \"v\": 2424\r\n}\r\n```\r\n\r\n|参数|说明|值|\r\n| ------------ | ------------ | ------------ |\r\n|fa|Format格式的定义串| 如\"General\"|\r\n|t|Type类型|如\"g\"|\r\n\r\n\r\n### 可选择的设置如下\r\n\r\n| 格式 | ct.fa  |  ct.t   | m 值示例 |备注 |\r\n|----------|----------|-------------------------|------------------------- |------------------------- |\r\n| 自动        | General    |     g/n     | Luckysheet |自动格式，也是默认的格式；单元格内容为数字时，`m`的值为`'n'`|\r\n| 纯文本      | @    | s                         | Luckysheet ||\r\n| <br><br><br>**数字格式** | | | | |\r\n| 整数      | 0 |     n                     | 1235 | 0位小数 ||\r\n| 数字一位小数        | 0.0 | n  | 1234.6 | 点后面0的个数就代表小数位数,如果原始数字位数大,设置位数小时会做四舍五入 |\r\n| 数字两位小数      | 0.00   | n  | 1234.56 ||\r\n| 百分比整数      | 0%    | n          | 123456% |也支持 #0% 的用法|\r\n| 百分比      | 0.00%     | n          | 123456.00% |也支持 #0.00% 的用法,点后面0的个数就代表小数位数|\r\n| 科学计数    | 0.00E+00    | n        | 1.23E+03 ||\r\n| 科学计数    | ##0.0E+0    | n        | 1.2E+3 ||\r\n| 分数    | # ?/?    | n        | 1234 5/9 ||\r\n| 分数    | # ??/??    | n        | 1234 14/25 ||\r\n| 万元        | w   | n                         |12万3456||\r\n| 万元2位小数  | w0.00   | n                    |12万3456.00|| \r\n| 会计        | ¥(0.00)   | n                   ||\r\n| 更多数字格式    | #,##0   | n  | 1,235 ||\r\n| 更多数字格式    | #,##0.00   | n  | 1,234.56 ||\r\n| 更多数字格式    | `#,##0_);(#,##0)`   | n  | 1,235 ||\r\n| 更多数字格式    | `#,##0_);[Red](#,##0)`   | n  | 1,235 ||\r\n| 更多数字格式    | `#,##0.00_);(#,##0.00)`   | n  | 1,234.56 ||\r\n| 更多数字格式    | `#,##0.00_);[Red](#,##0.00)`   | n  | 1,234.56 ||\r\n| 更多数字格式    | $#,##0_);($#,##0)   | n  | $1,235 ||\r\n| 更多数字格式    | `$#,##0_);[Red]($#,##0)`   | n  | $1,235 ||\r\n| 更多数字格式    | $#,##0.00_);($#,##0.00)   | n  | $1,234.56 ||\r\n| 更多数字格式    | `$#,##0.00_);[Red]($#,##0.00)`   | n  | $1,234.56 ||\r\n| 更多数字格式    | _($* #,##0_);_(...($* \"-\"_);_(@_)   | n  | $ 1,235 ||\r\n| 更多数字格式    | _(* #,##0_);_(*..._(* \"-\"_);_(@_)   | n  | 1,235 ||\r\n| 更多数字格式    | _($* #,##0.00_);_(...($* \"-\"_);_(@_)   | n  | $ 1,234.56 ||\r\n| 更多数字格式    | _(* #,##0.00_);...* \"-\"??_);_(@_)   | n  | 1,234.56 ||\r\n| <br><br><br>**时间日期格式** | | | | |\r\n| 时间        | hh:mm AM/PM | d                 |10:23 AM||\r\n| 时间24H     | hh:mm | d                       |10:23||\r\n| 日期时间    | yyyy-MM-dd hh:mm AM/PM   | d    |2020-07-29 10:23 AM||\r\n| 日期时间24H | yyyy-MM-dd hh:mm   | d           |2020-07-29 10:23||\r\n| 日期         | yyyy-MM-dd | d                 | 1930-08-05 ||\r\n| 日期         | yyyy/MM/dd | d                 | 1930/8/5 ||\r\n| 日期         | yyyy\"年\"M\"月\"d\"日\" | d                 | 1930年8月5日 ||\r\n| 日期         | MM-dd | d                      | 08-05 ||\r\n| 日期         | M-d | d                        | 8-5 ||\r\n| 日期         | M\"月\"d\"日\" | d                 | 8月5日 ||\r\n| 日期         | h:mm:ss | d                    | 13:30:30 ||\r\n| 日期         | h:mm | d                       | 13:30 ||\r\n| 日期         | AM/PM hh:mm | d                | 下午01:30 ||\r\n| 日期         | AM/PM h:mm | d                 | 下午1:30 ||\r\n| 日期         | AM/PM h:mm:ss | d              | 下午1:30:30 ||\r\n| 日期         | MM-dd AM/PM hh:mm | d          | 下08-05 下午01:30 ||\r\n| <br><br><br>**货币格式** | | | | |\r\n| 货币:人民币        | \"¥\" 0.00 | n           | ¥ 123.00 |也支持 ¥ #.00 或者 ¥0.00|\r\n| 货币:美元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:欧元        | \"€\" 0.00 | n           | € 123.00 ||     \r\n| 货币:英镑        | \"￡\" 0.00 | n           | ￡ 123.00 ||     \r\n| 货币:港元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:日元        | \"￥\" 0.00 | n           | ￥ 123.00 ||     \r\n| 货币:阿尔巴尼亚列克        | \"Lek\" 0.00 | n           | Lek 123.00 ||     \r\n| 货币:阿尔及利亚第纳尔        | \"din\" 0.00 | n           | din 123.00 ||     \r\n| 货币:阿富汗尼        | \"Af\" 0.00 | n           | Af 123.00 ||     \r\n| 货币:阿根廷比索        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:阿拉伯联合酋长国迪拉姆        | \"dh\" 0.00 | n           | dh 123.00 ||     \r\n| 货币:阿鲁巴弗罗林        | \"Afl\" 0.00 | n           | Afl 123.00 ||     \r\n| 货币:阿曼里亚尔        | \"Rial\" 0.00 | n           | Rial 123.00 ||     \r\n| 货币:阿塞拜疆马纳特        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:埃及镑        | \"￡\" 0.00 | n           | ￡ 123.00 ||     \r\n| 货币:埃塞俄比亚比尔        | \"Birr\" 0.00 | n           | Birr 123.00 ||     \r\n| 货币:安哥拉宽扎        | \"Kz\" 0.00 | n           | Kz 123.00 ||     \r\n| 货币:澳大利亚元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:澳门元        | \"MOP\" 0.00 | n           | MOP 123.00 ||     \r\n| 货币:巴巴多斯元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:巴布亚新几内亚基那        | \"PGK\" 0.00 | n           | PGK 123.00 ||     \r\n| 货币:巴哈马元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:巴基斯坦卢比        | \"Rs\" 0.00 | n           | Rs 123.00 ||     \r\n| 货币:巴拉圭瓜拉尼        | \"Gs\" 0.00 | n           | Gs 123.00 ||     \r\n| 货币:巴林第纳尔        | \"din\" 0.00 | n           | din 123.00 ||     \r\n| 货币:巴拿马巴波亚        | \"B/\" 0.00 | n           | B/ 123.00 ||     \r\n| 货币:巴西里亚伊        | \"R$\" 0.00 | n           | R$ 123.00 ||     \r\n| 货币:白俄罗斯卢布        | \"р\" 0.00 | n           | р 123.00 ||     \r\n| 货币:百慕大元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:保加利亚列弗        | \"lev\" 0.00 | n           | lev 123.00 ||    \r\n| 货币:冰岛克朗        | \"kr\" 0.00 | n           | kr 123.00 ||     \r\n| 货币:波黑可兑换马克        | \"KM\" 0.00 | n           | KM 123.00 ||     \r\n| 货币:波兰兹罗提        | \"z?\" 0.00 | n           | z? 123.00 ||     \r\n| 货币:玻利维亚诺        | \"Bs\" 0.00 | n           | Bs 123.00 ||     \r\n| 货币:伯利兹元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:博茨瓦纳普拉        | \"P\" 0.00 | n           | P 123.00 ||     \r\n| 货币:不丹努扎姆        | \"Nu\" 0.00 | n           | Nu 123.00 ||     \r\n| 货币:布隆迪法郎        | \"FBu\" 0.00 | n           | FBu 123.00 ||     \r\n| 货币:朝鲜圆        | \"?KP\" 0.00 | n           | ?KP 123.00 ||     \r\n| 货币:丹麦克朗        | \"kr\" 0.00 | n           | kr 123.00 ||     \r\n| 货币:东加勒比元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:多米尼加比索        | \"RD$\" 0.00 | n           | RD$ 123.00 ||     \r\n| 货币:俄国卢布        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:厄立特里亚纳克法        | \"Nfk\" 0.00 | n           | Nfk 123.00 ||     \r\n| 货币:非洲金融共同体法郎        | \"CFA\" 0.00 | n           | CFA 123.00 ||     \r\n| 货币:菲律宾比索        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:斐济元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:佛得角埃斯库多        | \"CVE\" 0.00 | n           | CVE 123.00 ||     \r\n| 货币:福克兰群岛镑        | \"￡\" 0.00 | n           | ￡ 123.00 ||     \r\n| 货币:冈比亚达拉西        | \"GMD\" 0.00 | n           | GMD 123.00 ||     \r\n| 货币:刚果法郎        | \"FrCD\" 0.00 | n           | FrCD 123.00 ||     \r\n| 货币:哥伦比亚比索        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:哥斯达黎加科朗        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:古巴比索        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:古巴可兑换比索        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:圭亚那元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:哈萨克斯坦坚戈        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:海地古德        | \"HTG\" 0.00 | n           | HTG 123.00 ||     \r\n| 货币:韩元        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:荷属安的列斯盾        | \"NAf.\" 0.00 | n           | NAf. 123.00 ||     \r\n| 货币:洪都拉斯拉伦皮拉        | \"L\" 0.00 | n           | L 123.00 ||     \r\n| 货币:吉布提法郎        | \"Fdj\" 0.00 | n           | Fdj 123.00 ||     \r\n| 货币:吉尔吉斯斯坦索姆        | \"KGS\" 0.00 | n           | KGS 123.00 ||     \r\n| 货币:几内亚法郎        | \"FG\" 0.00 | n           | FG 123.00 ||     \r\n| 货币:加拿大元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:加纳塞地        | \"GHS\" 0.00 | n           | GHS 123.00 ||     \r\n| 货币:柬埔寨瑞尔        | \"Riel\" 0.00 | n           | Riel 123.00 ||     \r\n| 货币:捷克克朗        | \"K?\" 0.00 | n           | K? 123.00 ||     \r\n| 货币:津巴布韦元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:卡塔尔里亚尔        | \"Rial\" 0.00 | n           | Rial 123.00 ||     \r\n| 货币:开曼群岛元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:科摩罗法郎        | \"CF\" 0.00 | n           | CF 123.00 ||     \r\n| 货币:科威特第纳尔        | \"din\" 0.00 | n           | din 123.00 ||     \r\n| 货币:克罗地亚库纳        | \"kn\" 0.00 | n           | kn 123.00 ||     \r\n| 货币:肯尼亚先令        | \"Ksh\" 0.00 | n           | Ksh 123.00 ||     \r\n| 货币:莱索托洛蒂        | \"LSL\" 0.00 | n           | LSL 123.00 ||     \r\n| 货币:老挝基普        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:黎巴嫩镑        | \"L￡\" 0.00 | n           | L￡ 123.00 ||     \r\n| 货币:立陶宛立特        | \"Lt\" 0.00 | n           | Lt 123.00 ||     \r\n| 货币:利比亚第纳尔        | \"din\" 0.00 | n           | din 123.00 ||     \r\n| 货币:利比亚元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:卢旺达法郎        | \"RF\" 0.00 | n           | RF 123.00 ||     \r\n| 货币:罗马尼亚列伊        | \"RON\" 0.00 | n           | RON 123.00 ||     \r\n| 货币:马达加斯加阿里亚里        | \"Ar\" 0.00 | n           | Ar 123.00 ||     \r\n| 货币:马尔代夫拉菲亚        | \"Rf\" 0.00 | n           | Rf 123.00 ||     \r\n| 货币:马拉维克瓦查        | \"MWK\" 0.00 | n           | MWK 123.00 ||     \r\n| 货币:马来西亚林吉特        | \"RM\" 0.00 | n           | RM 123.00 ||     \r\n| 货币:马其顿戴第纳尔        | \"din\" 0.00 | n           | din 123.00 ||     \r\n| 货币:毛里求斯卢比        | \"MURs\" 0.00 | n           | MURs 123.00 ||     \r\n| 货币:毛里塔尼亚乌吉亚        | \"MRO\" 0.00 | n           | MRO 123.00 ||     \r\n| 货币:蒙古图格里克        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:孟加拉塔卡        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:秘鲁新索尔        | \"S/\" 0.00 | n           | S/ 123.00 ||     \r\n| 货币:缅甸开亚特        | \"K\" 0.00 | n           | K 123.00 ||     \r\n| 货币:摩尔多瓦列伊        | \"MDL\" 0.00 | n           | MDL 123.00 ||     \r\n| 货币:摩洛哥迪拉姆        | \"dh\" 0.00 | n           | dh 123.00 ||     \r\n| 货币:莫桑比克梅蒂卡尔        | \"MTn\" 0.00 | n           | MTn 123.00 ||     \r\n| 货币:墨西哥比索        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:纳米比亚元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:南非兰特        | \"R\" 0.00 | n           | R 123.00 ||     \r\n| 货币:南苏丹镑        | \"￡\" 0.00 | n           | ￡ 123.00 ||     \r\n| 货币:尼加拉瓜科多巴        | \"C$\" 0.00 | n           | C$ 123.00 ||     \r\n| 货币:尼泊尔卢比        | \"Rs\" 0.00 | n           | Rs 123.00 ||     \r\n| 货币:尼日利亚奈拉        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:挪威克朗        | \"kr\" 0.00 | n           | kr 123.00 ||     \r\n| 货币:乔治亚拉瑞        | \"GEL\" 0.00 | n           | GEL 123.00 ||     \r\n| 货币:人民币（离岸）        | \"￥\" 0.00 | n           | ￥ 123.00 ||     \r\n| 货币:瑞典克朗        | \"kr\" 0.00 | n           | kr 123.00 ||     \r\n| 货币:瑞士法郎        | \"CHF\" 0.00 | n           | CHF 123.00 ||     \r\n| 货币:塞尔维亚第纳尔        | \"din\" 0.00 | n           | din 123.00 ||     \r\n| 货币:塞拉利昂利昂        | \"SLL\" 0.00 | n           | SLL 123.00 ||     \r\n| 货币:塞舌尔卢比        | \"SCR\" 0.00 | n           | SCR 123.00 ||     \r\n| 货币:沙特里亚尔        | \"Rial\" 0.00 | n           | Rial 123.00 ||     \r\n| 货币:圣多美多布拉        | \"Db\" 0.00 | n           | Db 123.00 ||     \r\n| 货币:圣赫勒拿群岛磅        | \"￡\" 0.00 | n           | ￡ 123.00 ||     \r\n| 货币:斯里兰卡卢比        | \"Rs\" 0.00 | n           | Rs 123.00 ||     \r\n| 货币:斯威士兰里兰吉尼        | \"SZL\" 0.00 | n           | SZL 123.00 ||     \r\n| 货币:苏丹镑        | \"SDG\" 0.00 | n           | SDG 123.00 ||     \r\n| 货币:苏里南元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:所罗门群岛元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:索马里先令        | \"SOS\" 0.00 | n           | SOS 123.00 ||     \r\n| 货币:塔吉克斯坦索莫尼        | \"Som\" 0.00 | n           | Som 123.00 ||     \r\n| 货币:太平洋法郎        | \"FCFP\" 0.00 | n           | FCFP 123.00 ||     \r\n| 货币:泰国铢        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:坦桑尼亚先令        | \"TSh\" 0.00 | n           | TSh 123.00 ||     \r\n| 货币:汤加潘加        | \"T$\" 0.00 | n           | T$ 123.00 ||     \r\n| 货币:特立尼达和多巴哥元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:突尼斯第纳尔        | \"din\" 0.00 | n           | din 123.00 ||     \r\n| 货币:土耳其里拉        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:瓦努阿图瓦图        | \"VUV\" 0.00 | n           | VUV 123.00 ||     \r\n| 货币:危地马拉格查尔        | \"Q\" 0.00 | n           | Q 123.00 ||     \r\n| 货币:委内瑞拉博利瓦        | \"Bs\" 0.00 | n           | Bs 123.00 ||     \r\n| 货币:文莱元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:乌干达先令        | \"UGX\" 0.00 | n           | UGX 123.00 ||     \r\n| 货币:乌克兰格里夫尼亚        | \"грн.\" 0.00 | n           | грн. 123.00 ||     \r\n| 货币:乌拉圭比索        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:乌兹别克斯坦苏姆        | \"so?m\" 0.00 | n           | so?m 123.00 ||     \r\n| 货币:西萨摩亚塔拉        | \"WST\" 0.00 | n           | WST 123.00 ||     \r\n| 货币:新加坡元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:新台币        | \"NT$\" 0.00 | n           | NT$ 123.00 ||     \r\n| 货币:新西兰元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:匈牙利福林        | \"Ft\" 0.00 | n           | Ft 123.00 ||     \r\n| 货币:叙利亚镑        | \"￡\" 0.00 | n           | ￡ 123.00 ||     \r\n| 货币:牙买加元        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:亚美尼亚德拉姆        | \"Dram\" 0.00 | n           | Dram 123.00 ||     \r\n| 货币:也门里亚尔        | \"Rial\" 0.00 | n           | Rial 123.00 ||     \r\n| 货币:伊拉克第纳尔        | \"din\" 0.00 | n           | din 123.00 ||     \r\n| 货币:伊朗里亚尔        | \"Rial\" 0.00 | n           | Rial 123.00 ||     \r\n| 货币:以色列新谢克尔        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:印度卢比        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:印度尼西亚卢比        | \"Rp\" 0.00 | n           | Rp 123.00 ||     \r\n| 货币:约旦第纳尔        | \"din\" 0.00 | n           | din 123.00 ||     \r\n| 货币:越南盾        | \"?\" 0.00 | n           | ? 123.00 ||     \r\n| 货币:赞比亚克瓦查        | \"ZMW\" 0.00 | n           | ZMW 123.00 ||     \r\n| 货币:直布罗陀镑        | \"￡\" 0.00 | n           | ￡ 123.00 ||     \r\n| 货币:智利比索        | \"$\" 0.00 | n           | $ 123.00 ||     \r\n| 货币:中非金融合作法郎        | \"FCFA\" 0.00 | n           | FCFA 123.00 || \r\n\r\n以上配置参考了[Aspose.Cells](https://docs.aspose.com/display/cellsnet/List+of+Supported+Number+Formats#ListofSupportedNumberFormats-Aspose.Cells)\r\n"
  },
  {
    "path": "docs/zh/guide/config.md",
    "content": "# 整体配置\r\n\r\n## 基础结构\r\n\r\n初始化表格时，可以设置一个对象配置串`options`来自定义配置Luckysheet表格。\r\n\r\n如下是一个简洁的配置案例：\r\n\r\n```js\r\n// 配置项\r\nconst options = {\r\n    container: 'luckysheet', // 设定DOM容器的id\r\n    title: 'Luckysheet Demo', // 设定表格名称\r\n    lang: 'zh' // 设定表格语言\r\n\r\n    // 更多其他设置...\r\n}\r\n\r\n// 初始化表格\r\nluckysheet.create(options)\r\n```\r\n\r\n这里的`options`配置项会作用于整个表格，特别的，单个sheet的配置则需要在`options.data`数组中，分别设置对应更详细的参数，参考[工作表配置](/zh/guide/sheet.html)\r\n\r\n针对个性化的需求，除了允许配置信息栏（[showinfobar](#showinfobar)）、工具栏（[showtoolbar](#showtoolbar)）、底部sheet页（[showsheetbar](#showsheetbar)）、底部计数栏（[showstatisticBar](#showstatisticBar)）之外，\r\nLuckysheet开放了更细致的自定义配置选项，分别有\r\n\r\n- 自定义工具栏（[showtoolbarConfig](#showtoolbarConfig)）\r\n- 自定义底部sheet页（[showsheetbarConfig](#showsheetbarConfig)）\r\n- 自定义计数栏（[showstatisticBarConfig](#showstatisticBarConfig)）\r\n- 自定义单元格右键菜单（[cellRightClickConfig](#cellRightClickConfig)）\r\n- 自定义底部sheet页右击菜单（[sheetRightClickConfig](#sheetRightClickConfig)）\r\n\r\n\r\n## 配置项\r\n\r\n以下为所有支持的设置参数\r\n\r\n- 容器ID [container](#container)\r\n- 工作簿名称 [title](#title)\r\n- 语言 [lang](#lang)\r\n- 唯一key [gridKey](#gridKey)\r\n- 加载整个工作簿 [loadUrl](#loadUrl)\r\n- 加载其它页celldata [loadSheetUrl](#loadSheetUrl)\r\n- 允许更新 [allowUpdate](#allowUpdate)\r\n- 更新地址 [updateUrl](#updateUrl)\r\n- 缩略图更新地址 [updateImageUrl](#updateImageUrl)\r\n- 工作表配置 [data](#data)\r\n- 插件 [plugins](#plugins)\r\n- 列数 [column](#column)\r\n- 行数 [row](#row)\r\n- 亿万格式 [autoFormatw](#autoFormatw)\r\n- 精度 [accuracy](#accuracy)\r\n- 允许复制 [allowCopy](#allowCopy)\r\n- 工具栏 [showtoolbar](#showtoolbar)\r\n- 自定义工具栏[showtoolbarConfig](#showtoolbarConfig)\r\n- 信息栏 [showinfobar](#showinfobar)\r\n- 底部sheet页 [showsheetbar](#showsheetbar)\r\n- 自定义底部sheet页 [showsheetbarConfig](#showsheetbarConfig)\r\n- 底部计数栏 [showstatisticBar](#showstatisticBar)\r\n- 自定义计数栏 [showstatisticBarConfig](#showstatisticBarConfig)\r\n- 允许添加行 [enableAddRow](#enableAddRow)\r\n- 默认添加行的数目 [addRowCount](#addRowCount)\r\n- 允许回到顶部 [enableAddBackTop](#enableAddBackTop)\r\n- 用户信息 [userInfo](#userInfo)\r\n- 用户信息菜单 [userMenuItem](#userMenuItem)\r\n- 返回按钮链接 [myFolderUrl](#myFolderUrl)\r\n- 比例 [devicePixelRatio](#devicePixelRatio)\r\n- 功能按钮 [functionButton](#functionButton)\r\n- 自动缩进界面 [showConfigWindowResize](#showConfigWindowResize)\r\n- 刷新公式 [forceCalculation](#forceCalculation)\r\n- 自定义单元格右键菜单 [cellRightClickConfig](#cellRightClickConfig)\r\n- 自定义sheet页右击菜单 [sheetRightClickConfig](#sheetRightClickConfig)\r\n- 行标题区域的宽度 [rowHeaderWidth](#rowHeaderWidth)\r\n- 列标题区域的高度 [columnHeaderHeight](#columnHeaderHeight)\r\n- 是否显示公式栏 [sheetFormulaBar](#sheetFormulaBar)\r\n- 初始化默认字体大小 [defaultFontSize](#defaultFontSize)\r\n- 是否限制工作表名长度 [limitSheetNameLength](#limitSheetNameLength)\r\n- 默认允许工作表名的最大长度 [defaultSheetNameMaxLength](#defaultSheetNameMaxLength)\r\n- 分页器 [pager](#pager)\r\n- 自定义图片上传 [uploadImage](#uploadImage)\r\n- 自定义图片地址处理 [imageUrlHandle](#imageUrlHandle)\r\n\r\n### container\r\n- 类型：String\r\n- 默认值：\"luckysheet\"\r\n- 作用：容器的ID\r\n  \r\n------------\r\n### title\r\n- 类型：String\r\n- 默认值：\"Luckysheet Demo\"\r\n- 作用：工作簿名称\r\n\r\n------------\r\n### lang\r\n- 类型：String\r\n- 默认值：\"en\"\r\n- 作用：国际化设置，允许设置表格的语言，支持简体中文(\"zh\")、英文(\"en\")、繁体中文(\"zh_tw\")和西班牙文(\"es\")\r\n\r\n------------\r\n### gridKey\r\n- 类型：String\r\n- 默认值：\"\"\r\n- 作用：表格唯一标识符\r\n\r\n------------\r\n### loadUrl\r\n- 类型：String\r\n- 默认值：\"\"\r\n- 作用：配置`loadUrl`接口地址，加载所有工作表的配置，并包含当前页单元格数据，与`loadSheetUrl`配合使用。参数为`gridKey`（表格主键）。\r\n\r\n\t源码的请求写法是：\r\n\t```js\r\n\t$.post(loadurl, {\"gridKey\" : server.gridKey}, function (d) {})\r\n\t```\r\n\t> 参见源码 [`src/core.js`](https://github.com/mengshukeji/Luckysheet/blob/master/src/core.js)\r\n\r\n\tLuckysheet会通过ajax请求（POST）整个表格的数据，默认载入status为1的sheet数据中的`celldata`，其余的sheet载入除`celldata`字段外的所有配置字段。特别是在数据量大的时候，`loadUrl`只负责当前页单元格数据，配置`loadSheetUrl`作为其它工作表异步加载单元格数据的接口，可以提高性能。\r\n\t\r\n\t一个合格的接口返回的json字符串数据为：\r\n\r\n\t```js\r\n\t\"[\t\r\n\t\t//status为1的sheet页，重点是需要提供初始化的数据celldata\r\n\t\t{\r\n\t\t\t\"name\": \"Cell\",\r\n\t\t\t\"index\": \"sheet_01\",\r\n\t\t\t\"order\":  0,\r\n\t\t\t\"status\": 1,\r\n\t\t\t\"celldata\": [{\"r\":0,\"c\":0,\"v\":{\"v\":1,\"m\":\"1\",\"ct\":{\"fa\":\"General\",\"t\":\"n\"}}}]\r\n\t\t},\r\n\t\t//其他status为0的sheet页，无需提供celldata，只需要配置项即可\r\n\t\t{\r\n\t\t\t\"name\": \"Data\",\r\n\t\t\t\"index\": \"sheet_02\",\r\n\t\t\t\"order\":  1,\r\n\t\t\t\"status\": 0\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"name\": \"Picture\",\r\n\t\t\t\"index\": \"sheet_03\",\r\n\t\t\t\"order\":  2,\r\n\t\t\t\"status\": 0\r\n\t\t}\r\n\t]\"\r\n\t```\r\n\t有几个注意点\r\n\t+ 这是一个字符串，类似于JSON.stringify()处理后的json数据，压缩后的数据便于传输\r\n\t+ loadUrl是一个post请求，也是为了支持大数据量\r\n\t+ 考虑到一些公式、图表及数据透视表会引用其他sheet的数据，所以前台会加一个判断，如果该当前sheet引用了其他sheet的数据则会通过`loadSheetUrl`配置的接口地址请求数据，把引用到的sheet的数据一并补全，而不用等切换到其它页的时候再请求\r\n\t+ 当数据量小的时候，也可以不用Luckysheet提供的此接口，直接使用[data](#data)参数可以提前准备好所有表格数据用于初始化\r\n\r\n------------\r\n### loadSheetUrl\r\n- 类型：String\r\n- 默认值：\"\"\r\n- 作用：配置`loadSheetUrl`接口地址，用于异步加载其它单元格数据。参数为`gridKey`（表格主键） 和 `index`（sheet主键合集，格式为`[\"sheet_01\",\"sheet_02\",\"sheet_03\"]`）。\r\n\r\n\t源码的请求写法是：\r\n\t```js\r\n\t$.post(loadSheetUrl, {\"gridKey\" : server.gridKey, \"index\": sheetindex.join(\",\")}, function (d) {})\r\n\t```\r\n\t> 参见源码 [`src/controllers/sheetmanage.js`](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/sheetmanage.js)\r\n\r\n\t返回的数据为sheet的`celldata`字段数据集合。\r\n\r\n\t一个合格的接口返回的json字符串数据为：\r\n\r\n\t```js\r\n\t\"{\r\n\t\t\"sheet_01\": [\r\n\t\t\t{\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 0,\r\n\t\t\t\t\"v\": { \"v\": 1, \"m\": \"1\", \"ct\": { \"fa\": \"General\", \"t\": \"n\" } }\r\n\t\t\t}\r\n\t\t],\r\n\t\t\"sheet_02\": [\r\n\t\t\t{\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 0,\r\n\t\t\t\t\"v\": { \"v\": 1, \"m\": \"1\", \"ct\": { \"fa\": \"General\", \"t\": \"n\" } }\r\n\t\t\t}\r\n\t\t],\r\n\t\t\"sheet_03\": [\r\n\t\t\t{\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 0,\r\n\t\t\t\t\"v\": { \"v\": 1, \"m\": \"1\", \"ct\": { \"fa\": \"General\", \"t\": \"n\" } }\r\n\t\t\t}\r\n\t\t]\r\n\t}\"\r\n\t```\r\n\t同`loadUrl`类似，`loadSheetUrl`也要注意这几点：\r\n\t+ 这是一个字符串格式数据\r\n\t+ 这是一个post请求\r\n\t+ 这个接口会在两种情况下自动调用，一是在`loadUrl`加载的当前页数据时发现当前工作表引用了其他工作表，二是切换到一个未曾加载过数据的工作表时\r\n\r\n------------\r\n### allowUpdate\r\n- 类型：Boolean\r\n- 默认值：false\r\n- 作用：是否允许操作表格后的后台更新，与`updateUrl`配合使用。如果要开启共享编辑，此参数必须设置为`true`。\r\n\r\n------------\r\n### updateUrl\r\n- 类型：String\r\n- 默认值：\"\"\r\n- 作用：操作表格后，实时保存数据的websocket地址，此接口也是共享编辑的接口地址。\r\n\t\r\n\t有个注意点，要想开启共享编辑，必须满足以下3个条件：\r\n\t+ `allowUpdate`为`true`\r\n\t+ 配置了`loadUrl`\r\n\t+ 配置了`updateUrl`\r\n\r\n\t注意，发送给后端的数据默认是经过pako压缩过后的。后台拿到数据需要先解压。\r\n\r\n\t通过共享编辑功能，可以实现Luckysheet实时保存数据和多人同步数据，每一次操作都会发送不同的参数到后台，具体的操作类型和参数参见[表格操作](/zh/guide/operate.html)\r\n\r\n------------\r\n### updateImageUrl\r\n- 类型：String\r\n- 默认值：\"\"\r\n- 作用：缩略图的更新地址\r\n\r\n------------\r\n### data\r\n- 类型：Array\r\n- 默认值：[{ \"name\": \"Sheet1\", color: \"\", \"status\": \"1\", \"order\": \"0\", \"data\": [], \"config\": {}, \"index\":0 }, { \"name\": \"Sheet2\", color: \"\", \"status\": \"0\", \"order\": \"1\", \"data\": [], \"config\": {}, \"index\":1  }, { \"name\": \"Sheet3\", color: \"\", \"status\": \"0\", \"order\": \"2\", \"data\": [], \"config\": {}, \"index\":2  }]\r\n- 作用：当未配置`loadUrl`和`loadSheetUrl`的时候，需要手动配置传入整个客户端所有sheet数据`[shee1, sheet2, sheet3]`，详细参数设置参见[工作表配置](/zh/guide/sheet.html)\r\n\r\n------------\r\n### plugins\r\n- 类型：Array\r\n- 默认值：[]\r\n- 作用：配置插件，支持图表：\"chart\"\r\n\r\n------------\r\n### column\r\n- 类型：Number\r\n- 默认值：60\r\n- 作用：空表格默认的列数量\r\n\r\n------------\r\n### row\r\n- 类型：Number\r\n- 默认值：84\r\n- 作用：空表格默认的行数据量\r\n\r\n------------\r\n### autoFormatw\r\n- 类型：Boolean\r\n- 默认值：false\r\n- 作用：自动格式化超过4位数的数字为‘亿万格式’，例：true or \"true\" or \"TRUE\"\r\n\r\n------------\r\n### accuracy\r\n- 类型：Number\r\n- 默认值：undefined\r\n- 作用：设置精度，小数点后的位数。传参数为数字或数字字符串，例： \"0\" 或 0\r\n\r\n------------\r\n### allowCopy\r\n- 类型：Boolean\r\n- 默认值：true\r\n- 作用：是否允许拷贝\r\n\r\n------------\r\n### showtoolbar\r\n- 类型：Boolean\r\n- 默认值：true\r\n- 作用：是否显示工具栏\r\n\r\n------------\r\n### showtoolbarConfig\r\n\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用：自定义配置工具栏，可以与showtoolbar配合使用，`showtoolbarConfig`拥有更高的优先级。\r\n- 格式1：\r\n    ```json\r\n    {\r\n        undoRedo: false, //撤销重做，注意撤消重做是两个按钮，由这一个配置决定显示还是隐藏\r\n        paintFormat: false, //格式刷\r\n        currencyFormat: false, //货币格式\r\n        percentageFormat: false, //百分比格式\r\n        numberDecrease: false, // '减少小数位数'\r\n        numberIncrease: false, // '增加小数位数\r\n        moreFormats: false, // '更多格式'\r\n        font: false, // '字体'\r\n        fontSize: false, // '字号大小'\r\n        bold: false, // '粗体 (Ctrl+B)'\r\n        italic: false, // '斜体 (Ctrl+I)'\r\n\t\tstrikethrough: false, // '删除线 (Alt+Shift+5)'\r\n\t\tunderline: false, // '下划线 (Alt+Shift+6)'\r\n        textColor: false, // '文本颜色'\r\n        fillColor: false, // '单元格颜色'\r\n        border: false, // '边框'\r\n        mergeCell: false, // '合并单元格'\r\n        horizontalAlignMode: false, // '水平对齐方式'\r\n        verticalAlignMode: false, // '垂直对齐方式'\r\n        textWrapMode: false, // '换行方式'\r\n        textRotateMode: false, // '文本旋转方式'\r\n\t\timage:false, // '插入图片'\r\n\t\tlink:false, // '插入链接'\r\n        chart: false, // '图表'（图标隐藏，但是如果配置了chart插件，右击仍然可以新建图表）\r\n        postil:  false, //'批注'\r\n        pivotTable: false,  //'数据透视表'\r\n        function: false, // '公式'\r\n        frozenMode: false, // '冻结方式'\r\n        sortAndFilter: false, // '排序和筛选'\r\n        conditionalFormat: false, // '条件格式'\r\n\t\tdataVerification: false, // '数据验证'\r\n        splitColumn: false, // '分列'\r\n        screenshot: false, // '截图'\r\n        findAndReplace: false, // '查找替换'\r\n\t\tprotection:false, // '工作表保护'\r\n\t\tprint:false, // '打印'\r\n    }\r\n    ```\r\n- 示例1：\r\n\t- 仅显示撤消重做和字体按钮：\r\n\t\t\r\n\t\t```js\r\n\t\t\t//options\r\n\t\t\t{\r\n\t\t\t\tshowtoolbar: false,\r\n\t\t\t\tshowtoolbarConfig:{\r\n\t\t\t\t\tundoRedo: true,\r\n\t\t\t\t\tfont: true,\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t```\r\n\t- 仅隐藏图片和打印按钮：\r\n\t\t\r\n\t\t```js\r\n\t\t\t//options\r\n\t\t\t{\r\n\t\t\t\tshowtoolbar: true, // 默认就是true，可以不设置\r\n\t\t\t\tshowtoolbarConfig:{\r\n\t\t\t\t\timage: false,\r\n\t\t\t\t\tprint: false,\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t```\r\n- 格式2：\r\n    对象格式可以很方便控制显示隐藏，使用数组形式可轻松控制按钮顺序和位置， 以下为工具栏按钮和分隔符的默认配置。\r\n    ```json\r\n\t[   \r\n\t\t\"undo\", \"redo\", \"paintFormat\", \"|\", \r\n\t\t\"currencyFormat\", \"percentageFormat\", \"numberDecrease\", \"numberIncrease\", \"moreFormats\", \"|\", \r\n\t\t\"font\", \"|\", \r\n\t\t\"fontSize\", \"|\", \r\n\t\t\"bold\", \"italic\", \"strikethrough\", \"underline\", \"textColor\", \"|\", \r\n\t\t\"fillColor\", \"border\", \"mergeCell\", \"|\", \r\n\t\t\"horizontalAlignMode\", \"verticalAlignMode\", \"textWrapMode\", \"textRotateMode\", \"|\", \r\n\t\t\"image\", \"link\", \"chart\", \"postil\", \"pivotTable\", \"|\", \r\n\t\t\"function\", \"frozenMode\", \"sortAndFilter\", \"conditionalFormat\", \"dataVerification\", \"splitColumn\", \"screenshot\", \"findAndReplace\", \"protection\", \"print\"\r\n\t]\r\n\t```\r\n- 示例2： \r\n\t- 自定义按钮和位置， 保护放到最前面， 只要字体样式相关按钮。\r\n\t    ```json\r\n\t\t{\r\n\t\t\t\"showtoolbarConfig\": [\r\n\t\t\t\t\"protection\", \"|\", \r\n\t\t\t\t\"font\", \"|\", \r\n\t\t\t\t\"fontSize\", \"|\", \r\n\t\t\t\t\"bold\", \"italic\", \"strikethrough\", \"underline\", \"textColor\"\r\n\t\t\t]\r\n\t\t}\r\n\t\t```\r\n------------\r\n### showinfobar\r\n- 类型：Boolean\r\n- 默认值：true\r\n- 作用：是否显示顶部信息栏\r\n\r\n------------\r\n### showsheetbar\r\n- 类型：Boolean\r\n- 默认值：true\r\n- 作用：是否显示底部sheet页按钮\r\n\r\n------------\r\n### showsheetbarConfig\r\n\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用：自定义配置底部sheet页按钮，可以与showsheetbar配合使用，`showsheetbarConfig`拥有更高的优先级。\r\n- 格式：\r\n    ```json\r\n    {\r\n        add: false, //新增sheet  \r\n        menu: false, //sheet管理菜单\r\n        sheet: false //sheet页显示\r\n    }\r\n    ```\r\n- 示例：\r\n\t- 仅显示新增sheet按钮：\r\n\t\t\r\n\t\t```js\r\n\t\t\t//options\r\n\t\t\t{\r\n\t\t\t\tshowsheetbar: false,\r\n\t\t\t\tshowsheetbarConfig:{\r\n\t\t\t\t\tadd: true,\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t```\r\n\t- 仅隐藏新增sheet和管理按钮：\r\n\t\t\r\n\t\t```js\r\n\t\t\t//options\r\n\t\t\t{\r\n\t\t\t\tshowsheetbar: true, // 默认就是true，可以不设置\r\n\t\t\t\tshowsheetbarConfig:{\r\n\t\t\t\t\tadd: false,\r\n\t\t\t\t\tmenu: false,\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t```\r\n\r\n------------\r\n### showstatisticBar\r\n- 类型：Boolean\r\n- 默认值：true\r\n- 作用：是否显示底部计数栏\r\n\r\n------------\r\n### showstatisticBarConfig\r\n\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用：自定义配置底部计数栏，可以与showstatisticBar配合使用，`showstatisticBarConfig`拥有更高的优先级。\r\n- 格式：\r\n    ```json\r\n    {\r\n        count: false, // 计数栏\r\n\t\tview: false, // 打印视图\r\n        zoom: false, // 缩放\r\n    }\r\n\t```\r\n- 示例：\r\n\t- 仅显示缩放按钮：\r\n\t\t\r\n\t\t```js\r\n\t\t\t//options\r\n\t\t\t{\r\n\t\t\t\tshowstatisticBar: false,\r\n\t\t\t\tshowstatisticBarConfig:{\r\n\t\t\t\t\tzoom: true,\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t```\r\n\t- 仅隐藏打印视图按钮：\r\n\t\t\r\n\t\t```js\r\n\t\t\t//options\r\n\t\t\t{\r\n\t\t\t\tshowstatisticBar: true, // 默认就是true，可以不设置\r\n\t\t\t\tshowstatisticBarConfig:{\r\n\t\t\t\t\tview: false,\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t```\r\n\r\n------------\r\n### enableAddRow\r\n- 类型：Boolean\r\n- 默认值：true\r\n- 作用：允许添加行\r\n\r\n### addRowCount\r\n- Number\r\n- 默认值：100\r\n- 作用：配置新增行处默认新增的行数目\r\n\r\n------------\r\n### enableAddBackTop\r\n- 类型：Boolean\r\n- 默认值：true\r\n- 作用：允许回到顶部\r\n\r\n------------\r\n### userInfo\r\n- 类型：String | Boolean | Object\r\n- 默认值：false\r\n- 作用：右上角的用户信息展示样式，支持以下三种形式\r\n\t1. HTML模板字符串，如：\r\n\t\r\n\t```js\r\n\toptions:{\r\n\t\t// 其他配置\r\n\t\tuserInfo:'<i style=\"font-size:16px;color:#ff6a00;\" class=\"fa fa-taxi\" aria-hidden=\"true\"></i> Lucky',\r\n\t}\r\n\t```\r\n\r\n\t或者一个普通字符串，如：\r\n\t\r\n\t```js\r\n\toptions:{\r\n\t\t// 其他配置\r\n\t\tuserInfo:'Lucky',\r\n\t}\r\n\t```\r\n \r\n\t2. Boolean类型，如：\r\n   \t\r\n\t`false`:不展示\r\n\t```js\r\n\toptions:{\r\n\t\t// 其他配置\r\n\t\tuserInfo:false, // 不展示用户信息\r\n\t}\r\n\r\n\t```\r\n\t`true`:展示默认的字符串\r\n\t```js\r\n\toptions:{\r\n\t\t// 其他配置\r\n\t\tuserInfo:true, // 展示HTML:'<i style=\"font-size:16px;color:#ff6a00;\" class=\"fa fa-taxi\" aria-hidden=\"true\"></i> Lucky'\r\n\t}\r\n\r\n\t```\r\n\t3. 对象格式，设置 `userImage`：用户头像地址 和 `userName`：用户名，如：\r\n\t```js\r\n\toptions:{\r\n\t\t// 其他配置\r\n\t\tuserInfo: {\r\n\t\t\tuserImage:'https://cdn.jsdelivr.net/npm/luckyresources@1.0.3/assets/img/logo/logo.png', // 头像url\r\n\t\t\tuserName:'Lucky' // 用户名\r\n\t\t}\r\n\t}\r\n\t```\r\n\r\n\t4. 注意，设置为`undefined`或者不设置，同设置`false`\r\n\r\n------------\r\n### userMenuItem\r\n- 类型：Array\r\n- 默认值：`[{url:\"www.baidu.com\", \"icon\":'<i class=\"fa fa-folder\" aria-hidden=\"true\"></i>', \"name\":\"我的表格\"}, {url:\"www.baidu.com\", \"icon\":'<i class=\"fa fa-sign-out\" aria-hidden=\"true\"></i>', \"name\":\"退出登陆\"}]`\r\n- 作用：点击右上角的用户信息弹出的菜单\r\n\r\n------------\r\n### myFolderUrl\r\n- 类型：String\r\n- 默认值：\"www.baidu.com\"\r\n- 作用：左上角<返回按钮的链接\r\n\r\n------------\r\n### devicePixelRatio\r\n- 类型：Number\r\n- 默认值：window.devicePixelRatio\r\n- 作用：设备比例，比例越大表格分辨率越高\r\n\r\n------------\r\n### functionButton\r\n- 类型：String\r\n- 默认值：\"\"\r\n- 作用：右上角功能按钮，例如`'<button id=\"\" class=\"btn btn-primary\" style=\"padding:3px 6px;font-size: 12px;margin-right: 10px;\">下载</button>    <button id=\"\" class=\"btn btn-primary btn-danger\" style=\"    padding:3px 6px;    font-size: 12px;    margin-right: 10px;\">分享</button>    <button id=\"luckysheet-share-btn-title\" class=\"btn btn-primary btn-danger\" style=\"    padding:3px 6px;    font-size: 12px;    margin-right: 10px;\">秀数据</button>'`\r\n\r\n------------\r\n### showConfigWindowResize\r\n- 类型：Boolean\r\n- 默认值：true\r\n- 作用：图表或数据透视表的配置会在右侧弹出，设置弹出后表格是否会自动缩进\r\n\r\n------------\r\n### forceCalculation\r\n- 类型：Boolean\r\n- 默认值：false\r\n- 作用：强制刷新公式。\r\n\r\n    默认情况下，为提高加载性能，表格初始化的时候，含有公式的单元格会默认直接取得`v`和`m`作为数据结果，而不做实时计算。\r\n    \r\n    如果公式关联到的单元格数据已经变化，或者公式所在的单元格数据结果改变了，则会导致关联单元格应该计算得出的结果和实际显示结果不一致，这是就需要开启公式刷新，保证数据实时计算的准确性。\r\n    \r\n    ⚠️提醒，公式较多时会有性能问题，慎用！\r\n\r\n------------\r\n### cellRightClickConfig\r\n\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用：自定义配置单元格右击菜单\r\n- 格式：\r\n    ```json\r\n    {\r\n        copy: false, // 复制\r\n        copyAs: false, // 复制为\r\n        paste: false, // 粘贴\r\n        insertRow: false, // 插入行\r\n        insertColumn: false, // 插入列\r\n        deleteRow: false, // 删除选中行\r\n        deleteColumn: false, // 删除选中列\r\n        deleteCell: false, // 删除单元格\r\n        hideRow: false, // 隐藏选中行和显示选中行\r\n        hideColumn: false, // 隐藏选中列和显示选中列\r\n        rowHeight: false, // 行高\r\n        columnWidth: false, // 列宽\r\n        clear: false, // 清除内容\r\n        matrix: false, // 矩阵操作选区\r\n        sort: false, // 排序选区\r\n        filter: false, // 筛选选区\r\n        chart: false, // 图表生成\r\n        image: false, // 插入图片\r\n        link: false, // 插入链接\r\n        data: false, // 数据验证\r\n\t\tcellFormat: false // 设置单元格格式\r\n    }\r\n\t```\r\n\t除了单元格，这里的配置还包括行标题右击菜单、列标题右击菜单和列标题下拉箭头的菜单，具体配置关系如下表格：\r\n\t\r\n\t|右击菜单配置|单元格|行标题|列标题|列箭头|\r\n    | ------------ | ------------ | ------------ | ------------ | ------------ |\r\n    |copy|复制|复制|复制|复制|\r\n    |copyAs|复制为|复制为|复制为|复制为|\r\n    |paste|粘贴|粘贴|粘贴|粘贴|\r\n    |insertRow|插入行|向上增加N行，向下增加N行|-|-|\r\n    |insertColumn|插入列|-|向左增加N列，向右增加N列|向左增加N列，向右增加N列|\r\n    |deleteRow|删除选中行|删除选中行|-|-|\r\n    |deleteColumn|删除选中列|-|删除选中列|删除选中列|\r\n    |deleteCell|删除单元格|-|-|-|\r\n    |hideRow|-|隐藏选中行和显示选中行|-|-|\r\n    |hideColumn|-|-|隐藏选中列和显示选中列|隐藏选中列和显示选中列|\r\n    |rowHeight|-|行高|-|-|\r\n    |columnWidth|-|-|列宽|列宽|\r\n    |clear|清除内容|清除内容|清除内容|-|\r\n    |matrix|矩阵操作选区|矩阵操作选区|矩阵操作选区|-|\r\n    |sort|排序选区|排序选区|排序选区|A-Z排序和Z-A排序|\r\n    |filter|筛选选区|筛选选区|筛选选区|-|\r\n    |chart|图表生成|图表生成|图表生成|-|\r\n    |image|插入图片|插入图片|插入图片|-|\r\n    |link|插入链接|插入链接|插入链接|-|\r\n    |data|数据验证|数据验证|数据验证|-|\r\n    |cellFormat|设置单元格格式|设置单元格格式|设置单元格格式|-|\r\n\r\n\r\n------------\r\n### sheetRightClickConfig\r\n\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用：自定义配置sheet页右击菜单\r\n- 格式：\r\n    ```json\r\n    {   \r\n        delete: false, // 删除\r\n        copy: false, // 复制\r\n        rename: false, //重命名\r\n        color: false, //更改颜色\r\n        hide: false, //隐藏，取消隐藏\r\n        move: false, //向左移，向右移\r\n    }\r\n\r\n------------\r\n### rowHeaderWidth\r\n\r\n- 类型：Number\r\n- 默认值：46\r\n- 作用：行标题区域的宽度，如果设置为0，则表示隐藏行标题\r\n\r\n------------\r\n### columnHeaderHeight\r\n\r\n- 类型：Number\r\n- 默认值：20\r\n- 作用：列标题区域的高度，如果设置为0，则表示隐藏列标题\r\n\r\n------------\r\n### sheetFormulaBar\r\n\r\n- 类型：Boolean\r\n- 默认值：true\r\n- 作用：是否显示公式栏\r\n\r\n------------\r\n### defaultFontSize\r\n- 类型：Number\r\n- 默认值：11\r\n- 作用：初始化默认字体大小\r\n\r\n------------\r\n\r\n### limitSheetNameLength\r\n- 类型：Boolean\r\n- 默认值：true\r\n- 作用：工作表重命名等场景下是否限制工作表名称的长度\r\n\r\n------------\r\n\r\n### defaultSheetNameMaxLength\r\n- 类型：Number\r\n- 默认值：31\r\n- 作用：默认允许的工作表名最大长度\r\n\r\n------------\r\n\r\n### pager\r\n- 类型：Object\r\n- 默认值：null\r\n- 作用：分页器按钮设置，初版方案是直接使用的jquery插件 [sPage](https://github.com/jvbei/sPage)\r\n\t点击分页按钮会触发钩子函数 `onTogglePager`，返回当前页码，同`sPage`的`backFun`方法，此分页器设置只负责UI部分，具体切换分页后的数据请求和数据渲染，请在`onTogglePager`钩子行数里自定义处理。\r\n\t```js\r\n\tpager: {\r\n\t\tpageIndex: 1, //当前页码，必填\r\n\t\ttotal: 100, //数据总条数，必填\r\n\t\tselectOption: [10, 20, 30], // 选择每页的行数，\r\n\t\tpageSize: 10, //每页显示多少条数据，默认10条\r\n\t\tshowTotal: false, // 是否显示总数，默认关闭：false\r\n\t\tshowSkip: false, //是否显示跳页，默认关闭：false\r\n\t\tshowPN: false, //是否显示上下翻页，默认开启：true\r\n\t\tprevPage: '', //上翻页文字描述，默认\"上一页\"\r\n\t\tnextPage: '', //下翻页文字描述，默认\"下一页\"\r\n\t\ttotalTxt: '', // 数据总条数文字描述，默认\"总共：{total}\"\r\n\t}\r\n\t```\r\n\r\n### uploadImage\r\n\r\n用于自定义图片的上传，默认情况下，插入的图片是以base64的形式放入sheet数据中，如果需要单独上传图片，仅在sheet中引用图片地址可使用此配置。\r\n\r\n- 类型： `function (file) => Promise(imgUrl)`，接受file对象，返回Promise，值为上传完成的图片url\r\n- 默认值： `undefined`\r\n\r\n:::details 查看示例配置\r\n\r\n```js\r\n{\r\n    uploadImage: function (file) {\r\n        return new Promise(function (resolve, reject) {\r\n            var xhr = new XMLHttpRequest();\r\n            xhr.open('POST', 'http://192.168.210.159/miniuiServer/imageUploader.php');\r\n\r\n\t\t\t// 额外的请求头\r\n            var headers = {};\r\n            if (headers) {\r\n                Object.keys(headers).forEach(function (k) {\r\n                    xhr.setRequestHeader(k, headers[k]);\r\n                });\r\n            }\r\n            var data = new FormData();\r\n\t\t\t// 要上传的图片文件\r\n            data.append('file', file, file.name || '');\r\n\r\n            xhr.send(data);\r\n            xhr.onreadystatechange = function () {\r\n                if (xhr.readyState === 4) {\r\n                    if (xhr.status === 200) {\r\n                        var res = JSON.parse(xhr.responseText);\r\n                        var url = res.downloadUrl;\r\n                        if (url) {\r\n                            resolve(url); // 给上传的后的地址\r\n                        } else {\r\n                            reject('image upload error');\r\n                        }\r\n                    } else {\r\n                        reject('image upload error');\r\n                    }\r\n                }\r\n            };\r\n        });\r\n    }\r\n}\r\n\r\n```\r\n\r\n:::\r\n\r\n### imageUrlHandle\r\n\r\n图片上传的路径处理函数，和 [uploadImage](#uploadImage) 相关，一般只有使用自定义图片上传才需要此配置。\r\n\r\n- 类型： `function (string) => string`，接受原始路径，返回新路径\r\n- 默认值： `undefined`\r\n- 作用，处理图片显示时的路径。  \r\n  如上传返回地址为接口地址，如： `rest/attach/[fileguid]`， 则需要处理为 `http://localhost:8080/xxx/rest/attach/[fileguid]` 才能显示，但将前面域名信息写入数据，后续使用可能会有问题，因此可使用此方法处理路径，全路径仅在展示使用，数据内仅存储 `rest/attach/[fileguid]`\r\n\r\n```js\r\n{\r\n    // 处理上传图片的地址\r\n    imageUrlHandle: function (url) {\r\n        // 已经是 // http data 开头则不处理 \r\n        if (/^(?:\\/\\/|(?:http|https|data):)/i.test(url)) {\r\n            return url;\r\n        }\r\n        return location.origin + url;\r\n    }\r\n}\r\n```\r\n\r\n------------\r\n\r\n## 钩子函数\r\n\r\n钩子函数应用于二次开发时，会在各个常用鼠标或者键盘操作时植入钩子，调用开发者传入的函数，起到扩展Luckysheet功能的作用。\r\n\r\n钩子函数统一配置在`options.hook`下，可以分别针对单元格、sheet页、表格创建配置hook。\r\n\r\n> 使用案例可参考源码 [src/index.html](https://github.com/mengshukeji/Luckysheet/blob/master/src/index.html)\r\n\r\n## 单元格\r\n\r\n### cellEditBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：进入单元格编辑模式之前触发。在选中了某个单元格且在非编辑状态下，通常有以下三种常规方法触发进入编辑模式\r\n\t   \r\n  - 双击单元格\r\n  - 敲Enter键\r\n  - 使用API：enterEditMode \r\n\r\n- 参数：\r\n\t- {Array} [range]: 当前选区范围\r\n\r\n------------\r\n### cellUpdateBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：更新这个单元格值之前触发，`return false` 则不执行后续的更新。在编辑状态下修改了单元格之后，退出编辑模式并进行数据更新之前触发这个钩子。\r\n- 参数：\r\n\t- {Number} [r]: 单元格所在行数\r\n\t- {Number} [c]: 单元格所在列数\r\n\t- {Object | String | Number} [value]: 要修改的单元格内容\r\n\t- {Boolean} [isRefresh]: 是否刷新整个表格\r\n\r\n------------\r\n### cellUpdated\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：更新这个单元格后触发\r\n- 参数：\r\n\t- {Number} [r]: 单元格所在行数\r\n\t- {Number} [c]: 单元格所在列数\r\n\t- {Object} [oldValue]: 修改前的单元格对象\r\n\t- {Object} [newValue]: 修改后的单元格对象\r\n\t- {Boolean} [isRefresh]: 是否刷新整个表格\r\n\r\n------------\r\n### cellRenderBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：单元格渲染前触发，`return false` 则不渲染该单元格\r\n- 参数：\r\n\t- {Object} [cell]:单元格对象\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [r]:单元格所在行号\r\n\t\t+ {Number} [c]:单元格所在列号\r\n\t\t+ {Number} [start_r]:单元格左上角的垂直坐标\r\n\t\t+ {Number} [start_c]:单元格左上角的水平坐标\r\n\t\t+ {Number} [end_r]:单元格右下角的垂直坐标\r\n\t\t+ {Number} [end_c]:单元格右下角的水平坐标\r\n\t- {Object} [sheet]:当前sheet对象\r\n\t- {Object} [ctx]: 当前画布的context\r\n\r\n------------\r\n### cellRenderAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：单元格渲染结束后触发，`return false` 则不渲染该单元格\r\n- 参数：\r\n\t- {Object} [cell]:单元格对象\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [r]:单元格所在行号\r\n\t\t+ {Number} [c]:单元格所在列号\r\n\t\t+ {Number} [start_r]:单元格左上角的垂直坐标\r\n\t\t+ {Number} [start_c]:单元格左上角的水平坐标\r\n\t\t+ {Number} [end_r]:单元格右下角的垂直坐标\r\n\t\t+ {Number} [end_c]:单元格右下角的水平坐标\r\n\t- {Object} [sheet]:当前sheet对象\r\n\t- {Object} [ctx]: 当前画布的context\r\n\r\n- 示例：\r\n\r\n\t一个在D1单元格的左上角和右下角分别绘制两张图的案例\r\n\t:::::: details\r\n\t```js\r\n\tluckysheet.create({\r\n            hook: {\r\n                cellRenderAfter: function (cell, position, sheetFile, ctx) {\r\n                    var r = position.r;\r\n                    var c = position.c;\r\n                    if (r === 0 && c === 3) { // 指定处理D1单元格\r\n                        if (!window.storeUserImage) {\r\n                            window.storeUserImage = {}\r\n                        }\r\n\t\t\t\t\t\t\r\n                        if (!window.storeUserImage[r + '_' + c]) {\r\n                            window.storeUserImage[r + '_' + c] = {}\r\n                        }\r\n\r\n                        var img = null;\r\n                        var imgRight = null;\r\n\r\n                        if (window.storeUserImage[r + '_' + c].image && window.storeUserImage[r + '_' + c].imgRight) {\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// 加载过直接取\r\n                            img = window.storeUserImage[r + '_' + c].image;\r\n                            imgRight = window.storeUserImage[r + '_' + c].imgRight;\r\n\r\n                        } else {\r\n\r\n                            img = new Image();\r\n                            imgRight = new Image();\r\n\r\n                            img.src = 'https://www.dogedoge.com/favicon/developer.mozilla.org.ico';\r\n                            imgRight.src = 'https://www.dogedoge.com/static/icons/twemoji/svg/1f637.svg';\r\n\r\n\t\t\t\t\t\t\t// 图片缓存到内存，下次直接取，不用再重新加载\r\n                            window.storeUserImage[r + '_' + c].image = img;\r\n                            window.storeUserImage[r + '_' + c].imgRight = imgRight;\r\n\r\n                        }\r\n\r\n\t\t\t\t\t\t\r\n                        if (img.complete) { // 已经加载完成的直接渲染\r\n                            ctx.drawImage(img, position.start_c, position.start_r, 10, 10);\r\n                        } else {\r\n                            img.onload = function () {\r\n                                ctx.drawImage(img, position.start_c, position.start_r, 10, 10);\r\n                            }\r\n\r\n                        }\r\n\r\n                        if (imgRight.complete) {\r\n                            ctx.drawImage(imgRight, position.end_c - 10, position.end_r - 10, 10, 10);\r\n                        } else {\r\n\r\n                            imgRight.onload = function () {\r\n                                ctx.drawImage(imgRight, position.end_c - 10, position.end_r - 10, 10, 10);\r\n                            }\r\n                        }\r\n\r\n                    }\r\n                }\r\n            }\r\n        })\r\n\t```\r\n\t:::\r\n\r\n------------\r\n### cellAllRenderBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：所有单元格渲染之前执行的方法。在内部，这个方法加在了`luckysheetDrawMain`渲染表格之前。\r\n- 参数：\r\n\t- {Object} [data]: 当前工作表二维数组数据\r\n\t- {Object} [sheet]:当前sheet对象\r\n\t- {Object} [ctx]: 当前画布的context\r\n\r\n------------\r\n### rowTitleCellRenderBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：行标题单元格渲染前触发，`return false` 则不渲染行标题\r\n- 参数：\r\n\t- {String} [rowNum]:行号\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [r]:单元格所在行号\r\n\t\t+ {Number} [top]:单元格左上角的垂直坐标\r\n\t\t+ {Number} [width]:单元格宽度\r\n\t\t+ {Number} [height]:单元格高度\r\n\t- {Object} [ctx]: 当前画布的context\r\n\r\n------------\r\n### rowTitleCellRenderAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：行标题单元格渲染后触发，`return false` 则不渲染行标题\r\n- 参数：\r\n\t- {String} [rowNum]:行号\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [r]:单元格所在行号\r\n\t\t+ {Number} [top]:单元格左上角的垂直坐标\r\n\t\t+ {Number} [width]:单元格宽度\r\n\t\t+ {Number} [height]:单元格高度\r\n\t- {Object} [ctx]: 当前画布的context\r\n\r\n------------\r\n### columnTitleCellRenderBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：列标题单元格渲染前触发，`return false` 则不渲染列标题\r\n- 参数：\r\n\t- {Object} [columnAbc]:列标题字符\r\n\t- {Object} [position]:\r\n\t\t- {Number} [c]:单元格所在列号\r\n\t\t- {Number} [left]:单元格左上角的水平坐标\r\n\t\t- {Number} [width]:单元格宽度\r\n\t\t- {Number} [height]:单元格高度\r\n\t- {Object} [ctx]: 当前画布的context\r\n\r\n------------\r\n### columnTitleCellRenderAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：列标题单元格渲染后触发，`return false` 则不渲染列标题\r\n- 参数：\r\n\t- {Object} [columnAbc]:列标题字符\r\n\t- {Object} [position]:\r\n\t\t- {Number} [c]:单元格所在列号\r\n\t\t- {Number} [left]:单元格左上角的水平坐标\r\n\t\t- {Number} [width]:单元格宽度\r\n\t\t- {Number} [height]:单元格高度\r\n\t- {Object} [ctx]: 当前画布的context\r\n\r\n------------\r\n\r\n## 鼠标钩子\r\n\r\n### cellMousedownBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：单元格点击前的事件，`return false`则终止之后的点击操作\r\n- 参数：\r\n\t- {Object} [cell]:单元格对象\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [r]:单元格所在行号\r\n\t\t+ {Number} [c]:单元格所在列号\r\n\t\t+ {Number} [start_r]:单元格左上角的垂直坐标\r\n\t\t+ {Number} [start_c]:单元格左上角的水平坐标\r\n\t\t+ {Number} [end_r]:单元格右下角的垂直坐标\r\n\t\t+ {Number} [end_c]:单元格右下角的水平坐标\r\n\t- {Object} [sheet]:当前sheet对象\r\n\t- {Object} [ctx]: 当前画布的context\r\n\r\n------------\r\n### cellMousedown\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：单元格点击后的事件，`return false`则终止之后的点击操作\r\n- 参数：\r\n\t- {Object} [cell]:单元格对象\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [r]:单元格所在行号\r\n\t\t+ {Number} [c]:单元格所在列号\r\n\t\t+ {Number} [start_r]:单元格左上角的垂直坐标\r\n\t\t+ {Number} [start_c]:单元格左上角的水平坐标\r\n\t\t+ {Number} [end_r]:单元格右下角的垂直坐标\r\n\t\t+ {Number} [end_c]:单元格右下角的水平坐标\r\n\t- {Object} [sheet]:当前sheet对象\r\n\t- {Object} [ctx]: 当前画布的context\r\n\r\n------------\r\n### sheetMousemove\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：鼠标移动事件，可通过cell判断鼠标停留在哪个单元格\r\n- 参数：\r\n\t- {Object} [cell]:单元格对象\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [r]:单元格所在行号\r\n\t\t+ {Number} [c]:单元格所在列号\r\n\t\t+ {Number} [start_r]:单元格左上角的垂直坐标\r\n\t\t+ {Number} [start_c]:单元格左上角的水平坐标\r\n\t\t+ {Number} [end_r]:单元格右下角的垂直坐标\r\n\t\t+ {Number} [end_c]:单元格右下角的水平坐标\r\n\t- {Object} [sheet]:当前sheet对象\r\n\t- {Object} [moveState]:鼠标移动状态，可判断现在鼠标操作的对象，false和true\r\n\t\t+ {Boolean} [functionResizeStatus]:工具栏拖动\r\n\t\t+ {Boolean} [horizontalmoveState]:水平冻结分割栏拖动\r\n\t\t+ {Boolean} [verticalmoveState]:垂直冻结分割栏拖动\r\n\t\t+ {Boolean} [pivotTableMoveState]:数据透视表字段拖动\r\n\t\t+ {Boolean} [sheetMoveStatus]:sheet改变你位置拖动\r\n\t\t+ {Boolean} [scrollStatus]:鼠标触发了滚动条移动\r\n\t\t+ {Boolean} [selectStatus]:鼠标移动框选数据\r\n\t\t+ {Boolean} [rowsSelectedStatus]:通过行标题来选择整行操作\r\n\t\t+ {Boolean} [colsSelectedStatus]:通过列标题来选择整列操作\r\n\t\t+ {Boolean} [cellSelectedMove]:选框的移动\r\n\t\t+ {Boolean} [cellSelectedExtend]:选框下拉填充\r\n\t\t+ {Boolean} [colsChangeSize]:拖拽改变列宽\r\n\t\t+ {Boolean} [rowsChangeSize]:拖拽改变行高\r\n\t\t+ {Boolean} [chartMove]:图表移动\r\n\t\t+ {Boolean} [chartResize]:图表改变大小\r\n\t\t+ {Boolean} [rangeResize]:公式参数高亮选区的大小拖拽\r\n\t\t+ {Boolean} [rangeMove]:公式参数高亮选区的位置拖拽\r\n\t- {Object} [ctx]: 当前画布的context\r\n\r\n------------\r\n### sheetMouseup\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：鼠标按钮释放事件，可通过cell判断鼠标停留在哪个单元格\r\n- 参数：\r\n\t- {Object} [cell]:单元格对象\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [r]:单元格所在行号\r\n\t\t+ {Number} [c]:单元格所在列号\r\n\t\t+ {Number} [start_r]:单元格左上角的垂直坐标\r\n\t\t+ {Number} [start_c]:单元格左上角的水平坐标\r\n\t\t+ {Number} [end_r]:单元格右下角的垂直坐标\r\n\t\t+ {Number} [end_c]:单元格右下角的水平坐标\r\n\t- {Object} [sheet]:当前sheet对象\r\n\t- {Object} [moveState]:鼠标移动状态，可判断现在鼠标操作的对象，false和true\r\n\t\t+ {Boolean} [functionResizeStatus]:工具栏拖动\r\n\t\t+ {Boolean} [horizontalmoveState]:水平冻结分割栏拖动\r\n\t\t+ {Boolean} [verticalmoveState]:垂直冻结分割栏拖动\r\n\t\t+ {Boolean} [pivotTableMoveState]:数据透视表字段拖动\r\n\t\t+ {Boolean} [sheetMoveStatus]:sheet改变你位置拖动\r\n\t\t+ {Boolean} [scrollStatus]:鼠标触发了滚动条移动\r\n\t\t+ {Boolean} [selectStatus]:鼠标移动框选数据\r\n\t\t+ {Boolean} [rowsSelectedStatus]:通过行标题来选择整行操作\r\n\t\t+ {Boolean} [colsSelectedStatus]:通过列标题来选择整列操作\r\n\t\t+ {Boolean} [cellSelectedMove]:选框的移动\r\n\t\t+ {Boolean} [cellSelectedExtend]:选框下拉填充\r\n\t\t+ {Boolean} [colsChangeSize]:拖拽改变列宽\r\n\t\t+ {Boolean} [rowsChangeSize]:拖拽改变行高\r\n\t\t+ {Boolean} [chartMove]:图表移动\r\n\t\t+ {Boolean} [chartResize]:图表改变大小\r\n\t\t+ {Boolean} [rangeResize]:公式参数高亮选区的大小拖拽\r\n\t\t+ {Boolean} [rangeMove]:公式参数高亮选区的位置拖拽\r\n\t\t+ {Boolean} [cellRightClick]:单元格右击\r\n\t\t+ {Boolean} [rowTitleRightClick]:行标题右击\r\n\t\t+ {Boolean} [columnTitleRightClick]:列标题右击\r\n\t\t+ {Boolean} [sheetRightClick]:底部sheet页右击\r\n\t\t+ {Boolean} [hyperlinkClick]:点击超链接\r\n\t- {Object} [ctx]: 当前画布的context\r\n\r\n------------\r\n### scroll\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：鼠标滚动事件\r\n- 参数：\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [scrollLeft]:横向滚动条的位置\r\n\t\t+ {Number} [scrollTop]:垂直滚动条的位置\r\n\t\t+ {Number} [canvasHeight]:canvas高度\r\n\t\t\r\n------------\r\n### cellDragStop\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：鼠标拖拽文件到Luckysheet内部的结束事件\r\n- 参数：\r\n\t- {Object} [cell]:单元格对象\r\n\t- {Object} [position]:\r\n\t\t+ {Number} [r]:单元格所在行号\r\n\t\t+ {Number} [c]:单元格所在列号\r\n\t\t+ {Number} [start_r]:单元格左上角的垂直坐标\r\n\t\t+ {Number} [start_c]:单元格左上角的水平坐标\r\n\t\t+ {Number} [end_r]:单元格右下角的垂直坐标\r\n\t\t+ {Number} [end_c]:单元格右下角的水平坐标\r\n\t- {Object} [sheet]:当前sheet对象\r\n\t- {Object} [ctx]: 当前画布的context\r\n\t- {Object} [event]: 当前事件对象\r\n\t\t\r\n------------\r\n\r\n## 选区操作（包括单元格）\r\n\r\n### rangeSelect\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：框选或者设置选区后触发\r\n- 参数：\r\n\t- {Object} [sheet]:当前sheet对象\r\n\t- {Object | Array} [range]: 选区范围，可能为多个选区\r\n\r\n------------\r\n### rangeMoveBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：移动选区前，包括单个单元格\r\n- 参数：\r\n\t- {Array} [range]: 当前选区范围，只能为单个选区\r\n\r\n------------\r\n### rangeMoveAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：移动选区后，包括单个单元格\r\n- 参数：\r\n\t- {Array} [oldRange]: 移动前当前选区范围，只能为单个选区\r\n\t- {Array} [newRange]: 移动后当前选区范围，只能为单个选区\r\n\r\n------------\r\n### rangeEditBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区修改前\r\n- 参数：\r\n\t- {Object | Array} [range]: 选区范围，可能为多个选区\r\n\t- {Object} [data]: 选区范围所对应的数据\r\n\r\n------------\r\n### rangeEditAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区修改后\r\n- 参数：\r\n\t- {Object | Array} [range]: 选区范围，可能为多个选区\r\n    - {Object} [oldData]: 修改前选区范围所对应的数据\r\n    - {Object} [newData]: 修改后选区范围所对应的数据\r\n\r\n------------\r\n### rangeCopyBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区复制前\r\n- 参数：\r\n\t- {Object | Array} [range]: 选区范围，可能为多个选区\r\n\t- {Object} [data]: 选区范围所对应的数据\r\n\r\n------------\r\n### rangeCopyAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区复制后\r\n- 参数：\r\n\t- {Object | Array} [range]: 选区范围，可能为多个选区\r\n\t- {Object} [data]: 选区范围所对应的数据\r\n\r\n------------\r\n### rangePasteBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区粘贴前\r\n- 参数：\r\n\t- {Object | Array} [range]: 选区范围，可能为多个选区\r\n\t- {Object} [data]: 要被粘贴的选区范围所对应的数据\r\n\r\n------------\r\n### rangePasteAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区粘贴后\r\n- 参数：\r\n\t- {Object | Array} [range]: 选区范围，可能为多个选区\r\n\t- {Object} [originData]: 要被粘贴的选区范围所对应的数据\r\n\t- {Object} [pasteData]: 要粘贴的数据\r\n\r\n------------\r\n### rangeCutBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区剪切前\r\n- 参数：\r\n\t- {Array} [range]: 选区范围，只能为单个范围\r\n\t- {Object} [data]: 要被剪切的选区范围所对应的数据\r\n\r\n------------\r\n### rangeCutAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区剪切后\r\n- 参数：\r\n\t- {Array} [range]: 选区范围，只能为单个范围\r\n\t- {Object} [data]: 被剪切的选区范围所对应的数据\r\n\r\n------------\r\n### rangeDeleteBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区删除前\r\n- 参数：\r\n\t- {Array} [range]: 选区范围，只能为单个范围\r\n\t- {Object} [data]: 要被删除的选区范围所对应的数据\r\n\r\n------------\r\n### rangeDeleteAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区删除后\r\n- 参数：\r\n\t- {Array} [range]: 选区范围，只能为单个范围\r\n\t- {Object} [data]: 被删除的选区范围所对应的数据\r\n\r\n------------\r\n### rangeClearBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区清除前\r\n- 参数：\r\n\t- {Object | Array} [range]: 选区范围，可能为多个选区\r\n\t- {Object} [data]: 要被清除的选区范围所对应的数据\r\n\r\n------------\r\n### rangeClearAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区清除后\r\n- 参数：\r\n\t- {Object | Array} [range]: 选区范围，可能为多个选区\r\n\t- {Object} [data]: 被清除的选区范围所对应的数据\r\n\r\n------------\r\n### rangePullBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区下拉前\r\n- 参数：\r\n\t- {Array} [range]: 当前选区范围，只能为单个范围\r\n\r\n------------\r\n### rangePullAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：选区下拉后\r\n- 参数：\r\n\t- {Array} [range]: 下拉后的选区范围，只能为单个范围\r\n\r\n------------\r\n\r\n## 工作表\r\n\r\n### sheetCreateBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：创建sheet页前触发，sheet页新建也包含数据透视表新建\r\n\r\n------------\r\n### sheetCreateAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：创建sheet页后触发，sheet页新建也包含数据透视表新建\r\n- 参数：\r\n\t- {Object} [sheet]: 当前新创建的sheet页的配置\r\n\r\n------------\r\n### sheetCopyBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：拷贝创建sheet页前触发，sheet页新建也包含数据透视表新建\r\n- 参数：\r\n\t- {Object} [targetSheet]: 被拷贝的sheet页配置\r\n\t- {Object} [copySheet]: 拷贝得到的sheet页的配置\r\n------------\r\n### sheetCopyAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：拷贝创建sheet页后触发，sheet页新建也包含数据透视表新建\r\n- 参数：\r\n\t- {Object} [sheet]: 当前创建的sheet页的配置\r\n\r\n------------\r\n### sheetHideBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：隐藏sheet页前触发\r\n- 参数：\r\n\t- {Object} [sheet]: 将要隐藏的sheet页的配置\r\n\r\n------------\r\n### sheetHideAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：隐藏sheet页后触发\r\n- 参数：\r\n\t- {Object} [sheet]: 要隐藏的sheet页的配置\r\n\r\n------------\r\n### sheetShowBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：显示sheet页前触发\r\n- 参数：\r\n\t- {Object} [sheet]: 将要显示的sheet页的配置\r\n\r\n------------\r\n### sheetShowAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：显示sheet页后触发\r\n- 参数：\r\n\t- {Object} [sheet]: 要显示的sheet页的配置\r\n\r\n------------\r\n### sheetMoveBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：sheet移动前\r\n- 参数：\r\n\t- {Number} [i]: 当前sheet页的`index`\r\n\t- {Number} [order]: 当前sheet页`order`\r\n\r\n------------\r\n### sheetMoveAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：sheet移动后\r\n- 参数：\r\n\t- {Number} [i]: 当前sheet页的`index`\r\n\t- {Number} [oldOrder]: 修改前当前sheet页`order`\r\n\t- {Number} [newOrder]: 修改后当前sheet页`order`\r\n\r\n------------\r\n### sheetDeleteBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：sheet删除前\r\n- 参数：\r\n\t- {Object} [sheet]: 要被删除sheet页的配置\r\n\r\n------------\r\n### sheetDeleteAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：sheet删除后\r\n- 参数：\r\n\t- {Object} [sheet]: 已被删除sheet页的配置\r\n\r\n------------\r\n### sheetEditNameBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：sheet修改名称前\r\n- 参数：\r\n\t- {Number} [i]: sheet页的`index`\r\n\t- {String} [name]: 当前sheet页名称\r\n\r\n------------\r\n### sheetEditNameAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：sheet修改名称后\r\n- 参数：\r\n\t- {Number} [i]: sheet页的index\r\n\t- {String} [oldName]: 修改前当前sheet页名称\r\n\t- {String} [newName]: 修改后当前sheet页名称\r\n\r\n------------\r\n### sheetEditColorBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：sheet修改颜色前\r\n- 参数：\r\n\t- {Number} [i]: sheet页的`index`\r\n\t- {String} [color]: 当前sheet页颜色\r\n\r\n------------\r\n### sheetEditColorAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：sheet修改颜色后\r\n- 参数：\r\n\t- {Number} [i]: sheet页的`index`\r\n\t- {String} [oldColor]: 修改前当前sheet页颜色\r\n\t- {String} [newColor]: 修改后当前sheet页颜色\r\n\r\n------------\r\n### sheetZoomBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：sheet缩放前\r\n- 参数：\r\n\t- {Number} [i]: sheet页的`index`\r\n\t- {String} [zoom]: 当前sheet页缩放比例\r\n\r\n------------\r\n### sheetZoomAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：sheet缩放后\r\n- 参数：\r\n\t- {Number} [i]: sheet页的`index`\r\n\t- {String} [oldZoom]: 修改前当前sheet页缩放比例\r\n\t- {String} [newZoom]: 修改后当前sheet页缩放比例\r\n\r\n------------\r\n### sheetActivate\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：激活工作表前\r\n- 参数：\r\n\t- {Number} [i]: sheet页的`index`\r\n\t- {Boolean} [isPivotInitial]: 是否切换到了数据透视表页\r\n\t- {Boolean} [isNewSheet]: 是否新建了sheet页\r\n\r\n------------\r\n### sheetDeactivateBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：工作表从活动状态转为非活动状态前\r\n- 参数：\r\n\t- {Number} [i]: sheet页的`index`\r\n\r\n------------\r\n### sheetDeactivateAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：工作表从活动状态转为非活动状态后\r\n- 参数：\r\n\t- {Number} [i]: sheet页的`index`\r\n  \r\n### imageDeleteBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：图片删除前触发\r\n- 参数：\r\n\t- {Object} [imageItem]: 要删除的图片配置对象\r\n\r\n### imageDeleteAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：图片删除后触发，如果自定义了图片上传，可在此处发请求删除图片\r\n- 参数：\r\n\t- {Object} [imageItem]: 删除的图片配置对象\r\n\r\n```js\r\n{\r\n\thook: {\r\n\t\timageDeleteAfter: function (imageItem) {\r\n\t\t\tvar src = imgItem.src;\r\n\t\t\t$.post('/rest/file/deletebyurl', {downloadUrl: src});\r\n\t\t}\r\n\t}\r\n}\r\n```\r\n\r\n------------\r\n\r\n## 工作簿\r\n\r\n### workbookCreateBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：表格创建之前触发。旧的钩子函数叫做`beforeCreateDom`\r\n- 参数：\r\n\t- {Object} [book]: 整个工作簿的配置（options）\r\n    \r\n------------\r\n### workbookCreateAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：表格创建之后触发\r\n- 参数：\r\n\t- {Object} [book]: 整个工作簿的配置（options）\r\n     \r\n------------\r\n### workbookDestroyBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：表格销毁之前触发\r\n- 参数：\r\n\t- {Object} [book]: 整个工作簿的配置（options）\r\n    \r\n------------\r\n### workbookDestroyAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：表格销毁之后触发\r\n- 参数：\r\n\t- {Object} [book]: 整个工作簿的配置（options）\r\n    \r\n------------\r\n### updated\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：协同编辑中的每次操作后执行的方法，监听表格内容变化，即客户端每执行一次表格操作，Luckysheet将这次操作存到历史记录中后触发，撤销重做时因为也算一次操作，也会触发此钩子函数。\r\n- 参数：\r\n\t- {Object} [operate]: 本次操作的历史记录信息，根据不同的操作，会有不同的历史记录，参考源码 [历史记录](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/controlHistory.js)\r\n    \r\n------------\r\n### resized\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：resize执行之后\r\n- 参数：\r\n\t- {Object} [size]: 整个工作簿区域的宽高\r\n    \r\n------------\r\n### scroll\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：监听表格滚动值\r\n- 参数：\r\n\t- {Number} [scrollLeft]: 水平方向滚动值\r\n\t- {Number} [scrollTop]: 垂直方向滚动值\r\n\t- {Number} [canvasHeight]: 滚动容器的高度\r\n    \r\n------------\r\n\r\n\r\n## 协作消息\r\n\r\n### cooperativeMessage\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：接受协作消息，二次开发。拓展协作消息指令集\r\n- 参数：\r\n\t- {Object} : 收到服务器发送的整个协作消息体对象\r\n  \r\n## 图片\r\n\r\n### imageInsertBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：图片插入之前\r\n- 参数：\r\n\t- {Object} [url]: 图片地址\r\n    \r\n------------\r\n### imageInsertAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：图片插入之后\r\n- 参数：\r\n\t- {Object} [item]]: 图片地址、宽高、位置等信息\r\n    \r\n------------\r\n### imageUpdateBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：图片修改之前，修改的内容包括宽高、位置、裁剪等操作\r\n- 参数：\r\n\t- {Object} [item]]: 图片地址、宽高、位置等信息\r\n    \r\n------------\r\n### imageUpdateAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：图片修改之后，修改的内容包括宽高、位置、裁剪等操作\r\n- 参数：\r\n\t- {Object} [oldItem]]: 修改前图片地址、宽高、位置等信息\r\n\t- {Object} [newItem]]: 修改后图片地址、宽高、位置等信息\r\n    \r\n------------\r\n### imageDeleteBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：图片删除之前\r\n- 参数：\r\n\t- {Object} [item]]: 图片地址、宽高、位置等信息\r\n    \r\n------------\r\n### imageDeleteAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：图片删除之后\r\n- 参数：\r\n\t- {Object} [item]]: 图片地址、宽高、位置等信息\r\n    \r\n------------\r\n\r\n## 批注\r\n\r\n### commentInsertBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：插入批注之前，`return false` 则不插入批注\r\n- 参数：\r\n\t- {Number} [r]:单元格所在行号\r\n\t- {Number} [c]:单元格所在列号\r\n\r\n------------\r\n### commentInsertAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：插入批注之后\r\n- 参数：\r\n\t- {Number} [r]:单元格所在行号\r\n\t- {Number} [c]:单元格所在列号\r\n\t- {Object} [cell]: 被插入批注所在的单元格信息，如：`{ r:0,c:2,v:{m:'233',v:'233'}}`，包含批注信息\r\n    \r\n------------\r\n### commentDeleteBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：删除批注之前，`return false` 则不删除批注\r\n- 参数：\r\n\t- {Number} [r]:单元格所在行号\r\n\t- {Number} [c]:单元格所在列号\r\n\t- {Object} [cell]: 要删除的批注所在的单元格信息，如：`{ r:0,c:2,v:{m:'233',v:'233'}}`，可以看到批注信息\r\n\r\n------------\r\n### commentDeleteAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：删除批注之后\r\n- 参数：\r\n\t- {Number} [r]:单元格所在行号\r\n\t- {Number} [c]:单元格所在列号\r\n\t- {Object} [cell]: 被删除批注所在的单元格信息，如：`{ r:0,c:2,v:{m:'233',v:'233'}}`，可以看到批注已被删除\r\n    \r\n------------\r\n### commentUpdateBefore\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：修改批注之前，`return false` 则不修改批注\r\n- 参数：\r\n\t- {Number} [r]:单元格所在行号\r\n\t- {Number} [c]:单元格所在列号\r\n\t- {String} [value]: 新的批注内容\r\n\r\n------------\r\n### commentUpdateAfter\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：修改批注之后\r\n- 参数：\r\n\t- {Number} [r]:单元格所在行号\r\n\t- {Number} [c]:单元格所在列号\r\n\t- {Object} [oldCell]: 修改前批注所在的单元格信息，如：`{ r:0,c:2,v:{m:'233',v:'233'}}`\r\n\t- {Object} [newCell]: 修改后批注所在的单元格信息，如：`{ r:0,c:2,v:{m:'233',v:'233'}}`\r\n    \r\n------------\r\n\r\n## 数据透视表\r\n\r\n### pivotTableEditBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：修改数据透视表之前，操作如：拖动字段等\r\n- 参数：\r\n\t- {Object} [sheet]: 数据透视表所在sheet页配置\r\n\r\n------------\r\n### pivotTableEditAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：修改数据透视表之后，操作如：拖动字段等\r\n- 参数：\r\n\t- {Object} [oldSheet]: 修改前数据透视表所在sheet页配置\r\n\t- {Object} [newSheet]: 修改后数据透视表所在sheet页配置\r\n    \r\n------------\r\n\r\n## 冻结\r\n\r\n### frozenCreateBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：设置冻结前\r\n- 参数：\r\n\t- {Object} [frozen]: 冻结类型信息\r\n\r\n------------\r\n### frozenCreateAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：设置冻结后\r\n- 参数：\r\n\t- {Object} [frozen]: 冻结类型信息\r\n    \r\n------------\r\n### frozenCancelBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：取消冻结前\r\n- 参数：\r\n\t- {Object} [frozen]: 冻结类型信息\r\n\r\n------------\r\n### frozenCancelAfter\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：取消冻结后\r\n- 参数：\r\n\t- {Object} [frozen]: 冻结类型信息\r\n    \r\n------------\r\n\r\n## 打印\r\n\r\n### printBefore\r\n（TODO）\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：打印前\r\n\r\n------------\r\n\r\n## 旧版钩子函数\r\n\r\n### fireMousedown\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：单元格数据下钻自定义方法，注意此钩子函数是挂载在options下：`options.fireMousedown`\r\n\r\n------------\r\n\r\n## 分页器\r\n\r\n### onTogglePager\r\n\r\n- 类型：Function\r\n- 默认值：null\r\n- 作用：点击分页按钮回调函数，返回当前页码，具体参数参照[sPage backFun](https://github.com/jvbei/sPage)\r\n- 参数：\r\n\t- {Object} [page]: 返回当前分页对象\r\n\r\n------------\r\n"
  },
  {
    "path": "docs/zh/guide/contribute.md",
    "content": "\r\n# 贡献指南  \r\n\r\n  欢迎！我们很高兴您能来到这里，并非常期待您能有兴趣参与 Luckysheet 贡献。当然，在您参与 Luckysheet 贡献之前，请确保通读以下全文：\r\n\r\n## 我们的行为准则\r\n\r\n1. 我们保证尊重所有参与贡献的人，不限于提出问题、文档和代码贡献、解决bug以及其它贡献的人；\r\n\r\n2. 我们有义务遵守当地法律法规，所有的附带法律风险的行为我们都是拒绝的；\r\n3. 我们反对任何参与者存在贬损评论、人身攻击、骚扰或侮辱他人以及其他非专业行为；\r\n4. 我们有权并有责任删除或编辑与此行为准则不符的内容，不限于代码、Issues、wiki、文档以及其它。不遵守行为准则的参与者可能会被移除团队；\r\n5. 我们接受任何人的监督，任何人可通过问题反馈，向我们报告发现的与此行为准则不符的事实存在。\r\n\r\n## 如何参与贡献？\r\n\r\n* 贡献文档：浏览文档可以加深您对 Luckysheet 的了解，一旦发现文档写得不清晰或逻辑混乱的地方，可以订正、修改、补充，您可以通过 [中文论坛](https://support.qq.com/products/288322)或者 [谷歌论坛](https://groups.google.com/g/luckysheet)给予反馈\r\n* 贡献代码：欢迎大家为 Luckysheet 社区贡献代码，欢迎您认领Open状态的 [Issues](https://github.com/mengshukeji/Luckysheet/issues) 和未完成的特性，提交PR，成为贡献者之一如果您在使用过程中发现有些功能无法满足您的需求或出现问题，请在Issues中记录\r\n* 参与Issue讨论：您可以在任一 [Issues](https://github.com/mengshukeji/Luckysheet/issues) 下发表您的建议\r\n* Review代码：您可以在 [Github](https://github.com/mengshukeji/Luckysheet)上看到所有贡献者提交的PR，您可以Review他们的代码并发表您的建议\r\n\r\n\r\n## 如何提交 Issues\r\n\r\n在您提交特性/改进前，应该注意以下几点：\r\n\r\n* 请先确认该特性/改进是否被其他人已经提交\r\n* 一个通俗易懂的标题来阐述你提交的Bug/提交特性/改进\r\n* 如果是Bug则详细描述该bug产生的原因，如果能够复现，请尽量提供完整的重现步骤\r\n* 如果是特性，那么该特性应该有广泛的适用性，适用于大部分用户，最好能够提供详尽的设计文档\r\n* 如果是改进，尽可能描述清楚此改进所带来的益处\r\n\r\n具体步骤：\r\n\r\n* 创建 [Issues](https://github.com/mengshukeji/Luckysheet/issues) ，描述清楚问题\r\n* 如果你要解决该issue则将issue assign到自己名下，如果你仅仅是提交Bug/特性/改进，并没有时间去贡献代码，则assignne设置为空\r\n* 如果是比较大的特性/改进，尽量先输出设计文档，走 [Luckysheet RFC](https://github.com/mengshukeji/Luckysheet-rfcs) 流程，供其他人review\r\n\r\n## 如何认领 Issues\r\n\r\n在 Luckysheet 的 [Issues](https://github.com/mengshukeji/Luckysheet/issues) 列表中，有很多由其他人创建的issue并未被修复，如果你感兴趣的话，可以认领这些issue。认领步骤如下：\r\n\r\n* 在该issue下留言，表达想认领该任务的想法，另注明 **@I can solve it** 即可\r\n* 如果提交者没有意见，则将该issue assign到自己名下并及时更新进度\r\n* 如果是比较大的特性，尽量先输出设计文档，走 [Luckysheet RFC](https://github.com/mengshukeji/Luckysheet-rfcs) 流程，供其他人review\r\n* 开发代码并提交代码至github\r\n\r\n\r\n## 如何提交代码\r\n\r\n1. fork 到自己的仓库\r\n\r\n进入  [Luckysheet](https://github.com/mengshukeji/Luckysheet)  的Github页面 ，点击右上角按钮 Fork 进行 Fork。\r\n\r\n2. git clone 到本地\r\n\r\n```shell\r\ngit clone https://github.com/<your_github_name>/Luckysheet.git\r\n```\r\n\r\n3. 上游建立连接\r\n\r\n```shell\r\n\r\ncd Luckysheet\r\ngit remote add upstream https://github.com/mengshukeji/Luckysheet.git\r\n```\r\n4. 创建开发分支\r\n\r\n```shell\r\ngit checkout -b dev\r\n```\r\n\r\n5. 修改提交代码\r\n\r\n```shell\r\ngit add . \r\nnpm run commit\r\ngit push origin dev\r\n```\r\n\r\n6. 同步代码，将最新代码同步到本地\r\n\r\n```shell\r\ngit fetch upstream \r\ngit rebase upstream/master\r\n```\r\n\r\n7. 如果有冲突（没有可以忽略）\r\n\r\n```shell\r\ngit status # 查看冲突文件，并修改冲突\r\ngit add .\r\ngit rebase --continue\r\n```\r\n提交git rebase --continue命令的时候，如果弹出vim提示编辑commit信息，则可以添加你的修改，然后保存退出\r\n> vim命令请参考阅读[vim](https://www.runoob.com/linux/linux-vim.html)\r\n\r\n8. 提交分支代码\r\n\r\n```shell\r\ngit push origin dev\r\n```\r\n\r\n如果提示需要先pull 可以先拉取在提交\r\n```shell\r\ngit pull origin dev\r\ngit push origin dev\r\n```\r\n若弹出vim提示编辑commit信息，可以直接通过vim命令退出\r\n> vim命令请参考阅读[vim](https://www.runoob.com/linux/linux-vim.html)\r\n\r\n9. 提交pr\r\n去自己github仓库对应fork的项目，切换到刚刚创建修改的分支，点击new pull request，并添加上对应的描述，最后点击Create pull request进行提交\r\n    \r\n## 代码规范\r\n\r\n> 一般性的代码规范示例\r\n\r\n* 保持块深度最小。尽可能避免嵌套If条件\r\n```js\r\n// CORRECT\r\nif (!comparison) return\r\n\r\nif (variable) {\r\n  for (const item of items) {}\r\n} else if (variable2) {\r\n  // Do something here\r\n}\r\n\r\n// INCORRECT\r\nif (comparison) {\r\n  if (variable) {\r\n    for (const item in items) {}\r\n  } else if (variable2) {\r\n    // Do something here\r\n  }\r\n} else {\r\n  return\r\n}\r\n```\r\n\r\n* 不要使用操作数进行链比较\r\n```js\r\n// CORRECT\r\n\r\nif (cb) cb()\r\nif (!cb || (cb === fn)) cb()\r\n\r\n// INCORRECT\r\n\r\ncb && cb()\r\n(!cb || (cb === fn)) && cb()\r\n```\r\n\r\n* 所有变量都应该按字母顺序在块的开头声明\r\n```js\r\n// CORRECT\r\nfunction foo () {\r\n  const foo = 'bar'\r\n  const bar = 'foo'\r\n\r\n        if (conditional) {}\r\n\r\n  ...\r\n\r\n  return foo\r\n}\r\n\r\n// INCORRECT\r\n\r\nfunction foo () {\r\n  const foo = 'bar'\r\n\r\n        if (conditional) {}\r\n\r\n  const bar = 'foo'\r\n\r\n  ...\r\n\r\n  return foo\r\n}\r\n```\r\n\r\n* 尽快返回\r\n```js\r\n// CORRECT\r\nif (condition) return 'foo'\r\nif (condition2) return 'bar'\r\n// Return must have a blank line above\r\nreturn 'fizz'\r\n\r\n// INCORRECT\r\nconst variable = ''\r\n\r\nif (condition) {\r\n  variable = 'foo'\r\n} else if (condition2) {\r\n  variable = 'bar'\r\n} else {\r\n  variable = 'fizz'\r\n}\r\n\r\nreturn variable\r\n```\r\n\r\n## 如何贡献文档\r\n\r\n## 如何成为Luckysheet Committer\r\n\r\n任何人只要对 Luckysheet 项目做了贡献，那您就是官方承认的 Luckysheet 项目的Contributor了，从Contributor成长为Committer并没有一个确切的标准， 也没有任何预期的时间表，但是Committer的候选人一般都是长期活跃的贡献者，成为Committer并没有要求必须有巨大的架构改进贡献， 或者多少行的代码贡献，贡献代码、贡献文档、参与邮件列表的讨论、帮助回答问题等等都提升自己影响力的方式。\r\n\r\n潜在贡献清单（无特定顺序）：\r\n\r\n* 提交自己发现的Bug、特性、改进到issue\r\n* 更新官方文档使项目的文档是最近的、撰写 Luckysheet 的最佳实践、特性剖析的各种对用户有用的文档\r\n* 执行测试并报告测试结果，性能测试与其他MQ的性能对比测试等\r\n* 审查(Review)其他人的工作（包括代码和非代码）并发表你自己的建议\r\n* 指导新加入的贡献者，熟悉社区流程\r\n* 发表关于 Luckysheet 的博客\r\n* 有利于 Luckysheet 社区发展的任何贡献\r\n* ......\r\n"
  },
  {
    "path": "docs/zh/guide/operate.md",
    "content": "# 表格操作\r\n\r\n每一次操作都会保存历史记录，用于撤销和重做，如果在表格初始化的时候开启了[共享编辑](/zh/guide/config.html#updateurl)功能，则会通过websocket将操作实时更新到后台。\r\n\r\n> 源码 [`src/controllers/server.js`](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/server.js) 模块实现了后台保存功能\r\n\r\n通常，共享编辑（或者叫协同编辑）是需要和账户系统配合来控制权限的，开发者可以根据已有功能，配合自己的账户管理功能自行实现权限控制。\r\n\r\n以下为所有的支持传输到后台的操作类型，并且以MongoDB做存储示例，讲解如何做前后端交互。\r\n\r\n注意一点，对象中的i为当前sheet的index值，而不是order。\r\n\r\n## 单元格刷新\r\n\r\n### 单个单元格刷新\r\n\r\n- **格式**：\r\n\r\n    ```json\r\n    {\r\n        \"t\": \"v\",\r\n        \"i\": \"Sheet_0554kKiKl4M7_1597974810804\",\r\n        \"v\": {\r\n            \"v\": 233,\r\n            \"ct\": { \"fa\": \"General\", \"t\": \"n\" },\r\n            \"m\": \"233\"\r\n        },\r\n        \"r\": 0,\r\n        \"c\": 1\r\n    }\r\n    ```\r\n\r\n- **说明**：\r\n\r\n    |参数|说明|\r\n    | ------------ | ------------ |\r\n    |t|操作类型表示符号|\r\n    |i|当前sheet的index值|\r\n    |v|单元格的值，数字、字符串或着对象格式，对象参考 [单元格属性表](/zh/guide/cell.html#基本单元格)|\r\n    |r|单元格的行号|\r\n    |c|单元格的列号|\r\n\r\n- **后台更新**：\r\n\r\n    前端维护luckysheetfile[i].data，而单元格更新到后台，继续维护`luckysheetfile[i].celldata` 参数，celldata是一个一维数组：\r\n    ```json\r\n    [\r\n        {r:0, c:1, v: \"值1\"},\r\n        {r:10, c:11, v:\"值2\"},\r\n        {r:10, c:11, v:{f:\"=sum\", v:\"100\"}}\r\n    ]\r\n    ```\r\n    后台在保存前台推送的数据时，会更新 `luckysheetfile[i].celldata` 字段，如果存在该单元格则更新，如果没有则添加，如果存在该单元格但是`v`为null则删除该单元格。\r\n  \r\n\r\n### 范围单元格刷新\r\n\r\n- **格式**：\r\n\r\n    ```json\r\n    {\r\n        \"t\": \"rv\",\r\n        \"i\": \"Sheet_ahKdzaNC65iL_1598343160744\",\r\n        \"v\": [\r\n            [\r\n                { \"v\": 3, \"ct\": { \"fa\": \"General\", \"t\": \"n\" }, \"m\": \"3\" }\r\n            ],\r\n            [\r\n                { \"v\": 4, \"ct\": { \"fa\": \"General\", \"t\": \"n\" }, \"m\": \"4\" }\r\n            ]\r\n        ],\r\n        \"range\": {\r\n            \"row\": [ 1, 2 ],\r\n            \"column\": [ 1, 1 ]\r\n        }\r\n    }\r\n    ```\r\n\r\n- **说明**：\r\n\r\n    |参数|说明|\r\n    | ------------ | ------------ |\r\n    |t|操作类型表示符号|\r\n    |i|当前sheet的索引值|\r\n    |v|范围二维数组，单元格对象参考 [单元格属性表](/zh/guide/cell.html#基本单元格)|\r\n    |range|范围行列数|\r\n\r\n- **后台更新**：\r\n\r\n    前端维护luckysheetfile[i].data，而单元格更新到后台，继续维护`luckysheetfile[i].celldata` 参数，需要将指定位置`range`的所有单元格数据替换为新的数据\r\n  \r\n## config操作\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n    {\r\n        \"t\": \"cg\",\r\n        \"i\": \"Sheet_0554kKiKl4M7_1597974810804\",\r\n        \"v\": [ {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"color\": \"#000\",\r\n                \"style\": \"1\",\r\n                \"range\": [ {\"row\": [ 0, 1 ], \"column\": [ 1, 1 ] } ]\r\n            } ],\r\n        \"k\": \"borderInfo\"\r\n    }\r\n  ```\r\n\r\n- **说明**：\r\n\r\n    |参数|说明|\r\n    | ------------ | ------------ |\r\n    |t|操作类型表示符号|\r\n    |i|当前sheet的index值|\r\n    |v|需要更新value值|\r\n    |k|操作的key值，可选 边框：`'borderInfo'` / ：行隐藏：`'rowhidden'` / 列隐藏：`'colhidden'` / 行高：`'rowlen'` / 列宽：`'columnlen'` |\r\n\r\n- **后台更新**：\r\n\r\n    更新 `luckysheetfile[i].config[k] = v` ，如果`config`中不存在`k`，则新建一个`k`属性并设置为空。\r\n\r\n    注意一点，修改config中的某个配置时，会把这个配置全部传输到后台，比如修改borderInfo，本来已经有一个含边框的单元格了，再新设置一个单元格边框，这时候会把这两个单元格边框信息都传输到后台，而不做更细颗粒的操作。\r\n\r\n    1. 行隐藏：\r\n       - 发送到后台：\r\n            ```json\r\n            {\r\n                \"t\": \"cg\",\r\n                \"i\": \"Sheet_0554kKiKl4M7_1597974810804\",\r\n                \"v\": { \"5\": 0, \"6\": 0, \"13\": 0, \"14\": 0 }, // 包含所有隐藏行信息\r\n                \"k\": \"rowhidden\"\r\n            }\r\n            ```\r\n       - 后台更新：`luckysheetfile[\"Sheet_0554kKiKl4M7_1597974810804\"].config[\"rowhidden\"] = { \"5\": 0, \"6\": 0, \"13\": 0, \"14\": 0 }`\r\n    \r\n    2. 修改行高：\r\n       - 发送到后台：\r\n            ```json\r\n           {\r\n                \"t\": \"cg\",\r\n                \"i\": \"Sheet_0554kKiKl4M7_1597974810804\",\r\n                \"v\": { \"9\": 20, \"11\": 71, \"15\": 58 }, // 包含所有修改过高度的单元格信息\r\n                \"k\": \"rowlen\"\r\n            }\r\n            ```\r\n       - 后台更新：`luckysheetfile[\"Sheet_0554kKiKl4M7_1597974810804\"].config[\"rowlen\"] = { \"9\": 20, \"11\": 71, \"15\": 58 }`\r\n    \r\n    3. 修改列宽：\r\n       - 发送到后台：\r\n            ```json\r\n           {\r\n                \"t\": \"cg\",\r\n                \"i\": \"Sheet_0554kKiKl4M7_1597974810804\",\r\n                \"v\": { \"2\": 135 },\r\n                \"k\": \"columnlen\"\r\n            }\r\n            ```\r\n       - 后台更新：`luckysheetfile[\"Sheet_0554kKiKl4M7_1597974810804\"].config[\"columnlen\"] = { \"2\": 135 }`\r\n \r\n## 通用保存\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n    {\r\n        \"t\": \"all\",\r\n        \"i\": 0,\r\n        \"v\": {\r\n            \"type\": \"rangeRow\",\r\n            \"range\": { \"row_focus\": 1, \"column_focus\": 1 }\r\n        },\r\n        \"k\": \"frozen\"\r\n    }\r\n  ```\r\n\r\n- **说明**：\r\n\r\n    |参数|说明|\r\n    | ------------ | ------------ |\r\n    |t|操作类型表示符号|\r\n    |i|当前sheet的index值|\r\n    |v|需要更新value值|\r\n    |k|操作的key值|\r\n\r\n- **后台更新**：\r\n\r\n    更新 `luckysheetfile[i][k] = v` ，如果`luckysheetfile[i]`中不存在`k`，则新建一个`k`属性并设置为空。\r\n\r\n    1. 冻结行列：\r\n       - 发送到后台：\r\n            ```json\r\n            {\r\n                \"t\": \"all\",\r\n                \"i\": 0,\r\n                \"v\": {\r\n                    \"type\": \"rangeRow\",\r\n                    \"range\": { \"row_focus\": 1, \"column_focus\": 1 }\r\n                },\r\n                \"k\": \"frozen\"\r\n            }\r\n            ```\r\n       - 后台更新：\r\n            ```js\r\n            luckysheetfile[0][\"frozen\"] = {\r\n                    \"type\": \"rangeRow\",\r\n                    \"range\": { \"row_focus\": 1, \"column_focus\": 1 }\r\n                }\r\n            ```\r\n\r\n    2. 修改工作表名称：\r\n       - 发送到后台：\r\n            ```json\r\n            {\r\n                \"t\": \"all\",\r\n                \"i\": 0,\r\n                \"v\": \"Cell22\",\r\n                \"k\": \"name\"\r\n            }\r\n            ```\r\n       - 后台更新：`luckysheetfile[0][\"name\"] = \"Cell22\"`\r\n    \r\n    3. 修改工作表颜色：\r\n       - 发送到后台：\r\n            ```json\r\n            {\r\n                \"t\": \"all\",\r\n                \"i\": 0,\r\n                \"v\": \"#f02323\",\r\n                \"k\": \"color\"\r\n            }\r\n            ```\r\n       - 后台更新：`luckysheetfile[0][\"color\"] = \"#f02323\"`\r\n    \r\n    4. 合并单元格：\r\n       - 发送到后台：\r\n            ```json\r\n            {\r\n                \"t\": \"all\",\r\n                \"i\": \"Sheet_aheLt0Waf1lk_1598248231626\",\r\n                \"v\": {\r\n                    \"merge\": {\r\n                        \"0_0\": { \"r\": 0,  \"c\": 0, \"rs\": 2, \"cs\": 1 }\r\n                    },\r\n                    \"rowlen\": {}\r\n                },\r\n                \"k\": \"config\"\r\n            }\r\n            ```\r\n       - 后台更新：\r\n            ```js\r\n            luckysheetfile[\"Sheet_aheLt0Waf1lk_1598248231626\"][\"config\"] =  {\r\n                \"merge\": {\r\n                    \"0_0\": { \"r\": 0,  \"c\": 0, \"rs\": 2, \"cs\": 1 }\r\n                },\r\n                \"rowlen\": {}\r\n            }\r\n            ```\r\n                \r\n            注意，合并单元格的更新比较特殊，要求把整个config传输到后台，因为合并单元格可能会影响到其他参数。\r\n    \r\n    5. 筛选范围：\r\n       - 发送到后台：\r\n            ```json\r\n            {\r\n                \"t\": \"all\",\r\n                \"i\": 0,\r\n                \"v\": {\r\n                    \"row\": [ 16, 21 ],\r\n                    \"column\": [ 2, 3 ]\r\n                },\r\n                \"k\": \"filter_select\"\r\n            }\r\n            ```\r\n       - 后台更新：\r\n            ```js\r\n            luckysheetfile[0][\"filter_select\"] =  {\r\n                    \"row\": [ 16, 21 ],\r\n                    \"column\": [ 2, 3 ]\r\n                }\r\n            ```\r\n    \r\n    6. 筛选的具体设置：\r\n       - 发送到后台：\r\n            ```json\r\n            {\r\n                \"t\": \"all\",\r\n                \"i\": \"0\",\r\n                \"v\": {\r\n                    \"0\": {\r\n                        \"caljs\": {\r\n                            \"value\": \"textinclude\",\r\n                            \"text\": \"Text contains\",\r\n                            \"type\": \"1\",\r\n                            \"value1\": \"Lucky\"\r\n                        },\r\n                        \"rowhidden\": {\r\n                            \"18\": 0\r\n                        },\r\n                        \"optionstate\": true,\r\n                        \"str\": 17,\r\n                        \"edr\": 19,\r\n                        \"cindex\": 2,\r\n                        \"stc\": 2,\r\n                        \"edc\": 3\r\n                    }\r\n                },\r\n                \"k\": \"filter\"\r\n            }\r\n            ```\r\n       - 后台更新：\r\n            ```js\r\n            luckysheetfile[0][\"filter\"] = {\r\n                    \"0\": {\r\n                        \"caljs\": {\r\n                            \"value\": \"textinclude\",\r\n                            \"text\": \"Text contains\",\r\n                            \"type\": \"1\",\r\n                            \"value1\": \"Lucky\"\r\n                        },\r\n                        \"rowhidden\": {\r\n                            \"18\": 0\r\n                        },\r\n                        \"optionstate\": true,\r\n                        \"str\": 17,\r\n                        \"edr\": 19,\r\n                        \"cindex\": 2,\r\n                        \"stc\": 2,\r\n                        \"edc\": 3\r\n                    }\r\n                }\r\n            ```\r\n    \r\n    7. 交替颜色：\r\n       - 发送到后台：\r\n            ```json\r\n            {\r\n                \"t\": \"all\",\r\n                \"i\": \"Sheet_4N45tpMd0ni4_1598250591760\",\r\n                \"v\": [\r\n                    {\r\n                        \"cellrange\": {\r\n                            \"row\": [ 2, 6 ],\r\n                            \"column\": [ 1, 4 ]\r\n                        },\r\n                        \"format\": {\r\n                            \"head\": {\r\n                                \"fc\": \"#000\",\r\n                                \"bc\": \"#f6cb4b\"\r\n                            },\r\n                            \"one\": {\r\n                                \"fc\": \"#000\",\r\n                                \"bc\": \"#ffffff\"\r\n                            },\r\n                            \"two\": {\r\n                                \"fc\": \"#000\",\r\n                                \"bc\": \"#fff9e7\"\r\n                            },\r\n                            \"foot\": {\r\n                                \"fc\": \"#000\",\r\n                                \"bc\": \"#ffebac\"\r\n                            }\r\n                        },\r\n                        \"hasRowHeader\": true,\r\n                        \"hasRowFooter\": true\r\n                    }\r\n                ],\r\n                \"k\": \"luckysheet_alternateformat_save\"\r\n            }\r\n            ```\r\n       - 后台更新：\r\n            ```js\r\n            luckysheetfile[\"Sheet_4N45tpMd0ni4_1598250591760\"][\"luckysheet_alternateformat_save\"] =   [\r\n                    {\r\n                        \"cellrange\": {\r\n                            \"row\": [ 2, 6 ],\r\n                            \"column\": [ 1, 4 ]\r\n                        },\r\n                        \"format\": {\r\n                            \"head\": {\r\n                                \"fc\": \"#000\",\r\n                                \"bc\": \"#f6cb4b\"\r\n                            },\r\n                            \"one\": {\r\n                                \"fc\": \"#000\",\r\n                                \"bc\": \"#ffffff\"\r\n                            },\r\n                            \"two\": {\r\n                                \"fc\": \"#000\",\r\n                                \"bc\": \"#fff9e7\"\r\n                            },\r\n                            \"foot\": {\r\n                                \"fc\": \"#000\",\r\n                                \"bc\": \"#ffebac\"\r\n                            }\r\n                        },\r\n                        \"hasRowHeader\": true,\r\n                        \"hasRowFooter\": true\r\n                    }\r\n                ]\r\n            ```\r\n    \r\n    8. 条件格式：\r\n       - 发送到后台：\r\n            ```json\r\n            {\r\n                \"t\": \"all\",\r\n                \"i\": \"Sheet_545W7w03kLkC_1598251927583\",\r\n                \"v\": [\r\n                    {\r\n                        \"type\": \"default\",\r\n                        \"cellrange\": [\r\n                            {\r\n                                \"row\": [ 2, 6 ],\r\n                                \"column\": [ 1, 3 ]\r\n                            }\r\n                        ],\r\n                        \"format\": {\r\n                            \"textColor\": \"#9c0006\",\r\n                            \"cellColor\": \"#ffc7ce\"\r\n                        },\r\n                        \"conditionName\": \"greaterThan\",\r\n                        \"conditionRange\": [],\r\n                        \"conditionValue\": [ \"3\" ]\r\n                    }\r\n                ],\r\n                \"k\": \"luckysheet_conditionformat_save\"\r\n            }\r\n            ```\r\n       - 后台更新：\r\n            ```js\r\n            luckysheetfile[\"Sheet_545W7w03kLkC_1598251927583\"][\"luckysheet_conditionformat_save\"] =   [\r\n                    {\r\n                        \"type\": \"default\",\r\n                        \"cellrange\": [\r\n                            {\r\n                                \"row\": [ 2, 6 ],\r\n                                \"column\": [ 1, 3 ]\r\n                            }\r\n                        ],\r\n                        \"format\": {\r\n                            \"textColor\": \"#9c0006\",\r\n                            \"cellColor\": \"#ffc7ce\"\r\n                        },\r\n                        \"conditionName\": \"greaterThan\",\r\n                        \"conditionRange\": [],\r\n                        \"conditionValue\": [ \"3\" ]\r\n                    }\r\n                ]\r\n            ```\r\n    \r\n    9. 数据透视表：\r\n       - 发送到后台：\r\n            ```json\r\n            {\r\n                \"t\": \"all\",\r\n                \"i\": \"Sheet_r3Cz5bbxipL3_1598252547290\",\r\n                \"v\": {\r\n                    \"pivot_select_save\": {\r\n                        \"row\": [ 0, 2 ],\r\n                        \"column\": [ 0, 2 ]\r\n                    },\r\n                    \"pivotDataSheetIndex\": \"Sheet_31ikLMip330K_1598252536645\",\r\n                    \"column\": [],\r\n                    \"row\": [],\r\n                    \"filter\": [],\r\n                    \"values\": [],\r\n                    \"showType\": \"column\"\r\n                },\r\n                \"k\": \"pivotTable\"\r\n            }\r\n            ```\r\n       - 后台更新：\r\n            ```js\r\n            luckysheetfile[\"Sheet_r3Cz5bbxipL3_1598252547290\"][\"pivotTable\"] =  {\r\n                    \"pivot_select_save\": {\r\n                        \"row\": [ 0, 2 ],\r\n                        \"column\": [ 0, 2 ]\r\n                    },\r\n                    \"pivotDataSheetIndex\": \"Sheet_31ikLMip330K_1598252536645\",\r\n                    \"column\": [],\r\n                    \"row\": [],\r\n                    \"filter\": [],\r\n                    \"values\": [],\r\n                    \"showType\": \"column\"\r\n                }\r\n            ```\r\n\r\n            注意，虽然数据透视表的格式是这个，但是当你选择一个范围之后，点击生产数据透视表时，Luckysheet会先执行新建sheet页和切换到该sheet页的操作，才能在新建的sheet页加上数据透视表。\r\n    \r\n    10. 动态数组：\r\n        - 发送到后台：\r\n            ```json\r\n            {\r\n                \"t\": \"all\",\r\n                \"i\": \"Sheet_r3Cz5bbxipL3_1598252547290\",\r\n                \"v\": [\r\n                    {\r\n                        \"r\": 4,\r\n                        \"c\": 5,\r\n                        \"f\": \"=UNIQUE(B2:E9)\",\r\n                        \"data\": [\r\n                            [ 1, 2, 3, 4 ],\r\n                            [ 2, 3, 4, 5 ],\r\n                            [ 3, 4, 5, 6 ],\r\n                            [ 4, 5, 6, 7 ],\r\n                            [ 5, 6, 7, 8 ],\r\n                            [ 6, 7, 8, 9 ],\r\n                            [ 7, 8, 9, 10 ],\r\n                            [ 8, 9, 10, 11 ]\r\n                        ]\r\n                    }\r\n                ],\r\n                \"k\": \"dynamicArray\"\r\n            }\r\n            ```\r\n        - 后台更新：\r\n            ```js\r\n            luckysheetfile[\"Sheet_r3Cz5bbxipL3_1598252547290\"][\"dynamicArray\"] =   [\r\n                    {\r\n                        \"r\": 4,\r\n                        \"c\": 5,\r\n                        \"f\": \"=UNIQUE(B2:E9)\",\r\n                        \"data\": [\r\n                            [ 1, 2, 3, 4 ],\r\n                            [ 2, 3, 4, 5 ],\r\n                            [ 3, 4, 5, 6 ],\r\n                            [ 4, 5, 6, 7 ],\r\n                            [ 5, 6, 7, 8 ],\r\n                            [ 6, 7, 8, 9 ],\r\n                            [ 7, 8, 9, 10 ],\r\n                            [ 8, 9, 10, 11 ]\r\n                        ]\r\n                    }\r\n                ]\r\n            ```\r\n\r\n## 函数链操作\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n\r\n  {\r\n    \"t\": \"fc\",\r\n    \"i\": \"0\",\r\n    \"v\": \"{\\\"r\\\":1,\\\"c\\\":1,\\\"index\\\":\\\"0\\\",\\\"func\\\":[true,3,\\\"=sum(A1:B1)\\\"]}\",\r\n    \"op\": \"add\",\r\n    \"pos\": 1\r\n  }\r\n\r\n  ```\r\n\r\n- **说明**：\r\n\r\n    |参数|说明|\r\n    | ------------ | ------------ |\r\n    |t|操作类型表示符号|\r\n    |i|当前sheet的index值|\r\n    |v|对象值，这里对象的内部字段不需要单独更新，所以存为文本即可|\r\n    |op|操作类型,`add`为新增，`update`为更新，`del`为删除|\r\n    |pos|更新或者删除的函数位置|\r\n\r\n- **后台更新**：\r\n\r\n    calcChain为一个数组\r\n    - 如果`op`的值为`add`则添加到末尾 `luckysheetfile[0].calcChain.push(v)`， \r\n    - 如果`op`的值为`update`，格式为：\r\n        ```json\r\n        {\r\n            \"t\": \"fc\",\r\n            \"i\": \"0\",\r\n            \"v\": \"{\\\"r\\\":0,\\\"c\\\":3,\\\"index\\\":\\\"0\\\",\\\"func\\\":[true,1,\\\"=Formula!A1+Formula!B1+1\\\"],\\\"color\\\":\\\"w\\\",\\\"parent\\\":null,\\\"chidren\\\":{},\\\"times\\\":0}\",\r\n            \"op\": \"update\",\r\n            \"pos\": 0\r\n        }\r\n        ```\r\n        更新 `luckysheetfile[0].calcChain[pos] = v`，\r\n    - 如果`op`的值为`del`则删除，格式为：\r\n        ```json\r\n        {\r\n            \"t\": \"fc\",\r\n            \"i\": 0,\r\n            \"v\": null,\r\n            \"op\": \"del\",\r\n            \"pos\": 0\r\n        }\r\n        ```\r\n        `luckysheetfile[0].calcChain.splice(pos, 1)`。\r\n\r\n## 行列操作\r\n\r\n### 删除行或列\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"drc\",\r\n    \"i\": 3,\r\n    \"v\": {\r\n        \"index\": 6,\r\n        \"len\": 2\r\n    },\r\n    \"rc\": \"r\"\r\n  }\r\n  ```\r\n\r\n- **说明**：\r\n\r\n    <table>\r\n        <tr>\r\n            <td colspan=\"2\">参数</td> \r\n            <td>说明</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">t</td> \r\n            <td>操作类型表示符号</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">i</td> \r\n            <td>当前sheet的index值</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">rc</td> \r\n            <td>行操作还是列操作，值`r`代表行，`c`代表列</td> \r\n        </tr>\r\n        <tr>\r\n            <td rowspan=\"2\">v</td> \r\n            <td>index</td> \r\n            <td>从第几行或者列开始删除</td> \r\n        </tr>\r\n        <tr>\r\n            <td>len</td> \r\n            <td>删除多少行或者列</td> \r\n        </tr>\r\n        \r\n    </table>\r\n\r\n- **后台更新**：\r\n  \r\n    如果`rc`的值是`'r'`删除行， 如果`rc`的值为`'c'`则删除列， 例如`rc='r'`，`index=4`，`len=5`，则代表从第4行开始删除之后的5行（4、5、6、7、8）。\r\n\r\n    主要是对 `luckysheetfile[i].celldata` 中的单元格进行操作，删除参数中所描述符合条件的单元格并且更新其他单元格的行列值，以上述为例，首先查找单元格中`r`值在4到8的所有单元格并删除，然后把本来行号9以后的单元格的`r`值减去5，最后把 `luckysheetfile[i].row` 减去5。\r\n    如果`v`值为 `\"#__qkdelete#\"`（不含引号），则此处为需要删除的单元格。\r\n\r\n### 增加行或列\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"arc\",\r\n    \"i\": \"0\",\r\n    \"v\": {\r\n        \"index\": 1,\r\n        \"len\": 1,\r\n        \"direction\": \"lefttop\",\r\n        \"data\": []\r\n    },\r\n    \"rc\": \"r\"\r\n  }\r\n  ```\r\n\r\n- **说明**：\r\n\r\n    <table>\r\n        <tr>\r\n            <td colspan=\"2\">参数</td> \r\n            <td>说明</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">t</td> \r\n            <td>操作类型表示符号</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">i</td> \r\n            <td>当前sheet的index值</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">rc</td> \r\n            <td>行操作还是列操作，值`r`代表行，`c`代表列</td> \r\n        </tr>\r\n        <tr>\r\n            <td rowspan=\"4\">v</td> \r\n            <td>index</td> \r\n            <td>从第几行或者列开始新增</td> \r\n        </tr>\r\n        <tr>\r\n            <td>len</td> \r\n            <td>增加多少行或者列</td> \r\n        </tr>\r\n        <tr>\r\n            <td>direction</td> \r\n            <td>方向</td> \r\n        </tr>\r\n        <tr>\r\n            <td>data</td> \r\n            <td>新增行或者列的内容</td> \r\n        </tr>\r\n        \r\n    </table>\r\n\r\n- **后台更新**：\r\n  \r\n    如果`rc`的值是`r`新增行， 如果`rc`的值为`c`则新增列， 例如`rc=r，index=4，len=5`，则代表从第4行开始增加5行，如果`data`为空则增加空行，如果`data`不为空则用`data`中的数组添加新增的行中。\r\n\r\n    主要是对 `luckysheetfile[i].celldata` 中的单元格进行操作，以上述为例，首先 `luckysheetfile[i].row` 加5，然后把`r`大于4的单元格的整体的`r`值+5，如果`data`为空则增加空行则结束，如果`data`不为空则把二维数组`data`转换为 `{r:0,c:0,v:100}` 的格式并添加到`celldata`中，转换的伪代码如下：\r\n\r\n    ```javascript\r\n    var ret = [];\r\n    for(var r=0;r<data.length;r++){\r\n        for(var c=0;c<data[0].length;c++){\r\n            if(d[r][c]==null){\r\n                continue;\r\n            }\r\n            ret.push({r:r+5, c:c, v: data[r][c]});\r\n        }\r\n    }\r\n    return ret;\r\n    ```\r\n\r\n## 筛选操作\r\n\r\n### 清除筛选\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"fsc\",\r\n    \"i\": 0,\r\n    \"v\": null\r\n  }\r\n  ```\r\n\r\n- **后台更新**：\r\n  \r\n    清除 `luckysheetfile[0].filter = null` ， `luckysheetfile[i].filter_select = null`。\r\n\r\n### 恢复筛选\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"fsr\",\r\n    \"i\": 0,\r\n    \"v\": {\r\n        \"filter\": [],\r\n        \"filter_select\": {}\r\n    }\r\n  }\r\n  ```\r\n\r\n- **后台更新**：\r\n  \r\n    清除 `luckysheetfile[i]. filter = v.filter`， `luckysheetfile[i]. filter_select = v. filter_select`。\r\n\r\n## sheet操作\r\n\r\n### 新建sheet\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"sha\",\r\n    \"i\": null,\r\n    \"v\": {\r\n        \"name\": \"Sheet11\",\r\n        \"color\": \"\",\r\n        \"status\": \"0\",\r\n        \"order\": 10,\r\n        \"index\": \"Sheet_oWlM5pKnwL1s_1598331858653\",\r\n        \"celldata\": [],\r\n        \"row\": 84,\r\n        \"column\": 60,\r\n        \"config\": {},\r\n        \"pivotTable\": null,\r\n        \"isPivotTable\": false\r\n    }\r\n  }\r\n  ```\r\n\r\n- **说明**：\r\n\r\n    <table>\r\n        <tr>\r\n            <td colspan=\"2\">参数</td> \r\n            <td>说明</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">t</td> \r\n            <td>操作类型表示符号</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">i</td> \r\n            <td>当前sheet的index值</td> \r\n        </tr>\r\n        <tr>\r\n            <td rowspan=\"11\">v</td> \r\n            <td>name</td> \r\n            <td>隐藏后跳转的sheet的index值</td> \r\n        </tr>\r\n        <tr>\r\n            <td>color</td> \r\n            <td>Sheet颜色</td> \r\n        </tr>\r\n        <tr>\r\n            <td>status</td> \r\n            <td>激活状态</td> \r\n        </tr>\r\n        <tr>\r\n            <td>order</td> \r\n            <td>Sheet摆放顺序</td> \r\n        </tr>\r\n        <tr>\r\n            <td>index</td> \r\n            <td>Index索引</td> \r\n        </tr>\r\n        <tr>\r\n            <td>celldata</td> \r\n            <td>单元格数据集</td> \r\n        </tr>\r\n        <tr>\r\n            <td>row</td> \r\n            <td>行数</td> \r\n        </tr>\r\n        <tr>\r\n            <td>column</td> \r\n            <td>列数</td> \r\n        </tr>\r\n        <tr>\r\n            <td>config</td> \r\n            <td>设置</td> \r\n        </tr>\r\n        <tr>\r\n            <td>pivotTable</td> \r\n            <td>数据透视表设置</td> \r\n        </tr>\r\n        <tr>\r\n            <td>isPivotTable</td> \r\n            <td>是否数据透视表</td> \r\n        </tr>\r\n        \r\n    </table>\r\n\r\n- **后台更新**：\r\n  \r\n    添加一行（一个文档）到数据库中。\r\n    `luckysheetfile.push(json)`\r\n\r\n\r\n### 复制sheet\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"shc\",\r\n    \"i\": \"Sheet_e5pKTeloilhe_1598332166630\",\r\n    \"v\": {\r\n        \"copyindex\": 0,\r\n        \"name\": \"Cell(Copy)\"\r\n    }\r\n  }\r\n  ```\r\n\r\n- **后台更新**：\r\n  \r\n    复制表格中的sheet索引值为`copyindex`并添加到数据库中，添加的设置该新文档的`index`为`i`对应的值。\r\n\r\n### 删除sheet\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"shd\",\r\n    \"i\": null,\r\n    \"v\": {\r\n        \"deleIndex\": 0\r\n    }\r\n  }\r\n  ```\r\n\r\n- **说明**：\r\n\r\n    <table>\r\n        <tr>\r\n            <td colspan=\"2\">参数</td> \r\n            <td>说明</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">t</td> \r\n            <td>操作类型表示符号</td> \r\n        </tr>\r\n        <tr>\r\n            <td rowspan=\"2\">v</td> \r\n            <td>deleIndex</td> \r\n            <td>需要删除的sheet索引</td> \r\n        </tr>\r\n                \r\n    </table>\r\n\r\n- **后台更新**：\r\n  \r\n    删除索引为`deleIndex`对应值的sheet。\r\n\r\n### 删除sheet后恢复操作\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"shre\",\r\n    \"i\": null,\r\n    \"v\": {\r\n        \"reIndex\": \"0\"\r\n    }\r\n  }\r\n  ```\r\n\r\n- **说明**：\r\n\r\n    <table>\r\n        <tr>\r\n            <td colspan=\"2\">参数</td> \r\n            <td>说明</td> \r\n        </tr>\r\n        <tr>\r\n            <td colspan=\"2\">t</td> \r\n            <td>操作类型表示符号</td> \r\n        </tr>\r\n        <tr>\r\n            <td rowspan=\"2\">v</td> \r\n            <td>deleIndex</td> \r\n            <td>需要恢复的sheet索引</td> \r\n        </tr>\r\n                \r\n    </table>\r\n\r\n- **后台更新**：\r\n  \r\n    恢复索引为`reIndex`对应值的sheet。\r\n\r\n### 调整sheet位置\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"shr\",\r\n    \"i\": null,\r\n    \"v\": {\r\n        \"0\": 1,\r\n        \"1\": 0,\r\n        \"2\": 2,\r\n        \"3\": 3,\r\n        \"4\": 4,\r\n        \"5\": 5,\r\n        \"6\": 6,\r\n        \"7\": 7,\r\n        \"Sheet_6az6nei65t1i_1596209937084\": 8\r\n    }\r\n  }\r\n  ```\r\n\r\n- **说明**：\r\n\r\n    |参数|说明|\r\n    | ------------ | ------------ |\r\n    |t|操作类型表示符号|\r\n    |v|设置Sheet的排序，为一个键值对，`key`代表sheet的`index`，`value`代表`order`值。格式为：`{\"1\": 3, \"2\":1, \"0\": 2, \"3\":0}`|\r\n\r\n- **后台更新**：\r\n  \r\n    对sheet的`index`等于`key`的页，设置其`order`属性为`value`值。示例：\r\n\r\n    `luckysheetfile[key1].order = value1`\r\n    `luckysheetfile[key2].order = value2`\r\n    `luckysheetfile[key3].order = value3`\r\n\r\n### 切换到指定sheet\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"shs\",\r\n    \"i\": null,\r\n    \"v\": 1\r\n  }\r\n  ```\r\n\r\n- **说明**：\r\n\r\n    |参数|说明|\r\n    | ------------ | ------------ |\r\n    |t|操作类型表示符号|\r\n    |v|要切换到的sheet页索引|\r\n\r\n- **后台更新**：\r\n  \r\n    对sheet的`index`等于`v`的页，设置其`status`属性为`1`值。示例：\r\n\r\n    `luckysheetfile[v].status = 1`\r\n\r\n## sheet属性(隐藏或显示)\r\n\r\n- **格式**：\r\n\r\n  ```json\r\n  {\r\n    \"t\": \"sh\",\r\n    \"i\": 0,\r\n    \"v\": 1,\r\n    \"op\": \"hide\",\r\n    \"cur\": 1\r\n  }\r\n  \r\n  ```\r\n\r\n- **说明**：\r\n\r\n    |参数|说明|\r\n    | ------------ | ------------ |\r\n    |t|操作类型表示符号|\r\n    |i|当前sheet的index值|\r\n    |op|操作选项，有hide、show|\r\n    |v|如果`hide`为`1`则隐藏，为`0`或者空则为显示|\r\n    |cur|隐藏后设置索引对应`cur`的sheet为激活状态|\r\n\r\n- **后台更新**：\r\n  \r\n    更新`i`对应sheet的根路径`hide`字段为`v`\r\n    \r\n    当隐藏时`status`值为`0`，更新`index`对应`cur`的sheet的`status`状态为`1`\r\n    \r\n    `luckysheetfile[0].hide = 1`\r\n    `luckysheetfile[0].status = 0`\r\n    `luckysheetfile[1].status = 1`\r\n\r\n    显示某个sheet页时，json为\r\n    ```json\r\n    {\r\n        \"t\": \"sh\",\r\n        \"i\": 6,\r\n        \"v\": 0,\r\n        \"op\": \"show\"\r\n    }\r\n    ```\r\n    `status`值为`1`，上一个激活sheet的`status`状态为`0`\r\n    \r\n    `luckysheetfile[6].hide = 0`\r\n    `luckysheetfile[6].status = 1`\r\n    `luckysheetfile[old_cur].status = 0`\r\n\r\n## 表格信息更改\r\n\r\n### 修改工作簿名称\r\n\r\n- **格式**：\r\n\r\n    ```json\r\n    {\r\n        \"t\": \"na\",\r\n        \"i\": null,\r\n        \"v\": \"Luckysheet Demo1\"\r\n    }\r\n    ```\r\n\r\n- **说明**：\r\n\r\n    |参数|说明|\r\n    | ------------ | ------------ |\r\n    |t|操作类型表示符号|\r\n    |v|工作簿名称|\r\n\r\n- **后台更新**：\r\n  \r\n    Luckysheet配置，修改title为`\"Luckysheet Demo1\"`\r\n\r\n## 图表(TODO)\r\n\r\n图表操作类型有4种，分别为新增图表\"add\"、移动图表位置\"xy\"、缩放图表\"wh\"、修改图表配置\"update\"\r\n\r\n### 新增图表\r\n\r\n- **格式**：\r\n\r\n    ```json\r\n    {\r\n        \"t\": \"c\",\r\n        \"i\": 0,\r\n        \"op\":\"add\",\r\n        \"v\": {\r\n            \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n            \"width\": 400,\r\n            \"height\": 250,\r\n            \"left\": 20,\r\n            \"top\": 120,\r\n            \"sheetIndex\": \"Sheet_6az6nei65t1i_1596209937084\",\r\n            \"needRangeShow\": true,\r\n            \"chartOptions\": {\r\n                \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n                \"chartAllType\": \"echarts|line|default\",\r\n                \"rangeArray\": [ { \"row\": [ 0, 4 ], \"column\": [ 0, 7 ] } ],\r\n                \"rangeColCheck\": { \"exits\": true, \"range\": [ 0, 0 ] },\r\n                \"rangeRowCheck\": { \"exits\": true, \"range\": [ 0, 0 ] },\r\n                \"rangeConfigCheck\": false,\r\n                \"defaultOption\": {\r\n                    \"title\": {\r\n                        \"show\": true,\r\n                        \"text\": \"默认标题\"\r\n                    }\r\n                }\r\n            },\r\n            \"isShow\": true\r\n        }\r\n    }\r\n    ```\r\n\r\n- **说明**：\r\n\r\n    |参数|说明|\r\n    | ------------ | ------------ |\r\n    |t|操作类型表示符号|\r\n    |i|当前sheet的index值|\r\n    |op|操作选项|\r\n    |v|图表的配置信息|\r\n\r\n- **后台更新**：\r\n  \r\n    更新对应sheet页中的图表设置，如果`luckysheetfile[i].chart`为null，则初始化为空数组 `[]`\r\n\r\n    ```json\r\n    luckysheetfile[0].chart.push(v)\r\n    ```\r\n\r\n### 移动图表位置\r\n\r\n- **格式**：\r\n\r\n    ```json\r\n    {\r\n        \"t\": \"c\",\r\n        \"i\": 0,\r\n        \"op\":\"xy\",\r\n        \"v\": {\r\n            \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n            \"left\": 20,\r\n            \"top\": 120\r\n        }\r\n    }\r\n    ```\r\n\r\n- **说明**：\r\n\r\n    |参数|说明|\r\n    | ------------ | ------------ |\r\n    |t|操作类型表示符号|\r\n    |i|当前sheet的index值|\r\n    |op|操作选项|\r\n    |v|图表的配置信息|\r\n\r\n- **后台更新**：\r\n  \r\n    更新对应sheet页中的图表设置\r\n\r\n    ```js\r\n    luckysheetfile[0].chart[v.chart_id].left = v.left;\r\n    luckysheetfile[0].chart[v.chart_id].top = v.top;\r\n    ```\r\n\r\n### 缩放图表\r\n\r\n- **格式**：\r\n\r\n    ```json\r\n    {\r\n        \"t\": \"c\",\r\n        \"i\": 0,\r\n        \"op\":\"wh\",\r\n        \"v\": {\r\n            \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n            \"width\": 400,\r\n            \"height\": 250,\r\n            \"left\": 20,\r\n            \"top\": 120\r\n        }\r\n    }\r\n    ```\r\n\r\n- **说明**：\r\n\r\n    |参数|说明|\r\n    | ------------ | ------------ |\r\n    |t|操作类型表示符号|\r\n    |i|当前sheet的index值|\r\n    |op|操作选项|\r\n    |v|图表的配置信息|\r\n\r\n- **后台更新**：\r\n  \r\n    更新对应sheet页中的图表设置\r\n\r\n    ```js\r\n    luckysheetfile[0].chart[v.chart_id].left = v.left;\r\n    luckysheetfile[0].chart[v.chart_id].top = v.top;\r\n    luckysheetfile[0].chart[v.chart_id].width = v.width;\r\n    luckysheetfile[0].chart[v.chart_id].height = v.height;\r\n    ```\r\n\r\n### 修改图表配置\r\n\r\n- **格式**：\r\n\r\n    ```json\r\n    {\r\n        \"t\": \"c\",\r\n        \"i\": 0,\r\n        \"op\":\"update\",\r\n        \"v\": {\r\n            \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n            \"width\": 400,\r\n            \"height\": 250,\r\n            \"left\": 20,\r\n            \"top\": 120,\r\n            \"sheetIndex\": \"Sheet_6az6nei65t1i_1596209937084\",\r\n            \"needRangeShow\": true,\r\n            \"chartOptions\": {\r\n                \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n                \"chartAllType\": \"echarts|line|default\",\r\n                \"rangeArray\": [ { \"row\": [ 0, 4 ], \"column\": [ 0, 7 ] } ],\r\n                \"rangeColCheck\": { \"exits\": true, \"range\": [ 0, 0 ] },\r\n                \"rangeRowCheck\": { \"exits\": true, \"range\": [ 0, 0 ] },\r\n                \"rangeConfigCheck\": false,\r\n                \"defaultOption\": {\r\n                    \"title\": {\r\n                        \"show\": true,\r\n                        \"text\": \"默认标题\"\r\n                    }\r\n                }\r\n            },\r\n            \"isShow\": true\r\n        }\r\n    }\r\n    ```\r\n\r\n- **说明**：\r\n\r\n    |参数|说明|\r\n    | ------------ | ------------ |\r\n    |t|操作类型表示符号|\r\n    |i|当前sheet的index值|\r\n    |op|操作选项|\r\n    |v|图表的配置信息|\r\n\r\n- **后台更新**：\r\n  \r\n    更新对应sheet页中的图表设置\r\n\r\n    ```js\r\n    luckysheetfile[0].chart[v.chart_id] = v;\r\n    ```\r\n\r\n## 后端返回格式\r\n\r\nwebsocket 后端返回的数据格式\r\n```js\r\n{\r\n    createTime: 命令发送时间\r\n    data:{} 修改的命令\r\n    id: \"7a\"   websocket的id\r\n    returnMessage: \"success\"\r\n    status: \"0\"  0告诉前端需要根据data的命令修改  1无意义\r\n    type: 0：连接成功，1：发送给当前连接的用户，2：发送信息给其他用户，3：发送选区位置信息，999：用户连接断开\r\n    username: 用户名\r\n}\r\n```"
  },
  {
    "path": "docs/zh/guide/resource.md",
    "content": "# 教程与资源\r\n\r\n开源软件离不开社区的贡献，这里将会列举出社区提供的教程、学习资料及配套解决方案。\r\n\r\n如果您写了或者发现了优秀的教程想要推荐给我们，请直接[编辑此页](https://github.com/mengshukeji/Luckysheet/edit/master/docs/zh/guide/resource.md)提交PR。\r\n\r\n## 博客\r\n- [Luckysheet如何初始化含合并单元格的数据](https://www.cnblogs.com/DuShuSir/p/13272397.html)\r\n- [Luckysheet如何把表格里的数据保存到数据库](https://www.cnblogs.com/DuShuSir/p/13857874.html)\r\n- [本地HTML采用cdn加载方式引入Luckysheet的案例](https://www.cnblogs.com/DuShuSir/p/13859103.html)\r\n- [Luckysheet基础用法，使用loadUrl加载服务端数据](https://blog.csdn.net/DCDC2020/article/details/108486525)\r\n- [Luckysheet 导入与导出实现 - Java后台处理](https://blog.csdn.net/u014632228/article/details/109738221)\r\n\r\n## 前端案例\r\n\r\n### 社区案例\r\n- [luckysheet-vue-importAndExport](https://github.com/oy-paddy/luckysheet-vue-importAndExport/tree/master/)\r\n\r\n## 后端案例\r\n\r\n### 官方案例\r\n- [Java 后台 Luckysheet Server](https://github.com/mengshukeji/LuckysheetServer)\r\n\r\n### 社区案例\r\n- [Luckysheet保存与恢复](https://gitee.com/ichiva/luckysheet-saved-in-recovery)（Java版）\r\n- [基于Luckysheet实现的协同编辑在线表格](https://github.com/DilemmaVi/ecsheet)（Java版）\r\n- [简易的Express服务端示例 个人应用模板](https://github.com/TitanRGB/Luckysheet-ExpressReact-Example) (Node-Express版)\r\n- [使用.net core 3.1和Npoi 制作基于LuckSheet的基础导出](https://gitee.com/xiong-kangli/luck-sheet_.-net-core)（.NET 版本）\r\n- [go语言版本的协同编辑](https://github.com/fandypeng/excel2config)（Go 版本）\r\n\r\n## 学习资料\r\n\r\n- [如何从0到1搭建 Web 数据分析报表](https://github.com/mengshukeji/LuckyResources/blob/master/ppt/%E5%A6%82%E4%BD%95%E4%BB%8E0%E5%88%B01%E6%90%AD%E5%BB%BA%20Web%20%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E6%8A%A5%E8%A1%A8.pptx)\r\n"
  },
  {
    "path": "docs/zh/guide/sheet.md",
    "content": "# 工作表配置\r\n\r\n## 初始化配置\r\n表格初始化配置`options`时，需要配置一个由每个工作表参数组成的一维数组，赋给`options.data`。\r\n\r\n> 表格初始化完成之后，通过方法[`luckysheet.getAllSheets()`](/zh/guide/api.html#getAllSheets([setting]))可以获取所有工作表的配置信息。\r\n\r\noptions.data示例如下：\r\n```json\r\n[\r\n    {\r\n        \"name\": \"Cell\", //工作表名称\r\n        \"color\": \"\", //工作表颜色\r\n        \"index\": 0, //工作表索引\r\n        \"status\": 1, //激活状态\r\n        \"order\": 0, //工作表的下标\r\n        \"hide\": 0,//是否隐藏\r\n        \"row\": 36, //行数\r\n        \"column\": 18, //列数\r\n        \"defaultRowHeight\": 19, //自定义行高\r\n        \"defaultColWidth\": 73, //自定义列宽\r\n        \"celldata\": [], //初始化使用的单元格数据\r\n        \"config\": {\r\n            \"merge\":{}, //合并单元格\r\n            \"rowlen\":{}, //表格行高\r\n            \"columnlen\":{}, //表格列宽\r\n            \"rowhidden\":{}, //隐藏行\r\n            \"colhidden\":{}, //隐藏列\r\n            \"borderInfo\":{}, //边框\r\n            \"authority\":{}, //工作表保护\r\n            \r\n        },\r\n        \"scrollLeft\": 0, //左右滚动条位置\r\n        \"scrollTop\": 315, //上下滚动条位置\r\n        \"luckysheet_select_save\": [], //选中的区域\r\n        \"calcChain\": [],//公式链\r\n        \"isPivotTable\":false,//是否数据透视表\r\n        \"pivotTable\":{},//数据透视表设置\r\n        \"filter_select\": {},//筛选范围\r\n        \"filter\": null,//筛选配置\r\n        \"luckysheet_alternateformat_save\": [], //交替颜色\r\n        \"luckysheet_alternateformat_save_modelCustom\": [], //自定义交替颜色\t\r\n        \"luckysheet_conditionformat_save\": {},//条件格式\r\n        \"frozen\": {}, //冻结行列配置\r\n        \"chart\": [], //图表配置\r\n        \"zoomRatio\":1, // 缩放比例\r\n        \"image\":[], //图片\r\n        \"showGridLines\": 1, //是否显示网格线\r\n        \"dataVerification\":{} //数据验证配置\r\n    },\r\n    {\r\n        \"name\": \"Sheet2\",\r\n        \"color\": \"\",\r\n        \"index\": 1,\r\n        \"status\": 0,\r\n        \"order\": 1,\r\n        \"celldata\": [],\r\n        \"config\": {}\r\n    },\r\n    {\r\n        \"name\": \"Sheet3\",\r\n        \"color\": \"\",\r\n        \"index\": 2,\r\n        \"status\": 0,\r\n        \"order\": 2,\r\n        \"celldata\": [],\r\n        \"config\": {},\r\n    }\r\n]\r\n```\r\n        \r\n### name\r\n- 类型：String\r\n- 默认值：\"Sheet1\"\r\n- 作用：工作表名称\r\n\r\n------------\r\n### color\r\n- 类型：String\r\n- 默认值：\"##f20e0e\"\r\n- 作用：工作表颜色,工作表名称下方会有一条底部边框\r\n\r\n------------\r\n### index\r\n- 类型：String\r\n- 默认值：\"\"\r\n- 作用：工作表索引，作为唯一key值使用，新增工作表时会自动赋值一个随机字符串。注意`index`不是工作表顺序，和`order`区分开。\r\n\r\n------------\r\n### status\r\n- 类型：Number\r\n- 默认值：1\r\n- 作用： 激活状态，仅有一个激活状态的工作表，其他工作表为 0\r\n\r\n------------\r\n### order\r\n- 类型：Number\r\n- 默认值：0\r\n- 作用： 工作表的下标，代表工作表在底部sheet栏展示的顺序，新增工作表时会递增，从0开始\r\n\r\n------------\r\n### hide\r\n- 类型：Number\r\n- 默认值：0\r\n- 作用： 是否隐藏，`0`为不隐藏，`1`为隐藏\r\n\r\n------------\r\n### row\r\n- 类型：Number\r\n- 默认值：36\r\n- 作用： 单元格行数\r\n\r\n------------\r\n### column\r\n- 类型：Number\r\n- 默认值：18\r\n- 作用： 单元格列数\r\n\r\n------------\r\n### defaultRowHeight\r\n- 类型：Number\r\n- 默认值：19\r\n- 作用： 自定义的默认行高，单位为px\r\n\r\n------------\r\n### defaultColWidth\r\n- 类型：Number\r\n- 默认值：73\r\n- 作用： 自定义的默认列宽，单位为px\r\n\r\n------------\r\n### celldata\r\n- 类型：Array\r\n- 默认值：[]\r\n- 作用： 原始单元格数据集，存储sheet中所有单元格中的值，是一个包含`{r:0,c:0,v:{m:\"value\",v:\"value\",ct: {fa: \"General\", t: \"g\"}}}`格式单元格信息的一维数组，只在初始化的时候使用。\r\n\r\n    r代表行，c代表列，v代表该单元格的值，值可以是字符、数字或者对象。\r\n\r\n    Luckysheet在建立的时候会根据 `options.data[i].row` 和 `options.data[i].column` 的行列数量大小新建一个表格data，然后再使用 `data[r][c]=v` 的方式填充表格数据，空数据单元格以null表示。\r\n\r\n    使用celldata初始化完表格后，数据转换为luckysheetfile中的字段[data](#data)，如`luckysheetfile[i].data`,后续操作表格的数据更新，会更新到这个data字段中，celldata不再使用。 \r\n\r\n- 示例：\r\n    ```js\r\n    [{\r\n        \"r\": 0,\r\n        \"c\": 0,\r\n        \"v\": {\r\n            ct: {fa: \"General\", t: \"g\"},\r\n            m:\"value1\",\r\n            v:\"value1\"\r\n        }\r\n    }, {\r\n        \"r\": 0,\r\n        \"c\": 1,\r\n        \"v\": {\r\n            ct: {fa: \"General\", t: \"g\"},\r\n            m:\"value2\",\r\n            v:\"value2\"\r\n        }\r\n    }]\r\n    ```\r\n> 详细了解 [单元格格式](/zh/guide/cell.html)\r\n\r\n------------\r\n### config\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用：表格行高、列宽、合并单元格、边框、隐藏行等设置\r\n\r\n    注意，config如果为空,必须为空对象`{}`,不能为字符串或者null\r\n\r\n#### config.merge\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用：合并单元格设置\r\n- 示例：\r\n    ```js\r\n    {\r\n            \"13_5\": {\r\n                \"r\": 13,\r\n                \"c\": 5,\r\n                \"rs\": 3,\r\n                \"cs\": 1\r\n            },\r\n            \"13_7\": {\r\n                \"r\": 13,\r\n                \"c\": 7,\r\n                \"rs\": 3,\r\n                \"cs\": 2\r\n            },\r\n            \"14_2\": {\r\n                \"r\": 14,\r\n                \"c\": 2,\r\n                \"rs\": 1,\r\n                \"cs\": 2\r\n            }\r\n        }\r\n    ```\r\n    对象中的`key`为`r + '_' + c`的拼接值，`value`为左上角单元格信息: r:行数，c:列数，rs：合并的行数，cs:合并的列数\r\n\r\n#### config.rowlen\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用：每个单元格的行高\r\n- 示例：\r\n    ```js\r\n    \"rowlen\": {\r\n                \"0\": 20,\r\n                \"1\": 20,\r\n                \"2\": 20\r\n            }\r\n    ```\r\n\r\n#### config.columnlen\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用：每个单元格的列宽\r\n- 示例：\r\n    ```js\r\n    \"columnlen\": {\r\n                \"0\": 97,\r\n                \"1\": 115,\r\n                \"2\": 128\r\n            }\r\n    ```\r\n\r\n#### config.rowhidden\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用：隐藏行信息，格式为：`rowhidden[行数]: 0`,\r\n\r\n    `key`指定行数即可，`value`总是为`0`\r\n- 示例：\r\n    ```js\r\n    \"rowhidden\": {\r\n                \"30\": 0,\r\n                \"31\": 0\r\n            }\r\n    ```\r\n\r\n#### config.colhidden\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用：隐藏列\r\n    格式为：`colhidden[列数]: 0`,\r\n\r\n        `key`指定列数即可，`value`总是为`0`\r\n- 示例：\r\n    ```js\r\n    \"colhidden\": {\r\n                \"30\": 0,\r\n                \"31\": 0\r\n            }\r\n    ```\r\n\r\n#### config.borderInfo\r\n- 类型：Array\r\n- 默认值：{}\r\n- 作用：单元格的边框信息\r\n- 示例：\r\n    ```js\r\n    \"borderInfo\": [{\r\n            \"rangeType\": \"cell\",\r\n            \"value\": {\r\n                \"row_index\": 3,\r\n                \"col_index\": 3,\r\n                \"l\": {\r\n                    \"style\": 10,\r\n                    \"color\": \"rgb(255, 0, 0)\"\r\n                },\r\n                \"r\": {\r\n                    \"style\": 10,\r\n                    \"color\": \"rgb(255, 0, 0)\"\r\n                },\r\n                \"t\": {\r\n                    \"style\": 10,\r\n                    \"color\": \"rgb(255, 0, 0)\"\r\n                },\r\n                \"b\": {\r\n                    \"style\": 10,\r\n                    \"color\": \"rgb(255, 0, 0)\"\r\n                }\r\n            }\r\n        },\r\n        {\r\n            \"rangeType\": \"range\",\r\n            \"borderType\": \"border-all\",\r\n            \"style\": \"3\",\r\n            \"color\": \"#0000ff\",\r\n            \"range\": [{\r\n                \"row\": [7, 8],\r\n                \"column\": [2, 3]\r\n            }]\r\n        }, {\r\n            \"rangeType\": \"range\",\r\n            \"borderType\": \"border-inside\",\r\n            \"style\": \"3\",\r\n            \"color\": \"#0000ff\",\r\n            \"range\": [{\r\n                \"row\": [7, 8],\r\n                \"column\": [8, 9]\r\n            }]\r\n        }]\r\n    ```\r\n    范围类型分单个单元格和选区两种情况\r\n    1. 选区 `rangeType: \"range\"`\r\n\r\n        + 边框类型 `borderType：\"border-left\" | \"border-right\" | \"border-top\" | \"border-bottom\" | \"border-all\" | \"border-outside\" | \"border-inside\" | \"border-horizontal\" | \"border-vertical\" | \"border-none\"`，\r\n        + 边框粗细 `style:  1 Thin | 2 Hair | 3 Dotted | 4 Dashed | 5 DashDot | 6 DashDotDot | 7 Double | 8 Medium | 9 MediumDashed | 10 MediumDashDot | 11 MediumDashDotDot | 12 SlantedDashDot | 13 Thick`，和aspose.cells的getLineStyle()的值对应的话，需要自己做个转换，参考 [aspose.cells](https://apireference.aspose.com/cells/net/aspose.cells/cellbordertype)\r\n        + 边框颜色 `color: 16进制颜色值`\r\n        + 选区范围 `range: 行列信息数组`\r\n\r\n    2. 单个单元格 `rangeType：\"cell\"` \r\n        + 单元格的行数和列数索引 `value.row_index: 数字，value.col_index: 数字`\r\n        + 四个边框对象 `value.l:左边框，value.r:右边框，value.t:上边框，value.b:下边框`\r\n        + 边框粗细 `value.l.style: 1 Thin | 2 Hair | 3 Dotted | 4 Dashed | 5 DashDot | 6 DashDotDot | 7 Double | 8 Medium | 9 MediumDashed | 10 MediumDashDot | 11 MediumDashDotDot | 12 SlantedDashDot | 13 Thick`\r\n        + 边框颜色 `value.l.color: 16进制颜色值`\r\n\r\n    更多模板：\r\n\r\n        + ```js\r\n        {\r\n            \"rangeType\": \"range\",\r\n            \"borderType\": \"border-all\",\r\n            \"style\": \"3\",\r\n            \"color\": \"#0000ff\",\r\n            \"range\": [{\r\n                \"row\": [7, 8],\r\n                \"column\": [2, 3]\r\n            }]\r\n        }\r\n        ```\r\n        表示设置范围为`{\"row\": [7, 8],\"column\": [2, 3]}`的选区，类型为所有边框，边框粗细为`Dotted`，颜色为`\"#0000ff\"`\r\n\r\n        + ```js\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 3,\r\n                    \"col_index\": 3,\r\n                    \"l\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            }\r\n            ```\r\n            表示设置单元格`\"D4\"`，上边框/下边框/左边框/右边框都是边框粗细为`\"MediumDashDot\"`,颜色为`\"rgb(255, 0, 0)\"`\r\n\r\n#### config.authority\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用：工作表保护，可以设置当前整个工作表不允许编辑或者部分区域不可编辑，如果要申请编辑权限需要输入密码，自定义配置用户可以操作的类型等。\r\n- 示例：\r\n    ```js        \r\n    \"authority\":{//当前工作表的权限配置\r\n        selectLockedCells:1, //选定锁定单元格\r\n        selectunLockedCells:1, //选定解除锁定的单元格\r\n        formatCells:1, //设置单元格格式\r\n        formatColumns:1, //设置列格式\r\n        formatRows:1, //设置行格式\r\n        insertColumns:1, //插入列\r\n        insertRows:1, //插入行\r\n        insertHyperlinks:1, //插入超链接\r\n        deleteColumns:1, //删除列\r\n        deleteRows:1, //删除行\r\n        sort:1, //排序\r\n        filter:1, //使用自动筛选\r\n        usePivotTablereports:1, //使用数据透视表和报表\r\n        editObjects:1, //编辑对象\r\n        editScenarios:1, //编辑方案    \r\n        sheet:1, //如果为1或true，则该工作表受到保护；如果为0或false，则该工作表不受保护。\r\n        hintText:\"\", //弹窗提示的文字\r\n        algorithmName:\"None\",//加密方案：MD2,MD4,MD5,RIPEMD-128,RIPEMD-160,SHA-1,SHA-256,SHA-384,SHA-512,WHIRLPOOL\r\n        saltValue:null, //密码解密的盐参数，为一个自己定的随机数值\r\n        \r\n        allowRangeList:[{ //区域保护\r\n            name:\"area\", //名称\r\n            password:\"1\", //密码\r\n            hintText:\"\", //提示文字\r\n            algorithmName:\"None\",//加密方案：MD2,MD4,MD5,RIPEMD-128,RIPEMD-160,SHA-1,SHA-256,SHA-384,SHA-512,WHIRLPOOL\r\n            saltValue:null, //密码解密的盐参数，为一个自己定的随机数值\r\n            sqref:\"$C$1:$D$5\" //区域范围\r\n        }],\r\n    },\r\n    ```\r\n\r\n------------\r\n### scrollLeft\r\n- 类型：Number\r\n- 默认值：0\r\n- 作用： 左右滚动条位置\r\n\r\n------------\r\n### scrollTop\r\n- 类型：Number\r\n- 默认值：0\r\n- 作用： 上下滚动条位置\r\n\r\n------------\r\n### luckysheet_select_save\r\n- 类型：Array\r\n- 默认值：[]\r\n- 作用： 选中的区域，支持多选，是一个包含多个选区对象的一维数组\r\n- 示例：\r\n    ```js\r\n    [\r\n        {\r\n            \"row\": [ 0, 1 ],\r\n            \"column\": [ 0, 0 ]\r\n        },\r\n        {\r\n            \"row\": [ 3, 4 ],\r\n            \"column\": [ 1, 2 ]\r\n        },\r\n        {\r\n            \"row\": [ 1, 3 ],\r\n            \"column\": [ 3, 3 ]\r\n        }\r\n    ]\r\n    ```\r\n\r\n------------\r\n### calcChain\r\n- 类型：Array\r\n- 默认值：[]\r\n- 作用： 公式链是一个由用户指定顺序排列的公式信息数组，Luckysheet会根据此顺序来决定公式执行的顺序。\r\n\r\n    注意，在初始化工作簿的时候，如果有单元格包含公式，请务必添加对应单元格位置的公式链，否则Luckysheet无法识别公式。\r\n    \r\n- 示例：\r\n    ```js\r\n    [{\r\n        \"r\": 6, //行数\r\n        \"c\": 3, //列数\r\n        \"index\": 1, //工作表id\r\n        \"func\": [true, 23.75, \"=AVERAGE(D3:D6)\"], //公式信息，包含公式计算结果和公式字符串\r\n        \"color\": \"w\", //\"w\"：采用深度优先算法 \"b\":普通计算\r\n        \"parent\": null,\r\n        \"chidren\": {},\r\n        \"times\": 0\r\n    }, {\r\n        \"r\": 7,\r\n        \"c\": 3,\r\n        \"index\": 1,\r\n        \"func\": [true, 30, \"=MAX(D3:D6)\"],\r\n        \"color\": \"w\",\r\n        \"parent\": null,\r\n        \"chidren\": {},\r\n        \"times\": 0\r\n    }]\r\n    ```\r\n\r\n------------\r\n### isPivotTable\r\n- 类型：Boolean\r\n- 默认值：false\r\n- 作用： 是否数据透视表\r\n\r\n------------\r\n### pivotTable\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用： 数据透视表设置\r\n- 示例：\r\n    ```js\r\n    {\r\n        \"pivot_select_save\": {\r\n            \"row\": [0, 12],\r\n            \"column\": [0, 4]\r\n        },\r\n        \"pivotDataSheetIndex\": 6, //源数据所在的sheet页\r\n        \"column\": [{\r\n            \"index\": 3,\r\n            \"name\": \"subject\",\r\n            \"fullname\": \"subject\"\r\n        }],\r\n        \"row\": [{\r\n            \"index\": 1,\r\n            \"name\": \"student\",\r\n            \"fullname\": \"student\"\r\n        }],\r\n        \"filter\": [],\r\n        \"values\": [{\r\n            \"index\": 4,\r\n            \"name\": \"score\",\r\n            \"fullname\": \"count:score\",\r\n            \"sumtype\": \"COUNTA\",\r\n            \"nameindex\": 0\r\n        }],\r\n        \"showType\": \"column\",\r\n        \"pivotDatas\": [ //数据透视表的源数据\r\n            [\"count:score\", \"science\", \"mathematics\", \"foreign language\", \"English\", \"total\"],\r\n            [\"Alex\", 1, 1, 1, 1, 4],\r\n            [\"Joy\", 1, 1, 1, 1, 4],\r\n            [\"Tim\", 1, 1, 1, 1, 4],\r\n            [\"total\", 3, 3, 3, 3, 12]\r\n        ],\r\n        \"drawPivotTable\": false,\r\n        \"pivotTableBoundary\": [5, 6]\r\n    }\r\n    ```\r\n\r\n------------\r\n### filter_select\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用： 筛选范围。一个选区，一个sheet只有一个筛选范围，类似`luckysheet_select_save`。如果仅仅只是创建一个选区打开筛选功能，则配置这个范围即可，如果还需要进一步设置详细的筛选条件，则需要另外配置同级的 [filter](#filter) 属性。\r\n- 示例：\r\n    ```js\r\n    {\r\n        \r\n        \"row\": [ 2, 6 ],\r\n        \"column\": [ 1, 3 ]\r\n    }\r\n    ```\r\n\r\n------------\r\n### filter\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用： 筛选的具体设置，跟`filter_select`筛选范围是互相搭配的。当你在第一个sheet页创建了一个筛选区域，通过`luckysheet.getLuckysheetfile()[0].filter`也可以看到第一个sheet的筛选配置信息。\r\n\r\n    以下是一个完整的筛选配置案例\r\n    ```js\r\n    {   \r\n        //\"0\"表示第一列\r\n        \"0\": {\r\n            \"caljs\": { // 按条件筛选\r\n                \"value\": \"cellnull\", // 筛选类型\r\n                \"text\": \"Is empty\", // 类型说明\r\n                \"type\": \"0\" // 筛选大类\r\n            },\r\n            \"rowhidden\": { \"3\": 0, \"4\": 0 }, // 隐藏行信息\r\n            \"optionstate\": true, // 是否开启配置\r\n            \"cindex\": 1, // 当前范围列顺序，这里表示第一列\r\n            \"str\": 2, // 范围，起始行\r\n            \"edr\": 6, // 范围，结束行\r\n            \"stc\": 1, // 范围，起始列\r\n            \"edc\": 3 // 范围，结束列\r\n        },\r\n        //\"1\"表示第二列\r\n        \"1\": {\r\n            \"caljs\": {},\r\n            \"rowhidden\": { \"1\": 0},\r\n            \"optionstate\": true,\r\n            \"cindex\": 2, // 当前范围列顺序，这里表示第二列\r\n            \"str\": 2,\r\n            \"edr\": 6,\r\n            \"stc\": 1,\r\n            \"edc\": 3\r\n        }\r\n    }\r\n    ```\r\n    1. `filter[key]`的`key`值，表示是列索引，从0开始，具体设置项中的`cindex`是从1开始，和这里的`key`是同一个意思。\r\n    2. `caljs`用来设置按条件筛选的类型和对应的值，设置生效后，会计算隐藏行信息存储在`rowhidden`中。以下是全部的可设置的类型，其中`value1`和`value2`就是用户自己填的文本信息：\r\n       + `caljs:{value: null, text: \"无\", type: \"0\"}`\r\n       + `caljs:{value: \"cellnull\", text: \"单元格为空\", type: \"0\"}`\r\n       + `caljs:{value: \"cellnonull\", text: \"单元格有数据\", type: \"0\"}`\r\n       + `caljs:{value: \"textinclude\", text: \"文本包含\", type: \"1\", value1: \"Lucky\"}`\r\n       + `caljs:{value: \"textnotinclude\", text: \"文本不包含\", type: \"1\", value1: \"Lucky\"}`\r\n       + `caljs:{value: \"textstart\", text: \"文本开头为\", type: \"1\", value1: \"Lucky\"}`\r\n       + `caljs:{value: \"textend\", text: \"文本结尾为\", type: \"1\", value1: \"Lucky\"}`\r\n       + `caljs:{value: \"textequal\", text: \"文本等于\", type: \"1\", value1: \"Lucky\"}`\r\n       + `caljs:{value: \"dateequal\", text: \"日期等于\", type: \"1\", value1: \"2020-10-16\"}`\r\n       + `caljs:{value: \"datelessthan\", text: \"日期早于\", type: \"1\", value1: \"2020-10-16\"}`\r\n       + `caljs:{value: \"datemorethan\", text: \"日期晚于\", type: \"1\", value1: \"2020-10-16\"}`\r\n       + `caljs:{value: \"morethan\", text: \"大于\", type: \"1\", value1: \"10\"}`\r\n       + `caljs:{value: \"moreequalthan\", text: \"大于等于\", type: \"1\", value1: \"10\"}`\r\n       + `caljs:{value: \"lessthan\", text: \"小于\", type: \"1\", value1: \"10\"}`\r\n       + `caljs:{value: \"lessequalthan\", text: \"小于等于\", type: \"1\", value1: \"10\"}`\r\n       + `caljs:{value: \"equal\", text: \"等于\", type: \"1\", value1: \"10\"}`\r\n       + `caljs:{value: \"noequal\", text: \"不等于\", type: \"1\", value1: \"10\"}`\r\n       + `caljs:{value: \"include\", text: \"介于\", type: \"2\", value1: \"15\", value2: \"25\"}`\r\n       + `caljs:{value: \"noinclude\", text: \"不在其中\", type: \"2\", value1: \"15\", value2: \"25\"}`\r\n    3. `rowhidden`是存储的隐藏行信息，但是如果没有设置`caljs`按条件筛选，则表明是设置了按颜色筛选（如果行之间有颜色区分的话）和按值进行筛选。所以可以看出，`caljs`的优先级大于`rowhidden`。\r\n    4. `optionstate`表示是否开启配置，这是一个内部标识，直接设置`true`即可。\r\n    5. `cindex`表示当前设置的列顺序，从1开始计数，和`filter[key]`的`key`值形成对应，结果是`key`+1。\r\n    6. `str`是起始行，`edr`是结束行，`stc`是起始列，`edc`是结束列，四个数字代表整个筛选范围，与`filter_select`的内容保持一致即可。\r\n\r\n------------\r\n### luckysheet_alternateformat_save\r\n- 类型：Array\r\n- 默认值：[]\r\n- 作用： 交替颜色配置\r\n- 示例：\r\n    ```js\r\n    [{\r\n        \"cellrange\": { //单元格范围\r\n            \"row\": [1, 6],\r\n            \"column\": [1, 5]\r\n        },\r\n        \"format\": {\r\n            \"head\": { //页眉颜色\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#5ed593\"\r\n            },\r\n            \"one\": { //第一种颜色\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#ffffff\"\r\n            },\r\n            \"two\": { //第二种颜色\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#e5fbee\"\r\n            },\r\n            \"foot\": { //页脚颜色\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#a5efcc\"\r\n            }\r\n        },\r\n        \"hasRowHeader\": false, //含有页眉\r\n        \"hasRowFooter\": false //含有页脚\r\n    }, {\r\n        \"cellrange\": {\r\n            \"row\": [1, 6],\r\n            \"column\": [8, 12]\r\n        },\r\n        \"format\": {\r\n            \"head\": {\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#5599fc\"\r\n            },\r\n            \"one\": {\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#ffffff\"\r\n            },\r\n            \"two\": {\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#ecf2fe\"\r\n            },\r\n            \"foot\": {\r\n                \"fc\": \"#000\",\r\n                \"bc\": \"#afcbfa\"\r\n            }\r\n        },\r\n        \"hasRowHeader\": false,\r\n        \"hasRowFooter\": false\r\n    }]\r\n    ```\r\n\r\n------------\r\n### luckysheet_alternateformat_save_modelCustom\r\n- 类型：Array\r\n- 默认值：[]\r\n- 作用：自定义交替颜色，包含多个自定义交替颜色的配置\r\n- 示例：\r\n    ```js\r\n    [{\r\n        \"head\": { //页眉颜色\r\n            \"fc\": \"#6aa84f\",\r\n            \"bc\": \"#ffffff\"\r\n        },\r\n        \"one\": { //第一种颜色\r\n            \"fc\": \"#000\",\r\n            \"bc\": \"#ffffff\"\r\n        },\r\n        \"two\": { //第二种颜色\r\n            \"fc\": \"#000\",\r\n            \"bc\": \"#e5fbee\"\r\n        },\r\n        \"foot\": { //页脚颜色\r\n            \"fc\": \"#000\",\r\n            \"bc\": \"#a5efcc\"\r\n        }\r\n    }]\r\n    ```\r\n\r\n------------\r\n### luckysheet_conditionformat_save\r\n- 类型：Array\r\n- 默认值：[]\r\n- 作用： 条件格式配置信息，包含多个条件格式配置对象的一维数组，\r\n\r\n    type: \"default\": 突出显示单元格规则和项目选区规则，\r\n\r\n    \"dataBar\":数据条，\r\n\r\n    \"icons\":图标集，\r\n\r\n    \"colorGradation\": 色阶\r\n\r\n    API中对此设置也有介绍[API setRangeConditionalFormat](/zh/guide/api.html)\r\n- 示例：\r\n    ```js\r\n    [\r\n        {\r\n            \"type\": \"default\",\r\n            \"cellrange\": [ //应用的范围\r\n                {\r\n                    \"row\": [ 2, 7 ],\r\n                    \"column\": [ 2, 2 ]\r\n                }\r\n            ],\r\n            \"format\": { //type 为 default 时 应设置文本颜色和单元格颜色\r\n                \"textColor\": \"#000000\",\r\n                \"cellColor\": \"#ff0000\"\r\n            },\r\n            \"conditionName\": \"betweenness\", //类型\r\n            \"conditionRange\": [ //条件值所在单元格\r\n                {\r\n                    \"row\": [ 4, 4 ],\r\n                    \"column\": [ 2, 2 ]\r\n                },\r\n                {\r\n                    \"row\": [ 6, 6 ],\r\n                    \"column\": [ 2, 2 ]\r\n                }\r\n            ],\r\n            \"conditionValue\": [ 2, 4\r\n            ] //自定义传入的条件值\r\n        },\r\n        {\r\n            \"type\": \"dataBar\",\r\n            \"cellrange\": [\r\n                {\r\n                    \"row\": [ 10, 15 ],\r\n                    \"column\": [ 10, 11 ]\r\n                }\r\n            ],\r\n            \"format\": [\r\n                \"#6aa84f\",\r\n                \"#ffffff\"\r\n            ]\r\n        },\r\n        {\r\n            \"type\": \"icons\",\r\n            \"cellrange\": [\r\n                {\r\n                    \"row\": [ 19, 23 ],\r\n                    \"column\": [ 2, 2 ]\r\n                }\r\n            ],\r\n            \"format\": {\r\n                \"len\": \"3\",\r\n                \"leftMin\": \"0\",\r\n                \"top\": \"0\"\r\n            }\r\n        },\r\n        {\r\n            \"type\": \"colorGradation\",\r\n            \"cellrange\": [\r\n                {\r\n                    \"row\": [ 10, 15 ],\r\n                    \"column\": [ 6, 6 ]\r\n                }\r\n            ],\r\n            \"format\": [\r\n                \"rgb(99, 190, 123)\",\r\n                \"rgb(255, 235, 132)\",\r\n                \"rgb(248, 105, 107)\"\r\n            ]\r\n        }\r\n    ]\r\n    ```\r\n\r\n------------\r\n### frozen\r\n- 类型：Array\r\n- 默认值：[]\r\n- 作用： 冻结行列设置，分为6种类型\r\n    1. \"row\": 冻结首行\r\n    2. \"column\": 冻结首列\r\n    3. \"both\": 冻结行列\r\n    4. \"rangeRow\": 冻结行到选区\r\n    5. \"rangeColumn\": 冻结列到选区\r\n    6. \"rangeBoth\": 冻结行列到选区\r\n    7. \"cancel\": 取消冻结\r\n\r\n    当设置冻结到选区的时候，需要设置开启冻结的单元格位置，格式为`{ row_focus:0, column_focus:0 }`，意为当前激活的单元格的行数和列数。\r\n\r\n    sheet新的配置属性，存储更语义化的配置，用于初始化和传给后端。\r\n    \r\n    注意一点，luckysheetfile中还有一个配置freezen，其中的freezenhorizontaldata仍然用作本地数据，但是不发给后台存储，只做本地调试。\r\n\r\n- 示例：\r\n    - 冻结首行\r\n    ```json\r\n    {\r\n        type: 'row'\r\n    }\r\n    ```\r\n    - 冻结行到`'A1'`选区\r\n     ```json\r\n    {\r\n        type: 'rangeRow',\r\n        range: {row_focus: 0, column_focus: 0}\r\n    }\r\n    ```\r\n    - 冻结行列到`'B2'`选区\r\n     ```json\r\n    {\r\n        type: 'rangeBoth',\r\n        range: {row_focus: 1, column_focus: 1}\r\n    }\r\n    ```\r\n\r\n------------\r\n### chart\r\n- 类型：Array\r\n- 默认值：[]\r\n- 作用： 图表配置，参照chartMix的配置格式，允许只设置想要的图表属性，一个完整的配置案例如下。\r\n- 示例：\r\n    :::::: details\r\n    ```json\r\n    {\r\n        \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n        \"width\": 400,\r\n        \"height\": 250,\r\n        \"left\": 20,\r\n        \"top\": 120,\r\n        \"sheetIndex\": \"Sheet_6az6nei65t1i_1596209937084\",\r\n        \"needRangeShow\": true,\r\n        \"chartOptions\": {\r\n            \"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n            \"chartAllType\": \"echarts|line|default\",\r\n            \"rangeArray\": [ { \"row\": [ 0, 4 ], \"column\": [ 0, 7 ] } ],\r\n            \"rangeColCheck\": { \"exits\": true, \"range\": [ 0, 0 ] },\r\n            \"rangeRowCheck\": { \"exits\": true, \"range\": [ 0, 0 ] },\r\n            \"rangeConfigCheck\": false,\r\n            \"defaultOption\": {\r\n                \"title\": {\r\n                    \"show\": false,\r\n                    \"text\": \"默认标题\",\r\n                    \"label\": {\r\n                        \"fontSize\": 12,\r\n                        \"color\": \"#333\",\r\n                        \"fontFamily\": \"sans-serif\",\r\n                        \"fontGroup\": [],\r\n                        \"cusFontSize\": 12\r\n                    },\r\n                    \"position\": {\r\n                        \"value\": \"left-top\",\r\n                        \"offsetX\": 40,\r\n                        \"offsetY\": 50\r\n                    }\r\n                },\r\n                \"subtitle\": {\r\n                    \"show\": false,\r\n                    \"text\": \"\",\r\n                    \"label\": {\r\n                        \"fontSize\": 12,\r\n                        \"color\": \"#333\",\r\n                        \"fontFamily\": \"sans-serif\",\r\n                        \"fontGroup\": [],\r\n                        \"cusFontSize\": 12\r\n                    },\r\n                    \"distance\": {\r\n                        \"value\": \"auto\",\r\n                        \"cusGap\": 40\r\n                    }\r\n                },\r\n                \"config\": {\r\n                    \"color\": \"transparent\",\r\n                    \"fontFamily\": \"Sans-serif\",\r\n                    \"grid\": {\r\n                        \"value\": \"normal\",\r\n                        \"top\": 5,\r\n                        \"left\": 10,\r\n                        \"right\": 20,\r\n                        \"bottom\": 10\r\n                    }\r\n                },\r\n                \"legend\": {\r\n                    \"show\": true,\r\n                    \"selectMode\": \"multiple\",\r\n                    \"selected\": [\r\n                        {\r\n                            \"seriesName\": \"衣服\",\r\n                            \"isShow\": true\r\n                        },\r\n                        {\r\n                            \"seriesName\": \"食材\",\r\n                            \"isShow\": true\r\n                        },\r\n                        {\r\n                            \"seriesName\": \"图书\",\r\n                            \"isShow\": true\r\n                        }\r\n                    ],\r\n                    \"label\": {\r\n                        \"fontSize\": 12,\r\n                        \"color\": \"#333\",\r\n                        \"fontFamily\": \"sans-serif\",\r\n                        \"fontGroup\": [],\r\n                        \"cusFontSize\": 12\r\n                    },\r\n                    \"position\": {\r\n                        \"value\": \"left-top\",\r\n                        \"offsetX\": 40,\r\n                        \"offsetY\": 50,\r\n                        \"direction\": \"horizontal\"\r\n                    },\r\n                    \"width\": {\r\n                        \"value\": \"auto\",\r\n                        \"cusSize\": 25\r\n                    },\r\n                    \"height\": {\r\n                        \"value\": \"auto\",\r\n                        \"cusSize\": 14\r\n                    },\r\n                    \"distance\": {\r\n                        \"value\": \"auto\",\r\n                        \"cusGap\": 10\r\n                    },\r\n                    \"itemGap\": 10,\r\n                    \"data\": [\r\n                        \"Mon\",\r\n                        \"Tues\",\r\n                        \"Wed\",\r\n                        \"Thur\",\r\n                        \"Fri\",\r\n                        \"Sat\",\r\n                        \"Sun\"\r\n                    ]\r\n                },\r\n                \"tooltip\": {\r\n                    \"show\": true,\r\n                    \"label\": {\r\n                        \"fontSize\": 12,\r\n                        \"color\": \"#333\",\r\n                        \"fontFamily\": \"sans-serif\",\r\n                        \"fontGroup\": [],\r\n                        \"cusFontSize\": 12\r\n                    },\r\n                    \"backgroundColor\": \"rgba(50,50,50,0.7)\",\r\n                    \"triggerOn\": \"mousemove\",\r\n                    \"triggerType\": \"item\",\r\n                    \"axisPointer\": {\r\n                        \"type\": \"line\",\r\n                        \"style\": {\r\n                            \"color\": \"#555\",\r\n                            \"width\": \"normal\",\r\n                            \"type\": \"solid\"\r\n                        }\r\n                    },\r\n                    \"format\": [\r\n                        {\r\n                            \"seriesName\": \"衣服\",\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\"\r\n                        },\r\n                        {\r\n                            \"seriesName\": \"食材\",\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\"\r\n                        },\r\n                        {\r\n                            \"seriesName\": \"图书\",\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\"\r\n                        }\r\n                    ],\r\n                    \"position\": \"auto\"\r\n                },\r\n                \"axis\": {\r\n                    \"axisType\": \"xAxisDown\",\r\n                    \"xAxisUp\": {\r\n                        \"show\": false,\r\n                        \"title\": {\r\n                            \"showTitle\": false,\r\n                            \"text\": \"\",\r\n                            \"nameGap\": 15,\r\n                            \"rotate\": 0,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"fzPosition\": \"end\"\r\n                        },\r\n                        \"name\": \"显示X轴\",\r\n                        \"inverse\": false,\r\n                        \"tickLine\": {\r\n                            \"show\": true,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tick\": {\r\n                            \"show\": true,\r\n                            \"position\": \"outside\",\r\n                            \"length\": 5,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tickLabel\": {\r\n                            \"show\": true,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"rotate\": 0,\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"optimize\": 0,\r\n                            \"distance\": 0,\r\n                            \"min\": \"auto\",\r\n                            \"max\": \"auto\",\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\"\r\n                        },\r\n                        \"netLine\": {\r\n                            \"show\": false,\r\n                            \"width\": 1,\r\n                            \"type\": \"solid\",\r\n                            \"color\": \"auto\",\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            }\r\n                        },\r\n                        \"netArea\": {\r\n                            \"show\": false,\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            },\r\n                            \"colorOne\": \"auto\",\r\n                            \"colorTwo\": \"auto\"\r\n                        },\r\n                        \"axisLine\": {\r\n                            \"onZero\": false\r\n                        }\r\n                    },\r\n                    \"xAxisDown\": {\r\n                        \"show\": true,\r\n                        \"title\": {\r\n                            \"showTitle\": false,\r\n                            \"text\": \"\",\r\n                            \"nameGap\": 15,\r\n                            \"rotate\": 0,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"fzPosition\": \"end\"\r\n                        },\r\n                        \"name\": \"显示X轴\",\r\n                        \"inverse\": false,\r\n                        \"tickLine\": {\r\n                            \"show\": true,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tick\": {\r\n                            \"show\": true,\r\n                            \"position\": \"outside\",\r\n                            \"length\": 5,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tickLabel\": {\r\n                            \"show\": true,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"rotate\": 0,\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"optimize\": 0,\r\n                            \"distance\": 0,\r\n                            \"min\": null,\r\n                            \"max\": null,\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\"\r\n                        },\r\n                        \"netLine\": {\r\n                            \"show\": false,\r\n                            \"width\": 1,\r\n                            \"type\": \"solid\",\r\n                            \"color\": \"auto\",\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            }\r\n                        },\r\n                        \"netArea\": {\r\n                            \"show\": false,\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            },\r\n                            \"colorOne\": \"auto\",\r\n                            \"colorTwo\": \"auto\"\r\n                        },\r\n                        \"data\": [\r\n                            \"BUS\",\r\n                            \"UBER\",\r\n                            \"TAXI\",\r\n                            \"SUBWAY\"\r\n                        ],\r\n                        \"type\": \"category\"\r\n                    },\r\n                    \"yAxisLeft\": {\r\n                        \"show\": true,\r\n                        \"title\": {\r\n                            \"showTitle\": false,\r\n                            \"text\": \"\",\r\n                            \"nameGap\": 15,\r\n                            \"rotate\": 0,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"fzPosition\": \"end\"\r\n                        },\r\n                        \"name\": \"显示Y轴\",\r\n                        \"inverse\": false,\r\n                        \"tickLine\": {\r\n                            \"show\": true,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tick\": {\r\n                            \"show\": true,\r\n                            \"position\": \"outside\",\r\n                            \"length\": 5,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tickLabel\": {\r\n                            \"show\": true,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"rotate\": 0,\r\n                            \"formatter\": {\r\n                                \"prefix\": \"\",\r\n                                \"suffix\": \"\",\r\n                                \"ratio\": 1,\r\n                                \"digit\": \"auto\"\r\n                            },\r\n                            \"split\": 5,\r\n                            \"min\": null,\r\n                            \"max\": null,\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\",\r\n                            \"distance\": 0\r\n                        },\r\n                        \"netLine\": {\r\n                            \"show\": false,\r\n                            \"width\": 1,\r\n                            \"type\": \"solid\",\r\n                            \"color\": \"auto\",\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            }\r\n                        },\r\n                        \"netArea\": {\r\n                            \"show\": false,\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            },\r\n                            \"colorOne\": \"auto\",\r\n                            \"colorTwo\": \"auto\"\r\n                        },\r\n                        \"type\": \"value\"\r\n                    },\r\n                    \"yAxisRight\": {\r\n                        \"show\": false,\r\n                        \"title\": {\r\n                            \"showTitle\": false,\r\n                            \"text\": \"\",\r\n                            \"nameGap\": 15,\r\n                            \"rotate\": 0,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"fzPosition\": \"end\"\r\n                        },\r\n                        \"name\": \"显示Y轴\",\r\n                        \"inverse\": false,\r\n                        \"tickLine\": {\r\n                            \"show\": true,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tick\": {\r\n                            \"show\": true,\r\n                            \"position\": \"outside\",\r\n                            \"length\": 5,\r\n                            \"width\": 1,\r\n                            \"color\": \"auto\"\r\n                        },\r\n                        \"tickLabel\": {\r\n                            \"show\": true,\r\n                            \"label\": {\r\n                                \"fontSize\": 12,\r\n                                \"color\": \"#333\",\r\n                                \"fontFamily\": \"sans-serif\",\r\n                                \"fontGroup\": [],\r\n                                \"cusFontSize\": 12\r\n                            },\r\n                            \"rotate\": 0,\r\n                            \"formatter\": {\r\n                                \"prefix\": \"\",\r\n                                \"suffix\": \"\",\r\n                                \"ratio\": 1,\r\n                                \"digit\": \"auto\"\r\n                            },\r\n                            \"split\": 5,\r\n                            \"min\": null,\r\n                            \"max\": null,\r\n                            \"prefix\": \"\",\r\n                            \"suffix\": \"\",\r\n                            \"ratio\": 1,\r\n                            \"digit\": \"auto\",\r\n                            \"distance\": 0\r\n                        },\r\n                        \"netLine\": {\r\n                            \"show\": false,\r\n                            \"width\": 1,\r\n                            \"type\": \"solid\",\r\n                            \"color\": \"auto\",\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            }\r\n                        },\r\n                        \"netArea\": {\r\n                            \"show\": false,\r\n                            \"interval\": {\r\n                                \"value\": \"auto\",\r\n                                \"cusNumber\": 0\r\n                            },\r\n                            \"colorOne\": \"auto\",\r\n                            \"colorTwo\": \"auto\"\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        },\r\n        \"isShow\": true\r\n    }\r\n    ```\r\n    :::\r\n\r\n------------\r\n### zoomRatio\r\n- 类型：Number\r\n- 默认值：1\r\n- 作用： 此sheet页的缩放比例，为0~1之间的二位小数数字。比如`0.1`、`0.56`\r\n\r\n------------\r\n### image\r\n- 类型：Array\r\n- 默认值：[]\r\n- 作用： 插入表格中图片信息，包含图片地址、宽高、位置、裁剪等信息\r\n- 示例：\r\n    以下为一个`imageItem`案例，通常一个工作表中可能存在多个图片，所以`image`的格式为数组`[imageItem,imageItem,...]`\r\n    ```json\r\n    {\r\n        type: '3',  //1移动并调整单元格大小 2移动并且不调整单元格的大小 3不要移动单元格并调整其大小\r\n        src: '',  //图片url\r\n        originWidth: 1484,  //图片原始宽度\r\n        originHeight: 834,  //图片原始高度\r\n        default: {\r\n            width: 293,  //图片 宽度\r\n            height: 196,  //图片 高度\r\n            left: 409,  //图片离表格左边的 位置\r\n            top: 248,  //图片离表格顶部的 位置\r\n        },\r\n        crop: {\r\n            width: 293,  //图片裁剪后 宽度\r\n            height: 196,  //图片裁剪后 高度\r\n            offsetLeft: 0,  //图片裁剪后离未裁剪时 左边的位移\r\n            offsetTop: 0,  //图片裁剪后离未裁剪时 顶部的位移\r\n        },\r\n        isFixedPos: false,  //固定位置\r\n        fixedLeft: 507,  //固定位置 左位移\r\n        fixedTop: 141,  //固定位置 右位移\r\n        border: {\r\n            width: 0,  //边框宽度\r\n            radius: 0,  //边框半径\r\n            style: 'solid',  //边框类型\r\n            color: '#000',  //边框颜色\r\n        }\r\n    }\r\n    ```\r\n------------\r\n### showGridLines\r\n- 类型：Number\r\n- 默认值：1\r\n- 作用：是否显示网格线，`1`表示显示，`0`表示隐藏\r\n\r\n------------\r\n### dataVerification\r\n- 类型：Object\r\n- 默认值：{}\r\n- 作用：数据验证的配置信息。以下列出了所有需要设置的详细字段：\r\n  + {String} [type]: 类型；值可为\r\n    + `\"dropdown\"`(下拉列表)\r\n    + `\"checkbox\"`(复选框)\r\n    + `\"number\"`(数字)\r\n    + `\"number_integer\"`(数字-整数)\r\n    + `\"number_decimal\"`(数字-小数)\r\n    + `\"text_content\"`(文本-内容)\r\n    + `\"text_length\"`(文本-长度)\r\n    + `\"date\"`(日期)\r\n    + `\"validity\"`(有效性)；\r\n  + {String | Null} [type2]: 条件类型；\r\n    + 类型`type`值为`\"checkbox\"`时，`type2`值可为        \r\n        + `null`；\r\n    + 类型`type`值为`\"dropdown\"`时，`type2`值可为\r\n        + `true` （多选） `false` （单选）\r\n    + 类型`type`值为`\"number\"/\"number_integer\"/\"number_decimal\"/\"text_length\"`时，`type2`值可为\r\n      + `\"bw\"`(介于)\r\n      + `\"nb\"`(不介于)\r\n      + `\"eq\"`(等于)\r\n      + `\"ne\"`(不等于)\r\n      + `\"gt\"`(大于)\r\n      + `\"lt\"`(小于)\r\n      + `\"gte\"`(大于等于)\r\n      + `\"lte\"`(小于等于)\r\n    + 类型`type`值为`\"text_content\"`时，`type2`值可为\r\n      + `\"include\"`(包括)\r\n      + `\"exclude\"`(不包括)\r\n      + `\"equal\"`(等于)\r\n    + 类型`type`值为`\"date\"`时，`type2`值可为\r\n      + `\"bw\"`(介于)\r\n      + `\"nb\"`(不介于)\r\n      + `\"eq\"`(等于)\r\n      + `\"ne\"`(不等于)\r\n      + `\"bf\"`(早于)\r\n      + `\"nbf\"`(不早于)\r\n      + `\"af\"`(晚于)\r\n      + `\"naf\"`(不晚于)\r\n    + 类型`type`值为`\"validity\"`时，`type2`值可为\r\n      + `\"card\"`(身份证号码)\r\n      + `\"phone\"`(手机号)；\r\n  + {String | Number} [value1]: 条件值1；\r\n    + 类型`type`值为`\"dropdown\"`时，`value1`值可为选区或以英文逗号隔开的字符串，如`\"1,2,3\"`或者`\"A1:B2\"`；\r\n    + 类型`type`值为`\"validity\"`时，`value1`值可为空；\r\n    + 其他类型时`value1`值为数值或字符串；\r\n  + {String | Number} [value2]: 条件值2；\r\n    + 类型`type`值为`\"checkbox\"`或者条件类型`type2`值为`\"bw\"`、`\"nb\"`时有`value2`值，条件值为数值或日期时，条件值2要大于等于条件值1；其它情况可为空；\r\n  + {Boolean} [remote]: 自动远程获取选项；默认为`false`；\r\n  + {Boolean} [prohibitInput]: 输入数据无效时禁止输入；默认为`false`；\r\n  + {Boolean} [hintShow]: 选中单元格时显示提示语；默认为`false`；\r\n  + {String} [hintText]: 提示语文本；`hintShow`为`true`时需配置；\r\n  + {Boolean} [checked]: 是否勾选中复选框；`type`为`checkbox`时需配置；\r\n\r\n    一个完整的配置案例请参考源码DEMO示例 [/src/demoData/sheetDataVerification.js](https://github.com/mengshukeji/Luckysheet/blob/master/src/demoData/sheetDataVerification.js)\r\n------------\r\n## 调试信息\r\n\r\n初始化所需要的参数，会从简洁的角度出发来考虑设计，但是本地存储的参数则不同。\r\n\r\nLuckysheet在初始化完成之后进行的一系列操作，会将更多本地参数存储在luckysheetfile中，作为本地使用的参数，实现一些类似Store数据中心的作用。比如，freezen的参数格式也会变化。\r\n\r\n此时的luckysheetfile包含很多非初始化使用的本地参数，可用于调试代码、本地状态分析。如下展示了更丰富luckysheetfile信息，可通过方法 `luckysheet.getluckysheetfile()`获得：\r\n\r\n::: details\r\n```json\r\n[\r\n    {\r\n        \"name\": \"Cell\", //工作表名称\r\n        \"color\": \"\", //工作表颜色\r\n        \"index\": 0, //工作表索引\r\n        \"status\": 1, //激活状态\r\n        \"order\": 0, //工作表的下标\r\n        \"hide\": 0,//是否隐藏\r\n        \"row\": 36, //行数\r\n        \"column\": 18, //列数\r\n        \"celldata\": [], //初始化使用的单元格数据\r\n        \"config\": {\r\n            \"merge\":{}, //合并单元格\r\n            \"rowlen\":{}, //表格行高\r\n            \"columnlen\":{}, //表格列宽\r\n            \"rowhidden\":{}, //隐藏行\r\n            \"colhidden\":{}, //隐藏列\r\n            \"borderInfo\":{}, //边框\r\n            \"authority\":{}, //工作表保护\r\n        },\r\n        \"scrollLeft\": 0, //左右滚动条位置\r\n        \"scrollTop\": 315, //上下滚动条位置\r\n        \"luckysheet_select_save\": [], //选中的区域\r\n        \"calcChain\": [],//公式链\r\n        \"isPivotTable\":false,//是否数据透视表\r\n        \"pivotTable\":{},//数据透视表设置\r\n        \"filter_select\": {},//筛选范围\r\n        \"filter\": null,//筛选配置\r\n        \"luckysheet_alternateformat_save\": [], //交替颜色\r\n        \"luckysheet_alternateformat_save_modelCustom\": [], //自定义交替颜色\t\r\n        \"luckysheet_conditionformat_save\": {},//条件格式\r\n        \"frozen\": {}, //冻结行列配置\r\n        \"freezen\": {}, //冻结行列的渲染数据存储\r\n        \"chart\": [], //图表配置\r\n        \"zoomRatio\":1, // 缩放比例\r\n        \"image\":[], //图片\r\n        \"showGridLines\": 1, //是否显示网格线\r\n        \"dataVerification\":{} //数据验证配置\r\n        \r\n\r\n        \"visibledatarow\": [], //所有行的位置\r\n        \"visibledatacolumn\": [], //所有列的位置\r\n        \"ch_width\": 2322, //工作表区域的宽度\r\n        \"rh_height\": 949, //工作表区域的高度\r\n        \"load\": \"1\", //已加载过此sheet的标识\r\n        \"data\": [], //更新和存储使用的单元格数据\r\n    },\r\n    {\r\n        \"name\": \"Sheet2\",\r\n        \"color\": \"\",\r\n        \"index\": 1,\r\n        \"status\": 0,\r\n        \"order\": 1,\r\n        \"celldata\": [],\r\n        \"config\": {}\r\n    },\r\n    {\r\n        \"name\": \"Sheet3\",\r\n        \"color\": \"\",\r\n        \"index\": 2,\r\n        \"status\": 0,\r\n        \"order\": 2,\r\n        \"celldata\": [],\r\n        \"config\": {},\r\n    }\r\n]\r\n```\r\n:::\r\n\r\n### visibledatarow\r\n- 类型：Number\r\n- 默认值：[]\r\n- 作用： 所有行的位置信息，递增的行位置数据，初始化无需设置\r\n\r\n------------\r\n### visibledatacolumn\r\n- 类型：Number\r\n- 默认值：[]\r\n- 作用： 所有列的位置信息，递增的列位置数据，初始化无需设置\r\n\r\n------------\r\n### ch_width\r\n- 类型：Number\r\n- 默认值：2322\r\n- 作用： 整个工作表区域的宽度(包含边界的灰色区域)，初始化无需设置\r\n\r\n------------\r\n### rh_height\r\n- 类型：Number\r\n- 默认值：2322\r\n- 作用： 整个工作表区域的高度(包含边界的灰色区域)，初始化无需设置\r\n\r\n------------\r\n### load\r\n- 类型：Number\r\n- 默认值：0\r\n- 作用： 当前sheet是否加载过，内部标识，初始化无需设置\r\n\r\n------------\r\n### data\r\n- 类型：Array\r\n- 默认值：[]\r\n- 作用： 初始化时从celldata转换而来，后续操作表格的数据更新，会更新到这个data字段中，初始化无需设置\r\n- 示例：\r\n    以下是一个二行二列的数据\r\n    ```json\r\n    [\r\n        [{\r\n            ct: {fa: \"General\", t: \"g\"},\r\n            m:\"value1\",\r\n            v:\"value1\"\r\n        }, {\r\n            ct: {fa: \"General\", t: \"g\"},\r\n            m:\"value2\",\r\n            v:\"value2\"\r\n        }],\r\n        [{\r\n            ct: {fa: \"General\", t: \"g\"},\r\n            m:\"value3\",\r\n            v:\"value3\"\r\n        }, {\r\n            ct: {fa: \"General\", t: \"g\"},\r\n            m:\"value4\",\r\n            v:\"value4\"\r\n        }]\r\n    ]\r\n\r\n    ```\r\n\r\n------------\r\n"
  },
  {
    "path": "gulpfile.js",
    "content": "const gulp = require('gulp');\r\n// gulp core function\r\nconst { src, dest, series, parallel, watch } = require('gulp');\r\n// gulp compress js\r\nconst uglify = require('gulp-uglify');\r\n// gulp judgment\r\nconst gulpif = require('gulp-if');\r\n// gulp compress css\r\nconst cleanCSS = require('gulp-clean-css');\r\n// Delete Files\r\nconst del = require('delete');\r\n// Refresh the browser in real time\r\nconst browserSync = require('browser-sync').create();\r\nconst reload = browserSync.reload;\r\n// proxy\r\nconst { createProxyMiddleware } = require('http-proxy-middleware');\r\n// According to html reference, files are merged\r\n// const useref = require('gulp-useref');\r\n// File merge\r\nconst concat = require('gulp-concat');\r\n// rollup packaging, processing es6 modules\r\nconst { rollup } = require('rollup');\r\n// rollup looks for node_modules module\r\nconst { nodeResolve } = require('@rollup/plugin-node-resolve');\r\n// rollup converts commonjs module to es6 module\r\nconst commonjs = require('@rollup/plugin-commonjs');\r\n// rollup code compression\r\nconst terser = require('rollup-plugin-terser').terser;\r\n// rollup babel plugin, support the latest ES grammar\r\nconst babel = require('@rollup/plugin-babel').default;\r\n// const gulpBabel = require('gulp-babel');\r\n// Distinguish development and production environments\r\nconst production = process.env.NODE_ENV === 'production' ? true : false;\r\n\r\nconst pkg = require('./package.json');\r\nconst banner = `/*! @preserve\r\n * ${pkg.name}\r\n * version: ${pkg.version}\r\n * https://github.com/mengshukeji/Luckysheet\r\n */`;\r\n\r\n// uglify js Compression configuration https://github.com/mishoo/UglifyJS#minify-options\r\nconst uglifyOptions = {\r\n    compress: {\r\n        drop_console: true\r\n    }\r\n}\r\n\r\n// babel config\r\nconst babelConfig = {\r\n    compact:false,\r\n    babelHelpers: 'bundled',\r\n    exclude: 'node_modules/**', // Only compile our source code\r\n    plugins: [\r\n    ],\r\n    presets: [\r\n        ['@babel/preset-env', {\r\n            useBuiltIns: 'usage',\r\n            corejs: 3,\r\n            targets: {\r\n                chrome: 58,\r\n                ie: 11\r\n            }\r\n        }]\r\n    ]\r\n};\r\n\r\n// file handler paths\r\nconst paths = {\r\n    // static resources,contains index.html, fonts and images,and extension plugins dependency\r\n    staticHtml: ['src/*.html'],\r\n    staticFonts: ['src/fonts/**'],\r\n    staticAssets: ['src/assets/**'],\r\n    staticImages: ['src/plugins/images/*.png'],\r\n    staticExpendPlugins: ['src/expendPlugins/**', '!src/expendPlugins/**/plugin.js'],\r\n    staticDemoData: ['src/demoData/*.js'],\r\n    staticCssImages: ['src/css/**','!src/css/*.css'],\r\n\r\n    // static resources dest\r\n    destStaticHtml: ['dist'],\r\n    destStaticFonts: ['dist/fonts'],\r\n    destStaticAssets: ['dist/assets'],\r\n    destStaticImages: ['dist/plugins/images'],\r\n    destStaticExpendPlugins: ['dist/expendPlugins'],\r\n    destStaticDemoData: ['dist/demoData'],\r\n    destStaticCssImages: ['dist/css'],\r\n\r\n    //core es module\r\n    core: ['src/**/*.js','!src/demoData/*.js','src/expendPlugins/**/plugin.js','!src/plugins/js/*.js'],\r\n\r\n     //plugins src\r\n    pluginsCss: ['src/plugins/css/*.css'],\r\n    plugins: ['src/plugins/*.css'],\r\n    css:['src/css/*.css','node_modules/flatpickr/dist/themes/light.css'],\r\n    pluginsJs:[\r\n        'node_modules/jquery/dist/jquery.min.js',\r\n        'node_modules/uuid/dist/umd/uuid.min.js',\r\n        'src/plugins/js/clipboard.min.js',\r\n        'src/plugins/js/spectrum.min.js',\r\n        'src/plugins/js/jquery-ui.min.js',\r\n        'src/plugins/js/jquery.mousewheel.min.js',\r\n        // 'src/plugins/js/numeral.min.js',\r\n        'src/plugins/js/html2canvas.min.js',\r\n        'src/plugins/js/localforage.min.js',\r\n        'src/plugins/js/lodash.min.js',\r\n        'src/plugins/js/jstat.min.js',\r\n        'src/plugins/js/crypto-api.min.js',\r\n        'src/plugins/js/jquery.sPage.min.js'\r\n    ],\r\n\r\n    //plugins concat\r\n    concatPluginsCss: 'pluginsCss.css',\r\n    concatPlugins: 'plugins.css',\r\n    concatCss: 'luckysheet.css',\r\n    concatPluginsJs: 'plugin.js',\r\n\r\n    //plugins dest\r\n    destPluginsCss: ['dist/plugins/css'],\r\n    destPlugins: ['dist/plugins'],\r\n    destCss: ['dist/css'],\r\n    destPluginsJs: ['dist/plugins/js'],\r\n\r\n    // Package directory\r\n    dist: 'dist',\r\n};\r\n\r\n// Clear the dist directory\r\nfunction clean() {\r\n    return del([paths.dist]);\r\n}\r\n\r\n// proxy middleware\r\nconst apiProxy = createProxyMiddleware('/luckysheet/', {\r\n    target: 'http://luckysheet.lashuju.com/', // set your server address\r\n    changeOrigin: true, // for vhosted sites\r\n    ws: true, // proxy websockets\r\n});\r\n\r\n// Static server\r\nfunction serve(done) {\r\n    browserSync.init({\r\n        server: {\r\n            baseDir: paths.dist,\r\n            middleware: [apiProxy],//proxy\r\n        },\r\n        ghostMode: false, //默认true，滚动和表单在任何设备上输入将被镜像到所有设备里，会影响本地的协同编辑消息，故关闭\r\n    }, done)\r\n}\r\n\r\n// Monitoring file changes\r\nfunction watcher(done) {\r\n    watch(paths.core,{ delay: 500 }, series(core, reloadBrowser));\r\n\r\n    // watch plugins and css\r\n    watch(paths.pluginsCss,{ delay: 500 }, series(pluginsCss, reloadBrowser));\r\n    watch(paths.plugins,{ delay: 500 }, series(plugins, reloadBrowser));\r\n    watch(paths.css,{ delay: 500 }, series(css, reloadBrowser));\r\n    watch(paths.pluginsJs,{ delay: 500 }, series(pluginsJs, reloadBrowser));\r\n\r\n    // watch static\r\n    watch(paths.staticHtml,{ delay: 500 }, series(copyStaticHtml, reloadBrowser));\r\n    watch(paths.staticFonts,{ delay: 500 }, series(copyStaticFonts, reloadBrowser));\r\n    watch(paths.staticAssets,{ delay: 500 }, series(copyStaticAssets, reloadBrowser));\r\n    watch(paths.staticImages,{ delay: 500 }, series(copyStaticImages, reloadBrowser));\r\n    watch(paths.staticExpendPlugins,{ delay: 500 }, series(copyStaticExpendPlugins, reloadBrowser));\r\n    watch(paths.staticDemoData,{ delay: 500 }, series(copyStaticDemoData, reloadBrowser));\r\n    watch(paths.staticCssImages,{ delay: 500 }, series(copyStaticCssImages, reloadBrowser));\r\n\r\n    done();\r\n}\r\n\r\n// Refresh browser\r\nfunction reloadBrowser(done) {\r\n    reload();\r\n\r\n    done();\r\n}\r\n\r\n//Package the core code\r\nasync function core_rollup() {\r\n    const bundle = await rollup({\r\n        input: 'src/index.js',\r\n        plugins: [\r\n            nodeResolve(), // tells Rollup how to find date-fns in node_modules\r\n            commonjs(), // converts date-fns to ES modules\r\n            // postcss({\r\n            // \tplugins: [],\r\n            // \textract: true,\r\n            // \t// minimize: isProductionEnv,\r\n            // }),\r\n            production && terser(), // minify, but only in production\r\n            babel(babelConfig)\r\n        ],\r\n    });\r\n\r\n    bundle.write({\r\n        file: 'dist/luckysheet.umd.js',\r\n        format: 'umd',\r\n        name: 'luckysheet',\r\n        sourcemap: true,\r\n        inlineDynamicImports:true,\r\n        banner: banner\r\n    });\r\n\r\n    if(production){\r\n        bundle.write({\r\n            file: 'dist/luckysheet.esm.js',\r\n            format: 'esm',\r\n            name: 'luckysheet',\r\n            sourcemap: true,\r\n            inlineDynamicImports:true,\r\n            banner: banner\r\n        });\r\n    }\r\n\r\n}\r\n\r\nasync function core() {\r\n\r\n    await require('esbuild').buildSync({\r\n        format: 'iife',\r\n        globalName: 'luckysheet',    \r\n        entryPoints: ['src/index.js'],\r\n        bundle: true,\r\n        minify: production,\r\n        banner: { js: banner },\r\n        target: ['es2015'],\r\n        sourcemap: true,\r\n        outfile: 'dist/luckysheet.umd.js',\r\n      })\r\n}\r\n\r\n// According to the build tag in html, package js and css\r\nfunction pluginsCss() {\r\n    return src(paths.pluginsCss)\r\n        .pipe(concat(paths.concatPluginsCss))\r\n        .pipe(gulpif(production, cleanCSS()))\r\n        .pipe(dest(paths.destPluginsCss))\r\n\r\n}\r\n\r\nfunction plugins() {\r\n    return src(paths.plugins)\r\n        .pipe(concat(paths.concatPlugins))\r\n        .pipe(gulpif(production, cleanCSS()))\r\n        .pipe(dest(paths.destPlugins));\r\n}\r\n\r\nfunction css() {\r\n    return  src(paths.css)\r\n        .pipe(concat(paths.concatCss))\r\n        .pipe(gulpif(production, cleanCSS()))\r\n        .pipe(dest(paths.destCss));\r\n}\r\n\r\nfunction pluginsJs() {\r\n    return  src(paths.pluginsJs)\r\n        .pipe(concat(paths.concatPluginsJs))\r\n        .pipe(gulpif(production, uglify(uglifyOptions)))\r\n        .pipe(dest(paths.destPluginsJs));\r\n}\r\n\r\n// Copy static resources\r\nfunction copyStaticHtml(){\r\n    return src(paths.staticHtml)\r\n        .pipe(dest(paths.destStaticHtml));\r\n}\r\nfunction copyStaticFonts(){\r\n    return src(paths.staticFonts)\r\n        .pipe(dest(paths.destStaticFonts));\r\n}\r\nfunction copyStaticAssets(){\r\n    return src(paths.staticAssets)\r\n        .pipe(dest(paths.destStaticAssets));\r\n}\r\nfunction copyStaticImages(){\r\n    return src(paths.staticImages)\r\n        .pipe(dest(paths.destStaticImages));\r\n}\r\nfunction copyStaticExpendPlugins(){\r\n    return src(paths.staticExpendPlugins)\r\n        .pipe(dest(paths.destStaticExpendPlugins));\r\n}\r\nfunction copyStaticDemoData(){\r\n    return src(paths.staticDemoData)\r\n        .pipe(dest(paths.destStaticDemoData));\r\n        // .pipe(gulpBabel({\r\n        //     presets: ['@babel/env']\r\n        // }))\r\n        // .pipe(gulp.dest('dist'));\r\n}\r\nfunction copyStaticCssImages(){\r\n    return src(paths.staticCssImages)\r\n        .pipe(dest(paths.destStaticCssImages));\r\n}\r\n\r\nconst dev = series(clean, parallel(pluginsCss, plugins, css, pluginsJs, copyStaticHtml, copyStaticFonts, copyStaticAssets, copyStaticImages, copyStaticExpendPlugins, copyStaticDemoData, copyStaticCssImages, core), watcher, serve);\r\nconst build = series(clean, parallel(pluginsCss, plugins, css, pluginsJs, copyStaticHtml, copyStaticFonts, copyStaticAssets, copyStaticImages, copyStaticExpendPlugins, copyStaticDemoData, copyStaticCssImages, core));\r\n\r\nexports.dev = dev;\r\nexports.build = build;\r\nexports.default = dev;\r\n"
  },
  {
    "path": "package.json",
    "content": "{\r\n  \"name\": \"luckysheet\",\r\n  \"version\": \"2.1.13\",\r\n  \"main\": \"dist/luckysheet.cjs.js\",\r\n  \"module\": \"dist/luckysheet.esm.js\",\r\n  \"browser\": \"dist/luckysheet.umd.js\",\r\n  \"devDependencies\": {\r\n    \"@babel/core\": \"^7.12.3\",\r\n    \"@babel/preset-env\": \"^7.12.1\",\r\n    \"@babel/runtime-corejs3\": \"^7.12.1\",\r\n    \"@commitlint/cli\": \"^9.1.1\",\r\n    \"@commitlint/config-conventional\": \"^9.1.1\",\r\n    \"@rollup/plugin-babel\": \"^5.2.1\",\r\n    \"@rollup/plugin-commonjs\": \"^13.0.0\",\r\n    \"@rollup/plugin-node-resolve\": \"^8.0.1\",\r\n    \"browser-sync\": \"^2.26.7\",\r\n    \"commitizen\": \"^4.1.2\",\r\n    \"cross-env\": \"^7.0.2\",\r\n    \"delete\": \"^1.1.0\",\r\n    \"gulp\": \"^4.0.2\",\r\n    \"gulp-babel\": \"^8.0.0\",\r\n    \"gulp-clean-css\": \"^4.3.0\",\r\n    \"gulp-concat\": \"^2.6.1\",\r\n    \"gulp-if\": \"^3.0.0\",\r\n    \"gulp-uglify\": \"^3.0.2\",\r\n    \"gulp-useref\": \"^4.0.1\",\r\n    \"http-proxy-middleware\": \"^1.0.6\",\r\n    \"prettier\": \"2.8.8\",\r\n    \"rollup\": \"^2.32.1\",\r\n    \"rollup-plugin-terser\": \"^6.1.0\",\r\n    \"standard-version\": \"^8.0.2\",\r\n    \"uuid\": \"^8.3.2\",\r\n    \"vuepress\": \"^1.5.0\",\r\n    \"vuepress-plugin-baidu-autopush\": \"^1.0.1\",\r\n    \"vuepress-plugin-code-copy\": \"^1.0.6\",\r\n    \"vuepress-plugin-seo\": \"^0.1.4\",\r\n    \"vuepress-plugin-sitemap\": \"^2.3.1\"\r\n  },\r\n  \"dependencies\": {\r\n    \"@babel/runtime\": \"^7.12.1\",\r\n    \"dayjs\": \"^1.9.6\",\r\n    \"esbuild\": \"^0.11.6\",\r\n    \"escape-html\": \"^1.0.3\",\r\n    \"flatpickr\": \"^4.6.6\",\r\n    \"jquery\": \"^2.2.4\",\r\n    \"numeral\": \"^2.0.6\",\r\n    \"pako\": \"^1.0.11\"\r\n  },\r\n  \"scripts\": {\r\n    \"build\": \"cross-env NODE_ENV=production gulp build\",\r\n    \"dev\": \"cross-env NODE_ENV=development gulp dev\",\r\n    \"docs:dev\": \"vuepress dev docs\",\r\n    \"docs:build\": \"vuepress build docs\",\r\n    \"commit\": \"git-cz\",\r\n    \"release\": \"standard-version\",\r\n    \"prettier\": \"npx prettier --check .\",\r\n    \"prettier:fix\": \"npx prettier -w .\"\r\n  },\r\n  \"files\": [\r\n    \"dist\"\r\n  ],\r\n  \"config\": {\r\n    \"commitizen\": {\r\n      \"path\": \"./node_modules/cz-conventional-changelog\"\r\n    }\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/assets/iconfont/demo.css",
    "content": "/* Logo 字体 */\r\n@font-face {\r\n  font-family: \"iconfont logo\";\r\n  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');\r\n  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),\r\n    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),\r\n    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),\r\n    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');\r\n}\r\n\r\n.logo {\r\n  font-family: \"iconfont logo\";\r\n  font-size: 160px;\r\n  font-style: normal;\r\n  -webkit-font-smoothing: antialiased;\r\n  -moz-osx-font-smoothing: grayscale;\r\n}\r\n\r\n/* tabs */\r\n.nav-tabs {\r\n  position: relative;\r\n}\r\n\r\n.nav-tabs .nav-more {\r\n  position: absolute;\r\n  right: 0;\r\n  bottom: 0;\r\n  height: 42px;\r\n  line-height: 42px;\r\n  color: #666;\r\n}\r\n\r\n#tabs {\r\n  border-bottom: 1px solid #eee;\r\n}\r\n\r\n#tabs li {\r\n  cursor: pointer;\r\n  width: 100px;\r\n  height: 40px;\r\n  line-height: 40px;\r\n  text-align: center;\r\n  font-size: 16px;\r\n  border-bottom: 2px solid transparent;\r\n  position: relative;\r\n  z-index: 1;\r\n  margin-bottom: -1px;\r\n  color: #666;\r\n}\r\n\r\n\r\n#tabs .active {\r\n  border-bottom-color: #f00;\r\n  color: #222;\r\n}\r\n\r\n.tab-container .content {\r\n  display: none;\r\n}\r\n\r\n/* 页面布局 */\r\n.main {\r\n  padding: 30px 100px;\r\n  width: 960px;\r\n  margin: 0 auto;\r\n}\r\n\r\n.main .logo {\r\n  color: #333;\r\n  text-align: left;\r\n  margin-bottom: 30px;\r\n  line-height: 1;\r\n  height: 110px;\r\n  margin-top: -50px;\r\n  overflow: hidden;\r\n  *zoom: 1;\r\n}\r\n\r\n.main .logo a {\r\n  font-size: 160px;\r\n  color: #333;\r\n}\r\n\r\n.helps {\r\n  margin-top: 40px;\r\n}\r\n\r\n.helps pre {\r\n  padding: 20px;\r\n  margin: 10px 0;\r\n  border: solid 1px #e7e1cd;\r\n  background-color: #fffdef;\r\n  overflow: auto;\r\n}\r\n\r\n.icon_lists {\r\n  width: 100% !important;\r\n  overflow: hidden;\r\n  *zoom: 1;\r\n}\r\n\r\n.icon_lists li {\r\n  width: 100px;\r\n  margin-bottom: 10px;\r\n  margin-right: 20px;\r\n  text-align: center;\r\n  list-style: none !important;\r\n  cursor: default;\r\n}\r\n\r\n.icon_lists li .code-name {\r\n  line-height: 1.2;\r\n}\r\n\r\n.icon_lists .icon {\r\n  display: block;\r\n  height: 100px;\r\n  line-height: 100px;\r\n  font-size: 42px;\r\n  margin: 10px auto;\r\n  color: #333;\r\n  -webkit-transition: font-size 0.25s linear, width 0.25s linear;\r\n  -moz-transition: font-size 0.25s linear, width 0.25s linear;\r\n  transition: font-size 0.25s linear, width 0.25s linear;\r\n}\r\n\r\n.icon_lists .icon:hover {\r\n  font-size: 100px;\r\n}\r\n\r\n.icon_lists .svg-icon {\r\n  /* 通过设置 font-size 来改变图标大小 */\r\n  width: 1em;\r\n  /* 图标和文字相邻时，垂直对齐 */\r\n  vertical-align: -0.15em;\r\n  /* 通过设置 color 来改变 SVG 的颜色/fill */\r\n  fill: currentColor;\r\n  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示\r\n      normalize.css 中也包含这行 */\r\n  overflow: hidden;\r\n}\r\n\r\n.icon_lists li .name,\r\n.icon_lists li .code-name {\r\n  color: #666;\r\n}\r\n\r\n/* markdown 样式 */\r\n.markdown {\r\n  color: #666;\r\n  font-size: 14px;\r\n  line-height: 1.8;\r\n}\r\n\r\n.highlight {\r\n  line-height: 1.5;\r\n}\r\n\r\n.markdown img {\r\n  vertical-align: middle;\r\n  max-width: 100%;\r\n}\r\n\r\n.markdown h1 {\r\n  color: #404040;\r\n  font-weight: 500;\r\n  line-height: 40px;\r\n  margin-bottom: 24px;\r\n}\r\n\r\n.markdown h2,\r\n.markdown h3,\r\n.markdown h4,\r\n.markdown h5,\r\n.markdown h6 {\r\n  color: #404040;\r\n  margin: 1.6em 0 0.6em 0;\r\n  font-weight: 500;\r\n  clear: both;\r\n}\r\n\r\n.markdown h1 {\r\n  font-size: 28px;\r\n}\r\n\r\n.markdown h2 {\r\n  font-size: 22px;\r\n}\r\n\r\n.markdown h3 {\r\n  font-size: 16px;\r\n}\r\n\r\n.markdown h4 {\r\n  font-size: 14px;\r\n}\r\n\r\n.markdown h5 {\r\n  font-size: 12px;\r\n}\r\n\r\n.markdown h6 {\r\n  font-size: 12px;\r\n}\r\n\r\n.markdown hr {\r\n  height: 1px;\r\n  border: 0;\r\n  background: #e9e9e9;\r\n  margin: 16px 0;\r\n  clear: both;\r\n}\r\n\r\n.markdown p {\r\n  margin: 1em 0;\r\n}\r\n\r\n.markdown>p,\r\n.markdown>blockquote,\r\n.markdown>.highlight,\r\n.markdown>ol,\r\n.markdown>ul {\r\n  width: 80%;\r\n}\r\n\r\n.markdown ul>li {\r\n  list-style: circle;\r\n}\r\n\r\n.markdown>ul li,\r\n.markdown blockquote ul>li {\r\n  margin-left: 20px;\r\n  padding-left: 4px;\r\n}\r\n\r\n.markdown>ul li p,\r\n.markdown>ol li p {\r\n  margin: 0.6em 0;\r\n}\r\n\r\n.markdown ol>li {\r\n  list-style: decimal;\r\n}\r\n\r\n.markdown>ol li,\r\n.markdown blockquote ol>li {\r\n  margin-left: 20px;\r\n  padding-left: 4px;\r\n}\r\n\r\n.markdown code {\r\n  margin: 0 3px;\r\n  padding: 0 5px;\r\n  background: #eee;\r\n  border-radius: 3px;\r\n}\r\n\r\n.markdown strong,\r\n.markdown b {\r\n  font-weight: 600;\r\n}\r\n\r\n.markdown>table {\r\n  border-collapse: collapse;\r\n  border-spacing: 0px;\r\n  empty-cells: show;\r\n  border: 1px solid #e9e9e9;\r\n  width: 95%;\r\n  margin-bottom: 24px;\r\n}\r\n\r\n.markdown>table th {\r\n  white-space: nowrap;\r\n  color: #333;\r\n  font-weight: 600;\r\n}\r\n\r\n.markdown>table th,\r\n.markdown>table td {\r\n  border: 1px solid #e9e9e9;\r\n  padding: 8px 16px;\r\n  text-align: left;\r\n}\r\n\r\n.markdown>table th {\r\n  background: #F7F7F7;\r\n}\r\n\r\n.markdown blockquote {\r\n  font-size: 90%;\r\n  color: #999;\r\n  border-left: 4px solid #e9e9e9;\r\n  padding-left: 0.8em;\r\n  margin: 1em 0;\r\n}\r\n\r\n.markdown blockquote p {\r\n  margin: 0;\r\n}\r\n\r\n.markdown .anchor {\r\n  opacity: 0;\r\n  transition: opacity 0.3s ease;\r\n  margin-left: 8px;\r\n}\r\n\r\n.markdown .waiting {\r\n  color: #ccc;\r\n}\r\n\r\n.markdown h1:hover .anchor,\r\n.markdown h2:hover .anchor,\r\n.markdown h3:hover .anchor,\r\n.markdown h4:hover .anchor,\r\n.markdown h5:hover .anchor,\r\n.markdown h6:hover .anchor {\r\n  opacity: 1;\r\n  display: inline-block;\r\n}\r\n\r\n.markdown>br,\r\n.markdown>p>br {\r\n  clear: both;\r\n}\r\n\r\n\r\n.hljs {\r\n  display: block;\r\n  background: white;\r\n  padding: 0.5em;\r\n  color: #333333;\r\n  overflow-x: auto;\r\n}\r\n\r\n.hljs-comment,\r\n.hljs-meta {\r\n  color: #969896;\r\n}\r\n\r\n.hljs-string,\r\n.hljs-variable,\r\n.hljs-template-variable,\r\n.hljs-strong,\r\n.hljs-emphasis,\r\n.hljs-quote {\r\n  color: #df5000;\r\n}\r\n\r\n.hljs-keyword,\r\n.hljs-selector-tag,\r\n.hljs-type {\r\n  color: #a71d5d;\r\n}\r\n\r\n.hljs-literal,\r\n.hljs-symbol,\r\n.hljs-bullet,\r\n.hljs-attribute {\r\n  color: #0086b3;\r\n}\r\n\r\n.hljs-section,\r\n.hljs-name {\r\n  color: #63a35c;\r\n}\r\n\r\n.hljs-tag {\r\n  color: #333333;\r\n}\r\n\r\n.hljs-title,\r\n.hljs-attr,\r\n.hljs-selector-id,\r\n.hljs-selector-class,\r\n.hljs-selector-attr,\r\n.hljs-selector-pseudo {\r\n  color: #795da3;\r\n}\r\n\r\n.hljs-addition {\r\n  color: #55a532;\r\n  background-color: #eaffea;\r\n}\r\n\r\n.hljs-deletion {\r\n  color: #bd2c00;\r\n  background-color: #ffecec;\r\n}\r\n\r\n.hljs-link {\r\n  text-decoration: underline;\r\n}\r\n\r\n/* 代码高亮 */\r\n/* PrismJS 1.15.0\r\nhttps://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */\r\n/**\r\n * prism.js default theme for JavaScript, CSS and HTML\r\n * Based on dabblet (http://dabblet.com)\r\n * @author Lea Verou\r\n */\r\ncode[class*=\"language-\"],\r\npre[class*=\"language-\"] {\r\n  color: black;\r\n  background: none;\r\n  text-shadow: 0 1px white;\r\n  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\r\n  text-align: left;\r\n  white-space: pre;\r\n  word-spacing: normal;\r\n  word-break: normal;\r\n  word-wrap: normal;\r\n  line-height: 1.5;\r\n\r\n  -moz-tab-size: 4;\r\n  -o-tab-size: 4;\r\n  tab-size: 4;\r\n\r\n  -webkit-hyphens: none;\r\n  -moz-hyphens: none;\r\n  -ms-hyphens: none;\r\n  hyphens: none;\r\n}\r\n\r\npre[class*=\"language-\"]::-moz-selection,\r\npre[class*=\"language-\"] ::-moz-selection,\r\ncode[class*=\"language-\"]::-moz-selection,\r\ncode[class*=\"language-\"] ::-moz-selection {\r\n  text-shadow: none;\r\n  background: #b3d4fc;\r\n}\r\n\r\npre[class*=\"language-\"]::selection,\r\npre[class*=\"language-\"] ::selection,\r\ncode[class*=\"language-\"]::selection,\r\ncode[class*=\"language-\"] ::selection {\r\n  text-shadow: none;\r\n  background: #b3d4fc;\r\n}\r\n\r\n@media print {\r\n\r\n  code[class*=\"language-\"],\r\n  pre[class*=\"language-\"] {\r\n    text-shadow: none;\r\n  }\r\n}\r\n\r\n/* Code blocks */\r\npre[class*=\"language-\"] {\r\n  padding: 1em;\r\n  margin: .5em 0;\r\n  overflow: auto;\r\n}\r\n\r\n:not(pre)>code[class*=\"language-\"],\r\npre[class*=\"language-\"] {\r\n  background: #f5f2f0;\r\n}\r\n\r\n/* Inline code */\r\n:not(pre)>code[class*=\"language-\"] {\r\n  padding: .1em;\r\n  border-radius: .3em;\r\n  white-space: normal;\r\n}\r\n\r\n.token.comment,\r\n.token.prolog,\r\n.token.doctype,\r\n.token.cdata {\r\n  color: slategray;\r\n}\r\n\r\n.token.punctuation {\r\n  color: #999;\r\n}\r\n\r\n.namespace {\r\n  opacity: .7;\r\n}\r\n\r\n.token.property,\r\n.token.tag,\r\n.token.boolean,\r\n.token.number,\r\n.token.constant,\r\n.token.symbol,\r\n.token.deleted {\r\n  color: #905;\r\n}\r\n\r\n.token.selector,\r\n.token.attr-name,\r\n.token.string,\r\n.token.char,\r\n.token.builtin,\r\n.token.inserted {\r\n  color: #690;\r\n}\r\n\r\n.token.operator,\r\n.token.entity,\r\n.token.url,\r\n.language-css .token.string,\r\n.style .token.string {\r\n  color: #9a6e3a;\r\n  background: hsla(0, 0%, 100%, .5);\r\n}\r\n\r\n.token.atrule,\r\n.token.attr-value,\r\n.token.keyword {\r\n  color: #07a;\r\n}\r\n\r\n.token.function,\r\n.token.class-name {\r\n  color: #DD4A68;\r\n}\r\n\r\n.token.regex,\r\n.token.important,\r\n.token.variable {\r\n  color: #e90;\r\n}\r\n\r\n.token.important,\r\n.token.bold {\r\n  font-weight: bold;\r\n}\r\n\r\n.token.italic {\r\n  font-style: italic;\r\n}\r\n\r\n.token.entity {\r\n  cursor: help;\r\n}\r\n"
  },
  {
    "path": "src/assets/iconfont/demo_index.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n  <meta charset=\"utf-8\"/>\r\n  <title>IconFont Demo</title>\r\n  <link rel=\"shortcut icon\" href=\"https://img.alicdn.com/tps/i4/TB1_oz6GVXXXXaFXpXXJDFnIXXX-64-64.ico\" type=\"image/x-icon\"/>\r\n  <link rel=\"stylesheet\" href=\"https://g.alicdn.com/thx/cube/1.3.2/cube.min.css\">\r\n  <link rel=\"stylesheet\" href=\"demo.css\">\r\n  <link rel=\"stylesheet\" href=\"iconfont.css\">\r\n  <script src=\"iconfont.js\"></script>\r\n  <!-- jQuery -->\r\n  <script src=\"https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js\"></script>\r\n  <!-- 代码高亮 -->\r\n  <script src=\"https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js\"></script>\r\n</head>\r\n<body>\r\n  <div class=\"main\">\r\n    <h1 class=\"logo\"><a href=\"https://www.iconfont.cn/\" title=\"iconfont 首页\" target=\"_blank\">&#xe86b;</a></h1>\r\n    <div class=\"nav-tabs\">\r\n      <ul id=\"tabs\" class=\"dib-box\">\r\n        <li class=\"dib active\"><span>Unicode</span></li>\r\n        <li class=\"dib\"><span>Font class</span></li>\r\n        <li class=\"dib\"><span>Symbol</span></li>\r\n      </ul>\r\n\r\n      <a href=\"https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=1990368\" target=\"_blank\" class=\"nav-more\">查看项目</a>\r\n\r\n    </div>\r\n    <div class=\"tab-container\">\r\n      <div class=\"content unicode\" style=\"display: block;\">\r\n          <ul class=\"icon_lists dib-box\">\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7f8;</span>\r\n                <div class=\"name\">链接</div>\r\n                <div class=\"code-name\">&amp;#xe7f8;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7f5;</span>\r\n                <div class=\"name\">打印区域</div>\r\n                <div class=\"code-name\">&amp;#xe7f5;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7f6;</span>\r\n                <div class=\"name\">打印页面配置</div>\r\n                <div class=\"code-name\">&amp;#xe7f6;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7f7;</span>\r\n                <div class=\"name\">打印标题</div>\r\n                <div class=\"code-name\">&amp;#xe7f7;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7f2;</span>\r\n                <div class=\"name\">分页预览</div>\r\n                <div class=\"code-name\">&amp;#xe7f2;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7f3;</span>\r\n                <div class=\"name\">普通</div>\r\n                <div class=\"code-name\">&amp;#xe7f3;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7f4;</span>\r\n                <div class=\"name\">页面布局</div>\r\n                <div class=\"code-name\">&amp;#xe7f4;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7ee;</span>\r\n                <div class=\"name\">表格锁定</div>\r\n                <div class=\"code-name\">&amp;#xe7ee;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7f1;</span>\r\n                <div class=\"name\">转到</div>\r\n                <div class=\"code-name\">&amp;#xe7f1;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7ed;</span>\r\n                <div class=\"name\">右箭头</div>\r\n                <div class=\"code-name\">&amp;#xe7ed;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7ef;</span>\r\n                <div class=\"name\">菜单</div>\r\n                <div class=\"code-name\">&amp;#xe7ef;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7f0;</span>\r\n                <div class=\"name\">替换</div>\r\n                <div class=\"code-name\">&amp;#xe7f0;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7e1;</span>\r\n                <div class=\"name\">冻结</div>\r\n                <div class=\"code-name\">&amp;#xe7e1;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7e2;</span>\r\n                <div class=\"name\">剪</div>\r\n                <div class=\"code-name\">&amp;#xe7e2;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7e3;</span>\r\n                <div class=\"name\">加</div>\r\n                <div class=\"code-name\">&amp;#xe7e3;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7e4;</span>\r\n                <div class=\"name\">溢出</div>\r\n                <div class=\"code-name\">&amp;#xe7e4;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7e5;</span>\r\n                <div class=\"name\">升序</div>\r\n                <div class=\"code-name\">&amp;#xe7e5;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7e6;</span>\r\n                <div class=\"name\">内框线</div>\r\n                <div class=\"code-name\">&amp;#xe7e6;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7e7;</span>\r\n                <div class=\"name\">清除筛选</div>\r\n                <div class=\"code-name\">&amp;#xe7e7;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7e8;</span>\r\n                <div class=\"name\">文本向上</div>\r\n                <div class=\"code-name\">&amp;#xe7e8;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7e9;</span>\r\n                <div class=\"name\">降序</div>\r\n                <div class=\"code-name\">&amp;#xe7e9;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7ea;</span>\r\n                <div class=\"name\">内框横线</div>\r\n                <div class=\"code-name\">&amp;#xe7ea;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7eb;</span>\r\n                <div class=\"name\">内框竖线</div>\r\n                <div class=\"code-name\">&amp;#xe7eb;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7ec;</span>\r\n                <div class=\"name\">自定义排序</div>\r\n                <div class=\"code-name\">&amp;#xe7ec;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7df;</span>\r\n                <div class=\"name\">logo2</div>\r\n                <div class=\"code-name\">&amp;#xe7df;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7e0;</span>\r\n                <div class=\"name\">logo</div>\r\n                <div class=\"code-name\">&amp;#xe7e0;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7de;</span>\r\n                <div class=\"name\">文本倾斜</div>\r\n                <div class=\"code-name\">&amp;#xe7de;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7d9;</span>\r\n                <div class=\"name\">加粗</div>\r\n                <div class=\"code-name\">&amp;#xe7d9;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe78a;</span>\r\n                <div class=\"name\">搜索</div>\r\n                <div class=\"code-name\">&amp;#xe78a;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe78b;</span>\r\n                <div class=\"name\">关闭</div>\r\n                <div class=\"code-name\">&amp;#xe78b;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe78c;</span>\r\n                <div class=\"name\">下一个</div>\r\n                <div class=\"code-name\">&amp;#xe78c;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe78d;</span>\r\n                <div class=\"name\">下拉</div>\r\n                <div class=\"code-name\">&amp;#xe78d;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe78e;</span>\r\n                <div class=\"name\">文本颜色</div>\r\n                <div class=\"code-name\">&amp;#xe78e;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe78f;</span>\r\n                <div class=\"name\">上一个</div>\r\n                <div class=\"code-name\">&amp;#xe78f;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe790;</span>\r\n                <div class=\"name\">数据透视</div>\r\n                <div class=\"code-name\">&amp;#xe790;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe791;</span>\r\n                <div class=\"name\">填充</div>\r\n                <div class=\"code-name\">&amp;#xe791;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe792;</span>\r\n                <div class=\"name\">增加小数位</div>\r\n                <div class=\"code-name\">&amp;#xe792;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe793;</span>\r\n                <div class=\"name\">编辑2</div>\r\n                <div class=\"code-name\">&amp;#xe793;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe794;</span>\r\n                <div class=\"name\">截屏</div>\r\n                <div class=\"code-name\">&amp;#xe794;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe796;</span>\r\n                <div class=\"name\">减小小数位</div>\r\n                <div class=\"code-name\">&amp;#xe796;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe797;</span>\r\n                <div class=\"name\">菜单</div>\r\n                <div class=\"code-name\">&amp;#xe797;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe798;</span>\r\n                <div class=\"name\">数据库</div>\r\n                <div class=\"code-name\">&amp;#xe798;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe799;</span>\r\n                <div class=\"name\">无边框</div>\r\n                <div class=\"code-name\">&amp;#xe799;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe79a;</span>\r\n                <div class=\"name\">编辑</div>\r\n                <div class=\"code-name\">&amp;#xe79a;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe79b;</span>\r\n                <div class=\"name\">清除样式</div>\r\n                <div class=\"code-name\">&amp;#xe79b;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe79c;</span>\r\n                <div class=\"name\">删除</div>\r\n                <div class=\"code-name\">&amp;#xe79c;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe79d;</span>\r\n                <div class=\"name\">文本居中对齐</div>\r\n                <div class=\"code-name\">&amp;#xe79d;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe79e;</span>\r\n                <div class=\"name\">打印</div>\r\n                <div class=\"code-name\">&amp;#xe79e;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe79f;</span>\r\n                <div class=\"name\">文本分割</div>\r\n                <div class=\"code-name\">&amp;#xe79f;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7a0;</span>\r\n                <div class=\"name\">函数‘</div>\r\n                <div class=\"code-name\">&amp;#xe7a0;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7a1;</span>\r\n                <div class=\"name\">降序</div>\r\n                <div class=\"code-name\">&amp;#xe7a1;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7a2;</span>\r\n                <div class=\"name\">顶部对齐</div>\r\n                <div class=\"code-name\">&amp;#xe7a2;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7a3;</span>\r\n                <div class=\"name\">图片</div>\r\n                <div class=\"code-name\">&amp;#xe7a3;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7a4;</span>\r\n                <div class=\"name\">向下90</div>\r\n                <div class=\"code-name\">&amp;#xe7a4;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7a5;</span>\r\n                <div class=\"name\">竖排文字</div>\r\n                <div class=\"code-name\">&amp;#xe7a5;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7a6;</span>\r\n                <div class=\"name\">全加边框</div>\r\n                <div class=\"code-name\">&amp;#xe7a6;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7a7;</span>\r\n                <div class=\"name\">升序</div>\r\n                <div class=\"code-name\">&amp;#xe7a7;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7a8;</span>\r\n                <div class=\"name\">裁剪</div>\r\n                <div class=\"code-name\">&amp;#xe7a8;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7a9;</span>\r\n                <div class=\"name\">金额</div>\r\n                <div class=\"code-name\">&amp;#xe7a9;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7aa;</span>\r\n                <div class=\"name\">菜单1</div>\r\n                <div class=\"code-name\">&amp;#xe7aa;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7ab;</span>\r\n                <div class=\"name\">取消合并</div>\r\n                <div class=\"code-name\">&amp;#xe7ab;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7ac;</span>\r\n                <div class=\"name\">文本下划线</div>\r\n                <div class=\"code-name\">&amp;#xe7ac;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7ad;</span>\r\n                <div class=\"name\">上边框</div>\r\n                <div class=\"code-name\">&amp;#xe7ad;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7ae;</span>\r\n                <div class=\"name\">定位</div>\r\n                <div class=\"code-name\">&amp;#xe7ae;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7af;</span>\r\n                <div class=\"name\">四周加边框</div>\r\n                <div class=\"code-name\">&amp;#xe7af;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7b0;</span>\r\n                <div class=\"name\">侧边栏收起</div>\r\n                <div class=\"code-name\">&amp;#xe7b0;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7b1;</span>\r\n                <div class=\"name\">合并</div>\r\n                <div class=\"code-name\">&amp;#xe7b1;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7b2;</span>\r\n                <div class=\"name\">向上倾斜</div>\r\n                <div class=\"code-name\">&amp;#xe7b2;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7b3;</span>\r\n                <div class=\"name\">水平对齐</div>\r\n                <div class=\"code-name\">&amp;#xe7b3;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7b4;</span>\r\n                <div class=\"name\">文本删除线</div>\r\n                <div class=\"code-name\">&amp;#xe7b4;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7b5;</span>\r\n                <div class=\"name\">文本右对齐</div>\r\n                <div class=\"code-name\">&amp;#xe7b5;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7b6;</span>\r\n                <div class=\"name\">前进</div>\r\n                <div class=\"code-name\">&amp;#xe7b6;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7b7;</span>\r\n                <div class=\"name\">图表</div>\r\n                <div class=\"code-name\">&amp;#xe7b7;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7b8;</span>\r\n                <div class=\"name\">右边框</div>\r\n                <div class=\"code-name\">&amp;#xe7b8;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7b9;</span>\r\n                <div class=\"name\">百分号</div>\r\n                <div class=\"code-name\">&amp;#xe7b9;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7ba;</span>\r\n                <div class=\"name\">格式刷</div>\r\n                <div class=\"code-name\">&amp;#xe7ba;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7bb;</span>\r\n                <div class=\"name\">保存</div>\r\n                <div class=\"code-name\">&amp;#xe7bb;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7bc;</span>\r\n                <div class=\"name\">数据验证</div>\r\n                <div class=\"code-name\">&amp;#xe7bc;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7bd;</span>\r\n                <div class=\"name\">截断</div>\r\n                <div class=\"code-name\">&amp;#xe7bd;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7be;</span>\r\n                <div class=\"name\">格式条件</div>\r\n                <div class=\"code-name\">&amp;#xe7be;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7bf;</span>\r\n                <div class=\"name\">自动换行</div>\r\n                <div class=\"code-name\">&amp;#xe7bf;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7c0;</span>\r\n                <div class=\"name\">侧边栏展开</div>\r\n                <div class=\"code-name\">&amp;#xe7c0;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7c1;</span>\r\n                <div class=\"name\">筛选2</div>\r\n                <div class=\"code-name\">&amp;#xe7c1;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7c2;</span>\r\n                <div class=\"name\">向下倾斜</div>\r\n                <div class=\"code-name\">&amp;#xe7c2;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7c3;</span>\r\n                <div class=\"name\">溢出</div>\r\n                <div class=\"code-name\">&amp;#xe7c3;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7c4;</span>\r\n                <div class=\"name\">垂直合并</div>\r\n                <div class=\"code-name\">&amp;#xe7c4;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7c5;</span>\r\n                <div class=\"name\">文本分散对齐</div>\r\n                <div class=\"code-name\">&amp;#xe7c5;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7c6;</span>\r\n                <div class=\"name\">左边框</div>\r\n                <div class=\"code-name\">&amp;#xe7c6;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7c7;</span>\r\n                <div class=\"name\">分页查看</div>\r\n                <div class=\"code-name\">&amp;#xe7c7;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7c8;</span>\r\n                <div class=\"name\">运行</div>\r\n                <div class=\"code-name\">&amp;#xe7c8;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7c9;</span>\r\n                <div class=\"name\">列</div>\r\n                <div class=\"code-name\">&amp;#xe7c9;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7ca;</span>\r\n                <div class=\"name\">全屏</div>\r\n                <div class=\"code-name\">&amp;#xe7ca;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7cb;</span>\r\n                <div class=\"name\">筛选</div>\r\n                <div class=\"code-name\">&amp;#xe7cb;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7cc;</span>\r\n                <div class=\"name\">更新</div>\r\n                <div class=\"code-name\">&amp;#xe7cc;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7cd;</span>\r\n                <div class=\"name\">清除</div>\r\n                <div class=\"code-name\">&amp;#xe7cd;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7ce;</span>\r\n                <div class=\"name\">行</div>\r\n                <div class=\"code-name\">&amp;#xe7ce;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7cf;</span>\r\n                <div class=\"name\">注释</div>\r\n                <div class=\"code-name\">&amp;#xe7cf;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7d0;</span>\r\n                <div class=\"name\">剪</div>\r\n                <div class=\"code-name\">&amp;#xe7d0;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7d1;</span>\r\n                <div class=\"name\">计算</div>\r\n                <div class=\"code-name\">&amp;#xe7d1;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7d2;</span>\r\n                <div class=\"name\">加</div>\r\n                <div class=\"code-name\">&amp;#xe7d2;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7d3;</span>\r\n                <div class=\"name\">底部对齐</div>\r\n                <div class=\"code-name\">&amp;#xe7d3;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7d4;</span>\r\n                <div class=\"name\">向上90</div>\r\n                <div class=\"code-name\">&amp;#xe7d4;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7d5;</span>\r\n                <div class=\"name\">无选装</div>\r\n                <div class=\"code-name\">&amp;#xe7d5;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7d6;</span>\r\n                <div class=\"name\">显示隐藏网格</div>\r\n                <div class=\"code-name\">&amp;#xe7d6;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7d7;</span>\r\n                <div class=\"name\">冻结</div>\r\n                <div class=\"code-name\">&amp;#xe7d7;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7d8;</span>\r\n                <div class=\"name\">文本左对齐</div>\r\n                <div class=\"code-name\">&amp;#xe7d8;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7da;</span>\r\n                <div class=\"name\">后退</div>\r\n                <div class=\"code-name\">&amp;#xe7da;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7db;</span>\r\n                <div class=\"name\">水平合并</div>\r\n                <div class=\"code-name\">&amp;#xe7db;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7dc;</span>\r\n                <div class=\"name\">下边框</div>\r\n                <div class=\"code-name\">&amp;#xe7dc;</div>\r\n              </li>\r\n\r\n            <li class=\"dib\">\r\n              <span class=\"icon iconfont\">&#xe7dd;</span>\r\n                <div class=\"name\">设置</div>\r\n                <div class=\"code-name\">&amp;#xe7dd;</div>\r\n              </li>\r\n\r\n          </ul>\r\n          <div class=\"article markdown\">\r\n          <h2 id=\"unicode-\">Unicode 引用</h2>\r\n          <hr>\r\n\r\n          <p>Unicode 是字体在网页端最原始的应用方式，特点是：</p>\r\n          <ul>\r\n            <li>兼容性最好，支持 IE6+，及所有现代浏览器。</li>\r\n            <li>支持按字体的方式去动态调整图标大小，颜色等等。</li>\r\n            <li>但是因为是字体，所以不支持多色。只能使用平台里单色的图标，就算项目里有多色图标也会自动去色。</li>\r\n          </ul>\r\n          <blockquote>\r\n            <p>注意：新版 iconfont 支持多色图标，这些多色图标在 Unicode 模式下将不能使用，如果有需求建议使用symbol 的引用方式</p>\r\n          </blockquote>\r\n          <p>Unicode 使用步骤如下：</p>\r\n          <h3 id=\"-font-face\">第一步：拷贝项目下面生成的 <code>@font-face</code></h3>\r\n<pre><code class=\"language-css\"\r\n>@font-face {\r\n  font-family: 'iconfont';\r\n  src: url('iconfont.eot');\r\n  src: url('iconfont.eot?#iefix') format('embedded-opentype'),\r\n      url('iconfont.woff2') format('woff2'),\r\n      url('iconfont.woff') format('woff'),\r\n      url('iconfont.ttf') format('truetype'),\r\n      url('iconfont.svg#iconfont') format('svg');\r\n}\r\n</code></pre>\r\n          <h3 id=\"-iconfont-\">第二步：定义使用 iconfont 的样式</h3>\r\n<pre><code class=\"language-css\"\r\n>.iconfont {\r\n  font-family: \"iconfont\" !important;\r\n  font-size: 16px;\r\n  font-style: normal;\r\n  -webkit-font-smoothing: antialiased;\r\n  -moz-osx-font-smoothing: grayscale;\r\n}\r\n</code></pre>\r\n          <h3 id=\"-\">第三步：挑选相应图标并获取字体编码，应用于页面</h3>\r\n<pre>\r\n<code class=\"language-html\"\r\n>&lt;span class=\"iconfont\"&gt;&amp;#x33;&lt;/span&gt;\r\n</code></pre>\r\n          <blockquote>\r\n            <p>\"iconfont\" 是你项目下的 font-family。可以通过编辑项目查看，默认是 \"iconfont\"。</p>\r\n          </blockquote>\r\n          </div>\r\n      </div>\r\n      <div class=\"content font-class\">\r\n        <ul class=\"icon_lists dib-box\">\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-lianjie\"></span>\r\n            <div class=\"name\">\r\n              链接\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-lianjie\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-dayinquyu\"></span>\r\n            <div class=\"name\">\r\n              打印区域\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-dayinquyu\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-dayinyemianpeizhi\"></span>\r\n            <div class=\"name\">\r\n              打印页面配置\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-dayinyemianpeizhi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-dayinbiaoti\"></span>\r\n            <div class=\"name\">\r\n              打印标题\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-dayinbiaoti\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-fenyeyulan\"></span>\r\n            <div class=\"name\">\r\n              分页预览\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-fenyeyulan\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-putong\"></span>\r\n            <div class=\"name\">\r\n              普通\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-putong\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-yemianbuju\"></span>\r\n            <div class=\"name\">\r\n              页面布局\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-yemianbuju\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-biaogesuoding\"></span>\r\n            <div class=\"name\">\r\n              表格锁定\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-biaogesuoding\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-zhuandao1\"></span>\r\n            <div class=\"name\">\r\n              转到\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-zhuandao1\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-youjiantou\"></span>\r\n            <div class=\"name\">\r\n              右箭头\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-youjiantou\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-caidan2\"></span>\r\n            <div class=\"name\">\r\n              菜单\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-caidan2\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-tihuan\"></span>\r\n            <div class=\"name\">\r\n              替换\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-tihuan\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-dongjie1\"></span>\r\n            <div class=\"name\">\r\n              冻结\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-dongjie1\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-jian1\"></span>\r\n            <div class=\"name\">\r\n              剪\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-jian1\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-jia1\"></span>\r\n            <div class=\"name\">\r\n              加\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-jia1\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-yichu1\"></span>\r\n            <div class=\"name\">\r\n              溢出\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-yichu1\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shengxu1\"></span>\r\n            <div class=\"name\">\r\n              升序\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shengxu1\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-neikuangxian\"></span>\r\n            <div class=\"name\">\r\n              内框线\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-neikuangxian\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-qingchushaixuan\"></span>\r\n            <div class=\"name\">\r\n              清除筛选\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-qingchushaixuan\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-wenbenxiangshang\"></span>\r\n            <div class=\"name\">\r\n              文本向上\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-wenbenxiangshang\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-jiangxu1\"></span>\r\n            <div class=\"name\">\r\n              降序\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-jiangxu1\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-neikuanghengxian\"></span>\r\n            <div class=\"name\">\r\n              内框横线\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-neikuanghengxian\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-neikuangshuxian\"></span>\r\n            <div class=\"name\">\r\n              内框竖线\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-neikuangshuxian\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-zidingyipaixu\"></span>\r\n            <div class=\"name\">\r\n              自定义排序\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-zidingyipaixu\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-logo2\"></span>\r\n            <div class=\"name\">\r\n              logo2\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-logo2\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-logo\"></span>\r\n            <div class=\"name\">\r\n              logo\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-logo\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-wenbenqingxie1\"></span>\r\n            <div class=\"name\">\r\n              文本倾斜\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-wenbenqingxie1\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-jiacu\"></span>\r\n            <div class=\"name\">\r\n              加粗\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-jiacu\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-sousuo\"></span>\r\n            <div class=\"name\">\r\n              搜索\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-sousuo\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-guanbi\"></span>\r\n            <div class=\"name\">\r\n              关闭\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-guanbi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-xiayige\"></span>\r\n            <div class=\"name\">\r\n              下一个\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-xiayige\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-xiala\"></span>\r\n            <div class=\"name\">\r\n              下拉\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-xiala\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-wenbenyanse\"></span>\r\n            <div class=\"name\">\r\n              文本颜色\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-wenbenyanse\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shangyige\"></span>\r\n            <div class=\"name\">\r\n              上一个\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shangyige\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shujutoushi\"></span>\r\n            <div class=\"name\">\r\n              数据透视\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shujutoushi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-tianchong\"></span>\r\n            <div class=\"name\">\r\n              填充\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-tianchong\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-zengjiaxiaoshuwei\"></span>\r\n            <div class=\"name\">\r\n              增加小数位\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-zengjiaxiaoshuwei\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-bianji2\"></span>\r\n            <div class=\"name\">\r\n              编辑2\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-bianji2\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-jieping\"></span>\r\n            <div class=\"name\">\r\n              截屏\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-jieping\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-jianxiaoxiaoshuwei\"></span>\r\n            <div class=\"name\">\r\n              减小小数位\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-jianxiaoxiaoshuwei\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-caidan\"></span>\r\n            <div class=\"name\">\r\n              菜单\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-caidan\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shujuku\"></span>\r\n            <div class=\"name\">\r\n              数据库\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shujuku\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-wubiankuang\"></span>\r\n            <div class=\"name\">\r\n              无边框\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-wubiankuang\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-bianji\"></span>\r\n            <div class=\"name\">\r\n              编辑\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-bianji\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-qingchuyangshi\"></span>\r\n            <div class=\"name\">\r\n              清除样式\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-qingchuyangshi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shanchu\"></span>\r\n            <div class=\"name\">\r\n              删除\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shanchu\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-wenbenjuzhongduiqi\"></span>\r\n            <div class=\"name\">\r\n              文本居中对齐\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-wenbenjuzhongduiqi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-dayin\"></span>\r\n            <div class=\"name\">\r\n              打印\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-dayin\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-wenbenfenge\"></span>\r\n            <div class=\"name\">\r\n              文本分割\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-wenbenfenge\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-hanshu\"></span>\r\n            <div class=\"name\">\r\n              函数‘\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-hanshu\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-jiangxu\"></span>\r\n            <div class=\"name\">\r\n              降序\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-jiangxu\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-dingbuduiqi\"></span>\r\n            <div class=\"name\">\r\n              顶部对齐\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-dingbuduiqi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-tupian\"></span>\r\n            <div class=\"name\">\r\n              图片\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-tupian\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-xiangxia90\"></span>\r\n            <div class=\"name\">\r\n              向下90\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-xiangxia90\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shupaiwenzi\"></span>\r\n            <div class=\"name\">\r\n              竖排文字\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shupaiwenzi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-quanjiabiankuang\"></span>\r\n            <div class=\"name\">\r\n              全加边框\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-quanjiabiankuang\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shengxu\"></span>\r\n            <div class=\"name\">\r\n              升序\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shengxu\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-caijian\"></span>\r\n            <div class=\"name\">\r\n              裁剪\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-caijian\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-jine\"></span>\r\n            <div class=\"name\">\r\n              金额\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-jine\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-caidan1\"></span>\r\n            <div class=\"name\">\r\n              菜单1\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-caidan1\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-quxiaohebing\"></span>\r\n            <div class=\"name\">\r\n              取消合并\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-quxiaohebing\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-wenbenxiahuaxian\"></span>\r\n            <div class=\"name\">\r\n              文本下划线\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-wenbenxiahuaxian\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shangbiankuang\"></span>\r\n            <div class=\"name\">\r\n              上边框\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shangbiankuang\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-dingwei\"></span>\r\n            <div class=\"name\">\r\n              定位\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-dingwei\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-sizhoujiabiankuang\"></span>\r\n            <div class=\"name\">\r\n              四周加边框\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-sizhoujiabiankuang\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-cebianlanshouqi\"></span>\r\n            <div class=\"name\">\r\n              侧边栏收起\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-cebianlanshouqi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-hebing\"></span>\r\n            <div class=\"name\">\r\n              合并\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-hebing\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-xiangshangqingxie\"></span>\r\n            <div class=\"name\">\r\n              向上倾斜\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-xiangshangqingxie\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shuipingduiqi\"></span>\r\n            <div class=\"name\">\r\n              水平对齐\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shuipingduiqi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-wenbenshanchuxian\"></span>\r\n            <div class=\"name\">\r\n              文本删除线\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-wenbenshanchuxian\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-wenbenyouduiqi\"></span>\r\n            <div class=\"name\">\r\n              文本右对齐\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-wenbenyouduiqi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-qianjin\"></span>\r\n            <div class=\"name\">\r\n              前进\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-qianjin\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-tubiao\"></span>\r\n            <div class=\"name\">\r\n              图表\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-tubiao\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-youbiankuang\"></span>\r\n            <div class=\"name\">\r\n              右边框\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-youbiankuang\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-baifenhao\"></span>\r\n            <div class=\"name\">\r\n              百分号\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-baifenhao\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-geshishua\"></span>\r\n            <div class=\"name\">\r\n              格式刷\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-geshishua\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-baocun\"></span>\r\n            <div class=\"name\">\r\n              保存\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-baocun\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shujuyanzheng\"></span>\r\n            <div class=\"name\">\r\n              数据验证\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shujuyanzheng\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-jieduan\"></span>\r\n            <div class=\"name\">\r\n              截断\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-jieduan\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-geshitiaojian\"></span>\r\n            <div class=\"name\">\r\n              格式条件\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-geshitiaojian\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-zidonghuanhang\"></span>\r\n            <div class=\"name\">\r\n              自动换行\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-zidonghuanhang\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-cebianlanzhankai\"></span>\r\n            <div class=\"name\">\r\n              侧边栏展开\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-cebianlanzhankai\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shaixuan2\"></span>\r\n            <div class=\"name\">\r\n              筛选2\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shaixuan2\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-xiangxiaqingxie\"></span>\r\n            <div class=\"name\">\r\n              向下倾斜\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-xiangxiaqingxie\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-yichu\"></span>\r\n            <div class=\"name\">\r\n              溢出\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-yichu\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-chuizhihebing\"></span>\r\n            <div class=\"name\">\r\n              垂直合并\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-chuizhihebing\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-wenbenfensanduiqi\"></span>\r\n            <div class=\"name\">\r\n              文本分散对齐\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-wenbenfensanduiqi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-zuobiankuang\"></span>\r\n            <div class=\"name\">\r\n              左边框\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-zuobiankuang\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-fenyechakan\"></span>\r\n            <div class=\"name\">\r\n              分页查看\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-fenyechakan\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-yunhang\"></span>\r\n            <div class=\"name\">\r\n              运行\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-yunhang\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-lie\"></span>\r\n            <div class=\"name\">\r\n              列\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-lie\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-quanping\"></span>\r\n            <div class=\"name\">\r\n              全屏\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-quanping\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shaixuan\"></span>\r\n            <div class=\"name\">\r\n              筛选\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shaixuan\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-gengxin\"></span>\r\n            <div class=\"name\">\r\n              更新\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-gengxin\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-qingchu\"></span>\r\n            <div class=\"name\">\r\n              清除\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-qingchu\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-hang\"></span>\r\n            <div class=\"name\">\r\n              行\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-hang\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-zhushi\"></span>\r\n            <div class=\"name\">\r\n              注释\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-zhushi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-jian\"></span>\r\n            <div class=\"name\">\r\n              剪\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-jian\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-jisuan\"></span>\r\n            <div class=\"name\">\r\n              计算\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-jisuan\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-jia\"></span>\r\n            <div class=\"name\">\r\n              加\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-jia\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-dibuduiqi\"></span>\r\n            <div class=\"name\">\r\n              底部对齐\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-dibuduiqi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-xiangshang90\"></span>\r\n            <div class=\"name\">\r\n              向上90\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-xiangshang90\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-wuxuanzhuang\"></span>\r\n            <div class=\"name\">\r\n              无选装\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-wuxuanzhuang\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-xianshiyincangwangge\"></span>\r\n            <div class=\"name\">\r\n              显示隐藏网格\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-xianshiyincangwangge\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-dongjie\"></span>\r\n            <div class=\"name\">\r\n              冻结\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-dongjie\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-wenbenzuoduiqi\"></span>\r\n            <div class=\"name\">\r\n              文本左对齐\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-wenbenzuoduiqi\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-houtui\"></span>\r\n            <div class=\"name\">\r\n              后退\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-houtui\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shuipinghebing\"></span>\r\n            <div class=\"name\">\r\n              水平合并\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shuipinghebing\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-xiabiankuang\"></span>\r\n            <div class=\"name\">\r\n              下边框\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-xiabiankuang\r\n            </div>\r\n          </li>\r\n\r\n          <li class=\"dib\">\r\n            <span class=\"icon iconfont-luckysheet luckysheet-iconfont-shezhi\"></span>\r\n            <div class=\"name\">\r\n              设置\r\n            </div>\r\n            <div class=\"code-name\">.luckysheet-iconfont-shezhi\r\n            </div>\r\n          </li>\r\n\r\n        </ul>\r\n        <div class=\"article markdown\">\r\n        <h2 id=\"font-class-\">font-class 引用</h2>\r\n        <hr>\r\n\r\n        <p>font-class 是 Unicode 使用方式的一种变种，主要是解决 Unicode 书写不直观，语意不明确的问题。</p>\r\n        <p>与 Unicode 使用方式相比，具有如下特点：</p>\r\n        <ul>\r\n          <li>兼容性良好，支持 IE8+，及所有现代浏览器。</li>\r\n          <li>相比于 Unicode 语意明确，书写更直观。可以很容易分辨这个 icon 是什么。</li>\r\n          <li>因为使用 class 来定义图标，所以当要替换图标时，只需要修改 class 里面的 Unicode 引用。</li>\r\n          <li>不过因为本质上还是使用的字体，所以多色图标还是不支持的。</li>\r\n        </ul>\r\n        <p>使用步骤如下：</p>\r\n        <h3 id=\"-fontclass-\">第一步：引入项目下面生成的 fontclass 代码：</h3>\r\n<pre><code class=\"language-html\">&lt;link rel=\"stylesheet\" href=\"./iconfont.css\"&gt;\r\n</code></pre>\r\n        <h3 id=\"-\">第二步：挑选相应图标并获取类名，应用于页面：</h3>\r\n<pre><code class=\"language-html\">&lt;span class=\"iconfont-luckysheet luckysheet-iconfont-xxx\"&gt;&lt;/span&gt;\r\n</code></pre>\r\n        <blockquote>\r\n          <p>\"\r\n            iconfont\" 是你项目下的 font-family。可以通过编辑项目查看，默认是 \"iconfont\"。</p>\r\n        </blockquote>\r\n      </div>\r\n      </div>\r\n      <div class=\"content symbol\">\r\n          <ul class=\"icon_lists dib-box\">\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-lianjie\"></use>\r\n                </svg>\r\n                <div class=\"name\">链接</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-lianjie</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-dayinquyu\"></use>\r\n                </svg>\r\n                <div class=\"name\">打印区域</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-dayinquyu</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-dayinyemianpeizhi\"></use>\r\n                </svg>\r\n                <div class=\"name\">打印页面配置</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-dayinyemianpeizhi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-dayinbiaoti\"></use>\r\n                </svg>\r\n                <div class=\"name\">打印标题</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-dayinbiaoti</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-fenyeyulan\"></use>\r\n                </svg>\r\n                <div class=\"name\">分页预览</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-fenyeyulan</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-putong\"></use>\r\n                </svg>\r\n                <div class=\"name\">普通</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-putong</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-yemianbuju\"></use>\r\n                </svg>\r\n                <div class=\"name\">页面布局</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-yemianbuju</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-biaogesuoding\"></use>\r\n                </svg>\r\n                <div class=\"name\">表格锁定</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-biaogesuoding</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-zhuandao1\"></use>\r\n                </svg>\r\n                <div class=\"name\">转到</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-zhuandao1</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-youjiantou\"></use>\r\n                </svg>\r\n                <div class=\"name\">右箭头</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-youjiantou</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-caidan2\"></use>\r\n                </svg>\r\n                <div class=\"name\">菜单</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-caidan2</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-tihuan\"></use>\r\n                </svg>\r\n                <div class=\"name\">替换</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-tihuan</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-dongjie1\"></use>\r\n                </svg>\r\n                <div class=\"name\">冻结</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-dongjie1</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-jian1\"></use>\r\n                </svg>\r\n                <div class=\"name\">剪</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-jian1</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-jia1\"></use>\r\n                </svg>\r\n                <div class=\"name\">加</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-jia1</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-yichu1\"></use>\r\n                </svg>\r\n                <div class=\"name\">溢出</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-yichu1</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shengxu1\"></use>\r\n                </svg>\r\n                <div class=\"name\">升序</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shengxu1</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-neikuangxian\"></use>\r\n                </svg>\r\n                <div class=\"name\">内框线</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-neikuangxian</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-qingchushaixuan\"></use>\r\n                </svg>\r\n                <div class=\"name\">清除筛选</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-qingchushaixuan</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-wenbenxiangshang\"></use>\r\n                </svg>\r\n                <div class=\"name\">文本向上</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-wenbenxiangshang</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-jiangxu1\"></use>\r\n                </svg>\r\n                <div class=\"name\">降序</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-jiangxu1</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-neikuanghengxian\"></use>\r\n                </svg>\r\n                <div class=\"name\">内框横线</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-neikuanghengxian</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-neikuangshuxian\"></use>\r\n                </svg>\r\n                <div class=\"name\">内框竖线</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-neikuangshuxian</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-zidingyipaixu\"></use>\r\n                </svg>\r\n                <div class=\"name\">自定义排序</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-zidingyipaixu</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-logo2\"></use>\r\n                </svg>\r\n                <div class=\"name\">logo2</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-logo2</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-logo\"></use>\r\n                </svg>\r\n                <div class=\"name\">logo</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-logo</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-wenbenqingxie1\"></use>\r\n                </svg>\r\n                <div class=\"name\">文本倾斜</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-wenbenqingxie1</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-jiacu\"></use>\r\n                </svg>\r\n                <div class=\"name\">加粗</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-jiacu</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-sousuo\"></use>\r\n                </svg>\r\n                <div class=\"name\">搜索</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-sousuo</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-guanbi\"></use>\r\n                </svg>\r\n                <div class=\"name\">关闭</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-guanbi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-xiayige\"></use>\r\n                </svg>\r\n                <div class=\"name\">下一个</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-xiayige</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-xiala\"></use>\r\n                </svg>\r\n                <div class=\"name\">下拉</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-xiala</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-wenbenyanse\"></use>\r\n                </svg>\r\n                <div class=\"name\">文本颜色</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-wenbenyanse</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shangyige\"></use>\r\n                </svg>\r\n                <div class=\"name\">上一个</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shangyige</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shujutoushi\"></use>\r\n                </svg>\r\n                <div class=\"name\">数据透视</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shujutoushi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-tianchong\"></use>\r\n                </svg>\r\n                <div class=\"name\">填充</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-tianchong</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-zengjiaxiaoshuwei\"></use>\r\n                </svg>\r\n                <div class=\"name\">增加小数位</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-zengjiaxiaoshuwei</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-bianji2\"></use>\r\n                </svg>\r\n                <div class=\"name\">编辑2</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-bianji2</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-jieping\"></use>\r\n                </svg>\r\n                <div class=\"name\">截屏</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-jieping</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-jianxiaoxiaoshuwei\"></use>\r\n                </svg>\r\n                <div class=\"name\">减小小数位</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-jianxiaoxiaoshuwei</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-caidan\"></use>\r\n                </svg>\r\n                <div class=\"name\">菜单</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-caidan</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shujuku\"></use>\r\n                </svg>\r\n                <div class=\"name\">数据库</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shujuku</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-wubiankuang\"></use>\r\n                </svg>\r\n                <div class=\"name\">无边框</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-wubiankuang</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-bianji\"></use>\r\n                </svg>\r\n                <div class=\"name\">编辑</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-bianji</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-qingchuyangshi\"></use>\r\n                </svg>\r\n                <div class=\"name\">清除样式</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-qingchuyangshi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shanchu\"></use>\r\n                </svg>\r\n                <div class=\"name\">删除</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shanchu</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-wenbenjuzhongduiqi\"></use>\r\n                </svg>\r\n                <div class=\"name\">文本居中对齐</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-wenbenjuzhongduiqi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-dayin\"></use>\r\n                </svg>\r\n                <div class=\"name\">打印</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-dayin</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-wenbenfenge\"></use>\r\n                </svg>\r\n                <div class=\"name\">文本分割</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-wenbenfenge</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-hanshu\"></use>\r\n                </svg>\r\n                <div class=\"name\">函数‘</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-hanshu</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-jiangxu\"></use>\r\n                </svg>\r\n                <div class=\"name\">降序</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-jiangxu</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-dingbuduiqi\"></use>\r\n                </svg>\r\n                <div class=\"name\">顶部对齐</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-dingbuduiqi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-tupian\"></use>\r\n                </svg>\r\n                <div class=\"name\">图片</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-tupian</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-xiangxia90\"></use>\r\n                </svg>\r\n                <div class=\"name\">向下90</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-xiangxia90</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shupaiwenzi\"></use>\r\n                </svg>\r\n                <div class=\"name\">竖排文字</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shupaiwenzi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-quanjiabiankuang\"></use>\r\n                </svg>\r\n                <div class=\"name\">全加边框</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-quanjiabiankuang</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shengxu\"></use>\r\n                </svg>\r\n                <div class=\"name\">升序</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shengxu</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-caijian\"></use>\r\n                </svg>\r\n                <div class=\"name\">裁剪</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-caijian</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-jine\"></use>\r\n                </svg>\r\n                <div class=\"name\">金额</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-jine</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-caidan1\"></use>\r\n                </svg>\r\n                <div class=\"name\">菜单1</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-caidan1</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-quxiaohebing\"></use>\r\n                </svg>\r\n                <div class=\"name\">取消合并</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-quxiaohebing</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-wenbenxiahuaxian\"></use>\r\n                </svg>\r\n                <div class=\"name\">文本下划线</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-wenbenxiahuaxian</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shangbiankuang\"></use>\r\n                </svg>\r\n                <div class=\"name\">上边框</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shangbiankuang</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-dingwei\"></use>\r\n                </svg>\r\n                <div class=\"name\">定位</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-dingwei</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-sizhoujiabiankuang\"></use>\r\n                </svg>\r\n                <div class=\"name\">四周加边框</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-sizhoujiabiankuang</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-cebianlanshouqi\"></use>\r\n                </svg>\r\n                <div class=\"name\">侧边栏收起</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-cebianlanshouqi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-hebing\"></use>\r\n                </svg>\r\n                <div class=\"name\">合并</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-hebing</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-xiangshangqingxie\"></use>\r\n                </svg>\r\n                <div class=\"name\">向上倾斜</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-xiangshangqingxie</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shuipingduiqi\"></use>\r\n                </svg>\r\n                <div class=\"name\">水平对齐</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shuipingduiqi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-wenbenshanchuxian\"></use>\r\n                </svg>\r\n                <div class=\"name\">文本删除线</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-wenbenshanchuxian</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-wenbenyouduiqi\"></use>\r\n                </svg>\r\n                <div class=\"name\">文本右对齐</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-wenbenyouduiqi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-qianjin\"></use>\r\n                </svg>\r\n                <div class=\"name\">前进</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-qianjin</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-tubiao\"></use>\r\n                </svg>\r\n                <div class=\"name\">图表</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-tubiao</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-youbiankuang\"></use>\r\n                </svg>\r\n                <div class=\"name\">右边框</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-youbiankuang</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-baifenhao\"></use>\r\n                </svg>\r\n                <div class=\"name\">百分号</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-baifenhao</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-geshishua\"></use>\r\n                </svg>\r\n                <div class=\"name\">格式刷</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-geshishua</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-baocun\"></use>\r\n                </svg>\r\n                <div class=\"name\">保存</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-baocun</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shujuyanzheng\"></use>\r\n                </svg>\r\n                <div class=\"name\">数据验证</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shujuyanzheng</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-jieduan\"></use>\r\n                </svg>\r\n                <div class=\"name\">截断</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-jieduan</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-geshitiaojian\"></use>\r\n                </svg>\r\n                <div class=\"name\">格式条件</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-geshitiaojian</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-zidonghuanhang\"></use>\r\n                </svg>\r\n                <div class=\"name\">自动换行</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-zidonghuanhang</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-cebianlanzhankai\"></use>\r\n                </svg>\r\n                <div class=\"name\">侧边栏展开</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-cebianlanzhankai</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shaixuan2\"></use>\r\n                </svg>\r\n                <div class=\"name\">筛选2</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shaixuan2</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-xiangxiaqingxie\"></use>\r\n                </svg>\r\n                <div class=\"name\">向下倾斜</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-xiangxiaqingxie</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-yichu\"></use>\r\n                </svg>\r\n                <div class=\"name\">溢出</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-yichu</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-chuizhihebing\"></use>\r\n                </svg>\r\n                <div class=\"name\">垂直合并</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-chuizhihebing</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-wenbenfensanduiqi\"></use>\r\n                </svg>\r\n                <div class=\"name\">文本分散对齐</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-wenbenfensanduiqi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-zuobiankuang\"></use>\r\n                </svg>\r\n                <div class=\"name\">左边框</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-zuobiankuang</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-fenyechakan\"></use>\r\n                </svg>\r\n                <div class=\"name\">分页查看</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-fenyechakan</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-yunhang\"></use>\r\n                </svg>\r\n                <div class=\"name\">运行</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-yunhang</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-lie\"></use>\r\n                </svg>\r\n                <div class=\"name\">列</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-lie</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-quanping\"></use>\r\n                </svg>\r\n                <div class=\"name\">全屏</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-quanping</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shaixuan\"></use>\r\n                </svg>\r\n                <div class=\"name\">筛选</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shaixuan</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-gengxin\"></use>\r\n                </svg>\r\n                <div class=\"name\">更新</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-gengxin</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-qingchu\"></use>\r\n                </svg>\r\n                <div class=\"name\">清除</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-qingchu</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-hang\"></use>\r\n                </svg>\r\n                <div class=\"name\">行</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-hang</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-zhushi\"></use>\r\n                </svg>\r\n                <div class=\"name\">注释</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-zhushi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-jian\"></use>\r\n                </svg>\r\n                <div class=\"name\">剪</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-jian</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-jisuan\"></use>\r\n                </svg>\r\n                <div class=\"name\">计算</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-jisuan</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-jia\"></use>\r\n                </svg>\r\n                <div class=\"name\">加</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-jia</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-dibuduiqi\"></use>\r\n                </svg>\r\n                <div class=\"name\">底部对齐</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-dibuduiqi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-xiangshang90\"></use>\r\n                </svg>\r\n                <div class=\"name\">向上90</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-xiangshang90</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-wuxuanzhuang\"></use>\r\n                </svg>\r\n                <div class=\"name\">无选装</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-wuxuanzhuang</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-xianshiyincangwangge\"></use>\r\n                </svg>\r\n                <div class=\"name\">显示隐藏网格</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-xianshiyincangwangge</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-dongjie\"></use>\r\n                </svg>\r\n                <div class=\"name\">冻结</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-dongjie</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-wenbenzuoduiqi\"></use>\r\n                </svg>\r\n                <div class=\"name\">文本左对齐</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-wenbenzuoduiqi</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-houtui\"></use>\r\n                </svg>\r\n                <div class=\"name\">后退</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-houtui</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shuipinghebing\"></use>\r\n                </svg>\r\n                <div class=\"name\">水平合并</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shuipinghebing</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-xiabiankuang\"></use>\r\n                </svg>\r\n                <div class=\"name\">下边框</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-xiabiankuang</div>\r\n            </li>\r\n\r\n            <li class=\"dib\">\r\n                <svg class=\"icon svg-icon\" aria-hidden=\"true\">\r\n                  <use xlink:href=\"#luckysheet-iconfont-shezhi\"></use>\r\n                </svg>\r\n                <div class=\"name\">设置</div>\r\n                <div class=\"code-name\">#luckysheet-iconfont-shezhi</div>\r\n            </li>\r\n\r\n          </ul>\r\n          <div class=\"article markdown\">\r\n          <h2 id=\"symbol-\">Symbol 引用</h2>\r\n          <hr>\r\n\r\n          <p>这是一种全新的使用方式，应该说这才是未来的主流，也是平台目前推荐的用法。相关介绍可以参考这篇<a href=\"\">文章</a>\r\n            这种用法其实是做了一个 SVG 的集合，与另外两种相比具有如下特点：</p>\r\n          <ul>\r\n            <li>支持多色图标了，不再受单色限制。</li>\r\n            <li>通过一些技巧，支持像字体那样，通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>\r\n            <li>兼容性较差，支持 IE9+，及现代浏览器。</li>\r\n            <li>浏览器渲染 SVG 的性能一般，还不如 png。</li>\r\n          </ul>\r\n          <p>使用步骤如下：</p>\r\n          <h3 id=\"-symbol-\">第一步：引入项目下面生成的 symbol 代码：</h3>\r\n<pre><code class=\"language-html\">&lt;script src=\"./iconfont.js\"&gt;&lt;/script&gt;\r\n</code></pre>\r\n          <h3 id=\"-css-\">第二步：加入通用 CSS 代码（引入一次就行）：</h3>\r\n<pre><code class=\"language-html\">&lt;style&gt;\r\n.icon {\r\n  width: 1em;\r\n  height: 1em;\r\n  vertical-align: -0.15em;\r\n  fill: currentColor;\r\n  overflow: hidden;\r\n}\r\n&lt;/style&gt;\r\n</code></pre>\r\n          <h3 id=\"-\">第三步：挑选相应图标并获取类名，应用于页面：</h3>\r\n<pre><code class=\"language-html\">&lt;svg class=\"icon\" aria-hidden=\"true\"&gt;\r\n  &lt;use xlink:href=\"#icon-xxx\"&gt;&lt;/use&gt;\r\n&lt;/svg&gt;\r\n</code></pre>\r\n          </div>\r\n      </div>\r\n\r\n    </div>\r\n  </div>\r\n  <script>\r\n  $(document).ready(function () {\r\n      $('.tab-container .content:first').show()\r\n\r\n      $('#tabs li').click(function (e) {\r\n        var tabContent = $('.tab-container .content')\r\n        var index = $(this).index()\r\n\r\n        if ($(this).hasClass('active')) {\r\n          return\r\n        } else {\r\n          $('#tabs li').removeClass('active')\r\n          $(this).addClass('active')\r\n\r\n          tabContent.hide().eq(index).fadeIn()\r\n        }\r\n      })\r\n    })\r\n  </script>\r\n</body>\r\n</html>\r\n"
  },
  {
    "path": "src/assets/iconfont/iconfont.css",
    "content": "@font-face {font-family: \"iconfont-luckysheet\";\r\n  src: url('iconfont.eot?t=1605236775724'); /* IE9 */\r\n  src: url('iconfont.eot?t=1605236775724#iefix') format('embedded-opentype'), /* IE6-IE8 */\r\n  url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAACJQAAsAAAAAVKgAACH9AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCObgqBghDoEwE2AiQDgygLgVYABCAFhG0HimMbCkZ1hhxsHACQvM8iooIUIPv/vyU3hoisQDP7oxQspFSOEhyEI964SGdpHgbZQdChvkX9Xd97nQ+VaIq7d5noG8yfVj6tSWbtWNLPqLzFBpnESCbt5xn252+nSxLNW5sNpeTh+f39/481976wz7uPRtUHGDrbrw4ZrEQ+o9sQS7AOLVwR9wAYHufsX4sltIw2UGCOWN/DZAYtWnRGXhjMYFsLlBOm6ZgkU7ixOUVm3hSYSZmdcy3Ttndf4ESBU8/fv9PPcyR7254j2T+y/RCTRQgUIXDBiWYbMHXqvsls3dZt8yP9Sr8UeI/jYBECy2DQpVnHImNkw4UQi/rrnSeKbo3ABwpVbnt7MIAxZW53t9DyQ2dMry7DVAd+ALjBeSGPOIh9Xfq3yXEPE8N0ZWvf3u79xy5A2HKIRLDVxEQAD/zfm+lMLBjA+E0Di+KU9uanlEK1W7V0DFgDrXU7yJ4lXCBcov15demKDpPSOimby7C0sjnTlu3++0jcl/hgIbgcAnwn3BBuFBeEGwh8Vjk7ve+1wbkBaZxrn1Lq5im1jRnWZJnalH2IbiaZdvxjNFLYNjjuGFPLYXaXebSkr0ZxoxJ0Q5TYn78moVKvgrRuw7Z9FDmzmGDZtcsXT1M8rfKIsqS8oZTyYT6c9itRHs+EAy+Rv59+NScRhJKM+eKuC+vPAT8+K8geLvKTY47JsOvG/iMyFJATC6ijaZbsa6IgU/laM085SuVr48fXBUURyyJFWuHz/9qJHr369BswaMiwEaPGjJswaUpBkxmmzTTLbHPMNc98Cyy0yGJLLLXMciustAqEYARlstgcLo8vEIrEEqlMrlCqyA5ptDq9wWiiOkVz2mojOedguOBye+g6Dn+yRq069Ro0atKsRas27SqVq1KtQolSZUIm8j+eVMpcWg0li2DyBubHB6OHH1/08uOHPn780a+QhKGVCLQRhXZi0EEcOklAF0noJgU9pKGXDPSRhX5yMEAeShRgkCIMUYJhyjBCBYxSCWNUwTjVMEENTFILU9TBNPUwQwPM0ghzNME8zbBACyzSCku0wTLtsKIDVnXCmi5Y1w0bemBTL2zpg239sGMAdg3CniHYNwwHRuDQKBwZg2PjcGICTk3CmSk4Nw0XZuDSLFyZg2vzEGMBbizCrSW4swz3VuDBKjxagyfr8GwDsmzCiy3IsQ2vduDNLrzbgyj78OEAPh1CA0fw5Ri+ncCPU/h1BvWcQy0XUMclZLhKi1S3hrQYdRuAPLdQ4A6K3EOJByjzCBWeoIpnqOYFaniFJG8Q5x1SfECaT0jwBRG+IcoPxPiFIH8Q4h/CBNnZNvqzb/2Hgm+XX6shAPDIDn2nEKAqnKGBUOivZA4KW0gZvafr3BQtvdGQKGOXK+jxMuHo+RqAUxEBRoTkYwZwmLuk6nyIpr4UPapkojiXpKlDRMhw0F0ARQPDTMn9UPjbkHEt+m4NOCLsVWbo7ZitUp6Nl3YnrJ8iAvij7nsIRSkYT2AfwVuji87qVBm1Q5gVmYuFsYgqpu1Vy0P4b7e3HTaoWtKXAeiIq9rtbDfJnFEJ3yZ5C9vMFqQ4rUyz9jyEsVO+bind+meT82iX3uh7WLtf/mNHA48h7jF5ypzTlCQcv5ubeehZSly2XeCJ32vWw0QsABZSz1MRvFzCulXrUUotFpgPLHGctww3N2IaitXjWLBtPW/2mW0J9wozblPnTXu/syRwarVqYG2kKhiLdIG7JvyWsZA0S5cPgxEReXFY0nvhZ941sR0MJUHkFQ7CcX3kV73dn/vD9HnX4zD1iwl79nujL6+lfhIthTEg9FMWn8HG31mJYxBFRLi2SxRsAwoSjCwtLT6/QJHjxcxpyU90trhORYQlNEVoAbGpu2GbosgBG5OkOGMFEfxEaXYgF207EO8w4/rRVbtzcBw43CthsjtfCmL0OBzGXkRcHeMaT59lMFjZVw728rXpog0WMNByJpe9kcvkvWrDIJPwkHN5yI1nKJtnLIbJvJ8CpC0DZRiQThkg5CyOqcHwGnJsLMnghmXYs53/HpcMFoqT/eerkoBVBRRvYxNPHyNNQeQAMCbForbAXiTgZZUEjueAtXnoH7H9zuDi/f636fbH3VdPrdw7eOuDvyN3Drx9st7snrvX+5YNXiGOS91Vux7s+nvhzs3tVjXr8khMzBjJllUMimyapCU9KmwhxrSFdmeVw/5mgCsEvEiy8ZkC1iTTAU42MpStqBEbthqWYkhbLgMBaFuGFwUJmsImfqFKWJCxL1r8hd02vNVOgzRus/VWrCjy4oKdpn6SKxVsiIkZw6rhBYfJ0ioZ2Yyr7KrxWsTdUMmVwKlGtwrS1ultYU0lJS1djQX9BLXJhOoliVrLa2MGmSNLpp8EEYQaEbKMOzWImr1XRLBD/hlFJXG5xhnaCoujC6vDbSYgxnlndOSqiujC2Qxl22EM0UsdJhFI0OZT0U9VILjQS2YtDWPPEV0vq8QfBoKrSKAHyyJalTzpy92Iwf5WDXQ3S/2q3vzeMmwXM+YKRAR/h9PxHVkIvwFsEtzcp+DwLBJ4+XCgqUvB6/4bz4T/Pc73+xR8db87+loFX5KsNIk0O+CSUDQjKiH6L+5+++17E/2rKYc7xznuge8C/0LnW2+dDjxMwe4J6lXQf4PD6zuA0X/0TxRc2riGZNwIx/9/llacjXLVM+x//fV0X5b0Rg803Tl6ZlCLGA4ElEGzGAlFrfbrXd/hJgPp8rNuV+c1+a1er/vwe7Xu7jetCgFvHT04vKLIQFoyXtkoqm5Vf/VgZW/mmwgdUXO134d5bvrXE1+a/NVUpZ53p2sTjcnqVPtlUiRo7hHBzVpuzpDaVDNCmVqWW25HVLJeSgtSp3EcOaIllJZKSBcICf+RFv75kffh00vkrXbCrXV/bTPYWNHBp6fg1kF4dBb9z0c6O8Bb2Qg21xD9vXmtro0S8MjcP2KMGNpoenQ72E1bWkjTZVjZvmRt7mLW37vKQOMyw4vZDtO3GVuded3LdjpJXAzjlahVT9a3OoXav3vXV2/d/cOl/f7YnwY6uvl2oD7xP35241LkqBHnj92H97tjh/3xPw9eGF/Va1d0utVZdao7gzf6EvWmvRYH5rLnK+YqfX2EgUYrd2AoN80Jtw9ZarlGYyE1x52d4/fqIPUEru+NHhlOvi8J6agxKY/J4glz+UkpF7jsMZnv/i7HCrHXkhldR60gA2NqEQBm0U7RAJic1QK4pFWF9GUBqGRNBQJ8CNrihUe0miylfnEoCRxHOMClR93J2HOqhI00VPNASU9MpGFcaFgm58huxFU7jJuGt3PZ3tpDk8P1taRoP1P7aUlYIlwOG6QmCpuboJumMlQsukPbI2cFN+egEZ0/61w+XF2hXLC2Lmej40W+LYdoKBKfSVtT0swQMvpJseQMBxjI1KBqVyywFVhYMyxzwcmtM1CLYbGwWFElDpCgiiqMKEXPBlIPSwaVjUKzllM/IVLiJIlZj+jsgDuXL25S0BWnKLJORTFz2coISy7LOIkSFzhN1z68pJA0g1KqkGlkBBAUREHAtGEin+IneJbKmjRrpB/LAgto2GDJRzPoJg1fEUpAPpsztNSLYWdVoew0be76e8sCijlqVCgZ5PMKhFDDoyYb4+0bLAEVjahP/nmqqrOcsTFjGX++lJObZLTOHDQpSTQZU1S1o1/eiiYbVAELF8jkebSh/cISZioQkoInrF2ENKuGiibeiQ32kSLQjTJWs5YFMgsAFQEzw038skAXWVcEJVHAO7VZVZTUykJGxVtZ0Tl9W/opzIh4uUzZqVExcuaNHOSbxrI2Eg4uthqa52oFfWWW2Q4heSUpiH52C642GsGGhbsRFkecw7h2mgbYSvmpSEY1nXPsZg1+aV7KBf/+4iwlzyex258/q9mj2QIvHBd26NZn7uaVRmqL4OrxYcGbauMtOztwKOj3/cGAez3ZTR+lv9Hc7bQqtBMqbMacn7IsEMBh5YURAn2N5Rk7h07xS7obDn5diqFxQh6rCDk8xkjjTYkF+bAS8poqltS3pJYMhNWhBrUstOcnaBMgHJmVemgECca+aasAoYupWuHBignS9J4SwxIAP0341LMF4jSz5vc/7xPUziYygdfZwjnK5DHnAt/tfrNfpTkSEYau5xDqt9ZFyuB+v52hLC1sqE0AMwt2kkapL5b4qUpGJZ1z7CqGpv3Cz15svDXnOfox3+6FB4Mf/eNT77PwC//z+kusDbwCLURGGwlyqJxNTa0nZfoJ0bRzWMET6jFryDx0AnJCmX64NG/Quj4xeW1qYmh6anhSA7PHAwuXrgvl0bY5Q7MW2r8kWMbi9V8hsBZsCtA4rsnxRwjm4hTqYaWHBFMjXZSAtcQEAQ+eTUuG3QhyeHFzrujQftvWxv6x1eNeDPth7aUUwlIqbDO9d/L2ofCjkoiAwhlKXN9jUGNnpS3QEUNa4WYl1OeEFEDI9eEacreOypDOYV4Ny/oY9qoY6AEI8zOzwIORYbwvlvQ/HQdHIgOmYl9YT1nhKVmRLmMsR5UkjTam5TIel1mMOUGExd5CbDSTcRZ67+rFhgwIn9LsRk4bWNNK1F9nRCGOJXWqiAnRilfl2mAVHTsoWU4vApNEqosFOOBsz9+sTdTt6lRjbmYF/AU3vJ1wz98NtuV1ss5Bc8xY3bnMoJdOqZPm2m653wgTT00+cxhlwl2wpLBzWai+ZKGtZvPfcVmho0CCAM2oXxSolLg+brA5qgE4S7xUbShb1ticnbHa9TiEZdh1Nkil1WvX6sZwVyCjRiK9tOktC+zv1jxr3RrRSqHqD74YMOwk4qnoL7YZdR9qfiVlZyzlML9goAYBzJTtBA3ASvqpTkYFnXPsZoz6y96z83f7jk/sDLpf0hHYdXvXXTiad2e1q7qP9txeI316T4aZVefu9B4LaVfdK5a1BVttbXfU5mC7pjPo8IlLtpjO4DPhHfTZ2z0nx19ME+7uuh17Ex453Xc3+vjUC7ZLZyZYMy132mzohrrrVO+dqGOTApnr7z7kHw3IvrsS6V3fY5G2b6xaTMrdbqg3FJfpAxxKXFJmyU8rfG39hsnv1isdlMFQZ3ioC4xlq4qpp+QXdl/SnW/RK5yMUgnqddd6JWU4wP496D2vOq9FRxd5e72/ohCPAEKocl+TQKz1OUxMkoF0xTZFgVI2mXg1WEtaapSJPOLfwitO+aYRV1xBgyUbvU3ekV2REZ8L7SGiE1pJaNQilbIhalQhbWOerTULv14WN0VJRfLvHvps95YNy25Nu+WNZf+Qf5TvP+afrpge7N/2vff3bf7B0/0LfN+D3DzgO6wa9h2QDQY9llXyq2f9OgiNuVxjKAjlvnq4Fa1R7xGpgMzBrNAKUq5amVMgBIOJIiAAIRqsEUEERA7hJBgiELlskRauDA8YUnYhK4DoZpII7p9r1IgMZNQWDLFasJCbLSCPEzCPBY6ntt3IJ8aCAui+tKQlftx6xOLm3UYj2U9CeVmZHJ7WUtsZwhLkqeW1fm+F7n/AY16g8WoZpMx9j67AigwPadbUh/qZhsmetTqdKqga1/x73VXq+6vXpi8/uNjww5R/n4akT/GcV6Tz8sZuz50601Oa8T2mK2jFd5UUG8FGstI6IHCYFoBTYAwgLQLx6VdJnooVUbrxVVcuK1tb+nye9/VGtZ19yZ+BxyDltEDj6uq6R6/PGhm9ZuCI2+UKHE3/9z27Y/KI3Z68PBDE+KMqoiuZypC71diyfWvWsFTju19kwZ9gE64Jej6JIO0BdjKiih6ESUq/iTW0spnFlJM3+Q7pc4Q64uOcNqrNR7j6gmGwcQJZs4tqq2lH7mHg5BBCbeYXW4brrJsT1TecGRadbwbhKkF08Yvgp4P3P3D1zkfzc5Zdv/7t3ICh6TOGgr/Ly4Nvvz0c/OkLoq4woKfn0SPwYJ+zXKI4lB5vjO5SR8KqKpU4y74+N6v5webqKjYZoh3wSQvo+SGCdAQ4RO1gBuB4vQKN19trchPY8kJ6LAi7WRECd15dUHhrS/T9ApzO+jW5CjC5cjC5CjK5CjO5CtRPLnIQNhY84Mh+wi0vLZW7SdtNjrzjM+xzh7KlgVvBKmmjbCRUjWzCSoeCMRr1StxpjMKhxAtJsgLAm4eV+gajHvRPv9ULgebHfzyuf/ftNc/t0HHbWM9r33533aNKw4LdHnfvStvapNEz4SfVdzwl+9gQs2slZPhfUAiuan97rWTgRyLrECouLX5v27sh0YE+7xU/3umvLdfKcosIXTHsf+nrprCXXy0+Vj5TO/vMZtB54kATsWbc6oOLjz860Lpk51bf4uf/33x1YE7FWOXYnK2503deXWs2xtVf2ST71eof6PP+5PCf6nW+9duyS1IS4uo2H534a3+wuizq96U6cs1F4g5cEREV7Q0fFg/mXnmeNXVDL7xW/Jwgcm9MuVds/2t2eMylrN+rV56fV8IsB8UVwz3HnwqVrdpSEB2WeyOhN/yS+N+qa2/G8PKSbWt1rUllIDtkFpIfkdtKZpU0Fk0un7Xr2mIjM+KAk7Mia73fvMFOiYceOAcFQOEjMC85vtJ76e2psQ2hK6vzLysVv/eZ+z7qjGt8fv1386an13zQ5clxrZVrW71983PekhWVFszxeKuorKzoLY85BaVFsre8tlZLWVbaQ1axpmpJlcRk6q/axALWbnvxwqbYNAOik8YCML9ha2iwxZ+DqiCKexSYUOZ8p9wZv7PvV3x+EYgwRlIMhKI5kdXjFJwceAD1+2MIwV8gDmwtMcdcq12+pQTJ5S82ZVVMPfCf8r//+eA/f/+9/4P9+69fr/cC2b5Iu1Z2Le0Lg7hqStFULQg0QvnpmcEzTwefmRE848yD4QilFHuKm8UcRyjVCpbCYRo5plpiB6qqFYWmgIXNpq640FiMR1s2PmW6+9ZnMESl2MgWah/Oe1CWEGJvDki5womJVbgULRSgWhSjyDVGWiCthIMY81tYPon8/nustCuZOdB6Zb+/nxciHRIbmF1EptQHTakxydJfLace/Dic3Ji4f5lP5ptgQYHyfx9RHt8WztB/EqE14wtXdqQuBKuk809mLvPZv4pYTnxC++9YOLLj5T/vbjGbahK86/veuJHj+aZX/qIcL5dXLgis3k3NNY0jJnDK8uWr/gazqLkluUPEG/XCWjzNQ1ykUqbIVmp/889g83LBGiAKDxWs5GFjsERtIBxExzvGyLnFdhhajG6LEAgTHYVc3ixCFWBAJpaYKECZCIZCRNoJN2EnUXrL9lAEDOJA/lnFSzmH6rFQtlObGZXEvDHBu+KAo2cSI1zUdELR0qf6kIk+dALDatG43ilcPZFToFMEa8sbLgRi8TCGBC3u/YcQAlsDBKFALwiTq2zfMko8ZFAy337xhWVWVrf+n+n9jnDHxImm9bW4PfzseMJBAlLeYxCsdwg1zwACyGapSAfQQKuyVQEVrUorkl+/Ln9EEHODSjxfF/3zZL9mHXmXB7yN2NI+CMtqTAQLiFkQwwcOjyyJhj4BRRSAURrK33xTjqJrOYYltqM1HHRhkFdxTJE48CMAvoAn6QkgsAM1fia7v+U5OTT+Kw4J/rKg0508Y2UghwGGEDAAqoEVQJqHPAj949VEi4XOyJPl09NPq3BHVXcTOah0kDsBGI7L90tDubkvN2pWVXyaX36c/QySkv9QeqV6ZHko65rDawLS1gV47quT589qkt5aEZyjmyHTrp/v7bVLmuYxt6TRHw3PaV6epS+vnrYmIKJTiMhIygpV1m+gmjwy2QDPTI90j7kXPCjQ97m2z8s7ydu7L8czOmDJKqV32OJVERkHd5fVl8UtU0as7TtSOzeGlTD6mE0b7VOFKHbDQASAooCENSuqqrnQEA5HkazOne8zcn/dsuMtGoABvHZ857rakXvcXDm6FnQNyRVsHDl5XpNO5TjoaHA0OA8e9//zSD0AtIKesGAjXeaUSNMPJkQ1dEc3xJ+1SEG5897M8+upO+UtOIiemoCT1iLADEPoAtwN+sbf08lJUdeafnDLCOMzaQG5kQtaAfz1+uAgF7PxCovM2IzMPOLNmw72u1jMngEgipJSQCEFHq3UODopmthhoyuQUrFiDWR/CAsxFceov5CCUWhSMxkYJSE53uOkxgWUikXXA4UQM3NYQqDysQoVjHnTfh6SdkIlMjBSGGUG5EWTA9VgWtpa5kgYCXuPUIqGKjyThGQ/TwE3bx4jrBGLvRkKqyqKqlHyTNY1Cq1ZC7tc0GVRuaFbwCJ+cBvUOEfHgYJAAMDIIb95Fc+z8ezyVIQkc+ob53jMe9ngNSdNI6rcKhUIsruCgCpFPsh1XBBP8CdQj+OD9DVqynuLtGpdA8ybFV1xgeYTrPMggmLA4u+TGJgARqtGqWRpWlrqs/ljKru+pSV7Jchn3zIkw6v3QrMbNtUOPLYJg5c6nL69X8FK+Lm9BidOl8clzK1OmPOZVyRZulSikxRdRYPeO+BtBcV+q1y0LA6KmpkES80lCPst0kYGkR/YxQUGmyKX2w59GzNIX9KNiWa6umosZplQMzt58gyPljnIOeggfMngUgD25nxvSGw0JhrE1XsUYKmjtOQkxh/F8zxML8gfKiycDpxGAQrqveN+sWF2PWLx5IDRvSNsMzJhADkBCSPiQ/hQrRqDY0IgRtiNMx84AQKCM6REUp/+EYexbbKDPMThGDiwBpjy/0yUWVHBKNcJSZMJU7ixUGu4pUZTy+1loQjVcqIIQm3nDQiIAmIYhEYvOu98saDwik5SU9MBc3IrFtLpC9OOKoeqJM5mPHTh6P+V0GTBIegCY2Clqe1XDmUHYadatMrCxFyiAc6rAct8bie0rk7gQQJ7hHSNOm0RrC2kp0wprKit1VWMG6ej65Nki3x1votkJlWNjvZJNTWRPXR9qOwH0WG84t/0UaRVubFbZUQdiAFuF7TyVkBzWkIGeFFY69JUOmnxEc2S+AH1wyVO/OGfZMeArQF/JQ7124ZsPzr6T4PA3cjFA4hcic+GzeaHQNyuO+97SyAKkIFAwkNercYM7n0ZmsaxxvZRq6r4Wu+hvgzXtZddVykhe3b7wfqwEboyOvrolAgozY58zO7QZes02xfP8fQ8vw0x6BObGZmfXiq69JS8iBxJVaG3d5VuUogPbu6OVfmGfVUe7qVnb2T1wtSdGkcE+FDo/N40zvcniVJy4oSF1O9vrpjrWxge7DnJesHDF7T6LAISibVHT/5dV3mR1J+52EpQ4zr9wgnwk27pIJDk7BFLQ2OjIVHck6MAg0vfPFmCcfzHPI8yCgqGdLrpQLyTgbx9obsK+0T7VOHurVvlEP2EmnDJuMzgIIMYAULO5m8rHvIb+pMdKybZ5LAiXDgGNrCc6RO/oOwdZVOBTlr5EAZjC4Fsje3Fc0f8+f7SEhsY1WCIeYzwTSC+W1EQrl08L6gDQhQnLAJd8LmSWmTG7Dkr9JTX1+YBPcekF90Yv3xS7ZF1BolMb7JQ0vpy4AJldfnR+TE04UtuIbAE+9nJWykr+aoYOw2UNJ07Z5PwCdICJ8cghmcgdqIhwNJ2P+Uk5cRb4Py+Mk9cARQrQSMvp5HnOJXiTVRqPpQgUcvvJeC7oM73BUnLrOjJmJiXPEHJATAFnIIAl3OghBGIUSY9bYz3V40SylwSSfqhhGhjl3ri0w5KML/r/qzzzZsfPBj4wQR5IgcgUFfQPCVWLWY6/yIRjYxYX8i/KYTPtz7E1CGC+KZvFityPSimBsHHspyhHY4Ea9JTVlLZD/S3cXFoua08ipA2ZUl/6YTcciN018In//sI6ZPY34t++VZ2EKMXvbh+tWZgtCwUymgLeoEHDiSfcutLTGWGYH177hb9D1eSDoC6g7nt+hB9mal0zcqQ8+dCVq4pZctvNuZQrpd3KjideBrUncm5joMNWWzkTp07HxJu2Lm3p7b+9yXhP6X9FL7k9wW1Vm5nJbNzX0D1xaE/pv0YuviPytqjezuiHvjnJFjioyGWhCnycpOIqFmzPw935F/u7KGiefzHU7PJsJIxm+oLT7vuSxDvhJvm4GU9WsmJXFwT91wVz0WxqN/4InyKPED28Oa45TfEK4vofywig9ELs37TZzIS6AFW0asBfD+Bl0ZluWtLMF5aQJPOiB5dUaw0kSuj06yKkjiPuEpYgkQyAzq9NTpoagqOtUVJmbcmPuwai9Rk+jxaZTzF58ZSHszNJBzv974QWFRdsirDUVzZbJejLnPestqahDO4su66JTY1DQfc0PEtgYeLf+LO0PVAoKypqWLhaVqr/iFb1GUViByfHX3/7fvb2PvoWTo3W/a/V+Xg24gY4h2eoXLtG0v8J6/Q5G7/4/1fXs4MXclf/tr4v9BUxr8SWIOEK6nfoKEGKi/dFKG70Q9dS1sSqyTlHs/eHcr0uDPlhpncVXCXqDLPXarcSnelKRvfvEqTO3gpr8CkJzbupN4H7lDrIzGjmbLA5K7v3SVa/e4uVZ883JUOpKYWq4ymqZdX44QQscublFMr3Kszrq4L/6DVASY3Ry75j1OgGXldVLdzv5FxYtEg/NpzjH3eT3LNvzZbhsMg+TiJxzYWLsbxsyx72g4UrVyfVuOEELHLm2QPS61wf/dx5fvif9DqAFOE7uuw/3EK9OTzuqgSMN8CJ9LlRRt+7TmiSJ/jpSe55l8ogsNlluQjfU0e21i4DOr4WSKrPqlQlE+vsuVRUGm+/hVMTlQgRUyquPCfLBIhKf+ocWTNAUSYUMaFVNpY54MwipM0y4uyqpu264dxmpd124/zup/3+0EIRlDmNyA7zeHy+AKhSCyRyuQKpUr956J3Sac3GE1mi9Vmdzhdbo/Xd4mu7CdgT7jsIBHfNOnxK5LwGpg7Is2O1qchGwKJtOpx7UkHYDNqFLareKlGvW6jB2wxqHTEdjk7Be5A6lUS9ZsmUTRrgTrgs4kUIS66zKjoYP0eJdZv9oBrk6h1Wi+CQ7YPrTeMdFFwNAS8vxHbMDU4oEdA9uGO3CAHE3tOsF34nyjNUQecB6TjXuTg9CRvZ6qinGiE7PdBrJzfbN+OHZRCH9XKaNUE0bvSGKvADWWp1UQW30lsgHXsnAQccMkB0Mm6jIjXmOYSR8tIBa0TtscZhSXwRiR01h0pa+q/xjnzhCOxPb3zvCsK95kGEzJmqYuu75oc34nPZETBkHtIT9WQvc4F5XRKN3pvO5Y/BBGL5ozyoVk98es6kBqNubiJOhLw6hGcIPio7iEyAqVNzXS4aUEBKJlmLQRtCozmvHli7F653tyaWBGHzbaolSJOwZZ4V0tFTKACGXekU6Bqm7QAed+iww8VFkX58zAzHFucbafUNjil+sP34TuWxtYKfmG7SBJFHZlAEMLiog9RNjRveXWXDVCP7ECWFoMjFSqYBqRVLiHLawKexYYOm9Up8DYOiS+8LyU406BGKXjmLXDgnszuGReg5dDtPO8bmeVfeB/4ZIth3LFCerstGoCr/aDNrFJvUtISUq8D4aJz4P79C+bBzKI4cTZp+Ld4QTOPH5WMp3CILztqe8OmOVMfVdw1NR7DqGs8k5RtPlQ2hmWME41Ku0b3VBbyKBqcBcHh7OgJAAAA') format('woff2'),\r\n  url('iconfont.woff?t=1605236775724') format('woff'),\r\n  url('iconfont.ttf?t=1605236775724') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */\r\n  url('iconfont.svg?t=1605236775724#iconfont') format('svg'); /* iOS 4.1- */\r\n}\r\n\r\n.iconfont-luckysheet {\r\n  font-family: \"iconfont-luckysheet\" !important;\r\n  font-size: 16px;\r\n  font-style: normal;\r\n  -webkit-font-smoothing: antialiased;\r\n  -moz-osx-font-smoothing: grayscale;\r\n}\r\n\r\n.luckysheet-iconfont-lianjie:before {\r\n  content: \"\\e7f8\";\r\n}\r\n\r\n.luckysheet-iconfont-dayinquyu:before {\r\n  content: \"\\e7f5\";\r\n}\r\n\r\n.luckysheet-iconfont-dayinyemianpeizhi:before {\r\n  content: \"\\e7f6\";\r\n}\r\n\r\n.luckysheet-iconfont-dayinbiaoti:before {\r\n  content: \"\\e7f7\";\r\n}\r\n\r\n.luckysheet-iconfont-fenyeyulan:before {\r\n  content: \"\\e7f2\";\r\n}\r\n\r\n.luckysheet-iconfont-putong:before {\r\n  content: \"\\e7f3\";\r\n}\r\n\r\n.luckysheet-iconfont-yemianbuju:before {\r\n  content: \"\\e7f4\";\r\n}\r\n\r\n.luckysheet-iconfont-biaogesuoding:before {\r\n  content: \"\\e7ee\";\r\n}\r\n\r\n.luckysheet-iconfont-zhuandao1:before {\r\n  content: \"\\e7f1\";\r\n}\r\n\r\n.luckysheet-iconfont-youjiantou:before {\r\n  content: \"\\e7ed\";\r\n}\r\n\r\n.luckysheet-iconfont-caidan2:before {\r\n  content: \"\\e7ef\";\r\n}\r\n\r\n.luckysheet-iconfont-tihuan:before {\r\n  content: \"\\e7f0\";\r\n}\r\n\r\n.luckysheet-iconfont-dongjie1:before {\r\n  content: \"\\e7e1\";\r\n}\r\n\r\n.luckysheet-iconfont-jian1:before {\r\n  content: \"\\e7e2\";\r\n}\r\n\r\n.luckysheet-iconfont-jia1:before {\r\n  content: \"\\e7e3\";\r\n}\r\n\r\n.luckysheet-iconfont-yichu1:before {\r\n  content: \"\\e7e4\";\r\n}\r\n\r\n.luckysheet-iconfont-shengxu1:before {\r\n  content: \"\\e7e5\";\r\n}\r\n\r\n.luckysheet-iconfont-neikuangxian:before {\r\n  content: \"\\e7e6\";\r\n}\r\n\r\n.luckysheet-iconfont-qingchushaixuan:before {\r\n  content: \"\\e7e7\";\r\n}\r\n\r\n.luckysheet-iconfont-wenbenxiangshang:before {\r\n  content: \"\\e7e8\";\r\n}\r\n\r\n.luckysheet-iconfont-jiangxu1:before {\r\n  content: \"\\e7e9\";\r\n}\r\n\r\n.luckysheet-iconfont-neikuanghengxian:before {\r\n  content: \"\\e7ea\";\r\n}\r\n\r\n.luckysheet-iconfont-neikuangshuxian:before {\r\n  content: \"\\e7eb\";\r\n}\r\n\r\n.luckysheet-iconfont-zidingyipaixu:before {\r\n  content: \"\\e7ec\";\r\n}\r\n\r\n.luckysheet-iconfont-logo2:before {\r\n  content: \"\\e7df\";\r\n}\r\n\r\n.luckysheet-iconfont-logo:before {\r\n  content: \"\\e7e0\";\r\n}\r\n\r\n.luckysheet-iconfont-wenbenqingxie1:before {\r\n  content: \"\\e7de\";\r\n}\r\n\r\n.luckysheet-iconfont-jiacu:before {\r\n  content: \"\\e7d9\";\r\n}\r\n\r\n.luckysheet-iconfont-sousuo:before {\r\n  content: \"\\e78a\";\r\n}\r\n\r\n.luckysheet-iconfont-guanbi:before {\r\n  content: \"\\e78b\";\r\n}\r\n\r\n.luckysheet-iconfont-xiayige:before {\r\n  content: \"\\e78c\";\r\n}\r\n\r\n.luckysheet-iconfont-xiala:before {\r\n  content: \"\\e78d\";\r\n}\r\n\r\n.luckysheet-iconfont-wenbenyanse:before {\r\n  content: \"\\e78e\";\r\n}\r\n\r\n.luckysheet-iconfont-shangyige:before {\r\n  content: \"\\e78f\";\r\n}\r\n\r\n.luckysheet-iconfont-shujutoushi:before {\r\n  content: \"\\e790\";\r\n}\r\n\r\n.luckysheet-iconfont-tianchong:before {\r\n  content: \"\\e791\";\r\n}\r\n\r\n.luckysheet-iconfont-zengjiaxiaoshuwei:before {\r\n  content: \"\\e792\";\r\n}\r\n\r\n.luckysheet-iconfont-bianji2:before {\r\n  content: \"\\e793\";\r\n}\r\n\r\n.luckysheet-iconfont-jieping:before {\r\n  content: \"\\e794\";\r\n}\r\n\r\n.luckysheet-iconfont-jianxiaoxiaoshuwei:before {\r\n  content: \"\\e796\";\r\n}\r\n\r\n.luckysheet-iconfont-caidan:before {\r\n  content: \"\\e797\";\r\n}\r\n\r\n.luckysheet-iconfont-shujuku:before {\r\n  content: \"\\e798\";\r\n}\r\n\r\n.luckysheet-iconfont-wubiankuang:before {\r\n  content: \"\\e799\";\r\n}\r\n\r\n.luckysheet-iconfont-bianji:before {\r\n  content: \"\\e79a\";\r\n}\r\n\r\n.luckysheet-iconfont-qingchuyangshi:before {\r\n  content: \"\\e79b\";\r\n}\r\n\r\n.luckysheet-iconfont-shanchu:before {\r\n  content: \"\\e79c\";\r\n}\r\n\r\n.luckysheet-iconfont-wenbenjuzhongduiqi:before {\r\n  content: \"\\e79d\";\r\n}\r\n\r\n.luckysheet-iconfont-dayin:before {\r\n  content: \"\\e79e\";\r\n}\r\n\r\n.luckysheet-iconfont-wenbenfenge:before {\r\n  content: \"\\e79f\";\r\n}\r\n\r\n.luckysheet-iconfont-hanshu:before {\r\n  content: \"\\e7a0\";\r\n}\r\n\r\n.luckysheet-iconfont-jiangxu:before {\r\n  content: \"\\e7a1\";\r\n}\r\n\r\n.luckysheet-iconfont-dingbuduiqi:before {\r\n  content: \"\\e7a2\";\r\n}\r\n\r\n.luckysheet-iconfont-tupian:before {\r\n  content: \"\\e7a3\";\r\n}\r\n\r\n.luckysheet-iconfont-xiangxia90:before {\r\n  content: \"\\e7a4\";\r\n}\r\n\r\n.luckysheet-iconfont-shupaiwenzi:before {\r\n  content: \"\\e7a5\";\r\n}\r\n\r\n.luckysheet-iconfont-quanjiabiankuang:before {\r\n  content: \"\\e7a6\";\r\n}\r\n\r\n.luckysheet-iconfont-shengxu:before {\r\n  content: \"\\e7a7\";\r\n}\r\n\r\n.luckysheet-iconfont-caijian:before {\r\n  content: \"\\e7a8\";\r\n}\r\n\r\n.luckysheet-iconfont-jine:before {\r\n  content: \"\\e7a9\";\r\n}\r\n\r\n.luckysheet-iconfont-caidan1:before {\r\n  content: \"\\e7aa\";\r\n}\r\n\r\n.luckysheet-iconfont-quxiaohebing:before {\r\n  content: \"\\e7ab\";\r\n}\r\n\r\n.luckysheet-iconfont-wenbenxiahuaxian:before {\r\n  content: \"\\e7ac\";\r\n}\r\n\r\n.luckysheet-iconfont-shangbiankuang:before {\r\n  content: \"\\e7ad\";\r\n}\r\n\r\n.luckysheet-iconfont-dingwei:before {\r\n  content: \"\\e7ae\";\r\n}\r\n\r\n.luckysheet-iconfont-sizhoujiabiankuang:before {\r\n  content: \"\\e7af\";\r\n}\r\n\r\n.luckysheet-iconfont-cebianlanshouqi:before {\r\n  content: \"\\e7b0\";\r\n}\r\n\r\n.luckysheet-iconfont-hebing:before {\r\n  content: \"\\e7b1\";\r\n}\r\n\r\n.luckysheet-iconfont-xiangshangqingxie:before {\r\n  content: \"\\e7b2\";\r\n}\r\n\r\n.luckysheet-iconfont-shuipingduiqi:before {\r\n  content: \"\\e7b3\";\r\n}\r\n\r\n.luckysheet-iconfont-wenbenshanchuxian:before {\r\n  content: \"\\e7b4\";\r\n}\r\n\r\n.luckysheet-iconfont-wenbenyouduiqi:before {\r\n  content: \"\\e7b5\";\r\n}\r\n\r\n.luckysheet-iconfont-qianjin:before {\r\n  content: \"\\e7b6\";\r\n}\r\n\r\n.luckysheet-iconfont-tubiao:before {\r\n  content: \"\\e7b7\";\r\n}\r\n\r\n.luckysheet-iconfont-youbiankuang:before {\r\n  content: \"\\e7b8\";\r\n}\r\n\r\n.luckysheet-iconfont-baifenhao:before {\r\n  content: \"\\e7b9\";\r\n}\r\n\r\n.luckysheet-iconfont-geshishua:before {\r\n  content: \"\\e7ba\";\r\n}\r\n\r\n.luckysheet-iconfont-baocun:before {\r\n  content: \"\\e7bb\";\r\n}\r\n\r\n.luckysheet-iconfont-shujuyanzheng:before {\r\n  content: \"\\e7bc\";\r\n}\r\n\r\n.luckysheet-iconfont-jieduan:before {\r\n  content: \"\\e7bd\";\r\n}\r\n\r\n.luckysheet-iconfont-geshitiaojian:before {\r\n  content: \"\\e7be\";\r\n}\r\n\r\n.luckysheet-iconfont-zidonghuanhang:before {\r\n  content: \"\\e7bf\";\r\n}\r\n\r\n.luckysheet-iconfont-cebianlanzhankai:before {\r\n  content: \"\\e7c0\";\r\n}\r\n\r\n.luckysheet-iconfont-shaixuan2:before {\r\n  content: \"\\e7c1\";\r\n}\r\n\r\n.luckysheet-iconfont-xiangxiaqingxie:before {\r\n  content: \"\\e7c2\";\r\n}\r\n\r\n.luckysheet-iconfont-yichu:before {\r\n  content: \"\\e7c3\";\r\n}\r\n\r\n.luckysheet-iconfont-chuizhihebing:before {\r\n  content: \"\\e7c4\";\r\n}\r\n\r\n.luckysheet-iconfont-wenbenfensanduiqi:before {\r\n  content: \"\\e7c5\";\r\n}\r\n\r\n.luckysheet-iconfont-zuobiankuang:before {\r\n  content: \"\\e7c6\";\r\n}\r\n\r\n.luckysheet-iconfont-fenyechakan:before {\r\n  content: \"\\e7c7\";\r\n}\r\n\r\n.luckysheet-iconfont-yunhang:before {\r\n  content: \"\\e7c8\";\r\n}\r\n\r\n.luckysheet-iconfont-lie:before {\r\n  content: \"\\e7c9\";\r\n}\r\n\r\n.luckysheet-iconfont-quanping:before {\r\n  content: \"\\e7ca\";\r\n}\r\n\r\n.luckysheet-iconfont-shaixuan:before {\r\n  content: \"\\e7cb\";\r\n}\r\n\r\n.luckysheet-iconfont-gengxin:before {\r\n  content: \"\\e7cc\";\r\n}\r\n\r\n.luckysheet-iconfont-qingchu:before {\r\n  content: \"\\e7cd\";\r\n}\r\n\r\n.luckysheet-iconfont-hang:before {\r\n  content: \"\\e7ce\";\r\n}\r\n\r\n.luckysheet-iconfont-zhushi:before {\r\n  content: \"\\e7cf\";\r\n}\r\n\r\n.luckysheet-iconfont-jian:before {\r\n  content: \"\\e7d0\";\r\n}\r\n\r\n.luckysheet-iconfont-jisuan:before {\r\n  content: \"\\e7d1\";\r\n}\r\n\r\n.luckysheet-iconfont-jia:before {\r\n  content: \"\\e7d2\";\r\n}\r\n\r\n.luckysheet-iconfont-dibuduiqi:before {\r\n  content: \"\\e7d3\";\r\n}\r\n\r\n.luckysheet-iconfont-xiangshang90:before {\r\n  content: \"\\e7d4\";\r\n}\r\n\r\n.luckysheet-iconfont-wuxuanzhuang:before {\r\n  content: \"\\e7d5\";\r\n}\r\n\r\n.luckysheet-iconfont-xianshiyincangwangge:before {\r\n  content: \"\\e7d6\";\r\n}\r\n\r\n.luckysheet-iconfont-dongjie:before {\r\n  content: \"\\e7d7\";\r\n}\r\n\r\n.luckysheet-iconfont-wenbenzuoduiqi:before {\r\n  content: \"\\e7d8\";\r\n}\r\n\r\n.luckysheet-iconfont-houtui:before {\r\n  content: \"\\e7da\";\r\n}\r\n\r\n.luckysheet-iconfont-shuipinghebing:before {\r\n  content: \"\\e7db\";\r\n}\r\n\r\n.luckysheet-iconfont-xiabiankuang:before {\r\n  content: \"\\e7dc\";\r\n}\r\n\r\n.luckysheet-iconfont-shezhi:before {\r\n  content: \"\\e7dd\";\r\n}\r\n\r\n"
  },
  {
    "path": "src/assets/iconfont/iconfont.js",
    "content": "!function(h){var l,a,v,i,t,z,o='<svg><symbol id=\"luckysheet-iconfont-lianjie\" viewBox=\"0 0 1024 1024\"><path d=\"M771.584 251.733333c-49.066667-51.2-132.266667-51.2-181.333333 0l-74.666667 76.8c-8.533333 8.533333-8.533333 23.466667 0 32 8.533333 8.533333 21.333333 8.533333 29.866667 0l74.666666-76.8c34.133333-34.133333 87.466667-34.133333 121.6 0 34.133333 34.133333 34.133333 89.6 0 123.733334l-121.6 123.733333c-34.133333 34.133333-87.466667 34.133333-121.6 0-8.533333-8.533333-21.333333-8.533333-29.866666 0-8.533333 8.533333-8.533333 23.466667 0 32 49.066667 51.2 132.266667 51.2 181.333333 0l121.6-123.733333c51.2-53.333333 51.2-136.533333 0-187.733334z\" fill=\"#444D5A\" ></path><path d=\"M477.184 663.466667l-74.666667 76.8c-34.133333 34.133333-87.466667 34.133333-121.6 0-34.133333-34.133333-34.133333-89.6 0-123.733334l121.6-123.733333c34.133333-34.133333 87.466667-34.133333 121.6 0 8.533333 8.533333 21.333333 8.533333 29.866667 0 8.533333-8.533333 8.533333-23.466667 0-32-49.066667-51.2-132.266667-51.2-181.333333 0l-121.6 123.733333c-51.2 51.2-49.066667 134.4 0 185.6 49.066667 51.2 132.266667 51.2 181.333333 0l74.666667-76.8c8.533333-8.533333 8.533333-23.466667 0-32-8.533333-6.4-21.333333-6.4-29.866667 2.133334z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-dayinquyu\" viewBox=\"0 0 1024 1024\"><path d=\"M727.04 706.218667a11.946667 11.946667 0 0 1 8.704 3.754666 13.312 13.312 0 0 1 3.626667 9.130667V810.666667H583.253333v-91.52c0-3.413333 1.28-6.741333 3.626667-9.173334a11.946667 11.946667 0 0 1 8.661333-3.754666zM362.666667 725.333333v42.666667h-128v-42.666667h128z m128 0v42.666667h-42.666667v-42.666667h42.666667z m301.696-143.957333a18.773333 18.773333 0 0 1 18.304 19.2v117.205333c0 10.581333-8.277333 19.2-18.346667 19.2h-28.458667v-11.434666c-0.128-21.333333-16.554667-38.570667-36.778666-38.570667h-131.498667c-20.224 0-36.693333 17.237333-36.778667 38.570667v11.477333h-28.458666a18.858667 18.858667 0 0 1-18.346667-19.2v-117.248c0-10.581333 8.277333-19.2 18.346667-19.2zM256 533.333333v128H213.333333v-128h42.666667z m411.477333 85.845334H567.04a12.586667 12.586667 0 0 0-12.245333 12.8c0.042667 7.125333 5.546667 12.885333 12.245333 12.842666h100.394667a12.586667 12.586667 0 0 0 12.202666-12.8c0-7.082667-5.504-12.8-12.202666-12.8zM723.072 512a14.506667 14.506667 0 0 1 14.165333 14.805333v35.84H585.386667v-35.84a14.506667 14.506667 0 0 1 14.165333-14.805333zM768 362.666667v128h-42.666667v-128h42.666667z m-512-42.666667v128H213.333333v-128h42.666667zM768 213.333333v64h-42.666667V256h-64V213.333333H768zM362.666667 213.333333v42.666667H256v21.333333H213.333333V213.333333h149.333334z m213.333333 0v42.666667h-128V213.333333h128z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-dayinyemianpeizhi\" viewBox=\"0 0 1024 1024\"><path d=\"M635.477333 213.333333H388.522667c-15.530667 0-28.16 13.226667-28.288 29.610667v71.68h303.530666v-71.68c0-16.298667-12.586667-29.568-28.288-29.568V213.333333z m7.978667 388.48H380.586667a23.893333 23.893333 0 0 0-17.365334 7.509334 26.581333 26.581333 0 0 0-7.253333 18.261333V810.666667h312.149333v-183.125334a26.581333 26.581333 0 0 0-7.253333-18.218666 23.893333 23.893333 0 0 0-17.365333-7.509334z m130.602667-249.728H250.069333c-20.224 0-36.736 17.28-36.736 38.4v234.410667c0 21.162667 16.512 38.442667 36.693334 38.442667h56.96v-22.912c0.213333-42.666667 33.109333-77.184 73.557333-77.098667h262.912c40.448-0.085333 73.386667 34.389333 73.557333 77.098667v22.912h56.917334c20.224 0 36.736-17.28 36.736-38.4V390.485333c-0.042667-21.290667-16.426667-38.485333-36.608-38.442666z m-249.813334 126.933334H323.498667c-13.44 0-24.405333-11.434667-24.490667-25.642667a25.173333 25.173333 0 0 1 24.490667-25.685333h200.746666c13.44 0 24.490667 11.52 24.490667 25.685333 0 14.08-11.050667 25.6-24.490667 25.6v0.042667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-dayinbiaoti\" viewBox=\"0 0 1024 1024\"><path d=\"M727.04 706.218667a11.946667 11.946667 0 0 1 8.704 3.754666 13.312 13.312 0 0 1 3.626667 9.130667V810.666667H583.253333v-91.52c0-3.413333 1.28-6.741333 3.626667-9.173334a11.946667 11.946667 0 0 1 8.661333-3.754666zM768 213.333333v277.333334h-42.666667V256H256v469.333333h234.666667v42.666667H213.333333V213.333333h554.666667z m24.362667 368.042667a18.773333 18.773333 0 0 1 18.304 19.2v117.205333c0 10.581333-8.277333 19.2-18.346667 19.2h-28.458667v-11.434666c-0.128-21.333333-16.554667-38.570667-36.778666-38.570667h-131.498667c-20.224 0-36.693333 17.237333-36.778667 38.570667v11.477333h-28.458666a18.858667 18.858667 0 0 1-18.346667-19.2v-117.248c0-10.581333 8.277333-19.2 18.346667-19.2z m-124.885334 37.802667H567.04a12.586667 12.586667 0 0 0-12.245333 12.8c0.042667 7.125333 5.546667 12.885333 12.245333 12.842666h100.394667a12.586667 12.586667 0 0 0 12.202666-12.8c0-7.082667-5.504-12.8-12.202666-12.8zM723.072 512a14.506667 14.506667 0 0 1 14.165333 14.805333v35.84H585.386667v-35.84a14.506667 14.506667 0 0 1 14.165333-14.805333z\" fill=\"#444D5A\" ></path><path d=\"M341.333333 341.333333h298.666667v42.666667H341.333333zM341.333333 426.666667h170.666667v42.666666H341.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-fenyeyulan\" viewBox=\"0 0 1024 1024\"><path d=\"M810.666667 213.333333v597.333334H213.333333V213.333333h597.333334z m-42.666667 42.666667H256v512h512V256z\" fill=\"#444D5A\" ></path><path d=\"M256 512h256v42.666667H256zM554.666667 256v298.666667h-42.666667V256z\" fill=\"#444D5A\" ></path><path d=\"M405.333333 256v298.666667h-42.666666V256z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-putong\" viewBox=\"0 0 1024 1024\"><path d=\"M256 256h554.666667v42.666667H256z\" fill=\"#444D5A\" ></path><path d=\"M298.666667 256v554.666667H256V256zM810.666667 256v554.666667h-42.666667V256zM469.333333 256v554.666667h-42.666666V256zM640 256v554.666667h-42.666667V256z\" fill=\"#444D5A\" ></path><path d=\"M256 426.666667h554.666667v42.666666H256zM256 597.333333h554.666667v42.666667H256zM256 768h554.666667v42.666667H256z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-yemianbuju\" viewBox=\"0 0 1024 1024\"><path d=\"M810.666667 213.333333v42.666667h-170.709334L640 768h170.666667v42.666667h-213.333334V213.333333h213.333334z m-384 0l-0.042667 554.666667H426.666667v42.666667H213.333333v-42.666667h170.624L384 256H213.333333V213.333333h213.333334z m106.666666 512v85.333334h-42.666666v-85.333334h42.666666z m0-170.666666v85.333333h-42.666666v-85.333333h42.666666z m0-170.666667v85.333333h-42.666666V384h42.666666z m0-170.666667v85.333334h-42.666666V213.333333h42.666666z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-biaogesuoding\" viewBox=\"0 0 1024 1024\"><path d=\"M810.666667 213.333333v597.333334H213.333333V213.333333h597.333334zM341.333333 383.872H256V768h85.333333V383.872z m426.666667 0H383.872V768H768V383.872z m-149.333333 21.461333a64 64 0 0 1 63.701333 57.856L682.666667 469.333333v64h42.666666v213.333334h-298.666666v-213.333334h42.666666V469.333333a64 64 0 0 1 57.856-63.701333L533.333333 405.333333h85.333334z m64 170.666667h-213.333334v128h213.333334v-128z m-106.666667 21.333333a21.333333 21.333333 0 0 1 21.333333 21.333334v42.666666a21.333333 21.333333 0 1 1-42.666666 0v-42.666666a21.333333 21.333333 0 0 1 21.333333-21.333334z m42.666667-149.333333h-85.333334a21.333333 21.333333 0 0 0-20.992 17.493333L512 469.333333v64h128V469.333333a21.333333 21.333333 0 0 0-13.909333-20.010666l-3.584-0.981334-3.84-0.341333zM768 256H383.872v85.290667L768 341.333333V256zM341.333333 256H256v85.333333l85.333333-0.042666V256z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-zhuandao1\" viewBox=\"0 0 1024 1024\"><path d=\"M804.992 694.058667l-84.650667-84.224c-7.552-7.509333-21.930667-8.448-26.026666 1.365333-1.066667 2.602667-1.365333 10.026667-1.365334 10.026667v56.874666H406.442667a69.034667 69.034667 0 0 1-69.205334-68.778666 69.034667 69.034667 0 0 1 69.205334-68.821334h259.84a128.341333 128.341333 0 0 0 128.597333-127.829333 128.384 128.384 0 0 0-128.554667-127.914667H411.946667A101.632 101.632 0 0 0 213.333333 314.325333a101.632 101.632 0 1 0 198.613334 29.525334h254.378666a69.034667 69.034667 0 0 1 69.162667 68.821333 69.034667 69.034667 0 0 1-69.162667 68.778667H406.442667a128.341333 128.341333 0 0 0-128.597334 127.872 128.341333 128.341333 0 0 0 128.597334 127.872h286.506666v54.016s0 8.277333 1.408 11.52c4.053333 9.813333 18.432 10.24 25.984 2.730666l84.650667-84.181333a19.2 19.2 0 0 0 0-27.221333zM314.88 356.224a42.069333 42.069333 0 0 1-42.112-41.898667c0-23.082667 18.858667-41.856 42.112-41.856 23.210667 0 42.112 18.773333 42.112 41.856a42.069333 42.069333 0 0 1-42.112 41.898667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-youjiantou\" viewBox=\"0 0 1024 1024\"><path d=\"M682.666667 512l-341.333334 341.333333V170.666667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-caidan2\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 469.333333h597.333334v85.333334H213.333333zM213.333333 213.333333h597.333334v85.333334H213.333333zM213.333333 725.333333h597.333334v85.333334H213.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-tihuan\" viewBox=\"0 0 1024 1024\"><path d=\"M768 430.933333H280.405333l-4.394666-0.554666c-5.461333-0.853333-6.570667-1.749333-12.885334-6.528l-2.986666-5.376c-6.4-11.946667-5.376-13.738667 2.986666-28.885334L440.618667 213.333333l34.218666 34.048-136.362666 135.424H768v48.170667z m-7.594667 163.242667L585.472 768l-34.261333-34.048 136.362666-135.424H258.048v-48.170667h484.096c10.453333 0 19.882667 6.272 23.893333 15.872a25.6 25.6 0 0 1-5.632 27.989334z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-dongjie1\" viewBox=\"0 0 1024 1024\"><path d=\"M809.557333 213.930667v595.626666H213.930667V213.930667h595.626666zM256.426667 573.610667v193.408l193.365333-0.042667-193.365333-193.365333z m510.549333-40.618667h-234.026667v234.026667h234.026667v-234.026667z m-276.565333 0H276.053333l214.357334 214.4v-214.4z m276.565333-276.522667h-234.026667v233.984h234.026667V256.469333zM256.426667 286.549333v203.946667l203.904-0.042667-203.946667-203.946666z m233.984-30.08H286.592l203.861333 203.861334V256.426667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-jian1\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 469.333333h597.333334v85.333334H213.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-jia1\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 469.333333h597.333334v85.333334H213.333333z\" fill=\"#444D5A\" ></path><path d=\"M554.666667 213.333333v597.333334h-85.333334V213.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-yichu1\" viewBox=\"0 0 1024 1024\"><path d=\"M300.288 810.666667H213.333333V213.333333h86.954667v279.978667h441.898667l-91.306667-85.845333 26.624-26.112L810.666667 512l-133.162667 130.688-26.624-26.154667 91.306667-85.845333-441.898667-0.042667z\" fill=\"#444D5A\" ></path><path d=\"M530.688 213.333333h42.666667v242.688h-42.666667V213.333333z m0 354.688h42.666667V810.666667h-42.666667v-242.688z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-shengxu1\" viewBox=\"0 0 1024 1024\"><path d=\"M684.757333 413.056v290.645333a20.650667 20.650667 0 0 1-6.4 15.274667 23.04 23.04 0 0 1-16 6.357333 22.229333 22.229333 0 0 1-22.4-21.632V413.056L550.4 497.92a22.528 22.528 0 0 1-15.872 6.442667 22.613333 22.613333 0 0 1-15.914667-6.442667 20.650667 20.650667 0 0 1-6.613333-15.061333c0-5.674667 2.389333-11.093333 6.613333-15.061334l126.72-120.064a22.485333 22.485333 0 0 1 15.658667-6.4 23.594667 23.594667 0 0 1 16.128 5.546667l126.72 120.064c4.309333 3.84 6.826667 9.301333 6.826667 15.061333a20.266667 20.266667 0 0 1-6.826667 15.061334 23.04 23.04 0 0 1-15.914667 6.272 23.04 23.04 0 0 1-15.872-6.272l-87.296-84.010667zM229.930667 682.666667h265.472c9.173333 0 16.597333 9.472 16.597333 21.12s-7.424 21.12-16.597333 21.12H229.930667c-9.173333 0-16.597333-9.472-16.597334-21.12 0-11.690667 7.424-21.12 16.597334-21.12z m1.152-170.666667h177.792c9.813333 0 17.792 9.429333 17.792 21.12s-7.936 21.12-17.792 21.12H231.168c-9.813333 0-17.792-9.429333-17.792-21.12 0-11.648 7.978667-21.12 17.792-21.12z m264.362666-170.666667H229.845333C220.757333 341.333333 213.333333 350.805333 213.333333 362.453333s7.424 21.12 16.597334 21.12h265.472c9.173333 0 16.597333-9.472 16.597333-21.12S504.576 341.333333 495.402667 341.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-neikuangxian\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 512h554.666667v42.666667H213.333333z\" fill=\"#444D5A\" ></path><path d=\"M512 256v554.666667h-42.666667V256z\" fill=\"#444D5A\" ></path><path d=\"M213.333333 426.666667h42.666667v42.666666H213.333333zM213.333333 597.333333h42.666667v42.666667H213.333333zM213.333333 341.333333h42.666667v42.666667H213.333333zM213.333333 682.666667h42.666667v42.666666H213.333333zM725.333333 426.666667h42.666667v42.666666h-42.666667zM725.333333 597.333333h42.666667v42.666667h-42.666667zM725.333333 341.333333h42.666667v42.666667h-42.666667zM725.333333 682.666667h42.666667v42.666666h-42.666667zM725.333333 768h42.666667v42.666667h-42.666667zM725.333333 256h42.666667v42.666667h-42.666667zM213.333333 768h42.666667v42.666667H213.333333zM213.333333 256h42.666667v42.666667H213.333333zM384 768h42.666667v42.666667H384zM384 256h42.666667v42.666667H384zM554.666667 768h42.666666v42.666667h-42.666666zM554.666667 256h42.666666v42.666667h-42.666666zM298.666667 768h42.666666v42.666667H298.666667zM298.666667 256h42.666666v42.666667H298.666667zM640 768h42.666667v42.666667h-42.666667zM640 256h42.666667v42.666667h-42.666667z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-qingchushaixuan\" viewBox=\"0 0 1024 1024\"><path d=\"M214.016 722.432h593.92v42.410667H214.016v-42.410667z m578.048-312.106667l-180.693333-181.077333A53.376 53.376 0 0 0 573.738667 213.333333a45.653333 45.653333 0 0 0-32.64 13.226667l-313.941334 314.965333c-18.56 18.602667-17.322667 50.261333 2.688 70.4l68.010667 68.096h298.24l198.698667-199.338666c18.56-18.602667 17.322667-50.261333-2.730667-70.357334z m-213.546667 227.242667H315.434667L259.84 581.888c-3.968-4.010667-4.053333-9.088-2.730667-10.453333L430.08 398.08l193.92 193.92-45.44 45.568z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-wenbenxiangshang\" viewBox=\"0 0 1024 1024\"><path d=\"M192 495.786667l213.333333-77.653334v-0.64l1.621334 0.042667L554.666667 363.776v45.354667l-106.666667 38.826666v152.405334l106.666667 38.826666v45.354667l-147.498667-53.674667-1.834667-0.042666v-0.64l-213.333333-77.610667V495.786667z m46.634667 28.416L405.333333 584.874667v-121.386667l-166.698666 60.714667zM597.333333 336.170667l90.496-90.538667 90.538667 90.538667-30.165333 30.165333-37.802667-37.76V789.333333h-42.666667V326.101333l-40.234666 40.234667L597.333333 336.170667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-jiangxu1\" viewBox=\"0 0 1024 1024\"><path d=\"M684.757333 653.610667V362.965333a20.650667 20.650667 0 0 0-6.4-15.274666 23.04 23.04 0 0 0-16-6.357334 22.229333 22.229333 0 0 0-22.4 21.632v290.645334L550.4 568.746667a22.528 22.528 0 0 0-15.872-6.442667 22.613333 22.613333 0 0 0-15.914667 6.442667 20.650667 20.650667 0 0 0-6.613333 15.061333c0 5.674667 2.389333 11.093333 6.613333 15.061333l126.72 120.064a22.485333 22.485333 0 0 0 15.658667 6.4 23.594667 23.594667 0 0 0 16.128-5.546666l126.72-120.064c4.309333-3.84 6.826667-9.301333 6.826667-15.061334a20.266667 20.266667 0 0 0-6.826667-15.061333 23.04 23.04 0 0 0-15.914667-6.272 23.04 23.04 0 0 0-15.872 6.272l-87.296 84.010667zM229.930667 682.666667h265.472c9.173333 0 16.597333 9.472 16.597333 21.12s-7.424 21.12-16.597333 21.12H229.930667c-9.173333 0-16.597333-9.472-16.597334-21.12 0-11.690667 7.424-21.12 16.597334-21.12z m1.152-170.666667h177.792c9.813333 0 17.792 9.429333 17.792 21.12s-7.936 21.12-17.792 21.12H231.168c-9.813333 0-17.792-9.429333-17.792-21.12 0-11.648 7.978667-21.12 17.792-21.12z m264.362666-170.666667H229.845333C220.757333 341.333333 213.333333 350.762667 213.333333 362.453333c0 11.648 7.424 21.12 16.597334 21.12h265.472c9.173333 0 16.597333-9.472 16.597333-21.12S504.576 341.333333 495.402667 341.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-neikuanghengxian\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 512h554.666667v42.666667H213.333333z\" fill=\"#444D5A\" ></path><path d=\"M213.333333 426.666667h42.666667v42.666666H213.333333zM213.333333 597.333333h42.666667v42.666667H213.333333zM213.333333 341.333333h42.666667v42.666667H213.333333zM213.333333 682.666667h42.666667v42.666666H213.333333zM725.333333 426.666667h42.666667v42.666666h-42.666667zM469.333333 426.666667h42.666667v42.666666h-42.666667zM725.333333 597.333333h42.666667v42.666667h-42.666667zM469.333333 597.333333h42.666667v42.666667h-42.666667zM725.333333 341.333333h42.666667v42.666667h-42.666667zM469.333333 341.333333h42.666667v42.666667h-42.666667zM725.333333 682.666667h42.666667v42.666666h-42.666667zM469.333333 682.666667h42.666667v42.666666h-42.666667zM725.333333 768h42.666667v42.666667h-42.666667zM725.333333 256h42.666667v42.666667h-42.666667zM213.333333 768h42.666667v42.666667H213.333333zM213.333333 256h42.666667v42.666667H213.333333zM384 768h42.666667v42.666667H384zM384 256h42.666667v42.666667H384zM554.666667 768h42.666666v42.666667h-42.666666zM554.666667 256h42.666666v42.666667h-42.666666zM298.666667 768h42.666666v42.666667H298.666667zM298.666667 256h42.666666v42.666667H298.666667zM469.333333 768h42.666667v42.666667h-42.666667zM469.333333 256h42.666667v42.666667h-42.666667zM640 768h42.666667v42.666667h-42.666667zM640 256h42.666667v42.666667h-42.666667z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-neikuangshuxian\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 426.666667h42.666667v42.666666H213.333333zM213.333333 597.333333h42.666667v42.666667H213.333333zM213.333333 341.333333h42.666667v42.666667H213.333333zM213.333333 682.666667h42.666667v42.666666H213.333333zM725.333333 426.666667h42.666667v42.666666h-42.666667zM725.333333 597.333333h42.666667v42.666667h-42.666667zM725.333333 341.333333h42.666667v42.666667h-42.666667zM725.333333 682.666667h42.666667v42.666666h-42.666667zM725.333333 768h42.666667v42.666667h-42.666667zM725.333333 256h42.666667v42.666667h-42.666667zM725.333333 512h42.666667v42.666667h-42.666667zM213.333333 768h42.666667v42.666667H213.333333zM213.333333 256h42.666667v42.666667H213.333333zM213.333333 512h42.666667v42.666667H213.333333zM384 768h42.666667v42.666667H384zM384 256h42.666667v42.666667H384zM384 512h42.666667v42.666667H384zM554.666667 768h42.666666v42.666667h-42.666666zM554.666667 256h42.666666v42.666667h-42.666666zM554.666667 512h42.666666v42.666667h-42.666666zM298.666667 768h42.666666v42.666667H298.666667zM298.666667 256h42.666666v42.666667H298.666667zM298.666667 512h42.666666v42.666667H298.666667zM469.333333 768h42.666667v42.666667h-42.666667zM469.333333 256h42.666667v42.666667h-42.666667zM469.333333 512h42.666667v42.666667h-42.666667zM640 768h42.666667v42.666667h-42.666667zM640 256h42.666667v42.666667h-42.666667zM640 512h42.666667v42.666667h-42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M512 256v554.666667h-42.666667V256z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-zidingyipaixu\" viewBox=\"0 0 1024 1024\"><path d=\"M704 256a21.333333 21.333333 0 0 1 21.333333 21.333333v469.333334a21.333333 21.333333 0 1 1-42.666666 0v-469.333334c0-11.776 9.472-21.333333 21.333333-21.333333zM512 384c11.776 0 21.333333 7.68 21.333333 17.194667v221.610666c0 9.514667-9.472 17.194667-21.333333 17.194667-11.776 0-21.333333-7.68-21.333333-17.194667V401.194667c0-4.565333 2.218667-8.96 6.186666-12.16A24.32 24.32 0 0 1 512 384zM320 256a21.333333 21.333333 0 0 1 21.333333 21.333333v469.333334a21.333333 21.333333 0 1 1-42.666666 0v-469.333334c0-11.776 9.472-21.333333 21.333333-21.333333z m283.562667 368.896a21.333333 21.333333 0 0 1 30.165333 30.165333l-106.666667 106.666667a21.333333 21.333333 0 0 1-30.165333 0l-106.666667-106.666667a21.333333 21.333333 0 0 1 30.165334-30.165333L512 716.501333l91.605333-91.562666z m0.298666-225.834667a21.333333 21.333333 0 0 0 30.165334-30.165333l-106.666667-106.666667a21.333333 21.333333 0 0 0-30.165333 0l-106.666667 106.666667a21.333333 21.333333 0 0 0 30.165333 30.165333l91.562667-91.562666 91.605333 91.562666z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-logo2\" viewBox=\"0 0 1024 1024\"><path d=\"M1023.168 131.36c0 234.4-190.016 424.416-424.416 424.416 0-234.4 190.016-424.416 424.416-424.416zM131.36 1023.168c0-234.4 190.016-424.416 424.416-424.416 0 234.4-190.016 424.416-424.416 424.416zM929.696 929.696c-182.784 0-330.944-148.16-330.944-330.944 182.752 0 330.944 148.16 330.944 330.944z\" fill=\"#2D7FF9\" ></path><path d=\"M494.848 0H0v494.848h494.848z\" fill=\"#2D7FF9\" opacity=\".503\" ></path><path d=\"M558.016 81.376H81.376v476.64h476.64z\" fill=\"#2D7FF9\" opacity=\".551\" ></path><path d=\"M558.304 164.416H164.384v393.92h393.92z\" fill=\"#2D7FF9\" opacity=\".805\" ></path></symbol><symbol id=\"luckysheet-iconfont-logo\" viewBox=\"0 0 4864 1024\"><path d=\"M1023.168 131.36c0 234.4-190.016 424.416-424.416 424.416 0-234.4 190.016-424.416 424.416-424.416zM131.36 1023.168c0-234.4 190.016-424.416 424.416-424.416 0 234.4-190.016 424.416-424.416 424.416zM929.696 929.696c-182.784 0-330.944-148.16-330.944-330.944 182.752 0 330.944 148.16 330.944 330.944z\" fill=\"#2D7FF9\" ></path><path d=\"M494.848 0H0v494.848h494.848z\" fill=\"#2D7FF9\" opacity=\".503\" ></path><path d=\"M558.016 81.376H81.376v476.64h476.64z\" fill=\"#2D7FF9\" opacity=\".551\" ></path><path d=\"M558.304 164.416H164.384v393.92h393.92z\" fill=\"#2D7FF9\" opacity=\".805\" ></path><path d=\"M1678.08 736v-64h-247.04V279.04H1356.8V736h321.28z m177.568 8.96c40.96 0 75.52-17.28 103.68-51.84V736h72.96V405.12h-72.96v202.24c-6.4 23.68-17.28 42.24-32 56.32-14.72 13.44-30.08 20.48-46.08 20.48-25.6 0-43.52-6.4-55.04-18.56-11.52-12.8-16.64-32-16.64-58.88v-201.6h-72.96v206.08c0 88.96 39.68 133.76 119.04 133.76z m407.936 0c42.88 0 77.44-10.88 103.04-32 26.24-21.76 43.52-55.04 51.2-99.84h-72.32c-5.76 48-32.64 72.32-81.28 72.32-28.16 0-49.28-10.24-63.36-30.08-15.36-20.48-22.4-49.28-22.4-85.76 0-35.84 7.68-64 23.04-83.84 15.36-20.48 36.48-30.08 63.36-30.08 21.76 0 39.68 5.12 53.12 15.36 12.8 10.24 21.76 25.6 26.24 46.72h72.32c-6.4-41.6-23.04-72.32-49.28-92.8-25.6-19.2-59.52-28.8-102.4-28.8-51.84 0-92.16 17.28-120.96 51.84-26.88 31.36-40.32 72.32-40.32 122.24 0 51.2 13.44 92.8 40.96 124.8 28.16 33.28 67.84 49.92 119.04 49.92z m292.128-8.96v-115.84l33.28-31.36 115.84 147.2h93.44l-159.36-193.92 146.56-136.96h-94.08l-135.68 131.2V270.08h-72.96V736h72.96z m404.096 126.72l179.2-457.6h-79.36l-83.84 235.52-87.68-235.52h-79.36l131.2 323.2-58.24 134.4h78.08z m357.408-117.76c99.2 0 149.12-35.2 149.12-105.6 0-29.44-13.44-53.12-39.68-69.76-17.92-12.16-46.08-22.4-83.2-31.36-33.28-8.32-55.04-14.72-65.92-19.2-17.92-7.68-26.24-17.28-26.24-27.52 0-12.8 5.12-21.76 16.64-27.52 9.6-5.76 24.32-8.32 43.52-8.32 22.4 0 39.04 3.2 49.92 10.24 10.24 6.4 17.92 18.56 23.04 35.2h71.04c-7.68-70.4-55.68-104.96-142.72-104.96-40.96 0-73.6 8.32-98.56 26.24-25.6 16.64-37.76 40.32-37.76 71.04 0 28.8 12.8 51.2 38.4 67.2 16 10.24 43.52 19.84 82.56 28.8 33.28 7.68 55.04 13.44 65.28 18.56 19.2 8.96 28.8 21.12 28.8 36.48 0 26.88-25.6 40.96-76.8 40.96-24.32 0-41.6-4.48-52.48-12.16-10.88-8.96-18.56-23.68-22.4-44.8h-71.04c7.04 77.44 56.32 116.48 148.48 116.48z m286.976-8.96v-184.96c0-28.16 6.4-50.56 19.84-68.48 12.8-17.92 30.72-26.88 53.76-26.88 24.96 0 43.52 7.68 56.32 23.68 10.88 14.72 16.64 36.48 16.64 64.64v192h72.96v-204.8c0-44.16-9.6-77.44-28.16-99.84-19.84-23.68-49.92-35.2-90.24-35.2-21.12 0-39.68 3.84-55.68 12.16-17.92 8.96-33.28 22.4-45.44 40.96v-179.2h-72.96V736h72.96z m447.648 8.96c44.16 0 80.64-12.8 110.08-37.76 23.04-20.48 38.4-46.72 46.08-77.44h-72.96c-8.96 18.56-18.56 32-29.44 40.32-14.08 10.24-32 15.36-54.4 15.36-26.24 0-46.72-8.32-60.8-24.32-14.08-16-22.4-39.68-24.96-70.4h247.68c0-59.52-13.44-106.24-39.68-139.52-28.8-37.12-70.4-55.04-124.8-55.04-49.28 0-88.32 16.64-116.48 50.56-29.44 33.28-43.52 74.24-43.52 123.52 0 55.04 15.36 97.92 46.08 129.28 28.8 30.08 67.84 45.44 117.12 45.44z m85.12-209.28h-170.24c4.48-26.24 13.44-46.08 26.88-59.52 14.08-14.08 32.64-20.48 56.96-20.48 51.2 0 80 26.24 86.4 80z m285.088 209.28c44.16 0 80.64-12.8 110.08-37.76 23.04-20.48 38.4-46.72 46.08-77.44h-72.96c-8.96 18.56-18.56 32-29.44 40.32-14.08 10.24-32 15.36-54.4 15.36-26.24 0-46.72-8.32-60.8-24.32-14.08-16-22.4-39.68-24.96-70.4h247.68c0-59.52-13.44-106.24-39.68-139.52-28.8-37.12-70.4-55.04-124.8-55.04-49.28 0-88.32 16.64-116.48 50.56-29.44 33.28-43.52 74.24-43.52 123.52 0 55.04 15.36 97.92 46.08 129.28 28.8 30.08 67.84 45.44 117.12 45.44z m85.12-209.28h-170.24c4.48-26.24 13.44-46.08 26.88-59.52 14.08-14.08 32.64-20.48 56.96-20.48 51.2 0 80 26.24 86.4 80z m310.016 200.32v-60.16h-43.52c-7.68 0-12.8-1.92-16.64-5.76-3.84-4.48-5.12-10.24-5.12-17.92v-186.88h73.6v-60.16h-73.6V298.24l-72.96 30.08v76.8h-59.52v60.16h59.52v186.88c0 26.88 6.4 46.72 19.2 60.8 13.44 15.36 34.56 23.04 63.36 23.04h55.68z\" fill=\"#7C838C\" ></path></symbol><symbol id=\"luckysheet-iconfont-wenbenqingxie1\" viewBox=\"0 0 1024 1024\"><path d=\"M469.333333 256h170.666667v42.666667h-170.666667z\" fill=\"#444D5A\" ></path><path d=\"M573.738667 284.586667l-81.493334 462.208-41.984-7.381334 81.493334-462.208z\" fill=\"#444D5A\" ></path><path d=\"M384 725.333333h170.666667v42.666667H384z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-jiacu\" viewBox=\"0 0 1024 1024\"><path d=\"M298.666667 213.333333h224a174.208 174.208 0 0 1 141.952 275.242667A174.208 174.208 0 0 1 572.458667 810.666667H298.666667V213.333333z m273.792 348.458667l-174.250667-0.042667v149.333334h174.250667a74.666667 74.666667 0 0 0 6.101333-149.077334l-6.101333-0.213333zM398.208 312.874667v149.333333h124.458667a74.666667 74.666667 0 0 0 6.144-149.077333l-6.144-0.256H398.208z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-sousuo\" viewBox=\"0 0 1024 1024\"><path d=\"M664.832 634.624l128.554667 128.597333a21.333333 21.333333 0 1 1-30.165334 30.165334l-128.597333-128.597334a256 256 0 1 1 30.165333-30.165333zM469.333333 682.666667a213.333333 213.333333 0 1 0 0-426.666667 213.333333 213.333333 0 0 0 0 426.666667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-guanbi\" viewBox=\"0 0 1024 1024\"><path d=\"M119.808 180.053333l60.330667-60.245333 724.053333 724.053333-60.330667 60.330667z\" fill=\"#B5B8BD\" ></path><path d=\"M843.946667 119.808l60.245333 60.330667-724.053333 724.053333-60.330667-60.330667z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-xiayige\" viewBox=\"0 0 1024 1024\"><path d=\"M512 682.666667L170.666667 341.333333h682.666666z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-xiala\" viewBox=\"0 0 1024 1024\"><path d=\"M149.930667 444.330667l60.330666-60.330667 362.069334 362.069333L512 806.4z\" fill=\"#B5B8BD\" ></path><path d=\"M813.738667 384l60.330666 60.330667L512 806.4l-60.330667-60.330667z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-wenbenyanse\" viewBox=\"0 0 1024 1024\"><path d=\"M549.546667 256l194.133333 533.333333h-45.354667l-77.653333-213.333333H421.632l-77.653333 213.333333H298.666667L492.757333 256h56.789334z m-28.416 46.634667L437.162667 533.333333h167.978666l-84.010666-230.698666z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-shangyige\" viewBox=\"0 0 1024 1024\"><path d=\"M512 341.333333l341.333333 341.333334H170.666667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-shujutoushi\" viewBox=\"0 0 1024 1024\"><path d=\"M256 362.666667v298.666666l256 149.333334 256-149.333334v-298.666666L512 213.333333 256 362.666667zM725.333333 640l-213.333333 128-213.333333-128V384l213.333333-128 213.333333 128v256z m-189.354666 40.021333a18.645333 18.645333 0 0 1-18.645334 18.645334 18.304 18.304 0 0 1-18.688-18.645334V535.466667l-130.645333-75.349334a18.645333 18.645333 0 0 1 4.565333-34.133333 18.304 18.304 0 0 1 14.08 2.005333l130.688 74.666667 129.578667-74.666667a18.304 18.304 0 0 1 25.386667 6.698667 18.645333 18.645333 0 0 1-6.784 25.386667l-129.536 74.666666v145.237334z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-tianchong\" viewBox=\"0 0 1024 1024\"><path d=\"M730.24 562.176l-253.44 253.44-217.173333-217.258667 253.44-253.44 217.173333 217.258667z m-72.405333-0.042667L512.981333 417.28l-180.992 180.992 144.810667 144.853333 181.034667-181.034666z\" fill=\"#444D5A\" ></path><path d=\"M520.533333 298.666667v230.4H469.333333V349.824H392.533333v179.626667H341.333333V298.666667zM699.733333 554.666667c48.768 0 88.32 37.802667 88.32 84.48 0 46.634667-39.552 84.48-88.32 84.48\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-zengjiaxiaoshuwei\" viewBox=\"0 0 1024 1024\"><path d=\"M533.333333 789.333333m-42.666666 0a42.666667 42.666667 0 1 0 85.333333 0 42.666667 42.666667 0 1 0-85.333333 0Z\" fill=\"#B5B8BD\" ></path><path d=\"M682.666667 554.666667a85.333333 85.333333 0 0 0-85.333334 85.333333v85.333333a85.333333 85.333333 0 1 0 170.666667 0V640a85.333333 85.333333 0 0 0-85.333333-85.333333z m0 42.666666a42.666667 42.666667 0 0 1 42.666666 42.666667v85.333333a42.666667 42.666667 0 1 1-85.333333 0V640a42.666667 42.666667 0 0 1 42.666667-42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M367.829333 799.701333l90.538667-90.538666L367.786667 618.666667l-30.165334 30.165333 37.76 37.802667H256v42.666666h121.898667l-40.234667 40.234667 30.165333 30.165333z\" fill=\"#444D5A\" ></path><path d=\"M490.666667 213.333333a85.333333 85.333333 0 0 0-85.333334 85.333334v85.333333a85.333333 85.333333 0 1 0 170.666667 0V298.666667a85.333333 85.333333 0 0 0-85.333333-85.333334z m0 42.666667a42.666667 42.666667 0 0 1 42.666666 42.666667v85.333333a42.666667 42.666667 0 1 1-85.333333 0V298.666667a42.666667 42.666667 0 0 1 42.666667-42.666667zM682.666667 213.333333a85.333333 85.333333 0 0 0-85.333334 85.333334v85.333333a85.333333 85.333333 0 1 0 170.666667 0V298.666667a85.333333 85.333333 0 0 0-85.333333-85.333334z m0 42.666667a42.666667 42.666667 0 0 1 42.666666 42.666667v85.333333a42.666667 42.666667 0 0 1-85.333333 0V298.666667a42.666667 42.666667 0 0 1 42.666667-42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M341.333333 448m-42.666666 0a42.666667 42.666667 0 1 0 85.333333 0 42.666667 42.666667 0 1 0-85.333333 0Z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-bianji2\" viewBox=\"0 0 1024 1024\"><path d=\"M810.581333 513.365333V768a42.666667 42.666667 0 0 1-42.666666 42.666667H298.666667a42.666667 42.666667 0 0 1-42.666667-42.666667V256a42.666667 42.666667 0 0 1 42.666667-42.666667h234.624v42.666667H320a21.333333 21.333333 0 0 0-21.333333 21.333333v469.333334a21.333333 21.333333 0 0 0 21.333333 21.333333h426.581333a21.333333 21.333333 0 0 0 21.333334-21.333333V512h0.042666a21.333333 21.333333 0 1 1 42.581334 1.365333z m-285.056-2.432l241.365334-241.365333a21.333333 21.333333 0 0 1 30.165333 30.165333l-241.365333 241.365334a21.333333 21.333333 0 0 1-30.165334-30.165334zM533.290667 256V213.333333a21.333333 21.333333 0 0 1 21.333333 21.333334c0 11.776-10.069333 21.333333-21.333333 21.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-jieping\" viewBox=\"0 0 1024 1024\"><path d=\"M590.848 567.04l-265.386667-306.645333a28.245333 28.245333 0 0 1 3.2-40.149334 29.141333 29.141333 0 0 1 40.789334 3.242667l267.946666 309.674667a124.885333 124.885333 0 0 1 144.213334 34.474666 125.141333 125.141333 0 0 1-16.042667 176.256 125.141333 125.141333 0 0 1-176.341333-14.805333 125.013333 125.013333 0 0 1 1.621333-162.048z m40.149333 18.133333c-18.602667 15.701333-29.312 38.826667-29.312 63.189334 0 45.909333 37.461333 83.157333 83.754667 83.157333a83.413333 83.413333 0 0 0 83.712-83.157333 83.413333 83.413333 0 0 0-83.712-83.114667c-15.189333 0-29.44 4.010667-41.685333 11.008a28.458667 28.458667 0 0 1-12.757334 8.96v-0.042667z m-150.698666-52.565333l-38.229334 44.16a29.653333 29.653333 0 0 1-0.768 0.810667 124.885333 124.885333 0 0 1-6.528 151.509333 125.141333 125.141333 0 0 1-176.341333 14.805333C205.226667 699.306667 198.101333 620.373333 242.346667 567.637333a124.928 124.928 0 0 1 156.416-28.544l38.528-44.501333c9.514667 17.237333 24.746667 30.634667 43.008 37.973333z m105.6-122.026667a85.632 85.632 0 0 0-43.818667-37.12l129.749333-150.016a29.141333 29.141333 0 0 1 40.789334-3.242666 28.245333 28.245333 0 0 1 3.2 40.149333l-129.92 150.186667z m-300.8 301.44c35.413333 29.738667 88.064 25.301333 117.546666-9.813333a83.413333 83.413333 0 0 0-10.666666-117.546667 83.456 83.456 0 0 0-117.589334 9.856 83.456 83.456 0 0 0 10.709334 117.504z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-jianxiaoxiaoshuwei\" viewBox=\"0 0 1024 1024\"><path d=\"M533.333333 448m-42.666666 0a42.666667 42.666667 0 1 0 85.333333 0 42.666667 42.666667 0 1 0-85.333333 0Z\" fill=\"#B5B8BD\" ></path><path d=\"M341.333333 789.333333m-42.666666 0a42.666667 42.666667 0 1 0 85.333333 0 42.666667 42.666667 0 1 0-85.333333 0Z\" fill=\"#B5B8BD\" ></path><path d=\"M346.496 394.368L256 303.786667 346.496 213.333333l30.165333 30.165334-37.717333 37.802666h119.424v42.666667H336.469333l40.192 40.234667-30.165333 30.165333z\" fill=\"#444D5A\" ></path><path d=\"M682.666667 213.333333a85.333333 85.333333 0 0 0-85.333334 85.333334v85.333333a85.333333 85.333333 0 1 0 170.666667 0V298.666667a85.333333 85.333333 0 0 0-85.333333-85.333334z m0 42.666667a42.666667 42.666667 0 0 1 42.666666 42.666667v85.333333a42.666667 42.666667 0 0 1-85.333333 0V298.666667a42.666667 42.666667 0 0 1 42.666667-42.666667zM490.666667 554.666667a85.333333 85.333333 0 0 0-85.333334 85.333333v85.333333a85.333333 85.333333 0 1 0 170.666667 0v-85.333333a85.333333 85.333333 0 0 0-85.333333-85.333333z m0 42.666666a42.666667 42.666667 0 0 1 42.666666 42.666667v85.333333a42.666667 42.666667 0 0 1-85.333333 0v-85.333333a42.666667 42.666667 0 0 1 42.666667-42.666667zM682.666667 554.666667a85.333333 85.333333 0 0 0-85.333334 85.333333v85.333333a85.333333 85.333333 0 1 0 170.666667 0v-85.333333a85.333333 85.333333 0 0 0-85.333333-85.333333z m0 42.666666a42.666667 42.666667 0 0 1 42.666666 42.666667v85.333333a42.666667 42.666667 0 0 1-85.333333 0v-85.333333a42.666667 42.666667 0 0 1 42.666667-42.666667z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-caidan\" viewBox=\"0 0 1024 1024\"><path d=\"M256 213.333333h192a42.666667 42.666667 0 0 1 42.666667 42.666667v192a42.666667 42.666667 0 0 1-42.666667 42.666667H256a42.666667 42.666667 0 0 1-42.666667-42.666667V256a42.666667 42.666667 0 0 1 42.666667-42.666667z m21.333333 42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333V426.666667a21.333333 21.333333 0 0 0 21.333333 21.333333H426.666667a21.333333 21.333333 0 0 0 21.333333-21.333333V277.333333A21.333333 21.333333 0 0 0 426.666667 256H277.333333z m298.666667-42.666667H768a42.666667 42.666667 0 0 1 42.666667 42.666667v192a42.666667 42.666667 0 0 1-42.666667 42.666667h-192a42.666667 42.666667 0 0 1-42.666667-42.666667V256a42.666667 42.666667 0 0 1 42.666667-42.666667z m21.333333 42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333V426.666667a21.333333 21.333333 0 0 0 21.333333 21.333333h149.333334a21.333333 21.333333 0 0 0 21.333333-21.333333V277.333333a21.333333 21.333333 0 0 0-21.333333-21.333333H597.333333z m-21.333333 277.333333H768a42.666667 42.666667 0 0 1 42.666667 42.666667V768a42.666667 42.666667 0 0 1-42.666667 42.666667h-192a42.666667 42.666667 0 0 1-42.666667-42.666667v-192a42.666667 42.666667 0 0 1 42.666667-42.666667z m21.333333 42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333v149.333334a21.333333 21.333333 0 0 0 21.333333 21.333333h149.333334a21.333333 21.333333 0 0 0 21.333333-21.333333V597.333333a21.333333 21.333333 0 0 0-21.333333-21.333333H597.333333z m-341.333333-42.666667h192a42.666667 42.666667 0 0 1 42.666667 42.666667V768a42.666667 42.666667 0 0 1-42.666667 42.666667H256a42.666667 42.666667 0 0 1-42.666667-42.666667v-192a42.666667 42.666667 0 0 1 42.666667-42.666667z m21.333333 42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333v149.333334a21.333333 21.333333 0 0 0 21.333333 21.333333H426.666667a21.333333 21.333333 0 0 0 21.333333-21.333333V597.333333a21.333333 21.333333 0 0 0-21.333333-21.333333H277.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-shujuku\" viewBox=\"0 0 1024 1024\"><path d=\"M256 213.333333h512a42.666667 42.666667 0 0 1 42.666667 42.666667v85.333333a42.666667 42.666667 0 0 1-42.666667 42.666667H256a42.666667 42.666667 0 0 1-42.666667-42.666667V256a42.666667 42.666667 0 0 1 42.666667-42.666667z m21.333333 42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333v42.666667a21.333333 21.333333 0 0 0 21.333333 21.333333h469.333334a21.333333 21.333333 0 0 0 21.333333-21.333333v-42.666667a21.333333 21.333333 0 0 0-21.333333-21.333333h-469.333334zM256 405.333333h512a42.666667 42.666667 0 0 1 42.666667 42.666667v85.333333a42.666667 42.666667 0 0 1-42.666667 42.666667H256a42.666667 42.666667 0 0 1-42.666667-42.666667v-85.333333a42.666667 42.666667 0 0 1 42.666667-42.666667z m21.333333 42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333v42.666667a21.333333 21.333333 0 0 0 21.333333 21.333333h469.333334a21.333333 21.333333 0 0 0 21.333333-21.333333v-42.666667a21.333333 21.333333 0 0 0-21.333333-21.333333h-469.333334z m405.333334 21.333333h21.333333a21.333333 21.333333 0 1 1 0 42.666667H682.666667a21.333333 21.333333 0 1 1 0-42.666667zM256 597.333333h512a42.666667 42.666667 0 0 1 42.666667 42.666667v85.333333a42.666667 42.666667 0 0 1-42.666667 42.666667H256a42.666667 42.666667 0 0 1-42.666667-42.666667v-85.333333a42.666667 42.666667 0 0 1 42.666667-42.666667z m21.333333 42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333v42.666667a21.333333 21.333333 0 0 0 21.333333 21.333333h469.333334a21.333333 21.333333 0 0 0 21.333333-21.333333v-42.666667a21.333333 21.333333 0 0 0-21.333333-21.333333h-469.333334z m405.333334 21.333333h21.333333a21.333333 21.333333 0 1 1 0 42.666667H682.666667a21.333333 21.333333 0 1 1 0-42.666667z m0-384h21.333333a21.333333 21.333333 0 1 1 0 42.666667H682.666667a21.333333 21.333333 0 1 1 0-42.666667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-wubiankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M384 810.666667v-42.666667h42.666667v42.666667zM554.666667 810.666667v-42.666667h42.666666v42.666667zM298.666667 810.666667v-42.666667h42.666666v42.666667zM469.333333 810.666667v-42.666667h42.666667v42.666667zM640 810.666667v-42.666667h42.666667v42.666667zM384 554.666667v-42.666667h42.666667v42.666667zM384 298.666667V256h42.666667v42.666667zM554.666667 298.666667V256h42.666666v42.666667zM298.666667 298.666667V256h42.666666v42.666667zM469.333333 298.666667V256h42.666667v42.666667zM640 298.666667V256h42.666667v42.666667zM725.333333 298.666667V256h42.666667v42.666667zM213.333333 298.666667V256h42.666667v42.666667zM554.666667 554.666667v-42.666667h42.666666v42.666667zM298.666667 554.666667v-42.666667h42.666666v42.666667zM469.333333 554.666667v-42.666667h42.666667v42.666667zM640 554.666667v-42.666667h42.666667v42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M725.333333 810.666667v-42.666667h42.666667v42.666667zM213.333333 810.666667v-42.666667h42.666667v42.666667zM725.333333 640v-42.666667h42.666667v42.666667zM213.333333 640v-42.666667h42.666667v42.666667zM725.333333 469.333333v-42.666666h42.666667v42.666666zM213.333333 469.333333v-42.666666h42.666667v42.666666zM725.333333 725.333333v-42.666666h42.666667v42.666666zM213.333333 725.333333v-42.666666h42.666667v42.666666zM725.333333 554.666667v-42.666667h42.666667v42.666667zM213.333333 554.666667v-42.666667h42.666667v42.666667zM725.333333 384V341.333333h42.666667v42.666667zM213.333333 384V341.333333h42.666667v42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M469.333333 640v-42.666667h42.666667v42.666667zM469.333333 469.333333v-42.666666h42.666667v42.666666zM469.333333 725.333333v-42.666666h42.666667v42.666666zM469.333333 554.666667v-42.666667h42.666667v42.666667zM469.333333 384V341.333333h42.666667v42.666667z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-bianji\" viewBox=\"0 0 1024 1024\"><path d=\"M642.56 363.733333l-170.88 170.88 37.76 22.613334 22.613333 37.717333 170.88-170.88-60.373333-60.330667z m30.208-30.165333l60.330667 60.330667 15.104-15.061334a21.333333 21.333333 0 0 0 0-30.165333l-30.165334-30.165333a21.333333 21.333333 0 0 0-30.165333 0l-15.104 15.104v-0.042667z m-231.253333 231.253333l-10.112 10.112v60.330667h60.330666l10.112-10.112-22.613333-37.717333-37.717333-22.613334z m291.584-291.584l60.373333 60.330667a42.666667 42.666667 0 0 1 0 60.330667l-284.032 284.032H388.736V557.226667l284.032-283.989334a42.666667 42.666667 0 0 1 60.330667 0zM554.666667 234.666667a21.333333 21.333333 0 0 1-21.333334 21.333333h-256c-11.818667 0-21.333333 9.472-21.333333 21.162667v469.674666c0 11.434667 9.557333 21.162667 21.333333 21.162667h469.333334c11.818667 0 21.333333-9.472 21.333333-21.162667V576a21.333333 21.333333 0 1 1 42.666667 0v191.872c0 23.637333-19.2 42.794667-42.453334 42.794667H255.786667A42.624 42.624 0 0 1 213.333333 767.914667V256.128C213.333333 232.490667 232.533333 213.333333 255.829333 213.333333H533.333333a21.333333 21.333333 0 0 1 21.333334 21.333334z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-qingchuyangshi\" viewBox=\"0 0 1024 1024\"><path d=\"M214.016 722.432h593.92v42.410667H214.016v-42.410667z m578.048-312.106667l-180.693333-181.077333A53.376 53.376 0 0 0 573.738667 213.333333a45.653333 45.653333 0 0 0-32.64 13.226667l-313.941334 314.965333c-18.56 18.602667-17.322667 50.261333 2.688 70.4l68.010667 68.096h298.24l198.698667-199.338666c18.56-18.602667 17.322667-50.261333-2.730667-70.357334z m-213.546667 227.242667H315.434667L259.84 581.888c-3.968-4.010667-4.053333-9.088-2.730667-10.453333L430.08 398.08l193.92 193.92-45.44 45.568z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-shanchu\" viewBox=\"0 0 1024 1024\"><path d=\"M320 341.333333v426.581334A42.666667 42.666667 0 0 0 362.581333 810.666667h298.88a42.666667 42.666667 0 0 0 42.538667-42.794667V341.333333h42.666667a21.333333 21.333333 0 1 0 0-42.666666h-469.333334a21.333333 21.333333 0 0 0 0 42.666666h42.666667zM426.666667 234.666667c0-11.776 9.642667-21.333333 21.248-21.333334h128.170666c11.690667 0 21.248 9.472 21.248 21.333334 0 11.776-9.642667 21.333333-21.248 21.333333h-128.170666A21.248 21.248 0 0 1 426.666667 234.666667zM362.666667 362.496A21.333333 21.333333 0 0 1 384.128 341.333333h255.701333c11.904 0 21.504 9.728 21.504 21.162667v384.341333a21.333333 21.333333 0 0 1-21.504 21.162667H384.128c-11.733333 0-21.290667-9.386667-21.461333-21.162667V362.496z m42.666666 42.837333a21.290667 21.290667 0 1 1 42.666667 0v298.666667a21.290667 21.290667 0 1 1-42.666667 0v-298.666667z m85.333334 0a21.290667 21.290667 0 1 1 42.666666 0v298.666667a21.290667 21.290667 0 1 1-42.666666 0v-298.666667z m85.333333 0a21.290667 21.290667 0 1 1 42.666667 0v298.666667a21.290667 21.290667 0 1 1-42.666667 0v-298.666667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-wenbenjuzhongduiqi\" viewBox=\"0 0 1024 1024\"><path d=\"M234.666667 298.666667h554.666666a21.333333 21.333333 0 1 1 0 42.666666h-554.666666a21.333333 21.333333 0 1 1 0-42.666666zM341.333333 426.666667h341.333334a21.333333 21.333333 0 1 1 0 42.666666H341.333333a21.333333 21.333333 0 0 1 0-42.666666z m-106.666666 128h554.666666a21.333333 21.333333 0 1 1 0 42.666666h-554.666666a21.333333 21.333333 0 0 1 0-42.666666zM341.333333 682.666667h341.333334a21.333333 21.333333 0 1 1 0 42.666666H341.333333a21.333333 21.333333 0 0 1 0-42.666666z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-dayin\" viewBox=\"0 0 1024 1024\"><path d=\"M743.125333 341.333333c35.669333 0 64.384 28.885333 67.285334 65.024l0.256 6.101334V682.666667h-149.76v-42.666667H768V412.458667c0-14.592-9.514667-26.154667-21.333333-28.16L743.168 384H280.874667c-12.16 0-22.784 10.24-24.576 24.149333l-0.298667 4.266667V640h127.36v42.666667H213.333333V412.458667c0-36.906667 26.794667-67.712 61.653334-70.826667L280.874667 341.333333h462.250666z\" fill=\"#444D5A\" ></path><path d=\"M682.666667 213.333333H341.333333v170.666667h341.333334V213.333333z m-42.666667 42.666667v85.333333H384V256h256zM682.666667 554.666667v256H341.333333v-256h341.333334z m-42.666667 42.666666H384v170.666667h256v-170.666667z\" fill=\"#444D5A\" ></path><path d=\"M341.333333 426.666667h128v42.666666H341.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-wenbenfenge\" viewBox=\"0 0 1024 1024\"><path d=\"M544.896 389.717333h110.762667v46.933334c6.698667 6.613333 15.658667 6.613333 22.357333 0l84.949333-55.125334c6.698667-4.437333 6.698667-13.226667 0-19.84l-84.906666-57.386666c-6.741333-6.613333-15.701333-6.613333-22.4 0v41.258666h-133.12l-89.429334 154.453334H343.722667v0.128h-22.698667c-11.178667 0-22.357333 11.050667-22.357333 22.058666 0 11.050667 11.178667 22.058667 22.357333 22.058667h134.101333l-0.085333-0.128h0.426667l89.386666-154.453333h0.042667z m133.12 198.954667a15.061333 15.061333 0 0 0-22.314667 0v43.690667h-66.133333l-67.029333-110.293334-22.357334 44.117334s62.592 103.68 67.072 110.293333h88.448V721.066667a15.061333 15.061333 0 0 0 22.314667 0l84.949333-55.168c6.698667-4.437333 6.698667-13.226667 0-19.84l-84.906666-57.386667h-0.042667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-hanshu\" viewBox=\"0 0 1024 1024\"><path d=\"M771.072 391.253333a6.698667 6.698667 0 0 0-0.512-9.514666 6.997333 6.997333 0 0 0-4.48-1.749334h-61.354667c-1.962667 0-3.84 0.853333-5.12 2.346667l-103.893333 122.709333a6.698667 6.698667 0 0 1-11.392-1.621333l-53.674667-119.381333a6.656 6.656 0 0 0-6.144-4.010667H381.866667l0.853333-3.968 6.741333-35.712c8.874667-46.933333 32.085333-68.864 72.533334-68.864 15.658667 0 29.994667 1.450667 41.258666 4.010667l11.861334-56.490667a197.888 197.888 0 0 0-46.464-5.12c-87.296 0-132.224 37.418667-148.650667 124.458667l-7.978667 41.813333H229.632a6.698667 6.698667 0 0 0-6.613333 5.376l-9.130667 43.818667a6.826667 6.826667 0 0 0 6.570667 8.106666h79.786666l-75.264 363.52a6.826667 6.826667 0 0 0 6.570667 8.234667H287.573333c3.242667 0 5.973333-2.346667 6.570667-5.418667l75.861333-366.165333h114.773334l57.685333 117.546667a6.570667 6.570667 0 0 1-1.024 7.381333l-152.746667 171.690667a6.826667 6.826667 0 0 0 5.12 11.264h61.44c2.005333 0 3.882667-0.853333 5.162667-2.389334l104.576-123.989333a6.826667 6.826667 0 0 1 11.392 1.493333l55.594667 120.661334a6.741333 6.741333 0 0 0 6.186666 3.968h54.613334a6.784 6.784 0 0 0 6.101333-9.770667L618.325333 567.466667a6.698667 6.698667 0 0 1 1.066667-7.466667l151.722667-168.661333-0.042667-0.042667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-jiangxu\" viewBox=\"0 0 1024 1024\"><path d=\"M430.848 666.197333H366.592V236.074667a6.656 6.656 0 0 0-6.741333-6.528h-47.36a6.656 6.656 0 0 0-6.741334 6.528v430.122666H241.493333c-5.674667 0-8.874667 6.314667-5.333333 10.538667l94.72 115.2a6.912 6.912 0 0 0 10.624 0l94.72-115.2c3.413333-4.224 0.298667-10.538667-5.376-10.538667zM582.442667 806.698667l20.992-61.098667h103.68l21.205333 61.098667h43.690667L672.64 533.333333h-34.688l-99.370667 273.365334h43.861334z m112.896-97.877334h-79.872l39.552-119.424h0.768l39.552 119.466667zM742.570667 486.698667v-39.168h-124.288l124.288-203.093334V213.333333h-169.685334v36.949334h119.04l-123.904 201.941333v34.474667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-dingbuduiqi\" viewBox=\"0 0 1024 1024\"><path d=\"M298.666667 384h426.666666v42.666667H298.666667zM416 527.829333l90.496-90.496 90.538667 90.496-30.165334 30.165334-37.802666-37.717334v290.090667h-42.666667v-292.565333l-40.234667 40.192-30.165333-30.165334z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-tupian\" viewBox=\"0 0 1024 1024\"><path d=\"M810.666667 213.333333v597.333334H213.333333V213.333333h597.333334z m-42.666667 263.381334l-233.984 190.890666-118.613333-98.218666L256 704.64V768h512v-291.285333zM768 256H256v392.704l159.146667-134.954667 119.04 98.602667L768 421.674667V256zM384 341.333333a42.666667 42.666667 0 1 1 0 85.333334 42.666667 42.666667 0 0 1 0-85.333334z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-xiangxia90\" viewBox=\"0 0 1024 1024\"><path d=\"M789.333333 528.213333l-213.333333 77.653334v0.64l-1.621333-0.042667L426.666667 660.224v-45.354667l106.666666-38.826666V423.637333l-106.666666-38.826666V339.456l147.498666 53.674667 1.834667 0.042666v0.64l213.333333 77.610667v56.789333z m-46.634666-28.416L576 439.125333v121.386667l166.698667-60.714667zM384 687.829333l-90.496 90.538667-90.538667-90.538667 30.165334-30.165333 37.802666 37.76V234.666667h42.666667v463.232l40.234667-40.234667 30.165333 30.165333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-shupaiwenzi\" viewBox=\"0 0 1024 1024\"><path d=\"M636.757333 298.666667l77.653334 213.333333h0.64l-0.042667 1.621333 53.76 147.712h-45.354667l-38.826666-106.666666h-152.405334l-38.826666 106.666666H448l53.674667-147.498666 0.042666-1.834667h0.64l77.610667-213.333333h56.789333z m-28.416 46.634666L547.669333 512h121.386667l-60.714667-166.698667zM394.368 698.496L303.786667 789.034667 213.333333 698.453333l30.165334-30.165333 37.802666 37.76V245.333333h42.666667v463.232l40.234667-40.234666 30.165333 30.165333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-quanjiabiankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 810.666667V256h42.666667v554.666667zM725.333333 810.666667V256h42.666667v554.666667zM469.333333 810.666667V256h42.666667v554.666667z\" fill=\"#444D5A\" ></path><path d=\"M213.333333 256h554.666667v42.666667H213.333333zM213.333333 512h554.666667v42.666667H213.333333zM213.333333 768h554.666667v42.666667H213.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-shengxu\" viewBox=\"0 0 1024 1024\"><path d=\"M430.848 357.76H366.592v430.165333a6.656 6.656 0 0 1-6.741333 6.485334h-47.36a6.656 6.656 0 0 1-6.741334-6.485334V357.76H241.493333c-5.674667 0-8.874667-6.314667-5.333333-10.538667l94.72-115.2a6.912 6.912 0 0 1 10.624 0l94.72 115.2c3.413333 4.224 0.298667 10.538667-5.376 10.538667zM582.442667 486.698667l20.992-61.098667h103.68l21.205333 61.098667h43.690667L672.64 213.333333h-34.688l-99.370667 273.365334h43.861334z m112.896-97.877334h-79.872l39.552-119.424h0.768l39.552 119.466667zM742.570667 806.698667v-39.168h-124.288l124.288-203.093334V533.333333h-169.685334v36.949334h119.04l-123.904 201.941333v34.474667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-caijian\" viewBox=\"0 0 1024 1024\"><path d=\"M341.333333 213.333333h42.666667v469.333334H341.333333z\" fill=\"#444D5A\" ></path><path d=\"M810.666667 640v42.666667H341.333333v-42.666667z\" fill=\"#444D5A\" ></path><path d=\"M682.666667 810.666667h-42.666667V341.333333h42.666667z\" fill=\"#444D5A\" ></path><path d=\"M213.333333 384V341.333333h469.333334v42.666667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-jine\" viewBox=\"0 0 1024 1024\"><path d=\"M658.816 256l34.986667 24.490667-124.629334 177.92h119.04v42.666666h-149.333333v85.333334h149.333333v42.666666h-149.333333v128h-42.666667v-128h-149.333333v-42.666666h149.333333v-85.333334h-149.333333v-42.666666h119.04L341.333333 280.490667 376.32 256l141.226667 201.728L658.816 256z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-caidan1\" viewBox=\"0 0 1024 1024\"><path d=\"M256 640h85.333333a42.666667 42.666667 0 0 1 42.666667 42.666667v85.333333a42.666667 42.666667 0 0 1-42.666667 42.666667H256a42.666667 42.666667 0 0 1-42.666667-42.666667v-85.333333a42.666667 42.666667 0 0 1 42.666667-42.666667z m21.333333 42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333v42.666667a21.333333 21.333333 0 0 0 21.333333 21.333333h42.666667a21.333333 21.333333 0 0 0 21.333333-21.333333v-42.666667a21.333333 21.333333 0 0 0-21.333333-21.333333h-42.666667zM682.666667 213.333333h85.333333a42.666667 42.666667 0 0 1 42.666667 42.666667v85.333333a42.666667 42.666667 0 0 1-42.666667 42.666667h-85.333333a42.666667 42.666667 0 0 1-42.666667-42.666667V256a42.666667 42.666667 0 0 1 42.666667-42.666667z m21.333333 42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333v42.666667a21.333333 21.333333 0 0 0 21.333333 21.333333h42.666667a21.333333 21.333333 0 0 0 21.333333-21.333333v-42.666667a21.333333 21.333333 0 0 0-21.333333-21.333333h-42.666667zM469.333333 640h85.333334a42.666667 42.666667 0 0 1 42.666666 42.666667v85.333333a42.666667 42.666667 0 0 1-42.666666 42.666667h-85.333334a42.666667 42.666667 0 0 1-42.666666-42.666667v-85.333333a42.666667 42.666667 0 0 1 42.666666-42.666667z m21.333334 42.666667a21.333333 21.333333 0 0 0-21.333334 21.333333v42.666667a21.333333 21.333333 0 0 0 21.333334 21.333333h42.666666a21.333333 21.333333 0 0 0 21.333334-21.333333v-42.666667a21.333333 21.333333 0 0 0-21.333334-21.333333h-42.666666zM469.333333 213.333333h85.333334a42.666667 42.666667 0 0 1 42.666666 42.666667v85.333333a42.666667 42.666667 0 0 1-42.666666 42.666667h-85.333334a42.666667 42.666667 0 0 1-42.666666-42.666667V256a42.666667 42.666667 0 0 1 42.666666-42.666667z m21.333334 42.666667a21.333333 21.333333 0 0 0-21.333334 21.333333v42.666667a21.333333 21.333333 0 0 0 21.333334 21.333333h42.666666a21.333333 21.333333 0 0 0 21.333334-21.333333v-42.666667a21.333333 21.333333 0 0 0-21.333334-21.333333h-42.666666z m192 384h85.333333a42.666667 42.666667 0 0 1 42.666667 42.666667v85.333333a42.666667 42.666667 0 0 1-42.666667 42.666667h-85.333333a42.666667 42.666667 0 0 1-42.666667-42.666667v-85.333333a42.666667 42.666667 0 0 1 42.666667-42.666667z m21.333333 42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333v42.666667a21.333333 21.333333 0 0 0 21.333333 21.333333h42.666667a21.333333 21.333333 0 0 0 21.333333-21.333333v-42.666667a21.333333 21.333333 0 0 0-21.333333-21.333333h-42.666667zM469.333333 426.666667h85.333334a42.666667 42.666667 0 0 1 42.666666 42.666666v85.333334a42.666667 42.666667 0 0 1-42.666666 42.666666h-85.333334a42.666667 42.666667 0 0 1-42.666666-42.666666v-85.333334a42.666667 42.666667 0 0 1 42.666666-42.666666z m21.333334 42.666666a21.333333 21.333333 0 0 0-21.333334 21.333334v42.666666a21.333333 21.333333 0 0 0 21.333334 21.333334h42.666666a21.333333 21.333333 0 0 0 21.333334-21.333334v-42.666666a21.333333 21.333333 0 0 0-21.333334-21.333334h-42.666666zM256 426.666667h85.333333a42.666667 42.666667 0 0 1 42.666667 42.666666v85.333334a42.666667 42.666667 0 0 1-42.666667 42.666666H256a42.666667 42.666667 0 0 1-42.666667-42.666666v-85.333334a42.666667 42.666667 0 0 1 42.666667-42.666666z m426.666667 0h85.333333a42.666667 42.666667 0 0 1 42.666667 42.666666v85.333334a42.666667 42.666667 0 0 1-42.666667 42.666666h-85.333333a42.666667 42.666667 0 0 1-42.666667-42.666666v-85.333334a42.666667 42.666667 0 0 1 42.666667-42.666666z m21.333333 42.666666a21.333333 21.333333 0 0 0-21.333333 21.333334v42.666666a21.333333 21.333333 0 0 0 21.333333 21.333334h42.666667a21.333333 21.333333 0 0 0 21.333333-21.333334v-42.666666a21.333333 21.333333 0 0 0-21.333333-21.333334h-42.666667z m-426.666667 0a21.333333 21.333333 0 0 0-21.333333 21.333334v42.666666a21.333333 21.333333 0 0 0 21.333333 21.333334h42.666667a21.333333 21.333333 0 0 0 21.333333-21.333334v-42.666666a21.333333 21.333333 0 0 0-21.333333-21.333334h-42.666667zM256 213.333333h85.333333a42.666667 42.666667 0 0 1 42.666667 42.666667v85.333333a42.666667 42.666667 0 0 1-42.666667 42.666667H256a42.666667 42.666667 0 0 1-42.666667-42.666667V256a42.666667 42.666667 0 0 1 42.666667-42.666667z m21.333333 42.666667a21.333333 21.333333 0 0 0-21.333333 21.333333v42.666667a21.333333 21.333333 0 0 0 21.333333 21.333333h42.666667a21.333333 21.333333 0 0 0 21.333333-21.333333v-42.666667a21.333333 21.333333 0 0 0-21.333333-21.333333h-42.666667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-quxiaohebing\" viewBox=\"0 0 1024 1024\"><path d=\"M810.666667 213.333333v597.333334H213.333333V213.333333h597.333334z m-42.666667 42.666667H256v512h512V256z\" fill=\"#B5B8BD\" ></path><path d=\"M533.333333 213.333333v170.666667h-42.666666V213.333333z\" fill=\"#B5B8BD\" ></path><path d=\"M405.333333 426.666667v213.333333h-42.666666v-213.333333zM533.333333 405.333333v213.333334h-42.666666v-213.333334zM661.333333 405.333333v213.333334h-42.666666v-213.333334z\" fill=\"#444D5A\" ></path><path d=\"M533.333333 597.333333v170.666667h-42.666666v-170.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M810.666667 384v256H213.333333V384h597.333334z m-42.666667 42.666667H256v170.666666h512v-170.666666z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-wenbenxiahuaxian\" viewBox=\"0 0 1024 1024\"><path d=\"M362.666667 256v298.666667a149.333333 149.333333 0 0 0 298.453333 8.192L661.333333 554.666667V256h42.666667v298.666667a192 192 0 0 1-383.786667 9.045333L320 554.666667V256h42.666667z\" fill=\"#444D5A\" ></path><path d=\"M256 768m21.333333 0l469.333334 0q21.333333 0 21.333333 21.333333l0 0q0 21.333333-21.333333 21.333334l-469.333334 0q-21.333333 0-21.333333-21.333334l0 0q0-21.333333 21.333333-21.333333Z\" fill=\"#444D5A\" ></path><path d=\"M256 256m21.333333 0l128 0q21.333333 0 21.333334 21.333333l0 0q0 21.333333-21.333334 21.333334l-128 0q-21.333333 0-21.333333-21.333334l0 0q0-21.333333 21.333333-21.333333Z\" fill=\"#444D5A\" ></path><path d=\"M597.333333 256m21.333334 0l128 0q21.333333 0 21.333333 21.333333l0 0q0 21.333333-21.333333 21.333334l-128 0q-21.333333 0-21.333334-21.333334l0 0q0-21.333333 21.333334-21.333333Z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-shangbiankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 256h554.666667v42.666667H213.333333z\" fill=\"#444D5A\" ></path><path d=\"M213.333333 426.666667h42.666667v42.666666H213.333333zM213.333333 597.333333h42.666667v42.666667H213.333333zM213.333333 341.333333h42.666667v42.666667H213.333333zM213.333333 512h42.666667v42.666667H213.333333zM213.333333 682.666667h42.666667v42.666666H213.333333zM469.333333 426.666667h42.666667v42.666666h-42.666667zM725.333333 426.666667h42.666667v42.666666h-42.666667zM725.333333 597.333333h42.666667v42.666667h-42.666667zM725.333333 341.333333h42.666667v42.666667h-42.666667zM725.333333 512h42.666667v42.666667h-42.666667zM725.333333 682.666667h42.666667v42.666666h-42.666667zM725.333333 768h42.666667v42.666667h-42.666667zM469.333333 597.333333h42.666667v42.666667h-42.666667zM469.333333 341.333333h42.666667v42.666667h-42.666667zM469.333333 512h42.666667v42.666667h-42.666667zM469.333333 682.666667h42.666667v42.666666h-42.666667zM213.333333 768h42.666667v42.666667H213.333333zM384 768h42.666667v42.666667H384zM554.666667 768h42.666666v42.666667h-42.666666zM298.666667 768h42.666666v42.666667H298.666667zM469.333333 768h42.666667v42.666667h-42.666667zM640 768h42.666667v42.666667h-42.666667zM384 512h42.666667v42.666667H384zM554.666667 512h42.666666v42.666667h-42.666666zM298.666667 512h42.666666v42.666667H298.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M469.333333 512h42.666667v42.666667h-42.666667zM640 512h42.666667v42.666667h-42.666667z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-dingwei\" viewBox=\"0 0 1024 1024\"><path d=\"M618.666667 723.584V661.333333a21.333333 21.333333 0 1 1 42.666666 0v62.250667a128.128 128.128 0 0 0 104.917334-104.917333H704a21.333333 21.333333 0 1 1 0-42.666667h62.250667a128.128 128.128 0 0 0-104.917334-104.874667V533.333333a21.333333 21.333333 0 1 1-42.666666 0v-62.208a128.085333 128.085333 0 0 0-104.874667 104.874667H576a21.333333 21.333333 0 0 1 0 42.666667h-62.208a128.128 128.128 0 0 0 104.874667 104.917333z m149.333333-296.96a213.12 213.12 0 0 0-42.666667-24.874667V277.333333a21.333333 21.333333 0 0 0-21.333333-21.333333h-426.666667a21.333333 21.333333 0 0 0-21.333333 21.333333v341.333334a21.333333 21.333333 0 0 0 21.333333 21.333333h153.6c2.986667 14.848 7.594667 29.098667 13.482667 42.666667H256a42.666667 42.666667 0 0 1-42.666667-42.666667V256a42.666667 42.666667 0 0 1 42.666667-42.666667h469.333333a42.666667 42.666667 0 0 1 42.666667 42.666667v170.666667zM640 768a170.666667 170.666667 0 1 1 0-341.333333 170.666667 170.666667 0 0 1 0 341.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-sizhoujiabiankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 810.666667V256h42.666667v554.666667zM725.333333 810.666667V256h42.666667v554.666667z\" fill=\"#444D5A\" ></path><path d=\"M213.333333 256h554.666667v42.666667H213.333333zM213.333333 768h554.666667v42.666667H213.333333z\" fill=\"#444D5A\" ></path><path d=\"M384 554.666667v-42.666667h42.666667v42.666667zM554.666667 554.666667v-42.666667h42.666666v42.666667zM298.666667 554.666667v-42.666667h42.666666v42.666667zM469.333333 554.666667v-42.666667h42.666667v42.666667zM640 554.666667v-42.666667h42.666667v42.666667zM469.333333 640v-42.666667h42.666667v42.666667zM469.333333 469.333333v-42.666666h42.666667v42.666666zM469.333333 725.333333v-42.666666h42.666667v42.666666z\" fill=\"#B5B8BD\" ></path><path d=\"M469.333333 554.666667v-42.666667h42.666667v42.666667zM469.333333 384V341.333333h42.666667v42.666667z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-cebianlanshouqi\" viewBox=\"0 0 1024 1024\"><path d=\"M256 320a21.333333 21.333333 0 0 1 21.333333-21.333333h469.333334a21.333333 21.333333 0 1 1 0 42.666666h-469.333334a21.290667 21.290667 0 0 1-21.333333-21.333333zM256 512c0-11.776 9.6-21.333333 21.461333-21.333333h277.077334a21.333333 21.333333 0 1 1 0 42.666666H277.504A21.333333 21.333333 0 0 1 256 512z m0 192a21.333333 21.333333 0 0 1 21.333333-21.333333h469.333334a21.333333 21.333333 0 1 1 0 42.666666h-469.333334a21.290667 21.290667 0 0 1-21.333333-21.333333z m368.896-283.562667a21.333333 21.333333 0 0 1 30.165333-30.165333l106.666667 106.666667a21.333333 21.333333 0 0 1 0 30.165333l-106.666667 106.666667a21.333333 21.333333 0 0 1-30.165333-30.165334L716.501333 512l-91.562666-91.605333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-hebing\" viewBox=\"0 0 1024 1024\"><path d=\"M810.666667 213.333333v597.333334H213.333333V213.333333h597.333334z m-42.666667 42.666667H256v512h512V256z\" fill=\"#444D5A\" ></path><path d=\"M389.162667 426.666667l90.538666 90.496-90.538666 90.538666-30.165334-30.165333 37.802667-37.845333-119.466667 0.042666v-42.666666l121.856-0.042667-40.192-40.192 30.165334-30.165333zM645.162667 426.666667L554.666667 517.162667l90.496 90.538666 30.165333-30.165333-37.76-37.845333 119.466667 0.042666v-42.666666l-121.856-0.042667 40.149333-40.192-30.165333-30.165333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-xiangshangqingxie\" viewBox=\"0 0 1024 1024\"><path d=\"M290.944 289.365333l205.738667 95.914667 0.469333-0.426667 1.109333 1.152 142.506667 66.432-32.128 32.085334-102.826667-47.957334-107.818666 107.733334 48 102.912-32.085334 32.042666-66.346666-142.250666-1.28-1.28 0.469333-0.512-96-205.696 40.192-40.149334z m12.885333 53.034667l74.965334 160.810667 85.845333-85.845334L303.786667 342.4zM690.432 463.104h128v128h-42.666667v-53.418667l-325.845333 325.802667-30.165333-30.165333 327.552-327.552h-56.874667v-42.666667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-shuipingduiqi\" viewBox=\"0 0 1024 1024\"><path d=\"M725.333333 533.333333H298.666667v-42.666666h426.666666zM426.666667 634.496l90.496-90.496 90.538666 90.496-30.165333 30.165333-39.936-39.850666v121.557333h-42.666667v-119.765333l-38.101333 38.058666-30.165333-30.165333zM426.666667 389.162667l90.496 90.538666 90.538666-90.538666-30.165333-30.165334-39.936 39.893334V277.333333h-42.666667v119.765334l-38.101333-38.101334-30.165333 30.165334z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-wenbenshanchuxian\" viewBox=\"0 0 1024 1024\"><path d=\"M298.666667 256h426.666666v42.666667H298.666667z\" fill=\"#444D5A\" ></path><path d=\"M533.290667 554.666667l0.042666 192h-42.666666l-0.042667-192h42.666667z m0.042666-277.333334l-0.042666 234.666667h-42.666667l0.042667-234.666667h42.666666zM320 256v85.333333h-42.666667V256zM746.666667 256v85.333333h-42.666667V256z\" fill=\"#444D5A\" ></path><path d=\"M256 469.333333h512v42.666667H256zM426.666667 725.333333h170.666666v42.666667h-170.666666z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-wenbenyouduiqi\" viewBox=\"0 0 1024 1024\"><path d=\"M234.666667 298.666667h554.666666a21.333333 21.333333 0 1 1 0 42.666666h-554.666666a21.333333 21.333333 0 1 1 0-42.666666z m213.333333 128h341.333333a21.333333 21.333333 0 1 1 0 42.666666h-341.333333a21.333333 21.333333 0 0 1 0-42.666666z m-213.333333 128h554.666666a21.333333 21.333333 0 1 1 0 42.666666h-554.666666a21.333333 21.333333 0 0 1 0-42.666666z m213.333333 128h341.333333a21.333333 21.333333 0 1 1 0 42.666666h-341.333333a21.333333 21.333333 0 0 1 0-42.666666z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-qianjin\" viewBox=\"0 0 1024 1024\"><path d=\"M287.018667 419.328h310.997333v42.666667H286.72l84.48 84.437333a21.333333 21.333333 0 1 1-30.208 30.165333l-120.746667-120.704a21.248 21.248 0 0 1 0-30.165333l120.746667-120.661333a21.333333 21.333333 0 0 1 30.165333 30.165333L287.018667 419.328z m524.330666 213.333333a213.333333 213.333333 0 0 0-213.333333-213.333333v42.666667a170.666667 170.666667 0 0 1 170.666667 170.666666h42.666666z m0 0h-42.666666v64a21.333333 21.333333 0 1 0 42.666666 0v-64z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-tubiao\" viewBox=\"0 0 1024 1024\"><path d=\"M256 213.333333H213.333333v597.333334h597.333334v-42.666667H256z\" fill=\"#444D5A\" ></path><path d=\"M490.666667 343.466667V554.666667h185.6c-19.2 72.533333-85.333333 128-164.266667 128-93.866667 0-170.666667-76.8-170.666667-170.666667 0-87.466667 66.133333-157.866667 149.333334-168.533333M512 298.666667c-117.333333 0-213.333333 96-213.333333 213.333333s96 213.333333 213.333333 213.333333 213.333333-96 213.333333-213.333333h-192V298.666667H512z\" fill=\"#444D5A\" ></path><path d=\"M618.666667 260.266667c83.2 14.933333 134.4 74.666667 147.2 166.4H618.666667V260.266667m-42.666667-46.933334v256H810.666667c0-149.333333-85.333333-256-234.666667-256z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-youbiankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M768 256v554.666667h-42.666667V256z\" fill=\"#444D5A\" ></path><path d=\"M597.333333 256v42.666667h-42.666666V256zM426.666667 256v42.666667H384V256zM682.666667 256v42.666667h-42.666667V256zM512 256v42.666667h-42.666667V256zM341.333333 256v42.666667H298.666667V256z\" fill=\"#B5B8BD\" ></path><path d=\"M597.333333 512v42.666667h-42.666666v-42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M597.333333 768v42.666667h-42.666666v-42.666667zM426.666667 768v42.666667H384v-42.666667zM682.666667 768v42.666667h-42.666667v-42.666667zM512 768v42.666667h-42.666667v-42.666667zM341.333333 768v42.666667H298.666667v-42.666667zM256 768v42.666667H213.333333v-42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M426.666667 512v42.666667H384v-42.666667zM682.666667 512v42.666667h-42.666667v-42.666667zM512 512v42.666667h-42.666667v-42.666667zM341.333333 512v42.666667H298.666667v-42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M256 256v42.666667H213.333333V256zM256 426.666667v42.666666H213.333333v-42.666666zM256 597.333333v42.666667H213.333333v-42.666667zM256 341.333333v42.666667H213.333333V341.333333zM256 512v42.666667H213.333333v-42.666667zM256 682.666667v42.666666H213.333333v-42.666666z\" fill=\"#B5B8BD\" ></path><path d=\"M512 426.666667v42.666666h-42.666667v-42.666666zM512 597.333333v42.666667h-42.666667v-42.666667zM512 341.333333v42.666667h-42.666667V341.333333zM512 512v42.666667h-42.666667v-42.666667zM512 682.666667v42.666666h-42.666667v-42.666666z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-baifenhao\" viewBox=\"0 0 1024 1024\"><path d=\"M653.525333 213.333333l36.949334 21.333334-320 554.24-36.949334-21.333334L653.525333 213.333333zM682.666667 469.333333c71.68 0 128 67.626667 128 149.333334S754.346667 768 682.666667 768s-128-67.626667-128-149.333333 56.32-149.333333 128-149.333334z m0 42.666667c-46.165333 0-85.333333 46.976-85.333334 106.666667s39.168 106.666667 85.333334 106.666666c46.165333 0 85.333333-46.976 85.333333-106.666666s-39.168-106.666667-85.333333-106.666667zM341.333333 234.666667c71.68 0 128 67.626667 128 149.333333s-56.32 149.333333-128 149.333333S213.333333 465.706667 213.333333 384s56.32-149.333333 128-149.333333z m0 42.666666C295.168 277.333333 256 324.309333 256 384s39.168 106.666667 85.333333 106.666667c46.165333 0 85.333333-46.976 85.333334-106.666667s-39.168-106.666667-85.333334-106.666667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-geshishua\" viewBox=\"0 0 1024 1024\"><path d=\"M725.333333 213.333333v85.333334h85.333334v234.666666h-298.666667V597.333333h21.333333v213.333334h-85.333333v-213.333334h21.333333v-106.666666h298.666667V341.333333h-42.666667v85.333334H213.333333V213.333333h512z m-42.666666 42.666667H256v128h426.666667V256z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-baocun\" viewBox=\"0 0 1024 1024\"><path d=\"M341.333333 256H277.333333a21.333333 21.333333 0 0 0-21.333333 21.333333v469.333334a21.333333 21.333333 0 0 0 21.333333 21.333333h469.333334a21.333333 21.333333 0 0 0 21.333333-21.333333v-469.333334a21.333333 21.333333 0 0 0-21.333333-21.333333H682.666667v213.333333a42.666667 42.666667 0 0 1-42.666667 42.666667H384a42.666667 42.666667 0 0 1-42.666667-42.666667V256zM256 213.333333h512a42.666667 42.666667 0 0 1 42.666667 42.666667v512a42.666667 42.666667 0 0 1-42.666667 42.666667H256a42.666667 42.666667 0 0 1-42.666667-42.666667V256a42.666667 42.666667 0 0 1 42.666667-42.666667z m128 42.666667v192a21.333333 21.333333 0 0 0 21.333333 21.333333h213.333334a21.333333 21.333333 0 0 0 21.333333-21.333333V256H384z m192 42.666667a21.333333 21.333333 0 0 1 21.333333 21.333333v85.333333a21.333333 21.333333 0 0 1-42.666666 0v-85.333333a21.333333 21.333333 0 0 1 21.333333-21.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-shujuyanzheng\" viewBox=\"0 0 1024 1024\"><path d=\"M764.330667 592.170667l30.165333 30.165333L734.165333 682.666667l60.330667 60.330666-30.165333 30.165334-60.330667-60.330667-60.330667 60.330667-30.165333-30.165334L673.834667 682.666667l-60.330667-60.330667 30.165333-30.165333 60.330667 60.330666 60.330667-60.330666zM725.333333 512v42.666667H256v128h256v42.666666H213.333333v-213.333333h512z m47.829334-209.664l30.165333 30.165333L682.666667 453.12l-30.165334 30.165333-90.496-90.453333 30.165334-30.208 60.330666 60.330667 120.661334-120.661334zM725.333333 256v42.666667H256v128h256v42.666666H213.333333V256h512z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-jieduan\" viewBox=\"0 0 1024 1024\"><path d=\"M767.829333 213.333333h42.496v597.333334h-42.496z\" fill=\"#B5B8BD\" ></path><path d=\"M767.146667 553.216h-384v-42.496h384v42.496zM213.333333 213.333333h84.992v597.333334H213.333333V213.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-geshitiaojian\" viewBox=\"0 0 1024 1024\"><path d=\"M810.666667 213.333333v597.333334H213.333333V213.333333h597.333334z m-42.666667 320h-106.666667V768H768v-234.666667z m-405.376 0h-106.666667V768h106.666667v-234.666667z m256.042667 86.784L445.482667 768H618.666667v-147.882667z m0-162.346666l-213.376 179.968v108.885333l213.376-179.072v-109.781333z m0-163.669334l-213.333334 179.029334v108.885333l213.333334-179.072V294.101333zM768 256h-103.936l-2.730667 2.304V490.666667H768V256zM362.666667 256H256v234.666667h106.666667V256z m235.008 0H405.333333v161.408L597.674667 256z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-zidonghuanhang\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 213.333333h85.12v597.333334H213.333333V213.333333z m225.450667 477.44l25.557333-21.333333-72.362666-63.786667 72.362666-63.872-25.557333-21.248-93.610667 80.853334h4.266667-4.266667l93.610667 89.386666z\" fill=\"#444D5A\" ></path><path d=\"M768 213.333333h42.581333v597.333334H768z\" fill=\"#B5B8BD\" ></path><path d=\"M540.928 367.274667H391.978667v42.581333h148.949333c59.605333 0 106.410667 38.314667 106.410667 85.12s-46.805333 85.12-106.410667 85.12H391.978667v42.581333h148.949333c85.12 0 157.482667-55.338667 157.482667-127.701333s-72.362667-127.701333-157.44-127.701333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-cebianlanzhankai\" viewBox=\"0 0 1024 1024\"><path d=\"M256 320a21.333333 21.333333 0 0 1 21.333333-21.333333h469.333334a21.333333 21.333333 0 1 1 0 42.666666h-469.333334a21.290667 21.290667 0 0 1-21.333333-21.333333z m192 192c0-11.776 9.557333-21.333333 21.461333-21.333333h277.034667a21.333333 21.333333 0 1 1 0 42.666666h-277.034667a21.333333 21.333333 0 0 1-21.461333-21.333333zM256 704a21.333333 21.333333 0 0 1 21.333333-21.333333h469.333334a21.333333 21.333333 0 1 1 0 42.666666h-469.333334a21.290667 21.290667 0 0 1-21.333333-21.333333z m143.061333-283.562667L307.541333 512l91.605334 91.562667a21.333333 21.333333 0 0 1-30.165334 30.165333l-106.666666-106.666667a21.333333 21.333333 0 0 1 0-30.165333l106.666666-106.666667a21.333333 21.333333 0 0 1 30.165334 30.165334z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-shaixuan2\" viewBox=\"0 0 1024 1024\"><path d=\"M736 213.333333H328.533333C288 213.333333 256 245.333333 256 285.866667c0 17.066667 6.4 34.133333 17.066667 46.933333 0 2.133333 2.133333 2.133333 2.133333 4.266667l160 160v168.533333c0 6.4 2.133333 10.666667 6.4 14.933333l145.066667 123.733334c4.266667 2.133333 8.533333 4.266667 12.8 4.266666 6.4 0 10.666667-2.133333 14.933333-6.4 4.266667-4.266667 4.266667-10.666667 4.266667-14.933333V503.466667l170.666666-166.4 2.133334-2.133334c10.666667-12.8 17.066667-29.866667 17.066666-46.933333 0-42.666667-32-74.666667-72.533333-74.666667z m23.466667 93.866667s-2.133333 2.133333 0 0l-172.8 172.8c-4.266667 4.266667-6.4 8.533333-6.4 14.933333v251.733334l-104.533334-87.466667V490.666667c0-6.4-2.133333-10.666667-6.4-14.933334l-162.133333-166.4-2.133333-2.133333c-6.4-6.4-8.533333-12.8-8.533334-21.333333 0-17.066667 14.933333-32 32-32h407.466667c17.066667 0 32 14.933333 32 32 0 8.533333-4.266667 14.933333-8.533333 21.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-xiangxiaqingxie\" viewBox=\"0 0 1024 1024\"><path d=\"M755.968 312.277333l-95.914667 205.738667 0.426667 0.469333-1.152 1.109334-66.432 142.506666-32.085333-32.128 47.957333-102.826666-107.733333-107.818667-102.912 48-32.042667-32.085333 142.250667-66.346667 1.28-1.28 0.512 0.469333 205.696-96 40.149333 40.192z m-53.034667 12.885334l-160.810666 74.965333 85.845333 85.845333 74.965333-160.810666zM582.229333 711.765333v128h-128v-42.666666h53.418667l-325.802667-325.845334 30.165334-30.165333 327.552 327.552v-56.874667h42.666666z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-yichu\" viewBox=\"0 0 1024 1024\"><path d=\"M256 213.333333h85.333333v597.333334H256z\" fill=\"#444D5A\" ></path><path d=\"M711.466667 642.688l-26.154667-26.154667 89.6-85.845333H256v-37.376h518.954667l-89.6-85.845333 26.112-26.112L842.154667 512z\" fill=\"#444D5A\" ></path><path d=\"M573.354667 213.333333h42.666666v242.688h-42.666666V213.333333z m0 354.688h42.666666V810.666667h-42.666666v-242.688z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-chuizhihebing\" viewBox=\"0 0 1024 1024\"><path d=\"M810.666667 213.333333v597.333334H213.333333V213.333333h597.333334z m-42.666667 42.666667H256v512h512V256z\" fill=\"#444D5A\" ></path><path d=\"M640 213.333333v597.333334h-42.666667V213.333333zM426.666667 213.333333v597.333334H384V213.333333z\" fill=\"#444D5A\" ></path><path d=\"M597.034667 591.829333l-90.538667 90.538667L416 591.786667l30.165333-30.165334 37.802667 37.76V352h42.666667v249.898667l40.234666-40.234667 30.165334 30.165333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-wenbenfensanduiqi\" viewBox=\"0 0 1024 1024\"><path d=\"M234.666667 298.666667h554.666666a21.333333 21.333333 0 1 1 0 42.666666h-554.666666a21.333333 21.333333 0 1 1 0-42.666666z m0 128h554.666666a21.333333 21.333333 0 1 1 0 42.666666h-554.666666a21.333333 21.333333 0 0 1 0-42.666666z m0 128h554.666666a21.333333 21.333333 0 1 1 0 42.666666h-554.666666a21.333333 21.333333 0 0 1 0-42.666666z m0 128h554.666666a21.333333 21.333333 0 1 1 0 42.666666h-554.666666a21.333333 21.333333 0 0 1 0-42.666666z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-zuobiankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 810.666667V256h42.666667v554.666667z\" fill=\"#444D5A\" ></path><path d=\"M384 810.666667v-42.666667h42.666667v42.666667zM554.666667 810.666667v-42.666667h42.666666v42.666667zM298.666667 810.666667v-42.666667h42.666666v42.666667zM469.333333 810.666667v-42.666667h42.666667v42.666667zM640 810.666667v-42.666667h42.666667v42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M384 554.666667v-42.666667h42.666667v42.666667zM554.666667 554.666667v-42.666667h42.666666v42.666667zM298.666667 554.666667v-42.666667h42.666666v42.666667zM469.333333 554.666667v-42.666667h42.666667v42.666667zM640 554.666667v-42.666667h42.666667v42.666667zM469.333333 640v-42.666667h42.666667v42.666667zM469.333333 469.333333v-42.666666h42.666667v42.666666zM469.333333 725.333333v-42.666666h42.666667v42.666666z\" fill=\"#B5B8BD\" ></path><path d=\"M469.333333 554.666667v-42.666667h42.666667v42.666667zM469.333333 384V341.333333h42.666667v42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M384 298.666667V256h42.666667v42.666667zM554.666667 298.666667V256h42.666666v42.666667zM298.666667 298.666667V256h42.666666v42.666667zM469.333333 298.666667V256h42.666667v42.666667zM640 298.666667V256h42.666667v42.666667zM725.333333 298.666667V256h42.666667v42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M725.333333 810.666667v-42.666667h42.666667v42.666667zM725.333333 640v-42.666667h42.666667v42.666667zM725.333333 469.333333v-42.666666h42.666667v42.666666zM725.333333 725.333333v-42.666666h42.666667v42.666666zM725.333333 554.666667v-42.666667h42.666667v42.666667zM725.333333 384V341.333333h42.666667v42.666667z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-fenyechakan\" viewBox=\"0 0 1024 1024\"><path d=\"M810.666667 213.333333v42.666667h-170.709334L640 768h170.666667v42.666667h-213.333334V213.333333h213.333334z m-384 0l-0.042667 554.666667H426.666667v42.666667H213.333333v-42.666667h170.624L384 256H213.333333V213.333333h213.333334z m106.666666 512v85.333334h-42.666666v-85.333334h42.666666z m0-170.666666v85.333333h-42.666666v-85.333333h42.666666z m0-170.666667v85.333333h-42.666666V384h42.666666z m0-170.666667v85.333334h-42.666666V213.333333h42.666666z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-yunhang\" viewBox=\"0 0 1024 1024\"><path d=\"M268.032 523.434667l60.373333-60.330667 211.2 211.2-60.373333 60.330667z\" fill=\"#70BC64\" ></path><path d=\"M780.928 312.234667l60.373333 60.330666-331.904 331.861334-60.330666-60.330667z\" fill=\"#70BC64\" ></path></symbol><symbol id=\"luckysheet-iconfont-lie\" viewBox=\"0 0 1024 1024\"><path d=\"M234.666667 832v-597.333333h42.666666v597.333333zM405.333333 832v-597.333333h42.666667v597.333333zM576 832v-597.333333h42.666667v597.333333zM746.666667 832v-597.333333h42.666666v597.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-quanping\" viewBox=\"0 0 1024 1024\"><path d=\"M810.666667 213.333333v597.333334H213.333333V213.333333h597.333334z m-42.666667 42.666667H256v512h512V256zM341.333333 597.333333v85.376L426.666667 682.666667v42.666666H298.666667v-128h42.666666z m384 0v128h-128v-42.666666h85.376L682.666667 597.333333h42.666666z m-298.666666-298.666666v42.666666l-85.333334-0.042666V426.666667H298.666667V298.666667h128z m298.666666 0v128h-42.666666l0.042666-85.333334H597.333333V298.666667h128z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-shaixuan\" viewBox=\"0 0 1024 1024\"><path d=\"M736 213.333333H328.533333C288 213.333333 256 245.333333 256 285.866667c0 17.066667 6.4 34.133333 17.066667 46.933333 0 2.133333 2.133333 2.133333 2.133333 4.266667l160 160v168.533333c0 6.4 2.133333 10.666667 6.4 14.933333l145.066667 123.733334c4.266667 2.133333 8.533333 4.266667 12.8 4.266666 6.4 0 10.666667-2.133333 14.933333-6.4 4.266667-4.266667 4.266667-10.666667 4.266667-14.933333V503.466667l170.666666-166.4 2.133334-2.133334c10.666667-12.8 17.066667-29.866667 17.066666-46.933333 0-42.666667-32-74.666667-72.533333-74.666667z m23.466667 93.866667s-2.133333 2.133333 0 0l-172.8 172.8c-4.266667 4.266667-6.4 8.533333-6.4 14.933333v251.733334l-104.533334-87.466667V490.666667c0-6.4-2.133333-10.666667-6.4-14.933334l-162.133333-166.4-2.133333-2.133333c-6.4-6.4-8.533333-12.8-8.533334-21.333333 0-17.066667 14.933333-32 32-32h407.466667c17.066667 0 32 14.933333 32 32 0 8.533333-4.266667 14.933333-8.533333 21.333333z\" fill=\"#444D5A\" ></path><path d=\"M688.213333 378.410667l-101.546666 101.589333c-4.266667 4.266667-6.4 8.533333-6.4 14.933333v251.733334l-104.533334-87.466667V490.666667c0-6.4-2.133333-10.666667-6.4-14.933334L403.626667 408.32l284.586666-29.909333z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-gengxin\" viewBox=\"0 0 1024 1024\"><path d=\"M358.101333 256A298.666667 298.666667 0 0 0 512 810.666667a21.333333 21.333333 0 1 0 0-42.666667A256 256 0 0 1 405.333333 279.210667V363.093333A21.333333 21.333333 0 0 0 426.666667 384c11.776 0 21.333333-9.130667 21.333333-20.906667V234.24a20.565333 20.565333 0 0 0-6.229333-14.634667l0.042666-0.128A20.650667 20.650667 0 0 0 427.050667 213.333333H298.24a21.333333 21.333333 0 0 0-20.906667 21.333334c0 11.776 9.173333 21.333333 20.906667 21.333333h59.818667z m307.797334 512A298.666667 298.666667 0 0 0 512 213.333333a21.333333 21.333333 0 0 0 0 42.666667 256 256 0 0 1 106.666667 488.789333V660.906667A21.333333 21.333333 0 0 0 597.333333 640c-11.776 0-21.333333 9.130667-21.333333 20.906667v128.810666a20.48 20.48 0 0 0 6.229333 14.634667l-0.042666 0.170667a20.650667 20.650667 0 0 0 14.762666 6.144h128.768a21.333333 21.333333 0 0 0 20.949334-21.333334c0-11.776-9.173333-21.333333-20.906667-21.333333h-59.861333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-qingchu\" viewBox=\"0 0 1024 1024\"><path d=\"M330.965333 270.634667l422.4 422.4-60.330666 60.330666-422.4-422.4z\" fill=\"#E15A5A\" ></path><path d=\"M753.365333 330.965333l-422.4 422.4-60.330666-60.330666 422.4-422.4z\" fill=\"#E15A5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-hang\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 256h597.333334v42.666667H213.333333zM213.333333 426.666667h597.333334v42.666666H213.333333zM213.333333 597.333333h597.333334v42.666667H213.333333zM213.333333 768h597.333334v42.666667H213.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-zhushi\" viewBox=\"0 0 1024 1024\"><path d=\"M352 490.666667a32 32 0 1 0 64 0 32 32 0 0 0-64 0z m128 0a32 32 0 1 0 64 0 32 32 0 0 0-64 0z m128 0a32 32 0 1 0 64 0 32 32 0 0 0-64 0z\" fill=\"#444D5A\" ></path><path d=\"M768 298.666667H256c-23.466667 0-42.666667 19.2-42.666667 42.666666v298.666667c0 23.466667 19.2 42.666667 42.666667 42.666667h106.666667v128l128-128H768c23.466667 0 42.666667-19.2 42.666667-42.666667V341.333333c0-23.466667-19.2-42.666667-42.666667-42.666666z m0 320c0 12.8-8.533333 21.333333-21.333333 21.333333H469.333333l-64 64V640h-128c-12.8 0-21.333333-8.533333-21.333333-21.333333v-256c0-12.8 8.533333-21.333333 21.333333-21.333334h469.333334c12.8 0 21.333333 8.533333 21.333333 21.333334v256z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-jian\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 469.333333h597.333334v85.333334H213.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-jisuan\" viewBox=\"0 0 1024 1024\"><path d=\"M774.058667 213.333333v42.666667H310.784l236.288 256-236.330667 256h463.317334v42.666667H213.333333l275.669334-298.666667L213.333333 213.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-jia\" viewBox=\"0 0 1024 1024\"><path d=\"M213.333333 469.333333h597.333334v85.333334H213.333333z\" fill=\"#444D5A\" ></path><path d=\"M554.666667 213.333333v597.333334h-85.333334V213.333333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-dibuduiqi\" viewBox=\"0 0 1024 1024\"><path d=\"M725.333333 725.333333H298.666667v-42.666666h426.666666zM608 581.504l-90.496 90.496-90.538667-90.496 30.165334-30.165333 37.802666 37.717333V298.965333h42.666667v292.565334l40.234667-40.192 30.165333 30.165333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-xiangshang90\" viewBox=\"0 0 1024 1024\"><path d=\"M789.333333 495.786667l-213.333333-77.653334v-0.64l-1.621333 0.042667L426.666667 363.776v45.354667l106.666666 38.826666v152.405334l-106.666666 38.826666v45.354667l147.498666-53.674667 1.834667-0.042666v-0.64l213.333333-77.610667V495.786667z m-46.634666 28.416L576 584.874667v-121.386667l166.698667 60.714667zM384 336.170667L293.504 245.632 202.965333 336.213333l30.165334 30.165334 37.802666-37.76V789.333333h42.666667V326.101333l40.234667 40.234667L384 336.170667z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-wuxuanzhuang\" viewBox=\"0 0 1024 1024\"><path d=\"M549.546667 213.333333l77.653333 213.333334h0.64l-0.042667 1.621333 53.76 147.712h-45.354666l-38.826667-106.666667h-152.405333l-38.826667 106.666667H360.789333l53.674667-147.498667 0.042667-1.834666h0.64l77.610666-213.333334h56.789334z m-28.416 46.634667L460.458667 426.666667h121.386666l-60.714666-166.698667zM709.162667 618.666667l90.538666 90.496-90.538666 90.538666-30.165334-30.165333 37.76-37.802667H256v-42.666666h463.232l-40.234667-40.234667 30.165334-30.165333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-xianshiyincangwangge\" viewBox=\"0 0 1024 1024\"><path d=\"M256 256h554.666667v42.666667H256z\" fill=\"#444D5A\" ></path><path d=\"M298.666667 256v554.666667H256V256zM810.666667 256v554.666667h-42.666667V256zM469.333333 256v554.666667h-42.666666V256zM640 256v554.666667h-42.666667V256z\" fill=\"#444D5A\" ></path><path d=\"M256 426.666667h554.666667v42.666666H256zM256 597.333333h554.666667v42.666667H256zM256 768h554.666667v42.666667H256z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-dongjie\" viewBox=\"0 0 1024 1024\"><path d=\"M256.426667 256.426667h255.317333v553.130666H256.426667z\" fill=\"#B5B8BD\" ></path><path d=\"M809.557333 213.930667v595.626666H213.930667V213.930667h595.626666z m-42.538666 42.538666H256.426667v510.549334h510.549333V256.426667z\" fill=\"#444D5A\" ></path><path d=\"M490.453333 256.426667h42.538667v510.592h-42.538667z\" fill=\"#444D5A\" ></path><path d=\"M256.426667 532.992v-42.538667h510.592v42.538667z\" fill=\"#444D5A\" ></path><path d=\"M256.384 226.261333l264.192 264.192-30.122667 30.08-264.192-264.192 30.122667-30.08z m-30.122667 317.184l30.122667-30.122666 264.192 264.192-30.122667 30.08-264.192-264.149334z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-wenbenzuoduiqi\" viewBox=\"0 0 1024 1024\"><path d=\"M234.666667 298.666667h554.666666a21.333333 21.333333 0 1 1 0 42.666666h-554.666666a21.333333 21.333333 0 1 1 0-42.666666z m0 128h341.333333a21.333333 21.333333 0 0 1 0 42.666666h-341.333333a21.333333 21.333333 0 0 1 0-42.666666z m0 128h554.666666a21.333333 21.333333 0 1 1 0 42.666666h-554.666666a21.333333 21.333333 0 0 1 0-42.666666z m0 128h341.333333a21.333333 21.333333 0 0 1 0 42.666666h-341.333333a21.333333 21.333333 0 0 1 0-42.666666z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-houtui\" viewBox=\"0 0 1024 1024\"><path d=\"M737.664 419.328H426.666667v42.666667h311.296l-84.48 84.437333a21.333333 21.333333 0 0 0 30.208 30.165333l120.746666-120.704a21.290667 21.290667 0 0 0 0-30.165333l-120.746666-120.661333a21.333333 21.333333 0 0 0-30.165334 30.165333l84.138667 84.096zM213.333333 632.661333a213.333333 213.333333 0 0 1 213.333334-213.333333v42.666667a170.666667 170.666667 0 0 0-170.666667 170.666666H213.333333z m0 0h42.666667v64a21.333333 21.333333 0 0 1-42.666667 0v-64z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-shuipinghebing\" viewBox=\"0 0 1024 1024\"><path d=\"M810.666667 213.333333v597.333334H213.333333V213.333333h597.333334z m-42.666667 42.666667H256v512h512V256z\" fill=\"#444D5A\" ></path><path d=\"M810.666667 384v256H213.333333V384h597.333334z m-42.666667 42.666667H256v170.666666h512v-170.666666z\" fill=\"#444D5A\" ></path><path d=\"M581.162667 426.666667l90.538666 90.496-90.538666 90.538666-30.165334-30.165333 37.76-37.802667H341.333333v-42.666666h249.898667l-40.234667-40.234667 30.165334-30.165333z\" fill=\"#444D5A\" ></path></symbol><symbol id=\"luckysheet-iconfont-xiabiankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M768 810.666667H213.333333v-42.666667h554.666667z\" fill=\"#444D5A\" ></path><path d=\"M768 640h-42.666667v-42.666667h42.666667zM768 469.333333h-42.666667v-42.666666h42.666667zM768 725.333333h-42.666667v-42.666666h42.666667zM768 554.666667h-42.666667v-42.666667h42.666667zM768 384h-42.666667V341.333333h42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M512 640h-42.666667v-42.666667h42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M256 640H213.333333v-42.666667h42.666667zM256 469.333333H213.333333v-42.666666h42.666667zM256 725.333333H213.333333v-42.666666h42.666667zM256 554.666667H213.333333v-42.666667h42.666667zM256 384H213.333333V341.333333h42.666667zM256 298.666667H213.333333V256h42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M512 469.333333h-42.666667v-42.666666h42.666667zM512 725.333333h-42.666667v-42.666666h42.666667zM512 554.666667h-42.666667v-42.666667h42.666667zM512 384h-42.666667V341.333333h42.666667z\" fill=\"#B5B8BD\" ></path><path d=\"M768 298.666667h-42.666667V256h42.666667zM597.333333 298.666667h-42.666666V256h42.666666zM426.666667 298.666667H384V256h42.666667zM682.666667 298.666667h-42.666667V256h42.666667zM512 298.666667h-42.666667V256h42.666667zM341.333333 298.666667H298.666667V256h42.666666z\" fill=\"#B5B8BD\" ></path><path d=\"M597.333333 554.666667h-42.666666v-42.666667h42.666666zM426.666667 554.666667H384v-42.666667h42.666667zM682.666667 554.666667h-42.666667v-42.666667h42.666667zM512 554.666667h-42.666667v-42.666667h42.666667zM341.333333 554.666667H298.666667v-42.666667h42.666666z\" fill=\"#B5B8BD\" ></path></symbol><symbol id=\"luckysheet-iconfont-shezhi\" viewBox=\"0 0 1024 1024\"><path d=\"M794.496 425.685333a112.341333 112.341333 0 0 1-72.917333-53.034666 108.074667 108.074667 0 0 1-9.941334-88.234667 13.781333 13.781333 0 0 0-4.394666-14.592 299.392 299.392 0 0 0-95.616-55.424 14.421333 14.421333 0 0 0-15.146667 3.584 113.578667 113.578667 0 0 1-84.48 35.968 113.578667 113.578667 0 0 1-82.858667-35.157333 14.421333 14.421333 0 0 0-16.768-4.394667 298.154667 298.154667 0 0 0-95.573333 55.808 13.781333 13.781333 0 0 0-4.394667 14.634667c9.344 29.354667 5.717333 61.269333-9.984 87.808a112.341333 112.341333 0 0 1-72.96 53.034666 13.909333 13.909333 0 0 0-10.752 11.050667 281.856 281.856 0 0 0 0 109.610667c1.024 5.504 5.290667 9.813333 10.752 11.008a112.341333 112.341333 0 0 1 72.96 52.650666c15.786667 26.666667 19.413333 58.709333 9.941334 88.192a13.781333 13.781333 0 0 0 4.352 14.634667 299.392 299.392 0 0 0 95.658666 55.424h4.778667c3.882667 0 7.637333-1.578667 10.325333-4.394667a114.773333 114.773333 0 0 1 166.229334 0c4.096 5.546667 11.648 7.424 17.92 4.394667a298.666667 298.666667 0 0 0 97.194666-55.04c4.266667-3.541333 6.016-9.301333 4.394667-14.592a108.074667 108.074667 0 0 1 8.362667-88.618667 112.341333 112.341333 0 0 1 72.96-52.650666 13.909333 13.909333 0 0 0 10.709333-11.008 280.32 280.32 0 0 0 0-109.653334 14.336 14.336 0 0 0-10.752-11.008z m-26.709333 105.173334a136.106667 136.106667 0 0 0-79.658667 60.928 131.285333 131.285333 0 0 0-13.568 97.322666 259.114667 259.114667 0 0 1-69.717333 39.552A135.552 135.552 0 0 0 512 689.109333a137.941333 137.941333 0 0 0-92.842667 39.552 258.304 258.304 0 0 1-69.717333-39.552 129.664 129.664 0 0 0-14.762667-96.938666 136.106667 136.106667 0 0 0-78.506666-61.312 239.189333 239.189333 0 0 1 0-79.061334A136.106667 136.106667 0 0 0 335.872 390.826667c16.896-29.525333 21.76-64.426667 13.525333-97.365334a258.730667 258.730667 0 0 1 69.717334-39.552c25.386667 23.125333 58.453333 35.968 92.842666 36.010667a136.064 136.064 0 0 0 92.842667-36.010667c25.173333 9.472 48.682667 22.826667 69.717333 39.594667a131.285333 131.285333 0 0 0 14.336 96.896 136.106667 136.106667 0 0 0 79.701334 60.928c4.394667 26.197333 4.394667 52.906667 0 79.104l-0.810667 0.426667h0.042667z\" fill=\"#444D5A\" ></path><path d=\"M513.706667 370.346667a119.466667 119.466667 0 1 0 0 238.933333 119.466667 119.466667 0 0 0 0-238.933333z m0 199.125333a79.658667 79.658667 0 1 1 0-159.36 79.658667 79.658667 0 0 1 0 159.36z\" fill=\"#444D5A\" ></path></symbol></svg>',M=(M=document.getElementsByTagName(\"script\"))[M.length-1].getAttribute(\"data-injectcss\");if(M&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write(\"<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>\")}catch(h){console&&console.log(h)}}function e(){t||(t=!0,v())}l=function(){var h,l,a,v;(v=document.createElement(\"div\")).innerHTML=o,o=null,(a=v.getElementsByTagName(\"svg\")[0])&&(a.setAttribute(\"aria-hidden\",\"true\"),a.style.position=\"absolute\",a.style.width=0,a.style.height=0,a.style.overflow=\"hidden\",h=a,(l=document.body).firstChild?(v=h,(a=l.firstChild).parentNode.insertBefore(v,a)):l.appendChild(h))},document.addEventListener?~[\"complete\",\"loaded\",\"interactive\"].indexOf(document.readyState)?setTimeout(l,0):(a=function(){document.removeEventListener(\"DOMContentLoaded\",a,!1),l()},document.addEventListener(\"DOMContentLoaded\",a,!1)):document.attachEvent&&(v=l,i=h.document,t=!1,(z=function(){try{i.documentElement.doScroll(\"left\")}catch(h){return void setTimeout(z,50)}e()})(),i.onreadystatechange=function(){\"complete\"==i.readyState&&(i.onreadystatechange=null,e())})}(window);"
  },
  {
    "path": "src/assets/iconfont/iconfont.json",
    "content": "{\r\n  \"id\": \"1990368\",\r\n  \"name\": \"lucksheet\",\r\n  \"font_family\": \"iconfont\",\r\n  \"css_prefix_text\": \"luckysheet-iconfont-\",\r\n  \"description\": \"\",\r\n  \"glyphs\": [\r\n    {\r\n      \"icon_id\": \"17878780\",\r\n      \"name\": \"链接\",\r\n      \"font_class\": \"lianjie\",\r\n      \"unicode\": \"e7f8\",\r\n      \"unicode_decimal\": 59384\r\n    },\r\n    {\r\n      \"icon_id\": \"17612330\",\r\n      \"name\": \"打印区域\",\r\n      \"font_class\": \"dayinquyu\",\r\n      \"unicode\": \"e7f5\",\r\n      \"unicode_decimal\": 59381\r\n    },\r\n    {\r\n      \"icon_id\": \"17612331\",\r\n      \"name\": \"打印页面配置\",\r\n      \"font_class\": \"dayinyemianpeizhi\",\r\n      \"unicode\": \"e7f6\",\r\n      \"unicode_decimal\": 59382\r\n    },\r\n    {\r\n      \"icon_id\": \"17612332\",\r\n      \"name\": \"打印标题\",\r\n      \"font_class\": \"dayinbiaoti\",\r\n      \"unicode\": \"e7f7\",\r\n      \"unicode_decimal\": 59383\r\n    },\r\n    {\r\n      \"icon_id\": \"17600443\",\r\n      \"name\": \"分页预览\",\r\n      \"font_class\": \"fenyeyulan\",\r\n      \"unicode\": \"e7f2\",\r\n      \"unicode_decimal\": 59378\r\n    },\r\n    {\r\n      \"icon_id\": \"17600444\",\r\n      \"name\": \"普通\",\r\n      \"font_class\": \"putong\",\r\n      \"unicode\": \"e7f3\",\r\n      \"unicode_decimal\": 59379\r\n    },\r\n    {\r\n      \"icon_id\": \"17600445\",\r\n      \"name\": \"页面布局\",\r\n      \"font_class\": \"yemianbuju\",\r\n      \"unicode\": \"e7f4\",\r\n      \"unicode_decimal\": 59380\r\n    },\r\n    {\r\n      \"icon_id\": \"17597312\",\r\n      \"name\": \"表格锁定\",\r\n      \"font_class\": \"biaogesuoding\",\r\n      \"unicode\": \"e7ee\",\r\n      \"unicode_decimal\": 59374\r\n    },\r\n    {\r\n      \"icon_id\": \"17444514\",\r\n      \"name\": \"转到\",\r\n      \"font_class\": \"zhuandao1\",\r\n      \"unicode\": \"e7f1\",\r\n      \"unicode_decimal\": 59377\r\n    },\r\n    {\r\n      \"icon_id\": \"17444503\",\r\n      \"name\": \"右箭头\",\r\n      \"font_class\": \"youjiantou\",\r\n      \"unicode\": \"e7ed\",\r\n      \"unicode_decimal\": 59373\r\n    },\r\n    {\r\n      \"icon_id\": \"17444507\",\r\n      \"name\": \"菜单\",\r\n      \"font_class\": \"caidan2\",\r\n      \"unicode\": \"e7ef\",\r\n      \"unicode_decimal\": 59375\r\n    },\r\n    {\r\n      \"icon_id\": \"17444508\",\r\n      \"name\": \"替换\",\r\n      \"font_class\": \"tihuan\",\r\n      \"unicode\": \"e7f0\",\r\n      \"unicode_decimal\": 59376\r\n    },\r\n    {\r\n      \"icon_id\": \"17392794\",\r\n      \"name\": \"冻结\",\r\n      \"font_class\": \"dongjie1\",\r\n      \"unicode\": \"e7e1\",\r\n      \"unicode_decimal\": 59361\r\n    },\r\n    {\r\n      \"icon_id\": \"17392795\",\r\n      \"name\": \"剪\",\r\n      \"font_class\": \"jian1\",\r\n      \"unicode\": \"e7e2\",\r\n      \"unicode_decimal\": 59362\r\n    },\r\n    {\r\n      \"icon_id\": \"17392796\",\r\n      \"name\": \"加\",\r\n      \"font_class\": \"jia1\",\r\n      \"unicode\": \"e7e3\",\r\n      \"unicode_decimal\": 59363\r\n    },\r\n    {\r\n      \"icon_id\": \"17392797\",\r\n      \"name\": \"溢出\",\r\n      \"font_class\": \"yichu1\",\r\n      \"unicode\": \"e7e4\",\r\n      \"unicode_decimal\": 59364\r\n    },\r\n    {\r\n      \"icon_id\": \"17392798\",\r\n      \"name\": \"升序\",\r\n      \"font_class\": \"shengxu1\",\r\n      \"unicode\": \"e7e5\",\r\n      \"unicode_decimal\": 59365\r\n    },\r\n    {\r\n      \"icon_id\": \"17392799\",\r\n      \"name\": \"内框线\",\r\n      \"font_class\": \"neikuangxian\",\r\n      \"unicode\": \"e7e6\",\r\n      \"unicode_decimal\": 59366\r\n    },\r\n    {\r\n      \"icon_id\": \"17392800\",\r\n      \"name\": \"清除筛选\",\r\n      \"font_class\": \"qingchushaixuan\",\r\n      \"unicode\": \"e7e7\",\r\n      \"unicode_decimal\": 59367\r\n    },\r\n    {\r\n      \"icon_id\": \"17392801\",\r\n      \"name\": \"文本向上\",\r\n      \"font_class\": \"wenbenxiangshang\",\r\n      \"unicode\": \"e7e8\",\r\n      \"unicode_decimal\": 59368\r\n    },\r\n    {\r\n      \"icon_id\": \"17392802\",\r\n      \"name\": \"降序\",\r\n      \"font_class\": \"jiangxu1\",\r\n      \"unicode\": \"e7e9\",\r\n      \"unicode_decimal\": 59369\r\n    },\r\n    {\r\n      \"icon_id\": \"17392803\",\r\n      \"name\": \"内框横线\",\r\n      \"font_class\": \"neikuanghengxian\",\r\n      \"unicode\": \"e7ea\",\r\n      \"unicode_decimal\": 59370\r\n    },\r\n    {\r\n      \"icon_id\": \"17392804\",\r\n      \"name\": \"内框竖线\",\r\n      \"font_class\": \"neikuangshuxian\",\r\n      \"unicode\": \"e7eb\",\r\n      \"unicode_decimal\": 59371\r\n    },\r\n    {\r\n      \"icon_id\": \"17392805\",\r\n      \"name\": \"自定义排序\",\r\n      \"font_class\": \"zidingyipaixu\",\r\n      \"unicode\": \"e7ec\",\r\n      \"unicode_decimal\": 59372\r\n    },\r\n    {\r\n      \"icon_id\": \"16746498\",\r\n      \"name\": \"logo2\",\r\n      \"font_class\": \"logo2\",\r\n      \"unicode\": \"e7df\",\r\n      \"unicode_decimal\": 59359\r\n    },\r\n    {\r\n      \"icon_id\": \"16746532\",\r\n      \"name\": \"logo\",\r\n      \"font_class\": \"logo\",\r\n      \"unicode\": \"e7e0\",\r\n      \"unicode_decimal\": 59360\r\n    },\r\n    {\r\n      \"icon_id\": \"16730159\",\r\n      \"name\": \"文本倾斜\",\r\n      \"font_class\": \"wenbenqingxie1\",\r\n      \"unicode\": \"e7de\",\r\n      \"unicode_decimal\": 59358\r\n    },\r\n    {\r\n      \"icon_id\": \"16728412\",\r\n      \"name\": \"加粗\",\r\n      \"font_class\": \"jiacu\",\r\n      \"unicode\": \"e7d9\",\r\n      \"unicode_decimal\": 59353\r\n    },\r\n    {\r\n      \"icon_id\": \"16728080\",\r\n      \"name\": \"搜索\",\r\n      \"font_class\": \"sousuo\",\r\n      \"unicode\": \"e78a\",\r\n      \"unicode_decimal\": 59274\r\n    },\r\n    {\r\n      \"icon_id\": \"16728081\",\r\n      \"name\": \"关闭\",\r\n      \"font_class\": \"guanbi\",\r\n      \"unicode\": \"e78b\",\r\n      \"unicode_decimal\": 59275\r\n    },\r\n    {\r\n      \"icon_id\": \"16728082\",\r\n      \"name\": \"下一个\",\r\n      \"font_class\": \"xiayige\",\r\n      \"unicode\": \"e78c\",\r\n      \"unicode_decimal\": 59276\r\n    },\r\n    {\r\n      \"icon_id\": \"16728083\",\r\n      \"name\": \"下拉\",\r\n      \"font_class\": \"xiala\",\r\n      \"unicode\": \"e78d\",\r\n      \"unicode_decimal\": 59277\r\n    },\r\n    {\r\n      \"icon_id\": \"16728084\",\r\n      \"name\": \"文本颜色\",\r\n      \"font_class\": \"wenbenyanse\",\r\n      \"unicode\": \"e78e\",\r\n      \"unicode_decimal\": 59278\r\n    },\r\n    {\r\n      \"icon_id\": \"16728085\",\r\n      \"name\": \"上一个\",\r\n      \"font_class\": \"shangyige\",\r\n      \"unicode\": \"e78f\",\r\n      \"unicode_decimal\": 59279\r\n    },\r\n    {\r\n      \"icon_id\": \"16728086\",\r\n      \"name\": \"数据透视\",\r\n      \"font_class\": \"shujutoushi\",\r\n      \"unicode\": \"e790\",\r\n      \"unicode_decimal\": 59280\r\n    },\r\n    {\r\n      \"icon_id\": \"16728087\",\r\n      \"name\": \"填充\",\r\n      \"font_class\": \"tianchong\",\r\n      \"unicode\": \"e791\",\r\n      \"unicode_decimal\": 59281\r\n    },\r\n    {\r\n      \"icon_id\": \"16728088\",\r\n      \"name\": \"增加小数位\",\r\n      \"font_class\": \"zengjiaxiaoshuwei\",\r\n      \"unicode\": \"e792\",\r\n      \"unicode_decimal\": 59282\r\n    },\r\n    {\r\n      \"icon_id\": \"16728089\",\r\n      \"name\": \"编辑2\",\r\n      \"font_class\": \"bianji2\",\r\n      \"unicode\": \"e793\",\r\n      \"unicode_decimal\": 59283\r\n    },\r\n    {\r\n      \"icon_id\": \"16728090\",\r\n      \"name\": \"截屏\",\r\n      \"font_class\": \"jieping\",\r\n      \"unicode\": \"e794\",\r\n      \"unicode_decimal\": 59284\r\n    },\r\n    {\r\n      \"icon_id\": \"16728092\",\r\n      \"name\": \"减小小数位\",\r\n      \"font_class\": \"jianxiaoxiaoshuwei\",\r\n      \"unicode\": \"e796\",\r\n      \"unicode_decimal\": 59286\r\n    },\r\n    {\r\n      \"icon_id\": \"16728093\",\r\n      \"name\": \"菜单\",\r\n      \"font_class\": \"caidan\",\r\n      \"unicode\": \"e797\",\r\n      \"unicode_decimal\": 59287\r\n    },\r\n    {\r\n      \"icon_id\": \"16728094\",\r\n      \"name\": \"数据库\",\r\n      \"font_class\": \"shujuku\",\r\n      \"unicode\": \"e798\",\r\n      \"unicode_decimal\": 59288\r\n    },\r\n    {\r\n      \"icon_id\": \"16728095\",\r\n      \"name\": \"无边框\",\r\n      \"font_class\": \"wubiankuang\",\r\n      \"unicode\": \"e799\",\r\n      \"unicode_decimal\": 59289\r\n    },\r\n    {\r\n      \"icon_id\": \"16728096\",\r\n      \"name\": \"编辑\",\r\n      \"font_class\": \"bianji\",\r\n      \"unicode\": \"e79a\",\r\n      \"unicode_decimal\": 59290\r\n    },\r\n    {\r\n      \"icon_id\": \"16728097\",\r\n      \"name\": \"清除样式\",\r\n      \"font_class\": \"qingchuyangshi\",\r\n      \"unicode\": \"e79b\",\r\n      \"unicode_decimal\": 59291\r\n    },\r\n    {\r\n      \"icon_id\": \"16728099\",\r\n      \"name\": \"删除\",\r\n      \"font_class\": \"shanchu\",\r\n      \"unicode\": \"e79c\",\r\n      \"unicode_decimal\": 59292\r\n    },\r\n    {\r\n      \"icon_id\": \"16728100\",\r\n      \"name\": \"文本居中对齐\",\r\n      \"font_class\": \"wenbenjuzhongduiqi\",\r\n      \"unicode\": \"e79d\",\r\n      \"unicode_decimal\": 59293\r\n    },\r\n    {\r\n      \"icon_id\": \"16728101\",\r\n      \"name\": \"打印\",\r\n      \"font_class\": \"dayin\",\r\n      \"unicode\": \"e79e\",\r\n      \"unicode_decimal\": 59294\r\n    },\r\n    {\r\n      \"icon_id\": \"16728102\",\r\n      \"name\": \"文本分割\",\r\n      \"font_class\": \"wenbenfenge\",\r\n      \"unicode\": \"e79f\",\r\n      \"unicode_decimal\": 59295\r\n    },\r\n    {\r\n      \"icon_id\": \"16728103\",\r\n      \"name\": \"函数‘\",\r\n      \"font_class\": \"hanshu\",\r\n      \"unicode\": \"e7a0\",\r\n      \"unicode_decimal\": 59296\r\n    },\r\n    {\r\n      \"icon_id\": \"16728104\",\r\n      \"name\": \"降序\",\r\n      \"font_class\": \"jiangxu\",\r\n      \"unicode\": \"e7a1\",\r\n      \"unicode_decimal\": 59297\r\n    },\r\n    {\r\n      \"icon_id\": \"16728105\",\r\n      \"name\": \"顶部对齐\",\r\n      \"font_class\": \"dingbuduiqi\",\r\n      \"unicode\": \"e7a2\",\r\n      \"unicode_decimal\": 59298\r\n    },\r\n    {\r\n      \"icon_id\": \"16728106\",\r\n      \"name\": \"图片\",\r\n      \"font_class\": \"tupian\",\r\n      \"unicode\": \"e7a3\",\r\n      \"unicode_decimal\": 59299\r\n    },\r\n    {\r\n      \"icon_id\": \"16728107\",\r\n      \"name\": \"向下90\",\r\n      \"font_class\": \"xiangxia90\",\r\n      \"unicode\": \"e7a4\",\r\n      \"unicode_decimal\": 59300\r\n    },\r\n    {\r\n      \"icon_id\": \"16728108\",\r\n      \"name\": \"竖排文字\",\r\n      \"font_class\": \"shupaiwenzi\",\r\n      \"unicode\": \"e7a5\",\r\n      \"unicode_decimal\": 59301\r\n    },\r\n    {\r\n      \"icon_id\": \"16728109\",\r\n      \"name\": \"全加边框\",\r\n      \"font_class\": \"quanjiabiankuang\",\r\n      \"unicode\": \"e7a6\",\r\n      \"unicode_decimal\": 59302\r\n    },\r\n    {\r\n      \"icon_id\": \"16728110\",\r\n      \"name\": \"升序\",\r\n      \"font_class\": \"shengxu\",\r\n      \"unicode\": \"e7a7\",\r\n      \"unicode_decimal\": 59303\r\n    },\r\n    {\r\n      \"icon_id\": \"16728111\",\r\n      \"name\": \"裁剪\",\r\n      \"font_class\": \"caijian\",\r\n      \"unicode\": \"e7a8\",\r\n      \"unicode_decimal\": 59304\r\n    },\r\n    {\r\n      \"icon_id\": \"16728112\",\r\n      \"name\": \"金额\",\r\n      \"font_class\": \"jine\",\r\n      \"unicode\": \"e7a9\",\r\n      \"unicode_decimal\": 59305\r\n    },\r\n    {\r\n      \"icon_id\": \"16728113\",\r\n      \"name\": \"菜单1\",\r\n      \"font_class\": \"caidan1\",\r\n      \"unicode\": \"e7aa\",\r\n      \"unicode_decimal\": 59306\r\n    },\r\n    {\r\n      \"icon_id\": \"16728114\",\r\n      \"name\": \"取消合并\",\r\n      \"font_class\": \"quxiaohebing\",\r\n      \"unicode\": \"e7ab\",\r\n      \"unicode_decimal\": 59307\r\n    },\r\n    {\r\n      \"icon_id\": \"16728115\",\r\n      \"name\": \"文本下划线\",\r\n      \"font_class\": \"wenbenxiahuaxian\",\r\n      \"unicode\": \"e7ac\",\r\n      \"unicode_decimal\": 59308\r\n    },\r\n    {\r\n      \"icon_id\": \"16728116\",\r\n      \"name\": \"上边框\",\r\n      \"font_class\": \"shangbiankuang\",\r\n      \"unicode\": \"e7ad\",\r\n      \"unicode_decimal\": 59309\r\n    },\r\n    {\r\n      \"icon_id\": \"16728117\",\r\n      \"name\": \"定位\",\r\n      \"font_class\": \"dingwei\",\r\n      \"unicode\": \"e7ae\",\r\n      \"unicode_decimal\": 59310\r\n    },\r\n    {\r\n      \"icon_id\": \"16728118\",\r\n      \"name\": \"四周加边框\",\r\n      \"font_class\": \"sizhoujiabiankuang\",\r\n      \"unicode\": \"e7af\",\r\n      \"unicode_decimal\": 59311\r\n    },\r\n    {\r\n      \"icon_id\": \"16728119\",\r\n      \"name\": \"侧边栏收起\",\r\n      \"font_class\": \"cebianlanshouqi\",\r\n      \"unicode\": \"e7b0\",\r\n      \"unicode_decimal\": 59312\r\n    },\r\n    {\r\n      \"icon_id\": \"16728120\",\r\n      \"name\": \"合并\",\r\n      \"font_class\": \"hebing\",\r\n      \"unicode\": \"e7b1\",\r\n      \"unicode_decimal\": 59313\r\n    },\r\n    {\r\n      \"icon_id\": \"16728121\",\r\n      \"name\": \"向上倾斜\",\r\n      \"font_class\": \"xiangshangqingxie\",\r\n      \"unicode\": \"e7b2\",\r\n      \"unicode_decimal\": 59314\r\n    },\r\n    {\r\n      \"icon_id\": \"16728122\",\r\n      \"name\": \"水平对齐\",\r\n      \"font_class\": \"shuipingduiqi\",\r\n      \"unicode\": \"e7b3\",\r\n      \"unicode_decimal\": 59315\r\n    },\r\n    {\r\n      \"icon_id\": \"16728123\",\r\n      \"name\": \"文本删除线\",\r\n      \"font_class\": \"wenbenshanchuxian\",\r\n      \"unicode\": \"e7b4\",\r\n      \"unicode_decimal\": 59316\r\n    },\r\n    {\r\n      \"icon_id\": \"16728124\",\r\n      \"name\": \"文本右对齐\",\r\n      \"font_class\": \"wenbenyouduiqi\",\r\n      \"unicode\": \"e7b5\",\r\n      \"unicode_decimal\": 59317\r\n    },\r\n    {\r\n      \"icon_id\": \"16728125\",\r\n      \"name\": \"前进\",\r\n      \"font_class\": \"qianjin\",\r\n      \"unicode\": \"e7b6\",\r\n      \"unicode_decimal\": 59318\r\n    },\r\n    {\r\n      \"icon_id\": \"16728126\",\r\n      \"name\": \"图表\",\r\n      \"font_class\": \"tubiao\",\r\n      \"unicode\": \"e7b7\",\r\n      \"unicode_decimal\": 59319\r\n    },\r\n    {\r\n      \"icon_id\": \"16728127\",\r\n      \"name\": \"右边框\",\r\n      \"font_class\": \"youbiankuang\",\r\n      \"unicode\": \"e7b8\",\r\n      \"unicode_decimal\": 59320\r\n    },\r\n    {\r\n      \"icon_id\": \"16728128\",\r\n      \"name\": \"百分号\",\r\n      \"font_class\": \"baifenhao\",\r\n      \"unicode\": \"e7b9\",\r\n      \"unicode_decimal\": 59321\r\n    },\r\n    {\r\n      \"icon_id\": \"16728129\",\r\n      \"name\": \"格式刷\",\r\n      \"font_class\": \"geshishua\",\r\n      \"unicode\": \"e7ba\",\r\n      \"unicode_decimal\": 59322\r\n    },\r\n    {\r\n      \"icon_id\": \"16728130\",\r\n      \"name\": \"保存\",\r\n      \"font_class\": \"baocun\",\r\n      \"unicode\": \"e7bb\",\r\n      \"unicode_decimal\": 59323\r\n    },\r\n    {\r\n      \"icon_id\": \"16728131\",\r\n      \"name\": \"数据验证\",\r\n      \"font_class\": \"shujuyanzheng\",\r\n      \"unicode\": \"e7bc\",\r\n      \"unicode_decimal\": 59324\r\n    },\r\n    {\r\n      \"icon_id\": \"16728132\",\r\n      \"name\": \"截断\",\r\n      \"font_class\": \"jieduan\",\r\n      \"unicode\": \"e7bd\",\r\n      \"unicode_decimal\": 59325\r\n    },\r\n    {\r\n      \"icon_id\": \"16728133\",\r\n      \"name\": \"格式条件\",\r\n      \"font_class\": \"geshitiaojian\",\r\n      \"unicode\": \"e7be\",\r\n      \"unicode_decimal\": 59326\r\n    },\r\n    {\r\n      \"icon_id\": \"16728134\",\r\n      \"name\": \"自动换行\",\r\n      \"font_class\": \"zidonghuanhang\",\r\n      \"unicode\": \"e7bf\",\r\n      \"unicode_decimal\": 59327\r\n    },\r\n    {\r\n      \"icon_id\": \"16728135\",\r\n      \"name\": \"侧边栏展开\",\r\n      \"font_class\": \"cebianlanzhankai\",\r\n      \"unicode\": \"e7c0\",\r\n      \"unicode_decimal\": 59328\r\n    },\r\n    {\r\n      \"icon_id\": \"16728136\",\r\n      \"name\": \"筛选2\",\r\n      \"font_class\": \"shaixuan2\",\r\n      \"unicode\": \"e7c1\",\r\n      \"unicode_decimal\": 59329\r\n    },\r\n    {\r\n      \"icon_id\": \"16728137\",\r\n      \"name\": \"向下倾斜\",\r\n      \"font_class\": \"xiangxiaqingxie\",\r\n      \"unicode\": \"e7c2\",\r\n      \"unicode_decimal\": 59330\r\n    },\r\n    {\r\n      \"icon_id\": \"16728138\",\r\n      \"name\": \"溢出\",\r\n      \"font_class\": \"yichu\",\r\n      \"unicode\": \"e7c3\",\r\n      \"unicode_decimal\": 59331\r\n    },\r\n    {\r\n      \"icon_id\": \"16728139\",\r\n      \"name\": \"垂直合并\",\r\n      \"font_class\": \"chuizhihebing\",\r\n      \"unicode\": \"e7c4\",\r\n      \"unicode_decimal\": 59332\r\n    },\r\n    {\r\n      \"icon_id\": \"16728140\",\r\n      \"name\": \"文本分散对齐\",\r\n      \"font_class\": \"wenbenfensanduiqi\",\r\n      \"unicode\": \"e7c5\",\r\n      \"unicode_decimal\": 59333\r\n    },\r\n    {\r\n      \"icon_id\": \"16728141\",\r\n      \"name\": \"左边框\",\r\n      \"font_class\": \"zuobiankuang\",\r\n      \"unicode\": \"e7c6\",\r\n      \"unicode_decimal\": 59334\r\n    },\r\n    {\r\n      \"icon_id\": \"16728142\",\r\n      \"name\": \"分页查看\",\r\n      \"font_class\": \"fenyechakan\",\r\n      \"unicode\": \"e7c7\",\r\n      \"unicode_decimal\": 59335\r\n    },\r\n    {\r\n      \"icon_id\": \"16728143\",\r\n      \"name\": \"运行\",\r\n      \"font_class\": \"yunhang\",\r\n      \"unicode\": \"e7c8\",\r\n      \"unicode_decimal\": 59336\r\n    },\r\n    {\r\n      \"icon_id\": \"16728144\",\r\n      \"name\": \"列\",\r\n      \"font_class\": \"lie\",\r\n      \"unicode\": \"e7c9\",\r\n      \"unicode_decimal\": 59337\r\n    },\r\n    {\r\n      \"icon_id\": \"16728145\",\r\n      \"name\": \"全屏\",\r\n      \"font_class\": \"quanping\",\r\n      \"unicode\": \"e7ca\",\r\n      \"unicode_decimal\": 59338\r\n    },\r\n    {\r\n      \"icon_id\": \"16728146\",\r\n      \"name\": \"筛选\",\r\n      \"font_class\": \"shaixuan\",\r\n      \"unicode\": \"e7cb\",\r\n      \"unicode_decimal\": 59339\r\n    },\r\n    {\r\n      \"icon_id\": \"16728147\",\r\n      \"name\": \"更新\",\r\n      \"font_class\": \"gengxin\",\r\n      \"unicode\": \"e7cc\",\r\n      \"unicode_decimal\": 59340\r\n    },\r\n    {\r\n      \"icon_id\": \"16728148\",\r\n      \"name\": \"清除\",\r\n      \"font_class\": \"qingchu\",\r\n      \"unicode\": \"e7cd\",\r\n      \"unicode_decimal\": 59341\r\n    },\r\n    {\r\n      \"icon_id\": \"16728149\",\r\n      \"name\": \"行\",\r\n      \"font_class\": \"hang\",\r\n      \"unicode\": \"e7ce\",\r\n      \"unicode_decimal\": 59342\r\n    },\r\n    {\r\n      \"icon_id\": \"16728150\",\r\n      \"name\": \"注释\",\r\n      \"font_class\": \"zhushi\",\r\n      \"unicode\": \"e7cf\",\r\n      \"unicode_decimal\": 59343\r\n    },\r\n    {\r\n      \"icon_id\": \"16728151\",\r\n      \"name\": \"剪\",\r\n      \"font_class\": \"jian\",\r\n      \"unicode\": \"e7d0\",\r\n      \"unicode_decimal\": 59344\r\n    },\r\n    {\r\n      \"icon_id\": \"16728152\",\r\n      \"name\": \"计算\",\r\n      \"font_class\": \"jisuan\",\r\n      \"unicode\": \"e7d1\",\r\n      \"unicode_decimal\": 59345\r\n    },\r\n    {\r\n      \"icon_id\": \"16728153\",\r\n      \"name\": \"加\",\r\n      \"font_class\": \"jia\",\r\n      \"unicode\": \"e7d2\",\r\n      \"unicode_decimal\": 59346\r\n    },\r\n    {\r\n      \"icon_id\": \"16728154\",\r\n      \"name\": \"底部对齐\",\r\n      \"font_class\": \"dibuduiqi\",\r\n      \"unicode\": \"e7d3\",\r\n      \"unicode_decimal\": 59347\r\n    },\r\n    {\r\n      \"icon_id\": \"16728155\",\r\n      \"name\": \"向上90\",\r\n      \"font_class\": \"xiangshang90\",\r\n      \"unicode\": \"e7d4\",\r\n      \"unicode_decimal\": 59348\r\n    },\r\n    {\r\n      \"icon_id\": \"16728156\",\r\n      \"name\": \"无选装\",\r\n      \"font_class\": \"wuxuanzhuang\",\r\n      \"unicode\": \"e7d5\",\r\n      \"unicode_decimal\": 59349\r\n    },\r\n    {\r\n      \"icon_id\": \"16728157\",\r\n      \"name\": \"显示隐藏网格\",\r\n      \"font_class\": \"xianshiyincangwangge\",\r\n      \"unicode\": \"e7d6\",\r\n      \"unicode_decimal\": 59350\r\n    },\r\n    {\r\n      \"icon_id\": \"16728158\",\r\n      \"name\": \"冻结\",\r\n      \"font_class\": \"dongjie\",\r\n      \"unicode\": \"e7d7\",\r\n      \"unicode_decimal\": 59351\r\n    },\r\n    {\r\n      \"icon_id\": \"16728159\",\r\n      \"name\": \"文本左对齐\",\r\n      \"font_class\": \"wenbenzuoduiqi\",\r\n      \"unicode\": \"e7d8\",\r\n      \"unicode_decimal\": 59352\r\n    },\r\n    {\r\n      \"icon_id\": \"16728161\",\r\n      \"name\": \"后退\",\r\n      \"font_class\": \"houtui\",\r\n      \"unicode\": \"e7da\",\r\n      \"unicode_decimal\": 59354\r\n    },\r\n    {\r\n      \"icon_id\": \"16728162\",\r\n      \"name\": \"水平合并\",\r\n      \"font_class\": \"shuipinghebing\",\r\n      \"unicode\": \"e7db\",\r\n      \"unicode_decimal\": 59355\r\n    },\r\n    {\r\n      \"icon_id\": \"16728163\",\r\n      \"name\": \"下边框\",\r\n      \"font_class\": \"xiabiankuang\",\r\n      \"unicode\": \"e7dc\",\r\n      \"unicode_decimal\": 59356\r\n    },\r\n    {\r\n      \"icon_id\": \"16728164\",\r\n      \"name\": \"设置\",\r\n      \"font_class\": \"shezhi\",\r\n      \"unicode\": \"e7dd\",\r\n      \"unicode_decimal\": 59357\r\n    }\r\n  ]\r\n}\r\n"
  },
  {
    "path": "src/config.js",
    "content": "/**\r\n * The default luckysheet config object.\r\n */\r\nexport default {\r\n    container: \"luckysheet\", //容器的ID\r\n    loading:{}, //自定义loading\r\n    column: 60, //空表格默认的列数量\r\n    row: 84, //空表格默认的行数据量\r\n    allowCopy: true, //是否允许拷贝\r\n    showtoolbar: true, //是否第二列显示工具栏\r\n    showinfobar: true, //是否显示顶部名称栏\r\n    showsheetbar: true, //是否显示底部表格名称区域\r\n    showstatisticBar: true, //是否显示底部计数栏\r\n    pointEdit: false, //是否是编辑器插入表格模式\r\n    pointEditUpdate: null, //编辑器表格更新函数\r\n    pointEditZoom: 1, //编辑器表格编辑时缩放比例\r\n    // menu: \"undo|redo|freezenrow|freezencolumn|download|share|chart|pivot\",\r\n    data: [{ \"name\": \"Sheet1\", color: \"\", \"status\": \"1\", \"order\": \"0\", \"data\": [], \"config\": {}, \"index\":0 }, { \"name\": \"Sheet2\", color: \"\", \"status\": \"0\", \"order\": \"1\", \"data\": [], \"config\": {}, \"index\":1  }, { \"name\": \"Sheet3\", color: \"\", \"status\": \"0\", \"order\": \"2\", \"data\": [], \"config\": {}, \"index\":2  }], //客户端sheet数据[sheet1, sheet2, sheet3]\r\n    title: \"Luckysheet Demo\", //表格的名称\r\n    userInfo:false,// 右上角的用户信息展示样式，支持 1. boolean类型：false:不展示，true:展示默认 '<i style=\"font-size:16px;color:#ff6a00;\" class=\"fa fa-taxi\" aria-hidden=\"true\"></i> rabbit' ，2. HTML模板字符串或者普通字符串，如：'<i style=\"font-size:16px;color:#ff6a00;\" class=\"fa fa-taxi\" aria-hidden=\"true\"></i> Lucky'或者'用户名'， 3. 对象格式，设置 userImage：用户头像地址 和 userName：用户名 4. 不设置或者设置undefined同设置false\r\n    userMenuItem: [{url:\"www.baidu.com\", \"icon\":'<i class=\"fa fa-folder\" aria-hidden=\"true\"></i>', \"name\":\"我的表格\"}, {url:\"www.baidu.com\", \"icon\":'<i class=\"fa fa-sign-out\" aria-hidden=\"true\"></i>', \"name\":\"退出登陆\"}], //点击右上角的用户信息弹出的菜单\r\n    myFolderUrl: \"www.baidu.com\", //左上角<返回按钮的链接\r\n    config: {}, //表格行高、列宽、合并单元格、公式等设置\r\n    fullscreenmode: true, //是否全屏模式，非全屏模式下，标记框不会强制选中。\r\n    devicePixelRatio: window.devicePixelRatio, //设备比例，比例越大表格分标率越高\r\n    allowEdit: true, //是否允许前台编辑\r\n    loadUrl: \"\", // 配置loadUrl的地址，luckysheet会通过ajax请求表格数据，默认载入status为1的sheet数据中的所有data，其余的sheet载入除data字段外的所有字段\r\n    loadSheetUrl: \"\", //配置loadSheetUrl的地址，参数为gridKey（表格主键） 和 index（sheet主键合集，格式为[1,2,3]），返回的数据为sheet的data字段数据集合\r\n    gridKey: \"\", // 表格唯一标识符\r\n    updateUrl: \"\", //表格数据的更新地址\r\n    updateImageUrl: \"\", //缩略图的更新地址\r\n    allowUpdate: false, //是否允许编辑后的后台更新\r\n    functionButton: \"\", //右上角功能按钮，例如'<button id=\"\" class=\"btn btn-primary\" style=\"padding:3px 6px;font-size: 12px;margin-right: 10px;\">下载</button>    <button id=\"\" class=\"btn btn-primary btn-danger\" style=\"    padding:3px 6px;    font-size: 12px;    margin-right: 10px;\">分享</button>    <button id=\"luckysheet-share-btn-title\" class=\"btn btn-primary btn-danger\" style=\"    padding:3px 6px;    font-size: 12px;    margin-right: 10px;\">秀数据</button>'\r\n    showConfigWindowResize: true, //图表和数据透视表的配置会在右侧弹出，设置弹出后表格是否会自动缩进\r\n    enableAddRow: true,//允许添加行\r\n    enableAddBackTop: true,//允许回到顶部\r\n    // enablePage: false,//允许加载下一页\r\n    autoFormatw: false,  //自动格式化超过4位数的数字为 亿万格式 例：true or \"true\" or \"TRUE\"\r\n    accuracy: undefined,  //设置传输来的数值的精确位数，小数点后n位 传参数为数字或数字字符串，例： \"0\" 或 0\r\n    pageInfo:{\r\n        'queryExps':'',\r\n        'reportId':'',\r\n        'fields':'',\r\n        'mobile':'',\r\n        'frezon':'',\r\n        'currentPage':'',\r\n        \"totalPage\":10,\r\n        \"pageUrl\":\"\",\r\n    },\r\n    editMode: false, //是否为编辑模式\r\n    beforeCreateDom: null,//表格创建之前的方法\r\n    fireMousedown: null, //单元格数据下钻\r\n    lang: 'en', //language\r\n    plugins: [], //plugins, e.g. ['chart']\r\n    forceCalculation:false,//强制刷新公式，公式较多会有性能问题，慎用\r\n    rowHeaderWidth: 46,\r\n    columnHeaderHeight: 20,\r\n    defaultColWidth:73,\r\n    defaultRowHeight:19,\r\n    defaultFontSize:10,\r\n    limitSheetNameLength:true,    //是否限制工作表名的长度\r\n    defaultSheetNameMaxLength:31,  //默认工作表名称的最大长度\r\n    sheetFormulaBar:true, //是否显示公式栏\r\n    showtoolbarConfig:{}, //自定义工具栏\r\n    showsheetbarConfig:{}, //自定义底部sheet页\r\n    showstatisticBarConfig:{}, //自定义计数栏\r\n    cellRightClickConfig:{}, //自定义单元格右键菜单\r\n    sheetRightClickConfig:{}, //自定义底部sheet页右击菜单\r\n    imageUpdateMethodConfig:{}, //自定义图片同步方式\r\n}\r\n"
  },
  {
    "path": "src/controllers/alternateformat.js",
    "content": "\r\nimport { getSheetIndex, getRangetxt } from '../methods/get';\r\nimport { replaceHtml } from '../utils/util';\r\nimport formula from '../global/formula';\r\nimport { isEditMode } from '../global/validate';\r\nimport tooltip from '../global/tooltip';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport { luckysheetAlternateformatHtml, modelHTML } from './constant';\r\nimport luckysheetsizeauto from './resize';\r\nimport server from './server';\r\nimport { selectHightlightShow } from './select';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n//交替颜色\r\nconst alternateformat = {\r\n    rangefocus: false,\r\n    modelfocusIndex: null,\r\n    FixedModelColor: [\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#bfbdbe\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f8f3f7\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#dde2de\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#4bd4e7\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#eaf7ff\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#aae9f8\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#5ed593\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#e5fbee\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#a5efcc\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#f6cb4b\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#fff9e7\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#ffebac\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#f96420\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#ffe5d9\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#ffcfba\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#5599fc\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#ecf2fe\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#afcbfa\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#22a69b\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#dff2f8\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#8dd4d0\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#7a939a\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f0eff7\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#bdcad0\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#d7a270\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#fdf3f1\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#ead2b6\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#89c54b\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f1f7e9\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#c5e3a7\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#8f88f0\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f0e5ff\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#c6c4f6\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#fd1664\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#feddee\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#f98ab5\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#da96d3\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#fce8fb\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#f2caee\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#b49191\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f5ebe8\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#d8c3c3\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#91b493\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f0fbf0\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#b4cfb6\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#b4a891\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f8f6f1\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#d3cab8\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#91abb4\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#eff7fa\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#b7cbd3\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#b7ba82\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#fafbeb\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#dadcb4\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#df3e3e\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#fde9e9\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#f89292\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#f2711c\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#fef0d7\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#fbb335\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#b5cc18\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f9fbd4\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#e2ed2a\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#00b5ad\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#ccfaf9\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#00e4df\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#2185d0\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#d8f3fc\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#3cc4f0\" }\r\n        },\r\n        {\r\n            \"head\": { \"fc\": \"#000\", \"bc\": \"#a5673f\" },\r\n            \"one\":  { \"fc\": \"#000\", \"bc\": \"#ffffff\" },\r\n            \"two\":  { \"fc\": \"#000\", \"bc\": \"#f6ede5\" },\r\n            \"foot\": { \"fc\": \"#000\", \"bc\": \"#d3a47c\" }\r\n        }            \r\n    ],\r\n    getModelBox: function(hasRowHeader, hasRowFooter){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-modelList\").empty();\r\n        $(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-modelCustom\").empty();\r\n\r\n        //格式样式 模板\r\n        let modelListHtml = '';\r\n\r\n        for(let i = 0; i < _this.FixedModelColor.length; i++){\r\n            let obj = _this.FixedModelColor[i];\r\n\r\n            let color1, color2, color3, color4;\r\n\r\n            if(hasRowHeader && hasRowFooter){\r\n                color1 = obj[\"head\"];\r\n                color2 = obj[\"one\"];\r\n                color3 = obj[\"two\"];\r\n                color4 = obj[\"foot\"];\r\n            }\r\n            else if(hasRowHeader){\r\n                color1 = obj[\"head\"];\r\n                color2 = obj[\"one\"];\r\n                color3 = obj[\"two\"];\r\n                color4 = obj[\"one\"];\r\n            }\r\n            else if(hasRowFooter){\r\n                color1 = obj[\"one\"];\r\n                color2 = obj[\"two\"];\r\n                color3 = obj[\"one\"];\r\n                color4 = obj[\"foot\"];\r\n            }\r\n            else{\r\n                color1 = obj[\"one\"];\r\n                color2 = obj[\"two\"];\r\n                color3 = obj[\"one\"];\r\n                color4 = obj[\"two\"];\r\n            }\r\n\r\n            modelListHtml += '<div class=\"modelbox\">'+\r\n                                '<div class=\"box\">'+\r\n                                    '<span style=\"color:'+ color1[\"fc\"] +';background-color:'+ color1[\"bc\"] +'\"> — </span>'+\r\n                                    '<span style=\"color:'+ color2[\"fc\"] +';background-color:'+ color2[\"bc\"] +'\"> — </span>'+\r\n                                    '<span style=\"color:'+ color3[\"fc\"] +';background-color:'+ color3[\"bc\"] +'\"> — </span>'+\r\n                                    '<span style=\"color:'+ color4[\"fc\"] +';background-color:'+ color4[\"bc\"] +'\"> — </span>'+\r\n                                '</div>'+\r\n                             '</div>';\r\n        }\r\n\r\n        $(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-modelList\").append(modelListHtml);\r\n\r\n        //自定义 模板\r\n        let modelCustom = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_alternateformat_save_modelCustom\"];\r\n        if(modelCustom != null && modelCustom.length > 0){\r\n            let modelCustomHtml = '';\r\n\r\n            for(let i = 0; i < modelCustom.length; i++){\r\n                let obj = modelCustom[i];\r\n\r\n                let color1, color2, color3, color4;\r\n\r\n                if(hasRowHeader && hasRowFooter){\r\n                    color1 = obj[\"head\"];\r\n                    color2 = obj[\"one\"];\r\n                    color3 = obj[\"two\"];\r\n                    color4 = obj[\"foot\"];\r\n                }\r\n                else if(hasRowHeader){\r\n                    color1 = obj[\"head\"];\r\n                    color2 = obj[\"one\"];\r\n                    color3 = obj[\"two\"];\r\n                    color4 = obj[\"one\"];\r\n                }\r\n                else if(hasRowFooter){\r\n                    color1 = obj[\"one\"];\r\n                    color2 = obj[\"two\"];\r\n                    color3 = obj[\"one\"];\r\n                    color4 = obj[\"foot\"];\r\n                }\r\n                else{\r\n                    color1 = obj[\"one\"];\r\n                    color2 = obj[\"two\"];\r\n                    color3 = obj[\"one\"];\r\n                    color4 = obj[\"two\"];\r\n                }\r\n\r\n                modelCustomHtml +=  '<div class=\"modelbox\">'+\r\n                                        '<div class=\"box\">'+\r\n                                            '<span style=\"color:'+ color1[\"fc\"] +';background-color:'+ color1[\"bc\"] +'\"> — </span>'+\r\n                                            '<span style=\"color:'+ color2[\"fc\"] +';background-color:'+ color2[\"bc\"] +'\"> — </span>'+\r\n                                            '<span style=\"color:'+ color3[\"fc\"] +';background-color:'+ color3[\"bc\"] +'\"> — </span>'+\r\n                                            '<span style=\"color:'+ color4[\"fc\"] +';background-color:'+ color4[\"bc\"] +'\"> — </span>'+\r\n                                        '</div>'+\r\n                                    '</div>';\r\n            }\r\n\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-modelCustom\").append(modelCustomHtml);\r\n        }\r\n    },\r\n    init: function(){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-modal-dialog-slider-alternateformat\").remove();\r\n        $(\"body\").append(luckysheetAlternateformatHtml());\r\n        luckysheetsizeauto();\r\n\r\n        //关闭\r\n        $(\"#luckysheet-modal-dialog-slider-alternateformat .luckysheet-model-close-btn\").click(function () {\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat\").hide();\r\n            luckysheetsizeauto();\r\n        });\r\n\r\n        //应用范围\r\n        $(document).off(\"focus.AFrangeInput\").on(\"focus.AFrangeInput\", \"#luckysheet-alternateformat-range input\", function(){\r\n            _this.rangefocus = true;\r\n        });\r\n        $(document).off(\"blur.AFrangeInput\").on(\"blur.AFrangeInput\", \"#luckysheet-alternateformat-range input\", function(){\r\n            _this.rangefocus = false;\r\n        });\r\n\r\n        $(document).off(\"keydown.AFrangeInput\").on(\"keydown.AFrangeInput\", \"#luckysheet-alternateformat-range input\", function(e){\r\n            let rangeValue = $(this).val().trim();\r\n            if(e.keyCode == 13){\r\n                _this.update();\r\n            }\r\n        });\r\n        $(document).off(\"click.AFrangeIcon\").on(\"click.AFrangeIcon\", \"#luckysheet-alternateformat-range .fa-table\", function(){\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat\").hide();\r\n            luckysheetsizeauto();\r\n\r\n            let rangeValue = $(this).parents(\"#luckysheet-alternateformat-range\").find(\"input\").val().trim();\r\n            _this.rangeDialog(rangeValue);\r\n        });\r\n        $(document).off(\"click.AFrDCf\").on(\"click.AFrDCf\", \"#luckysheet-alternateformat-rangeDialog-confirm\", function(){\r\n            let rangeValue = $(this).parents(\"#luckysheet-alternateformat-rangeDialog\").find(\"input\").val().trim();\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-range input\").val(rangeValue);\r\n\r\n            $(this).parents(\"#luckysheet-alternateformat-rangeDialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat\").show();\r\n            luckysheetsizeauto();\r\n\r\n            _this.update();\r\n        });\r\n        $(document).off(\"click.AFrDCl\").on(\"click.AFrDCl\", \"#luckysheet-alternateformat-rangeDialog-close\", function(){\r\n            $(this).parents(\"#luckysheet-alternateformat-rangeDialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat\").show();\r\n            luckysheetsizeauto();\r\n        });\r\n        $(document).off(\"click.AFrDTitle\").on(\"click.AFrDTitle\", \"#luckysheet-alternateformat-rangeDialog .luckysheet-modal-dialog-title-close\", function(){\r\n            $(this).parents(\"#luckysheet-alternateformat-rangeDialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat\").show();\r\n            luckysheetsizeauto();\r\n        });\r\n\r\n        //页眉、页脚选中\r\n        $(document).off(\"change.AFrowHeader\").on(\"change.AFrowHeader\", \"#luckysheet-alternateformat-rowHeader\", function(){\r\n            let hasRowHeader;\r\n            if($(this).is(\":checked\")){\r\n                hasRowHeader = true;\r\n            }\r\n            else{\r\n                hasRowHeader = false;   \r\n            }\r\n\r\n            let hasRowFooter;\r\n            if($(\"#luckysheet-alternateformat-rowFooter\").is(\":checked\")){\r\n                hasRowFooter = true;\r\n            }\r\n            else{\r\n                hasRowFooter = false;   \r\n            }\r\n\r\n            _this.checkboxChange(hasRowHeader, hasRowFooter);\r\n            _this.modelboxOn();\r\n            _this.update();\r\n        });\r\n        $(document).off(\"change.AFrowFooter\").on(\"change.AFrowFooter\", \"#luckysheet-alternateformat-rowFooter\", function(){\r\n            let hasRowHeader;\r\n            if($(\"#luckysheet-alternateformat-rowHeader\").is(\":checked\")){\r\n                hasRowHeader = true;\r\n            }\r\n            else{\r\n                hasRowHeader = false;   \r\n            }\r\n\r\n            let hasRowFooter;\r\n            if($(this).is(\":checked\")){\r\n                hasRowFooter = true;\r\n            }\r\n            else{\r\n                hasRowFooter = false;   \r\n            }\r\n\r\n            _this.checkboxChange(hasRowHeader, hasRowFooter);\r\n            _this.modelboxOn();\r\n            _this.update();\r\n        });\r\n\r\n        //点击样式模板\r\n        $(document).off(\"click.AFmodelbox\").on(\"click.AFmodelbox\", \"#luckysheet-modal-dialog-slider-alternateformat .modelbox\", function(){\r\n            let index = $(this).index();\r\n            let $id = $(this).parents(\".cf\").attr(\"id\");\r\n\r\n            if($id == \"luckysheet-alternateformat-modelList\"){\r\n                _this.modelfocusIndex = index;\r\n            }\r\n            else if($id == \"luckysheet-alternateformat-modelCustom\"){\r\n                let len = _this.FixedModelColor.length;\r\n                _this.modelfocusIndex = index + len;\r\n            }\r\n\r\n            _this.modelboxOn();\r\n            _this.update();\r\n        });\r\n\r\n        //点击选择文本/单元格颜色\r\n        $(document).off(\"click.AFselectColor\").on(\"click.AFselectColor\", \"#luckysheet-modal-dialog-slider-alternateformat .luckysheet-color-menu-button-indicator\", function(){\r\n            let $parent = $(this).closest(\".toningbox\");\r\n\r\n            let colorType, currenColor;\r\n            if($(this).find(\".luckysheet-icon-img\").hasClass(\"luckysheet-icon-text-color\")){\r\n                colorType = \"fc\";\r\n                currenColor = $parent.find(\".toningShow\").data(\"fc\");\r\n            }\r\n            else if($(this).find(\".luckysheet-icon-img\").hasClass(\"luckysheet-icon-cell-color\")){\r\n                colorType = \"bc\";\r\n                currenColor = $parent.find(\".toningShow\").data(\"bc\");\r\n            }\r\n\r\n            //source\r\n            let source;\r\n            if($parent.hasClass(\"header\")){\r\n                source = \"0\";\r\n            }\r\n            else if($parent.hasClass(\"ctOne\")){\r\n                source = \"1\";\r\n            }\r\n            else if($parent.hasClass(\"ctTwo\")){\r\n                source = \"2\";\r\n            }\r\n            else if($parent.hasClass(\"footer\")){\r\n                source = \"3\";\r\n            }\r\n\r\n            _this.colorSelectDialog(currenColor, colorType, source);\r\n        });\r\n\r\n        //选择颜色 确定 添加自定义模板\r\n        $(document).off(\"click.AFselectColorConfirm\").on(\"click.AFselectColorConfirm\", \"#luckysheet-alternateformat-colorSelect-dialog-confirm\", function(){\r\n            let $parent = $(this).parents(\"#luckysheet-alternateformat-colorSelect-dialog\");\r\n            const _locale = locale()\r\n            const alternatingColors =_locale.alternatingColors;\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $parent.hide();\r\n\r\n            //获取currenColor colorType source\r\n            let currenColor = $parent.find(\".currenColor span\").attr(\"title\");\r\n\r\n            let colorType;\r\n            if($parent.find(\".luckysheet-modal-dialog-title-text\").text() == alternatingColors.selectionTextColor){\r\n                colorType = \"fc\";\r\n            }\r\n            else if($parent.find(\".luckysheet-modal-dialog-title-text\").text() == alternatingColors.selectionCellColor){\r\n                colorType = \"bc\";\r\n            }\r\n\r\n            let source = $parent.find(\".currenColor\").attr(\"data-source\");\r\n            \r\n            //赋给颜色\r\n            if(source == \"0\"){\r\n                if(colorType == \"fc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .header .toningShow\").css(\"color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .header .toningShow\").data(\"fc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .header .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n                if(colorType == \"bc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .header .toningShow\").css(\"background-color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .header .toningShow\").data(\"bc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .header .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n            }\r\n            else if(source == \"1\"){\r\n                if(colorType == \"fc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctOne .toningShow\").css(\"color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctOne .toningShow\").data(\"fc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctOne .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n                if(colorType == \"bc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctOne .toningShow\").css(\"background-color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctOne .toningShow\").data(\"bc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctOne .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n            }\r\n            else if(source == \"2\"){\r\n                if(colorType == \"fc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctTwo .toningShow\").css(\"color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctTwo .toningShow\").data(\"fc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctTwo .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n                if(colorType == \"bc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctTwo .toningShow\").css(\"background-color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctTwo .toningShow\").data(\"bc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .ctTwo .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n            }\r\n            else if(source == \"3\"){\r\n                if(colorType == \"fc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .footer .toningShow\").css(\"color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .footer .toningShow\").data(\"fc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .footer .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n                if(colorType == \"bc\"){\r\n                    $(\"#luckysheet-alternateformat-modelToning .footer .toningShow\").css(\"background-color\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .footer .toningShow\").data(\"bc\", currenColor);\r\n                    $(\"#luckysheet-alternateformat-modelToning .footer .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", currenColor);\r\n                }\r\n            }\r\n            \r\n            //若模板聚焦在固有模板，则新加模板；若模板聚焦在自定义模板，则修改该模板\r\n            let hasRowHeader;\r\n            if($(\"#luckysheet-alternateformat-rowHeader\").is(\":checked\")){\r\n                hasRowHeader = true;\r\n            }\r\n            else{\r\n                hasRowHeader = false;   \r\n            }\r\n\r\n            let hasRowFooter;\r\n            if($(\"#luckysheet-alternateformat-rowFooter\").is(\":checked\")){\r\n                hasRowFooter = true;\r\n            }\r\n            else{\r\n                hasRowFooter = false;   \r\n            }\r\n\r\n            let index = _this.modelfocusIndex;\r\n            let len = _this.FixedModelColor.length;\r\n\r\n            let format, file;\r\n            if(index < len){\r\n                format = $.extend(true, {}, _this.getFormatByIndex());\r\n            }\r\n            else{\r\n                file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n                let modelCustom = file[\"luckysheet_alternateformat_save_modelCustom\"];\r\n\r\n                format = $.extend(true, {}, modelCustom[index - len]);\r\n            }\r\n\r\n            if(source == \"0\"){\r\n                if(colorType == \"fc\"){\r\n                    format[\"head\"][\"fc\"] = currenColor;\r\n                }\r\n                else if(colorType == \"bc\"){\r\n                    format[\"head\"][\"bc\"] = currenColor;\r\n                }\r\n            }\r\n            else if(source == \"1\"){\r\n                if(colorType == \"fc\"){\r\n                    format[\"one\"][\"fc\"] = currenColor;\r\n                }\r\n                else if(colorType == \"bc\"){\r\n                    format[\"one\"][\"bc\"] = currenColor;\r\n                }\r\n            }\r\n            else if(source == \"2\"){\r\n                if(colorType == \"fc\"){\r\n                    format[\"two\"][\"fc\"] = currenColor;\r\n                }\r\n                else if(colorType == \"bc\"){\r\n                    format[\"two\"][\"bc\"] = currenColor;\r\n                }\r\n            }\r\n            else if(source == \"3\"){\r\n                if(colorType == \"fc\"){\r\n                    format[\"foot\"][\"fc\"] = currenColor;\r\n                }\r\n                if(colorType == \"bc\"){\r\n                    format[\"foot\"][\"bc\"] = currenColor;\r\n                }\r\n            }\r\n\r\n            if(_this.modelfocusIndex < len){\r\n                _this.addCustomModel(format);\r\n                _this.modelfocusIndex = _this.getIndexByFormat(format);\r\n            }\r\n            else{\r\n                file[\"luckysheet_alternateformat_save_modelCustom\"][index - len] = format;\r\n\r\n                if(server.allowUpdate){\r\n                    server.saveParam(\"all\", Store.currentSheetIndex, file[\"luckysheet_alternateformat_save_modelCustom\"], { \"k\": \"luckysheet_alternateformat_save_modelCustom\" });\r\n                }\r\n            }\r\n\r\n            _this.getModelBox(hasRowHeader, hasRowFooter);\r\n            _this.modelboxOn();\r\n            _this.update();\r\n        });\r\n        \r\n        //点击 移除交替颜色 按钮\r\n        $(document).off(\"click.AFremove\").on(\"click.AFremove\", \"#luckysheet-alternateformat-remove\", function(){\r\n            let dataIndex = $(this).data(\"index\");\r\n\r\n            let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n            let ruleArr = file[\"luckysheet_alternateformat_save\"];\r\n\r\n            //保存之前的规则\r\n            let historyRules = $.extend(true, [], ruleArr);\r\n\r\n            //保存当前的规则\r\n            if(ruleArr.length > 1){\r\n                ruleArr.splice(dataIndex, 1);\r\n            }\r\n            else{\r\n                ruleArr = [];\r\n            }\r\n\r\n            let currentRules = $.extend(true, [], ruleArr);\r\n            \r\n            //刷新一次表格\r\n            _this.ref(historyRules, currentRules);\r\n\r\n            if(server.allowUpdate){\r\n                server.saveParam(\"all\", Store.currentSheetIndex, ruleArr, { \"k\": \"luckysheet_alternateformat_save\" });\r\n            }\r\n\r\n            //隐藏一些dom\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-alternateformat\").hide();\r\n\r\n            luckysheetsizeauto();\r\n        });\r\n    },\r\n    perfect: function(){\r\n        let _this = this;\r\n\r\n        let range = $.extend(true, {}, Store.luckysheet_select_save[0]);\r\n        let existsIndex = _this.rangeIsExists(range)[1];\r\n        \r\n        let obj = $.extend(true, {}, Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_alternateformat_save\"][existsIndex]);\r\n        \r\n        //应用范围\r\n        let cellrange = obj[\"cellrange\"];\r\n        $(\"#luckysheet-alternateformat-range input\").val(getRangetxt(Store.currentSheetIndex, { \"row\": cellrange[\"row\"], \"column\": cellrange[\"column\"] }, Store.currentSheetIndex));\r\n        \r\n        Store.luckysheet_select_save = [{ \"row\": cellrange[\"row\"], \"column\": cellrange[\"column\"] }];\r\n        selectHightlightShow();\r\n\r\n        //页眉、页脚\r\n        let hasRowHeader = obj[\"hasRowHeader\"];\r\n        let hasRowFooter = obj[\"hasRowFooter\"];\r\n        \r\n        //模板聚焦\r\n        let format = obj[\"format\"];\r\n        _this.modelfocusIndex = _this.getIndexByFormat(format);\r\n\r\n        if(_this.modelfocusIndex == null){\r\n            _this.addCustomModel(format);\r\n            _this.modelfocusIndex = _this.getIndexByFormat(format);\r\n        }\r\n\r\n        _this.checkboxChange(hasRowHeader, hasRowFooter);\r\n        _this.modelboxOn();\r\n\r\n        //标识 交替颜色的index\r\n        $(\"#luckysheet-alternateformat-remove\").data(\"index\", existsIndex);\r\n    },\r\n    checkboxChange: function(hasRowHeader, hasRowFooter){\r\n        if(hasRowHeader){\r\n            $(\"#luckysheet-alternateformat-rowHeader\").prop(\"checked\", true);\r\n            $(\"#luckysheet-alternateformat-modelToning .header\").show();\r\n        }\r\n        else{\r\n            $(\"#luckysheet-alternateformat-rowHeader\").removeAttr(\"checked\");  \r\n            $(\"#luckysheet-alternateformat-modelToning .header\").hide(); \r\n        }\r\n\r\n        if(hasRowFooter){\r\n            $(\"#luckysheet-alternateformat-rowFooter\").prop(\"checked\", true);\r\n            $(\"#luckysheet-alternateformat-modelToning .footer\").show();\r\n        }\r\n        else{\r\n            $(\"#luckysheet-alternateformat-rowFooter\").removeAttr(\"checked\"); \r\n            $(\"#luckysheet-alternateformat-modelToning .footer\").hide();  \r\n        }\r\n\r\n        this.getModelBox(hasRowHeader, hasRowFooter);\r\n    },\r\n    modelboxOn: function(){\r\n        let _this = this;\r\n\r\n        //模板 foucs\r\n        $(\"#luckysheet-modal-dialog-slider-alternateformat .modelbox\").removeClass(\"on\");\r\n\r\n        let index = _this.modelfocusIndex;\r\n        let len = _this.FixedModelColor.length;\r\n        \r\n        if(index < len){\r\n            $(\"#luckysheet-alternateformat-modelList .modelbox\").eq(index).addClass(\"on\");\r\n        }\r\n        else{\r\n            $(\"#luckysheet-alternateformat-modelCustom .modelbox\").eq(index - len).addClass(\"on\");\r\n        }\r\n\r\n        //编辑 对应颜色改变\r\n        _this.modelToningColor();\r\n    },\r\n    modelToningColor: function(){\r\n        let format = this.getFormatByIndex();\r\n\r\n        //页眉\r\n        $(\"#luckysheet-alternateformat-modelToning .header .toningShow\").css({\"color\": format[\"head\"].fc, \"background-color\": format[\"head\"].bc});\r\n        $(\"#luckysheet-alternateformat-modelToning .header .toningShow\").data(\"fc\", format[\"head\"].fc).data(\"bc\", format[\"head\"].bc);\r\n        $(\"#luckysheet-alternateformat-modelToning .header .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"head\"].fc);\r\n        $(\"#luckysheet-alternateformat-modelToning .header .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"head\"].bc);\r\n\r\n        //颜色1\r\n        $(\"#luckysheet-alternateformat-modelToning .ctOne .toningShow\").css({\"color\": format[\"one\"].fc, \"background-color\": format[\"one\"].bc});\r\n        $(\"#luckysheet-alternateformat-modelToning .ctOne .toningShow\").data(\"fc\", format[\"one\"].fc).data(\"bc\", format[\"one\"].bc);\r\n        $(\"#luckysheet-alternateformat-modelToning .ctOne .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"one\"].fc);\r\n        $(\"#luckysheet-alternateformat-modelToning .ctOne .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"one\"].bc);\r\n\r\n        //颜色2\r\n        $(\"#luckysheet-alternateformat-modelToning .ctTwo .toningShow\").css({\"color\": format[\"two\"].fc, \"background-color\": format[\"two\"].bc});\r\n        $(\"#luckysheet-alternateformat-modelToning .ctTwo .toningShow\").data(\"fc\", format[\"two\"].fc).data(\"bc\", format[\"two\"].bc);\r\n        $(\"#luckysheet-alternateformat-modelToning .ctTwo .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"two\"].fc);\r\n        $(\"#luckysheet-alternateformat-modelToning .ctTwo .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"two\"].bc);\r\n\r\n        //页脚\r\n        $(\"#luckysheet-alternateformat-modelToning .footer .toningShow\").css({\"color\": format[\"foot\"].fc, \"background-color\": format[\"foot\"].bc});\r\n        $(\"#luckysheet-alternateformat-modelToning .footer .toningShow\").data(\"fc\", format[\"foot\"].fc).data(\"bc\", format[\"foot\"].bc);\r\n        $(\"#luckysheet-alternateformat-modelToning .footer .luckysheet-icon-text-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"foot\"].fc);\r\n        $(\"#luckysheet-alternateformat-modelToning .footer .luckysheet-icon-cell-color\").parents(\".luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", format[\"foot\"].bc);\r\n    },\r\n    addCustomModel: function(format){\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n        if(file[\"luckysheet_alternateformat_save_modelCustom\"] == null){\r\n            file[\"luckysheet_alternateformat_save_modelCustom\"] = [];\r\n        }\r\n\r\n        file[\"luckysheet_alternateformat_save_modelCustom\"].push(format);\r\n\r\n        if(server.allowUpdate){\r\n            server.saveParam(\"all\", Store.currentSheetIndex, file[\"luckysheet_alternateformat_save_modelCustom\"], { \"k\": \"luckysheet_alternateformat_save_modelCustom\" });\r\n        }\r\n    },\r\n    colorSelectDialog: function(currenColor, colorType, source){\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-alternateformat-colorSelect-dialog\").remove();\r\n\r\n        const _locale = locale()\r\n        const alternatingColors =_locale.alternatingColors;\r\n        const locale_button = _locale.button;\r\n        const locale_toolbar = _locale.toolbar;\r\n\r\n        let title;\r\n        if(colorType == \"fc\"){\r\n            title = alternatingColors.selectionTextColor;\r\n        }\r\n        else if(colorType == \"bc\"){\r\n            title = alternatingColors.selectionCellColor;\r\n        }\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-alternateformat-colorSelect-dialog\", \r\n            \"addclass\": \"luckysheet-alternateformat-colorSelect-dialog\", \r\n            \"title\": title, \r\n            \"content\": \"<div class='currenColor' data-source='\"+ source +\"'>\"+ alternatingColors.currentColor +\"：<span title='\"+ currenColor +\"' style='background-color:\"+ currenColor +\"'></span></div><div class='colorshowbox'></div>\", \r\n            \"botton\": '<button id=\"luckysheet-alternateformat-colorSelect-dialog-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-alternateformat-colorSelect-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-alternateformat-colorSelect-dialog\").css({ \r\n            \"left\": (winw + scrollLeft - myw) / 2, \r\n            \"top\": (winh + scrollTop - myh) / 3 \r\n        }).show();\r\n        \r\n        //初始化选择颜色插件\r\n        $(\"#luckysheet-alternateformat-colorSelect-dialog\").find(\".colorshowbox\").spectrum({\r\n            showPalette: true,\r\n            showPaletteOnly: true,\r\n            preferredFormat: \"hex\",\r\n            clickoutFiresChange: false,\r\n            showInitial: true,\r\n            showInput: true,\r\n            flat: true,\r\n            hideAfterPaletteSelect: true,\r\n            showSelectionPalette: true,\r\n            showButtons: false,//隐藏选择取消按钮\r\n            maxPaletteSize: 8,\r\n            maxSelectionSize: 8,\r\n            color: currenColor,\r\n            cancelText: locale_button.cancel,\r\n            chooseText: locale_toolbar.confirmColor,\r\n            togglePaletteMoreText: locale_toolbar.customColor,\r\n            togglePaletteLessText: locale_toolbar.collapse,\r\n            togglePaletteOnly: true,\r\n            clearText: locale_toolbar.clearText,\r\n            noColorSelectedText: locale_toolbar.noColorSelectedText,\r\n            localStorageKey: \"spectrum.textcolor\" + server.gridKey,\r\n            palette: [\r\n                [\"#000\", \"#444\", \"#666\", \"#999\", \"#ccc\", \"#eee\", \"#f3f3f3\", \"#fff\"],\r\n                [\"#f00\", \"#f90\", \"#ff0\", \"#0f0\", \"#0ff\", \"#00f\", \"#90f\", \"#f0f\"],\r\n                [\"#f4cccc\", \"#fce5cd\", \"#fff2cc\", \"#d9ead3\", \"#d0e0e3\", \"#cfe2f3\", \"#d9d2e9\", \"#ead1dc\"],\r\n                [\"#ea9999\", \"#f9cb9c\", \"#ffe599\", \"#b6d7a8\", \"#a2c4c9\", \"#9fc5e8\", \"#b4a7d6\", \"#d5a6bd\"],\r\n                [\"#e06666\", \"#f6b26b\", \"#ffd966\", \"#93c47d\", \"#76a5af\", \"#6fa8dc\", \"#8e7cc3\", \"#c27ba0\"],\r\n                [\"#c00\", \"#e69138\", \"#f1c232\", \"#6aa84f\", \"#45818e\", \"#3d85c6\", \"#674ea7\", \"#a64d79\"],\r\n                [\"#900\", \"#b45f06\", \"#bf9000\", \"#38761d\", \"#134f5c\", \"#0b5394\", \"#351c75\", \"#741b47\"],\r\n                [\"#600\", \"#783f04\", \"#7f6000\", \"#274e13\", \"#0c343d\", \"#073763\", \"#20124d\", \"#4c1130\"]\r\n            ],\r\n            move: function(color){\r\n                if (color != null) {\r\n                    color = color.toHexString();\r\n                }\r\n                else {\r\n                    color = \"#000\";\r\n                }\r\n\r\n                $(\"#luckysheet-alternateformat-colorSelect-dialog .currenColor span\").css(\"background-color\", color).attr(\"title\", color);\r\n            }\r\n        });\r\n    },\r\n    rangeDialog: function(value){\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-alternateformat-rangeDialog\").remove();\r\n\r\n        const _locale = locale()\r\n        const alternatingColors =_locale.alternatingColors;\r\n        const locale_button = _locale.button;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-alternateformat-rangeDialog\", \r\n            \"addclass\": \"luckysheet-alternateformat-rangeDialog\", \r\n            \"title\": alternatingColors.selectRange, \r\n            \"content\": '<input readonly=\"readonly\" placeholder=\"'+alternatingColors.tipSelectRange+'\" value=\"'+value+'\"/>', \r\n            \"botton\": '<button id=\"luckysheet-alternateformat-rangeDialog-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button id=\"luckysheet-alternateformat-rangeDialog-close\" class=\"btn btn-default\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-alternateformat-rangeDialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-alternateformat-rangeDialog\").css({ \r\n            \"left\": (winw + scrollLeft - myw) / 2, \r\n            \"top\": (winh + scrollTop - myh) / 3 \r\n        }).show();\r\n    },\r\n    rangeIsExists: function(range, index){\r\n        let _this = this;\r\n\r\n        let isExists = false;\r\n        let existsIndex = null;\r\n\r\n        //获取已有交替颜色所有应用范围\r\n        let AFarr = $.extend(true, [], Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_alternateformat_save\"]);\r\n\r\n        if(index != undefined && index != null){\r\n            if(AFarr.length > 1){\r\n                AFarr.splice(index, 1);\r\n            }\r\n            else{\r\n                AFarr = [];\r\n            }\r\n        }\r\n\r\n        if(AFarr.length > 0){\r\n            let arr = [];\r\n            for(let i = 0; i < AFarr.length; i++){\r\n                let obj = {\r\n                    \"index\": i,\r\n                    \"map\": _this.getRangeMap(AFarr[i][\"cellrange\"][\"row\"], AFarr[i][\"cellrange\"][\"column\"])\r\n                }\r\n\r\n                arr.push(obj);\r\n            }\r\n            \r\n            //获取当前选区\r\n            let rangeMap = _this.getRangeMap(range[\"row\"], range[\"column\"]);\r\n            \r\n            //遍历\r\n            for(let x in rangeMap){\r\n                if(isExists){\r\n                    break;\r\n                } \r\n\r\n                for(let j = 0; j < arr.length; j++){\r\n                    if(x in arr[j][\"map\"]){\r\n                        isExists = true;\r\n                        existsIndex = arr[j][\"index\"];\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return [isExists, existsIndex];\r\n    },\r\n    getRangeMap: function(row, column){\r\n        let map = {};\r\n        let st_r = row[0], ed_r = row[1], st_c = column[0], ed_c = column[1];\r\n        \r\n        for(let r = st_r; r <= ed_r; r++){\r\n            for(let c = st_c; c <= ed_c; c++){\r\n                map[r + \"_\" + c] = 0;\r\n            }\r\n        }\r\n        \r\n        return map;\r\n    },\r\n    getIndexByFormat: function(format){\r\n        let _this = this;\r\n        let index = null;\r\n\r\n        //格式样式 模板\r\n        let modelList = _this.FixedModelColor;\r\n        for(let i = 0; i < modelList.length; i++){\r\n            let obj = modelList[i];\r\n\r\n            if(format[\"head\"].fc == obj[\"head\"].fc && format[\"head\"].bc == obj[\"head\"].bc){\r\n                if(format[\"one\"].fc == obj[\"one\"].fc && format[\"one\"].bc == obj[\"one\"].bc){\r\n                    if(format[\"two\"].fc == obj[\"two\"].fc && format[\"two\"].bc == obj[\"two\"].bc){\r\n                        if(format[\"foot\"].fc == obj[\"foot\"].fc && format[\"foot\"].bc == obj[\"foot\"].bc){\r\n                            index = i;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        \r\n        //自定义 模板\r\n        let modelCustom = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_alternateformat_save_modelCustom\"];\r\n        if(modelCustom != null && modelCustom.length > 0){\r\n            for(let j = 0; j < modelCustom.length; j++){\r\n                let obj = modelCustom[j];\r\n\r\n                if(format[\"head\"].fc == obj[\"head\"].fc && format[\"head\"].bc == obj[\"head\"].bc){\r\n                    if(format[\"one\"].fc == obj[\"one\"].fc && format[\"one\"].bc == obj[\"one\"].bc){\r\n                        if(format[\"two\"].fc == obj[\"two\"].fc && format[\"two\"].bc == obj[\"two\"].bc){\r\n                            if(format[\"foot\"].fc == obj[\"foot\"].fc && format[\"foot\"].bc == obj[\"foot\"].bc){\r\n                                index = modelList.length + j;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n       \r\n        return index;\r\n    },\r\n    getFormatByIndex: function(){\r\n        let _this = this;\r\n\r\n        let index = _this.modelfocusIndex;\r\n        let len = _this.FixedModelColor.length;\r\n\r\n        let format = {};\r\n\r\n        if(index < len){\r\n            format = _this.FixedModelColor[index];\r\n        }\r\n        else{\r\n            format = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_alternateformat_save_modelCustom\"][index - len];\r\n        }\r\n\r\n        return format;\r\n    },\r\n    new: function(cellrange){\r\n        let _this = this;\r\n\r\n        let format = _this.getFormatByIndex();\r\n\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        let ruleArr = file[\"luckysheet_alternateformat_save\"];\r\n        \r\n        if(ruleArr == null){\r\n            ruleArr = [];\r\n        }\r\n\r\n        //保存之前的规则\r\n        let historyRules = $.extend(true, [], ruleArr);\r\n        \r\n        //保存当前的规则\r\n        let obj = {\r\n            \"cellrange\": {\r\n                \"row\": cellrange[\"row\"],\r\n                \"column\": cellrange[\"column\"]\r\n            },\r\n            \"format\": format,\r\n            \"hasRowHeader\": true,\r\n            \"hasRowFooter\": false\r\n        }\r\n\r\n        ruleArr.push(obj);\r\n\r\n        let currentRules = $.extend(true, [], ruleArr);\r\n        \r\n        //刷新一次表格\r\n        _this.ref(historyRules, currentRules);\r\n\r\n        if(server.allowUpdate){\r\n            server.saveParam(\"all\", Store.currentSheetIndex, ruleArr, { \"k\": \"luckysheet_alternateformat_save\" });\r\n        }\r\n    },\r\n    update: function(){\r\n        let _this = this;\r\n        const _locale = locale()\r\n        const alternatingColors =_locale.alternatingColors;\r\n        //获取标识\r\n        let dataIndex = $(\"#luckysheet-alternateformat-remove\").data(\"index\");\r\n        \r\n        //应用范围\r\n        let rangeValue = $(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-range input\").val().trim();\r\n        \r\n        if(!formula.iscelldata(rangeValue)){\r\n            if(isEditMode()){\r\n                alert(alternatingColors.errorNoRange);\r\n            }\r\n            else{\r\n                tooltip.info(alternatingColors.errorNoRange, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n        \r\n        let cellrange = formula.getcellrange(rangeValue);\r\n        let isExists = _this.rangeIsExists(cellrange, dataIndex)[0];\r\n\r\n        if(isExists){\r\n            if(isEditMode()){\r\n                alert(alternatingColors.errorExistColors);\r\n            }\r\n            else{\r\n                tooltip.info(alternatingColors.errorExistColors, \"\"); \r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        //页眉、页脚\r\n        let hasRowHeader;\r\n        if($(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-rowHeader\").is(\":checked\")){\r\n            hasRowHeader = true;\r\n        }\r\n        else{\r\n            hasRowHeader = false;    \r\n        }\r\n\r\n        let hasRowFooter;\r\n        if($(\"#luckysheet-modal-dialog-slider-alternateformat #luckysheet-alternateformat-rowFooter\").is(\":checked\")){\r\n            hasRowFooter = true;\r\n        }\r\n        else{\r\n            hasRowFooter = false;    \r\n        }\r\n\r\n        //获取选中样式模板的颜色\r\n        let format = _this.getFormatByIndex();\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        \r\n        let ruleArr = file[\"luckysheet_alternateformat_save\"];\r\n        if(ruleArr == null){\r\n            ruleArr = [];\r\n        }\r\n        \r\n        //保存之前的规则\r\n        let historyRules = $.extend(true, [], ruleArr);\r\n        \r\n        //保存当前的规则\r\n        let obj = {\r\n            \"cellrange\": {\r\n                \"row\": cellrange[\"row\"],\r\n                \"column\": cellrange[\"column\"]\r\n            },\r\n            \"format\": format,\r\n            \"hasRowHeader\": hasRowHeader,\r\n            \"hasRowFooter\": hasRowFooter\r\n        }\r\n        \r\n        ruleArr[dataIndex] = obj;\r\n\r\n        let currentRules = $.extend(true, [], ruleArr);\r\n        \r\n        //刷新一次表格\r\n        _this.ref(historyRules, currentRules);\r\n\r\n        if(server.allowUpdate){\r\n            server.saveParam(\"all\", Store.currentSheetIndex, ruleArr, { \"k\": \"luckysheet_alternateformat_save\" });\r\n        }\r\n    },\r\n    checksAF: function(r, c, computeMap){\r\n        if((r + \"_\" + c) in computeMap){\r\n            //返回值（fc  bc）\r\n            return computeMap[r + \"_\" + c];\r\n        }\r\n        else{\r\n            return null;\r\n        }\r\n    },\r\n    getComputeMap: function(){\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        let ruleArr = file[\"luckysheet_alternateformat_save\"];\r\n\r\n        let computeMap = this.compute(ruleArr);\r\n\r\n        return computeMap;\r\n    },\r\n    compute: function(obj){\r\n        //计算存储\r\n        let computeMap = {};\r\n\r\n        if(obj != null && obj.length > 0){\r\n            for(let i = 0; i < obj.length; i++){\r\n                let cellrange = obj[i][\"cellrange\"];\r\n                let format = obj[i][\"format\"];\r\n                let hasRowHeader = obj[i][\"hasRowHeader\"];\r\n                let hasRowFooter = obj[i][\"hasRowFooter\"];\r\n                let st_r = cellrange[\"row\"][0], \r\n                    ed_r = cellrange[\"row\"][1], \r\n                    st_c = cellrange[\"column\"][0], \r\n                    ed_c = cellrange[\"column\"][1];\r\n                \r\n                if(hasRowHeader && hasRowFooter){\r\n                    //页眉所在行\r\n                    for(let c = st_c; c <= ed_c; c++){\r\n                        computeMap[st_r + \"_\" + c] = [format[\"head\"].fc, format[\"head\"].bc];\r\n                    }\r\n\r\n                    //中间行\r\n                    if(ed_r - st_r > 1){\r\n                        for(let r = st_r + 1; r < ed_r; r++){\r\n                            let fc, bc;\r\n                            if((r - st_r) % 2 != 0){\r\n                                fc = format[\"one\"].fc;\r\n                                bc = format[\"one\"].bc;\r\n                            }\r\n                            else{\r\n                                fc = format[\"two\"].fc;\r\n                                bc = format[\"two\"].bc;\r\n                            }\r\n\r\n                            for(let c = st_c; c <= ed_c; c++){\r\n                                computeMap[r + \"_\" + c] = [fc, bc];\r\n                            } \r\n                        }\r\n                    }\r\n\r\n                    //页脚所在行\r\n                    if(ed_r > st_r){\r\n                        for(let c = st_c; c <= ed_c; c++){\r\n                            computeMap[ed_r + \"_\" + c] = [format[\"foot\"].fc, format[\"foot\"].bc];\r\n                        }\r\n                    }\r\n                }\r\n                else if(hasRowHeader){\r\n                    //页眉所在行\r\n                    for(let c = st_c; c <= ed_c; c++){\r\n                        computeMap[st_r + \"_\" + c] = [format[\"head\"].fc, format[\"head\"].bc];\r\n                    }\r\n\r\n                    //中间行\r\n                    if(ed_r > st_r){\r\n                        for(let r = st_r + 1; r <= ed_r; r++){\r\n                            let fc, bc;\r\n                            if((r - st_r) % 2 != 0){\r\n                                fc = format[\"one\"].fc;\r\n                                bc = format[\"one\"].bc;\r\n                            }\r\n                            else{\r\n                                fc = format[\"two\"].fc;\r\n                                bc = format[\"two\"].bc;\r\n                            }\r\n\r\n                            for(let c = st_c; c <= ed_c; c++){\r\n                                computeMap[r + \"_\" + c] = [fc, bc];\r\n                            } \r\n                        }\r\n                    }\r\n                }\r\n                else if(hasRowFooter){\r\n                    //中间行\r\n                    if(ed_r > st_r){\r\n                        for(let r = st_r; r < ed_r; r++){\r\n                            let fc, bc;\r\n                            if((r - st_r) % 2 == 0){\r\n                                fc = format[\"one\"].fc;\r\n                                bc = format[\"one\"].bc;\r\n                            }\r\n                            else{\r\n                                fc = format[\"two\"].fc;\r\n                                bc = format[\"two\"].bc;\r\n                            }\r\n\r\n                            for(let c = st_c; c <= ed_c; c++){\r\n                                computeMap[r + \"_\" + c] = [fc, bc];\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    //页脚所在行\r\n                    for(let c = st_c; c <= ed_c; c++){\r\n                        computeMap[ed_r + \"_\" + c] = [format[\"foot\"].fc, format[\"foot\"].bc];\r\n                    }\r\n                }\r\n                else{\r\n                    //中间行\r\n                    for(let r = st_r; r <= ed_r; r++){\r\n                        let fc, bc;\r\n                        if((r - st_r) % 2 == 0){\r\n                            fc = format[\"one\"].fc;\r\n                            bc = format[\"one\"].bc;\r\n                        }\r\n                        else{\r\n                            fc = format[\"two\"].fc;\r\n                            bc = format[\"two\"].bc;\r\n                        }\r\n\r\n                        for(let c = st_c; c <= ed_c; c++){\r\n                            computeMap[r + \"_\" + c] = [fc, bc];\r\n                        } \r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return computeMap;\r\n    },\r\n    ref: function(historyRules, currentRules){\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n\r\n            let redo = {};\r\n            redo[\"type\"] = \"updateAF\";\r\n            redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n            redo[\"data\"] = {\"historyRules\": historyRules, \"currentRules\": currentRules};\r\n            Store.jfredo.push(redo); \r\n        }\r\n\r\n        let index = getSheetIndex(Store.currentSheetIndex);\r\n        Store.luckysheetfile[index][\"luckysheet_alternateformat_save\"] = currentRules;\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n}\r\n\r\nexport default alternateformat;"
  },
  {
    "path": "src/controllers/cellDatePickerCtrl.js",
    "content": "import menuButton from './menuButton';\r\nimport formula from '../global/formula';\r\nimport Store from '../store';\r\nimport flatpickr from 'flatpickr'\r\nimport dayjs from \"dayjs\";\r\nimport { update, datenum_local } from '../global/format';\r\nimport { setCellValue, setCellFormat } from '../global/api';\r\n\r\nconst fitFormat = (formatStr) => {\r\n    let dateFormat = formatStr.replace(/y/g, 'Y');\r\n    dateFormat = dateFormat.replace(/d/g, 'D');\r\n    dateFormat = dateFormat.replace(/h/g, 'H');\r\n\r\n    dateFormat = dateFormat.replace(/上午\\/下午/g, 'A');\r\n    dateFormat = dateFormat.replace(/上午/g, 'A');\r\n    dateFormat = dateFormat.replace(/下午/g, 'A');\r\n\r\n    dateFormat = dateFormat.replace(/AM\\/PM/g, 'A');\r\n    dateFormat = dateFormat.replace(/AM/g, 'A');\r\n    dateFormat = dateFormat.replace(/PM/g, 'A');\r\n    dateFormat = dateFormat.replace(/\\\"/g, '');\r\n\r\n    if (dateFormat.includes('A')) {\r\n        dateFormat = dateFormat.replace(/H/g, 'h');\r\n    }\r\n    return dateFormat\r\n}\r\n\r\nconst cellDatePickerCtrl = {\r\n    cellFocus: function (r, c, cell) {\r\n        let row = Store.visibledatarow[r],\r\n            row_pre = r == 0 ? 0 : Store.visibledatarow[r - 1];\r\n        let col = Store.visibledatacolumn[c],\r\n            col_pre = c == 0 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n        let type = cell.ct.fa || 'YYYY-MM-DD';\r\n        let defaultDate = update('yyyy-MM-dd hh:mm:ss', cell.v);\r\n        let dateFormat = fitFormat(type);\r\n        let enableTime = false;\r\n        let noCalendar = false;\r\n        let enableSeconds = false;\r\n        let time_24hr = true;\r\n        let hasChineseTime = false;\r\n\r\n\r\n        if (!!margeset) {\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n\r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n        }\r\n\r\n        $(\".cell-date-picker\").show().css({\r\n            width: col - col_pre + 1,\r\n            height: row - row_pre + 1,\r\n            left: col_pre,\r\n            top: row_pre\r\n        })\r\n\r\n        if (/[上午下午]/.test(type)) {\r\n            hasChineseTime = true\r\n        }\r\n        if (/[Hhms]/.test(dateFormat)) {\r\n            enableTime = true;\r\n        }\r\n        if (!/[YMD]/.test(dateFormat)) {\r\n            noCalendar = true;\r\n        }\r\n        if (/s/.test(dateFormat)) {\r\n            enableSeconds = true;\r\n        }\r\n        if (/A/.test(dateFormat)) {\r\n            time_24hr = false;\r\n        }\r\n\r\n        const fp = flatpickr('#luckysheet-input-box', {\r\n            allowInput: false,\r\n            noCalendar,\r\n            enableSeconds,\r\n            enableTime,\r\n            dateFormat,\r\n            time_24hr,\r\n            defaultDate,\r\n            onClose() {\r\n                setTimeout(() => {\r\n                    fp.destroy()\r\n                }, 0);\r\n            },\r\n            parseDate: (datestr, format) => {\r\n                return dayjs(datestr).toDate();\r\n            },\r\n            formatDate: (date, format, locale) => {\r\n                if (hasChineseTime) {\r\n                    return dayjs(date).format(format).replace('AM', '上午').replace('PM', '下午')\r\n                }\r\n                return dayjs(date).format(format);\r\n            },\r\n            onChange: function (selectedDates, dateStr) {\r\n                let currentVal = datenum_local(new Date(selectedDates))\r\n                $(\"#luckysheet-rich-text-editor\").html(dateStr);\r\n                setCellValue(r, c, currentVal, { isRefresh: false })\r\n                setCellFormat(r, c, 'ct', cell.ct)\r\n                if (!enableTime) {\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                }\r\n            }\r\n        });\r\n\r\n        $(\"#luckysheet-input-box\").click();\r\n    },\r\n}\r\n\r\nexport default cellDatePickerCtrl;\r\n"
  },
  {
    "path": "src/controllers/cellFormat.js",
    "content": "import Store from '../store';\r\nimport { replaceHtml,transformRangeToAbsolute,openSelfModel } from '../utils/util';\r\nimport { modelHTML } from './constant';\r\nimport sheetmanage from './sheetmanage';\r\nimport menuButton from './menuButton';\r\nimport {checkProtectionNotEnable} from './protection';\r\nimport { jfrefreshgrid } from '../global/refresh';\r\nimport locale from '../locale/locale';\r\nimport { setcellvalue } from '../global/setdata';\r\n\r\n\r\nlet isInitialCellFormatModel = false;\r\n\r\nfunction initialCellFormatModelEvent(){\r\n    const _locale = locale();\r\n    const local_cellFormat = _locale.cellFormat;\r\n\r\n    $(\"#luckysheet-cellFormat-confirm\").click(function(){\r\n        let locked = $(\"#luckysheet-protection-check-locked\").is(':checked');\r\n        let hidden = $(\"#luckysheet-protection-check-hidden\").is(':checked');\r\n    \r\n        locked = locked==true?1:0;\r\n        hidden = hidden==true?1:0;\r\n\r\n        let d = recycleSeletion(\r\n            function(cell, r, c, data){\r\n                if(cell==null){\r\n                    setcellvalue(r, c, data, {\r\n                        lo:locked,\r\n                        hi:hidden\r\n                    });\r\n                }\r\n                else{\r\n                    cell.lo = locked;\r\n                    cell.hi = hidden;\r\n                }\r\n            },\r\n            function(){\r\n                alert(local_cellFormat.sheetDataIsNullAlert);\r\n            }\r\n        );\r\n\r\n        jfrefreshgrid(d, undefined, undefined, false);\r\n\r\n        $(\"#luckysheet-cellFormat-config\").hide();\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n    });\r\n}\r\n\r\nfunction recycleSeletion(cycleFunction, dataIsNullFunction){\r\n    if(Store.luckysheet_select_save != null && Store.luckysheet_select_save.length > 0){\r\n        let sheetFile = sheetmanage.getSheetByIndex(), data=sheetFile.data;\r\n        if(data!=null){\r\n            \r\n            for(let i=0;i<Store.luckysheet_select_save.length;i++){\r\n                let selection = Store.luckysheet_select_save[i];\r\n                let row = selection.row, column = selection.column;\r\n                for(let r=row[0];r<=row[1];r++){\r\n                    for(let c=column[0];c<=column[1];c++){\r\n                        let cell;\r\n\r\n                        let margeset = menuButton.mergeborer(data, r, c);\r\n                        if (!!margeset) {\r\n                            // row = margeset.row[1];\r\n                            // row_pre = margeset.row[0];\r\n                            let row_index = margeset.row[2];\r\n                            // row_index_ed = margeset.row[3];\r\n\r\n                            // col = margeset.column[1];\r\n                            // col_pre = margeset.column[0];\r\n                            let col_index = margeset.column[2];\r\n                            // col_index_ed = margeset.column[3];\r\n\r\n                            cell = data[row_index][col_index];\r\n                        }\r\n                        else{\r\n                            cell = data[r][c];\r\n                        }\r\n\r\n                        // if(cell.lo==null || cell.lo==1){\r\n                        //     locked = true;\r\n                        //     lockedCount++;\r\n                        // }\r\n\r\n                        // if(cell.hi==1){\r\n                        //     hidden = true;\r\n                        //     hiddenCount++;\r\n                        // }\r\n\r\n                        // count++;\r\n\r\n                        cycleFunction(cell, r, c, data);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            // locked = true;\r\n            dataIsNullFunction();\r\n        }\r\n\r\n        return data;\r\n    }\r\n}\r\n\r\nfunction initialCellFormatModel(){\r\n    if(isInitialCellFormatModel){\r\n        return;\r\n    }\r\n\r\n    isInitialCellFormatModel = true;\r\n    const _locale = locale();\r\n    const local_cellFormat = _locale.cellFormat;\r\n    const locale_button = _locale.button;\r\n\r\n    //Password input initial\r\n    $(\"body\").append(replaceHtml(modelHTML, { \r\n        \"id\": \"luckysheet-cellFormat-config\", \r\n        \"addclass\": \"luckysheet-cellFormat-config\", \r\n        \"title\": local_cellFormat.cellFormatTitle, \r\n        \"content\": `\r\n            <div class=\"luckysheet-cellFormat-menu-c\">\r\n                <div class=\"luckysheet-cellFormat-menu luckysheet-cellFormat-menu-active\" id=\"luckysheet-cellFormat-protection\">\r\n                    ${local_cellFormat.protection}\r\n                </div>\r\n            </div>\r\n            <div id=\"luckysheet-cellFormat-protection-content\" class=\"luckysheet-cellFormat-content\">\r\n                <div class=\"luckysheet-cellFormat-protection\">\r\n                    <p>\r\n                        ${local_cellFormat.protectionTips}\r\n                    </p>\r\n                    <label for=\"luckysheet-protection-check-locked\"><input id=\"luckysheet-protection-check-locked\" name=\"luckysheet-protection-check-locked\" type=\"checkbox\">${local_cellFormat.locked}</label><span>部分选中</span>\r\n                    <br/>\r\n                    <label for=\"luckysheet-protection-check-hidden\"><input id=\"luckysheet-protection-check-hidden\" name=\"luckysheet-protection-check-hidden\" type=\"checkbox\">${local_cellFormat.hidden}</label><span>全部选中</span>\r\n                </div>\r\n            </div>\r\n        `, \r\n        \"botton\":  `<button id=\"luckysheet-cellFormat-confirm\" class=\"btn btn-primary\">${locale_button.confirm}</button>\r\n                    <button class=\"btn btn-default luckysheet-model-close-btn\">${locale_button.cancel}</button>`, \r\n        \"style\": \"z-index:100003\" \r\n    }));\r\n\r\n    initialCellFormatModelEvent();\r\n}\r\n\r\nexport function openCellFormatModel(){\r\n    initialCellFormatModel();\r\n\r\n    const _locale = locale();\r\n    const local_cellFormat = _locale.cellFormat;\r\n    const locale_button = _locale.button;\r\n\r\n    $(\"#luckysheet-rightclick-menu\").hide();\r\n\r\n    if(!checkProtectionNotEnable(Store.currentSheetIndex)){\r\n        return;\r\n    }\r\n\r\n    let locked =false, hidden=false;\r\n    let lockedCount=0, hiddenCount=0, count=0;\r\n    if(Store.luckysheet_select_save != null && Store.luckysheet_select_save.length > 0){\r\n        recycleSeletion(\r\n            function(cell){\r\n                // let cell = data[r][c];\r\n                if(cell==null || cell.lo==null || cell.lo==1){\r\n                    locked = true;\r\n                    lockedCount++;\r\n                }\r\n\r\n                if(cell!=null && cell.hi==1){\r\n                    hidden = true;\r\n                    hiddenCount++;\r\n                }\r\n\r\n                count++;\r\n            },\r\n            function(){\r\n                locked = true;\r\n            }\r\n        );\r\n    }\r\n    else{\r\n        alert(local_cellFormat.selectionIsNullAlert);\r\n        return;\r\n    }\r\n\r\n    let tipsLock=\"\", tipshidden=\"\";\r\n    if(locked){\r\n        tipsLock = lockedCount==count?local_cellFormat.tipsAll:local_cellFormat.tipsPart;\r\n    }\r\n\r\n    if(hidden){\r\n        tipshidden = hiddenCount==count?local_cellFormat.tipsAll:local_cellFormat.tipsPart;\r\n    }\r\n\r\n    $(\"#luckysheet-protection-check-locked\").prop('checked',locked).parent().next().html(tipsLock);\r\n    $(\"#luckysheet-protection-check-hidden\").prop('checked',hidden).parent().next().html(tipshidden);\r\n\r\n\r\n    openSelfModel(\"luckysheet-cellFormat-config\");\r\n}"
  },
  {
    "path": "src/controllers/conditionformat.js",
    "content": "import { getSheetIndex, getRangetxt } from '../methods/get';\r\nimport { replaceHtml, getObjType, chatatABC } from '../utils/util';\r\nimport formula from '../global/formula';\r\nimport { isRealNull, isEditMode } from '../global/validate';\r\nimport tooltip from '../global/tooltip';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport { getcellvalue } from '../global/getdata';\r\nimport { genarate } from '../global/format';\r\nimport { modelHTML, luckysheet_CFiconsImg } from './constant';\r\nimport server from './server';\r\nimport { selectionCopyShow } from './select';\r\nimport sheetmanage from './sheetmanage';\r\nimport locale from '../locale/locale';\r\nimport {checkProtectionFormatCells} from './protection';\r\nimport Store from '../store';\r\nimport dayjs from 'dayjs'\r\n\r\n//条件格式\r\nconst conditionformat = {\r\n    fileClone: [],\r\n    editorRule: null, //{\"sheetIndex\": sheetIndex,\"itemIndex\": itemIndex,\"data\": luckysheetfile[sheetIndex].luckysheet_conditionformat_save[itemIndex]}\r\n    ruleTypeHtml: function(){\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        return `<div class=\"ruleTypeBox\">\r\n                    <div class=\"ruleTypeItem\">\r\n                        <span class=\"icon iconfont-luckysheet luckysheet-iconfont-youjiantou\"></span>\r\n                        <span>${conditionformat_Text.ruleTypeItem1}</span>\r\n                    </div>\r\n                    <div class=\"ruleTypeItem\">\r\n                        <span class=\"icon iconfont-luckysheet luckysheet-iconfont-youjiantou\"></span>\r\n                        <span>${conditionformat_Text.ruleTypeItem2}</span>\r\n                    </div>\r\n                    <div class=\"ruleTypeItem\">\r\n                        <span class=\"icon iconfont-luckysheet luckysheet-iconfont-youjiantou\"></span>\r\n                        <span>${conditionformat_Text.ruleTypeItem3}</span>\r\n                    </div>\r\n                    <div class=\"ruleTypeItem\">\r\n                        <span class=\"icon iconfont-luckysheet luckysheet-iconfont-youjiantou\"></span>\r\n                        <span>${conditionformat_Text.ruleTypeItem4}</span>\r\n                    </div>\r\n                    <div class=\"ruleTypeItem\">\r\n                        <span class=\"icon iconfont-luckysheet luckysheet-iconfont-youjiantou\"></span>\r\n                        <span>${conditionformat_Text.ruleTypeItem5}</span>\r\n                    </div>\r\n                    <div class=\"ruleTypeItem\">\r\n                        <span class=\"icon iconfont-luckysheet luckysheet-iconfont-youjiantou\"></span>\r\n                        <span>${conditionformat_Text.ruleTypeItem6}</span>\r\n                    </div>\r\n                </div>`;\r\n    },\r\n    textCellColorHtml: function(){\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        return `<div id=\"textCellColor\">\r\n                    <div class=\"colorbox\">\r\n                        <input id=\"checkTextColor\" type=\"checkbox\" checked=\"checked\">\r\n                        <label for=\"checkTextColor\">${conditionformat_Text.textColor}：</label>\r\n                        <input id=\"textcolorshow\" data-tips=\"${conditionformat_Text.textColor}\" data-func=\"background\" class=\"luckysheet-conditionformat-config-color\" type=\"text\" value=\"#9c0006\" style=\"display: none;\">\r\n                    </div>\r\n                    <div class=\"colorbox\">\r\n                        <input id=\"checkCellColor\" type=\"checkbox\" checked=\"checked\">\r\n                        <label for=\"checkCellColor\">${conditionformat_Text.cellColor}：</label>\r\n                        <input id=\"cellcolorshow\" data-tips=\"${conditionformat_Text.cellColor}\" data-func=\"background\" class=\"luckysheet-conditionformat-config-color\" type=\"text\" value=\"#ffc7ce\" style=\"display: none;\">\r\n                    </div>\r\n                </div>`;\r\n    },\r\n    selectRange: [],\r\n    selectStatus: false,\r\n    dataBarList: [\r\n        { \"format\": [\"#638ec6\", \"#ffffff\"] },  //蓝-白渐变 数据条\r\n        { \"format\": [\"#63c384\", \"#ffffff\"] },  //绿-白渐变 数据条\r\n        { \"format\": [\"#ff555a\", \"#ffffff\"] },  //红-白渐变 数据条\r\n        { \"format\": [\"#ffb628\", \"#ffffff\"] },  //橙-白渐变 数据条\r\n        { \"format\": [\"#008aef\", \"#ffffff\"] },  //浅蓝-白渐变 数据条\r\n        { \"format\": [\"#d6007b\", \"#ffffff\"] },  //紫-白渐变 数据条\r\n\r\n        { \"format\": [\"#638ec6\"] },  //蓝色 数据条\r\n        { \"format\": [\"#63c384\"] },  //绿色 数据条\r\n        { \"format\": [\"#ff555a\"] },  //红色 数据条\r\n        { \"format\": [\"#ffb628\"] },  //橙色 数据条\r\n        { \"format\": [\"#008aef\"] },  //浅蓝色 数据条\r\n        { \"format\": [\"#d6007b\"] }   //紫色 数据条\r\n    ],\r\n    colorGradationList: [\r\n        { \"format\": [\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\", \"rgb(248, 105, 107)\"] },  //绿-黄-红色阶\r\n        { \"format\": [\"rgb(248, 105, 107)\", \"rgb(255, 235, 132)\", \"rgb(99, 190, 123)\"] },  //红-黄-绿色阶\r\n\r\n        { \"format\": [\"rgb(99, 190, 123)\", \"rgb(252, 252, 255)\", \"rgb(248, 105, 107)\"] },  //绿-白-红色阶\r\n        { \"format\": [\"rgb(248, 105, 107)\", \"rgb(252, 252, 255)\", \"rgb(99, 190, 123)\"] },  //红-白-绿色阶\r\n\r\n        { \"format\": [\"rgb(90, 138, 198)\", \"rgb(252, 252, 255)\", \"rgb(248, 105, 107)\"] },  //蓝-白-红色阶\r\n        { \"format\": [\"rgb(248, 105, 107)\", \"rgb(252, 252, 255)\", \"rgb(90, 138, 198)\"] },  //红-白-蓝色阶\r\n\r\n        { \"format\": [\"rgb(252, 252, 255)\", \"rgb(248, 105, 107)\"] },  //白-红色阶\r\n        { \"format\": [\"rgb(248, 105, 107)\", \"rgb(252, 252, 255)\"] },  //红-白色阶\r\n\r\n        { \"format\": [\"rgb(99, 190, 123)\", \"rgb(252, 252, 255)\"] },  //绿-白色阶\r\n        { \"format\": [\"rgb(252, 252, 255)\", \"rgb(99, 190, 123)\"] },  //白-绿色阶\r\n\r\n        { \"format\": [\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\"] },  //绿-黄色阶\r\n        { \"format\": [\"rgb(255, 235, 132)\", \"rgb(99, 190, 123)\"] }   //黄-绿色阶\r\n    ],\r\n    init: function(){\r\n        let _this = this;\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        // 管理规则\r\n        $(document).off(\"change.CFchooseSheet\").on(\"change.CFchooseSheet\", \"#luckysheet-administerRule-dialog .chooseSheet\", function(){\r\n            let index = $(\"#luckysheet-administerRule-dialog .chooseSheet option:selected\").val();\r\n            _this.getConditionRuleList(index);\r\n        });\r\n        $(document).off(\"click.CFadministerRuleItem\").on(\"click.CFadministerRuleItem\", \"#luckysheet-administerRule-dialog .ruleList .listBox .item\", function(){\r\n            $(this).addClass(\"on\").siblings().removeClass(\"on\");\r\n        });\r\n\r\n        $(document).off(\"click.CFadministerRuleConfirm\").on(\"click.CFadministerRuleConfirm\", \"#luckysheet-administerRule-dialog-confirm\", function(){\r\n            if(!checkProtectionFormatCells(Store.currentSheetIndex)){\r\n                return;\r\n            }\r\n\r\n            //保存之前的规则\r\n            let fileH = $.extend(true, [], Store.luckysheetfile);\r\n            let historyRules = _this.getHistoryRules(fileH);\r\n\r\n            //保存当前的规则\r\n            let fileClone = $.extend(true, [], _this.fileClone);\r\n            for(let c = 0; c < fileClone.length; c++){\r\n                let sheetIndex = fileClone[c][\"index\"];\r\n                Store.luckysheetfile[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"] = fileClone[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"];\r\n            }\r\n\r\n            let fileC = $.extend(true, [], Store.luckysheetfile);\r\n            let currentRules = _this.getCurrentRules(fileC);\r\n\r\n            //刷新一次表格\r\n            _this.ref(historyRules, currentRules);\r\n\r\n            //隐藏一些dom\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-administerRule-dialog\").hide();\r\n\r\n            //发送给后台\r\n            if(server.allowUpdate){\r\n                let files = $.extend(true, [], Store.luckysheetfile);\r\n                for(let i = 0; i < files.length; i++){\r\n                    server.saveParam(\"all\", files[i][\"index\"], files[i][\"luckysheet_conditionformat_save\"], { \"k\": \"luckysheet_conditionformat_save\" });\r\n                }\r\n            }\r\n        });\r\n\r\n        $(document).off(\"click.CFadministerRuleClose\").on(\"click.CFadministerRuleClose\", \"#luckysheet-administerRule-dialog-close\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-administerRule-dialog\").hide();\r\n            _this.fileClone = [];\r\n        });\r\n        $(document).off(\"click.CFadministerRuleFa\").on(\"click.CFadministerRuleFa\", \"#luckysheet-administerRule-dialog .item .fa-table\", function(){\r\n            $(this).parents(\"#luckysheet-administerRule-dialog\").hide();\r\n\r\n            let sheetIndex = $(\"#luckysheet-administerRule-dialog .chooseSheet select option:selected\").val();\r\n            if(sheetIndex != Store.currentSheetIndex){\r\n                sheetmanage.changeSheetExec(sheetIndex);\r\n            }\r\n\r\n            let txt = $(this).siblings(\"input\").val().trim();\r\n            let dataItem = $(this).parents(\".item\").attr(\"data-item\");\r\n\r\n            _this.multiRangeDialog(dataItem, txt);\r\n\r\n            _this.selectRange = [];\r\n\r\n            let range = _this.getRangeByTxt(txt);\r\n            if(range.length > 0){\r\n                for(let s = 0; s < range.length; s++){\r\n                    let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                    let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                    let row = Store.visibledatarow[r2],\r\n                        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                    let col = Store.visibledatacolumn[c2],\r\n                        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                    _this.selectRange.push({\r\n                        \"left\": col_pre,\r\n                        \"width\": col - col_pre - 1,\r\n                        \"top\": row_pre,\r\n                        \"height\": row - row_pre - 1,\r\n                        \"left_move\": col_pre,\r\n                        \"width_move\": col - col_pre - 1,\r\n                        \"top_move\": row_pre,\r\n                        \"height_move\": row - row_pre - 1,\r\n                        \"row\": [r1, r2],\r\n                        \"column\": [c1, c2],\r\n                        \"row_focus\": r1,\r\n                        \"column_focus\": c1\r\n                    });\r\n                }\r\n            }\r\n\r\n            selectionCopyShow(_this.selectRange);\r\n        });\r\n        $(document).off(\"click.CFmultiRangeConfirm\").on(\"click.CFmultiRangeConfirm\", \"#luckysheet-multiRange-dialog-confirm\", function(){\r\n            $(this).parents(\"#luckysheet-multiRange-dialog\").hide();\r\n\r\n            let dataItem = $(this).attr(\"data-item\");\r\n            let v = $(this).parents(\"#luckysheet-multiRange-dialog\").find(\"input\").val();\r\n            $(\"#luckysheet-administerRule-dialog .item[data-item=\"+dataItem+\"] input\").val(v);\r\n\r\n            let sheetIndex = $(\"#luckysheet-administerRule-dialog .chooseSheet option:selected\").val();\r\n            _this.fileClone[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"][dataItem].cellrange = _this.getRangeByTxt(v);\r\n\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-administerRule-dialog\").show();\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        });\r\n        $(document).off(\"click.CFmultiRangeClose\").on(\"click.CFmultiRangeClose\", \"#luckysheet-multiRange-dialog-close\", function(){\r\n            $(this).parents(\"#luckysheet-multiRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-administerRule-dialog\").show();\r\n\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        });\r\n\r\n        // 新建规则\r\n        $(document).off(\"click.CFnewConditionRule\").on(\"click.CFnewConditionRule\", \"#newConditionRule\", function(){\r\n            let sheetIndex = $(\"#luckysheet-administerRule-dialog .chooseSheet option:selected\").val();\r\n            if(!checkProtectionFormatCells(sheetIndex)){\r\n                return;\r\n            }\r\n\r\n            if(Store.luckysheet_select_save.length == 0){\r\n                if(isEditMode()){\r\n                    alert(conditionformat_Text.pleaseSelectRange);\r\n                }\r\n                else{\r\n                    tooltip.info(conditionformat_Text.pleaseSelectRange, \"\");\r\n                }\r\n                return;\r\n            }\r\n\r\n            _this.newConditionRuleDialog(1);\r\n        });\r\n        $(document).off(\"click.CFnewConditionRuleConfirm\").on(\"click.CFnewConditionRuleConfirm\", \"#luckysheet-newConditionRule-dialog-confirm\", function(){\r\n\r\n            if(!checkProtectionFormatCells(Store.currentSheetIndex)){\r\n                return;\r\n            }\r\n\r\n            let index = $(\"#luckysheet-newConditionRule-dialog .ruleTypeItem.on\").index();\r\n            let type1 = $(\"#luckysheet-newConditionRule-dialog #type1 option:selected\").val();\r\n            let type2 = $(\"#luckysheet-newConditionRule-dialog .\" + type1 + \"Box #type2 option:selected\").val();\r\n\r\n            let format, rule;\r\n            if(index == 0){\r\n                if(type1 == \"dataBar\"){ //数据条\r\n                    let color = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".dataBarBox .luckysheet-conditionformat-config-color\").spectrum(\"get\").toHexString();\r\n\r\n                    if(type2 == \"gradient\"){ //渐变填充\r\n                        format = [color, \"#ffffff\"];\r\n                    }\r\n                    else if(type2 == \"solid\"){ //实心填充\r\n                        format = [color];\r\n                    }\r\n\r\n                    rule = {\r\n                        \"type\": \"dataBar\",\r\n                        \"cellrange\": $.extend(true, [], Store.luckysheet_select_save),\r\n                        \"format\": format\r\n                    };\r\n                }\r\n                else if(type1 == \"colorGradation\"){ //色阶\r\n                    let maxcolor = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".colorGradationBox .maxVal .luckysheet-conditionformat-config-color\").spectrum(\"get\").toRgbString();\r\n                    let midcolor = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".colorGradationBox .midVal .luckysheet-conditionformat-config-color\").spectrum(\"get\").toRgbString();\r\n                    let mincolor = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".colorGradationBox .minVal .luckysheet-conditionformat-config-color\").spectrum(\"get\").toRgbString();\r\n\r\n                    if(type2 == \"threeColor\"){ //三色\r\n                        format = [maxcolor, midcolor, mincolor];\r\n                    }\r\n                    else if(type2 == \"twoColor\"){ //双色\r\n                        format = [maxcolor, mincolor];\r\n                    }\r\n\r\n                    rule = {\r\n                        \"type\": \"colorGradation\",\r\n                        \"cellrange\": $.extend(true, [], Store.luckysheet_select_save),\r\n                        \"format\": format\r\n                    };\r\n                }\r\n                else if(type1 == \"icons\"){ //图标集\r\n                    let len = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".iconsBox .model\").attr(\"data-len\");\r\n                    let leftMin = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".iconsBox .model\").attr(\"data-leftmin\");\r\n                    let top = $(this).parents(\"#luckysheet-newConditionRule-dialog\").find(\".iconsBox .model\").attr(\"data-top\");\r\n\r\n                    format = {\r\n                        \"len\": len,\r\n                        \"leftMin\": leftMin,\r\n                        \"top\": top\r\n                    };\r\n\r\n                    rule = {\r\n                        \"type\": \"icons\",\r\n                        \"cellrange\": $.extend(true, [], Store.luckysheet_select_save),\r\n                        \"format\": format\r\n                    };\r\n                }\r\n            }\r\n            else{\r\n                let conditionName = \"\", conditionRange = [], conditionValue = [];\r\n\r\n                if(index == 1){\r\n                    if(type1 == \"number\"){ //单元格值\r\n                        conditionName = type2;\r\n\r\n                        if(type2 == \"betweenness\"){\r\n                            let v1 = $(\"#luckysheet-newConditionRule-dialog #conditionVal input\").val().trim();\r\n                            let v2 = $(\"#luckysheet-newConditionRule-dialog #conditionVal2 input\").val().trim();\r\n\r\n                            //条件值是否是选区\r\n                            let rangeArr1 = _this.getRangeByTxt(v1);\r\n                            if(rangeArr1.length > 1){\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                            else if(rangeArr1.length == 1){\r\n                                let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1];\r\n                                let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1];\r\n\r\n                                if(r1 == r2 && c1 == c2){\r\n                                    v1 = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                    // conditionRange.push({ \"row\": rangeArr1[0].row, \"column\": rangeArr1[0].column });\r\n                                    conditionRange[0] = { \"row\": rangeArr1[0].row, \"column\": rangeArr1[0].column };\r\n                                    conditionValue.push(v1);\r\n                                }\r\n                                else{\r\n                                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                    return;\r\n                                }\r\n                            }\r\n                            else if(rangeArr1.length == 0){\r\n                                if(isNaN(v1) || v1 == \"\"){\r\n                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                    return;\r\n                                }\r\n                                else{\r\n                                    conditionValue.push(v1);\r\n                                }\r\n                            }\r\n\r\n                            let rangeArr2 = _this.getRangeByTxt(v2);\r\n                            if(rangeArr2.length > 1){\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                            else if(rangeArr2.length == 1){\r\n                                let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1];\r\n                                let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1];\r\n\r\n                                if(r1 == r2 && c1 == c2){\r\n                                    v2 = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                    // conditionRange.push({ \"row\": rangeArr2[0].row, \"column\": rangeArr2[0].column });\r\n\r\n                                    // If the first value is a custom value, and the cell range selected by the second value, push will cause the position to be wrong\r\n                                    conditionRange[1] = { \"row\": rangeArr2[0].row, \"column\": rangeArr2[0].column };\r\n                                    conditionValue.push(v2);\r\n                                }\r\n                                else{\r\n                                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                    return;\r\n                                }\r\n                            }\r\n                            else if(rangeArr2.length == 0){\r\n                                if(isNaN(v2) || v2 == \"\"){\r\n                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                    return;\r\n                                }\r\n                                else{\r\n                                    conditionValue.push(v2);\r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            //条件值\r\n                            let v = $(\"#luckysheet-newConditionRule-dialog #conditionVal input\").val().trim();\r\n\r\n                            //条件值是否是选区\r\n                            let rangeArr = _this.getRangeByTxt(v);\r\n                            if(rangeArr.length > 1){\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                            else if(rangeArr.length == 1){\r\n                                let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n                                let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n                                if(r1 == r2 && c1 == c2){\r\n                                    v = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                    conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                                    conditionValue.push(v);\r\n                                }\r\n                                else{\r\n                                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                    return;\r\n                                }\r\n                            }\r\n                            else if(rangeArr.length == 0){\r\n                                if(isNaN(v) || v == \"\"){\r\n                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                    return;\r\n                                }\r\n                                else{\r\n                                    conditionValue.push(v);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(type1 == \"text\"){ //特定文本\r\n                        conditionName = \"textContains\";\r\n\r\n                        //条件值\r\n                        let v = $(\"#luckysheet-newConditionRule-dialog #conditionVal input\").val().trim();\r\n\r\n                        //条件值是否是选区\r\n                        let rangeArr = _this.getRangeByTxt(v);\r\n                        if(rangeArr.length > 1){\r\n                            _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                            return;\r\n                        }\r\n                        else if(rangeArr.length == 1){\r\n                            let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n                            let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n                            if(r1 == r2 && c1 == c2){\r\n                                v = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                                conditionValue.push(v);\r\n                            }\r\n                            else{\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                        }\r\n                        else if(rangeArr.length == 0){\r\n                            if(v == \"\"){\r\n                                _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                return;\r\n                            }\r\n                            else{\r\n                                conditionValue.push(v);\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(type1 == \"date\"){ //发生日期\r\n                        conditionName = \"occurrenceDate\";\r\n\r\n                        //条件值\r\n                        let v = $(\"#luckysheet-newConditionRule-dialog #daterange-btn\").val();\r\n\r\n                        if(v == \"\" || v == null){\r\n                            _this.infoDialog(conditionformat_Text.pleaseSelectADate, \"\");\r\n                            return;\r\n                        }\r\n\r\n                        conditionValue.push(v);\r\n                    }\r\n                }\r\n                else if(index == 2){ //排名靠前靠后\r\n                    //条件名称\r\n                    if(type1 == \"top\"){\r\n                        if($(\"#luckysheet-newConditionRule-dialog #isPercent\").is(\":selected\")){\r\n                            conditionName = \"top10%\";\r\n                        }\r\n                        else{\r\n                            conditionName = \"top10\";\r\n                        }\r\n                    }\r\n                    else if(type1 == \"last\"){\r\n                        if($(\"#luckysheet-newConditionRule-dialog #isPercent\").is(\":selected\")){\r\n                            conditionName = \"last10%\";\r\n                        }\r\n                        else{\r\n                            conditionName = \"last10\";\r\n                        }\r\n                    }\r\n\r\n                    //条件值\r\n                    let v = $(\"#luckysheet-newConditionRule-dialog #conditionVal input\").val().trim();\r\n\r\n                    if(parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000){\r\n                        _this.infoDialog(conditionformat_Text.pleaseEnterInteger, \"\");\r\n                        return;\r\n                    }\r\n\r\n                    conditionValue.push(parseInt(v));\r\n                }\r\n                else if(index == 3){ //平均值\r\n                    if(type1 == \"AboveAverage\"){\r\n                        conditionName = \"AboveAverage\";\r\n                        conditionValue.push(\"AboveAverage\");\r\n                    }\r\n                    else if(type1 == \"SubAverage\"){\r\n                        conditionName = \"SubAverage\";\r\n                        conditionValue.push(\"SubAverage\");\r\n                    }\r\n                }\r\n                else if(index == 4){ //重复值\r\n                    conditionName = \"duplicateValue\";\r\n                    conditionValue.push(type1);\r\n                }\r\n                else if(index == 5){ //公式\r\n                    conditionName = \"formula\";\r\n\r\n                    //条件值\r\n                    let v = $(\"#luckysheet-newConditionRule-dialog #formulaConditionVal input\").val().trim(); \r\n\r\n                    if(v == \"\"){\r\n                        _this.infoDialog(\"Condition value cannot be empty!\", \"\");\r\n                        return;\r\n                    }\r\n\r\n                    conditionValue.push(v);\r\n                }\r\n\r\n                //格式颜色\r\n                let textcolor;\r\n                if($(\"#luckysheet-newConditionRule-dialog #checkTextColor\").is(\":checked\")){\r\n                    textcolor = $(\"#luckysheet-newConditionRule-dialog #textcolorshow\").spectrum(\"get\").toHexString();\r\n                }\r\n                else{\r\n                    textcolor = null;\r\n                }\r\n\r\n                let cellcolor;\r\n                if($(\"#luckysheet-newConditionRule-dialog #checkCellColor\").is(\":checked\")){\r\n                    cellcolor = $(\"#luckysheet-newConditionRule-dialog #cellcolorshow\").spectrum(\"get\").toHexString();\r\n                }\r\n                else{\r\n                    cellcolor = null;\r\n                }\r\n\r\n                format = {\r\n                    \"textColor\": textcolor,\r\n                    \"cellColor\": cellcolor\r\n                };\r\n\r\n                rule = {\r\n                    \"type\": \"default\",\r\n                    \"cellrange\": $.extend(true, [], Store.luckysheet_select_save),\r\n                    \"format\": format,\r\n                    \"conditionName\": conditionName,\r\n                    \"conditionRange\": conditionRange,\r\n                    \"conditionValue\": conditionValue\r\n                };\r\n            }\r\n\r\n            $(\"#luckysheet-newConditionRule-dialog\").hide();\r\n\r\n            //新建规则的入口\r\n            let source = $(this).attr(\"data-source\");\r\n\r\n            if(source == 0){\r\n                $(\"#luckysheet-modal-dialog-mask\").hide();\r\n\r\n                //保存之前的规则\r\n                let fileH = $.extend(true, [], Store.luckysheetfile);\r\n                let historyRules = _this.getHistoryRules(fileH);\r\n\r\n                //保存当前的规则\r\n                let ruleArr = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] == undefined ? [] : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"];\r\n                ruleArr.push(rule);\r\n                Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] = ruleArr;\r\n\r\n                let fileC = $.extend(true, [], Store.luckysheetfile);\r\n                let currentRules = _this.getCurrentRules(fileC);\r\n\r\n                //刷新一次表格\r\n                _this.ref(historyRules, currentRules);\r\n\r\n                //发送给后台\r\n                if(server.allowUpdate){\r\n                    server.saveParam(\"all\", Store.currentSheetIndex, ruleArr, { \"k\": \"luckysheet_conditionformat_save\" });\r\n                }\r\n            }\r\n            else if(source == 1){\r\n                //临时存储新规则\r\n                let ruleArr = !!_this.fileClone[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] ? _this.fileClone[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] : [];\r\n                ruleArr.push(rule);\r\n                _this.fileClone[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] = ruleArr;\r\n\r\n                //新建规则隐藏，管理规则显示\r\n                _this.administerRuleDialog();\r\n            }\r\n        });\r\n        $(document).off(\"click.CFnewConditionRuleClose\").on(\"click.CFnewConditionRuleClose\", \"#luckysheet-newConditionRule-dialog-close\", function(){\r\n            //新建规则的入口\r\n            let source = $(this).attr(\"data-source\");\r\n            if(source == 0){\r\n                $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            }\r\n            if(source == 1){\r\n                $(\"#luckysheet-administerRule-dialog\").show();\r\n            }\r\n\r\n            //新建规则隐藏\r\n            $(\"#luckysheet-newConditionRule-dialog\").hide();\r\n\r\n            //隐藏虚线框\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n        });\r\n\r\n        // 编辑规则\r\n        $(document).off(\"click.CFeditorConditionRule\").on(\"click.CFeditorConditionRule\", \"#editorConditionRule\", function(){\r\n\r\n            let sheetIndex = $(\"#luckysheet-administerRule-dialog .chooseSheet option:selected\").val();\r\n\r\n            if(!checkProtectionFormatCells(sheetIndex)){\r\n                return;\r\n            }\r\n\r\n\r\n            let itemIndex = $(\"#luckysheet-administerRule-dialog .ruleList .listBox .item.on\").attr(\"data-item\");\r\n            let rule = {\r\n                \"sheetIndex\": sheetIndex,\r\n                \"itemIndex\": itemIndex,\r\n                \"data\": _this.fileClone[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"][itemIndex]\r\n            };\r\n            _this.editorRule = rule;\r\n            _this.editorConditionRuleDialog();\r\n        });\r\n        $(document).off(\"click.CFeditorConditionRuleConfirm\").on(\"click.CFeditorConditionRuleConfirm\", \"#luckysheet-editorConditionRule-dialog-confirm\",function(){\r\n            let index = $(\"#luckysheet-editorConditionRule-dialog .ruleTypeItem.on\").index();\r\n            let type1 = $(\"#luckysheet-editorConditionRule-dialog #type1 option:selected\").val();\r\n            let type2 = $(\"#luckysheet-editorConditionRule-dialog .\" + type1 + \"Box #type2 option:selected\").val();\r\n\r\n            let cellrange = _this.editorRule[\"data\"].cellrange;\r\n\r\n            let format, rule;\r\n            if(index == 0){\r\n                if(type1 == \"dataBar\"){ //数据条\r\n                    let color = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".dataBarBox .luckysheet-conditionformat-config-color\").spectrum(\"get\").toHexString();\r\n\r\n                    if(type2 == \"gradient\"){ //渐变填充\r\n                        format = [color, \"#ffffff\"];\r\n                    }\r\n                    else if(type2 == \"solid\"){ //实心填充\r\n                        format = [color];\r\n                    }\r\n\r\n                    rule = {\r\n                        \"type\": \"dataBar\",\r\n                        \"cellrange\": cellrange,\r\n                        \"format\": format\r\n                    };\r\n                }\r\n                else if(type1 == \"colorGradation\"){ //色阶\r\n                    let maxcolor = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".colorGradationBox .maxVal .luckysheet-conditionformat-config-color\").spectrum(\"get\").toRgbString();\r\n                    let midcolor = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".colorGradationBox .midVal .luckysheet-conditionformat-config-color\").spectrum(\"get\").toRgbString();\r\n                    let mincolor = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".colorGradationBox .minVal .luckysheet-conditionformat-config-color\").spectrum(\"get\").toRgbString();\r\n\r\n                    if(type2 == \"threeColor\"){ //三色\r\n                        format = [maxcolor, midcolor, mincolor];\r\n                    }\r\n                    else if(type2 == \"twoColor\"){ //双色\r\n                        format = [maxcolor, mincolor];\r\n                    }\r\n\r\n                    rule = {\r\n                        \"type\": \"colorGradation\",\r\n                        \"cellrange\": cellrange,\r\n                        \"format\": format\r\n                    };\r\n                }\r\n                else if(type1 == \"icons\"){ //图标集\r\n                    let len = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".iconsBox .model\").attr(\"data-len\");\r\n                    let leftMin = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".iconsBox .model\").attr(\"data-leftmin\");\r\n                    let top = $(this).parents(\"#luckysheet-editorConditionRule-dialog\").find(\".iconsBox .model\").attr(\"data-top\");\r\n\r\n                    format = {\r\n                        \"len\": len,\r\n                        \"leftMin\": leftMin,\r\n                        \"top\": top\r\n                    };\r\n\r\n                    rule = {\r\n                        \"type\": \"icons\",\r\n                        \"cellrange\": cellrange,\r\n                        \"format\": format\r\n                    };\r\n                }\r\n            }\r\n            else{\r\n                let conditionName = \"\", conditionRange = [], conditionValue = [];\r\n\r\n                if(index == 1){\r\n                    if(type1 == \"number\"){ //单元格值\r\n                        conditionName = type2;\r\n\r\n                        if(type2 == \"betweenness\"){\r\n                            let v1 = $(\"#luckysheet-editorConditionRule-dialog #conditionVal input\").val().trim();\r\n                            let v2 = $(\"#luckysheet-editorConditionRule-dialog #conditionVal2 input\").val().trim();\r\n\r\n                            //条件值是否是选区\r\n                            let rangeArr1 = _this.getRangeByTxt(v1);\r\n                            if(rangeArr1.length > 1){\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                            else if(rangeArr1.length == 1){\r\n                                let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1];\r\n                                let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1];\r\n\r\n                                if(r1 == r2 && c1 == c2){\r\n                                    v1 = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                    // conditionRange.push({ \"row\": rangeArr1[0].row, \"column\": rangeArr1[0].column });\r\n                                    conditionRange[0] = { \"row\": rangeArr1[0].row, \"column\": rangeArr1[0].column };\r\n                                    conditionValue.push(v1);\r\n                                }\r\n                                else{\r\n                                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                    return;\r\n                                }\r\n                            }\r\n                            else if(rangeArr1.length == 0){\r\n                                if(isNaN(v1) || v1 == \"\"){\r\n                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                    return;\r\n                                }\r\n                                else{\r\n                                    conditionValue.push(v1);\r\n                                }\r\n                            }\r\n\r\n                            let rangeArr2 = _this.getRangeByTxt(v2);\r\n                            if(rangeArr2.length > 1){\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                            else if(rangeArr2.length == 1){\r\n                                let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1];\r\n                                let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1];\r\n\r\n                                if(r1 == r2 && c1 == c2){\r\n                                    v2 = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                    // conditionRange.push({ \"row\": rangeArr2[0].row, \"column\": rangeArr2[0].column });\r\n                                    conditionRange[1] = { \"row\": rangeArr2[0].row, \"column\": rangeArr2[0].column };\r\n                                    conditionValue.push(v2);\r\n                                }\r\n                                else{\r\n                                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                    return;\r\n                                }\r\n                            }\r\n                            else if(rangeArr2.length == 0){\r\n                                if(isNaN(v2) || v2 == \"\"){\r\n                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                    return;\r\n                                }\r\n                                else{\r\n                                    conditionValue.push(v2);\r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            //条件值\r\n                            let v = $(\"#luckysheet-editorConditionRule-dialog #conditionVal input\").val().trim();\r\n\r\n                            //条件值是否是选区\r\n                            let rangeArr = _this.getRangeByTxt(v);\r\n                            if(rangeArr.length > 1){\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                            else if(rangeArr.length == 1){\r\n                                let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n                                let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n                                if(r1 == r2 && c1 == c2){\r\n                                    v = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                    conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                                    conditionValue.push(v);\r\n                                }\r\n                                else{\r\n                                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                    return;\r\n                                }\r\n                            }\r\n                            else if(rangeArr.length == 0){\r\n                                if(isNaN(v) || v == \"\"){\r\n                                    _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                    return;\r\n                                }\r\n                                else{\r\n                                    conditionValue.push(v);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(type1 == \"text\"){ //特定文本\r\n                        conditionName = \"textContains\";\r\n\r\n                        //条件值\r\n                        let v = $(\"#luckysheet-editorConditionRule-dialog #conditionVal input\").val().trim();\r\n\r\n                        //条件值是否是选区\r\n                        let rangeArr = _this.getRangeByTxt(v);\r\n                        if(rangeArr.length > 1){\r\n                            _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                            return;\r\n                        }\r\n                        else if(rangeArr.length == 1){\r\n                            let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n                            let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n                            if(r1 == r2 && c1 == c2){\r\n                                v = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                                conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                                conditionValue.push(v);\r\n                            }\r\n                            else{\r\n                                _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                                return;\r\n                            }\r\n                        }\r\n                        else if(rangeArr.length == 0){\r\n                            if(isNaN(v) || v == \"\"){\r\n                                _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                                return;\r\n                            }\r\n                            else{\r\n                                conditionValue.push(v);\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(type1 == \"date\"){ //发生日期\r\n                        conditionName = \"occurrenceDate\";\r\n\r\n                        //条件值\r\n                        let v = $(\"#luckysheet-editorConditionRule-dialog #daterange-btn\").val();\r\n\r\n                        if(v == \"\" || v == null){\r\n                            _this.infoDialog(conditionformat_Text.pleaseSelectADate, \"\");\r\n                            return;\r\n                        }\r\n\r\n                        conditionValue.push(v);\r\n                    }\r\n                }\r\n                else if(index == 2){ //排名靠前靠后\r\n                    //条件名称\r\n                    if(type1 == \"top\"){\r\n                        if($(\"#luckysheet-editorConditionRule-dialog #isPercent\").is(\":selected\")){\r\n                            conditionName = \"top10%\";\r\n                        }\r\n                        else{\r\n                            conditionName = \"top10\";\r\n                        }\r\n                    }\r\n                    else if(type1 == \"last\"){\r\n                        if($(\"#luckysheet-editorConditionRule-dialog #isPercent\").is(\":selected\")){\r\n                            conditionName = \"last10%\";\r\n                        }\r\n                        else{\r\n                            conditionName = \"last10\";\r\n                        }\r\n                    }\r\n\r\n                    //条件值\r\n                    let v = $(\"#luckysheet-editorConditionRule-dialog #conditionVal input\").val().trim();\r\n\r\n                    if(parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000){\r\n                        _this.infoDialog(conditionformat_Text.pleaseEnterInteger, \"\");\r\n                        return;\r\n                    }\r\n\r\n                    conditionValue.push(v);\r\n                }\r\n                else if(index == 3){ //平均值\r\n                    if(type1 == \"AboveAverage\"){\r\n                        conditionName = \"AboveAverage\";\r\n                        conditionValue.push(\"AboveAverage\");\r\n                    }\r\n                    else if(type1 == \"SubAverage\"){\r\n                        conditionName = \"SubAverage\";\r\n                        conditionValue.push(\"SubAverage\");\r\n                    }\r\n                }\r\n                else if(index == 4){ //重复值\r\n                    conditionName = \"duplicateValue\";\r\n                    conditionValue.push(type1);\r\n                }\r\n                else if(index == 5){ //公式\r\n                    conditionName = \"formula\";\r\n\r\n                    //条件值\r\n                    let v = $(\"#luckysheet-editorConditionRule-dialog #formulaConditionVal input\").val().trim(); \r\n                    console.log(v)\r\n                    if(v == \"\"){\r\n                        _this.infoDialog(\"Condition value cannot be empty!\", \"\");\r\n                        return;\r\n                    }\r\n\r\n                    conditionValue.push(v);\r\n                }\r\n\r\n                //格式颜色\r\n                let textcolor;\r\n                if($(\"#luckysheet-editorConditionRule-dialog #checkTextColor\").is(\":checked\")){\r\n                    textcolor = $(\"#luckysheet-editorConditionRule-dialog #textcolorshow\").spectrum(\"get\").toHexString();\r\n                }\r\n                else{\r\n                    textcolor = null;\r\n                }\r\n\r\n                let cellcolor;\r\n                if($(\"#luckysheet-editorConditionRule-dialog #checkCellColor\").is(\":checked\")){\r\n                    cellcolor = $(\"#luckysheet-editorConditionRule-dialog #cellcolorshow\").spectrum(\"get\").toHexString();\r\n                }\r\n                else{\r\n                    cellcolor = null;\r\n                }\r\n\r\n                format = {\r\n                    \"textColor\": textcolor,\r\n                    \"cellColor\": cellcolor\r\n                };\r\n\r\n                rule = {\r\n                    \"type\": \"default\",\r\n                    \"cellrange\": cellrange,\r\n                    \"format\": format,\r\n                    \"conditionName\": conditionName,\r\n                    \"conditionRange\": conditionRange,\r\n                    \"conditionValue\": conditionValue\r\n                };\r\n            }\r\n\r\n            //修改编辑的规则\r\n            let sheetIndex = _this.editorRule[\"sheetIndex\"];\r\n            let itemIndex = _this.editorRule[\"itemIndex\"];\r\n            _this.fileClone[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"][itemIndex] = rule;\r\n\r\n            //编辑规则隐藏，管理规则显示\r\n            $(\"#luckysheet-editorConditionRule-dialog\").hide();\r\n            _this.administerRuleDialog();\r\n        });\r\n        $(document).off(\"click.CFeditorConditionRuleClose\").on(\"click.CFeditorConditionRuleClose\", \"#luckysheet-editorConditionRule-dialog-close\",function(){\r\n            //编辑规则隐藏，管理规则显示\r\n            $(\"#luckysheet-editorConditionRule-dialog\").hide();\r\n            $(\"#luckysheet-administerRule-dialog\").show();\r\n            //隐藏虚线框\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n        });\r\n\r\n        // 新建规则、编辑规则 类型切换\r\n        $(document).off(\"click.CFnewEditorRuleItem\").on(\"click.CFnewEditorRuleItem\", \".luckysheet-newEditorRule-dialog .ruleTypeItem\", function(){\r\n            $(this).addClass(\"on\").siblings().removeClass(\"on\");\r\n\r\n            let index = $(this).index();\r\n            $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\".ruleExplainBox\").html(_this.getRuleExplain(index));\r\n\r\n            _this.colorSelectInit();\r\n        });\r\n        $(document).off(\"change.CFnewEditorRuleType1\").on(\"change.CFnewEditorRuleType1\", \".luckysheet-newEditorRule-dialog #type1\", function(){\r\n            let optionVal = $(this).find(\"option:selected\").val();\r\n\r\n            if(optionVal == \"dataBar\" || optionVal == \"colorGradation\" || optionVal == \"icons\" || optionVal == \"number\" || optionVal == \"text\" || optionVal == \"date\"){\r\n                $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\".\" + optionVal + \"Box\").show().siblings().hide();\r\n            }\r\n\r\n            if(optionVal == \"date\"){\r\n                _this.daterangeInit($(this).parents(\".luckysheet-newEditorRule-dialog\").attr(\"id\"));\r\n            }\r\n        });\r\n        $(document).off(\"change.CFnewEditorRuleType2\").on(\"change.CFnewEditorRuleType2\", \".luckysheet-newEditorRule-dialog #type2\", function(){\r\n            let type1 = $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\"#type1 option:selected\").val();\r\n\r\n            if(type1 == \"colorGradation\"){\r\n                let type2 = $(this).find(\"option:selected\").val();\r\n\r\n                if(type2 == \"threeColor\"){\r\n                    $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\".midVal\").show();\r\n                }\r\n                else{\r\n                    $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\".midVal\").hide();\r\n                }\r\n            }\r\n            else if(type1 == \"number\"){\r\n                let type2 = $(this).find(\"option:selected\").val();\r\n\r\n                if(type2 == \"betweenness\"){\r\n                    $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\".txt\").show();\r\n                    $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\"#conditionVal2\").show();\r\n                }\r\n                else{\r\n                    $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\".txt\").hide();\r\n                    $(this).parents(\".luckysheet-newEditorRule-dialog\").find(\"#conditionVal2\").hide();\r\n                }\r\n            }\r\n        });\r\n        $(document).off(\"click.CFiconsShowbox\").on(\"click.CFiconsShowbox\", \".luckysheet-newEditorRule-dialog .iconsBox .showbox\", function(){\r\n            $(this).parents(\".iconsBox\").find(\"ul\").toggle();\r\n        });\r\n        $(document).off(\"click.CFiconsLi\").on(\"click.CFiconsLi\", \".luckysheet-newEditorRule-dialog .iconsBox li\", function(){\r\n            let len = $(this).find(\"div\").attr(\"data-len\");\r\n            let leftmin = $(this).find(\"div\").attr(\"data-leftmin\");\r\n            let top = $(this).find(\"div\").attr(\"data-top\");\r\n            let title = $(this).find(\"div\").attr(\"title\");\r\n            let position = $(this).find(\"div\").css(\"background-position\");\r\n\r\n            $(this).parents(\".iconsBox\").find(\".showbox .model\").css(\"background-position\", position);\r\n            $(this).parents(\".iconsBox\").find(\".showbox .model\").attr(\"data-len\", len);\r\n            $(this).parents(\".iconsBox\").find(\".showbox .model\").attr(\"data-leftmin\", leftmin);\r\n            $(this).parents(\".iconsBox\").find(\".showbox .model\").attr(\"data-top\", top);\r\n            $(this).parents(\".iconsBox\").find(\".showbox .model\").attr(\"title\", title);\r\n\r\n            $(this).parents(\"ul\").hide();\r\n        });\r\n\r\n        // 删除规则\r\n        $(document).off(\"click.CFdeleteConditionRule\").on(\"click.CFdeleteConditionRule\", \"#deleteConditionRule\", function(){\r\n            let sheetIndex = $(\"#luckysheet-administerRule-dialog .chooseSheet option:selected\").val();\r\n\r\n            if(!checkProtectionFormatCells(sheetIndex)){\r\n                return;\r\n            }\r\n\r\n            let itemIndex = $(\"#luckysheet-administerRule-dialog .ruleList .listBox .item.on\").attr(\"data-item\");\r\n            _this.fileClone[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"].splice(itemIndex, 1);\r\n            _this.administerRuleDialog();\r\n        });\r\n\r\n        // 规则子菜单弹出层 点击确定修改样式\r\n        $(document).off(\"click.CFdefault\").on(\"click.CFdefault\", \"#luckysheet-conditionformat-dialog-confirm\", function(){\r\n\r\n            if(!checkProtectionFormatCells(Store.currentSheetIndex)){\r\n                return;\r\n            }\r\n\r\n            //条件名称\r\n            let conditionName = $(\"#luckysheet-conditionformat-dialog .box\").attr(\"data-itemvalue\");\r\n\r\n            //条件单元格\r\n            let conditionRange = [];\r\n\r\n            //条件值\r\n            let conditionValue = [];\r\n            if(conditionName == \"greaterThan\" || conditionName == \"lessThan\" || conditionName == \"equal\" || conditionName == \"textContains\"){\r\n                let v = $(\"#luckysheet-conditionformat-dialog #conditionVal\").val().trim();\r\n\r\n                //条件值是否是选区\r\n                let rangeArr = _this.getRangeByTxt(v);\r\n                if(rangeArr.length > 1){\r\n                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                    return;\r\n                }\r\n                else if(rangeArr.length == 1){\r\n                    let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n                    let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n                    if(r1 == r2 && c1 == c2){\r\n                        v = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                        conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                        conditionValue.push(v);\r\n                    }\r\n                    else{\r\n                        _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                        return;\r\n                    }\r\n                }\r\n                else if(rangeArr.length == 0){\r\n                    if(isNaN(v) || v == \"\"){\r\n                        _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                        return;\r\n                    }\r\n                    else{\r\n                        conditionValue.push(v);\r\n                    }\r\n                }\r\n            }\r\n            else if(conditionName == \"betweenness\"){//介于\r\n                let v1 = $(\"#luckysheet-conditionformat-dialog #conditionVal\").val().trim();\r\n                let v2 = $(\"#luckysheet-conditionformat-dialog #conditionVal2\").val().trim();\r\n\r\n                //条件值是否是选区\r\n                let rangeArr1 = _this.getRangeByTxt(v1);\r\n                if(rangeArr1.length > 1){\r\n                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                    return;\r\n                }\r\n                else if(rangeArr1.length == 1){\r\n                    let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1];\r\n                    let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1];\r\n\r\n                    if(r1 == r2 && c1 == c2){\r\n                        v1 = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                        // conditionRange.push({ \"row\": rangeArr1[0].row, \"column\": rangeArr1[0].column });\r\n                        conditionRange[0] = { \"row\": rangeArr1[0].row, \"column\": rangeArr1[0].column };\r\n                        conditionValue.push(v1);\r\n                    }\r\n                    else{\r\n                        _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                        return;\r\n                    }\r\n                }\r\n                else if(rangeArr1.length == 0){\r\n                    if(isNaN(v1) || v1 == \"\"){\r\n                        _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                        return;\r\n                    }\r\n                    else{\r\n                        conditionValue.push(v1);\r\n                    }\r\n                }\r\n\r\n                let rangeArr2 = _this.getRangeByTxt(v2);\r\n                if(rangeArr2.length > 1){\r\n                    _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                    return;\r\n                }\r\n                else if(rangeArr2.length == 1){\r\n                    let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1];\r\n                    let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1];\r\n\r\n                    if(r1 == r2 && c1 == c2){\r\n                        v2 = getcellvalue(r1, c1, Store.flowdata);\r\n\r\n                        // conditionRange.push({ \"row\": rangeArr2[0].row, \"column\": rangeArr2[0].column });\r\n                        conditionRange[1] = { \"row\": rangeArr2[0].row, \"column\": rangeArr2[0].column };\r\n                        conditionValue.push(v2);\r\n                    }\r\n                    else{\r\n                        _this.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                        return;\r\n                    }\r\n                }\r\n                else if(rangeArr2.length == 0){\r\n                    if(isNaN(v2) || v2 == \"\"){\r\n                        _this.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                        return;\r\n                    }\r\n                    else{\r\n                        conditionValue.push(v2);\r\n                    }\r\n                }\r\n            }\r\n            else if(conditionName == \"occurrenceDate\"){//日期\r\n                let v = $(\"#luckysheet-conditionformat-dialog #daterange-btn\").val();\r\n\r\n                if(v == \"\" || v == null){\r\n                    _this.infoDialog(conditionformat_Text.pleaseSelectADate, \"\");\r\n                    return;\r\n                }\r\n\r\n                conditionValue.push(v);\r\n            }\r\n            else if(conditionName == \"duplicateValue\"){//重复值\r\n                conditionValue.push($(\"#luckysheet-conditionformat-dialog #conditionVal option:selected\").val());\r\n            }\r\n            else if(conditionName == \"top10\" || conditionName == \"top10%\" || conditionName == \"last10\" || conditionName == \"last10%\"){\r\n                let v = $(\"#luckysheet-conditionformat-dialog #conditionVal\").val().trim();\r\n\r\n                if(parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000){\r\n                    _this.infoDialog(conditionformat_Text.pleaseEnterInteger, \"\");\r\n                    return;\r\n                }\r\n\r\n                conditionValue.push(v);\r\n            }\r\n            else if(conditionName == \"AboveAverage\"){ //高于平均值\r\n                conditionValue.push(\"AboveAverage\");\r\n            }\r\n            else if(conditionName == \"SubAverage\"){ //低于平均值\r\n                conditionValue.push(\"SubAverage\");\r\n            }\r\n\r\n            //格式颜色\r\n            let textcolor;\r\n            if($(\"#checkTextColor\").is(\":checked\")){\r\n                textcolor = $(\"#textcolorshow\").spectrum(\"get\").toHexString();\r\n            }\r\n            else{\r\n                textcolor = null;\r\n            }\r\n\r\n            let cellcolor;\r\n            if($(\"#checkCellColor\").is(\":checked\")){\r\n                cellcolor = $(\"#cellcolorshow\").spectrum(\"get\").toHexString();\r\n            }\r\n            else{\r\n                cellcolor = null;\r\n            }\r\n\r\n            //保存之前的规则\r\n            let fileH = $.extend(true, [], Store.luckysheetfile);\r\n            let historyRules = _this.getHistoryRules(fileH);\r\n\r\n            //保存当前的规则\r\n            let rule = {\r\n                \"type\": \"default\",\r\n                \"cellrange\": $.extend(true, [], Store.luckysheet_select_save),\r\n                \"format\": {\r\n                    \"textColor\": textcolor,\r\n                    \"cellColor\": cellcolor\r\n                },\r\n                \"conditionName\": conditionName,\r\n                \"conditionRange\": conditionRange,\r\n                \"conditionValue\": conditionValue\r\n            };\r\n            let ruleArr = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] == undefined ? [] : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"];\r\n            ruleArr.push(rule);\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] = ruleArr;\r\n\r\n            let fileC = $.extend(true, [], Store.luckysheetfile);\r\n            let currentRules = _this.getCurrentRules(fileC);\r\n\r\n            //刷新一次表格\r\n            _this.ref(historyRules, currentRules);\r\n\r\n            //隐藏一些dom\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-conditionformat-dialog\").hide();\r\n\r\n            //发送给后台\r\n            if(server.allowUpdate){\r\n                server.saveParam(\"all\", Store.currentSheetIndex, ruleArr, { \"k\": \"luckysheet_conditionformat_save\" });\r\n            }\r\n        });\r\n\r\n        // 图标集弹出层 选择\r\n        $(document).off(\"click.CFicons\").on(\"click.CFicons\", \"#luckysheet-CFicons-dialog .item\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-CFicons-dialog\").hide();\r\n\r\n            if(Store.luckysheet_select_save.length > 0){\r\n                let cellrange = $.extend(true, [], Store.luckysheet_select_save);\r\n                let format = {\r\n                    \"len\": $(this).attr(\"data-len\"),\r\n                    \"leftMin\": $(this).attr(\"data-leftMin\"),\r\n                    \"top\": $(this).attr(\"data-top\")\r\n                }\r\n\r\n                _this.updateItem(\"icons\", cellrange, format);\r\n            }\r\n        });\r\n\r\n        // 选择单元格\r\n        $(document).on(\"click\", \".range .fa-table\", function(){\r\n            let id = $(this).parents(\".luckysheet-modal-dialog\").attr(\"id\");\r\n            $(\"#\" + id).hide();\r\n            //入口\r\n            let source;\r\n            \r\n            if(id == \"luckysheet-conditionformat-dialog\"){\r\n                let $id = $(this).siblings(\"input\").attr(\"id\");\r\n                \r\n                if($id == \"conditionVal\"){\r\n                    source = \"0_1\";\r\n                }\r\n                else{\r\n                    source = \"0_2\";\r\n                }\r\n            }\r\n            else if(id == \"luckysheet-newConditionRule-dialog\"){\r\n                let $id = $(this).parents(\".range\").attr(\"id\");\r\n\r\n                if($id == \"formulaConditionVal\"){\r\n                    source = \"1_0\";\r\n                }\r\n                else if($id == \"conditionVal\"){\r\n                    source = \"1_1\";\r\n                }\r\n                else{\r\n                    source = \"1_2\";\r\n                }\r\n            }\r\n            else if(id == \"luckysheet-editorConditionRule-dialog\"){\r\n                let $id = $(this).parents(\".range\").attr(\"id\");\r\n\r\n                if($id == \"formulaConditionVal\"){\r\n                    source = \"2_0\";\r\n                }\r\n                else if($id == \"conditionVal\"){\r\n                    source = \"2_1\";\r\n                }\r\n                else{\r\n                    source = \"2_2\";\r\n                }\r\n            }\r\n            //input值\r\n            let v = $(this).siblings(\"input\").val();\r\n\r\n            _this.singleRangeDialog(source, v);\r\n            selectionCopyShow(_this.getRangeByTxt(v));\r\n        });\r\n        $(document).on(\"click\", \"#luckysheet-singleRange-dialog-confirm\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(this).parents(\"#luckysheet-singleRange-dialog\").hide();\r\n\r\n            let source = $(this).attr(\"data-source\");\r\n            let v = $(this).parents(\"#luckysheet-singleRange-dialog\").find(\"input\").val();\r\n\r\n            if(source == \"0_1\"){\r\n                $(\"#luckysheet-conditionformat-dialog\").show();\r\n                $(\"#luckysheet-conditionformat-dialog #conditionVal\").val(v);\r\n            }\r\n            else if(source == \"0_2\"){\r\n                $(\"#luckysheet-conditionformat-dialog\").show();\r\n                $(\"#luckysheet-conditionformat-dialog #conditionVal2\").val(v);\r\n            }\r\n            else if(source == \"1_0\"){\r\n                $(\"#luckysheet-newConditionRule-dialog\").show();\r\n                $(\"#luckysheet-newConditionRule-dialog #formulaConditionVal input\").val(v);\r\n            }\r\n            else if(source == \"1_1\"){\r\n                $(\"#luckysheet-newConditionRule-dialog\").show();\r\n                $(\"#luckysheet-newConditionRule-dialog #conditionVal input\").val(v);\r\n            }\r\n            else if(source == \"1_2\"){\r\n                $(\"#luckysheet-newConditionRule-dialog\").show();\r\n                $(\"#luckysheet-newConditionRule-dialog #conditionVal2 input\").val(v);\r\n            }\r\n            else if(source == \"2_0\"){\r\n                $(\"#luckysheet-editorConditionRule-dialog\").show();\r\n                $(\"#luckysheet-editorConditionRule-dialog #formulaConditionVal input\").val(v);\r\n            }\r\n            else if(source == \"2_1\"){\r\n                $(\"#luckysheet-editorConditionRule-dialog\").show();\r\n                $(\"#luckysheet-editorConditionRule-dialog #conditionVal input\").val(v);\r\n            }\r\n            else if(source == \"2_2\"){\r\n                $(\"#luckysheet-editorConditionRule-dialog\").show();\r\n                $(\"#luckysheet-editorConditionRule-dialog #conditionVal2 input\").val(v);\r\n            }\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        });\r\n        $(document).on(\"click\", \"#luckysheet-singleRange-dialog-close\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(this).parents(\"#luckysheet-singleRange-dialog\").hide();\r\n\r\n            let source = $(this).attr(\"data-source\");\r\n            if(source == \"0_1\" || source == \"0_2\"){\r\n                $(\"#luckysheet-conditionformat-dialog\").show();\r\n            }\r\n            else if(source == \"1_0\" || source == \"1_1\" || source == \"1_2\"){\r\n                $(\"#luckysheet-newConditionRule-dialog\").show();\r\n            }\r\n            else if(source == \"2_0\" || source == \"2_1\" || source == \"2_2\"){\r\n                $(\"#luckysheet-editorConditionRule-dialog\").show();\r\n            }\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        });\r\n\r\n        // 弹出层右上角关闭按钮\r\n        $(document).on(\"click\", \".luckysheet-modal-dialog-title-close\", function(){\r\n            let id = $(this).parents(\".luckysheet-modal-dialog\").attr(\"id\");\r\n\r\n            //新建规则弹出层\r\n            if(id == \"luckysheet-newConditionRule-dialog\"){\r\n                let source = $(\"#\" + id).find(\"#luckysheet-newConditionRule-dialog-close\").attr(\"data-source\");\r\n                //新建规则入口\r\n                if(source == 1){\r\n                    $(\"#luckysheet-administerRule-dialog\").show();\r\n                }\r\n            }\r\n\r\n            //编辑规则弹出层\r\n            if(id == \"luckysheet-editorConditionRule-dialog\"){\r\n                $(\"#luckysheet-administerRule-dialog\").show();\r\n            }\r\n\r\n            //选择单元格弹出层\r\n            if(id == \"luckysheet-singleRange-dialog\"){\r\n                $(\"#luckysheet-modal-dialog-mask\").show();\r\n\r\n                let source = $(this).parents(\"#luckysheet-singleRange-dialog\").find(\"#luckysheet-singleRange-dialog-confirm\").attr(\"data-source\");\r\n                if(source == \"0_1\" || source == \"0_2\"){\r\n                    $(\"#luckysheet-conditionformat-dialog\").show();\r\n                }\r\n                else if(source == \"1_1\" || source == \"1_2\"){\r\n                    $(\"#luckysheet-newConditionRule-dialog\").show();\r\n                }\r\n                else if(source == \"2_1\" || source == \"2_2\"){\r\n                    $(\"#luckysheet-editorConditionRule-dialog\").show();\r\n                }\r\n\r\n                let range = [];\r\n                selectionCopyShow(range);\r\n            }\r\n\r\n            //选择应用范围弹出层\r\n            if(id == \"luckysheet-multiRange-dialog\"){\r\n                $(\"#luckysheet-modal-dialog-mask\").show();\r\n\r\n                $(\"#luckysheet-administerRule-dialog\").show();\r\n\r\n                let range = [];\r\n                selectionCopyShow(range);\r\n            }\r\n\r\n            //提示框\r\n            if(id == \"luckysheet-conditionformat-info-dialog\"){\r\n                $(\"#luckysheet-modal-dialog-mask\").show();\r\n            }\r\n        });\r\n\r\n        //提示框\r\n        $(document).on(\"click\", \"#luckysheet-conditionformat-info-dialog-close\", function(){\r\n            $(this).parents(\"#luckysheet-conditionformat-info-dialog\").hide();\r\n        });\r\n    },\r\n    singleRangeDialog: function(source, value){\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-singleRange-dialog\").remove();\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-singleRange-dialog\",\r\n            \"addclass\": \"luckysheet-singleRange-dialog\",\r\n            \"title\": conditionformat_Text.selectCell,\r\n            \"content\": `<input readonly=\"readonly\" placeholder=\"${conditionformat_Text.pleaseSelectCell}\" value=\"${value}\"/>`,\r\n            \"botton\":  `<button id=\"luckysheet-singleRange-dialog-confirm\" class=\"btn btn-primary\" data-source=\"${source}\">${conditionformat_Text.confirm}</button>\r\n                        <button id=\"luckysheet-singleRange-dialog-close\" class=\"btn btn-default\" data-source=\"${source}\">${conditionformat_Text.cancel}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-singleRange-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-singleRange-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n    },\r\n    multiRangeDialog: function(dataItem, value){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-multiRange-dialog\").remove();\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-multiRange-dialog\",\r\n            \"addclass\": \"luckysheet-multiRange-dialog\",\r\n            \"title\": conditionformat_Text.selectRange,\r\n            \"content\": `<input readonly=\"readonly\" placeholder=\"${conditionformat_Text.pleaseSelectRange}\" value=\"${value}\"/>`,\r\n            \"botton\":  `<button id=\"luckysheet-multiRange-dialog-confirm\" class=\"btn btn-primary\" data-item=\"${dataItem}\">${conditionformat_Text.confirm}</button>\r\n                        <button id=\"luckysheet-multiRange-dialog-close\" class=\"btn btn-default\">${conditionformat_Text.cancel}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-multiRange-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-multiRange-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n\r\n        selectionCopyShow(_this.getRangeByTxt(value));\r\n    },\r\n    getTxtByRange: function(range){\r\n        if(range.length > 0){\r\n            let txt = [];\r\n\r\n            for(let s = 0; s < range.length; s++){\r\n                let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                txt.push(getRangetxt(Store.currentSheetIndex, { \"row\": [r1, r2], \"column\": [c1, c2] }, Store.currentSheetIndex));\r\n            }\r\n\r\n            return txt.join(\",\");\r\n        }\r\n    },\r\n    getRangeByTxt: function(txt){\r\n        let range = [];\r\n\r\n        txt = txt.toString();\r\n\r\n        if(txt.indexOf(\",\") != -1){\r\n            let arr = txt.split(\",\");\r\n            for(let i = 0; i < arr.length; i++){\r\n                if(formula.iscelldata(arr[i])){\r\n                    range.push(formula.getcellrange(arr[i]));\r\n                }\r\n                else{\r\n                    range = [];\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            if(formula.iscelldata(txt)){\r\n                range.push(formula.getcellrange(txt));\r\n            }\r\n        }\r\n        return range;\r\n    },\r\n    colorSelectInit: function(){\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        $(\".luckysheet-conditionformat-config-color\").spectrum({\r\n            showPalette: true,\r\n            showPaletteOnly:true,\r\n            preferredFormat: \"hex\",\r\n            clickoutFiresChange: false,\r\n            showInitial: true,\r\n            showInput: true,\r\n            // flat: true,\r\n            hideAfterPaletteSelect: true,\r\n            showSelectionPalette: true,\r\n            // showButtons: false,//隐藏选择取消按钮\r\n            maxPaletteSize: 8,\r\n            maxSelectionSize: 8,\r\n            // color: currenColor,\r\n            cancelText: conditionformat_Text.cancel,\r\n            chooseText: conditionformat_Text.confirmColor,\r\n            togglePaletteMoreText: \"自定义\",\r\n            togglePaletteLessText: \"收起\",\r\n            togglePaletteOnly: true,\r\n            clearText: conditionformat_Text.clearColorSelect,\r\n            noColorSelectedText: \"没有颜色被选择\",\r\n            localStorageKey: \"spectrum.textcolor\" + server.gridKey,\r\n            palette: [[\"#000\",\"#444\",\"#666\",\"#999\",\"#ccc\",\"#eee\",\"#f3f3f3\",\"#fff\"],\r\n            [\"#f00\",\"#f90\",\"#ff0\",\"#0f0\",\"#0ff\",\"#00f\",\"#90f\",\"#f0f\"],\r\n            [\"#f4cccc\",\"#fce5cd\",\"#fff2cc\",\"#d9ead3\",\"#d0e0e3\",\"#cfe2f3\",\"#d9d2e9\",\"#ead1dc\"],\r\n            [\"#ea9999\",\"#f9cb9c\",\"#ffe599\",\"#b6d7a8\",\"#a2c4c9\",\"#9fc5e8\",\"#b4a7d6\",\"#d5a6bd\"],\r\n            [\"#e06666\",\"#f6b26b\",\"#ffd966\",\"#93c47d\",\"#76a5af\",\"#6fa8dc\",\"#8e7cc3\",\"#c27ba0\"],\r\n            [\"#c00\",\"#e69138\",\"#f1c232\",\"#6aa84f\",\"#45818e\",\"#3d85c6\",\"#674ea7\",\"#a64d79\"],\r\n            [\"#900\",\"#b45f06\",\"#bf9000\",\"#38761d\",\"#134f5c\",\"#0b5394\",\"#351c75\",\"#741b47\"],\r\n            [\"#600\",\"#783f04\",\"#7f6000\",\"#274e13\",\"#0c343d\",\"#073763\",\"#20124d\",\"#4c1130\"]],\r\n            change: function(color){\r\n                if (color != null) {\r\n                    color = color.toHexString();\r\n                }\r\n            }\r\n        });\r\n    },\r\n    conditionformatDialog: function(title, content){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-conditionformat-dialog\").remove();\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-conditionformat-dialog\",\r\n            \"addclass\": \"luckysheet-conditionformat-dialog\",\r\n            \"title\": title,\r\n            \"content\": content,\r\n            \"botton\":  `<button id=\"luckysheet-conditionformat-dialog-confirm\" class=\"btn btn-primary\">${conditionformat_Text.confirm}</button>\r\n                        <button class=\"btn btn-default luckysheet-model-close-btn\">${conditionformat_Text.cancel}</button>`,\r\n            \"style\": \"z-index:9999\"\r\n        }));\r\n        let $t = $(\"#luckysheet-conditionformat-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-conditionformat-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n\r\n        _this.init();\r\n        _this.colorSelectInit();\r\n\r\n        if(title == locale().conditionformat.conditionformat_occurrenceDate){\r\n            _this.daterangeInit(\"luckysheet-conditionformat-dialog\");\r\n        }\r\n    },\r\n    CFiconsDialog: function(){　\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-CFicons-dialog\").remove();\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        let content =  `<div class=\"box\">\r\n                            <div style=\"margin-bottom: 10px;\">${conditionformat_Text.pleaseSelectIcon}</div>\r\n                            <div class=\"title\">${conditionformat_Text.direction}</div>\r\n                            <div class=\"list\">\r\n                                <div class=\"left\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"0\" title=\"${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})\"><div style=\"background-position:0 0;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"1\" title=\"${conditionformat_Text.threeTriangles}\"><div style=\"background-position:0 -20px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"4\" data-leftMin=\"0\" data-top=\"2\" title=\"${conditionformat_Text.fourWayArrow}(${conditionformat_Text.multicolor})\"><div style=\"background-position:0 -40px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"5\" data-leftMin=\"0\" data-top=\"3\" title=\"${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.multicolor})\"><div style=\"background-position:0 -60px;\"></div></div>\r\n                                </div>\r\n                                <div class=\"right\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"5\" data-top=\"0\" title=\"${conditionformat_Text.threeWayArrow}(${conditionformat_Text.grayColor})\"><div style=\"background-position:-131px 0;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"4\" data-leftMin=\"5\" data-top=\"1\" title=\"${conditionformat_Text.fourWayArrow}(${conditionformat_Text.grayColor})\"><div style=\"background-position:-131px -20px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"5\" data-leftMin=\"5\" data-top=\"2\" title=\"${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.grayColor})\"><div style=\"background-position:-131px -40px;\"></div></div>\r\n                                </div>\r\n                                <div style=\"clear:both;\"></div>\r\n                            </div>\r\n                            <div class=\"title\">${conditionformat_Text.shape}</div>\r\n                            <div class=\"list\">\r\n                                <div class=\"left\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"4\" title=\"${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.rimless})\"><div style=\"background-position:0 -80px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"5\" title=\"${conditionformat_Text.threeSigns}\"><div style=\"background-position:0 -100px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"4\" data-leftMin=\"0\" data-top=\"6\" title=\"${conditionformat_Text.greenRedBlackGradient}\"><div style=\"background-position:0 -120px;\"></div></div>\r\n                                </div>\r\n                                <div class=\"right\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"5\" data-top=\"4\" title=\"${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.bordered})\"><div style=\"background-position:-131px -80px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"4\" data-leftMin=\"5\" data-top=\"5\" title=\"${conditionformat_Text.fourColorTrafficLight}\"><div style=\"background-position:-131px -100px;\"></div></div>\r\n                                </div>\r\n                                <div style=\"clear:both;\"></div>\r\n                            </div>\r\n                            <div class=\"title\">${conditionformat_Text.mark}</div>\r\n                            <div class=\"list\">\r\n                                <div class=\"left\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"7\" title=\"${conditionformat_Text.threeSymbols}(${conditionformat_Text.circled})\"><div style=\"background-position:0 -140px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"8\" title=\"${conditionformat_Text.tricolorFlag}\"><div style=\"background-position:0 -160px;\"></div></div>\r\n                                </div>\r\n                                <div class=\"right\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"5\" data-top=\"7\" title=\"${conditionformat_Text.threeSymbols}(${conditionformat_Text.noCircle})\"><div style=\"background-position:-131px -140px;\"></div></div>\r\n                                </div>\r\n                                <div style=\"clear:both;\"></div>\r\n                            </div>\r\n                            <div class=\"title\">${conditionformat_Text.grade}</div>\r\n                            <div class=\"list\">\r\n                                <div class=\"left\">\r\n                                    <div class=\"item\" data-len=\"3\" data-leftMin=\"0\" data-top=\"9\" title=\"${conditionformat_Text.threeStars}\"><div style=\"background-position:0 -180px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"5\" data-leftMin=\"0\" data-top=\"10\" title=\"${conditionformat_Text.fiveQuadrantDiagram}\"><div style=\"background-position:0 -200px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"5\" data-leftMin=\"0\" data-top=\"11\" title=\"${conditionformat_Text.fiveBoxes}\"><div style=\"background-position:0 -220px;\"></div></div>\r\n                                </div>\r\n                                <div class=\"right\">\r\n                                    <div class=\"item\" data-len=\"4\" data-leftMin=\"5\" data-top=\"9\" title=\"${conditionformat_Text.grade4}\"><div style=\"background-position:-131px -180px;\"></div></div>\r\n                                    <div class=\"item\" data-len=\"5\" data-leftMin=\"5\" data-top=\"10\" title=\"${conditionformat_Text.grade5}\"><div style=\"background-position:-131px -200px;\"></div></div>\r\n                                </div>\r\n                                <div style=\"clear:both;\"></div>\r\n                            </div>\r\n                        </div>`;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-CFicons-dialog\",\r\n            \"addclass\": \"luckysheet-CFicons-dialog\",\r\n            \"title\": conditionformat_Text.icons,\r\n            \"content\": content,\r\n            \"botton\": `<button class=\"btn btn-default luckysheet-model-close-btn\">${conditionformat_Text.close}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-CFicons-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 400)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-CFicons-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n    },\r\n    administerRuleDialog: function(){\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-administerRule-dialog\").remove();\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        //工作表\r\n        let opHtml = '';\r\n        for(let j = 0; j < Store.luckysheetfile.length; j++){\r\n            if(Store.luckysheetfile[j].status == \"1\"){\r\n                opHtml +=  `<option value=\"${Store.luckysheetfile[j][\"index\"]}\" selected=\"selected\">\r\n                                ${conditionformat_Text.currentSheet}：${Store.luckysheetfile[j][\"name\"]}\r\n                            </option>`;\r\n            }\r\n            else{\r\n                opHtml +=  `<option value=\"${Store.luckysheetfile[j][\"index\"]}\">\r\n                                ${conditionformat_Text.sheet}：${Store.luckysheetfile[j][\"name\"]}\r\n                            </option>`;\r\n            }\r\n        }\r\n\r\n        let content =  `<div class=\"chooseSheet\">\r\n                            <label>${conditionformat_Text.showRules}：</label>\r\n                            <select>${opHtml}</select>\r\n                        </div>\r\n                        <div class=\"ruleBox\">\r\n                            <div class=\"ruleBtn\">\r\n                                <button id=\"newConditionRule\" class=\"btn btn-default\">${conditionformat_Text.newRule}</button>\r\n                                <button id=\"editorConditionRule\" class=\"btn btn-default\">${conditionformat_Text.editRule}</button>\r\n                                <button id=\"deleteConditionRule\" class=\"btn btn-default\">${conditionformat_Text.deleteRule}</button>\r\n                            </div>\r\n                            <div class=\"ruleList\">\r\n                                <div class=\"listTitle\">\r\n                                    <span>${conditionformat_Text.rule}</span>\r\n                                    <span>${conditionformat_Text.format}</span>\r\n                                    <span>${conditionformat_Text.applyRange}</span>\r\n                                </div>\r\n                                <div class=\"listBox\"></div>\r\n                            </div>\r\n                        </div>`;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-administerRule-dialog\",\r\n            \"addclass\": \"luckysheet-administerRule-dialog\",\r\n            \"title\": conditionformat_Text.conditionformatManageRules,\r\n            \"content\": content,\r\n            \"botton\":  `<button id=\"luckysheet-administerRule-dialog-confirm\" class=\"btn btn-primary\">${conditionformat_Text.confirm}</button>\r\n                        <button id=\"luckysheet-administerRule-dialog-close\" class=\"btn btn-default\">${conditionformat_Text.close}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-administerRule-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 400)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-administerRule-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n\r\n        //当前工作表的规则列表\r\n        let index = $(\"#luckysheet-administerRule-dialog .chooseSheet option:selected\").val();\r\n        this.getConditionRuleList(index);\r\n    },\r\n    getConditionRuleList: function(index){\r\n\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-administerRule-dialog .ruleList .listBox\").empty();\r\n\r\n        let ruleArr = _this.fileClone[getSheetIndex(index)].luckysheet_conditionformat_save; //条件格式规则集合\r\n        if(ruleArr != null && ruleArr.length > 0){\r\n            const conditionformat_Text = locale().conditionformat;\r\n\r\n            for(let i = 0; i < ruleArr.length; i++){\r\n                let type = ruleArr[i][\"type\"];            //规则类型\r\n                let format = ruleArr[i][\"format\"];        //规则样式\r\n                let cellrange = ruleArr[i][\"cellrange\"];  //规则应用范围\r\n\r\n                let ruleName;         //规则名称\r\n                let formatHtml = '';  //样式dom\r\n                if(type == \"dataBar\"){\r\n                    ruleName = conditionformat_Text.dataBar;\r\n\r\n                    formatHtml = '<canvas width=\"46\" height=\"18\" style=\"width: 46px;height: 18px;margin: 3px 0 0 5px;\"></canvas>';\r\n                }\r\n                else if(type == \"colorGradation\"){\r\n                    ruleName = conditionformat_Text.colorGradation;\r\n\r\n                    formatHtml = '<canvas width=\"46\" height=\"18\" style=\"width: 46px;height: 18px;margin: 3px 0 0 5px;\"></canvas>';\r\n                }\r\n                else if(type == \"icons\"){\r\n                    ruleName = conditionformat_Text.icons;\r\n\r\n                    formatHtml = '<canvas width=\"46\" height=\"18\" style=\"width: 46px;height: 18px;margin: 3px 0 0 5px;\"></canvas>';\r\n                }\r\n                else{\r\n                    ruleName = _this.getConditionRuleName(ruleArr[i].conditionName, ruleArr[i].conditionRange, ruleArr[i].conditionValue);\r\n\r\n                    if(format[\"textColor\"] != null){\r\n                        formatHtml += '<span class=\"colorbox\" title=\"'+ conditionformat_Text.textColor +'\" style=\"background-color:' + format[\"textColor\"] + '\"></span>';\r\n                    }\r\n\r\n                    if(format[\"cellColor\"] != null){\r\n                        formatHtml += '<span class=\"colorbox\" title=\"'+ conditionformat_Text.cellColor +'\" style=\"background-color:' + format[\"cellColor\"] + '\"></span>';\r\n                    }\r\n                }\r\n\r\n                //应用范围dom\r\n                let rangeTxtArr = [];\r\n                for(let s = 0; s < cellrange.length; s++){\r\n                    let r1 = cellrange[s].row[0], r2 = cellrange[s].row[1];\r\n                    let c1 = cellrange[s].column[0], c2 = cellrange[s].column[1];\r\n\r\n                    rangeTxtArr.push(chatatABC(c1) + (r1 + 1) + \":\" + chatatABC(c2) + (r2 + 1));\r\n                }\r\n\r\n                //条件格式规则列表dom\r\n                let itemHtml =  '<div class=\"item\" data-item=\"' + i + '\">' +\r\n                                    '<div class=\"ruleName\" title=\"' + ruleName + '\">' + ruleName + '</div>' +\r\n                                    '<div class=\"format\">' + formatHtml + '</div>' +\r\n                                    '<div class=\"ruleRange\">' +\r\n                                        '<input class=\"formulaInputFocus\" readonly=\"true\" value=\"' + rangeTxtArr.join(\",\") + '\"/>' +\r\n                                        '<i class=\"fa fa-table\" aria-hidden=\"true\" title=\"'+ conditionformat_Text.selectRange +'\"></i>' +\r\n                                    '</div>' +\r\n                                '</div>';\r\n\r\n                $(\"#luckysheet-administerRule-dialog .ruleList .listBox\").prepend(itemHtml);\r\n            }\r\n\r\n            $(\"#luckysheet-administerRule-dialog .ruleList .listBox .item canvas\").each(function(i){\r\n                let x = $(this).closest(\".item\").attr(\"data-item\");\r\n\r\n                let type = ruleArr[x][\"type\"];\r\n                let format = ruleArr[x][\"format\"];\r\n\r\n                let can = $(this).get(0).getContext(\"2d\");\r\n                if(type == \"dataBar\"){\r\n                    if(format.length == 2){\r\n                        let my_gradient = can.createLinearGradient(0, 0, 46, 0);\r\n                        my_gradient.addColorStop(0, format[0]);\r\n                        my_gradient.addColorStop(1, format[1]);\r\n                        can.fillStyle = my_gradient;\r\n                        can.fillRect(0, 0, 46, 18);\r\n\r\n                        can.beginPath();\r\n                        can.moveTo(0, 0);\r\n                        can.lineTo(0, 18);\r\n                        can.lineTo(46, 18);\r\n                        can.lineTo(46, 0);\r\n                        can.lineTo(0, 0);\r\n                        can.lineWidth = Store.devicePixelRatio;\r\n                        can.strokeStyle = format[0];\r\n                        can.stroke();\r\n                        can.closePath();\r\n                    }\r\n                    else if(format.length == 1){\r\n                        can.fillStyle = format[0];\r\n                        can.fillRect(0, 0, 46, 18);\r\n\r\n                        can.beginPath();\r\n                        can.moveTo(0, 0);\r\n                        can.lineTo(0, 18);\r\n                        can.lineTo(46, 18);\r\n                        can.lineTo(46, 0);\r\n                        can.lineTo(0, 0);\r\n                        can.lineWidth = Store.devicePixelRatio;\r\n                        can.strokeStyle = format[0];\r\n                        can.stroke();\r\n                        can.closePath();\r\n                    }\r\n                }\r\n                else if(type == \"colorGradation\"){\r\n                    let my_gradient = can.createLinearGradient(0, 0, 46, 0);\r\n\r\n                    if(format.length == 3){\r\n                        my_gradient.addColorStop(0, format[0]);\r\n                        my_gradient.addColorStop(0.5, format[1]);\r\n                        my_gradient.addColorStop(1, format[2]);\r\n                    }\r\n                    else if(format.length == 2){\r\n                        my_gradient.addColorStop(0, format[0]);\r\n                        my_gradient.addColorStop(1, format[1]);\r\n                    }\r\n\r\n                    can.fillStyle = my_gradient;\r\n                    can.fillRect(0, 0, 46, 18);\r\n                }\r\n                else if(type == \"icons\"){\r\n                    let len = format[\"len\"];\r\n                    let l = format[\"leftMin\"];\r\n                    let t = format[\"top\"];\r\n\r\n                    let w1 = 32 * len + 10 * (len - 1);\r\n                    let h1 = 32;\r\n                    let w2 = 46;\r\n                    let h2 = 46 * 32 / w1;\r\n\r\n                    if(l == \"0\"){\r\n                        can.drawImage(luckysheet_CFiconsImg, 0, t * 32, w1, h1, 0, (18 - h2) / 2, w2, h2);\r\n                    }\r\n                    else if(l == \"5\"){\r\n                        can.drawImage(luckysheet_CFiconsImg, 210, t * 32, w1, h1, 0, (18 - h2) / 2, w2, h2);\r\n                    }\r\n                }\r\n            })\r\n\r\n            $(\"#luckysheet-administerRule-dialog .ruleList .listBox .item\").eq(0).addClass(\"on\");\r\n        }\r\n    },\r\n    getConditionRuleName: function(conditionName, conditionRange, conditionValue){\r\n        //v 有条件单元格取条件单元格，若无取条件值\r\n        let v\r\n        if(conditionRange[0]!=null){\r\n            v = chatatABC(conditionRange[0][\"column\"][0]) + (conditionRange[0][\"row\"][0] + 1);\r\n        }\r\n        else{\r\n            v = conditionValue[0];\r\n        }\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        //返回条件格式规则名称\r\n        if(conditionName == \"greaterThan\"){\r\n            return conditionformat_Text.cellValue + \" > \" + v;\r\n        }\r\n        else if(conditionName == \"lessThan\"){\r\n            return conditionformat_Text.cellValue + \" < \" + v;\r\n        }\r\n        else if(conditionName == \"betweenness\"){\r\n            let v2;\r\n            if(conditionRange[1] != null){\r\n                v2 = chatatABC(conditionRange[1][\"column\"][0]) + (conditionRange[1][\"row\"][0] + 1);\r\n            }\r\n            else{\r\n                v2 = conditionValue[1];\r\n            }\r\n            return conditionformat_Text.cellValue + \" \" + conditionformat_Text.between + \" \" + v + \" \" + conditionformat_Text.in + \" \" + v2 + \" \" + conditionformat_Text.between2;\r\n        }\r\n        else if(conditionName == \"equal\"){\r\n            return conditionformat_Text.cellValue + \" = \" + v;\r\n        }\r\n        else if(conditionName == \"textContains\"){\r\n            return conditionformat_Text.cellValue + conditionformat_Text.contain + \" =\" + v;\r\n        }\r\n        else if(conditionName == \"occurrenceDate\"){\r\n            return conditionValue;\r\n        }\r\n        else if(conditionName == \"duplicateValue\"){\r\n            if(conditionValue == \"0\"){\r\n                return conditionformat_Text.duplicateValue;\r\n            }\r\n            if(conditionValue == \"1\"){\r\n                return conditionformat_Text.uniqueValue;\r\n            }\r\n        }\r\n        else if(conditionName == \"top10\"){\r\n            return conditionformat_Text.top + \" \" + v + \" \" + conditionformat_Text.oneself;\r\n        }\r\n        else if(conditionName == \"top10%\"){\r\n            return conditionformat_Text.top + \" \" + v + \"% \" + conditionformat_Text.oneself;\r\n        }\r\n        else if(conditionName == \"last10\"){\r\n            return conditionformat_Text.last + \" \" + v + \" \" + conditionformat_Text.oneself;\r\n        }\r\n        else if(conditionName == \"last10%\"){\r\n            return conditionformat_Text.last + \" \" + v + \"% \" + conditionformat_Text.oneself;\r\n        }\r\n        else if(conditionName == \"AboveAverage\"){\r\n            return conditionformat_Text.aboveAverage;\r\n        }\r\n        else if(conditionName == \"SubAverage\"){\r\n            return conditionformat_Text.belowAverage;\r\n        }\r\n        else if(conditionName == \"formula\"){\r\n            if(v.slice(0, 1) != '='){\r\n                v = '=' + v;\r\n            }\r\n\r\n            return conditionformat_Text.formula + ': ' + v;\r\n        }\r\n    },\r\n    newConditionRuleDialog: function(source){\r\n        let _this = this;\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        //规则说明\r\n        let ruleExplainHtml = _this.getRuleExplain(0);\r\n\r\n        //弹出层\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-administerRule-dialog\").hide();\r\n        $(\"#luckysheet-newConditionRule-dialog\").remove();\r\n\r\n        let content = '<div>' +\r\n                        '<div class=\"boxTitle\">' + conditionformat_Text.chooseRuleType + '：</div>' +\r\n                        _this.ruleTypeHtml() +\r\n                        '<div class=\"boxTitle\">' + conditionformat_Text.editRuleDescription + '：</div>' +\r\n                        '<div class=\"ruleExplainBox\">' +\r\n                            ruleExplainHtml +\r\n                        '</div>' +\r\n                      '</div>';\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-newConditionRule-dialog\",\r\n            \"addclass\": \"luckysheet-newEditorRule-dialog\",\r\n            \"title\": conditionformat_Text.newFormatRule,\r\n            \"content\": content,\r\n            \"botton\":  `<button id=\"luckysheet-newConditionRule-dialog-confirm\" class=\"btn btn-primary\" data-source=\"${source}\">${conditionformat_Text.confirm}</button>\r\n                        <button id=\"luckysheet-newConditionRule-dialog-close\" class=\"btn btn-default\" data-source=\"${source}\">${conditionformat_Text.cancel}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-newConditionRule-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 400)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-newConditionRule-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n\r\n        //index的规则类型focus\r\n        $(\"#luckysheet-newConditionRule-dialog .ruleTypeBox .ruleTypeItem:eq(0)\").addClass(\"on\").siblings().removeClass(\"on\");\r\n\r\n        _this.colorSelectInit();\r\n    },\r\n    editorConditionRuleDialog: function(){\r\n        let _this = this;\r\n\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        let rule = _this.editorRule.data;\r\n\r\n        if(rule == null){\r\n            return;\r\n        }\r\n\r\n        let ruleType = rule[\"type\"],\r\n            ruleFormat = rule[\"format\"],\r\n            conditionName = rule[\"conditionName\"];\r\n\r\n        let index, type1;\r\n        if(ruleType == \"dataBar\" || ruleType == \"colorGradation\" || ruleType == \"icons\"){\r\n            index = 0;\r\n            type1 = ruleType;\r\n        }\r\n        else{\r\n            if(conditionName == \"greaterThan\" || conditionName == \"lessThan\" || conditionName == \"betweenness\" || conditionName == \"equal\" || conditionName == \"textContains\" || conditionName == \"occurrenceDate\"){\r\n                index = 1;\r\n\r\n                if(conditionName == \"greaterThan\" || conditionName == \"lessThan\" || conditionName == \"betweenness\" || conditionName == \"equal\"){\r\n                    type1 = \"number\";\r\n                }\r\n                else if(conditionName == \"textContains\"){\r\n                    type1 = \"text\";\r\n                }\r\n                else if(conditionName == \"occurrenceDate\"){\r\n                    type1 = \"date\";\r\n                }\r\n            }\r\n            else if(conditionName == \"top10\" || conditionName == \"top10%\" || conditionName == \"last10\" || conditionName == \"last10%\"){\r\n                index = 2;\r\n\r\n                if(conditionName == \"top10\" || conditionName == \"top10%\"){\r\n                    type1 = \"top\";\r\n                }\r\n                else if(conditionName == \"last10\" || conditionName == \"last10%\"){\r\n                    type1 = \"last\";\r\n                }\r\n            }\r\n            else if(conditionName == \"AboveAverage\" || conditionName == \"SubAverage\"){\r\n                index = 3;\r\n                type1 = conditionName;\r\n            }\r\n            else if(conditionName == \"duplicateValue\"){\r\n                index = 4;\r\n                type1 = rule[\"conditionValue\"];\r\n            }\r\n            else if(conditionName == \"formula\"){\r\n                index = 5;\r\n            }\r\n        }\r\n\r\n        //规则说明\r\n        let ruleExplainHtml = _this.getRuleExplain(index);\r\n\r\n        //弹出层\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-administerRule-dialog\").hide();\r\n        $(\"#luckysheet-editorConditionRule-dialog\").remove();\r\n\r\n        let content = '<div>' +\r\n                        '<div class=\"boxTitle\">'+ conditionformat_Text.chooseRuleType +'：</div>' +\r\n                        _this.ruleTypeHtml() +\r\n                        '<div class=\"boxTitle\">'+ conditionformat_Text.editRuleDescription +'：</div>' +\r\n                        '<div class=\"ruleExplainBox\">' +\r\n                            ruleExplainHtml +\r\n                        '</div>' +\r\n                      '</div>';\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-editorConditionRule-dialog\",\r\n            \"addclass\": \"luckysheet-newEditorRule-dialog\",\r\n            \"title\": conditionformat_Text.editFormatRule,\r\n            \"content\": content,\r\n            \"botton\":  `<button id=\"luckysheet-editorConditionRule-dialog-confirm\" class=\"btn btn-primary\">${conditionformat_Text.confirm}</button>\r\n                        <button id=\"luckysheet-editorConditionRule-dialog-close\" class=\"btn btn-default\">${conditionformat_Text.cancel}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-editorConditionRule-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 400)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-editorConditionRule-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n\r\n        _this.colorSelectInit();\r\n\r\n        //规则类型focus\r\n        $(\"#luckysheet-editorConditionRule-dialog .ruleTypeBox .ruleTypeItem:eq(\" + index + \")\").addClass(\"on\").siblings().removeClass(\"on\");\r\n\r\n        //type1\r\n        $(\"#luckysheet-editorConditionRule-dialog #type1\").val(type1);\r\n        if(type1 == \"dataBar\" || type1 == \"colorGradation\" || type1 == \"icons\" || type1 == \"number\" || type1 == \"text\" || type1 == \"date\"){\r\n            $(\"#luckysheet-editorConditionRule-dialog .\" + type1 + \"Box\").show();\r\n            $(\"#luckysheet-editorConditionRule-dialog .\" + type1 + \"Box\").siblings().hide();\r\n        }\r\n\r\n        if(type1 == \"date\"){\r\n            _this.daterangeInit(\"luckysheet-editorConditionRule-dialog\");\r\n        }\r\n\r\n        //type2  format  value\r\n        if(ruleType == \"dataBar\" || ruleType == \"colorGradation\" || ruleType == \"icons\"){\r\n            if(type1 == \"dataBar\"){\r\n                if(ruleFormat.length == 2){\r\n                    $(\"#luckysheet-editorConditionRule-dialog .dataBarBox #type2\").val(\"gradient\");\r\n                }\r\n                else if(ruleFormat.length == 1){\r\n                    $(\"#luckysheet-editorConditionRule-dialog .dataBarBox #type2\").val(\"solid\");\r\n                }\r\n\r\n                $(\"#luckysheet-editorConditionRule-dialog .dataBarBox .luckysheet-conditionformat-config-color\").spectrum(\"set\", ruleFormat[0]);\r\n            }\r\n            else if(type1 == \"colorGradation\"){\r\n                if(ruleFormat.length == 3){\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox #type2\").val(\"threeColor\");\r\n\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal\").show();\r\n\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .maxVal .luckysheet-conditionformat-config-color\").spectrum(\"set\", ruleFormat[0]);\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal .luckysheet-conditionformat-config-color\").spectrum(\"set\", ruleFormat[1]);\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .minVal .luckysheet-conditionformat-config-color\").spectrum(\"set\", ruleFormat[2]);\r\n                }\r\n                else if(ruleFormat.length == 2){\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox #type2\").val(\"twoColor\");\r\n\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal\").hide();\r\n\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .maxVal .luckysheet-conditionformat-config-color\").spectrum(\"set\", ruleFormat[0]);\r\n                    $(\"#luckysheet-editorConditionRule-dialog .colorGradationBox .minVal .luckysheet-conditionformat-config-color\").spectrum(\"set\", ruleFormat[1]);\r\n                }\r\n            }\r\n            else if(type1 == \"icons\"){\r\n                let len = ruleFormat[\"len\"];\r\n                let l = ruleFormat[\"leftMin\"];\r\n                let t = ruleFormat[\"top\"];\r\n\r\n                $(\"#luckysheet-editorConditionRule-dialog .iconsBox li\").each(function(i, e){\r\n                    if($(e).find(\"div\").attr(\"data-len\") == len && $(e).find(\"div\").attr(\"data-leftmin\") == l && $(e).find(\"div\").attr(\"data-top\") == t){\r\n                        $(\"#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model\").css(\"background-position\", $(e).find(\"div\").css(\"background-position\"));\r\n                        $(\"#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model\").attr(\"data-len\", $(e).find(\"div\").attr(\"data-len\"));\r\n                        $(\"#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model\").attr(\"data-leftmin\", $(e).find(\"div\").attr(\"data-leftmin\"));\r\n                        $(\"#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model\").attr(\"data-top\", $(e).find(\"div\").attr(\"data-leftmin\"));\r\n                        $(\"#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model\").attr(\"title\", $(e).find(\"div\").attr(\"title\"));\r\n\r\n                        return true;\r\n                    }\r\n                });\r\n            }\r\n        }\r\n        else{\r\n            if(type1 == \"number\"){\r\n                $(\"#luckysheet-editorConditionRule-dialog .numberBox #type2\").val(conditionName);\r\n\r\n                let val1;\r\n                if(rule.conditionRange[0] != null){\r\n                    val1 = getRangetxt(Store.currentSheetIndex, { \"row\": rule.conditionRange[0][\"row\"], \"column\": rule.conditionRange[0][\"column\"] }, Store.currentSheetIndex);\r\n                }\r\n                else{\r\n                    val1 = rule.conditionValue[0];\r\n                }\r\n\r\n                $(\"#luckysheet-editorConditionRule-dialog .numberBox #conditionVal input\").val(val1);\r\n\r\n                if(conditionName == \"betweenness\"){\r\n                    $(\"#luckysheet-editorConditionRule-dialog .numberBox .txt\").show();\r\n                    $(\"#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2\").show();\r\n\r\n                    let val2;\r\n                    if(rule.conditionRange[1] != null){\r\n                        val2 = getRangetxt(Store.currentSheetIndex, { \"row\": rule.conditionRange[1][\"row\"], \"column\": rule.conditionRange[1][\"column\"] }, Store.currentSheetIndex);\r\n                    }\r\n                    else{\r\n                        val2 = rule.conditionValue[1];\r\n                    }\r\n\r\n                    $(\"#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2 input\").val(val2);\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-editorConditionRule-dialog .numberBox .txt\").hide();\r\n                    $(\"#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2\").hide();\r\n                }\r\n            }\r\n            else if(type1 == \"text\"){\r\n                let val1;\r\n                if(rule.conditionRange[0] != null){\r\n                    val1 = getRangetxt(Store.currentSheetIndex, { \"row\": rule.conditionRange[0][\"row\"], \"column\": rule.conditionRange[0][\"column\"] }, Store.currentSheetIndex);\r\n                }\r\n                else{\r\n                    val1 = rule.conditionValue[0];\r\n                }\r\n\r\n                $(\"#luckysheet-editorConditionRule-dialog .textBox #conditionVal input\").val(val1);\r\n            }\r\n            else if(type1 == \"date\"){\r\n                _this.daterangeInit(\"luckysheet-editorConditionRule-dialog\");\r\n\r\n                let val1 = rule.conditionValue[0];\r\n                $(\"#luckysheet-editorConditionRule-dialog .dateBox #daterange-btn\").val(val1);\r\n            }\r\n            else if(type1 == \"top\" || type1 == \"last\"){\r\n                let val1 = rule.conditionValue[0];\r\n\r\n                if(conditionName == \"top10%\" || conditionName == \"last10%\"){\r\n                    $(\"#luckysheet-editorConditionRule-dialog #isPercent\").attr(\"checked\", \"checked\");\r\n                }\r\n            }\r\n            else{\r\n                if(conditionName == \"formula\"){\r\n                    let val1 = rule.conditionValue[0];\r\n                    $(\"#luckysheet-editorConditionRule-dialog #formulaConditionVal input\").val(val1);\r\n                }\r\n            }\r\n\r\n            $(\"#luckysheet-editorConditionRule-dialog #textcolorshow\").spectrum(\"set\", ruleFormat.textColor);\r\n            $(\"#luckysheet-editorConditionRule-dialog #cellcolorshow\").spectrum(\"set\", ruleFormat.cellColor);\r\n        }\r\n    },\r\n    infoDialog: function(title, content){\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-conditionformat-info-dialog\").remove();\r\n        $(\"body\").append(replaceHtml(modelHTML, {\r\n            \"id\": \"luckysheet-conditionformat-info-dialog\",\r\n            \"addclass\": \"\",\r\n            \"title\": title,\r\n            \"content\": content,\r\n            \"botton\": `<button id=\"luckysheet-conditionformat-info-dialog-close\" class=\"btn btn-default\">${locale().conditionformat.close}</button>`,\r\n            \"style\": \"z-index:100003\"\r\n        }));\r\n        let $t = $(\"#luckysheet-conditionformat-info-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-conditionformat-info-dialog\").css({\r\n            \"left\": (winw + scrollLeft - myw) / 2,\r\n            \"top\": (winh + scrollTop - myh) / 3\r\n        }).show();\r\n    },\r\n    getRuleExplain: function(index){\r\n        const conditionformat_Text = locale().conditionformat;\r\n\r\n        let textCellColorHtml = this.textCellColorHtml();\r\n\r\n        let ruleExplainHtml;\r\n        switch(index){\r\n            case 0: //基于各自值设置所有单元格的格式\r\n                ruleExplainHtml =  `<div class=\"title\">${conditionformat_Text.ruleTypeItem1}：</div>\r\n                                    <div style=\"height: 30px;margin-bottom: 5px;\">\r\n                                        <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.formatStyle}：</label>\r\n                                        <select id=\"type1\">\r\n                                            <option value=\"dataBar\">${conditionformat_Text.dataBar}</option>\r\n                                            <option value=\"colorGradation\">${conditionformat_Text.colorGradation}</option>\r\n                                            <option value=\"icons\">${conditionformat_Text.icons}</option>\r\n                                        </select>\r\n                                    </div>\r\n                                    <div>\r\n                                        <div class=\"type1Box dataBarBox\">\r\n                                            <div style=\"height: 30px;margin-bottom: 5px;\">\r\n                                                <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.fillType}：</label>\r\n                                                <select id=\"type2\">\r\n                                                    <option value=\"gradient\">${conditionformat_Text.gradient}</option>\r\n                                                    <option value=\"solid\">${conditionformat_Text.solid}</option>\r\n                                                </select>\r\n                                            </div>\r\n                                            <div style=\"height: 30px;margin-bottom: 5px;\">\r\n                                                <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.color}：</label>\r\n                                                <input data-tips=\"${conditionformat_Text.dataBarColor}\" data-func=\"background\" class=\"luckysheet-conditionformat-config-color\" type=\"text\" value=\"#638ec6\" style=\"display: none;\"> \r\n                                            </div>\r\n                                        </div>\r\n                                        <div class=\"type1Box colorGradationBox\" style=\"display: none;\">\r\n                                            <div style=\"height: 30px;margin-bottom: 5px;\">\r\n                                                <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.fillType}：</label>\r\n                                                <select id=\"type2\">\r\n                                                    <option value=\"threeColor\">${conditionformat_Text.tricolor}</option>\r\n                                                    <option value=\"twoColor\">${conditionformat_Text.twocolor}</option>\r\n                                                </select>\r\n                                            </div>\r\n                                            <div class=\"maxVal\" style=\"height: 30px;margin-bottom: 5px;\">\r\n                                                <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.maxValue}：</label>\r\n                                                <input data-tips=\"${conditionformat_Text.maxValue} ${conditionformat_Text.color}\" data-func=\"background\" class=\"luckysheet-conditionformat-config-color\" type=\"text\" value=\"rgb(99, 190, 123)\" style=\"display: none;\">\r\n                                            </div>\r\n                                            <div class=\"midVal\" style=\"height: 30px;margin-bottom: 5px;\">\r\n                                                <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.medianValue}：</label>\r\n                                                <input data-tips=\"${conditionformat_Text.medianValue} ${conditionformat_Text.color}\" data-func=\"background\" class=\"luckysheet-conditionformat-config-color\" type=\"text\" value=\"rgb(255, 235, 132)\" style=\"display: none;\">\r\n                                            </div>\r\n                                            <div class=\"minVal\" style=\"height: 30px;margin-bottom: 5px;\">\r\n                                                <label style=\"display: block;width: 80px;height: 30px;line-height: 30px;float: left;\">${conditionformat_Text.minValue}：</label>\r\n                                                <input data-tips=\"${conditionformat_Text.minValue} ${conditionformat_Text.color}\" data-func=\"background\" class=\"luckysheet-conditionformat-config-color\" type=\"text\" value=\"rgb(248, 105, 107)\" style=\"display: none;\">\r\n                                            </div>\r\n                                        </div>\r\n                                        <div class=\"type1Box iconsBox\" style=\"display: none;\">\r\n                                            <label>${conditionformat_Text.fillType}：</label>\r\n                                            <div class=\"showbox\">\r\n                                                <div class=\"model\" data-len=\"3\" data-leftmin=\"0\" data-top=\"0\" title=\"${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})\" style=\"background-position: 0 0;\"></div>\r\n                                                <span class=\"ui-selectmenu-icon ui-icon ui-icon-triangle-1-s\" style=\"margin-top: 2px;\"></span>\r\n                                            </div>\r\n                                            <ul>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"0\" title=\"${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})\" style=\"background-position: 0 0;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"5\" data-top=\"0\" title=\"${conditionformat_Text.threeWayArrow}(${conditionformat_Text.grayColor})\" style=\"background-position: -131px 0;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"1\" title=\"${conditionformat_Text.threeTriangles}\" style=\"background-position: 0 -20px;\"></div></li>\r\n                                                <li><div data-len=\"4\" data-leftmin=\"0\" data-top=\"2\" title=\"${conditionformat_Text.fourWayArrow}(${conditionformat_Text.multicolor})\" style=\"background-position: 0 -40px;\"></div></li>\r\n                                                <li><div data-len=\"4\" data-leftmin=\"5\" data-top=\"1\" title=\"${conditionformat_Text.fourWayArrow}(${conditionformat_Text.grayColor})\" style=\"background-position: -131px -20px;\"></div></li>\r\n                                                <li><div data-len=\"5\" data-leftmin=\"0\" data-top=\"3\" title=\"${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.multicolor})\" style=\"background-position: 0 -60px;\"></div></li>\r\n                                                <li><div data-len=\"5\" data-leftmin=\"5\" data-top=\"2\" title=\"${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.grayColor})\" style=\"background-position: -131px -40px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"4\" title=\"${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.rimless})\" style=\"background-position: 0 -80px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"5\" data-top=\"4\" title=\"${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.bordered})\" style=\"background-position: -131px -80px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"5\" title=\"${conditionformat_Text.threeSigns}\" style=\"background-position: 0 -100px;\"></div></li>\r\n                                                <li><div data-len=\"4\" data-leftmin=\"5\" data-top=\"5\" title=\"${conditionformat_Text.fourColorTrafficLight}\" style=\"background-position: -131px -100px;\"></div></li>\r\n                                                <li><div data-len=\"4\" data-leftmin=\"0\" data-top=\"6\" title=\"${conditionformat_Text.greenRedBlackGradient}\" style=\"background-position: 0 -120px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"7\" title=\"${conditionformat_Text.threeSymbols}(${conditionformat_Text.circled})\" style=\"background-position: 0 -140px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"5\" data-top=\"7\" title=\"${conditionformat_Text.threeSymbols}(${conditionformat_Text.noCircle})\" style=\"background-position: -131px -140px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"8\" title=\"${conditionformat_Text.tricolorFlag}\" style=\"background-position: 0 -160px;\"></div></li>\r\n                                                <li><div data-len=\"3\" data-leftmin=\"0\" data-top=\"9\" title=\"${conditionformat_Text.threeStars}\" style=\"background-position: 0 -180px;\"></div></li>\r\n                                                <li><div data-len=\"5\" data-leftmin=\"0\" data-top=\"10\" title=\"${conditionformat_Text.fiveQuadrantDiagram}\" style=\"background-position: 0 -200px;\"></div></li>\r\n                                                <li><div data-len=\"5\" data-leftmin=\"0\" data-top=\"11\" title=\"${conditionformat_Text.fiveBoxes}\" style=\"background-position: 0 -220px;\"></div></li>\r\n                                                <li><div data-len=\"4\" data-leftmin=\"5\" data-top=\"9\" title=\"${conditionformat_Text.grade4}\" style=\"background-position: -131px -180px;\"></div></li>\r\n                                                <li><div data-len=\"5\" data-leftmin=\"5\" data-top=\"10\" title=\"${conditionformat_Text.grade5}\" style=\"background-position: -131px -200px;\"></div></li>\r\n                                            </ul>\r\n                                        </div>\r\n                                    </div>`;\r\n                break;\r\n            case 1: //只为包含以下内容的单元格设置格式\r\n                ruleExplainHtml =  `<div class=\"title\">${conditionformat_Text.ruleTypeItem2_title}：</div>\r\n                                    <div style=\"height: 30px;margin-bottom: 10px;\">\r\n                                        <select id=\"type1\">\r\n                                            <option value=\"number\">${conditionformat_Text.cellValue}</option>\r\n                                            <option value=\"text\">${conditionformat_Text.specificText}</option>\r\n                                            <option value=\"date\">${conditionformat_Text.occurrence}</option>\r\n                                        </select>\r\n                                        <div>\r\n                                            <div class=\"type1Box numberBox\">\r\n                                                <select id=\"type2\">\r\n                                                    <option value=\"greaterThan\">${conditionformat_Text.greaterThan}</option>\r\n                                                    <option value=\"lessThan\">${conditionformat_Text.lessThan}</option>\r\n                                                    <option value=\"betweenness\">${conditionformat_Text.between}</option>\r\n                                                    <option value=\"equal\">${conditionformat_Text.equal}</option>\r\n                                                </select>\r\n                                                <div class=\"inpbox range\" id=\"conditionVal\">\r\n                                                    <input class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_Text.selectCell}\"></i>\r\n                                                </div>\r\n                                                <span class=\"txt\" style=\"display: none;\">${conditionformat_Text.in}</span>\r\n                                                <div class=\"inpbox range\" id=\"conditionVal2\" style=\"display: none;\">\r\n                                                    <input class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_Text.selectDataRange}\"></i>\r\n                                                </div>\r\n                                            </div>\r\n                                            <div class=\"type1Box textBox\" style=\"display: none;\">\r\n                                                <select id=\"type2\">\r\n                                                    <option value=\"\">${conditionformat_Text.contain}</option>\r\n                                                </select>\r\n                                                <div class=\"inpbox range\" id=\"conditionVal\">\r\n                                                    <input class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_Text.selectCell}\"></i>\r\n                                                </div>\r\n                                            </div>\r\n                                            <div class=\"type1Box dateBox\" style=\"display: none;\">\r\n                                                <div style=\"width: 162px;\" class=\"inpbox\">\r\n                                                    <input style=\"width: 150px;\" id=\"daterange-btn\" readonly=\"readonly\" placeholder=\"${conditionformat_Text.pleaseSelectADate}\"/>\r\n                                                </div>\r\n                                            </div>\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"title\">${conditionformat_Text.setFormat}: </div>${textCellColorHtml}`;\r\n                break;\r\n            case 2: //仅对排名靠前或靠后的数值设置格式\r\n                ruleExplainHtml =  `<div class=\"title\">${conditionformat_Text.ruleTypeItem3_title}：</div>\r\n                                    <div style=\"height: 30px;margin-bottom: 10px;\">\r\n                                        <select id=\"type1\">\r\n                                            <option value=\"top\">${conditionformat_Text.top}</option>\r\n                                            <option value=\"last\">${conditionformat_Text.last}</option>\r\n                                        </select>\r\n                                        <div class=\"inpbox\" id=\"conditionVal\">\r\n                                            <input class=\"formulaInputFocus\" type=\"number\" value=\"10\"/>\r\n                                        </div>\r\n                                        <input id=\"isPercent\" type=\"checkbox\"/>\r\n                                        <label for=\"isPercent\" class=\"txt\">${conditionformat_Text.selectRange_percent}</label>\r\n                                    </div>\r\n                                    <div class=\"title\">${conditionformat_Text.setFormat}：</div>${textCellColorHtml}`;\r\n                break;\r\n            case 3: //仅对高于或低于平均值的数值设置格式\r\n                ruleExplainHtml =  `<div class=\"title\">${conditionformat_Text.ruleTypeItem4_title}：</div>\r\n                                    <div style=\"height: 30px;margin-bottom: 10px;\">\r\n                                        <select id=\"type1\">\r\n                                            <option value=\"AboveAverage\">${conditionformat_Text.above}</option>\r\n                                            <option value=\"SubAverage\">${conditionformat_Text.below}</option>\r\n                                        </select>\r\n                                        <span class=\"txt\">${conditionformat_Text.selectRange_average}</span>\r\n                                    </div>\r\n                                    <div class=\"title\">${conditionformat_Text.setFormat}：</div>${textCellColorHtml}`;\r\n                break;\r\n            case 4: //仅对唯一值或重复值设置格式\r\n                ruleExplainHtml =  `<div class=\"title\">${conditionformat_Text.all}：</div>\r\n                                    <div style=\"height: 30px;margin-bottom: 10px;\">\r\n                                        <select id=\"type1\">\r\n                                            <option value=\"0\">${conditionformat_Text.duplicateValue}</option>\r\n                                            <option value=\"1\">${conditionformat_Text.uniqueValue}</option>\r\n                                        </select>\r\n                                        <span class=\"txt\">${conditionformat_Text.selectRange_value}</span>\r\n                                    </div>\r\n                                    <div class=\"title\">${conditionformat_Text.setFormat}：</div>${textCellColorHtml}`;\r\n                break;\r\n            case 5: //使用公式确定要设置格式的单元格\r\n                ruleExplainHtml =  `<div class=\"title\">${conditionformat_Text.ruleTypeItem2_title}：</div>\r\n                                    <div style=\"height: 30px;margin-bottom: 10px;\">\r\n                                        <div class=\"inpbox range\" id=\"formulaConditionVal\" style=\"width: 250px;\">\r\n                                            <input class=\"formulaInputFocus\" style=\"width: 200px;\"/>\r\n                                            <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_Text.selectCell}\"></i>\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"title\">${conditionformat_Text.setFormat}: </div>${textCellColorHtml}`;\r\n                break;\r\n        }\r\n\r\n        return ruleExplainHtml;\r\n    },\r\n    daterangeInit: function(id){\r\n        const conditionformat_Text = locale().conditionformat;\r\n        const regexSingleDate = /^\\d{4}-\\d{2}-\\d{2}$/; // 匹配  \"YYYY-MM-DD\"\r\n        const regexStartEndDate = /^\\d{4}-\\d{2}-\\d{2} to \\d{4}-\\d{2}-\\d{2}$/; // 匹配 \"YYYY-MM-DD to YYYY-MM-DD\"\r\n        // const regexStartEndDate = /^(\\d{4}-\\d{2}-\\d{2})( to (\\d{4}-\\d{2}-\\d{2}))?$/; // \r\n\r\n        //日期选择插件\r\n        $('.ranges_1 ul').remove();\r\n        const daterangeBtn = $('#' + id).find(\"#daterange-btn\")\r\n        daterangeBtn.flatpickr({\r\n            mode: \"range\",\r\n            onChange:  (data, label) => {\r\n                const [start, end] = data\r\n                //label:通过它来知道用户选择的是什么，传给后台进行相应的展示\r\n                let format1 = [\r\n                    conditionformat_Text.yesterday,\r\n                    conditionformat_Text.today\r\n                ];\r\n\r\n                let format2 = [\r\n                    conditionformat_Text.lastWeek,\r\n                    conditionformat_Text.thisWeek,\r\n                    conditionformat_Text.lastMonth,\r\n                    conditionformat_Text.thisMonth,\r\n                    conditionformat_Text.lastYear,\r\n                    conditionformat_Text.thisYear,\r\n                    conditionformat_Text.last7days,\r\n                    conditionformat_Text.last30days\r\n                ]\r\n\r\n                if (label == conditionformat_Text.all) {\r\n                    daterangeBtn.val('');\r\n                } else if (format1.indexOf(label) > -1) {\r\n                    daterangeBtn.val(dayjs(start).format('YYYY/MM/DD'));\r\n                } else if (format2.indexOf(label) > -1) {\r\n                    daterangeBtn.val(dayjs(start).format('YYYY/MM/DD') + '-' + dayjs(end).format('YYYY/MM/DD'));\r\n                }\r\n\r\n                // 匹配  \"2023-05-17 to 2023-05-19\"\r\n                const isValidSingleFormat = regexSingleDate.test(label);\r\n                const isValidStartEndFormat = regexStartEndDate.test(label);\r\n                if(isValidSingleFormat){\r\n                    daterangeBtn.val(dayjs(start).format('YYYY/MM/DD'));\r\n                }else if(isValidStartEndFormat){\r\n                    daterangeBtn.val(dayjs(start).format('YYYY/MM/DD') + '-' + dayjs(end).format('YYYY/MM/DD'));\r\n\r\n                }\r\n            }\r\n        });\r\n    },\r\n    CFSplitRange: function(range1, range2, range3, type){\r\n        let range = [];\r\n\r\n        let offset_r = range3[\"row\"][0] - range2[\"row\"][0];\r\n        let offset_c = range3[\"column\"][0] - range2[\"column\"][0];\r\n\r\n        let r1 = range1[\"row\"][0], r2 = range1[\"row\"][1];\r\n        let c1 = range1[\"column\"][0], c2 = range1[\"column\"][1];\r\n\r\n        if(r1 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //选区 包含 条件格式应用范围 全部\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 >= range2[\"row\"][0] && r1 <= range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //选区 行贯穿 条件格式应用范围 上部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r2 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //选区 行贯穿 条件格式应用范围 下部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 < range2[\"row\"][0] && r2 > range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //选区 行贯穿 条件格式应用范围 中间部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(c1 >= range2[\"column\"][0] && c1 <= range2[\"column\"][1] && r1 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1]){\r\n            //选区 列贯穿 条件格式应用范围 左部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [range2[\"column\"][1] + 1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(c2 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1] && r1 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1]){\r\n            //选区 列贯穿 条件格式应用范围 右部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [c1, range2[\"column\"][0] - 1] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(c1 < range2[\"column\"][0] && c2 > range2[\"column\"][1] && r1 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1]){\r\n            //选区 列贯穿 条件格式应用范围 中间部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [r1, r2], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [r1, r2], \"column\": [range2[\"column\"][1] + 1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 >= range2[\"row\"][0] && r1 <= range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c1 <= range2[\"column\"][1]){\r\n            //选区 包含 条件格式应用范围 左上角部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 >= range2[\"row\"][0] && r1 <= range2[\"row\"][1] && c2 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //选区 包含 条件格式应用范围 右上角部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r2 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c1 <= range2[\"column\"][1]){\r\n            //选区 包含 条件格式应用范围 左下角部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [range2[\"column\"][1] + 1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r2 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1] && c2 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //选区 包含 条件格式应用范围 右下角部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [c1, range2[\"column\"][0] - 1] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 < range2[\"row\"][0] && r2 > range2[\"row\"][1] && c1 >= range2[\"column\"][0] && c1 <= range2[\"column\"][1]){\r\n            //选区 包含 条件格式应用范围 左中间部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [c1 + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 < range2[\"row\"][0] && r2 > range2[\"row\"][1] && c2 >= range2[\"column\"][0] && c2 <= range2[\"column\"][1]){\r\n            //选区 包含 条件格式应用范围 右中间部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, c2 + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(c1 < range2[\"column\"][0] && c2 > range2[\"column\"][1] && r1 >= range2[\"row\"][0] && r1 <= range2[\"row\"][1]){\r\n            //选区 包含 条件格式应用范围 上中间部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [r1, range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [r1 + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(c1 < range2[\"column\"][0] && c2 > range2[\"column\"][1] && r2 >= range2[\"row\"][0] && r2 <= range2[\"row\"][1]){\r\n            //选区 包含 条件格式应用范围 下中间部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][0], r2], \"column\": [range2[\"column\"][1] + 1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, r2 + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else if(r1 < range2[\"row\"][0] && r2 > range2[\"row\"][1] && c1 < range2[\"column\"][0] && c2 > range2[\"column\"][1]){\r\n            //选区 包含 条件格式应用范围 正中间部分\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, range2[\"row\"][0] - 1], \"column\": [c1, c2] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [c1, range2[\"column\"][0] - 1] },\r\n                    { \"row\": [range2[\"row\"][0], range2[\"row\"][1]], \"column\": [range2[\"column\"][1] + 1, c2] },\r\n                    { \"row\": [range2[\"row\"][1] + 1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [\r\n                    { \"row\": [range2[\"row\"][0] + offset_r, range2[\"row\"][1] + offset_r], \"column\": [range2[\"column\"][0] + offset_c, range2[\"column\"][1] + offset_c] }\r\n                ];\r\n            }\r\n        }\r\n        else{\r\n            //选区 在 条件格式应用范围 之外\r\n\r\n            if(type == \"allPart\"){ //所有部分\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"restPart\"){ //剩余部分\r\n                range = [\r\n                    { \"row\": [r1, r2], \"column\": [c1, c2] }\r\n                ];\r\n            }\r\n            else if(type == \"operatePart\"){ //操作部分\r\n                range = [];\r\n            }\r\n        }\r\n\r\n        return range;\r\n    },\r\n    getcolorGradation: function(color1, color2, value1, value2, value){\r\n        let rgb1 = color1.split(',');\r\n        let r1 = parseInt(rgb1[0].split('(')[1]);\r\n        let g1 = parseInt(rgb1[1]);\r\n        let b1 = parseInt(rgb1[2].split(')')[0]);\r\n\r\n        let rgb2 = color2.split(',');\r\n        let r2 = parseInt(rgb2[0].split('(')[1]);\r\n        let g2 = parseInt(rgb2[1]);\r\n        let b2 = parseInt(rgb2[2].split(')')[0]);\r\n\r\n        let r = Math.round(r1 - (r1 - r2) / (value1 - value2) * (value1 - value));\r\n        let g = Math.round(g1 - (g1 - g2) / (value1 - value2) * (value1 - value));\r\n        let b = Math.round(b1 - (b1 - b2) / (value1 - value2) * (value1 - value));\r\n\r\n        return \"rgb(\"+ r +\", \"+ g +\", \"+ b +\")\";\r\n    },\r\n    getCFPartRange: function(sheetIndex, range1, range2){\r\n        let ruleArr = [];\r\n\r\n        let cf = Store.luckysheetfile[getSheetIndex(sheetIndex)].luckysheet_conditionformat_save;\r\n        if(cf != null && cf.length > 0){\r\n            label:  for(let i = 0; i < cf.length; i++){\r\n                        let cellrange = cf[i].cellrange;\r\n\r\n                        for(let j = 0; j < cellrange.length; j++){\r\n                            let r1 = cellrange[j].row[0], r2 = cellrange[j].row[1];\r\n                            let c1 = cellrange[j].column[0], c2 = cellrange[j].column[1];\r\n\r\n                            for(let s = 0; s < range.length; s++){\r\n                                if((range[s].row[0] >= r1 && range[s].row[0] <= r2) || (range[s].row[1] >= r1 && range[s].row[1] <= r2) || (range[s].column[0] >= c1 && range[s].column[0] <= c2) || (range[s].column[1] >= c1 && range[s].column[1] <= c2)){\r\n                                    ruleArr.push(cf[i]);\r\n\r\n                                    continue label;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n        }\r\n\r\n        return ruleArr;\r\n    },\r\n    checksCF: function(r, c, computeMap){\r\n        if(computeMap != null &&　(r + \"_\" + c) in computeMap){\r\n            return computeMap[r + \"_\" + c];\r\n        }\r\n        else{\r\n            return null;\r\n        }\r\n    },\r\n    getComputeMap: function(sheetIndex){\r\n        let index = getSheetIndex(Store.currentSheetIndex);\r\n\r\n        if(sheetIndex != null){\r\n            index = getSheetIndex(sheetIndex);\r\n        }\r\n\r\n        let ruleArr = Store.luckysheetfile[index][\"luckysheet_conditionformat_save\"];\r\n        let data = Store.luckysheetfile[index][\"data\"];\r\n\r\n        if(data == null){\r\n            return null;\r\n        }\r\n\r\n        let computeMap = this.compute(ruleArr, data);\r\n\r\n        return computeMap;\r\n    },\r\n    compute: function(ruleArr, d){\r\n        let _this = this;\r\n\r\n        if(ruleArr == null){\r\n            ruleArr = [];\r\n        }\r\n\r\n        //条件计算存储\r\n        let computeMap = {};\r\n\r\n        if(ruleArr.length > 0){\r\n            for(let i = 0; i < ruleArr.length; i++){\r\n                let type = ruleArr[i][\"type\"];\r\n                let cellrange = ruleArr[i][\"cellrange\"];\r\n                let format = ruleArr[i][\"format\"];\r\n\r\n                if(type == \"dataBar\"){ //数据条\r\n                    let max = null, min = null;\r\n\r\n                    for(let s = 0; s < cellrange.length; s++){\r\n                        for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                            for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                if(d[r] == null || d[r][c] == null){\r\n                                    continue;\r\n                                }\r\n\r\n                                let cell = d[r][c];\r\n\r\n                                if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                    if(max == null || parseInt(cell.v) > max){\r\n                                        max = parseInt(cell.v);\r\n                                    }\r\n\r\n                                    if(min == null || parseInt(cell.v) < min){\r\n                                        min = parseInt(cell.v);\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if(max != null && min != null){\r\n                        if(min < 0){ //选区范围内有负数\r\n                            let plusLen = Math.round(max / (max - min) * 10) / 10;                //正数所占比\r\n                            let minusLen = Math.round(Math.abs(min) / (max - min) * 10) / 10;     //负数所占比\r\n\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            if(parseInt(cell.v) < 0){ //负数\r\n                                                let valueLen = Math.round(Math.abs(parseInt(cell.v)) / Math.abs(min) * 100) / 100;\r\n\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"dataBar\"] = { \"valueType\": \"minus\", \"minusLen\": minusLen, \"valueLen\": valueLen, \"format\": format };\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"dataBar\": { \"valueType\": \"minus\", \"minusLen\": minusLen, \"valueLen\": valueLen, \"format\": format } };\r\n                                                }\r\n                                            }\r\n\r\n                                            if(parseInt(cell.v) > 0){ //正数\r\n                                                let valueLen = Math.round(parseInt(cell.v) / max * 100) / 100;\r\n\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"dataBar\"] = { \"valueType\": \"plus\", \"plusLen\": plusLen, \"minusLen\": minusLen, \"valueLen\": valueLen, \"format\": format };\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"dataBar\": { \"valueType\": \"plus\", \"plusLen\": plusLen, \"minusLen\": minusLen, \"valueLen\": valueLen, \"format\": format } };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            let plusLen = 1;\r\n\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            let valueLen;\r\n                                            if(max == 0){\r\n                                                valueLen = 1;\r\n                                            }\r\n                                            else{\r\n                                                valueLen = Math.round(parseInt(cell.v) / max * 100) / 100;\r\n                                            }\r\n\r\n                                            if((r + \"_\" + c) in computeMap){\r\n                                                computeMap[r + \"_\" + c][\"dataBar\"] = { \"valueType\": \"plus\", \"plusLen\": plusLen, \"valueLen\": valueLen, \"format\": format };\r\n                                            }\r\n                                            else{\r\n                                                computeMap[r + \"_\" + c] = { \"dataBar\": { \"valueType\": \"plus\", \"plusLen\": plusLen, \"valueLen\": valueLen, \"format\": format } };\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else if(type == \"colorGradation\"){ //色阶\r\n                    let max = null, min = null, sum = 0, count = 0;\r\n\r\n                    for(let s = 0; s < cellrange.length; s++){\r\n                        for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                            for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                if(d[r] == null || d[r][c] == null){\r\n                                    continue;\r\n                                }\r\n\r\n                                let cell = d[r][c];\r\n\r\n                                if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                    count++;\r\n                                    sum += parseInt(cell.v);\r\n\r\n                                    if(max == null || parseInt(cell.v) > max){\r\n                                        max = parseInt(cell.v);\r\n                                    }\r\n\r\n                                    if(min == null || parseInt(cell.v) < min){\r\n                                        min = parseInt(cell.v);\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if(max != null && min != null){\r\n                        if(format.length == 3){ //三色色阶\r\n                            let avg = Math.floor(sum / count);\r\n\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            if(parseInt(cell.v) == min){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = format[2];\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": format[2] };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) > min && parseInt(cell.v) < avg){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = _this.getcolorGradation(format[2], format[1], min, avg, parseInt(cell.v));\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": _this.getcolorGradation(format[2], format[1], min, avg, parseInt(cell.v)) };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) == avg){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = format[1];\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": format[1] };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) > avg && parseInt(cell.v) < max){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = _this.getcolorGradation(format[1], format[0], avg, max, parseInt(cell.v));\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": _this.getcolorGradation(format[1], format[0], avg, max, parseInt(cell.v)) };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) == max){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = format[0];\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": format[0] };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(format.length == 2){ //两色色阶\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            if(parseInt(cell.v) == min){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = format[1];\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": format[1] };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) > min && parseInt(cell.v) < max){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = _this.getcolorGradation(format[1], format[0], min, max, parseInt(cell.v));\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": _this.getcolorGradation(format[1], format[0], min, max, parseInt(cell.v)) };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) == max){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = format[0];\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"cellColor\": format[0] };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else if(type == \"icons\"){ //图标集\r\n                    let len = parseInt(format[\"len\"]);\r\n                    let leftMin = parseInt(format[\"leftMin\"]);\r\n                    let top = parseInt(format[\"top\"]);\r\n\r\n                    let max = null, min = null;\r\n\r\n                    for(let s = 0; s < cellrange.length; s++){\r\n                        for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                            for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                if(d[r] == null || d[r][c] == null){\r\n                                    continue;\r\n                                }\r\n\r\n                                let cell = d[r][c];\r\n\r\n                                if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                    if(max == null || parseInt(cell.v) > max){\r\n                                        max = parseInt(cell.v);\r\n                                    }\r\n\r\n                                    if(min == null || parseInt(cell.v) < min){\r\n                                        min = parseInt(cell.v);\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if(max != null && min != null){\r\n                        let a = Math.floor((max - min + 1) / len);\r\n                        let b = (max - min + 1) % len;\r\n\r\n                        if(len == 3){ //一组图标有三个\r\n                            let v1, v2, v3;\r\n                            if(b == 2){\r\n                                v1 = [min, min + a];\r\n                                v2 = [min + a + 1, min + a * 2];\r\n                                v3 = [min + a * 2 + 1, max];\r\n                            }\r\n                            else{\r\n                                v1 = [min, min + a - 1];\r\n                                v2 = [min + a, min + a * 2 - 1];\r\n                                v3 = [min + a * 2, max];\r\n                            }\r\n\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            if(parseInt(cell.v) >= v1[0] && parseInt(cell.v) <= v1[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 2, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 2, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v2[0] && parseInt(cell.v) <= v2[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 1, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 1, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v3[0] && parseInt(cell.v) <= v3[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(len == 4){ //一组图标有四个\r\n                            let v1, v2, v3, v4;\r\n                            if(b == 2){\r\n                                v1 = [min, min + a];\r\n                                v2 = [min + a + 1, min + a * 2];\r\n                                v3 = [min + a * 2 + 1, min + a * 3];\r\n                                v4 = [min + a * 3 + 1, max];\r\n                            }\r\n                            else if(b == 3){\r\n                                v1 = [min, min + a];\r\n                                v2 = [min + a + 1, min + a * 2];\r\n                                v3 = [min + a * 2 + 1, min + a * 3 + 1];\r\n                                v4 = [min + a * 3 + 2, max];\r\n                            }\r\n                            else{\r\n                                v1 = [min, min + a - 1];\r\n                                v2 = [min + a, min + a * 2 - 1];\r\n                                v3 = [min + a * 2, min + a * 3 - 1];\r\n                                v4 = [min + a * 3, max];\r\n                            }\r\n\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            if(parseInt(cell.v) >= v1[0] && parseInt(cell.v) <= v1[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 3, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 3, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v2[0] && parseInt(cell.v) <= v2[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 2, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 2, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v3[0] && parseInt(cell.v) <= v3[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 1, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 1, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v4[0] && parseInt(cell.v) <= v4[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(len == 5){ //一组图标有五个\r\n                            let v1, v2, v3, v4, v5;\r\n                            if(b == 2){\r\n                                v1 = [min, min + a];\r\n                                v2 = [min + a + 1, min + a * 2];\r\n                                v3 = [min + a * 2 + 1, min + a * 3];\r\n                                v4 = [min + a * 3 + 1, min + a * 4];\r\n                                v5 = [min + a * 4 + 1, max];\r\n                            }\r\n                            else if(b == 3){\r\n                                v1 = [min, min + a];\r\n                                v2 = [min + a + 1, min + a * 2];\r\n                                v3 = [min + a * 2 + 1, min + a * 3 + 1];\r\n                                v4 = [min + a * 3 + 2, min + a * 4 + 1];\r\n                                v5 = [min + a * 4 + 2, max];\r\n                            }\r\n                            else if(b == 4){\r\n                                v1 = [min, min + a];\r\n                                v2 = [min + a + 1, min + a * 2 + 1];\r\n                                v3 = [min + a * 2 + 2, min + a * 3 + 1];\r\n                                v4 = [min + a * 3 + 2, min + a * 4 + 2];\r\n                                v5 = [min + a * 4 + 3, max];\r\n                            }\r\n                            else{\r\n                                v1 = [min, min + a - 1];\r\n                                v2 = [min + a, min + a * 2 - 1];\r\n                                v3 = [min + a * 2, min + a * 3 - 1];\r\n                                v4 = [min + a * 3, min + a * 4 - 1];\r\n                                v5 = [min + a * 4, max];\r\n                            }\r\n\r\n                            for(let s = 0; s < cellrange.length; s++){\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        let cell = d[r][c];\r\n\r\n                                        if(getObjType(cell) == \"object\" && cell[\"ct\"] != null && cell[\"ct\"].t == \"n\" && cell.v != null){\r\n                                            if(parseInt(cell.v) >= v1[0] && parseInt(cell.v) <= v1[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 4, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 4, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v2[0] && parseInt(cell.v) <= v2[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 3, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 3, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v3[0] && parseInt(cell.v) <= v3[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 2, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 2, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v4[0] && parseInt(cell.v) <= v4[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin + 1, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin + 1, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                            else if(parseInt(cell.v) >= v5[0] && parseInt(cell.v) <= v5[1]){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"icons\"] = {\"left\": leftMin, \"top\": top};\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"icons\": {\"left\": leftMin, \"top\": top} };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    //获取变量值\r\n                    let conditionName = ruleArr[i].conditionName,         //条件名称\r\n                        conditionValue0 = ruleArr[i].conditionValue[0],   //条件值1\r\n                        conditionValue1 = ruleArr[i].conditionValue[1],   //条件值2\r\n                        textColor = format.textColor,          //条件格式文本颜色 fc\r\n                        cellColor = format.cellColor;          //条件格式单元格颜色 bg\r\n\r\n                    for(let s = 0; s < cellrange.length; s++){\r\n                        //条件类型判断\r\n                        if(conditionName == \"greaterThan\" || conditionName == \"lessThan\" || conditionName == \"equal\" || conditionName == \"textContains\"){\r\n                            //循环应用范围计算\r\n                            for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                    if(d[r] == null || d[r][c] == null){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //单元格值\r\n                                    let cell = d[r][c];\r\n\r\n                                    if(getObjType(cell) != \"object\" || isRealNull(cell.v)){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //符合条件\r\n                                    if(conditionName == \"greaterThan\" && cell.v > conditionValue0){\r\n                                        if((r + \"_\" + c) in computeMap){\r\n                                            computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                            computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                        }\r\n                                        else{\r\n                                            computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                        }\r\n                                    }\r\n                                    else if(conditionName == \"lessThan\" && cell.v < conditionValue0){\r\n                                        if((r + \"_\" + c) in computeMap){\r\n                                            computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                            computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                        }\r\n                                        else{\r\n                                            computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                        }\r\n                                    }\r\n                                    else if(conditionName == \"equal\" && cell.v == conditionValue0){\r\n                                        if((r + \"_\" + c) in computeMap){\r\n                                            computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                            computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                        }\r\n                                        else{\r\n                                            computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                        }\r\n                                    }\r\n                                    else if(conditionName == \"textContains\" && cell.v.toString().indexOf(conditionValue0) != -1){\r\n                                        if((r + \"_\" + c) in computeMap){\r\n                                            computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                            computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                        }\r\n                                        else{\r\n                                            computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(conditionName == \"betweenness\"){\r\n                            //比较条件值1和条件值2的大小\r\n                            let vBig, vSmall;\r\n                            if(conditionValue0 > conditionValue1){\r\n                                vBig = conditionValue0;\r\n                                vSmall = conditionValue1;\r\n                            }\r\n                            else{\r\n                                vBig = conditionValue1;\r\n                                vSmall = conditionValue0;\r\n                            }\r\n                            //循环应用范围计算\r\n                            for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                    if(d[r] == null || d[r][c] == null){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //单元格值\r\n                                    let cell = d[r][c];\r\n\r\n                                    if(getObjType(cell) != \"object\" || isRealNull(cell.v)){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //符合条件\r\n                                    if(cell.v >= vSmall && cell.v <= vBig){\r\n                                        if((r + \"_\" + c) in computeMap){\r\n                                            computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                            computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                        }\r\n                                        else{\r\n                                            computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(conditionName == \"occurrenceDate\"){\r\n                            //获取日期所对应的数值\r\n                            let dBig, dSmall;\r\n                            if(conditionValue0.toString().indexOf(\"-\") == -1){\r\n                                dBig = genarate(conditionValue0)[2];\r\n                                dSmall = genarate(conditionValue0)[2];\r\n                            }\r\n                            else{\r\n                                let str = conditionValue0.toString().split(\"-\");\r\n                                dBig = genarate(str[1].trim())[2];\r\n                                dSmall = genarate(str[0].trim())[2];\r\n                            }\r\n                            //循环应用范围计算\r\n                            for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                    if(d[r] == null || d[r][c] == null){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //单元格值类型为日期类型\r\n                                    if(d[r][c].ct != null && d[r][c].ct.t == \"d\"){\r\n                                        //单元格值\r\n                                        let cellVal = getcellvalue(r, c, d);\r\n                                        //符合条件\r\n                                        if(cellVal >= dSmall && cellVal <= dBig){\r\n                                            if((r + \"_\" + c) in computeMap){\r\n                                                computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                                computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                            }\r\n                                            else{\r\n                                                computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(conditionName == \"duplicateValue\"){\r\n                            //应用范围单元格值处理\r\n                            let dmap = {};\r\n                            for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                    let item = getcellvalue(r, c, d);\r\n                                    if(!(item in dmap)){\r\n                                        dmap[item] = [];\r\n                                    }\r\n                                    dmap[item].push({\"r\": r, \"c\": c});\r\n                                }\r\n                            }\r\n                            //循环应用范围计算\r\n                            if(conditionValue0 == \"0\"){//重复值\r\n                                for(let x in dmap){\r\n                                    if(x != \"null\" && x != \"undefined\" && dmap[x].length > 1){\r\n                                        for(let j = 0; j < dmap[x].length; j++){\r\n                                            if((dmap[x][j].r + \"_\" + dmap[x][j].c) in computeMap){\r\n                                                computeMap[dmap[x][j].r + \"_\" + dmap[x][j].c][\"textColor\"] = textColor;\r\n                                                computeMap[dmap[x][j].r + \"_\" + dmap[x][j].c][\"cellColor\"] = cellColor;\r\n                                            }\r\n                                            else{\r\n                                                computeMap[dmap[x][j].r + \"_\" + dmap[x][j].c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                            if(conditionValue0 == \"1\"){//唯一值\r\n                                for(let x in dmap){\r\n                                    if(x != \"null\" && x != \"undefined\" && dmap[x].length == 1){\r\n                                        if((dmap[x][0].r + \"_\" + dmap[x][0].c) in computeMap){\r\n                                            computeMap[dmap[x][0].r + \"_\" + dmap[x][0].c][\"textColor\"] = textColor;\r\n                                            computeMap[dmap[x][0].r + \"_\" + dmap[x][0].c][\"cellColor\"] = cellColor;\r\n                                        }\r\n                                        else{\r\n                                            computeMap[dmap[x][0].r + \"_\" + dmap[x][0].c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(conditionName == \"top10\" || conditionName == \"top10%\" || conditionName == \"last10\" || conditionName == \"last10%\" || conditionName == \"AboveAverage\" || conditionName == \"SubAverage\"){\r\n                            //应用范围单元格值(数值型)\r\n                            let dArr=[];\r\n                            for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                    if(d[r] == null || d[r][c] == null){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //单元格值类型为数字类型\r\n                                    if(d[r][c].ct != null && d[r][c].ct.t == \"n\"){\r\n                                        dArr.push(getcellvalue(r, c, d));\r\n                                    }\r\n                                }\r\n                            }\r\n                            //数组处理\r\n                            if(conditionName == \"top10\" || conditionName == \"top10%\" || conditionName == \"last10\" || conditionName == \"last10%\"){\r\n                                //从大到小排序\r\n                                for(let j = 0; j < dArr.length; j++){\r\n                                    for(let k = 0; k < dArr.length - 1 - j; k++){\r\n                                        if(dArr[k]<dArr[k+1]){\r\n                                            let temp=dArr[k];\r\n                                            dArr[k]=dArr[k+1];\r\n                                            dArr[k+1]=temp;\r\n                                        }\r\n                                    }\r\n                                }\r\n                                //取条件值数组\r\n                                let cArr\r\n                                if(conditionName == \"top10\"){\r\n                                    cArr = dArr.slice(0, conditionValue0); //前10项数组\r\n                                }\r\n                                else if(conditionName == \"top10%\"){\r\n                                    cArr = dArr.slice(0, Math.floor(conditionValue0*dArr.length/100)); //前10%数组\r\n                                }\r\n                                else if(conditionName == \"last10\"){\r\n                                    cArr = dArr.slice((dArr.length-conditionValue0), dArr.length); //最后10项数组\r\n                                }\r\n                                else if(conditionName == \"last10%\"){\r\n                                    cArr = dArr.slice((dArr.length-Math.floor(conditionValue0*dArr.length/100)), dArr.length); //最后10%数组\r\n                                }\r\n                                //循环应用范围计算\r\n                                for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                    for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                        if(d[r] == null || d[r][c] == null){\r\n                                            continue;\r\n                                        }\r\n\r\n                                        //单元格值\r\n                                        let cellVal = getcellvalue(r, c, d);\r\n                                        //符合条件\r\n                                        if(cArr.indexOf(cellVal) != -1){\r\n                                            if((r + \"_\" + c) in computeMap){\r\n                                                computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                                computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                            }\r\n                                            else{\r\n                                                computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                            else if(conditionName == \"AboveAverage\" || conditionName == \"SubAverage\"){\r\n                                //计算数组平均值\r\n                                let sum = 0;\r\n                                for(let j = 0; j < dArr.length; j++){\r\n                                    sum += dArr[j];\r\n                                }\r\n                                let averageNum = sum / dArr.length;\r\n                                //循环应用范围计算\r\n                                if(conditionName == \"AboveAverage\"){ //高于平均值\r\n                                    for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                        for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                            if(d[r] == null || d[r][c] == null){\r\n                                                continue;\r\n                                            }\r\n\r\n                                            //单元格值\r\n                                            let cellVal = getcellvalue(r, c, d);\r\n                                            //符合条件\r\n                                            if(cellVal > averageNum){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                                else if(conditionName == \"SubAverage\"){ //低于平均值\r\n                                    for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){\r\n                                        for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){\r\n                                            if(d[r] == null || d[r][c] == null){\r\n                                                continue;\r\n                                            }\r\n\r\n                                            //单元格值\r\n                                            let cellVal = getcellvalue(r, c, d);\r\n                                            //符合条件\r\n                                            if(cellVal < averageNum){\r\n                                                if((r + \"_\" + c) in computeMap){\r\n                                                    computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                                    computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                                }\r\n                                                else{\r\n                                                    computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                                }\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if (conditionName == 'regExp') { // 支持正则\r\n                            let re = new RegExp(conditionValue0); // 外部传递过来的正则表达式\r\n                            if (undefined == conditionValue1) { // 如果没有第二个参数，默认是正则表达式直接生效\r\n                                conditionValue1 = 1;\r\n                            }\r\n\r\n                            for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {\r\n                                for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {\r\n                                    if (d[r] == null || d[r][c] == null) {\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //单元格值\r\n                                    let cell = d[r][c];\r\n\r\n                                    if (getObjType(cell) != \"object\" || isRealNull(cell.v)) {\r\n                                        continue;\r\n                                    }\r\n\r\n                                    // 符合条件\r\n                                    let ret = re.test(cell.v);\r\n                                    if ((conditionValue1 == 1 && ret) || (conditionValue1 == 0 && !ret)) {\r\n                                        if ((r + \"_\" + c) in computeMap) {\r\n                                            computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                            computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                        } else {\r\n                                            computeMap[r + \"_\" + c] = {\"textColor\": textColor, \"cellColor\": cellColor};\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if (conditionName == 'sort') { // 支持数据有序\r\n                            for (let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++) {\r\n                                for (let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++) {\r\n                                    if (d[r] == null || d[r][c] == null) {\r\n                                        continue;\r\n                                    }\r\n\r\n                                    //单元格值\r\n                                    let cell = d[r][c];\r\n                                    if (r<1) {\r\n                                        continue;\r\n                                    }\r\n                                    let cellAbove = d[r-1][c];\r\n                                    if (undefined == cellAbove) {\r\n                                        continue;\r\n                                    }\r\n\r\n                                    if (getObjType(cell) != \"object\" || isRealNull(cell.v)) {\r\n                                        continue;\r\n                                    }\r\n\r\n                                    // 符合条件\r\n                                    if (($.inArray(conditionValue0, [0, 'asc', '0']) > -1 && cell.v > cellAbove.v) || ($.inArray(conditionValue0, [1, '1', 'desc']) > -1 && cell.v < cellAbove.v)) {\r\n                                        if ((r + \"_\" + c) in computeMap) {\r\n                                            computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                            computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                        } else {\r\n                                            computeMap[r + \"_\" + c] = {\"textColor\": textColor, \"cellColor\": cellColor};\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        else if(conditionName == \"formula\"){\r\n                            let str = cellrange[s].row[0],\r\n                                edr = cellrange[s].row[1],\r\n                                stc = cellrange[s].column[0],\r\n                                edc = cellrange[s].column[1];\r\n\r\n                            let formulaTxt = conditionValue0;\r\n                            if(conditionValue0.toString().slice(0, 1) != '='){\r\n                                formulaTxt = '=' + conditionValue0;\r\n                            }\r\n\r\n                            for(let r = str; r <= edr; r++){\r\n                                for(let c = stc; c <= edc; c++){\r\n                                    let func = formulaTxt;\r\n                                    let offsetRow = r - str;\r\n                                    let offsetCol = c - stc;\r\n\r\n                                    if(offsetRow > 0){\r\n                                        func = \"=\" + formula.functionCopy(func, \"down\", offsetRow);\r\n                                    }\r\n\r\n                                    if(offsetCol > 0){\r\n                                        func = \"=\" + formula.functionCopy(func, \"right\", offsetCol);\r\n                                    }\r\n\r\n                                    let funcV = formula.execfunction(func);\r\n                                    let v = funcV[1];\r\n\r\n                                    if(typeof v != 'boolean'){\r\n                                        v = !!Number(v);\r\n                                    }\r\n\r\n                                    if(!v){\r\n                                        continue;\r\n                                    }\r\n\r\n                                    if((r + \"_\" + c) in computeMap){\r\n                                        computeMap[r + \"_\" + c][\"textColor\"] = textColor;\r\n                                        computeMap[r + \"_\" + c][\"cellColor\"] = cellColor;\r\n                                    }\r\n                                    else{\r\n                                        computeMap[r + \"_\" + c] = { \"textColor\": textColor, \"cellColor\": cellColor };\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        Store.conditionFormatCells = computeMap;\r\n\r\n        return computeMap;\r\n    },\r\n    updateItem: function(type, cellrange, format){\r\n        if(!checkProtectionFormatCells(Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n        let index = getSheetIndex(Store.currentSheetIndex);\r\n\r\n        //保存之前的规则\r\n        let fileH = $.extend(true, [], Store.luckysheetfile);\r\n        let historyRules = _this.getHistoryRules(fileH);\r\n\r\n        //保存当前的规则\r\n        let ruleArr;\r\n        if(type == \"delSheet\"){\r\n            ruleArr = [];\r\n        }\r\n        else{\r\n            let rule = {\r\n                \"type\": type,\r\n                \"cellrange\": cellrange,\r\n                \"format\": format\r\n            };\r\n            ruleArr = Store.luckysheetfile[index][\"luckysheet_conditionformat_save\"] == null ? [] : Store.luckysheetfile[index][\"luckysheet_conditionformat_save\"];\r\n            ruleArr.push(rule);\r\n        }\r\n\r\n        Store.luckysheetfile[index][\"luckysheet_conditionformat_save\"] = ruleArr;\r\n\r\n        let fileC = $.extend(true, [], Store.luckysheetfile);\r\n        let currentRules = _this.getCurrentRules(fileC);\r\n\r\n        //刷新一次表格\r\n        _this.ref(historyRules, currentRules);\r\n\r\n        //发送给后台\r\n        if(server.allowUpdate){\r\n            server.saveParam(\"all\", Store.currentSheetIndex, ruleArr, { \"k\": \"luckysheet_conditionformat_save\" });\r\n        }\r\n    },\r\n    getHistoryRules: function(fileH){\r\n        let historyRules = [];\r\n\r\n        for(let h = 0; h < fileH.length; h++){\r\n            historyRules.push({\"sheetIndex\": fileH[h][\"index\"], \"luckysheet_conditionformat_save\": fileH[h][\"luckysheet_conditionformat_save\"]});\r\n        }\r\n\r\n        return historyRules;\r\n    },\r\n    getCurrentRules: function(fileC){\r\n        let currentRules = [];\r\n\r\n        for(let c = 0; c < fileC.length; c++){\r\n            currentRules.push({\"sheetIndex\": fileC[c][\"index\"], \"luckysheet_conditionformat_save\": fileC[c][\"luckysheet_conditionformat_save\"]});\r\n        }\r\n\r\n        return currentRules;\r\n    },\r\n    ref: function(historyRules, currentRules){\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n\r\n            let redo = {};\r\n            redo[\"type\"] = \"updateCF\";\r\n            redo[\"data\"] = {\"historyRules\": historyRules, \"currentRules\": currentRules};\r\n            Store.jfredo.push(redo);\r\n        }\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n}\r\n\r\nexport default conditionformat;\r\n"
  },
  {
    "path": "src/controllers/constant.js",
    "content": "import locale from \"../locale/locale\";\r\nimport Store from \"../store\";\r\nimport luckysheetConfigsetting from \"./luckysheetConfigsetting\";\r\nimport { getObjType } from \"../utils/util\";\r\nimport { createToolbarHtml } from \"./toolbar\";\r\n//dom variable\r\nconst gridHTML = function() {\r\n    const _locale = locale();\r\n    const locale_info = _locale.info;\r\n    const locale_print = _locale.print;\r\n    const userInfo =\r\n        luckysheetConfigsetting.userInfo === true\r\n            ? '<i style=\"font-size:16px;color:#ff6a00;\" class=\"fa fa-taxi\" aria-hidden=\"true\"></i> Lucky'\r\n            : luckysheetConfigsetting.userInfo; // When true, use the default HTML string. The rendering of userInfo below uses nested template strings. Otherwise, when display is used and the image path is not passed in, there will be an undefined request\r\n\r\n    return `<div class=\"luckysheet\">\r\n                    <canvas id=\"luckysheetTableContentF\" style=\"display:none;\" class=\"luckysheetTableContent\"></canvas> \r\n                    <div class=\"luckysheet-work-area luckysheet-noselected-text\"> \r\n                        <div id =\"luckysheet_info_detail\" class=\"luckysheet_info_detail\"> \r\n                            <div data-tips=\"${\r\n                                locale_info.return\r\n                            }\" id=\"luckysheet_info_detail_title\" class=\"luckysheet_info_detail_back\"> \r\n                                <i style=\"color:#444D5A;\" class=\"fa fa-angle-left fa-2x\" aria-hidden=\"true\"></i> \r\n                            </div> \r\n                            <div class=\"luckysheet-share-logo\" title=\"\\${logotitle}\"></div>\r\n                            <div class=\"sheet-name\"> \r\n                                <input data-tips=\"${\r\n                                    locale_info.tips\r\n                                }\" id=\"luckysheet_info_detail_input\" class=\"luckysheet_info_detail_input luckysheet-mousedown-cancel\" value=\"${\r\n        locale_info.noName\r\n    }\" tabindex=\"0\" dir=\"ltr\" aria-label=\"${\r\n        locale_info.rename\r\n    }\" style=\"visibility: visible; width: 149px;\" data-tooltip=\"${locale_info.rename}\"> \r\n                            </div> \r\n                            <div id=\"luckysheet_info_detail_update\" class=\"luckysheet_info_detail_update\"> ${\r\n                                locale_info.detailUpdate\r\n                            } </div> \r\n                            <div id=\"luckysheet_info_detail_save\" class=\"luckysheet_info_detail_save\"> ${\r\n                                locale_info.wait\r\n                            } </div>\r\n                            \r\n                            \\${functionButton}\r\n                            \r\n                            ${\r\n                                getObjType(userInfo) === \"string\"\r\n                                    ? `<div class=\"luckysheet_info_detail_user\">\r\n                            <span id=\"luckysheet_info_detail_user\">${userInfo}</span></div>`\r\n                                    : \"\"\r\n                            }\r\n\r\n                            ${\r\n                                getObjType(userInfo) === \"object\"\r\n                                    ? `<div class=\"luckysheet_info_detail_user\">                            \r\n                            <img src=\"${userInfo.userImage}\" id=\"luckysheet_info_detail_user_img\">\r\n                            <span id=\"luckysheet_info_detail_user\">${userInfo.userName}</span>\r\n                            </div>`\r\n                                    : \"\"\r\n                            }\r\n                            \r\n                        </div> \r\n                        <div id=\"luckysheet-wa-editor\" class=\"luckysheet-wa-editor toolbar\"> \\${menu} </div> \r\n                        <div id=\"luckysheet-wa-calculate\" class=\"luckysheet-wa-calculate\"> \r\n                            <div class=\"luckysheet-wa-calculate-size\" id=\"luckysheet-wa-calculate-size\"></div> \r\n                            <div class=\"luckysheet-wa-calculate-help\"> \r\n                                <div class=\"luckysheet-wa-calculate-help-box\"> \r\n                                    <div spellcheck=\"false\" aria-hidden=\"false\" id=\"luckysheet-helpbox\">\r\n                                        <div id=\"luckysheet-helpbox-cell\" class=\"luckysheet-helpbox-cell-input luckysheet-mousedown-cancel\" tabindex=\"0\" contenteditable=\"true\" dir=\"ltr\" aria-autocomplete=\"list\"></div>\r\n                                    </div> \r\n                                </div>  \r\n                                <div class=\"luckysheet-wa-calculate-help-tool\">\r\n                                    <i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i>\r\n                                </div> \r\n                            </div> \r\n                            <div id=\"luckysheet-wa-functionbox-cancel\" class=\"luckysheet-wa-functionbox\">\r\n                                <span><i class=\"iconfont-luckysheet luckysheet-iconfont-qingchu\" aria-hidden=\"true\"></i></span>\r\n                            </div> \r\n                            <div id=\"luckysheet-wa-functionbox-confirm\" class=\"luckysheet-wa-functionbox\">\r\n                                <span><i class=\"iconfont-luckysheet luckysheet-iconfont-yunhang\" aria-hidden=\"true\"></i></span>\r\n                            </div> \r\n                            <div id=\"luckysheet-wa-functionbox-fx\" class=\"luckysheet-wa-functionbox\">\r\n                                <span><i class=\"iconfont-luckysheet luckysheet-iconfont-hanshu\" aria-hidden=\"true\" style=\"color:#333\"></i></span> \r\n                            </div> \r\n                            <div id=\"luckysheet-functionbox-container\" class=\"luckysheet-mousedown-cancel\">\r\n                                <div class=\"luckysheet-mousedown-cancel\" dir=\"ltr\">\r\n                                    <div spellcheck=\"false\" aria-hidden=\"false\" id=\"luckysheet-functionbox\">\r\n                                        <div id=\"luckysheet-functionbox-cell\" class=\"luckysheet-functionbox-cell-input luckysheet-mousedown-cancel\" tabindex=\"0\" contenteditable=\"true\" dir=\"ltr\" aria-autocomplete=\"list\" aria-label=\"D4\"></div>\r\n                                    </div>\r\n                                </div>\r\n                            </div>   \r\n                        </div> \r\n                    </div> \r\n                    <div class=\"luckysheet-grid-container luckysheet-scrollbars-enabled\"> \r\n                        <div class=\"luckysheet-grid-window\"> \r\n                            <div class=\"luckysheet-help-sub\"></div> \r\n                            <div class=\"luckysheet-grid-window-1\" id=\"luckysheet-grid-window-1\">\r\n                                <canvas id=\"luckysheetTableContent\" class=\"luckysheetTableContent\"></canvas> \r\n                                <table class=\"luckysheet-grid-window-2\" cellspacing=\"0\" cellpadding=\"0\" dir=\"ltr\" tabindex=\"-1\" > \r\n                                    <tbody> \r\n                                        <tr> \r\n                                            <td valign=\"top\" class=\"luckysheet-paneswrapper\"> \r\n                                                <div class=\"luckysheet-left-top\" id=\"luckysheet-left-top\"> </div> \r\n                                            </td> \r\n                                            <td valign=\"top\" class=\"luckysheet-paneswrapper\"> \r\n                                                <div id=\"luckysheet-cols-h-c\" class=\"luckysheet-cols-h-c\">\r\n                                                    <div class=\"luckysheet-cols-change-size\" id=\"luckysheet-cols-change-size\"></div>  \r\n                                                    <div class=\"luckysheet-cols-menu-btn luckysheet-mousedown-cancel\" id=\"luckysheet-cols-menu-btn\"><i class=\"fa fa-caret-down luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></div>  \r\n                                                    <div class=\"luckysheet-cols-h-hover\" id=\"luckysheet-cols-h-hover\"></div>  \r\n                                                    <div id=\"luckysheet-cols-h-selected\"></div>  \r\n                                                    <div class=\"luckysheet-grdusedrange\"></div>  \r\n                                                    <div class=\"luckysheet-grdblkflowpush\"></div>  \\${columnHeader}\r\n                                                </div>\r\n                                            </td>\r\n                                        </tr>\r\n                                        <tr>\r\n                                            <td valign=\"top\" class=\"luckysheet-paneswrapper\"> \r\n                                                <div class=\"luckysheet-rows-h\" id=\"luckysheet-rows-h\"> \r\n                                                    <div class=\"luckysheet-rows-change-size\" id=\"luckysheet-rows-change-size\"></div> \r\n                                                    <div class=\"luckysheet-rows-h-hover\" id=\"luckysheet-rows-h-hover\"></div> \r\n                                                    <div id=\"luckysheet-rows-h-selected\"></div>  \r\n                                                    <div class=\"luckysheet-grdusedrange\"></div>  \r\n                                                    <div class=\"luckysheet-grdblkflowpush\"></div> \\${rowHeader}\r\n                                                </div> \r\n                                            </td>  \r\n                                            <td valign=\"top\" class=\"luckysheet-paneswrapper\">\r\n                                                <div class=\"luckysheet-cell-loading\" id=\"luckysheet-cell-loading\">\r\n                                                    <div class=\"luckysheet-cell-loading-inner\">\r\n                                                        <i class=\"fa fa-circle-o-notch fa-spin\"></i>\r\n                                                        <span></span>\r\n                                                    </div>\r\n                                                </div> \r\n                                                <div class=\"luckysheet-cell-freezen\"></div> \r\n                                                <div class=\"luckysheet-scrollbars luckysheet-scrollbar-ltr luckysheet-scrollbar-x\" id=\"luckysheet-scrollbar-x\"><div></div></div> \r\n                                                <div class=\"luckysheet-scrollbars luckysheet-scrollbar-ltr luckysheet-scrollbar-y\" id=\"luckysheet-scrollbar-y\"><div></div></div> \r\n                                                <div class=\"luckysheet-cell-main \" id=\"luckysheet-cell-main\">\r\n                                                    <div id=\"luckysheet-formula-functionrange\"></div>  \r\n                                                    <div id=\"luckysheet-formula-functionrange-select\" class=\"luckysheet-selection-copy luckysheet-formula-functionrange-select\">\r\n                                                        <div class=\"luckysheet-selection-copy-top luckysheet-copy\"></div>\r\n                                                        <div class=\"luckysheet-selection-copy-right luckysheet-copy\"></div>\r\n                                                        <div class=\"luckysheet-selection-copy-bottom luckysheet-copy\"></div>\r\n                                                        <div class=\"luckysheet-selection-copy-left luckysheet-copy\"></div>\r\n                                                        <div class=\"luckysheet-selection-copy-hc\"></div>\r\n                                                    </div>  \r\n                                                    <div class=\"luckysheet-row-count-show luckysheet-count-show\" id=\"luckysheet-row-count-show\"></div>\r\n                                                    <div class=\"luckysheet-column-count-show luckysheet-count-show\" id=\"luckysheet-column-count-show\"></div>\r\n                                                    <div class=\"luckysheet-change-size-line\" id=\"luckysheet-change-size-line\"></div>  \r\n                                                    <div class=\"luckysheet-cell-selected-focus\" id=\"luckysheet-cell-selected-focus\"></div>  \r\n                                                    <div id=\"luckysheet-selection-copy\"></div>  \r\n                                                    <div id=\"luckysheet-chart-rangeShow\"></div>\r\n                                                    <div class=\"luckysheet-cell-selected-extend\" id=\"luckysheet-cell-selected-extend\"></div>  \r\n                                                    <div class=\"luckysheet-cell-selected-move\" id=\"luckysheet-cell-selected-move\"></div>  \r\n                                                    <div id=\"luckysheet-cell-selected-boxs\">\r\n                                                        <div id=\"luckysheet-cell-selected\" class=\"luckysheet-cell-selected\">\r\n                                                            <div class=\"luckysheet-cs-inner-border\"></div>\r\n                                                            <div class=\"luckysheet-cs-fillhandle\"></div>\r\n                                                            <div class=\"luckysheet-cs-inner-border\"></div>\r\n                                                            <div class=\"luckysheet-cs-draghandle-top luckysheet-cs-draghandle\"></div>\r\n                                                            <div class=\"luckysheet-cs-draghandle-bottom luckysheet-cs-draghandle\"></div>\r\n                                                            <div class=\"luckysheet-cs-draghandle-left luckysheet-cs-draghandle\"></div>\r\n                                                            <div class=\"luckysheet-cs-draghandle-right luckysheet-cs-draghandle\"></div>\r\n                                                            <div class=\"luckysheet-cs-touchhandle luckysheet-cs-touchhandle-lt\"><div class=\"luckysheet-cs-touchhandle-btn\"></div></div>\r\n                                                            <div class=\"luckysheet-cs-touchhandle luckysheet-cs-touchhandle-rb\"><div class=\"luckysheet-cs-touchhandle-btn\"></div></div>\r\n                                                        </div>\r\n                                                    </div>\r\n                                                    <div id=\"luckysheet-postil-showBoxs\"></div>\r\n                                                    <div id=\"luckysheet-multipleRange-show\"></div>  \r\n                                                    <div id=\"luckysheet-dynamicArray-hightShow\"></div>  \r\n                                                    <div id=\"luckysheet-image-showBoxs\">\r\n                                                        <div id=\"luckysheet-modal-dialog-activeImage\" class=\"luckysheet-modal-dialog\" style=\"display:none;padding:0;position:absolute;z-index:300;\">\r\n                                                            <div class=\"luckysheet-modal-dialog-border\" style=\"position:absolute;\"></div> \r\n                                                            <div class=\"luckysheet-modal-dialog-content\"></div>  \r\n                                                            <div class=\"luckysheet-modal-dialog-resize\">\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lt\" data-type=\"lt\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mt\" data-type=\"mt\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lm\" data-type=\"lm\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rm\" data-type=\"rm\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rt\" data-type=\"rt\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lb\" data-type=\"lb\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mb\" data-type=\"mb\"></div>\r\n                                                                <div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rb\" data-type=\"rb\"></div>\r\n                                                            </div>\r\n                                                            <div class=\"luckysheet-modal-dialog-controll\">\r\n                                                                <span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-crop\" role=\"button\" tabindex=\"0\" aria-label=\"裁剪\" title=\"裁剪\">\r\n                                                                    <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\r\n                                                                </span>\r\n                                                                <span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-restore\" role=\"button\" tabindex=\"0\" aria-label=\"恢复原图\" title=\"恢复原图\">\r\n                                                                    <i class=\"fa fa-window-maximize\" aria-hidden=\"true\"></i>\r\n                                                                </span>\r\n                                                                <span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-del\" role=\"button\" tabindex=\"0\" aria-label=\"删除\" title=\"删除\">\r\n                                                                    <i class=\"fa fa-trash\" aria-hidden=\"true\"></i>\r\n                                                                </span>\r\n                                                            </div>\r\n                                                        </div>\r\n                                                        <div id=\"luckysheet-modal-dialog-cropping\" class=\"luckysheet-modal-dialog\" style=\"display:none;padding:0;position:absolute;z-index:300;\">\r\n                                                            <div class=\"cropping-mask\"></div>\r\n                                                            <div class=\"cropping-content\"></div>\r\n                                                            <div class=\"luckysheet-modal-dialog-border\" style=\"position:absolute;\"></div>\r\n                                                            <div class=\"luckysheet-modal-dialog-resize\">\r\n                                                                <div class=\"resize-item lt\" data-type=\"lt\"></div> \r\n                                                                <div class=\"resize-item mt\" data-type=\"mt\"></div> \r\n                                                                <div class=\"resize-item lm\" data-type=\"lm\"></div> \r\n                                                                <div class=\"resize-item rm\" data-type=\"rm\"></div> \r\n                                                                <div class=\"resize-item rt\" data-type=\"rt\"></div> \r\n                                                                <div class=\"resize-item lb\" data-type=\"lb\"></div> \r\n                                                                <div class=\"resize-item mb\" data-type=\"mb\"></div> \r\n                                                                <div class=\"resize-item rb\" data-type=\"rb\"></div>\r\n                                                            </div>\r\n                                                            <div class=\"luckysheet-modal-dialog-controll\">\r\n                                                                <span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-crop\" role=\"button\" tabindex=\"0\" aria-label=\"裁剪\" title=\"裁剪\">\r\n                                                                    <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\r\n                                                                </span>\r\n                                                                <span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-restore\" role=\"button\" tabindex=\"0\" aria-label=\"恢复原图\" title=\"恢复原图\">\r\n                                                                    <i class=\"fa fa-window-maximize\" aria-hidden=\"true\"></i>\r\n                                                                </span>\r\n                                                                <span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-del\" role=\"button\" tabindex=\"0\" aria-label=\"删除\" title=\"删除\">\r\n                                                                    <i class=\"fa fa-trash\" aria-hidden=\"true\"></i>\r\n                                                                </span>\r\n                                                            </div>\r\n                                                        </div>\r\n                                                        <div class=\"img-list\"></div>\r\n                                                        <div class=\"cell-date-picker\">\r\n                                                            <input id=\"cellDatePickerBtn\" class=\"formulaInputFocus\" readonly=\"readonly\"/>\r\n                                                        </div>\r\n                                                    </div>\r\n                                                    <div id=\"luckysheet-dataVerification-dropdown-btn\"></div>\r\n                                                    <div id=\"luckysheet-formula-refresh\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M4 20v-2h2.75l-.4-.35q-1.225-1.225-1.788-2.663T4 12.05q0-2.775 1.663-4.938T10 4.25v2.1Q8.2 7 7.1 8.562T6 12.05q0 1.125.425 2.188T7.75 16.2l.25.25V14h2v6H4Zm10-.25v-2.1q1.8-.65 2.9-2.212T18 11.95q0-1.125-.425-2.187T16.25 7.8L16 7.55V10h-2V4h6v2h-2.75l.4.35q1.225 1.225 1.788 2.663T20 11.95q0 2.775-1.663 4.938T14 19.75Z\"/></svg></div>\r\n                                                    <div id=\"luckysheet-dataVerification-dropdown-List\" class=\"luckysheet-mousedown-cancel\"></div>\r\n                                                    <div id=\"luckysheet-dataVerification-showHintBox\" class=\"luckysheet-mousedown-cancel\"></div>\r\n                                                    <div class=\"luckysheet-cell-copy\"></div>  \r\n                                                    <div class=\"luckysheet-grdblkflowpush\"></div>  \\${flow} \r\n                                                </div> \r\n                                            </td> \r\n                                        </tr> \r\n                                    </tbody> \r\n                                </table> \r\n                            </div> \r\n                            <div class=\"luckysheet-sheet-area luckysheet-noselected-text\" id=\"luckysheet-sheet-area\">\r\n                                <div id=\"luckysheet-sheet-content\">\r\n                                    <div id=\"luckysheet-sheets-add\" class=\"luckysheet-sheets-add lucky-button-custom\"><i class=\"iconfont-luckysheet luckysheet-iconfont-jia1\"></i></div>\r\n                                    <div id=\"luckysheet-sheets-m\" class=\"luckysheet-sheets-m lucky-button-custom\"><i class=\"iconfont-luckysheet luckysheet-iconfont-caidan2\"></i></div>\r\n                                    <div class=\"luckysheet-sheet-container\" id=\"luckysheet-sheet-container\">\r\n                                        <div class=\"docs-sheet-fade docs-sheet-fade-left\" style=\"display: none;\">\r\n                                            <div class=\"docs-sheet-fade3\"></div>\r\n                                            <div class=\"docs-sheet-fade2\"></div>\r\n                                            <div class=\"docs-sheet-fade1\"></div>\r\n                                        </div>\r\n                                        <div class=\"docs-sheet-fade docs-sheet-fade-right\" style=\"display: none;\">\r\n                                            <div class=\"docs-sheet-fade1\"></div>\r\n                                            <div class=\"docs-sheet-fade2\"></div>\r\n                                            <div class=\"docs-sheet-fade3\"></div>\r\n                                        </div>\r\n                                        <div class=\"luckysheet-sheet-container-c\" id=\"luckysheet-sheet-container-c\"></div>\r\n                                    </div>\r\n                                    <div id=\"luckysheet-sheets-leftscroll\" class=\"luckysheet-sheets-scroll lucky-button-custom\"><i class=\"fa fa-caret-left\"></i></div>\r\n                                    <div id=\"luckysheet-sheets-rightscroll\" class=\"luckysheet-sheets-scroll lucky-button-custom\"><i class=\"fa fa-caret-right\"></i></div>\r\n                                </div>\r\n                            </div> \r\n                        </div> \r\n                        <div class=\"luckysheet-stat-area\"> \r\n                            <div class=\"luckysheet-sta-c\">\r\n                                <div class=\"luckysheet-zoom-content\" id=\"luckysheet-zoom-content\">\r\n                                    <div class=\"luckysheet-zoom-minus\" id=\"luckysheet-zoom-minus\">\r\n                                        <div class=\"luckysheet-zoom-minus-icon\"></div>\r\n                                    </div>\r\n                                    <div class=\"luckysheet-zoom-slider\" id=\"luckysheet-zoom-slider\">\r\n                                        <div class=\"luckysheet-zoom-line\"></div>\r\n                                        <div class=\"luckysheet-zoom-cursor\" id=\"luckysheet-zoom-cursor\"></div>\r\n                                        <div class=\"luckysheet-zoom-hundred\"></div>\r\n                                    </div>\r\n                                    <div class=\"luckysheet-zoom-plus\" id=\"luckysheet-zoom-plus\">\r\n                                        <div class=\"luckysheet-zoom-plus-icon\"></div>\r\n                                    </div>\r\n                                    <div class=\"luckysheet-zoom-ratioText\" id=\"luckysheet-zoom-ratioText\">100%</div>\r\n                                </div>\r\n                                <div class=\"luckysheet-sta-content\" id=\"luckysheet-sta-content\"></div>  \r\n                                <!--<div class=\"luckysheet-bottom-content\" id=\"luckysheet-bottom-content-show\"></div> -->\r\n                            </div> \r\n                        </div> \r\n                    </div>\r\n                    <div id=\"luckysheet-copy-content\" contenteditable=\"true\"></div>\r\n                    <input id=\"luckysheet-copy-btn\" type=\"button\" data-clipboard-target=\"luckysheet-copy-content\">\r\n                    <div id=\"testdpidiv\" style=\"height: 1in; left: -100%; position: absolute; top: -100%; width: 1in;\"></div>\r\n                  </div>`;\r\n};\r\n\r\nconst columeHeader_word = [\r\n        \"A\",\r\n        \"B\",\r\n        \"C\",\r\n        \"D\",\r\n        \"E\",\r\n        \"F\",\r\n        \"G\",\r\n        \"H\",\r\n        \"I\",\r\n        \"J\",\r\n        \"K\",\r\n        \"L\",\r\n        \"M\",\r\n        \"N\",\r\n        \"O\",\r\n        \"P\",\r\n        \"Q\",\r\n        \"R\",\r\n        \"S\",\r\n        \"T\",\r\n        \"U\",\r\n        \"V\",\r\n        \"W\",\r\n        \"X\",\r\n        \"Y\",\r\n        \"Z\",\r\n    ],\r\n    columeHeader_word_index = {\r\n        A: 0,\r\n        B: 1,\r\n        C: 2,\r\n        D: 3,\r\n        E: 4,\r\n        F: 5,\r\n        G: 6,\r\n        H: 7,\r\n        I: 8,\r\n        J: 9,\r\n        K: 10,\r\n        L: 11,\r\n        M: 12,\r\n        N: 13,\r\n        O: 14,\r\n        P: 15,\r\n        Q: 16,\r\n        R: 17,\r\n        S: 18,\r\n        T: 19,\r\n        U: 20,\r\n        V: 21,\r\n        W: 22,\r\n        X: 23,\r\n        Y: 24,\r\n        Z: 25,\r\n    },\r\n    flow =\r\n        '<div id=\"luckysheet-cell-flow_${index}\" class=\"luckysheet-cell-flow luckysheetsheetchange\" style=\"width:${width}px;\"><div class=\"luckysheet-cell-flow-clip\"><div class=\"luckysheet-grdblkpush\"></div>${flow}</div></div>',\r\n    colsmenuHTML = \"\";\r\n\r\n//右键菜单dom\r\nfunction rightclickHTML() {\r\n    const _locale = locale();\r\n    const rightclick = _locale.rightclick;\r\n    const toolbar = _locale.toolbar;\r\n\r\n    const config = customCellRightClickConfig();\r\n\r\n    // 当一个功能菜单块内所有的按钮都隐藏的时候，它顶部的分割线也需要隐藏掉\r\n    let handleincellMenuseparator = true;\r\n\r\n    if (!config.insertRow && !config.insertColumn && !config.deleteRow && !config.deleteColumn && !config.deleteCell) {\r\n        handleincellMenuseparator = false;\r\n    }\r\n\r\n    let dataMenuseparator = true;\r\n\r\n    if (\r\n        !config.clear &&\r\n        !config.matrix &&\r\n        !config.sort &&\r\n        !config.filter &&\r\n        !config.chart &&\r\n        !config.image &&\r\n        !config.link &&\r\n        !config.data &&\r\n        !config.cellFormat\r\n    ) {\r\n        dataMenuseparator = false;\r\n    }\r\n\r\n    const customsButtons = (config.customs || [])\r\n        .map(\r\n            (item, index) => `\r\n            <div data-index=\"${index}\" class=\"luckysheetColsRowsHandleAdd_custom luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                ${item.title}\r\n                </div>\r\n            </div>`,\r\n        )\r\n        .join(\"\");\r\n\r\n    const rightclickContainer = `<div id=\"luckysheet-rightclick-menu\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel\">\r\n                <div id=\"luckysheet-copy-btn\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel luckysheet-copy-btn\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" style=\"display:${\r\n                    config.copy ? \"block\" : \"none\"\r\n                };\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.copy}</div>\r\n                </div>\r\n                <div id=\"luckysheetcopyfor\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\"  style=\"display:${\r\n                    config.copyAs ? \"block\" : \"none\"\r\n                };\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${\r\n                            rightclick.copyAs\r\n                        }<span class=\"luckysheet-submenu-arrow iconfont-luckysheet luckysheet-iconfont-youjiantou\" style=\"user-select: none;\"></span>\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-paste\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                    config.paste ? \"block\" : \"none\"\r\n                };\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.paste}</div>\r\n                </div>\r\n                <div id=\"luckysheet-cols-rows-handleincell\">\r\n                    <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\" style=\"display:${\r\n                        handleincellMenuseparator ? \"block\" : \"none\"\r\n                    };\"></div>\r\n                    <div id=\"luckysheetColsRowsHandleAdd_row\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.insertRow ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.insert}${\r\n        rightclick.row\r\n    }<span class=\"luckysheet-submenu-arrow\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheetColsRowsHandleAdd_column\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.insertColumn ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.insert}${\r\n        rightclick.column\r\n    }<span class=\"luckysheet-submenu-arrow\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-delRows\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.deleteRow ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.deleteSelected}${\r\n        rightclick.row\r\n    }<span class=\"luckysheet-submenu-arrow\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-delCols\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.deleteColumn ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.deleteSelected}${\r\n        rightclick.column\r\n    }<span class=\"luckysheet-submenu-arrow\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                    <!-- cell right click remove hide button\r\n                    <div id=\"luckysheetColsRowsHandleHid\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${\r\n                                rightclick.hide\r\n                            }<span class=\"luckysheet-submenu-arrow iconfont-luckysheet luckysheet-iconfont-youjiantou\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                    -->\r\n                    <div id=\"luckysheetCellsHandleDel\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.deleteCell ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${\r\n                                rightclick.deleteCell\r\n                            }<span class=\"luckysheet-submenu-arrow iconfont-luckysheet luckysheet-iconfont-youjiantou\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-cols-rows-add\">\r\n                    <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div>\r\n                    <div id=\"luckysheet-top-left-add-selected\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.to}\r\n                            <span class=\"luckysheet-cols-rows-shift-left\">${rightclick.left}</span>\r\n                            ${rightclick.add}\r\n                            <input type=\"text\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${\r\n                                rightclick.number\r\n                            }\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align:center;margin-left:5px;\"/>\r\n                            <span class=\"luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel\">${\r\n                                rightclick.column\r\n                            }</span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-bottom-right-add-selected\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.to}\r\n                            <span class=\"luckysheet-cols-rows-shift-right\">${rightclick.right}</span>\r\n                            ${rightclick.add}\r\n                            <input type=\"text\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${\r\n                                rightclick.number\r\n                            }\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                            <span class=\"luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel\">${\r\n                                rightclick.column\r\n                            }</span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-del-selected\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.deleteSelected}\r\n                            <span class=\"luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel\">${\r\n                                rightclick.column\r\n                            }</span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-hide-selected\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.hideSelected}\r\n                        <span class=\"luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel\">${\r\n                            rightclick.column\r\n                        }</span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-show-selected\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${rightclick.showHide}\r\n                            <span class=\"luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel\">${\r\n                                rightclick.column\r\n                            }</span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheet-column-row-width-selected\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            <span class=\"luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel\">${\r\n                                rightclick.column\r\n                            }</span>\r\n                            <span class=\"luckysheet-cols-rows-shift-size luckysheet-mousedown-cancel\">${\r\n                                rightclick.width\r\n                            }</span>\r\n                            <input type=\"number\" class=\"luckysheet-mousedown-cancel rcsize\" min=\"0\" max=\"255\" placeholder=\"${\r\n                                rightclick.number\r\n                            }\" value=\"\" style=\"width:50px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\">\r\n                            px\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-cols-rows-shift\">\r\n                    <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\" style=\"display:${\r\n                        config.sort ? \"block\" : \"none\"\r\n                    };\"></div>\r\n                    <div id=\"luckysheetorderbyasc\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.sort ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                            rightclick.orderAZ\r\n                        }</div>\r\n                    </div>\r\n                    <div id=\"luckysheetorderbydesc\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.sort ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                            rightclick.orderZA\r\n                        }</div>\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-cols-rows-data\">\r\n                    <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\" style=\"display:${\r\n                        dataMenuseparator ? \"block\" : \"none\"\r\n                    };\"></div>\r\n                    <div id=\"luckysheet-delete-text\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.clear ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                            rightclick.clearContent\r\n                        }</div>\r\n                    </div>\r\n                    <div id=\"luckysheetmatrix\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.matrix ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                            ${\r\n                                rightclick.matrix\r\n                            }<span class=\"luckysheet-submenu-arrow iconfont-luckysheet luckysheet-iconfont-youjiantou\" style=\"user-select: none;\"></span>\r\n                        </div>\r\n                    </div>\r\n                    <div id=\"luckysheetorderby\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.sort ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                            rightclick.sortSelection\r\n                        }</div>\r\n                    </div>\r\n                    <div id=\"luckysheetfilter\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.filter ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                            rightclick.filterSelection\r\n                        }</div>\r\n                    </div>\r\n                    <div id=\"luckysheetdatavisual\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.chart ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                            rightclick.chartGeneration\r\n                        }</div>\r\n                    </div>\r\n                    <div id=\"luckysheetInsertImage\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.image ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                            toolbar.insertImage\r\n                        }</div>\r\n                    </div>\r\n                    <div id=\"luckysheetInsertLink\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.link ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                            toolbar.insertLink\r\n                        }</div>\r\n                    </div>\r\n                    <div id=\"luckysheetDataVerification\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.data ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                            toolbar.dataVerification\r\n                        }</div>\r\n                    </div>\r\n                    <div id=\"luckysheetCellFormatRightClickMenu\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                        config.cellFormat ? \"block\" : \"none\"\r\n                    };\">\r\n                        <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                            toolbar.cellFormat\r\n                        }</div>\r\n                    </div>\r\n                    ${customsButtons}\r\n                </div>\r\n            </div>\r\n            <div id=\"luckysheetcopyfor_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div id=\"luckysheet-copy-json-head\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">Json ${\r\n                        rightclick.firstLineTitle\r\n                    }</div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-json-nohead\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">Json ${\r\n                        rightclick.untitled\r\n                    }</div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-array1\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.array1}</div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-array2\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${rightclick.array2}</div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-arraymore-confirm\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        <span class=\"luckysheet-mousedown-cancel\">${rightclick.array3}</span>\r\n                        <input type=\"number\" id=\"luckysheet-copy-arraymore-row\" min=\"1\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${\r\n                            rightclick.row\r\n                        }\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;\"/>\r\n                            ×\r\n                            <input type=\"number\" id=\"luckysheet-copy-arraymore-col\" min=\"1\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${\r\n                                rightclick.column\r\n                            }\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;\"/>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div>\r\n                <div id=\"luckysheet-copy-diagonal\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                        rightclick.diagonal\r\n                    }</div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-antidiagonal\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                        rightclick.antiDiagonal\r\n                    }</div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-diagonaloffset\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.diagonalOffset}\r\n                        <input type=\"number\" id=\"luckysheet-copy-diagonaloffset-value\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${\r\n                            rightclick.offset\r\n                        }\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                        ${rightclick.column}\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-copy-boolvalue\" data-clipboard-action=\"copy\" data-clipboard-target=\"#luckysheet-copy-content\" class=\"luckysheet-cols-menuitem luckysheet-copy-btn luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                        rightclick.boolean\r\n                    }</div>\r\n                </div>\r\n            </div>\r\n            \r\n            <!-- Revision: modeled on google sheet\r\n            \r\n            <div id=\"luckysheetColsRowsHandleAdd_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.to}${rightclick.top}${rightclick.add}\r\n                        <input type=\"text\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${\r\n                            rightclick.number\r\n                        }\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                        <span class=\"luckysheet-mousedown-cancel\">${rightclick.row}</span>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.to}${rightclick.bottom}${rightclick.add}\r\n                        <input type=\"text\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${\r\n                            rightclick.number\r\n                        }\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                        <span class=\"luckysheet-mousedown-cancel\">${rightclick.row}</span>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.to}${rightclick.left}${rightclick.add}\r\n                        <input type=\"text\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${\r\n                            rightclick.number\r\n                        }\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                        <span class=\"luckysheet-mousedown-cancel\">${rightclick.column}</span>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.to}${rightclick.right}${rightclick.add}\r\n                        <input type=\"text\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${\r\n                            rightclick.number\r\n                        }\" value=\"1\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                        <span class=\"luckysheet-mousedown-cancel\">${rightclick.column}</span>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            \r\n            -->\r\n\r\n            <!-- delete row or column\r\n            \r\n            <div id=\"luckysheetColsRowsHandleDel_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div id=\"luckysheet-delRows\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.deleteSelected}${rightclick.row}\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-delCols\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.deleteSelected}${rightclick.column}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            \r\n            -->\r\n\r\n            <!--\r\n            <div id=\"luckysheetColsRowsHandleHid_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div id=\"luckysheet-hidRows\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.hideSelected}${rightclick.row}\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-showHidRows\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.showHide}${rightclick.row}\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-hidCols\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.hideSelected}${rightclick.column}\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-showHidCols\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.showHide}${rightclick.column}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            -->\r\n\r\n            <div id=\"luckysheetCellsHandleDel_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div id=\"luckysheet-delCellsMoveLeft\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.moveLeft}\r\n                    </div>\r\n                </div>\r\n                <div id=\"luckysheet-delCellsMoveUp\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.moveUp}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            <div id=\"luckysheetmatrix_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.flip}\r\n                        <button id=\"luckysheet-matrix-turn-up\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${\r\n                            rightclick.upAndDown\r\n                        }</button>\r\n                        <button id=\"luckysheet-matrix-turn-left\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${\r\n                            rightclick.leftAndRight\r\n                        }</button>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.flip}\r\n                        <button id=\"luckysheet-matrix-turn-cw\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${\r\n                            rightclick.clockwise\r\n                        }</button>\r\n                        <button id=\"luckysheet-matrix-turn-anticw\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${\r\n                            rightclick.counterclockwise\r\n                        }</button>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div id=\"luckysheet-matrix-turn-trans\" class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                        rightclick.transpose\r\n                    }</div>\r\n                </div>\r\n                <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div>\r\n                <div id=\"luckysheet-matrix-cal-confirm\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        <div class=\"luckysheet-mousedown-cancel\">${rightclick.matrixCalculation}</div>\r\n                        <div class=\"luckysheet-mousedown-cancel\">\r\n                            <select id=\"luckysheet-matrix-cal-type\" class=\"luckysheet-mousedown-cancel\" style=\"height:20px;\">\r\n                                <option value=\"plus\">${rightclick.plus}</option>\r\n                                <option value=\"minus\">${rightclick.minus}</option>\r\n                                <option value=\"multiply\">${rightclick.multiply}</option>\r\n                                <option value=\"divided\">${rightclick.divided}</option>\r\n                                <option value=\"power\">${rightclick.power}</option>\r\n                                <option value=\"root\">${rightclick.root}</option>\r\n                                <option value=\"log\">${rightclick.log}</option>\r\n                            </select>\r\n                            <input type=\"number\" id=\"luckysheet-matrix-cal-value\" class=\"luckysheet-mousedown-cancel\" placeholder=\"${\r\n                                rightclick.number\r\n                            }\" value=\"2\" style=\"width:40px;height:20px;box-sizing:border-box;text-align: center;margin-left:5px;\"/>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.delete0}\r\n                        <button id=\"luckysheet-matrix-delezero-row\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${\r\n                            rightclick.byRow\r\n                        }</button>\r\n                        <button id=\"luckysheet-matrix-delezero-column\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${\r\n                            rightclick.byCol\r\n                        }</button>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">\r\n                        ${rightclick.removeDuplicate}\r\n                        <button id=\"luckysheet-matrix-delerpt-row\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${\r\n                            rightclick.byRow\r\n                        }</button>\r\n                        <button id=\"luckysheet-matrix-delerpt-column\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;\">${\r\n                            rightclick.byCol\r\n                        }</button>\r\n                    </div>\r\n                </div>\r\n            </div>`;\r\n\r\n    return rightclickContainer;\r\n}\r\n\r\nconst pivottableconfigHTML = function() {\r\n    const _locale = locale();\r\n    const locale_pivotTable = _locale.pivotTable;\r\n\r\n    return (\r\n        '<div class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel\" id=\"luckysheet-pivotTable-config-option\"> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <div class=\"luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.titleSort +\r\n        '</span> <select class=\"luckysheet-mousedown-cancel\" style=\"height:24px;\" id=\"luckysheet-pivotTable-config-option-order\"> <option selected=\"selected\" value=\"default\">' +\r\n        locale_pivotTable.titleNoSort +\r\n        '</option> <option value=\"asc\">' +\r\n        locale_pivotTable.titleSortAsc +\r\n        '</option> <option value=\"desc\">' +\r\n        locale_pivotTable.titleSortDesc +\r\n        '</option> </select> </div> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <div class=\"luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.titleSortBy +\r\n        '</span> <select class=\"luckysheet-mousedown-cancel\" style=\"height:24px;\" id=\"luckysheet-pivotTable-config-option-orderby\"> </select> </div> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <div class=\"luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.titleShowSum +\r\n        '</span> <select class=\"luckysheet-mousedown-cancel\" style=\"height:24px;\" id=\"luckysheet-pivotTable-config-option-stastic\"> <option  value=\"0\">' +\r\n        locale_pivotTable.titleStasticFalse +\r\n        '</option> <option value=\"1\" selected=\"selected\">' +\r\n        locale_pivotTable.titleStasticTrue +\r\n        \"</option> </select> </div> </div> </div> </div>\"\r\n    );\r\n};\r\n\r\nconst pivottablesumHTML = function() {\r\n    const _locale = locale();\r\n    const locale_pivotTable = _locale.pivotTable;\r\n\r\n    return (\r\n        '<div class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel\" id=\"luckysheet-pivotTable-config-option-sumtype\"> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"SUM\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.valueStatisticsSUM +\r\n        '</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"COUNT\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.valueStatisticsCOUNT +\r\n        '</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"COUNTA\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.valueStatisticsCOUNTA +\r\n        '</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"COUNTUNIQUE\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.valueStatisticsCOUNTUNIQUE +\r\n        '</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"AVERAGE\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.valueStatisticsAVERAGE +\r\n        '</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"MAX\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.valueStatisticsMAX +\r\n        '</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"MIN\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.valueStatisticsMIN +\r\n        '</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"MEDIAN\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.valueStatisticsMEDIAN +\r\n        '</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"PRODUCT\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.valueStatisticsPRODUCT +\r\n        '</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"STDEV\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.valueStatisticsSTDEV +\r\n        '</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"STDEVP\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.valueStatisticsSTDEVP +\r\n        '</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"VAR\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.valueStatisticslet +\r\n        '</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" sumtype=\"VARP\"> <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> <span class=\"luckysheet-mousedown-cancel\">' +\r\n        locale_pivotTable.valueStatisticsVARP +\r\n        '</span> <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\"><i class=\"fa fa-check luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></span> </div> </div> </div>'\r\n    );\r\n};\r\n\r\nconst sheetHTML =\r\n        '<div style=\"${style}\" id=\"luckysheet-sheets-item${index}\" data-index=\"${index}\" class=\"luckysheet-sheets-item ${active}\"><span class=\"luckysheet-sheets-item-name\" spellcheck =\"false\" contenteditable=\"false\">${name}</span> <span class=\"luckysheet-sheets-item-menu luckysheet-mousedown-cancel\"><i class=\"fa fa-sort-desc luckysheet-mousedown-cancel\"></i></span>${colorset}</div>',\r\n    columnHeaderHTML =\r\n        '<div class=\"luckysheet-cols-h-cells luckysheetsheetchange\"  id=\"luckysheet-cols-h-cells_${index}\" style=\"width:${width}px;\"> <div class=\"luckysheet-cols-h-cells-c\"> <div class=\"luckysheet-grdblkpush\"></div>${column}</div></div>',\r\n    sheetselectlistHTML =\r\n        '<div class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel\" id=\"luckysheet-sheet-list\">${item}</div>',\r\n    sheetselectlistitemHTML =\r\n        '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"  id=\"luckysheet-sheet-btn${index}\" data-index=\"${index}\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"${style}\" ><span class=\"icon luckysheet-mousedown-cancel\">${icon}</span>${name}</div></div>',\r\n    inputHTML =\r\n        '<div dir=\"ltr\"><div class=\"luckysheet-input-box-index\" id=\"luckysheet-input-box-index\"></div><div id=\"luckysheet-input-box\" spellcheck=\"false\" aria-hidden=\"false\" class=\"luckysheet-input-box\"><div class=\"luckysheet-cell-input editable\" tabindex=\"0\" role=\"combobox\" contenteditable=\"true\" id=\"luckysheet-rich-text-editor\" dir=\"ltr\" g_editable=\"true\" aria-autocomplete=\"list\"></div></div></div>',\r\n    modelHTML =\r\n        '<div id=\"${id}\" style=\"${style}\" class=\"luckysheet-modal-dialog ${addclass}\" tabindex=\"0\" role=\"dialog\" aria-labelledby=\":41e\" dir=\"ltr\"> <div class=\"luckysheet-modal-dialog-title luckysheet-modal-dialog-title-draggable\"> <span class=\"luckysheet-modal-dialog-title-text\" role=\"heading\">${title}</span>\t <span class=\"luckysheet-modal-dialog-title-close\" role=\"button\" tabindex=\"0\" aria-label=\"${close}\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></span> </div> <div class=\"luckysheet-modal-dialog-content\">${content}</div> <div class=\"luckysheet-modal-dialog-buttons\">\t ${botton} </div></div>',\r\n    maskHTML = '<div class=\"luckysheet-modal-dialog-mask\" id=\"luckysheet-modal-dialog-mask\"></div>';\r\n\r\n//底部 表格标签操作dom\r\nfunction sheetconfigHTML() {\r\n    const sheetconfig = locale().sheetconfig;\r\n\r\n    const config = customSheetRightClickConfig();\r\n\r\n    /* 如果配置项全部为flase，则隐藏入口且不再菜单项 */\r\n    if (Object.values(config).every((ele) => !ele)) {\r\n        $(\"#luckysheet-sheet-container-c\").addClass(\"luckysheet-sheet-container-menu-hide\");\r\n        return \"\";\r\n    }\r\n\r\n    let hideTopMenuseparator = true;\r\n    let moveTopMenuseparator = true;\r\n\r\n    // 1. 当一个功能菜单块上方的功能块按钮都隐藏的时候，下方的功能块的顶部分割线也需要隐藏\r\n    if (!config.delete && !config.copy && !config.rename && !config.color) {\r\n        hideTopMenuseparator = false;\r\n        if (!config.hide) {\r\n            moveTopMenuseparator = false;\r\n        }\r\n    }\r\n\r\n    // 2. 当一个功能菜单块内所有的按钮都隐藏的时候，它顶部的分割线也需要隐藏掉\r\n    if (!config.hide) {\r\n        hideTopMenuseparator = false;\r\n    }\r\n    if (!config.move) {\r\n        moveTopMenuseparator = false;\r\n    }\r\n\r\n    const sheetconfigModel = `<div id=\"luckysheet-rightclick-sheet-menu\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel\"> \r\n                <div id=\"luckysheetsheetconfigdelete\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                    config.delete ? \"block\" : \"none\"\r\n                };\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                        sheetconfig.delete\r\n                    }</div>\r\n                </div> \r\n                <div id=\"luckysheetsheetconfigcopy\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                    config.copy ? \"block\" : \"none\"\r\n                };\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${sheetconfig.copy}</div> \r\n                </div> \r\n                <div id=\"luckysheetsheetconfigrename\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                    config.rename ? \"block\" : \"none\"\r\n                };\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                        sheetconfig.rename\r\n                    }</div> \r\n                </div> \r\n                <div id=\"luckysheetsheetconfigcolor\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\" style=\"display:${\r\n                    config.color ? \"block\" : \"none\"\r\n                };\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"> \r\n                        ${\r\n                            sheetconfig.changeColor\r\n                        } <span class=\"luckysheet-submenu-arrow iconfont-luckysheet luckysheet-iconfont-youjiantou\" style=\"user-select: none;\"></span> \r\n                    </div> \r\n                </div> \r\n                <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\" style=\"display:${\r\n                    hideTopMenuseparator ? \"block\" : \"none\"\r\n                };\"></div> \r\n                <div id=\"luckysheetsheetconfighide\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                    config.hide ? \"block\" : \"none\"\r\n                };\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${sheetconfig.hide}</div> \r\n                </div> \r\n                <div id=\"luckysheetsheetconfigshow\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                    config.hide ? \"block\" : \"none\"\r\n                };\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                        sheetconfig.unhide\r\n                    }</div> \r\n                </div> \r\n                <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\" style=\"display:${\r\n                    moveTopMenuseparator ? \"block\" : \"none\"\r\n                };\"></div> \r\n                <div id=\"luckysheetsheetconfigmoveleft\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                    config.move ? \"block\" : \"none\"\r\n                };\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                        sheetconfig.moveLeft\r\n                    }</div> \r\n                </div> \r\n                <div id=\"luckysheetsheetconfigmoveright\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"display:${\r\n                    config.move ? \"block\" : \"none\"\r\n                };\"> \r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                        sheetconfig.moveRight\r\n                    }</div> \r\n                </div> \r\n            </div> \r\n            <div id=\"luckysheetsheetconfigcolor_sub\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel\">\r\n                <div id=\"luckysheetsheetconfigcolorreset\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\">\r\n                    <div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${\r\n                        sheetconfig.resetColor\r\n                    }</div>\r\n                </div> \r\n                <div class=\"luckysheet-mousedown-cancel\"> \r\n                    <div class=\"luckysheet-mousedown-cancel\"> \r\n                        <input type=\"text\" id=\"luckysheetsheetconfigcolorur\" /> \r\n                    </div> \r\n                </div> \r\n            </div>`;\r\n\r\n    return sheetconfigModel;\r\n}\r\n\r\nconst luckysheetPivotTableHTML = function() {\r\n    const _locale = locale();\r\n    const locale_pivotTable = _locale.pivotTable;\r\n    // return '<div id=\"luckysheet-modal-dialog-slider-pivot\" class=\"luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-pivot\"> <div class=\"luckysheet-modal-dialog-slider-title\"> <span>'+locale_pivotTable.title+'</span> <span id=\"luckysheet-modal-dialog-slider-close\" title=\"'+locale_pivotTable.closePannel+'\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></span> </div> <div class=\"luckysheet-modal-dialog-slider-content\"> <div class=\"luckysheet-modal-dialog-slider-range\"> <div id=\"luckysheet-dialog-pivotTable-range\"></div> <div id=\"luckysheet-dialog-pivotTable-range-seleted\">'+locale_pivotTable.editRange+'</div> </div> <div class=\"luckysheet-modal-dialog-slider-list-title\"> '+locale_pivotTable.tipPivotFieldSelected+' <span title=\"'+locale_pivotTable.tipClearSelectedField+'\" id=\"luckysheet-dialog-pivotTable-clearitem\">'+locale_pivotTable.btnClearSelectedField+'</span></div> <div id=\"luckysheet-modal-dialog-pivotTable-list\" class=\"luckysheet-modal-dialog-slider-list luckysheet-scrollbars\"> </div> <div class=\"luckysheet-modal-dialog-slider-config-c\"> <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-filter\"> <div> <span><i class=\"fa fa-filter luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i> '+locale_pivotTable.btnFilter+'</span> </div> <div id=\"luckysheet-modal-dialog-config-filter\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div> </div> <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-row\"> <div> <span><i class=\"fa fa-list-alt\" aria-hidden=\"true\"></i> '+locale_pivotTable.titleRow+'</span> </div> <div id=\"luckysheet-modal-dialog-config-row\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div> </div> <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-column\"> <div> <span><i class=\"fa fa-indent\" aria-hidden=\"true\"></i> '+locale_pivotTable.titleColumn+'</span> </div> <div id=\"luckysheet-modal-dialog-config-column\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div> </div> <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-value\"> <div> <span><i class=\"fa fa-cube\" aria-hidden=\"true\"></i> '+locale_pivotTable.titleValue+'</span> <span style=\"float: right;margin-right: 10px;display:none;\" id=\"luckysheetpivottablevaluecolrowshow\"><label style=\"padding:0px 5px;margin:0px;font-size:12px;height:15px;line-height:15px;\" title=\"'+locale_pivotTable.tipShowColumn+'\" for=\"luckysheetpivottablevaluecolrow\">'+locale_pivotTable.titleColumn+'</label> <input type=\"radio\" checked=\"checked\" value=\"1\" name=\"luckysheetpivottablevaluecolrow\" id=\"luckysheetpivottablevaluecolrow\" /> <label style=\"padding:0px 5px;margin:0px;font-size:12px;height:15px;line-height:15px;\" title=\"'+locale_pivotTable.tipShowRow+'\" for=\"luckysheetpivottablevaluecolrow1\">'+locale_pivotTable.titleRow+'</label> <input type=\"radio\" value=\"0\" name=\"luckysheetpivottablevaluecolrow\" id=\"luckysheetpivottablevaluecolrow1\" /></span></div> <div id=\"luckysheet-modal-dialog-config-value\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div> </div> </div> </div> </div>';\r\n    return `\r\n        <div id=\"luckysheet-modal-dialog-slider-pivot\" class=\"luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-pivot\">\r\n        <div class=\"luckysheet-modal-dialog-slider-title\"> <span>${locale_pivotTable.title}</span> <span id=\"luckysheet-modal-dialog-slider-close\" title=\"${locale_pivotTable.closePannel}\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></span> </div>\r\n        <div class=\"luckysheet-modal-dialog-slider-content\">\r\n            <div class=\"luckysheet-modal-dialog-slider-range\">\r\n                <div id=\"luckysheet-dialog-pivotTable-range\"></div>\r\n                <div id=\"luckysheet-dialog-pivotTable-range-seleted\">${locale_pivotTable.editRange}</div>\r\n            </div>\r\n            <div class=\"luckysheet-modal-dialog-slider-list-title\"> ${locale_pivotTable.tipPivotFieldSelected} <span title=\"${locale_pivotTable.tipClearSelectedField}\" id=\"luckysheet-dialog-pivotTable-clearitem\">${locale_pivotTable.btnClearSelectedField}</span></div>\r\n            <div id=\"luckysheet-modal-dialog-pivotTable-list\" class=\"luckysheet-modal-dialog-slider-list luckysheet-scrollbars\"> </div>\r\n            <div class=\"luckysheet-modal-dialog-slider-config-c\">\r\n                <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-filter\">\r\n                    <div> <span><i class=\"fa fa-filter luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i> ${locale_pivotTable.btnFilter}</span> </div>\r\n                    <div id=\"luckysheet-modal-dialog-config-filter\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div>\r\n                </div>\r\n                <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-row\">\r\n                    <div> <span><i class=\"fa fa-list-alt\" aria-hidden=\"true\"></i> ${locale_pivotTable.titleRow}</span> </div>\r\n                    <div id=\"luckysheet-modal-dialog-config-row\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div>\r\n                </div>\r\n                <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-column\">\r\n                    <div> <span><i class=\"fa fa-indent\" aria-hidden=\"true\"></i> ${locale_pivotTable.titleColumn}</span> </div>\r\n                    <div id=\"luckysheet-modal-dialog-config-column\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div>\r\n                </div>\r\n                <div class=\"luckysheet-modal-dialog-slider-config luckysheet-modal-dialog-config-value\">\r\n                    <div> <span><i class=\"fa fa-cube\" aria-hidden=\"true\"></i> ${locale_pivotTable.titleValue}</span> <span style=\"float: right;margin-right: 10px;display:none;\" id=\"luckysheetpivottablevaluecolrowshow\"><label style=\"padding:0px 5px;margin:0px;font-size:12px;height:15px;line-height:15px;\" title=\"${locale_pivotTable.tipShowColumn}\" for=\"luckysheetpivottablevaluecolrow\">${locale_pivotTable.titleColumn}</label> <input type=\"radio\" checked=\"checked\" value=\"1\" name=\"luckysheetpivottablevaluecolrow\" id=\"luckysheetpivottablevaluecolrow\" /> <label style=\"padding:0px 5px;margin:0px;font-size:12px;height:15px;line-height:15px;\" title=\"${locale_pivotTable.tipShowRow}\" for=\"luckysheetpivottablevaluecolrow1\">${locale_pivotTable.titleRow}</label> <input type=\"radio\" value=\"0\" name=\"luckysheetpivottablevaluecolrow\" id=\"luckysheetpivottablevaluecolrow1\" /></span></div>\r\n                    <div id=\"luckysheet-modal-dialog-config-value\" class=\"luckysheet-modal-dialog-slider-config-list luckysheet-scrollbars\"> </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        </div>\r\n        `;\r\n};\r\n\r\nfunction filtermenuHTML() {\r\n    const _locale = locale();\r\n    const locale_filter = _locale.filter;\r\n\r\n    return `<div class=\"luckysheet-cols-menu luckysheet-mousedown-cancel luckysheet-filter-menu\" id=\"luckysheet-\\${menuid}-menu\"><div id=\"luckysheet-\\${menuid}-orderby-asc\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.sortByAsc}</div></div><div id=\"luckysheet-\\${menuid}-orderby-desc\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"><div style=\"width:205px;\" class=\"luckysheet-mousedown-cancel\">${locale_filter.sortByDesc}</div></div></div> <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div><div id=\"luckysheet-\\${menuid}-orderby-color\" class=\"luckysheet-cols-menuitem luckysheet-cols-submenu luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"position: relative;\">${locale_filter.filterByColor}<span class=\"luckysheet-submenu-arrow iconfont-luckysheet luckysheet-iconfont-youjiantou\" style=\"user-select: none;right: 0;\"></span></div></div><div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-bycondition\" style=\"padding-top:0px;padding-bottom:0px;\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"><i class=\"fa fa-caret-right\" aria-hidden=\"true\"></i> ${locale_filter.filterByCondition}</div></div> <div class=\"luckysheet-\\${menuid}-bycondition\" style=\"display:none;\"><div class=\"luckysheet-flat-menu-button luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-selected\"><span class=\"luckysheet-mousedown-cancel\" data-value=\"null\" data-type=\"0\">${locale_filter.filiterInputNone}</span><div class=\"luckysheet-mousedown-cancel\"><i class=\"fa fa-sort\" aria-hidden=\"true\"></i></div></div><div class=\"luckysheet-\\${menuid}-selected-input\"><input type=\"text\" placeholder=\"${locale_filter.filiterInputTip}\" class=\"luckysheet-mousedown-cancel\" /></div><div class=\"luckysheet-\\${menuid}-selected-input luckysheet-\\${menuid}-selected-input2\"><span>${locale_filter.filiterRangeStart}</span><input type=\"text\" placeholder=\"${locale_filter.filiterRangeStartTip}\" class=\"luckysheet-mousedown-cancel\" /><span>${locale_filter.filiterRangeEnd}</span><input type=\"text\" placeholder=\"${locale_filter.filiterRangeEndTip}\" class=\"luckysheet-mousedown-cancel\" /></div></div> <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-byvalue\" style=\"padding-top:0px;padding-bottom:0px;\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"><i class=\"fa fa-caret-right\" aria-hidden=\"true\"></i> ${locale_filter.filterByValues}</div></div> <div class=\"luckysheet-\\${menuid}-byvalue\"><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel luckysheet-mousedown-\\${menuid}-byvalue-btn\"><span id=\"luckysheet-\\${menuid}-byvalue-btn-all\" class=\"luckysheet-mousedown-cancel\">${locale_filter.filterValueByAllBtn}</span> - <span id=\"luckysheet-\\${menuid}-byvalue-btn-clear\" class=\"luckysheet-mousedown-cancel\">${locale_filter.filterValueByClearBtn}</span> - <span id=\"luckysheet-\\${menuid}-byvalue-btn-contra\" class=\"luckysheet-mousedown-cancel\">${locale_filter.filterValueByInverseBtn}</span> <div><i class=\"fa fa-\\${menuid} luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></div></div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"padding-left:3px; padding-right:3px;\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"><input type=\"text\" placeholder=\"${locale_filter.filterValueByTip}\" class=\"luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-byvalue-input\" /><div class=\"luckysheet-\\${menuid}-byvalue-input-icon luckysheet-mousedown-cancel\"><i class=\"fa fa-search luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></div></div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"><div id=\"luckysheet-\\${menuid}-byvalue-select\" class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"></div></div></div> <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\"><div class=\"btn btn-primary luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-confirm\">${locale_filter.filterConform}</div> <div class=\"btn btn-default luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-cancel\">${locale_filter.filterCancel}</div> <div class=\"btn btn-danger luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-initial\">${locale_filter.clearFilter}</div></div></div> </div>`;\r\n}\r\n\r\nfunction filtersubmenuHTML() {\r\n    const _locale = locale();\r\n    const locale_filter = _locale.filter;\r\n\r\n    return `<div style=\"z-index:1004;overflow-y:auto;\" class=\"luckysheet-filter-submenu luckysheet-cols-menu luckysheet-mousedown-cancel\" id=\"luckysheet-\\${menuid}-submenu\"><div data-value=\"null\" data-type=\"0\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionNone}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"cellnull\"  data-type=\"0\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellIsNull}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"cellnonull\"  data-type=\"0\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellNotNull}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"textinclude\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellTextContain}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"textnotinclude\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellTextNotContain}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"textstart\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellTextStart}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"textend\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellTextEnd}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"textequal\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellTextEqual}</div></div>  <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div>  <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"dateequal\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellDateEqual}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"datelessthan\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellDateBefore}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"datemorethan\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellDateAfter}</div></div> <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div> <div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"morethan\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellGreater}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"moreequalthan\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellGreaterEqual}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"lessthan\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellLess}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"lessequalthan\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellLessEqual}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"equal\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellEqual}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"noequal\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellNotEqual}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"include\"  data-type=\"2\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellBetween}</div></div><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-value=\"noinclude\" data-type=\"2\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${locale_filter.conditionCellNotBetween}</div></div> </div>`;\r\n}\r\n\r\nfunction luckysheetAlternateformatHtml() {\r\n    const _locale = locale();\r\n    const alternatingColors = _locale.alternatingColors;\r\n    const toolbar = _locale.toolbar;\r\n\r\n    return (\r\n        '<div id=\"luckysheet-modal-dialog-slider-alternateformat\" class=\"luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-alternateformat\" style=\"display: block;\">' +\r\n        '<div class=\"luckysheet-modal-dialog-slider-title\">' +\r\n        \"<span>\" +\r\n        toolbar.alternatingColors +\r\n        \"</span>\" +\r\n        '<span class=\"luckysheet-model-close-btn\" title=\"' +\r\n        alternatingColors.close +\r\n        '\">' +\r\n        '<i class=\"fa fa-times\" aria-hidden=\"true\"></i>' +\r\n        \"</span>\" +\r\n        \"</div>\" +\r\n        '<div class=\"luckysheet-modal-dialog-slider-content\">' +\r\n        '<div class=\"textTitle\">' +\r\n        alternatingColors.applyRange +\r\n        \"</div>\" +\r\n        '<div id=\"luckysheet-alternateformat-range\">' +\r\n        '<input class=\"formulaInputFocus\" placeholder=\"' +\r\n        alternatingColors.selectRange +\r\n        '\"/>' +\r\n        '<i class=\"fa fa-table\" aria-hidden=\"true\"></i>' +\r\n        \"</div>\" +\r\n        '<div id=\"luckysheet-alternateformat-checkbox\">' +\r\n        '<div class=\"cf\">' +\r\n        '<input type=\"checkbox\" id=\"luckysheet-alternateformat-rowHeader\"/>' +\r\n        '<label for=\"luckysheet-alternateformat-rowHeader\">' +\r\n        alternatingColors.header +\r\n        \"</label>\" +\r\n        \"</div>\" +\r\n        '<div class=\"cf\">' +\r\n        '<input type=\"checkbox\" id=\"luckysheet-alternateformat-rowFooter\"/>' +\r\n        '<label for=\"luckysheet-alternateformat-rowFooter\">' +\r\n        alternatingColors.footer +\r\n        \"</label>\" +\r\n        \"</div>\" +\r\n        \"</div>\" +\r\n        '<div class=\"textTitle\">' +\r\n        alternatingColors.textTitle +\r\n        \"</div>\" +\r\n        '<div id=\"luckysheet-alternateformat-modelList\" class=\"cf\"></div>' +\r\n        '<div class=\"textTitle\">' +\r\n        alternatingColors.custom +\r\n        \"</div>\" +\r\n        '<div id=\"luckysheet-alternateformat-modelCustom\" class=\"cf\"></div>' +\r\n        '<div id=\"luckysheet-alternateformat-modelToning\">' +\r\n        '<div class=\"toningbox header\">' +\r\n        '<div class=\"toningShow\"> ' +\r\n        alternatingColors.header +\r\n        \" </div>\" +\r\n        '<div class=\"luckysheet-color-menu-button-indicator\" title=\"' +\r\n        alternatingColors.selectionTextColor +\r\n        '\" style=\"border-bottom-color: #000;margin-right: 10px;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color\" style=\"user-select: none;\"> </div> </div> </div>' +\r\n        '<div class=\"luckysheet-color-menu-button-indicator\" title=\"' +\r\n        alternatingColors.selectionCellColor +\r\n        '\" style=\"border-bottom-color: #fff;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color\" style=\"user-select: none;\"> </div> </div> </div>' +\r\n        \"</div>\" +\r\n        '<div class=\"toningbox ctOne\">' +\r\n        '<div class=\"toningShow\"> ' +\r\n        alternatingColors.colorShow +\r\n        \"1 </div>\" +\r\n        '<div class=\"luckysheet-color-menu-button-indicator\" title=\"' +\r\n        alternatingColors.selectionTextColor +\r\n        '\" style=\"border-bottom-color: #000;margin-right: 10px;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color\" style=\"user-select: none;\"> </div> </div> </div>' +\r\n        '<div class=\"luckysheet-color-menu-button-indicator\" title=\"' +\r\n        alternatingColors.selectionCellColor +\r\n        '\" style=\"border-bottom-color: #fff;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color\" style=\"user-select: none;\"> </div> </div> </div>' +\r\n        \"</div>\" +\r\n        '<div class=\"toningbox ctTwo\">' +\r\n        '<div class=\"toningShow\"> ' +\r\n        alternatingColors.colorShow +\r\n        \"2 </div>\" +\r\n        '<div class=\"luckysheet-color-menu-button-indicator\" title=\"' +\r\n        alternatingColors.selectionTextColor +\r\n        '\" style=\"border-bottom-color: #000;margin-right: 10px;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color\" style=\"user-select: none;\"> </div> </div> </div>' +\r\n        '<div class=\"luckysheet-color-menu-button-indicator\" title=\"' +\r\n        alternatingColors.selectionCellColor +\r\n        '\" style=\"border-bottom-color: #fff;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color\" style=\"user-select: none;\"> </div> </div> </div>' +\r\n        \"</div>\" +\r\n        '<div class=\"toningbox footer\">' +\r\n        '<div class=\"toningShow\"> ' +\r\n        alternatingColors.footer +\r\n        \" </div>\" +\r\n        '<div class=\"luckysheet-color-menu-button-indicator\" title=\"' +\r\n        alternatingColors.selectionTextColor +\r\n        '\" style=\"border-bottom-color: #000;margin-right: 10px;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color\" style=\"user-select: none;\"> </div> </div> </div>' +\r\n        '<div class=\"luckysheet-color-menu-button-indicator\" title=\"' +\r\n        alternatingColors.selectionCellColor +\r\n        '\" style=\"border-bottom-color: #fff;\"> <div class=\"luckysheet-icon luckysheet-inline-block\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color\" style=\"user-select: none;\"> </div> </div> </div>' +\r\n        \"</div>\" +\r\n        \"</div>\" +\r\n        '<button id=\"luckysheet-alternateformat-remove\" class=\"btn btn-default\" style=\"margin: 10px;\">' +\r\n        alternatingColors.removeColor +\r\n        \"</button>\" +\r\n        \"</div>\" +\r\n        \"</div>\"\r\n    );\r\n}\r\n\r\nconst luckysheetchartpointconfigHTML =\r\n    '<div class=\"luckysheet-chart-point-config\"> <div class=\"luckysheet-chart-point-config-set\"> <div class=\"luckysheet-chart-point-config-left\"> <div class=\"luckysheet-chart-point-config-left-top\"> <div class=\"luckysheet-chart-point-searchcondition\"> <div class=\"luckysheet-datavisual-content-row\" style=\"margin-bottom: 0px;margin-top: 0px;height: 30px;\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">选择维度</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <select data-tips=\"维度选择\" name=\"luckysheetpointconfigsearchdim\" id=\"luckysheetpointconfigsearchdim\"> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"margin-bottom: 0px;margin-top: 3px;height: 30px;\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;\">排序</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <label data-tips=\"无排序\" for=\"luckysheetpointconfigsearchorderno\">无排序</label> <input type=\"radio\" checked=\"checked\" value=\"0\" name=\"luckysheetpointconfigsearchorder\" id=\"luckysheetpointconfigsearchorderno\"> <label data-tips=\"升序\" for=\"luckysheetpointconfigsearchorderasc\">升序</label> <input type=\"radio\" value=\"1\" name=\"luckysheetpointconfigsearchorder\" id=\"luckysheetpointconfigsearchorderasc\"> <label data-tips=\"降序\" for=\"luckysheetpointconfigsearchorderdesc\">降序</label> <input type=\"radio\" value=\"2\" name=\"luckysheetpointconfigsearchorder\" id=\"luckysheetpointconfigsearchorderdesc\"> </div> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"margin-bottom: 0px;margin-top: 5px;height: 30px;\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:90%;text-align: left;\"> <select data-width=\"70\" data-tips=\"按照什么方式查询\" name=\"luckysheetpointconfigsearchtype\" id=\"luckysheetpointconfigsearchtype\"> <option value=\"0\" selected=\"selected\">按照名称</option> <option value=\"1\">按排序前%</option> </select> <input data-tips=\"查询关于点的关键字\" id=\"luckysheetpointconfigsearchcontent\" type=\"text\" class=\"luckysheet-datavisual-config-input-no\" style=\"width:40%;\" placeholder=\"查询内容\" /> <button id=\"luckysheetpointconfigsearchcomfirm\" class=\"btn btn-primary luckysheet-model-conform-btn\">查询</button> </div> </div> </div> </div> <div class=\"luckysheet-chart-point-config-left-mid\"> <span id=\"luckysheet-chart-point-btn-all\" class=\"luckysheet-mousedown-cancel\">全选</span> - <span id=\"luckysheet-chart-point-btn-clear\" class=\"luckysheet-mousedown-cancel\">清除</span> - <span id=\"luckysheet-chart-point-btn-contra\" class=\"luckysheet-mousedown-cancel\">反选</span><span style=\"text-decoration:none;color:#8D8D8D;float:right;margin-right:40px;cursor:default;\" class=\"luckysheet-mousedown-cancel\">可以直接框选数据点</span> </div> <div class=\"luckysheet-chart-point-config-left-bottom\"> <div class=\"luckysheet-chart-point-searchitem-c luckysheet-noselected-text\">  </div> </div> </div> <div class=\"luckysheet-chart-point-config-right\"> <div class=\"luckysheet-chart-point-itemconfig\"> <div class=\"luckysheet-datavisual-content-row\" style=\"font-size: 16px;font-weight: bold;\"> 数据点设置 </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">图形颜色</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <input data-tips=\"颜色\" class=\"luckysheet-datavisual-config-colorOpacity\" id=\"scattersingleitemstylecolor\" type=\"text\" data-bigclass=\"scattersingle\" data-attr=\"itemstyle\" data-func=\"color\" /> </div> </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">图形大小</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <select data-sliderdiy=\"scattersingleallsymbolsizeslider\" data-tips=\"点大小设置\" name=\"scattersingleallsymbolsize\" id=\"scattersingleallsymbolsize\" data-width=\"50\" data-bigclass=\"scattersingle\" data-attr=\"all\" data-func=\"symbolsize\"> <option value=\"4\" selected=\"selected\">4px</option> <option value=\"6\">6px</option> <option value=\"8\">8px</option> <option value=\"10\">10px</option> <option value=\"12\">12px</option> <option value=\"14\">14px</option> <option value=\"16\">16px</option> <option value=\"diy\">自定义</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"display:none;\"> <div data-tips=\"滑动修改点大小\" id=\"scattersingleallsymbolsizeslider\" data-bigclass=\"scattersingle\" data-attr=\"all\" data-func=\"symbolsize\" class=\"luckysheet-datavisual-config-slider\" style=\"width:70%;\" data-min=\"1\" data-max=\"50\" data-step=\"1\"></div> <input data-tips=\"自定义点大小\" data-sliderid=\"scattersingleallsymbolsizeslider\" id=\"scattersingleallsymbolsizesliderdiy\" type=\"text\" class=\"luckysheet-datavisual-config-input\" data-bigclass=\"scattersingle\" data-attr=\"all\" data-func=\"symbolsize\" placeholder=\"请输入\" style=\"width:10%;margin-left:10px;text-align:center;margin-right: 2px;\" /><label for=\"scattersingleallsymbolsizesliderdiy\">px</label> </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">图形形状</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <select data-tips=\"点类型设置\" data-width=\"70\" name=\"scattersingleallsymboltype\" id=\"scattersingleallsymboltype\" data-bigclass=\"scattersingle\" data-attr=\"all\" data-func=\"symboltype\"> <option value=\"emptyCircle\" selected=\"selected\">空心圆</option> <option value=\"circle\">圆形</option> <option value=\"emptyRectangle\">空心矩形</option> <option value=\"rect\">矩形</option> <option value=\"roundRect\">圆角矩形</option> <option value=\"emptyTriangle\">空心三角</option> <option value=\"triangle\">三角形</option> <option value=\"emptyDiamond\">空心菱形</option> <option value=\"diamond\">菱形</option> <option value=\"droplet\">水滴</option> <option value=\"pin\">标注</option> <option value=\"arrow\">箭头</option> <option value=\"heart\">心形</option> <option value=\"star\">星星</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-rowsplit-sub\"></div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">边框粗细</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <select data-sliderdiy=\"scattersingleitemstyleborderwidthslider\" data-tips=\"点边框粗细\" name=\"scattersingleitemstyleborderwidth\" id=\"scattersingleitemstyleborderwidth\" data-width=\"50\" data-bigclass=\"scattersingle\" data-attr=\"itemstyle\" data-func=\"borderwidth\"><option value=\"0\" selected=\"selected\">无</option> <option value=\"1\">1px</option> <option value=\"2\">2px</option> <option value=\"3\">3px</option> <option value=\"4\">4px</option> <option value=\"5\">5px</option> <option value=\"6\">6px</option> <option value=\"7\">7px</option> <option value=\"8\">8px</option> <option value=\"diy\">自定义</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"display:none;\"> <div data-tips=\"滑动修改边框粗细\" id=\"scattersingleitemstyleborderwidthslider\" data-bigclass=\"scattersingle\" data-attr=\"itemstyle\" data-func=\"borderwidth\" class=\"luckysheet-datavisual-config-slider\" style=\"width:70%;\" data-min=\"12\" data-max=\"100\" data-step=\"1\"></div> <input data-tips=\"自定义边框粗细\" data-sliderid=\"scattersingleitemstyleborderwidthslider\" id=\"scattersingleitemstyleborderwidthsliderdiy\" type=\"text\" class=\"luckysheet-datavisual-config-input\" data-bigclass=\"scattersingle\" data-attr=\"itemstyle\" data-func=\"borderwidth\" placeholder=\"请输入\" style=\"width:10%;margin-left:10px;text-align:center;margin-right: 2px;\" /><label for=\"scattersingleitemstyleborderwidthsliderdiy\">%</label> </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">边框样式</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <select data-tips=\"点边框类型设置\" data-width=\"50\" name=\"scattersingleitemstyleborderlinetype\" id=\"scattersingleitemstyleborderlinetype\" data-bigclass=\"scattersingle\" data-attr=\"itemstyle\" data-func=\"borderlinetype\"> <option value=\"solid\" selected=\"selected\">实线</option> <option value=\"dashed\">虚线</option> <option value=\"dotted\">点线</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">边框颜色</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <input data-tips=\"点边框颜色\" class=\"luckysheet-datavisual-config-colorOpacity\" id=\"scattersingleitemstyleborderlinecolor\" type=\"text\" data-bigclass=\"scattersingle\" data-attr=\"itemstyle\" data-func=\"borderlinecolor\" /> </div> </div> <div class=\"luckysheet-datavisual-content-rowsplit-sub\"></div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\"><i class=\"fa fa-th-large\" aria-hidden=\"true\"></i> 文字标签</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <label data-tips=\"显示数据点的标签\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelshow\" for=\"scattersinglelabellabelshow\">显示</label> <input type=\"radio\" checked=\"checked\" value=\"1\" name=\"scattersinglelabellabelshow\" id=\"scattersinglelabellabelshow\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelshow\"> <label data-tips=\"隐藏数据点的标签\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelshow\" for=\"scattersinglelabellabelshow1\">隐藏</label> <input type=\"radio\" value=\"0\" name=\"scattersinglelabellabelshow\" id=\"scattersinglelabellabelshow1\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelshow\"> </div> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"height:auto;line-height: initial;margin-left:auto;\" showfor=\"scattersinglelabellabelshow1\" hidefor=\"scattersinglelabellabelshow\"> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:40%;\">数值比例</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:50%;\"> <select data-tips=\"刻度数值放大比例\" name=\"scattersinglelabelformatratio\" id=\"scattersinglelabelformatratio\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"formatratio\"> <option value=\"0.01\">乘以100</option> <option value=\"0.1\">乘以10</option> <option value=\"1\" selected=\"selected\">默认</option> <option value=\"10\">除以10</option> <option value=\"100\">除以100</option> <option value=\"1000\">除以1000</option> <option value=\"10000\">除以1万</option> <option value=\"100000\">除以10万</option> <option value=\"1000000\">除以一百万</option> <option value=\"10000000\">除以一千万</option> <option value=\"100000000\">除以一亿</option> <option value=\"1000000000\">除以十亿</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:40%;white-space: nowrap;\">小数位数</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:50%;\"> <select data-tips=\"数值小数点位数\" name=\"scattersinglelabelfloatlen\" id=\"scattersinglelabelfloatlen\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"floatlen\"> <option value=\"auto\" selected=\"selected\">自动显示</option> <option value=\"0\">整数</option> <option value=\"1\">1位小数</option> <option value=\"2\">2位小数</option> <option value=\"3\">3位小数</option> <option value=\"4\">4位小数</option> <option value=\"5\">5位小数</option> <option value=\"6\">6位小数</option> <option value=\"7\">7位小数</option> <option value=\"8\">8位小数</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\"> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:20%;\">标签格式</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:70%;\"> <select data-sliderdiy=\"scattersinglelabelcontentformatslider\" data-tips=\"标签显示格式\" name=\"scattersinglelabelcontentformat\" id=\"scattersinglelabelcontentformat\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"contentformat\"> <option value=\"default\" selected=\"selected\">默认</option> <option value=\"1\">仅数据名</option> <option value=\"2\">数据名+2维数值</option> <option value=\"5\">数据名+全部数值</option> <option value=\"diy\">自定义</option> </select> </div> </div> <div style=\"display:none;\"> <div class=\"luckysheet-datavisual-content-row\" id=\"scattersinglelabelcontentformatslider\"> <div style=\"text-align:center; width:60px; display:inline-block;\">数据名称</div> <label data-tips=\"是否显示数据名\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"scattersingledatalabelshow\" for=\"scattersinglelabeldatalabelshow\" style=\"font-weight:bold;\"><i class=\"fa fa-eye\" aria-hidden=\"true\"></i></label> <input type=\"checkbox\" checked=\"checked\" name=\"scattersinglelabeldatalabelshow\" id=\"scattersinglelabeldatalabelshow\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"scattersingledatalabelshow\"> <input data-tips=\"显示在数据名前部文字\" placeholder=\"前缀\" id=\"scattersinglelabeldatalabelprefix\" type=\"text\" class=\"luckysheet-datavisual-config-input\" style=\"width:60px;height:19px;\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"scattersingledatalabelprefix\" /> <input data-tips=\"显示在数据名尾部文字\" placeholder=\"后缀\" id=\"scattersinglelabeldatalabelsuffix\" type=\"text\" class=\"luckysheet-datavisual-config-input\" style=\"width:60px;height:19px;\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"scattersingledatalabelsuffix\" /> <label data-tips=\"是否在数据名后换行\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"scattersingledatalabelline\" for=\"scattersinglelabeldatalabelline\" style=\"font-weight:bold;\">换行</label> <input type=\"checkbox\" checked=\"checked\" name=\"scattersinglelabeldatalabelline\" id=\"scattersinglelabeldatalabelline\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"scattersingledatalabelline\"> </div> </div> <div class=\"luckysheet-datavisual-content-row\" > <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-title luckysheet-datavisual-content-column-2x\" style=\"width:10%;white-space:nowrap;\">标签位置</div> <div class=\"luckysheet-datavisual-content-column luckysheet-datavisual-content-column-right luckysheet-datavisual-content-column-2x\" style=\"width:80%;\"> <select data-sliderdiy=\"scattersinglelabellabelplaceslider\" data-tips=\"标签距离图形位置\" data-width=\"70\" name=\"scattersinglelabellabelplace\" id=\"scattersinglelabellabelplace\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelplace\"> <option value=\"top\" selected=\"selected\">顶端</option> <option value=\"left\">左侧</option> <option value=\"right\">右侧</option> <option value=\"bottom\">底部</option> <option value=\"inside\">内部居中</option> <option value=\"diy\">自定义</option> <option value=\"insideLeft\">内部左侧</option> <option value=\"insideRight\">内部右侧</option> <option value=\"insideTop\">内部顶端</option> <option value=\"insideBottom\">内部底端</option> <option value=\"insideTopLeft\">内部左上</option> <option value=\"insideBottomLeft\">内部左下</option> <option value=\"insideTopRight\">内部右上</option> <option value=\"insideBottomRight\">内部右下</option> </select> </div> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"display:none;height:65px;\"> <div data-tips=\"滑动修改点文本水平位置\" id=\"scattersinglelabellabelplaceslider\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelplacediy\" class=\"luckysheet-datavisual-config-slider\" style=\"width:70%;\" data-min=\"-100\" data-max=\"100\" data-step=\"1\"></div> <input data-tips=\"自定义点文本水平位置\" data-sliderid=\"scattersinglelabellabelplaceslider\" id=\"scattersinglelabellabelplacesliderdiy\" type=\"text\" class=\"luckysheet-datavisual-config-input\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelplacediy\" placeholder=\"请输入\" style=\"width:10%;margin-left:10px;text-align:center;margin-right: 2px;\" /><label for=\"scattersinglelabellabelplacesliderdiy\">px</label> <br /> <div data-tips=\"滑动修改点文本垂直位置\" id=\"scattersinglelabellabelplaceslider1\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelplacediy\" class=\"luckysheet-datavisual-config-slider\" style=\"width:70%;\" data-min=\"-100\" data-max=\"100\" data-step=\"1\"></div> <input data-tips=\"自定义点文本垂直位置\" data-sliderid=\"scattersinglelabellabelplaceslider1\" id=\"scattersinglelabellabelplaceslider1diy\" type=\"text\" class=\"luckysheet-datavisual-config-input\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelplacediy\" placeholder=\"请输入\" style=\"width:10%;margin-left:10px;text-align:center;margin-right: 2px;\" /><label for=\"scattersinglelabellabelplaceslider1diy\">px</label> </div> <div class=\"luckysheet-datavisual-content-row\"> <label data-tips=\"加粗\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelbold\" for=\"scattersinglelabellabelbold\" style=\"font-weight:bold;\"><i class=\"fa fa-bold\" aria-hidden=\"true\"></i></label> <input type=\"checkbox\" name=\"scattersinglelabellabelbold\" id=\"scattersinglelabellabelbold\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelbold\"> <label data-tips=\"斜体\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelitalic\" for=\"scattersinglelabellabelitalic\" class=\"luckysheet-datavisual-content-column-italic\"><i class=\"fa fa-italic\" aria-hidden=\"true\"></i></label> <input type=\"checkbox\" name=\"scattersinglelabellabelitalic\" id=\"scattersinglelabellabelitalic\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelitalic\"> <select data-sliderdiy=\"scattersinglelabellabelfontsizeslider\" data-width=\"50\" data-tips=\"字体大小\" name=\"scattersinglelabellabelfontsize\" id=\"scattersinglelabellabelfontsize\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelfontsize\"> <option value=\"12\">12px</option> <option value=\"14\">14px</option> <option value=\"16\">16px</option> <option value=\"18\">18px</option> <option value=\"20\">20px</option> <option value=\"22\">22px</option> <option value=\"24\">24px</option> <option value=\"30\">30px</option> <option value=\"36\">36px</option> <option value=\"diy\">自定义</option> </select> <input data-tips=\"字体颜色\" class=\"luckysheet-datavisual-config-color\" id=\"scattersinglelinelabelcolor\" type=\"text\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelcolor\" /> </div> <div class=\"luckysheet-datavisual-content-row\" style=\"display:none;\"> <div data-tips=\"滑动修改字体大小\" id=\"scattersinglelabellabelfontsizeslider\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelfontsize\" class=\"luckysheet-datavisual-config-slider\" style=\"width:70%;\" data-min=\"12\" data-max=\"100\" data-step=\"1\"></div> <input data-tips=\"自定义字体大小\" data-sliderid=\"scattersinglelabellabelfontsizeslider\" id=\"scattersinglelabellabelfontsizesliderdiy\" type=\"text\" class=\"luckysheet-datavisual-config-input\" data-bigclass=\"scattersingle\" data-attr=\"label\" data-func=\"labelfontsize\" placeholder=\"请输入\" style=\"width:10%;margin-left:10px;text-align:center;margin-right: 2px;\" /><label for=\"scattersinglelabellabelfontsizesliderdiy\">px</label> </div> </div> </div> </div> </div> <div class=\"luckysheet-chart-point-config-chart\"> <div id=\"luckysheet-chart-point-config-chart-c\" class=\"luckysheet-chart-point-config-chart-c\"> </div> </div> </div>';\r\nconst luckysheetToolHTML =\r\n    '<div id=\"luckysheet-tooltip-up\" class=\"jfk-tooltip\" role=\"tooltip\" aria-hidden=\"true\" style=\"left: 505px; top: 410px;\"><div class=\"jfk-tooltip-contentId\">组合图表</div><div class=\"jfk-tooltip-arrow jfk-tooltip-arrowup\" style=\"left: 35.5px;\"><div class=\"jfk-tooltip-arrowimplbefore\"></div><div class=\"jfk-tooltip-arrowimplafter\"></div></div></div>';\r\n\r\n// toolbar\r\nfunction menuToolBar() {\r\n    return createToolbarHtml();\r\n}\r\n\r\nfunction customLoadingConfig() {\r\n    const _locale = locale();\r\n    const info = _locale.info;\r\n    const config = {\r\n        enable: true,\r\n        image: () => {\r\n            return `<svg viewBox=\"25 25 50 50\" class=\"circular\">\r\n            <circle cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\"></circle>\r\n            </svg>`;\r\n        },\r\n        text: info.loading,\r\n        viewBox: \"32 32 64 64\", // 只有为path时，才会使用\r\n        imageClass: \"\",\r\n        textClass: \"\",\r\n        customClass: \"\",\r\n    };\r\n    if (JSON.stringify(luckysheetConfigsetting.loading) !== \"{}\") {\r\n        Object.assign(config, luckysheetConfigsetting.loading);\r\n    }\r\n    return config;\r\n}\r\n\r\nconst luckysheetloadingImage = function(config) {\r\n    if (typeof config.image === \"function\") {\r\n        return config.image();\r\n    }\r\n    const regE = new RegExp(\"^(image|path)://\");\r\n    const regResult = regE.exec(config.image);\r\n    let imageHtml = \"\";\r\n    if (regResult !== null) {\r\n        const prefix = regResult[0];\r\n        const type = regResult[1];\r\n        const imageStr = regResult.input.substring(prefix.length);\r\n        switch (type) {\r\n            case \"image\":\r\n                imageHtml = `<div class=\"image-type\" style=\"background-image: url(${imageStr});\"></div>`;\r\n                break;\r\n            case \"path\":\r\n                const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n                svg.setAttribute(\"class\", \"path-type\");\r\n                svg.setAttribute(\"viewBox\", config.viewBox);\r\n                const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n                path.setAttribute(\"d\", imageStr);\r\n                path.setAttribute(\"fill\", \"currentColor\");\r\n                svg.appendChild(path);\r\n                imageHtml = svg.outerHTML;\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n    }\r\n    return imageHtml;\r\n};\r\n\r\nconst luckysheetlodingHTML = function(target, coverConfig) {\r\n    if (!target) {\r\n        return;\r\n    }\r\n    const config = customLoadingConfig();\r\n    if (coverConfig && JSON.stringify(coverConfig) !== \"{}\") {\r\n        Object.assign(config, coverConfig);\r\n    }\r\n    if (typeof config.enable === \"boolean\" && config.enable === false) {\r\n        return {\r\n            el: \"\",\r\n            show: show,\r\n            close: close,\r\n        };\r\n    }\r\n    const imageHtml = luckysheetloadingImage(config);\r\n    const id = \"luckysheet-loading-\" + uuid.v4();\r\n    const loadingHtml = `\r\n        <div class=\"luckysheet-loading-content\"> \r\n            <div class=\"${config.imageClass} luckysheet-loading-image\">\r\n                ${imageHtml}\r\n            </div>\r\n            <div class=\"${config.textClass} luckysheet-loading-text\">\r\n            <span>${config.text}</span>\r\n            </div>    \r\n        </div>`;\r\n    const loading = document.createElement(\"div\");\r\n    loading.id = id;\r\n    loading.className = \"luckysheet-loading-mask \" + config.customClass;\r\n    $(loading).html(loadingHtml);\r\n    $(target).append(loading);\r\n\r\n    function show() {\r\n        if (id) {\r\n            $(\"#\" + id).show();\r\n        }\r\n    }\r\n\r\n    function close() {\r\n        if (id) {\r\n            $(\"#\" + id).hide();\r\n        }\r\n    }\r\n    return {\r\n        el: loading,\r\n        show: show,\r\n        close: close,\r\n    };\r\n};\r\n\r\n// var menusetting = {\r\n//     menu_selectall: '<div id=\"luckysheet-selectall-btn-title\"><i class=\"fa fa-i-cursor\"></i> 全选</div>',\r\n//     menu_copy: '<div id=\"luckysheet-copy-btn-title\"><i class=\"fa fa-copy\"></i> 复制</div>',\r\n//     menu_undo: '<div id=\"luckysheet-redo-btn-title\"><i class=\"fa fa-reply\"></i> 撤销</div>',\r\n//     menu_redo: '<div id=\"luckysheet-undo-btn-title\"><i class=\"fa fa-share\"></i> 恢复</div>',\r\n//     menu_paste: '<div id=\"luckysheet-paste-btn-title\"><i class=\"fa fa-clipboard\"></i> 粘贴</div>',\r\n//     menu_download: '<div id=\"luckysheet-download-btn-title\"><i class=\"fa fa-cloud-download\"></i> 下载</div>',\r\n//     menu_share: '<div id=\"luckysheet-share-btn-title\"><i class=\"fa fa-share-alt\"></i> 分享</div>',\r\n//     menu_chart: '<div id=\"luckysheet-chart-btn-title\"> <i class=\"fa fa-pie-chart\"></i> 图表生成</div>',\r\n//     menu_pivot: '<div id=\"luckysheet-pivot-btn-title\"> <i class=\"fa fa-cube\" aria-hidden=\"true\"></i> 数据透视表</div>',\r\n//     menu_freezenrow: '<div id=\"luckysheet-freezen-btn-horizontal\"><i class=\"fa fa-list-alt\"></i> 冻结首行</div>',\r\n//     menu_freezencolumn: '<div id=\"luckysheet-freezen-btn-vertical\"><i class=\"fa fa-indent\"></i> 冻结首列</div>',\r\n// };\r\n\r\nconst luckyColor = [\r\n    \"#c1232b\",\r\n    \"#27727b\",\r\n    \"#fcce10\",\r\n    \"#e87c25\",\r\n    \"#b5c334\",\r\n    \"#fe8463\",\r\n    \"#9bca63\",\r\n    \"#fad860\",\r\n    \"#f3a43b\",\r\n    \"#60c0dd\",\r\n    \"#d7504b\",\r\n    \"#c6e579\",\r\n    \"#f4e001\",\r\n    \"#f0805a\",\r\n    \"#26c0c0\",\r\n    \"#c12e34\",\r\n    \"#e6b600\",\r\n    \"#0098d9\",\r\n    \"#2b821d\",\r\n    \"#005eaa\",\r\n    \"#339ca8\",\r\n    \"#cda819\",\r\n    \"#32a487\",\r\n    \"#3fb1e3\",\r\n    \"#6be6c1\",\r\n    \"#626c91\",\r\n    \"#a0a7e6\",\r\n    \"#c4ebad\",\r\n    \"#96dee8\",\r\n];\r\n\r\nconst keycode = {\r\n    BACKSPACE: 8,\r\n    TAB: 9,\r\n    ENTER: 13,\r\n    SHIFT: 16,\r\n    CTRL: 17,\r\n    PAUSE: 19,\r\n    CAPSLOCK: 20,\r\n    ESC: 27,\r\n\r\n    SPACE: 33,\r\n    PAGEUP: 33,\r\n    PAGEDOWN: 34,\r\n    END: 35,\r\n    HOME: 36,\r\n    LEFT: 37,\r\n    UP: 38,\r\n    RIGHT: 39,\r\n    DOWN: 40,\r\n    INSERT: 45,\r\n    DELETE: 46,\r\n\r\n    WIN: 91,\r\n    WIN_R: 92,\r\n    MENU: 93,\r\n\r\n    F1: 112,\r\n    F2: 113,\r\n    F3: 114,\r\n    F4: 115,\r\n    F5: 116,\r\n    F6: 117,\r\n    F7: 118,\r\n    F8: 119,\r\n    F9: 120,\r\n    F10: 121,\r\n    F11: 122,\r\n    F12: 123,\r\n    NUMLOCK: 144,\r\n    SCROLLLOCK: 145,\r\n};\r\n\r\nconst luckysheetdefaultstyle = {\r\n    fillStyle: \"#000000\",\r\n    textBaseline: \"middle\",\r\n    strokeStyle: \"#dfdfdf\",\r\n    rowFillStyle: \"#5e5e5e\",\r\n    textAlign: \"center\",\r\n};\r\n\r\nconst luckysheetdefaultFont = function() {\r\n    return (\r\n        \"normal normal normal \" +\r\n        Store.defaultFontSize +\r\n        \"pt \" +\r\n        locale().fontarray[0] +\r\n        ', \"Helvetica Neue\", Helvetica, Arial, \"PingFang SC\", \"Hiragino Sans GB\", \"Heiti SC\",  \"WenQuanYi Micro Hei\", sans-serif'\r\n    );\r\n};\r\n\r\nconst luckysheet_CFiconsImg = new Image();\r\nluckysheet_CFiconsImg.src =\r\n    \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZoAAAGACAYAAACUS6SeAAAACXBIWXMAAC4jAAAuIwF4pT92AAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAHBbSURBVHja7J13mFxV+cc/M7OzLbvpjZBKQhISUgAhgAlVkADSRcDyky4iYAAhAmpQQtMIiqigYkV6FRHphgBBKSGBkB5IIb1sdrO72dmZ+f3xniGTzZR755a5s/t+nmefTGbuPec7Z8497ynveU9on5m3YJMuwNnAt4B9gA3A48CPgY0UyPxJUzN/MLMShxwDXAMcAmwGbgD+UlBKhzVn/+yqqwrVFwIuBL7tZnkyYwaK98yaNb/QW6uBk4DLgfHAduDfwI+ApYUmOnHiKC+0AowAfgh8EYgAvwF+AMTd1OlQ40nAtcB+QIMpzx8Cy70oT8U6YZvXn2x+tN8A44ByYE/gMmA18B9g7wB9v58AzwNfADoBA4A/m4c5KPwWuCdDef4X6KVVtF1yGPAx8IDpAFUBPYGvAguBucCRAdJ7CvAecA7QA+gKfB94DKgMiMargaeAQ0159gK+BrwNqLUoIUNzFPAw0C3L5+XmAXoZ6B+A7/ZNM3rJxDTgl2Y0UUwmAxdl+WwI8HOtou2OzwFP5+hERIAxwDPAhADoHQvcbxrvTB3PZ4HaImscDmSbmukO/F6rXWkYmgnAP4wxyUd/U/m6FPF7lQO35bnmMuCvQLSIOs/J8/npQIVW03bDPjaejWrgn8boFJPpRks2jgReKfLo+yygLMfnhwCDtPoF29CMMUam2ka6Y8wDVV2k73Uw0NvCdV9F1kOqiqQzX+WvQqfP2gsDkWlcO79nD/McFWuGoAJZk8nHAcBM8x2LwRAL1+ytVTC4hmawqeiFNHaHInPQkSJ8rxob156ILBp2LYLOkAu/kRJ8egEvFWgw+iPT0cXocJTnGSmkMxJ4zfxbDJ1WjKYSQEPTC3jBYW/qJODX+L8WMhuos3H9JDP876NVQnGZLsbIDHOQxt5mVqGTz9rrgTdtjtpmmhGOouQ1NF2MkRnmQh4XATf7/L02GyO3zcY944FZZhSnKG5QDfwLd9ZZJiBOBOU+f4evAAtsjt5eIVhec0oADU21qdDjXMxnKnCJz99tJuIpt97GPcOA14HRWjUUh5QDTyAL0W5xFPAn/J2OXoV4k75j455aZMr9ZK0GSiZDE0XWVQ7zIK+7kI2efvKO+S6f2LinnzFSB2v1UAokAvwNONaDtM82z5KfbDBG7lUb91Qi+2z+T6uDkm5oQsAfkSknrx6+P5kK6ycLkTWYj2zc0x14EYkqoCh2CCGbcL/sYR6XIDve/WQbsu/rKZvP/B+BKVotOjbpHiW/RNx9vZ5OeByZv32vwDQmG51DsOdJYne/TCdk09xXgUcdfN9DkE2urwGbXCjDLsDvEG+5rcCTSASENVqdA8HtwAU+5HOjGWn8psD7RxmDNRZ7TgZ2p+1CyMbjzkZzoR3izyGOSf8DVrrUFv0S2cvWgqyl3Qgs0SrsnaH5IfAdn/LsgrgTH2rzR031FC/ysXzKzSjsBex5sQGci2wa7ZXWIzzZ5vRDW6oR76NJ5v9VprE4wxie/2qVLirXIaFQ/OIu03l52OZ93wTuxd/NytOQdZv/2bzvGMRzNeWY1Aqch2y2djLqvK9Nx/prSKidc8wzprhI2PxoN/qcby/Tg7CzN+BbPhuZ9JHNWTbvmW4qcvr362xGH/sXqCOCrJ9NylKezwB9tUoXjfPM7+4nEdPg2pmOHoXE1itGRIyLbV7/VdNODGvTOXY6xf8rMs/e1AAPoc5Anhia64uU9zDsxSD6VhHL6ds2e2DX5RjNPYd9t/GQeThOymO8r9cqXTSKVfblyNRuZ4vXX4D/LtLpowarcdGGmPYhksXAPkhh671T8zzPVfi/HaNDGJo9LF77EWAlhvetNvK342s/oojlZGe387UWRnN2A4/ebNHQnqpVumhYfY5WIfu18vFzZO3ACt2QfWBW2KeIZVSB9ZhjV5A7MnQVst5rZ3PoNy0akckUL3xWuzU0b1h8OI5FNkLm4zc2jI2dDZUbi1hOG2xce6iFawYg61TdLVx7iemFWaGzVumi8YbFenQcsMLCtS8jrsxWz3tpKIHnCGCLxeusRK7ugkytWYl1dpIZIVmJUhLFXhgrxYKhud3Cw3GUMTZWuQ5ZuM/HEzbSfLqI5fSkjWuten+Nwto5GVNt5P2KVumike8EwTrEYeNDG2k+jkQZz8cyrHtxPlHEMnoLObfKTYPUC2ubYi/Cusfc+9jb6K1YMDTP5xhO1plh5GKb6SYRL7an8/Ss7Cye/gg5LMpvmhCPGatML9JvuQR/3GqVzLyU47dvBE6jMK/A35B9zS/1rH3X/GvV0DxVpDK6zsa1P8H61KHbsxdnaHV239CALGSex65TRNsQd793Ckw7bob+r2X5MU8E1tqsABOQHdfNPpbRbJvTDffZNExuPRyTsTfFp7jPDchO+LVtjMyZyFSYk9HS3VmesSuw546bRDaT3oi/02hbsrQF2XgT2SIQ91FjI/AldC+N66Rv2PwjcpLeoUjI/FkuVMTUD/d7Y1i24GyD4Xrg66bn3gfrIcwxUxDftZnfJxTmUn2jGdJf6sNvmBp16sMRDP6CuKEfjBzP/KbNDlWu+rsNcQqJIGGSbkKmo+wSM52hn5jnyM5xzIcj0+J2PNe2m05nzKbOvyPrML/24XdrQQKIvqVV2FtDkyrsVz1oCN0Ox7EDawuqIIt/PynAyHyALNyudtAwdMXbaAstZkrmHa3KgSJms/dudSRyHfamn6zMOnxq4/pTTaNvx8hsAk5w0ID/BnGaucnD3yuJzOg8o1XXG9r7oVoRJFyL3T0Os5BgnKtdqLxeOTHETfovazVWfOAi4BGbo5+V5jlyOkqYDvzCw+92HTKbo6ihsU3Kz/58m/c9jbhyb3FBQwvZ16mccpk+HIpP/BCJJmAnztl84PNY23tnhSke1fefYW/vn6KG5jO6IN50dsNU/AGZimpyUUtqnWqei2neSuHBFBXFKiHECcFuiKo3kVBJK13UkkQ2XLo5Q3A/cI3+zGpoCuVeYGIBw/ML8cbLpQ44GncW7H+Hu/P0ipKNb2Mv/BLIOscXsLa52y6tZobgPy6k9SIy9ZzUn1kNTaF80ca1CeByxDXVy0q3AZmSW+UgjaeRSAH6cCh+MNnm9X9CHAYaPdTUiERBn+sgjbdMGi36EwfT0Fhp4BIB+F5Wp75akLDgfp1YuBw4nsLOpXkDeyFJFMUp221ce5sZIbT6oKvOjJoKmSFYgkxlN+rPG1xDk8+luIlgbBq0Emaj3jT6D/msbR7i7tlo857j9eFoN6x04VnzAysRBJLIQv1Un0fahcwQrEK2LOjG5oAbmnxeH48he1yKzfQ8lWkdEjn6pSLpewtxVGix+HAcj/2D15Tg8mCekf/7uOs84kTnm3lmBL4G3FkkfXZmCOrMtUu1+vlPmc3r/4UsRl+Y5Ue/MiDfa7UZNfyT3Q9XW4as4RR7J/1LyE7k+5Aw722JmYf8Apyt6yjBYw4Su+8nGT7bioSxCQIJJAzVv9j9wL4G4HTEu7OYzEPWkv6BRDloS9xcc4mbxnvWrPmB+IEmThxVEhW+EGeAi82PNtf0aFYju4UPCtiQ9H/AOGT9ZRUyrfcY4tsflHAtTyIhzi/NUJ79kHAfi1HaIzchMdBmI7H7NpsRxEFmRBMU1iMenFORM6l2GM2HB8DIpD/rQ0x5vmnKcxMyA7M3sJ/RrJTIiAZkHva3WDsGoNisQTzKLg+wxjpjWH6t1bFDUY1sgEyav4TpfScCqLUJWey/LcDl2YRELnikBH77k5EDEsebkeG/KF50en8MzfxJU/WRd4MZM7QMFKschhy/nD6tW4XExTsL2U1/BR3wfKHUVFCxp6Y8nJK6po3BrgK+gawfTQIW6IimKI9kM4rSjvgcsh+qS5bPI8AYZOPjUbgYTXjixFFWGvAIsmbY3fzb9nWuz3Yga7h3k8VrzmEDPhwYbUYBb2L9VNFUg/4dY8hHmbZvCTKd/jNkbcxrRpL97K+eSJifw9XQKIrihH2AZ3MYmXSqEWeWI/HOA60PEl7mc0APYzScHAdebXrs1yBrjlchO/Cd0h/4K3BE2nv1yHTTneR3q+6OBJ8dl6Hhv96MJCfhvdPN2eSOF3cYMJBguLa7a2hGvVb8eHLtYvruqquCo0Wn8YLIQGTxvJeNe3oYw3SIB41gZyRK+TCPvu9Y4DkkUsA/HKTTAwlKO7jN+7XAz5HF/kvzGJvpGYxMOoMR54xvelwHBlu4ZkB7NDRhff4VxXN6Ie7s/Qvszb9s00BZ4bseGpkUEeTQw04O0rg+TwN9CRIMN9dIYYKFfD7nR8fewjWh9vgAhB1WgM3m73qUFF8CPkRCcSR9+ms1eZ6kxR84uhgj46RR39uMCjq5qOsMn75/byQieqGcbuGac5GTTbMZGysLvT20qgbP0HzJDDVTi4A3aSP3GX9GFhsjPuYZMXn+RYs/UFQjrqtjXEhrAuJEUO6StmE+lsP3HdxrdRR4DvBwlvKxEkm6m1bXYBma/mTe8zHDg+F9KfJQB81b2ZVyJObeIS6meRQSIdmNToyf+3VGOrjXztrUaYgXWUUBhqYC8UxTAmBouiCLk/2z9JAecrHHVapcgr1z2N3ieiRqg1J8IsDfkKCPbnM27kQb93OjipN1h6dsXn8iMs1Ynfae1dNydVTjEWU2H57780wDHImc7X2JawpnVgantKzv6TkTWcD1y+g+CNyi1TkQhJCoGV/2uDOzFvixgzQeBg70qUycbIb7MbKTfqCNe44xHeITkb02dgzNp1qFizuiuQsJVJmPb2H/VL72xuv4d3rf28D56GFoQeF2JBCq19zosEP3K5wdHmYHJxHdNxrDYfdY6FQsti42DI1Th4Awspb2JSRWoRuUIxs5601Z/AUY2l4NzVSblfpOZD7ZbWqR8A2fIHPMXnlxJUwet5k8C+F+vD9y+VO8P9FQsc51wNU+5neXGT0XOso4GtnJPx8JTPk8Mv39G2QH+/eQTZfFrl+LjOH42OZ9hyAef1an7pxMnU0GFiLBO59Gotmf5fB7p6ZgLwJqjCH8OhL9e3IpPRhWps5OQjY82SFqKuwhuBcpuRqYiQSi82P6YyCyw/lYJOJzIQ/brchu8G94NB1xGnqEQFA4r4DnxCkRZMf8RmSqtpDRwkU5Pu9sjE91AMp3ObJz/kUkFI1VDjDPoJeG5qtmpBFuMxL5i2k3nnbQkcg0BVuDxMo7gBKJjZZvRDMBeIDCvNN6Il43XVzSer1PRqYt43G2T+jCAhsBK+m+hRIUirWXrNw0Op1dTrcaibc2IUBlvBIJQ/NRAd/FK0OzN7JhNJylw/2AMZB2yTeLVF2Ejo0nhmYvdvfesMu+Zujnhjvm2UUsJyd5t5iRh5vxqm435aoEhz0sXrcKCf2Sj59j7QTWVAPpZiesCvH2mhTAcl6DTKPN8SDtQgzNVezuTt3WIDyNhOSxyiVkD76ZzomzZs0vD8ohbIUYmi7IoVxu7Is50WKh5WPPIpaT07zrkLUUNw6Gewbv134U+7xh4ZoNyJn1VmJZvWw6OHGL+Te49D1SI6QvBLisNyDrS28HwNAcYOGaLsiU3xAL156ETJmFLP5WnUrh4QhnEf847uxmTnENcra4E1YXsZzcyHsp4o3iZGH1Q1OOcZSgkc+9vM50uj60kebjwGUWrlsGvOfCdyhDXOWPd7ls6jwo783GGL7uYprdC7hnq8XremFt8+73sD4D9DbWPeoCZ2juxRuPsd/hbL73gSKWk1t5v2V6qYW4Im9Czm+vQwkiL5F9zrwRmT79bwHp/ibPCDaJBMh06t6e8nA6tYTKvM6MEP9TREPzQ6xPcbo9qju7VH6otoZmKvB/HuVVaXpo/Qu8fzrezMvmYw7uLro9jf2pr1bEjXUJSpC5wTw/a9sYmdQGXiejpbszvB9HTuL8h0PdISTK8lds3vc84tJbTBrMCOzfLqRVyNTZm/i3Zy69Tn2plNqDdEPzVdxZS8lFP2Nsqgss3MOQmGp+nNewAlmQPQz39xHcanqqVvku3niuKe7zF8Q1/jAzihmKHGDmlMuMwdkCbEPW6j6P83A0IVMXv2nzvv+Y0Y9fvfnO5rvOR6ahlwLvINNHM3FnDbdQ9+b7kdM7/aDFzGyUlMdpah/NocB9+HMWwoGIO+A5BfQC6pENcVdT+lyGnLORb+PVPVl6s0pwiSGHdblJ0oyE3XYE+Tn2Y+S9ifP1Rrsd4ieREFde4mTD5q+RdZhpHupLmtHTC6X2QKQMzSP4GwzzLMTdN/8I6rBm2ilxZI71NbI7XrwCXK7ttuIRl5vRsh3eMZ2jeh91nuaDkXFqaEDCAvVCTvz0gmvN6KnkCJthc78i5D0dCT7YkalD5pcz7e5fisyZt6Ao7lNlGkY7zAO+yK4OKVY2czvtLZ7uU5m40au9zCNjcCvw01KtbGG8jTJrZWTT0VlF5iCkV+LOvhtFycQEoKuN6z9C9q5savO+lViAOxxqHe5TmfzZhTRS01vPuKjLj7iJnhua85EFNj/3ZsRNnv+nzzsgXkM3ID75683rp7VYFA+xEyx2CRJBeUOBowCnbUvYpzL5lUvptJjZCDf2+PwT/73aXKcMCTXxlD53RWc6JRS7SCl5rG4c/QTZV5dt0/LLFkYcTj2kluB9nMMluOuq3Ygcq5JrDRYL5XYm7WD6vEyfN5eYMUPLQCklliFhUXKFmlllPs91FsxU05B+PsvnryOL2E54AjjDw7JIIjvy3R411CHR319DTiC2a/j89Ozz1tDMnzRVHzlF8Rcrh3j5sVfsXNMIDs6i8RjybwqsQ/YMnYl4h40w7y9FTvF8GDnfyQkPIftUDvGgDLYi3ndPelTGaxEvvVexvtdnFeJl127WaHVEoyj+86DpQWdbe3gfd6N952rQPocccfBlJGrHKmRT9XRkvdAKCfOdHvRIZxyZhrrNGLVo2mchcjs1VJM5uvJyxJPrYazHKyuUJcbYvEb+Y1NyeaKWrqEZ9dqtgRCiIyufuOqqYOnpmFOOc4AfAT/J0sP200lmE+LheGVQCidL2Pst5D6kzRMNEyeOcivJecg02jNkjorfYurFFW52MoJyhEDpjGhmVhY3//a7cVQpDjchi89XIgvdjUjssB8Ci7V42iX/RaYpT0M2dY4HtgP/An6A/aOqS2dEU8A9XZAd7d9CjkjdYIbaP0aOhu3YtF+DGEJO9fy2/u6uUI1ETE6avwQyRZTQonHEPsZYH2PK91dIWJigHK3RiETJLoWDC7+JbEAdbUa+T5myXG83IbuG5mTgj+waqmFPI+ZiYDZwgY89sj2Rk0ArkXnaKvOXel1ptKa/rmxzTRVyBvd7wJ3I/pXt+rzuxm/bTF2kfvcTkc1/urnUOocjYZ/Sp1CqkMC2ZyF7zK5AQhAp1jkN2dyY3tu7ARiFxFbc4VZGqSm1Yk9NuTi115Y7TR1M0Q85+fN4YCI215DsGJqjkIWzbDHRypGFupcR7xAvF7MipuE7H/cCgR4E/N00mBfizt6iEOLZc4Xpae1AFgSnYf9skqh5YHoCnwKLfOylTSb7/PgQJDDj17Wds8SBpm51yVG3xyBz+UfhfZTersjR4HYX2TtlaQuWIlGmH0GiTPvFOPP8VmQxQM8iUY/9iNE2wjyrDUgAUjunn1aZ9uJMk0YYcSZ4xDxnfpxHdVgbI5POIKPjTDsJWt1xOwHZvW4l8GZ/86N28bAgrjYjJy+iTfcCHjOF7dTI3IdEqh5rHuIa02i/bvRboQb4mTGAc5C9D/ONsbkO66fxOeGcPJ+fTu5z05Wd0zr/tPhsVJtrx3ioJ2Ke1QtN47hX2t8QMwOQ7S9bWzAUOdtmKd7ufWnLLXnq4FHI4XQ9PNTQ34xCFyDTys+b5/S7Fu/vaTqgtwD7me8TZed04DvAHj6UZb4D1U7B5hHSVgzNGGNk7JwhM8ZU4GqPHg6vPWQipnF32jh/M8dI8l5knSsX5UhI8KsyNE69ERfUe32oeIMs9MJ6qR3JW4bP2yynHuY56u+Rpq/gzd6UVKP5EOJp5TVVFvM50MwoeFGePUzaR7R5vxa4A1krytcxvhnYN8fnQ43B8ZoBFmZXbJVhPkMz2FT0QhqRQ5EjkN3uce9jGlk/pjic9B7yGZEQcoZFrgOTTgUOzpPOuRYqhlNCLtSljkxvMxItpIHrj0xHe2HIvT62OYwcVOg1lTbamX2AWbgfqPN6Mm98TXEpcrZUrufkIAv5HBSQOl1utyJko5fpTTux/ieZxtTNKa4ePhbmjx0aRCsN+C/JfubMEItpDEIJKl2MkRnmII29zaxCJ5e1DfXh++9rsR47YQty0qad0eVMZHrKLawcZXAhEiE6m1GMWUijWyk+BOEcD8cLDh+OFBfh7hHRW30sHyfHGFhdAAwBvyDzdGCTxTRqUYJINbJHwo11lgmIR6SbBxT6FRH4Uh/yOANxkLFKHyQszOEu5W+1Q/41xGkhmsVg5qN7ezE01aZCj3Mxn6mIa5wbzMe/0/2cjMRetHn9DHY/otpqQL1qlKBRjgSDdHMN5CjgT7g3Hb3Ip7I414c8PkEceN61cU9n0xH4kgv52/GyPZPMpxpbMTRd8McByFNDE0XWVQ7zIK+7yO/NYIUY8DufysdJ5NRbsO+K+FNjlFNY3c+jhiZYRJD9HF4shJ9tniU3eMyn8vBrF/M6JBjlf2zcU4V4iH3NYd52t0OcbO6psmlooASnz8Jteu9/RNZVvHr4/mR6ZU6ZhvinB9nQLEWm3pps3ncLO0/Ts7oPoUbb9sAQQhZ9vXTtvQR3vI8eR6aPvGaLj+W/DdlC8A8b95QBfyH7WqkVfoz9vYPHsatH76b2amjSN2z+EtmZ7PV0wuOm1/Geg3TqETfCVMTZHcYo1JmGvRHx5jrZhUrrhOcQn/MnbI46ppvfZpbF62td+F0OMRX4NRsVPt8Q/3dI5ICtSBj2nwBr2rmhuR3ZSOw1NyJ7q37jII2EeUamI8c0p/ah1LEzFE4lEoLECZsd3LsvEnVkLPacIexGPUmtldZQ2JryRuTsHrvehUcD/0aiU/s1ooki3qw9gTfMSNApnZGtFieZ+vOPdOOb+jF+SG43WzfpYgr2UPKfdZGLFjM9kYkfuWBkwJ1QNM+bwn/aprG5EXEtt4KTqbNzkfDrvdKM68kOe7rVpqJNSpueuMT08k/EflSEUuE6dl9n85K7TKfgYYedqcty/I5PFtHQnGdGh34G//0JslH2/QLuXcjO6CiDbdw30bQTj/hgaL6C7Ozvl9bGnWmjrcnWUX2CnbNVVYiH3anGgP43bH7MG31+IHshi3Be7A24HplacwO3Trd7yRS43fSO99jQTEeiF/Rq0zN5Eti/wDQjyDrfpCy/+zNA33ZoZM7D/6O4I8BfcWc6ui01pvE5xoW0Cpk6G10EIwOynODEcWk54slmtxM9AevbKQo1NNcgZwb1S3uvkzFwBzuog/dnqYM9U8972DTMxWAYEqrCTaYi4dfdws1jVF9F5o4bPGoU7HIMO9eCMo06n8O+e3sI2QF9Up5ORrHqnJcU6zuVA4+aDoKbsw7P457rbyGG5iKKd4zJN3G2Z2mFKbuPCpgJsEIhLs4HI+u/2fJ9jsLc8O8i93pkL+AHYazvfv8IcS3Oh52T1I50sXJcnaMgnUwruMlMY2zcds8uZI0m3znuvcwUgJ355pvJHxEBvN+RXgysPkersLb29nNkethqD3e8S9+juxmBu+mWXYih2aeIv2UFzjdBf4qsI8/1QF8hI5qryb1Bv5DOpdVtKyeHkcUgKw/HsViba/2NDWPjVkM+BXENdhsvjguYZYyNm1FYC5k6O9TCNQOQ9TQrPahL2NU1OxedaX9YeY42IJ5GKyxc+zLiymw1QrcbI+XeJt8DXC6bQgzNpiL/nm7kvx6ZUnrXZW3dPHre+yFLGr0tPu9WO/a9w4iXTL6H4yjsue5dh4Txz8cTLhT6Fab3ZwerD2+jR5X4ddPguGVsCjE0Vr2/Rpk/K70bq7THc1byPXR1iCPEhzbSfJzsC/XpLMOZF2dqRPYq7m7UdmJonijib/km7nhipQzWUbi7HaMQQ7PW4nXDkDiPVgyNVf4RRuZib87xcEzG/kFmScSL7ekc12zE+eLpZUhkVDvUYX0+vdHDyjzbjBK3upBWIWs004v0EC/B+hEJpcRLOcq0ETkTpRBvu9+QfS0t9ax9F2fhZAYaI2N3usrq81HI6OARZCG5GHzf5fTqgC8iWweKZWhuxr+QQ+ksBS5Pzdldj3jNpJ+SuA3ZA/JOgRnEzdD/tSyjpBNtWNlsFvUX2AsTU4csgltdpHM6tRdBDgSbgUwnXofENLsI2czZz7zvtAIUskZzH+5551llg+m4tNfTOG8A/q9NvW5E3EdfdjhaujvLM3YF9jYntmUIspPebjTj/2F902ghI5qkMc434e802mbTCXSbejOL8aILaRViaB5Fjhvx+3k/Dlid7tXxR8RN7VDkZL1ZOD8LvhGJI/R7Y1i24M7GvQvMg2fXyBxnHpBzLN7jZI0mjIT4ONmHH7RQ9+YbkUV/P4IepkbHS2jf/AVx705tiHvTYYcqffS+DXG2iCCOJTfh7ATO4abhs3vMxCzzPFsdmRY6ao8BPzAdoj7YC2VzpBkNRm3csx3nRz53ZvcNsFvTOpNuhOMp1L35DvO8f9+H5yDV9i+B3d0HW3A/JEUdsoPfLQ4yFciOkalH9qTMtjkCcDJ19nWfjIwTQ5NqwLribVSIFtM7fYeOQczFaZL0Hv515J5Gs0NPJEK7XSPzimlAttto8JyGoIkjXlxWOcN0RO0YmU3IXjcnhjuMxC87wuP65eSolOvM836Jx8/7yellWYqHVV2PPf/6BmNk3iigYXZiaM7zsUycxDpLGq1Pe6QtbtJ/GSVI/ABZm7HDv81IJjXSt7qfw89YZ99GNiXaOVr8E2R3/lsO8z7NByPjZEST3rl80CNtqfbkxbYWuNSws/em0fRSZhU4AnCyRrOfj2VS5UIP5GwPeuGpSn2/tuuB4xSb1z+NbMRN73wFzdDcaEYydsLofwB8HljgQv6n+/Q9dzi8P46sJb7ggbZrMz3vpWhorM5xNpqRzEwHIwAnazRVPpbJHBfSSM2pznNR1604C/qoeEc/G9c+ikx/txTQs64HWj3+LqmI2XYjWs9CYpOtdknHCJ9+u/tcSKPFdDbecvl5z7ifsRQNjZWGsNH0vv7j0Ag4MTQrfSwTt85lr0MWMd1YsP8d7q0nKO5jdc3jfsRDMlOUAiuGxg+PscsRT067I7RjXR5thXz67e52KZ1UZ9yNzuX9uZ73UjQ0v87zeZOx1C/luMbK5rbN2Ntc15YXfSqPjTiLvNqWDeYBXOUgjaeRxcYkSlCxcujZH5AplmwbnK0cK+3HtJndEzL/gKynNLmsww+Pyg+Aj11Mb7MxNssdpPFPZF0m6ZahsdJwJHwYNv4xxzD9FPLPPf6N3HsPms0D5sQZ4Kd4u+ET0wCcj/uBOpebyldIb/QN7IVOUYrD9DwN1m+QUO+5fkcr0y7/8+G71Nn83hd6VD+9jmaQwJu9MKkQY4Xsb3sL2SeWMy6fXUOTL0ZTE95vxkuaxvUbSCiXTUbXn5AF+OctNtCnGGPyH2Og4ubBuxeJYup0V/Ji0+Bu9qgc3jaVwytvsXnYP9pgnjFQjSi5WOnCs+aUTchRDq9m6KxdieytytexvN70sLOxDH+OILHSwCeQKbYbPBxpP4Q3mz1TMxdnWmzfCh2NfcGm0V5iRpN5n3e7YbjvJ/d+i8dw7hFh1dj81fw56R38xfx5xdPIPoXhyL6FSmR9qFva667m39TrSsQrLv11F/N5Ajnk6gfY21dQKG8ha13PWpgmWWWMTB1KPh4Evpejo/c+7jpl5PrNjjT1c7QZGb9pY4S8EdnXdoVpBEchHl9LTFvwM9wJsZSPBxC35mwRp1tMx/QhH2YYjkcOEjyMXffxhMwznY1OWZ6xpUhkiEdwP5p8W+aa5/1f5PfMTdUdSwMLu4bmX8gi74VZpluu7LBNx8ysznCNuOMVZl3HYc1upvgScirffWRe/I2ZxukCnK3r7MpVVwXr950xw83U5iCnwP4kw2dbzUjbTxaZv0JoQryNbi3irxNHNmlmOlOlHjmW4iWftGzBvmNCoFoyxMPw76aDm+l5fxuZVbL8vBdysNDFSNjrS4CRxqI9ZR6cjZ59fXcbT8UeTyI7wr9qfn//fvf2y03I0b9XImfJNJppkR9iP4itIiP8CWZ09Q1gr7R26n0tHls8i5xDdZYZKY5GplqfMbMptiNbF2JoUmeJJNv0KIo1YvAH7w3dMchRq4cg6zo34O20nl3qEI+/Xwf8IQmZEfe3kWjEG5Bw+z8OoEF8BOvnxLvCxImjaMf4Prpqx+XZgMSodOUUZLuG5mTE4yt9CmVPZPf3xchC2AXaI7PNT4xhSdEJ+DMSWdfdxdTUFFD7Ndy/bTN1kaqfJ5oer6vOKu284VZKnKDUTzuG5ihkITrbonA5sgD2sumVr/JB/56mMU5fVK80hjD9db5F+Bpkb82diNtzg4+/wTfbGJl0piEB9K7A2z0pIeBck88+iEPHayZ/u2eoRJFF4Z5mOmMR/rk6Tyb7/PgQ5IC8r2vzo42jEkxDM8E0wFY2aPVH5vgm4Z0HUgj4pZkecWvT6UHIAthGMyp7yofyL0c8VHJxGRJT6lxkIc6LsrzPGLx0YzEZmc67xOLwucYYpgvYdRFxPXJu0G0+GJx8xz+cbvTt0EdfUfzDSiM9xhgZO6HoxxhjU+2R7suREzy9iGzQE3HNPMyH8j8Ya+dzfxVZZ/Aifto5bYxM247IvcgZKPkM5gvIZrK2niq9kU1y9/pQnoPyfF6FnMehKEqADM1gYzAKeTgPRfzbIy5rDgFXe1wuEWQPgNfYCe9/IhKmvavLGr5lobx/bQx7Nk41RjMX52L/7JNC6oYbnStFUXwyNL1ML7W/g/RPMo2Um8HmhjrUZJUDgT08zmM29qYXJyFuxn1c1GDlnPjUVOXlWT4fYjGNQfrIKYoamhRdjJEZ5kIeFwE3u6i5t4/l82OP099sjLGdHb/jkfDmg13SYNXxIYSstWTalGs1OGGtPnKKooYGZF3laWCci/lMxb2jQ/3cC3GWD3nMRDz61tu4ZxgS5220C/nbjTI9g92nLq3GNqvWR05R1NBEkXUVLxbC70KCTDplCf6ccZHqxfvBO6bMP7FxTz9jpA52mPct2PcO/KnpPKSwem6PGhpF6eCGJoRsxjzJo7wiSITloxymk0A25fmBn1GIFyJrMB/ZuKe7GZEc4yDfpWbkZvdsjlvYedCR1am/Gn3kFKXjkb6P5pfkjszsBuWIm+6RWDt8LBs3mxHApAAbmsmmPIcAFTbui9rMpxMSg+iryJG7hfAccmzCEzZHHdNNHZpl8fpaF+rPIcjG29dcGtl2QQLFnogEtHwSidSwRpsHRXHX0PyQ3O6rbtIFcdM9lMJPpGtEjhz+MuIyu8O8V4ccWrYdWRM6zaHWQsJyh9g9DIrXlJvR4gsUvkn2eTOafdqmsbkR6yd8Opk6OxfZ9Nkr7bc5md3PU7FDNbJHLNVhqTL15gxjeP6rTYSiuGNozsOfw4nS6YUcOXAohceeiiE7+TPxfReMDFhfe0jnWxQnTHgnZArsHgdpvIQcdvZPm0bheI8NzXR2P4+8sxl9HIVE6bVLBFmPnJSlfj4DjAXWajOhKM4II6fkFYNhuBQZtA3fwz136kKmzr5VxN/z2y6k8Soy7edFvLdC1miOyWBk0kfHz2HfDT8E/Irc65G9ivhsKEq7MzRWNyV+BMy3cJ2dEN1Huvx9pgC3u5heIYZmRBF/z5EupTPTGJt6l/UVskYz1cLo+GXsbeK92WKH4FRtIhTFHUPzhoXrViHn02+2cO1vbBgbN48mvQKJzusmhegr5pknbobAn2WMjZuBUQuZOjvEwjUDkHW/7hauvcSC8UrRWZsIRXHH0OQbAWxA5sHthP2/DmsuyE+49D2+A9zhQfkUskbzdBF/zyddTu914DgXjU0hhsaq99co8+d0hJTOK9pEKIo7huZ5sq9p1Jlerd2DzJKm8X86T89/ugvf4RLENTtkU58VCpk6+xHwcRF+yyYkTL/bzDaj2a0upFXIGs30Ij0bS5AjBRRFcUjKvfl682C1dR89Bdm1XghxJBLAc+zu2bMB+BLOPXouBO62aWTqTONlZS2nEEOzATm/ZwbiJuvXUZazKXzaLoIcFzAe8ebbhriJN6S9vhXZpOkkWkIhazT3IVNj03x8LjaYDtYGbSIUxT1DAxIV4H7E5bgrMkfvdL2h0RiU3yP7Erbg3oa48xBXXrtGZjLW5vJTxrYQ1iMnOV6ARFq2c5LpZcB3beb3CYW7VIeR83dO9qG+FerefKPpAF3qg8ZUHVmizYOiuG9oAFpwtgEu24P7ZZfT/Bqym9uOkalH9nu8ifWYa9sd6twBrLB4bcgYYLtG5gNkHWV1gRq/7pORcWJoUga4K95Gr2hB9l+9o02DonhnaEqB/YE/YO8Aq+3GyLxhs8HzK9ZZxIzOzrd53yxkL8gWhyNDv3AS6yxptNbiTTy+uEn/ZW0WFMVdSvG0weuQkCtWaTRGZlYBPWs/DE0VEv/NrpF5Glmk3+Iw//18/O2cHkXdYkajr3mg7TJk6lhRFDU0tgJpNiJrQzPbvN/J4v3bPP4uXdgZY8wOf0CmeJpc0FDl4283x4U0Uut+81zUdSuy/0tRFDU0toxEI+I1l2kvhNWNeNs9/i73AhNt3jMd8baLu6RhpY+/3QyX0qlDgqq6sWD/O7KHuFEUpYMamrkWrmk2Pf4XsnxudW3Ka0PzRRvXJoDLgRuwvg/ICi/69LttxHqUZytsQKYOVzlI42lkH1ZSmwJFCY6hsfJAJjzWfFeez1uQGFX/znGNlbNwNgMfevxdrE59tSD7XO7yQMNP8X4tKo6sQbkdqHM5sv5WyLk0byDrPXFtBhQlWIYmn6tuE95vcnsAme7IRIMxMs/lSeNhcoe/aQb+z4cG2EoInpRb9kMeaVhsGtzNHqX/thl5eBWaZx5ytEGjzXuOx98TVBWlw2LXvfl+cu9jeAzZO+I1FyFuqJcAo02D8Qqyc32BxR72Gch+nHMRl+lOyHrF86aX78eGvelGR68sn68zjajX+zqeRnbfDwd6ItEMqpCTLFOvu5p/U68rEe+99NddzOcJY8x/AHzqQzm+hThUPEt+j8RVxsjU6eOvKME0NP8yo4kLs0xjXOm6wplZI7g8aP4KJQH8xfxZ03FYc/bPnypo0/pqTr47ddBYW2OzDPgiT11q3+AdVlB5NOKOV1ixeAn4ChKypluGz2PIZt0LcLauo3jMxRdfHBgt99xzj/4gRTA0ABcjJxpegpx/sgF4CgkmuVGL1CZPXfo/Tr57HHIq6KlAD9Mz/w5PXaqnO9rjSTOy/aqpp57Xz1JpFLXxVkrF0NQg0zhHIsEX+yLOAT2R6Z8DTI/4FdNDbyjSd2qrcwgypQMyXbI8cDqfurStzkmm0fROZ67RWWlTB/za/BWDPZCp3QPwbo9SEzKdei+FxwwsFZ19kaC/JyKH25UhzjG5PEIbzAg2E0l2j0QeQyKuP4Ksm6oXYhEMzTDgWmTBONselt7mb4LpSW5HFu1vw8Jax/xJU934Lp7rdIlS0VlcZswoRdWnIFOxtT7k9SXgKiRW3VPtVOcYxP2+d5v3y8m9FtetAJ0HA2eZTt2ZqKOIq+TyOqtEdkx/iMxrd7KRbidzz4emcfQyVL7qVILAvsiaYa2PedYi3oj7tkOd5WZ00dvn3/EE3NtYrOQxNEORhdNrsRdXLFNlucakNcwD/apTCQo/ACqKkG+Fybu96TzJPDfF4EJkmk7x0NDsjxzhO97FfMYjQS33dzFN1emuTsUZRxUx7yPboc4Di6gzQqG+m0pG2q7RDEM2O/byIK8+Ju1Dcb7OoDrd1ak4p6edi+NlYbb0q6KuTyVNtVGSYQgloKo+Rpd1zXT7tIlIq+UgG7280llR1srofqsZ0WctvWrqiYQTxBNhNjTUsnBdXz78dE92tJZ5odPW1F6nUIgxkQj7lpWxRzhMp1CIeDJJXTLJikSCD1pbmR+P2wlb0kWrtDeGpgp41KNGMb2iPYYsvBUaeVh1uqtT8ZGWqggrxnRl3dBaEpHdz+3bQhWfjuhMOJ6kz9J6Bs7bSnmT/1FyOlc1ccK+7/P5oUuIRjLnf8TwBcTiEV5fOox/fjCObU1VvuvsFApxXHk5R0ajRNt+GArRExgaiXBkNMrmZJJnW1qYFYupW5nPpE+dTQPG+ZDnWJyd/6463dWp+MSGwZ14++T+rBneOaORSScRCbFmeGfePrk/GwZ38lXngYOWc9NJj3PE8IVZjUyKaCTOEcMXctNJj3PgoOW+6hwdiXBjdTXHZjIyGegeCvG1igqmVFXRORTSClkEQzMUmOJjvlMobDFbdbqrU/GJT8Z1Y8HE3sTL7IUXjJeFWTCxN5+M6+aLzi+NncP5E2dSUdZq676KslbOnziTk8bO8ccYlpXxnaoqagswGCMiEa6tqqKbGhvfDc1UsNQpcIuoydMuqtNdnYoPrN6nCyvGdHWUxooxXVm9j7fLBl8YOZ8Tx7xPoc1vCDhhzPt8YeR8N+RkXfjZOxLhm5WVjs446RkOc1lVVS4XUJ1dc9nQ1CKbB/3mLOwt+KlOd3UqPrC9WznL93NnNLJ8v25s71buic7+3TZz6n7uxG49db93GNDNcTDwjPOFFaEQ51VWFhQ7qy17hsOcWpHV03ub1l53Dc3x2Ns86BadTN5WUZ3u6lR8YNkB3UmG3ZmiSYZDLDuguyc6v7z/25SF3TlKqiyc4Iz93/ZE59HRKN1dnPI6IhqldzisFdUHQ3N0EfM/2qNrVadSdBq6l7O1r7ueWFv7VtHQ3d1RzYBumxnZd42raY7su8aNUc1ujdWR0Wjg01Qyl/PYIuY/1qNrVadSdDYMqimJdA8c7I23mNvpDotEPPEW26+sTCurD4ZmaBHzH+rRtapTKTp1fSpLIt29e6/zRKfb6Q6NRDzR2S0Uood6oHluaDoXMf/OHl2rOpWi01xbVhLp9q71Zt3b7XR7e2gMdJ3Ge0OjKIoHxMq96YHHKtxNt1N5iyc6O1U4OtV9t8WtMg8NTYa0m7UGu2toiunGt82ja1WnUnQicW+2YkRa3U23Je6NQWxpdTTy2s3jwctAPK3J3cp0h9Zgdw3N0iLmv9Sja1WnUnQqtreWRLqbt3vjje92uhsTCc9+q01J3Z/ptaGZW8T853p0repUik7N5h0lke6KzT080el2usvj3oxp6pNJNnhoxBQxNC8VMf+XPLpWdSpFp8dKb04D7rHK3XTnrBroic73Vw1wNb2F8TjbPRh5zGlt1XgzPhiaZ5Ez6f2m0eRtFdXprk7Fa0OzqtH1EP/lTXHXDdjcVQPY2lTtappbm6p532UD1grMisVcTTMJvOpymkpmQ1OPnCHuNw+YvC2PcFWnqzoVjwklkgx6f4uraQ56fwuhhLv979ZEmGfmunuixTNzx9GacN+p9d+xGPUujmr+29rKKp0288XQANwK+GnWY8BtBdynOt3VqXhM3yX1dPvUnTPpun3aRN+l3vQlZi0Zzodr+rmS1odr+jFr6d5Ok8kYIHZ7Mslfd+xwZaprUzLJQzuyrnepB6cHhmYJcIeP+d4JLC7gPtXprk7FB0a+tp5OW5ztVem0pYWRr633LHh9Evjda4ezaquzSNOrtnbjd68dTjLpeM9L1uHQ+62tPObQ2NQnk/yqqSnXmo8u23hgaEBOafTDa2kuzk+uVJ3u6VQ8piyWYOwLa+i6rrA9gF3XNTP2hTWUxbyd4mmKlfPzF77IwnV9C7p/4bq+/PyFL9IUK/e8TF+IxfhTczOFmO9PEwlub2riU50yK4qhaQJOBzZ4mN8Gk4eT1UzV6a5OxQ9j05Jg3xfXsNc7mylrSVi+Z693NrPvi2ss3+OU7S0V3PnSsTzyzoE0tlgzGI0t5TzyzoHc+dKxbG+p8K1MZ7e2cmNjI/+z6DXWnEzyj5YWbm5sZL0aGX/rf5v/LwGOQ7yX+ric1zrkvJQlLqSlOt3VqTinGcgZ7TKUhD0/qqPvknrW7VXDpv7V1PesIB7d2d+LxBLUbtxBj1WN9FnWQMTaKKbZTZ2JZIgXF4xi1tK9OXjIUsYPWMGQHhupjO5cdmyORVm+qSdzVg5k9vKhNMeibuu0tEayMZHg983NPB0Os19ZGaMjEXqGQnQxscu2JhKsTCT4MB7n7dZWmqw7EmzXKu2doQF4F5gIPIZ7Yefnmp63m42i6lQjEyTmAAdbuTASS9Bv4Tb6LZS2NFYZIV4WItKaJNocLzRv13U2x6K8umgkry4aCUBtZTMVZTF2tEapb670Wucb2DjIb30iwb9bWvi3O79lE7BQq7R7hHP0xCcAt+PMeypm0pjgUaOoOpWgcG+hN0ab41Q2tBZqZOzmXbDO+uZKNjbUFmpk7OZ9D7C5SL/lfeh0tC+GJjXMvRYYDfzeZsE3AX8w916Lt5FQVWdbrrpKa7b//Am4vwj53m/ybm86NwKnAVt91vkOMFWrs7tYCa+6GLgQmAKcCBwJjAeGAF3NNVuB5WZo/ArwDNDghsBRoWlWL10MXDg/Oc2WzlGhaZZ1znenzItanopnJIFvAP8Fvmt+Ty9ZjrjQ3409V9xg69y1k/QfYIx5Vo5G9tZUA7k8DroChfhWrzYjmVutdAJnzZofmIo3ceKodmFo2lbS9L9ElveLhjEcD1Kc3fl2SNc5wlTwY035zQKuBpZp+11SJIBfmr8eQJe2F8Sj4fDy/bqNbexafmhrNDwyGQ7tmQzJdaEkdaFEcnVZLLGgemvszSHvbX4/EsvoHlUHbPJSZ2U0Fj51/Dtj9+y69dDKaGxkWTixZziU7AKQSIbqWhPh1c2x6II1dV3ffOy9A95vjkW90AmwCsg6RL+npiYMHGgM0ThgEJDaDLQF+AR4H3j5rqam9z6IxzPF2on50JGzrNN0AtqVW5wVQzPMTNecDWSL+93b/E0ALkY8Nh5AdqsXey3hOGTaqRm4FHguYL/B54Dn0yodwKnAJOAY7C2gKsFhU3oj+9rXhnQz9e9CIFcQsPHACXW9K1kzvHYF8Dvg7kl/W77FD533fPXPtnTu3Xsdh+298DOdF9//f1v8KNx7amqs6pwAnAlwWVXVTp0NDVt8qge2dQKf6TRGqOQJ7TPzlmyfVSIbAaeQ4RAii7Qgu9Z/RI51hfmTsk+JjnrtViffr4cZFaSOON5mpgoKWmTMpbPAdZHPAS+wc8qsLRsLNjYzZmhT78cIOn/9DAHfBm7K8TvnYyvwA+DXuXq6OevnzMrA6OSwZifPkX86czxDFqbOfNNZClNn2ZwBhgJvmpGMk22+5cA1Jq1hRfh+J6UZGczrEwM0knkhTyXsaa4Zr016SVIDPAH8ykFjg7n3LuBxk6bqVJ0lRSZDsz/wusuN23hk3WF/H79b1Bi5tlxOYYuFfhsZNTalzWDTwTrZxTRPNmkOVp2qs5QNzTBkDaOPB3n1MWn7NbK5FBiZ4f0DgHNKxMiosSlNepnfa18P0t7XpN1LdarOUjQ0VcCjHn+RXsgO+SqPv1dPZF0oG9PJ7SIZJCOjxqa0iJg67mWHahgynVKmOlVnqRmaaYjbndeMxftowz/O05gPAr5TQkZGjU3pcC3iMeg1E8k8Naw6VWdgDc1QxLvML6Z4aPn3RVwJ83E90L2EjIwam+DT39Qrv7je5Kk6VWdJGJqpyOK5X0TxLszDnRaHlt2AG0rMyKixCTZXIzvX/aLa5Kk6VWfgDU0tshnTb84iy3GtDjgF2XlrlW/jrSeHF0ZGjU0wqQTOLUK+52JvzVN1dkydRTc0x5N9x7+XdMJGGHALVCCRje3ec3MJGhk1NsFjMrvu2fKLziZv1ak6A21oji5i/m7mfRmwd4EjqwNL0MiosQkWXyiR50h1dkydRTc0Y4uYv1t590FCNRRCqICRUC729tHIpBub54G9tL0vGsU09ONUp+oMuqEZWsT83cr7JofD1yNwLzTNz3w2Mil6IRGgleKwdxHzHq46VWfQDU3nIubvRt7jgfNcSOc23NkIVcyh9LHa3pd0XfYjb9XZMXUW3dCUOne69D1GuWSwikkcpSM+S2HVqTqD/nBsK2L+TvP+MnC4i3puxLkH3vNFLM8Xtb0v2brsV96qs2PqLLqhWVrE/J3kXYlMd7lJX5xvhLoa2FCEstxACYamaEcsL2Ley1Sn6gy6oZlbxPyd5H0l3px3frUxOE6M57E4P8LWrpE5EjkOVim9uuxn3qqzY+osuqF5qYj5F5r3HsD3PdJUg0yhOWEO4hTgh7FJGZkPta0vKi8XMe9XVKfqDLqheRbYXoS8G03ehXAL3p44dx6wTwkYGzUyweEfQFMR8m0GnlGdqjPohqYeeLAIeT9g8rbL54BveKytDHf2pHhpbNTIBIttwMNFyPchoE51qs6gGxpMoxrzMd8YhS3kh4Bf4M9RzCfhjkebF8ZGjUwwuQVo9TG/1gI7RKqzY+osuqFZAtzhY753AosLuO8s4FAfdf7UJaPmprFRIxNcFgJ3+ZjfXcAC1ak6S8XQgJx66YcXw1wKP2Fzms/lcyBwpktpuWFs1MgEnxuA+T7kMx9n5ympzo6ps+iGpgk4HW/3gGwweTQWcO9eFCe2z624F6zSibFRI1MaNAIn+/AcnVzgc6Q6O7bOohsakCm044B1HuS1zqS9pMD77y1SGQ0G7nMxvUKMzXo1MiXFEuSsEC8anQ0m7SWqU3WWqqEBeBeYiLvTaHNNmu86SGNCEcvpEJfTs2Ns1gNHqZEpOd4BPg984GKaH5g031GdqrPUDU3KMk9Azmlx4o0WM2lMcMES/7eI5TTbgzStGBs1MqXNYlP3Z+DMK6kV+LlJa7HqVJ2lRq6w+M3AtcDvkRha5wDVFtNtAv6OuDC7VUAXAn82lj3kU/kkgdfx7kzwlLF5EejR5rN1yAl6rhqZiy++ODCV75577ukIxqYRCWt0DzAVOBvrZ703IfvNbvWhoVGdHVNn0Q1NunW+EJiCHA52JHIGzBB2HvC1FQkuNwcJi/AM0OCy1mXApHbYEM0BDjIjv6ONcXsOuA74WAcF7Wp0cz7wXeAEM1Idl+U5eh8JbfIs/kfoVZ0dU2fRDU3bHn76XyLL+0Vj/pMbaswPmm4Qu5iP69oYxH+OOqVXQzF0zjr1/Ew6Uz2eo5FoDZ/pnPjEHxqKVKS2ytODDkZ7IxWJ40HVqTo7CqF9Zt6S75phyBTa2Vg/q2W7GfrdhoW1mfmTpmb/8KqrrH4Xz3UyY4ZjnbNOPd+RzolP/MHaWlcWrTamzjwvzw4ydaYoHZ5cI5pKZIPkFKDcZrqdgAuQmGR3Aj9C1ny8IBA6Z516vi86Z516fl6dEyeOKvnyVBSl/ZDN62wo8Kbp0ZY7SL8ccSR40/SQ3UZ1dkydiqKUuKHZH/G0Gu9iPuOBWSZtt1CdHVOnoiglbmiGIR5PfTzIq49J240erursmDoVRSlxQ1MFPAr08jC/XsBjWPcnz4Tq7Jg6FUVpB4ZmGuLf7TVjcRaFWXV2TJ2KopS4oRmKeBn5xRQKm0pRnR1Tp6Io7cDQTAWiPuYbNXnaRXV2TJ2KopS4oalFNuX5zVkmb6uozo6pU1GUdmBojsf6zm836WTytorq7Jg6FUVpB4bm6CLmf7RH16rO9qNTUZR2YGjGFjH/sR5dqzrbj05FUdqBoRlaxPyHenSt6mw/OhVFaQeGpnMR8+/s0bWqs/3oVBSlHRgaRVEURfHU0BTzJLdtHl2rOtuPTkVR2oGhWVrE/Jd6dK3qbD86FUVpB4ZmbhHzn+vRtaqz/ehUFKUdGJqXipj/Sx5dqzrbj05FUdqBoXkWOevdbxpN3lZRnR1Tp6Io7cDQ1AMPFiHvB0zeVlGdHVOnoijtwNAA3ArEfMw3BtxWwH2qs2PqVBSlHRiaJcAdPuZ7J7C4gPtUZ8fUqShKOzA0IKcf+uENNBfnJ0Kqzo6nU1GUdmBomoDTgQ0e5rfB5NHoIA3V2TF1KorSDgwNyFTKccA6D/JaZ9Je4kJaqrNj6lQUpR0YGoB3gYm4O50y16T5rotpqs6OqVNRlHZgaFI93AnA7TjzSoqZNCZ41KNVnR1Tp6IoJURon5m35Ltmb+Aa4Byg2mK6TcDfEVdWS15G8ydNzfzBzEprOT51qTOdJ99tzRvqsObM7191laXbZ516viOdE5/4gzWdM2ZkfPviiy+2Wjc8/93vuecefQKVgp4j38jyHCn2KLNwzWLgQmAKcCJwJDAeGAJ0NddsBZYDc4BXgGeABl+/iRiKC3nqUns6T77bV53GUFw469Tzbemc+MQfGnyuG6XxuyveYLWDZ7UjpqihaVecfHdJyJz4xB9KpUQbkAgCD+rj0mEZCnwPmAz0BdYD/7YzY1EghwJTgdHARuBfyF6srS6lvwdwHXAS0AP4ELgBeEF/cv8NzTDgWnJPofQyfwcBFyFTKPcj8/R+bdBTnRbQ6SrFJieYTkZN2nv9gfNNHf4G8KgH+U5Cgq9Gzf/3Ms/DhcBpwFsO0z8GeDhtdI5J/1/A4cDr+tP7Y2gqgRuB7wLl5r1VSEDE2cBCYLN5vzswAjgYON5UxAtMJbwT+BHg1Zi6ves8AdjTR52KDUa9dmug9GRd6yyM4aYxztYhqjIdoI/MaMBNbkwzMun0A140z+9rBaZ9LPCk0d+WiOkInqS123tDMwx4DBhr/j8LuNkMlxNZ7nkD+CPiyfZFMySdiCwoH4ds2HPbAymfzu7AZaaHAvAf4K4A6gxKeSpKOt8nvyNIOXC9Gd24ybgcn9WYkcfxwEyb6X4BeCKLkUmxj/707pLJvXl/0xCOReZCv2aGsf/K0SimkzDXHmbu3WrSmmXSdot8Oochi9TTkIXsI83rOeazoOgMSnkqweeL5ndvMqPfv5hRuVcca6Pxdpu6PJ93Ms/FUTbSPBJ4yoLx3KRVzVtDMwx4DugDLAIOMEPjQkiaew8w00J9TNrDXBoh5NP5B2BAhnsHmM+CorOQ8lzksk4l+HwbmWb9PDIN2w34OvBfZGrVC/aweF0vD/J+0cI11cA/LBq6wxGvSCuu+s9rdfPO0FQhi3q9zJTMJGCZC3ksM73xJSbtx/IMW/NhRedgk2c2DkPcdIuhM4TsUdnHvM5HCBiFeN6ETRqTXNSpBJ9LgV9lmYHYA++OXggV8Tv/FGixaGyeMqO9XM/7sxaNzFZkel3xyNBMQ+ZF65A1gPUu5rPeVIStyLTPNAdpWdFppZc/tAg6RyELp4uA+UholiE50hgCvI0stH5g/kaZtCabtJ3qVILNd0zDl6vRP6Edfu/FwHlmJG/F2DxpnrO2TLJhZFqBr+JtgNkObWiGIhvzUhV7qYt5VCOLd8uQhXlMXoVM+VjVWWEhrYocIzAvdIaQRcgRadeNRxYzh2ZJYya7rsPsY0ZJITOi+Y5DnUqwuRz4pYWRRXU7/f73I1OGVoxNpTE2x6e9N9EYmU4W7o8jDg16zLiHhmYq4ko4i8LXENrSHXgE2Gb+/o3sHp9l8irED/P7HujMVsHd1jkMcRdtS39TLkPbGJlXybzQu0+aUXGqUwkuVyCu7Famr95qx+XwW+Bii8amwnTmvoSsZT3Lrvt/8hmZR7TaeWdoaoGzzf9vtviDWjEyLwBnIH7pIcSD5QkgFVztbJO3VbzQmY2kyQPgLJd0xnPcMyDN2Aw1r/vneTDa6rRbnkpw+S5y8qkVIxNH9py0Z36H7COz4qVZbkb9z1p8HuKIN+fDWu28NTTHm6HlajPqcMvIZHK9PRBYaf6qkRhaVjnB3OOWznz82+js1GY4XqjOZYhrdT5j8wqZveVSvMeuzg//LrA8Fe/oCQwke3T0XEyxYWSSprf/Ugco0/uQNZu4RWPT2aKR+QYaXskXQ3O0ef2MxR5DoUYmvRKk5kGPtJH2US7qtEIiTefRLuk8A4kGkMvY5DIyq4Azc+g8Uqt0UdkfeBNZTP4EWMPOdTQrXAn83Eb9vIBdXfXbO38GzrVobKwYmW8i0cYVHwxNarf6bB+MzErkMKw3zf/H2UjfLZ12eLNN3k51LgWOyGNschmZI8gcDaCQ8lTcZTQSEuXgtPd6Ix5j+bzGAK4GrMakTxmZ+zpgOf/VjEKcGJu4GR39Tautf4YmtQi9oM1nZWSONVSokakHvowcirXIvLeXDa3ZdBaKlTWeRW3ydkNnIcYmZWSW5tG5l1bponET2b2/voPsg8lmbL6H7Bux2khegIQn8ppkQMv674gbciHGJlV+f9Eq66+hSc1lpkI+9EHcBOuQEPF/IfeimhUjsw3Z95Hyjtli/u1sQ2tbnblYa+EaK/uEvNJpx9iszGNkCtWpuEu+UCjfBu7OYGyuQaJyW20kz/fJyIBM/VmhGPtOHkIcYOycBJtAoj//Saur/4amLY8CJ5veWTkS5uJ5oIsDI3M8/obdnpun8m8E3g9A+Sddvk4JNpcAv04zNlOxvqs/Nd3zZx/1Wg3F8mKRynMJsN3m85bQalgcQ7PNvO6C7DqfmOG6g5G4Wl1cMjLd0j63SrrOfMTIva/kWos9Ia90plyYB1hIbwCyp2Yvl3Uq7vKyxeu+hewNuY6drv5WjMy5+D/dcyv5j6NoYaeLvZ+MN+1PVxv3RBDniXO1uvpvaFJTMiPIvYM23dg4Hcnsbf61E0stXacV7jOjsfTpqVXmPauLqHu3ydsNnanNmANspJkyNkPz6FymVbpoXA80Wrz2ImC6DSPzf8giuN8sRDYyZhs1NCFrJR/4rGucaX96FHBvythcoFXWX0Mz17w+BJlOWm3B2DidLjvU/DvXhtZ0nVb5GzDINPojzGs7niZu6xxG9h3/VozNK1mMTSE6FXeZj+yhanQxzdQ+j/uL+L2eMKOHe5H1wphpI+4z7z/qs56xpv3p6SCNkPk+F2m19c/QpDZ7ncjOoHKNeYyNEyOT2iRqZ7oB08imdFrdCNcJ8fi5xfx9B2txj9rqfMklnY/kMTIryb/P5mGXylNxn1fNb+GGsYmb0XcQ9nksQTaGDkTWbVNHOS/yWce+yHqQG8cShJApzG9rtfXH0DxrhsZ7IpGL/2MayUIeFisL/8eaBrMR2dRolWfMPSmd+egPvAP8Ajlj/DTz+h2LI4p0nc+6oHMv0wPMZWRSB7TlMjb7s+t6TaHlqXjDfxAPy+0O0oibDt8DAflOIeTMl5+ZGYGfI5GS/TxGYLTpSFkxMklgh8Xv9SvsbapVCjQ09ewMwXBdWq/c7jSAVe+y682/D5i8rVKf9uBdZ+H635N5nWSE+QyfdUZy3LPKGJilpveYz9hEXNCpeMdMY2waCjQyZyPuu0FgD2M8XwCuMgZwCnK65evYW2sslFE2jcwUJLCmlfYrhETIvkKrrbeGBsS7JIZ4nH0tbRrAqrGxamS+avKIUdhhTZl0ZhvN5Br1fDHPA+KFziXI4momI3MEuzocLCH7PpuF7IwO4FSn4h2vmWfCjrFpNUYmKFGEOyGx9CZl+fwQYwC83L+1j8mjt8XrrzQzFy/YNDZ3mnsVDw3NEiSQH0i4jCE2jI1VIzPEDFMxP+riAvRm05kpr3wM8llnEpm++yjtuneR0/8yebUtRY6fndPGyJxm0trLBZ2K98ZmssWRZixgRgYkivSYPNcMQyIbeMEAY2T62DAyd6b9/2XTflmdxpyB7HVSPDI0IKc0zkX80p9P60HkMjapHf/5jExv0zPqavKY5kBzNp3prLSQzuoi6JyPzDUPN9MBnwOW50hjGbImsy8y5TfKpOGmTsVbZplnZJsFI/NowLSfbfG6r3iQdwiZ0u9r8fqr0zp36byKvWnMu9CYgZ4amibgdGRH/TAkKOS+aT/W8ey62z517PEbefLYFwn6uLe5/3SceeXk0pniY9ObzPXwLy+SzqQZfXyEtR3/SeQo50XIruYxJq1hLulUvOd18/xkCku0wzTojwVQt9VTW4d4kPcX2Om2n49ryB2Q1M7IMoIcXKh4ZGhSUz7HAetM5XkDWQcAWRAchoSnOdZ8ni+S8tdMGnuZNI8jc/Rhu+TSmeK8LCObley+M7iYOu3wNdNoDXFZp+KPsZmA7EupM9M5LyDrH48FVPMmi9dt8SDvYy1eNxVrAUlnmefFSqzEL2h19dbQgKwbTDRTMrWIO2O6F83T5gFpzJHmZHPPX00ac02a77qoPZfOsGmA90OmlV41f9PMe0sCpNPKb+SHTsV7UmtsXZEjho8F/hdgvcWMdWZlQ+Z12HOCecOisemiVdVdynL0xCcgR8ROMb2uScAKJDLAG2b6J9Xj6Y6sOxxiGsWB5v0YMm/6I/LHTCp0xJBP5wvsdN/ujuwRCqLOTOV5qNE5wCedipLOrchR5pU5rvEq1tlHeT6/Aeux4tKZDRxjjGjXLNdohA2XCe0zM+9vtTcyB3oO2c/baEsTsqP5Nix6Q82flCUG5sxKq9/FF50clqV9v+qqYOmcMUNrt1I4O5+7U81IulOWevkN0p0YDnPY/9n5HPVAYqi1dQZIkH9NxgrjgKfY3fs0DpxEapO2PkeejmjSWYyc4TDFjAaORHa4D0nrEWxFFtfnIJs9n6GwzWpOUJ2K4j6pWGffQ6ad+iKOQM+bjo9XYWg2Ia7/M8wz0oJMH9+GO6fsvo8451yBeNX2Mc/mT7EXckqxYWgms/Ps8fORXb9nmh+5GtkA9QQyBfVgEfWqTkXxn1SsM79ZbEYXXtGARNGerj+xt6Smzj5FQk2AnKrXD9jMznNOUryKrDO86rYQi1NnRddpceqs+Dp1yK+UItanoP1BnyNXDU3b/Rwhcu/xmGkaSMfRgrMamMzGpmg6Lc0973xIiqdTHwxFUQJGuMD7DkPmMV9DPDiCiupUFEUpUUOTYiKyKPg6slAYVFSnoihKiRqaFIciC96z2XkIVxBRnYqiKCVqaFJMAP4J/Bdx3Q0F9HurTkVRlBI1NCkOBP6BhNc4KcANpOpUFEUpUUOT4gBk9+07wCkBbiBVp6IoSokamhT7IRsU30PC2tcEtDxUp6IoSokamhTjkLhI64BLA1wuqlNRFMUHQxP3MN9qJAKxG6hOd3UqiqL4Zmi8DOIYY9ezvZ2gOt3VqSiK4iplPuc3F7gdOSNmfYDLRXUqiqKUmKF5Azmk6J/kjvlVbFSnoihKiRma55BT+v4T8HJQnYqiKCVkaBLA48jxru8F+LurTkVRlBIzNC3A3/D21D3VqSiK0gENzXbg98jpkSsD/F1Vp6IoSokZmi3A3cixxBsD/B1Vp6IoSokZmrXAz4HfAvUB/m6qU1EUJeCGZivQJe3/y4CfAn8CmgP0HVSnoihKgMkVGeAyZI2gHnGpHWF63UFrFFWnoihKiY5o/mH+go7qVBRFKdERjaIoiqKooVEURVHU0CiKoihqaBRFURRFDY2iKIqihkZRFEVRdiWU/E8Fo0LTPgX2MO+tnZ+ctofvSg7Lsp1kZmX6/3bRmfY6WDqfunRXnSffHRydiqIoRRrRXGAa7tXA+QHWqzoVRVFKcUTjwEg9D4SAY5BzU7we0ahOHdEEkilXrPUzu0OQI7yHAzOBKXf8ou+qYuls2B5mwIAYx03eSjwO8Xgo9VE34FFgLHLc+LkTJ47a4YXObdsijB7dxJFHb6OxMUzS3rmzruls2RGiulOCE760lepOCVp2hNws6oJ1Fhsn0ZvPAI42r78MPBTQ76g6lfZEGXAHMMH8/xRgA/DtYgmKhGFHc4jWVohEIB7/7KOngEnm9dmmE3V2AMtUdXqME2eAi7O8DhqqU2lP7JVmZFKGp6iNTUV5gk2byti4sYyqqs8G4kPTGsUUpwWwPFVngA1NH+DwtP8fZt4LGqpTaW/0zvBe16I2ImXQ3BxmyeJKQjtblJ4ZLo0HsDxVZ4ANzalABJgPLDCvTw3g91OdSqnRBTgPuBQYk+HzUIC0HgGcQhKqq+OsXFHBpo0RKisTIEeRt6XVSzGhUB6dmfFdZ97yDL5O3wzNmebfR4CHzesvB/D7qU6llKgBbgamAz8BbkMW/NNJBkTrr4FXgCeAuRUVyZ5btkRYtqySikr/JaYW/8Ph3DqzjAwCV54B1umboRmITO2AeEA8Yl4fDgwI0HdTnUqpMQlZ1O+LeBhNBs4NoM7jgEvS/j8GmBEOw7o1UVpjoVyjC08oiyTZVh8mFttlZJNRZ6mUZ0c3NNciUztzgA/N33vmvakB+m5tdX5QAjo/CLBOxXsOyfDeoQHUeUSG9yaEw5BIiNeZ34amsirBmk/LWbMmSk1NPDXCyaizVMqzIxuak4Bvmdc/Ar5o/m40733LXFNsMumkBHQSUJ2Ku0SyvF9u49piEsvw3g6QqatQEVaRysqguSnM4oVVhMPJlIasOkulPDuiobkQmdYJA38GnjY97qmIf/efzGePmGuLRTadlIBOAqhTcdfA7Ad8BTgggxHJtLhRrDWZPoj77OAMn8UtvuebzmSSwTU1cZYvq2Dt2ijV1Ymi6QyF5C9ZmuVZFENTARwPvAzca3pczyD7PA5B1hEON68vNp+Vm2tfNvdW+PA9rOhMEVSdbSmmTsUbJpvf9PfIsd4nBlTnocBi4DHz7wmloLO8InnCtvoIixdWEo0W32ciVHrl6d2I01T+84D+QNS838181jdtOB8DbjXTOnF2XT+4FnHLO8VMAU0FjjR/LUjcr1ZgS1paq4A/As/aeEid6sToCaJOfNapeDNiCZtRSCbX0+lAP/O6CvEqeyZgvdcw8CBQm9ZGPAp0B5qCrDOZ5NFoWbL7+g3RpuYdIVJrRr5WgDLYvj3M9u0hunZN0LIjUirl6bmheRhxq8zGZuBxxAtigXlvFPCltGtOMu/NB34I/B24ygwVuyOeVZk4Lu0HyEchOke30Zk+LA2Szmx4qVNxl1rgeuBgYDnwY/Nvih5IjKp0RiBurOt81noVEu5oBXA5u+7R6Mfu3o6VwEjESSXQOiPh5MhkkvcS8RChUBKfth19pjMSSV5eXx9p+eTjCgYMaAlaeRbV0PwWuNr8f7lp2NaZXtla4CPT4NUi88rDgYva/IIh4G4zxbPI/F2ILGbvY3ryIWSe8sfAEHPfvTa02tH5OaPzwjw1bUERddrBC52Ku0xBNlnWABOR3fqnszM4aqcs91X6rPNaM5JOsTc7Y+xBZoeE1Ggt8DqTEPHZIWE3nRXlyaM/Xl7JmLFNRKPJ8lgsFITyLLqhuQbxcLjONFiXmQdklRkRPG96XnvmSesIdnXTWw0sND2RF41Vv8nkkUQ2pv3AhlYrOkemTU3YIc5O12IvdTrFTZ2Ku1ycNpKNINOeg9JGNdmaPr8XE65r8/+jzEhrblody1b3VKcFndHy5NimpvDchoYwvXu3xrMYmnhHejhS88k3INGD64GDgHeRRfQPjZHYs4C09wReMmkcArxj0q43ed1g8yGzorOfw/LwWqdbuKFTcZd+ed4Lym9TleG9/gEsz5LVmUzSPxIRF+ukPpGfGZoUjyObhBYAvUzDvR9wCzCtgLSnmV7255CzE3qZEc4Ek1ehuK0zhV86neK2TsWf5ysoZNqf0aI63dcZCukDkO1B+Mj0lucA1ciZKFWIZ9R0G+nebO6pBh5A5qffRxZKP3JBdyad1QXoTO+V/N3onOODTie9Jy90Kt6QLBFNqrP96wxcj2srspN+PbIAd5l5/wbgLgtp/grxvsHcO8ykdaxJ2y3a6vyOTZ3pXG7SWG/S9ENnIXipU1EUxdeh/Xp2hkH5Ttp1cyyk+V5a2pea1zeaNN3GiU4CoJOA6VQURfHN0AD8BdlQNAA40Ly3j4U0U9ccaO5tMml5RaE6CYBOAqhTURTFN0PTAMw2rw8y/46ykOaoNvfMNml5RaE6CYBOAqhTURTFN0MD8LH5d2CGBnwJslP9NPO6raEZ2CYNL7GiMxupe5YXQacd/NSpKIrim6HZbv6NIJ5Og4CNyCL/aOQ0uCfM68vMZ4PMtZG0nrzXWNGZjUibNPzSaRc/dSqKovhmaIaaf9eYxvs2xOvpV+zq095i3tsbuN30vteYz/by4XtY1ZmJlM5hPuu0i586FUVRXKMsx2flyNGyAP9FAmZ+HwmzcQayZtDHfL7OXPMcO6Ml9zb/TkSiGMc8+g6F6mxIuweThp86U9QgwTCDolNRFMU3Q/N50wjWAW8gmwW/j+zl6JLlnjrgl8gu/TfM/7sYY/OKR99BdSqKopSooUkdzvM8srj+ADvdhj9FwqCkFqaHAMcgsZ1+YEYSZ5l7v2zS8qphVJ1KUAlleY2F93HpekUpCUPTF3GprUQW2K8G/sbu0UcjwNeAn5kG9C12TvecwM7Q+V414KpTCRrpoUiyRetNtPnN8z2jTsObRPO8V2bhvvJsn6fF94rabG981Zknn/aos6hkcwYYhITcB1kTqDQ96PHI+fbZzrj+s7nmFXPPYeazkSZNt1GdSlCoy/DehrTX29oYlZTRSPfKzHQA2uY2/88UEWKrDZ2ZjFlDG52ZSH8/li3dROKziMV1DhtGT3Xm+d3ao87ijmhmhd/d7c2Jif3T96G0IscJ3zor/K6Vg1FXT0zs/wVk/WFaWmGMmhV+95MMeTnRn1Fnhgc6o04go07gE5fLuVR0lhyzZs13dP/EiaPckvIAcEHa7/MWsLRNw/I0cDI7p7+eZedx3CDHaqxjp1PIduDJNvksM2lPSKtPD9jQ+ZAZKadYC/yvjXF8AZm6TfEBu54G+whyoF86fw2FksQTIRKJEKFQciGE5rLrqaIvBkFnm/8vRM64ae86AzmiWWJ6Uq8Ch84Kv3uzRSMjD3/43cSs8LvTgUNNGpvZdVOnW+yiE4kabeeU8AQS7Vl1Kk6ZbozCemAWcKUxAulch6yzrTdG5Zo2n8811yw0HYzfAfe3uaYVOc1zlknnSVOfrHIBsq9ss8nvKHYPdf8Vo3OzyWdym88/AM5BNiBvRE7XvSUUgkQilH4Gy5dMo7sZ+HebBrloOjPk1RF0FndEk8VQLEbOOP+MjRsX1SBrA0ea6Zwh7PSWqkMWsueYaZ5/9uw5vGFW+N3/mesd8+TmBzO9vYvOUChEMpm0pdMMc/PqPKX7Wa7pNNjSGQ6HGxKJhHs6n3wy62emHAmHwyQSiULKMy+nnHKKqxW5kPrp8rO0CnHUyMVHiCt7rg7FfebPK3aQO1IGZpT1RQsjuAcAGraHGTAgxtlf3UQ8DmknStabv4RpHLd7pXPbtgijRzdx5NHbaGwM09IS2k1nDlzT2bIjRHWnBCd8aSvVnRI0NYVtl6cXOp2O/G1yCLKfcjgwE5hSZuEBHgZcC6Gzy8urO0WjnYhGKwmHo4RCMiBKJhO9E4lY71iseUIstv3ilpbG7Rs3LnoAuK1nz+F+9byHAddWVFSe06NH7+q+ffegS5daKisriETCvPnmgow6IfkAssHTV53ZyvOQQ0YSjyd6Nzfv6F1XVz9h/fp1F69fv6axtTX2oOnl+Knz+2Vl0bN69uxd3bt3b7p160KnTtU0NcVYtmwd9fXbfSnPjz7aeeROeXk54XCY1tZWamtr2bhx0bBIJPL9aLT8rJ49U797Z6qrqygrk/rZ2pro3djY1LuubtuEtWvXXLxx4/rGLVuWPhiPx29Zu7b7kvr6esrKykgkErS07Nzfu88++xBAyoA70qbOTjHTM98ulqBIGHY0h2hthUgE4jtXHJ9i596xs82U4dkBLFPV6XH9LMthYCqBaaFQeEpVVbfyysquhMORLD3gCOFwhLKySqqqupJIxDs1N2+9oKlpyzc2blx0J/Cjnj2HN2e8+bDm3LJTn2fvgVcC02pqaq8cOHCv6MCB/ams3NVBI5lMEgqFcupMJhN3ImsnnurMV56RSJiysggVFVG6dKlh4MA9iMX2rV6x4tPzPv54ydfr67fd4UhnfiqBH1dVVX934MDB0UGD+lNdvetZbS0tccLhEOGwg/J0yIcfflgJTKuu7nTlgAGDo4MGDaCyspxQKLzbyYbl5WHKy2vp0qWWAQP2oLm5pfqTT1aet3Llx1+fPXv2HcCPxo0b10xpsFfaQ5x6sM8upqGpKE+waVMZGzeWMXhwC7FYBCQKxqQ2l54WwPJUnT7Uz7IsRmYo8GhFRe34Tp16EQ7bc24IhyNUV/egsrJL+fbtG67ZsaP+2I0bF33Zg9HN0HA4/NigQUPHDR8+jKqqCsc6zfTHEg8qScHlGY2WMXToQAYO7BddtGjpNR9/vGRyLBY7zQud4XD48X79BowdOXI4NTWdAlme77///tBQKPTYnnsOHDdy5AiqqysJh/Mf8RMKQSgUprq6khEjhjJgwJ7RBQsWXrN69Yovvv/++2eMGTOmFNa9emd4r2sxBYXLoHlbmCWLKxmy12cjwp4ZLo0HsDxVpw/1M5zByOwPvF5T03t8be0ethvFXRueMmpr96Cmpvd4YJZJ2y32j0ajb4wf/7lx48aNtm1kcukEXNXpVnlGo2WMHj2C/fc/aExlZeUbbuuMRqNvjho1Zuz48WNsGxm/ynPevHn7R6PRN0ePHjduzJjR1NRUWzIyu2sMU1NTzZgxoxk9ety4aDT6xrx58/YPwIPaBTgPOeRuTCZ7GaBG5QjgFJJQXR1n5YoKNm2MUFmZgMwxBlu9FBMK5dGZGd915i3PYOssqH6G2xiZYcBztbV79KmsdK+TVFnZldraPfoAz5k8nDIsGo3+e7/9Duo9cGA/T3TiTvBKT8pzjz16cdBBh/SqrKx83i2d0Wj0hX33HddryJBBlJWVBbI8Fy5cOCwajT6/777jew0e3J+KinLn0z4V5Qwe3J999x3fKxqNPr9w4cJiBi2tQTzIpgM/Qda6hre5Jijn0f8acax4AphbUZHsuWVLhGXLKqmo9F9iytMtQ59jF51ZRgaBK8+A6iy4fobTjEwV8GhNTe9eFRW1riusqKilpqZ3L+Axk1ehVIXD4cf23Xe/nv369fJUJxKPrGCdXpZn9+5dOOCAg3qUlZU94VRnOBx+bMSIUd3799+DSCQcyPJcuHBhFfDoyJH79thzzz6uGUOAsrIy9tyzLyNH7tsDeMzkVQwmIWstfYFuiBvsuQFscI4DLkn7/xhgRjgM69ZEaY2Fco0uPKEskmRbfZhYbJeRTUadpVKeAdRZcP1Mb1WmVVTUjnOz552ph1tRUTsW2XhYKNMGDRo6duDAPQKv0+vy7NWrO3vvPXLfcDj848KnG0I37rnnwLEDB/YnEokEsjzLy8sBpvXvP2jcgAH9XDUyO41NhAED+tG//6CxwDSTp98ckuG9QwPY4ByR4b0J4bBEBojH8d3QVFYlWPNpOWvWRKmpiadGOBl1lkp5BlBnwfUzbEYzQ0Oh8JROnXp5rrRTp96EQuEpBU6hDa2pqb1y+PBhhDyuySmdBU75+Faew4btRW1t5+8WqrOysmrKiBF7U14eDWx5zps3b2hVVdWVw4cP91RneXmU4cOHU1VVfeW8efO8nELLZtHLbVxbTDKFTNkBMnUVKsIqUlkZNDeFWbywinA4mdKQVWeplGeRcL1+pkY0U6uqukWdLFRbJRyOUFXVLcrOc2vs9L6nDhy4V5mThX8/dPpZnpFImOHD9ymLRCLX2f+O4esHDBhUVlVVGfTf/bqBA/cqq6mp9lxnTU01AwcOKQuFQtd59ADvh+wUPyDDQ5ppfrtYazJ9EPfZwRk+i1t8zzedySSDa2riLF9Wwdq1UaqrE0XTKd6Nu/1wpVCentXP8MaNi2ohdLaXUzyZplIgdJbkbZna8vKKcwYO3NN3nYAtnX6X5x579Ka8vOIrdnVGImVfGTx4oGdTZm6U55NPPlkbiZSdNXjwQMJh77vK4XAIKZOyrzz55JNuL65NBp4Bfg/8AziRYHIoEs3iMfPvCaWgs7wiecK2+giLF1YSjRbfZyJUeuXpWf0MA8eXl1d3yrYZ06vebXl5dSfgeBu3Hd+zZ+/qysrywOv0vzxD9OvXv9quzl69eldXVlYEvjx79epT7ccodqdBrKBXrz52yzPVI4ySParudOSMoSpgD8RrJ2hTY2HgwbTOQBnwKM4cTnzRmUzyaLQsWbV+Q5TmHSHCYf9FRcpg+/Yw27eHqChPBK08i1Y/w8DR0Wgn37+xyfNoG7cc3afPHiWhsxjl2atXb9s6e/fu7flalxvl2bdvX397oiEwedrRWWse1BeQYJhD2nzeg10j7wKMoDhurFchkaN/y+7z7v2AAW1tLzuPuQi0zkg4OTKZhEQ8RCiU9F1nJJIsb2wM88nHFYTDySCVZ1HrZxkwtqyswvcaZPIca+OWsZ0715aEzmKUZ21tp3Zbnl27dvFdp8nTjs4pyCa2GuSo7a7A6eyM0p2t91Hp81e7FjmiIsXebQxqeY7ecOB1JiHis0PCbjorypNHf7y8kjFjm4hGk+VpQUaLWZ5FrZ9hYGgk4r8rp8lzqI1bhlZXV5SEzmKUp9m8aLM8q30f0RRSnlVV/s8ymDzt6LzYPMSpRuQUdj2cLltB+72Y0NbJ4ag2BjXbInRcdVrTGS1Pjm1qCtPQECYaTQZFZ1HrZxjoHC7CZKbJs7ONWzqHw2GSyaTtv0Qi6bvOUijPaLRwr7iUgZJgpdb/jOOBLZ2pKMz+jrxsl2e/PO8FZUd/Jqvdn+BRsjqTSfpHIuJinUwGRmdR62fJHAUKMHv2AoIV6ik4JBIJ3/KqqalizJjCTpKOx+M888yijvKzhAOoaQe7nz/fojrd1xkKaf1Mz2ibn41Um4Zxm41bVGcOWlpitnXGYoXH5LM7kkn9tbbGbetsbfW/PE2e2xwmkwxg45JUnR1SZ1HrZxhYGo/731EweS61cYvqzEF9faNtnY2NjSR9HNsnk0kaG+3rbGpq8r08TZ5LURTFFUMzt7XV/2gH8fgOkCilVlGdOdi8eYttndu21fuu0+RpS+fWrXW+6zR5ztUmQlHcMTQvxWLbfc+4pWU7wEs2blGdWUgkkqxZ86ltnevXr/d9RLN+/XrbOteuXevromoyCWvXrrWrU1GUHIbm2ZaWxu2JhH/edolEnJaWxkZkk5NVVGcW1q/fSkPDVts6N2xY39jc7N/oq7l5Bxs2rG+yr3NdEXSus6tTUZRshqZnz+H1kHywuXmrjw/yViD5gORtmaLplLyDqTMeT7Bs2XISibhtnfF468OffLKSeDzug844klfrQ3Z0nnLKKfXxeOtDH3+8wpGbup3R4ccfryAeb33wlFNOqdcmQlHcGdEA3NrUtCXmRy88kYjT1LQlhsTRsYvqbMOKFevZuHF1QToTicT0FSs+bm1qavZcZ1NTMytXftyaSCRutntvMpm8ecWK5a0NDY2e69y+vZEVK5a3JpPJW7R5UBQXDU3PnsOXJJOJO7ZvX+/Dg7yeZDJxZ8+ewxcXcLvvOpFoq4HUuWlTPYsXLyCRiBess7m56Y6FCxen3KM9oaUlxsKFi2lsbLyjEJ1jxoxZ0tTU+PNFixb5orOpqfGOMWPGLNbmQVHcHdEATNuxo36ul1M+zc1b2bGjfi4OT65UnbB163bmz19IY+NWRzqTyeSPVq9eMW/FilWeTKHF43FWrFjF6tUr5hWqs6WlBWDaqlWfzF258tPUXhxXaW1tZeXKT1m9+pN5wDSTp6Iobhqanj2HNwGnNzSs37Bjh/tT0zt21NPQsH4DcHrPnsOdzIH4phMIpM716+v44IOFbNq0yhWdiUTitIUL529etWoN8bh7myPj8QSrVq1h4cL5mxOJxGlOdI4YMaIJOH3Bgg82rV691lVj09oaZ/XqdSxY8MGmZDJ52ogRIxq1aVAUb0Y09Ow5fAlwXH39mnVu9sSbm7dSX79mHXCcycMpnus0eQRKZyzWytKla5g/fwEbN65wVWcsFjvmgw/e37h8+Se0trY6TrC1tZXlyz/hgw/e3xiLxY5xQ+eIESOWxGKxYz/4YM6Gjz9eyY4dzkcdO3a08PHHK/nggzkbYrHYsSNGjFji4vMVyvIaC+/j0vWKUvT6uVusm549h78LTGxoWD+3vn4NiUThjU4iEae+fg0NDevnAhNN2m7hmU6TdmB0xmJxVqzYwJw5y1i0aD5bt67xRGcsFjtk/vx5H8yZM4+GhsL3AjU0bGfOnHnMnz/vg1gsdoibOseMGfNuLBY7dP78ufPmzfuQhobGguK8JRIJGhoamTfvQ+bPnzsvFosdOmbMmHddfpDT3eSyDcHSxWcKHV+WI81CiOZ5r8zCfeXZPk+L7xW18F2KpjNPPu1RZ1HrZ8agambUMWHHjvrbt2z5ONbYuAk7HlSJRJzGxk1s2bI8tmNH/e3ABJdGMplGDK7qdGmEULDOeDxJS0sr27Y18umnm5k/fyVvv72QhQsX8umnCzzXmUgkDly9esXPXn/99daPPlqUChljicbGRj76aBGvv/566+rVK36WSCQO9ELnuHHjliQSiYNWrfrk9jfeeL114cKlNDY2k0gkcm7sTCbFwDQ2NrNw4VLeeOP11lWrPrk9kUgcNG7cOKc6M4Uv2JD2elubhzb1UDak/X9dhjQ2t/l/Jg8TO8PlTI1FQxudmUh/P5Yt3UTis4jFdQ4bRk915vnd2qPOotbPrEJ79hzeDFy7ceOi3zc2brqmsXHzOeXl1dXRaCei0UrC4WgqND2JRIJEIkYs1kwstp2WlsYmSP4duK1A7zJbM17AtclkwpFOCvPacl3n7NkfBUHn95qaGu9dvHjB1KVLF5/ds2fvqt69e9OtWxeqq6soKyv7bHqssbGJLVvqWL9+PRs3rm9OJOIPJBKJW0KhkKc6R48e3VxbW3vt7Nmzf79kyYKpy5aJzr59+9K1axeqqqooK4sYnXGamprYurWOtWvXfqYzHo/fcvDBBy+ur3dlDe0B4IK0h/8tdo2Vtg14Gjg5bXrhWWBL2jUvmYe5j/n/duDJNvksM2lPSM1Smryt8hDwtbT/rwX+16bxeQE4Ju29D4AFaf9/BPhhm3T/GgoliSdCJBIhQqHkQgjNZdczZF4Mgs42/1+IhBpq7zqLWj9Dr732oSWVGzcuqgFOBI4ExiNHgXZN61EtB+YArwDP9Ow5vMFKuo890p07fpH9qN4pV6wF4PAjZ1stUFs621js7K1vUwVnnT056+cPPvAvACqrdpS8zlAoRDKZJBwOk0gkbOkMh8MNiUTiszSc6sxH/wGDHNXPVSs/yZtHLp1p9bQ/cAdwGLAIOXnxjTaX7WOu2Q+YB1wOzG8zw/BN4BpTPx4Brmd3J4pDgNuB4cBMYModv+i7ykp5TblibYVpdA4HVgFnAR+1uawbcs7954y+s8216ZwN3Gx0PgR8Z/v2MHv2j3Hc5K0kEhCPhwYCjyIHyP0POGfixFGbvdS5vSG8qv/AFo6bXEc8DvF4aDedGbJzVWcsFvooGk0y+YSt9OjRSlNTuKDydFPnrFnzi1o/Q9+9fE034H7gWKwdL9oCPAycf/qXN7cYY1GJnEP9lSxziW1pNVb+bKDOiqExlaognUDLhIPfAzmWtGCdFhtGRzrNe6rTBZ39BwxqMcbEM52KouQnDPwCmIz1M6zLzVDx+sce6c5jj3QH+IF5L2oxjTKT5502tBasM+091dmBdK5a+UlqxOKHTkVRchiaQrtr6fcd50Iabl6rOlWn3zoVRclhaHoWeG+ftNdupJEP1ak6g6xTUZQchkZRlCzo+oyiqKFRFEVR1NAoiqIoamgURVEURQ2NoiiKooZGURRFUdTQKIqiKGpoFEVRlHZlaOoKvDc9mJsbaeRDdarOIOtUFCWHoXm0wHsfS3vtRhr5UJ2qM8g6FUXJQhlwFVALfAFrx3a2mgfw9rT3bgX6IefXWwl+mEDOUvieDa2qU3UGWaeiKDkMTR0SPt0JLcC3zJ9XqE7VGWSdiqLkMDQdgrdm7+c4jbPO9jZ9t/BDpznfR1EUxZKh6QLci/WpiTgyNXE5Ow/AKgfuAk6zODWRRA6WuhjrC7WqU3UGWaeiKDkMzQzgTJv3XYwcRXqT+f9U4CKbaXwFOafa6n2qU3UGWaeiKFkIA2cUeO/paa/dSCMfqlN1Blmnoig5DE2XAu/t3mZ6w2ka+VCdqjPIOhVFyWFoFEVRFEUNjaIoiqKGRlEURVHU0CiKoihqaBRFURQ1NIqiKIqihkZRFEVRQ6MoiqJ0BEOzscB716W9diONfKhO1RlknYqi5DA0/yrw3mfTXj/nQhr5UJ2qM8g6FUXJYWguNw9zq8V7WoC/Ajenvfdj4G/sjJabj1bzEE+xoVV1qs4g61QUJQv/PwAlukJhy2ScjQAAAABJRU5ErkJggg==\";\r\n\r\nconst iconfontObjects = {\r\n    border: {\r\n        \"border-top\": \" iconfont-luckysheet luckysheet-iconfont-shangbiankuang\",\r\n        \"border-bottom\": \" iconfont-luckysheet luckysheet-iconfont-xiabiankuang\",\r\n        \"border-left\": \" iconfont-luckysheet luckysheet-iconfont-zuobiankuang\",\r\n        \"border-right\": \" iconfont-luckysheet luckysheet-iconfont-youbiankuang\",\r\n        \"border-none\": \" iconfont-luckysheet luckysheet-iconfont-wubiankuang\",\r\n        \"border-all\": \" iconfont-luckysheet luckysheet-iconfont-quanjiabiankuang\",\r\n        \"border-outside\": \" iconfont-luckysheet luckysheet-iconfont-sizhoujiabiankuang\",\r\n        \"border-inside\": \" iconfont-luckysheet luckysheet-iconfont-neikuangxian\",\r\n        \"border-horizontal\": \" iconfont-luckysheet luckysheet-iconfont-neikuanghengxian\",\r\n        \"border-vertical\": \" iconfont-luckysheet luckysheet-iconfont-neikuangshuxian\",\r\n    },\r\n    align: {\r\n        left: \" iconfont-luckysheet luckysheet-iconfont-wenbenzuoduiqi\",\r\n        center: \" iconfont-luckysheet luckysheet-iconfont-wenbenjuzhongduiqi\",\r\n        right: \" iconfont-luckysheet luckysheet-iconfont-wenbenyouduiqi\",\r\n        top: \" iconfont-luckysheet luckysheet-iconfont-dingbuduiqi\",\r\n        middle: \" iconfont-luckysheet luckysheet-iconfont-shuipingduiqi\",\r\n        bottom: \" iconfont-luckysheet luckysheet-iconfont-dibuduiqi\",\r\n    },\r\n    textWrap: {\r\n        overflow: \" iconfont-luckysheet luckysheet-iconfont-yichu1\",\r\n        wrap: \" iconfont-luckysheet luckysheet-iconfont-zidonghuanhang\",\r\n        clip: \" iconfont-luckysheet luckysheet-iconfont-jieduan\",\r\n    },\r\n    rotation: {\r\n        none: \" iconfont-luckysheet luckysheet-iconfont-wuxuanzhuang\",\r\n        angleup: \" iconfont-luckysheet luckysheet-iconfont-xiangshangqingxie\",\r\n        angledown: \" iconfont-luckysheet luckysheet-iconfont-xiangxiaqingxie\",\r\n        vertical: \" iconfont-luckysheet luckysheet-iconfont-shupaiwenzi\",\r\n        \"rotation-up\": \" iconfont-luckysheet luckysheet-iconfont-wenbenxiangshang\",\r\n        \"rotation-down\": \" iconfont-luckysheet luckysheet-iconfont-xiangxia90\",\r\n    },\r\n};\r\n\r\n/**\r\n *单元格右击菜单配置\r\n *\r\n */\r\nfunction customCellRightClickConfig() {\r\n    const config = {\r\n        copy: true, // copy\r\n        copyAs: true, // copy as\r\n        paste: true, // paste\r\n        insertRow: true, // insert row\r\n        insertColumn: true, // insert column\r\n        deleteRow: true, // delete the selected row\r\n        deleteColumn: true, // delete the selected column\r\n        deleteCell: true, // delete cell\r\n        hideRow: true, // hide the selected row and display the selected row\r\n        hideColumn: true, // hide the selected column and display the selected column\r\n        rowHeight: true, // row height\r\n        columnWidth: true, // column width\r\n        clear: true, // clear content\r\n        matrix: true, // matrix operation selection\r\n        sort: true, // sort selection\r\n        filter: true, // filter selection\r\n        chart: true, // chart generation\r\n        image: true, // insert picture\r\n        link: true, // insert link\r\n        data: true, // data verification\r\n        cellFormat: true, // Set cell format\r\n    };\r\n\r\n    // cellRightClickConfig determines the final result\r\n    if (JSON.stringify(luckysheetConfigsetting.cellRightClickConfig) !== \"{}\") {\r\n        Object.assign(config, luckysheetConfigsetting.cellRightClickConfig);\r\n    }\r\n    luckysheetConfigsetting.cellRightClickConfig = config;\r\n    return config;\r\n}\r\n\r\n/**\r\n *sheet页右击菜单配置\r\n *\r\n */\r\nfunction customSheetRightClickConfig() {\r\n    const config = {\r\n        delete: true, //Delete\r\n        copy: true, //Copy\r\n        rename: true, //Rename\r\n        color: true, //Change color\r\n        hide: true, //Hide, unhide\r\n        move: true, //Move to the left, move to the right\r\n    };\r\n\r\n    // sheetRightClickConfig determines the final result\r\n    if (JSON.stringify(luckysheetConfigsetting.sheetRightClickConfig) !== \"{}\") {\r\n        Object.assign(config, luckysheetConfigsetting.sheetRightClickConfig);\r\n    }\r\n    luckysheetConfigsetting.sheetRightClickConfig = config;\r\n    return config;\r\n}\r\n\r\nexport {\r\n    gridHTML,\r\n    columeHeader_word,\r\n    columeHeader_word_index,\r\n    flow,\r\n    colsmenuHTML,\r\n    rightclickHTML,\r\n    pivottableconfigHTML,\r\n    pivottablesumHTML,\r\n    sheetHTML,\r\n    columnHeaderHTML,\r\n    sheetselectlistHTML,\r\n    sheetselectlistitemHTML,\r\n    inputHTML,\r\n    modelHTML,\r\n    maskHTML,\r\n    filtermenuHTML,\r\n    filtersubmenuHTML,\r\n    sheetconfigHTML,\r\n    luckysheetPivotTableHTML,\r\n    luckysheetAlternateformatHtml,\r\n    luckysheetchartpointconfigHTML,\r\n    luckysheetToolHTML,\r\n    menuToolBar,\r\n    luckysheetlodingHTML,\r\n    luckyColor,\r\n    keycode,\r\n    luckysheetdefaultstyle,\r\n    luckysheet_CFiconsImg,\r\n    luckysheetdefaultFont,\r\n    iconfontObjects,\r\n};\r\n"
  },
  {
    "path": "src/controllers/controlHistory.js",
    "content": "import sheetmanage from './sheetmanage';\r\nimport server from './server';\r\nimport pivotTable from './pivotTable';\r\nimport conditionformat from './conditionformat';\r\nimport luckysheetPostil from './postil';\r\nimport imageCtrl from './imageCtrl';\r\nimport dataVerificationCtrl from './dataVerificationCtrl';\r\nimport hyperlinkCtrl from './hyperlinkCtrl';\r\nimport {zoomRefreshView,zoomNumberDomBind} from './zoom';\r\nimport { createFilter, createFilterOptions, labelFilterOptionState } from './filter';\r\nimport formula from '../global/formula';\r\nimport json from '../global/json';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport { \r\n    jfrefreshgrid, \r\n    jfrefreshgridall, \r\n    jfrefreshrange, \r\n    jfrefreshgrid_rhcw, \r\n    jfrefreshgrid_adRC,\r\n    jfrefreshgrid_deleteCell,\r\n    jfrefreshgrid_pastcut,\r\n    luckysheetrefreshgrid \r\n} from '../global/refresh';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport Store from '../store';\r\nimport { selectHightlightShow } from './select';\r\nimport method from '../global/method';\r\n\r\nfunction formulaHistoryHanddler(ctr, type=\"redo\"){\r\n    if(ctr==null){\r\n        return;\r\n    }\r\n\r\n    let data = ctr.data;\r\n    if(type==\"undo\"){\r\n        data = ctr.curdata;\r\n    }\r\n    for(let s = 0; s < ctr.range.length; s++){\r\n        let st_r = ctr.range[s].row[0];\r\n        let ed_r = ctr.range[s].row[1];\r\n        let st_c = ctr.range[s].column[0];\r\n        let ed_c = ctr.range[s].column[1];\r\n\r\n        for(let r = st_r;r < ed_r + 1; r++){\r\n            for(let c = st_c; c < ed_c +1; c++){\r\n                if(r > data.length - 1){\r\n                    break;\r\n                }\r\n                // formula.execFunctionExist.push({ \"r\": r, \"c\": c, \"i\": ctr.sheetIndex });\r\n                if(data[r][c] == null || data[r][c].f==null || data[r][c].f==\"\"){\r\n                    formula.delFunctionGroup(r,c,ctr.sheetIndex);\r\n                }\r\n                else if(data[r][c] != null && data[r][c].f!=null && data[r][c].f.length>0){\r\n                    formula.insertUpdateFunctionGroup(r,c,ctr.sheetIndex);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nconst controlHistory = {\r\n    redo: function (e) {\r\n        if (Store.jfredo.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let ctr = Store.jfredo.pop();\r\n        Store.jfundo.push(ctr);\r\n        Store.clearjfundo = false;\r\n        \r\n        if (sheetmanage.hasSheet(ctr.sheetIndex) && Store.currentSheetIndex != ctr.sheetIndex) {\r\n            sheetmanage.changeSheetExec(ctr.sheetIndex);\r\n        }\r\n\r\n        // formula.execFunctionExist = [];\r\n\r\n        if (ctr.type == \"datachange\") {\r\n            //如果有单元格为null,则对应公式应该删除\r\n            formulaHistoryHanddler(ctr);\r\n            \r\n            let allParam = {\r\n                \"cfg\": ctr.config,\r\n                \"RowlChange\": ctr.RowlChange,\r\n                \"cdformat\": ctr.cdformat,\r\n                \"dataVerification\": ctr.dataVerification,\r\n                \"dynamicArray\": ctr.dynamicArray,\r\n                \"hyperlink\": ctr.hyperlink,\r\n            }\r\n            //防止协同编辑时选区错误\r\n            server.saveParam(\"mv\", Store.currentSheetIndex, ctr.dataRange);\r\n           // jfrefreshgrid(ctr.data, ctr.range, allParam);\r\n\r\n            /* ⚠️  这个🌶️  dataRange表示的才是数据更新的位置 */\r\n            jfrefreshgrid(ctr.data, ctr.dataRange, allParam);\r\n\r\n            // formula.execFunctionGroup(null, null, null, null, ctr.data);//取之前的数据\r\n        }\r\n        else if (ctr.type == \"pasteCut\") {\r\n            let s = {\r\n                \"sheetIndex\": ctr.source[\"sheetIndex\"],\r\n                \"data\": ctr.source[\"curData\"],\r\n                \"curData\": ctr.source[\"data\"],\r\n                \"config\": ctr.source[\"curConfig\"],\r\n                \"curConfig\": ctr.source[\"config\"],\r\n                \"cdformat\": ctr.source[\"curCdformat\"],\r\n                \"curCdformat\": ctr.source[\"cdformat\"],\r\n                \"dataVerification\": ctr.source[\"curDataVerification\"],\r\n                \"curDataVerification\": ctr.source[\"dataVerification\"],\r\n                \"range\": ctr.source[\"range\"]\r\n            }\r\n            let t = {\r\n                \"sheetIndex\": ctr.target[\"sheetIndex\"],\r\n                \"data\": ctr.target[\"curData\"],\r\n                \"curData\": ctr.target[\"data\"],\r\n                \"config\": ctr.target[\"curConfig\"],\r\n                \"curConfig\": ctr.target[\"config\"],\r\n                \"cdformat\": ctr.target[\"curCdformat\"],\r\n                \"curCdformat\": ctr.target[\"cdformat\"],\r\n                \"dataVerification\": ctr.target[\"curDataVerification\"],\r\n                \"curDataVerification\": ctr.target[\"dataVerification\"],\r\n                \"range\": ctr.target[\"range\"]\r\n            }\r\n            jfrefreshgrid_pastcut(s, t, ctr.RowlChange);\r\n        }\r\n        else if (ctr.type == \"rangechange\") {\r\n            //如果有单元格为null,则对应公式应该删除\r\n            formulaHistoryHanddler(ctr);\r\n            \r\n            jfrefreshrange(ctr.data, ctr.range, ctr.cdformat);\r\n            // formula.execFunctionGroup(null, null, null, null, ctr.data);//取之前的数据\r\n        }\r\n        else if (ctr.type == \"resize\") {\r\n            Store.config = ctr.config;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = Store.config;\r\n\r\n            if(ctr.ctrlType == \"resizeR\"){\r\n                server.saveParam(\"cg\", ctr.sheetIndex, ctr.config[\"rowlen\"], { \"k\": \"rowlen\" });\r\n            }\r\n            else if(ctr.ctrlType == \"resizeC\"){\r\n                server.saveParam(\"cg\", ctr.sheetIndex, ctr.config[\"columnlen\"], { \"k\": \"columnlen\" });\r\n            }\r\n\r\n            let images = $.extend(true, {}, ctr.images);\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].images = images;\r\n            server.saveParam(\"all\", ctr.sheetIndex, images, { \"k\": \"images\" });\r\n            imageCtrl.images = images;\r\n            imageCtrl.allImagesShow();\r\n\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        else if (ctr.type == \"cellRowChange\") {\r\n            jfrefreshgridall(ctr.data[0].length, ctr.data.length, ctr.data, ctr.config, ctr.range, ctr.ctrlType, ctr.ctrlValue, ctr.cdformat);\r\n        }\r\n        else if (ctr.type == \"extend\") {\r\n            jfrefreshgridall(ctr.data[0].length, ctr.data.length, ctr.data, ctr.config, ctr.range, \"dele\", ctr.ctrlValue);\r\n        }\r\n        else if (ctr.type == \"dele\") {\r\n            let ctrlValue1 = $.extend(true, {}, ctr.ctrlValue);\r\n            ctrlValue1.restore = true;\r\n            jfrefreshgridall(ctr.data[0].length, ctr.data.length, ctr.data, ctr.config, ctr.range, \"extend\", ctrlValue1);\r\n        }\r\n        else if (ctr.type == \"addRC\") { //增加行列撤销操作\r\n            let ctrlValue = $.extend(true, {}, ctr.ctrlValue);\r\n            if(ctrlValue.direction == \"rightbottom\"){\r\n                ctrlValue.index = ctrlValue.index + 1;\r\n            }\r\n\r\n            jfrefreshgrid_adRC(\r\n                ctr.data, \r\n                ctr.config, \r\n                \"delRC\", \r\n                ctrlValue, \r\n                ctr.calc, \r\n                ctr.filterObj, \r\n                ctr.cf, \r\n                ctr.af, \r\n                ctr.freezen,\r\n                ctr.dataVerification,\r\n                ctr.hyperlink\r\n            );\r\n        }\r\n        else if (ctr.type == \"delRC\") { //删除行列撤销操作\r\n            let ctrlValue = $.extend(true, {}, ctr.ctrlValue);\r\n            ctrlValue.restore = true;\r\n            ctrlValue.direction = \"lefttop\";\r\n\r\n            jfrefreshgrid_adRC(\r\n                ctr.data, \r\n                ctr.config, \r\n                \"addRC\", \r\n                ctrlValue, \r\n                ctr.calc, \r\n                ctr.filterObj, \r\n                ctr.cf, \r\n                ctr.af, \r\n                ctr.freezen,\r\n                ctr.dataVerification,\r\n                ctr.hyperlink\r\n            );\r\n        }\r\n        else if (ctr.type == \"deleteCell\") { //删除单元格撤销操作\r\n            jfrefreshgrid_deleteCell(\r\n                ctr.data, \r\n                ctr.config, \r\n                ctr.ctrl, \r\n                ctr.calc, \r\n                ctr.filterObj, \r\n                ctr.cf,\r\n                ctr.dataVerification,\r\n                ctr.hyperlink\r\n            );\r\n        }\r\n        else if (ctr.type == \"showHidRows\") { // 隐藏、显示行 撤销操作\r\n            //config\r\n            Store.config = ctr.config;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.config;\r\n        \r\n            server.saveParam(\"cg\", ctr.sheetIndex, ctr.config[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n        \r\n            //行高、列宽 刷新  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        else if (ctr.type == \"showHidCols\") { // 隐藏、显示列 撤销操作\r\n            //config\r\n            Store.config = ctr.config;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.config;\r\n        \r\n            server.saveParam(\"cg\", ctr.sheetIndex, ctr.config[\"colhidden\"], { \"k\": \"colhidden\" });\r\n        \r\n            //行高、列宽 刷新  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        else if (ctr.type == \"datachangeAll\") {\r\n            formula.execFunctionGroup();\r\n            jfrefreshgridall(ctr.data[0].length, ctr.data.length, ctr.data, null, ctr.range, \"datachangeAll\", ctr.ctrlValue);\r\n        }\r\n        else if (ctr.type == \"datachangeAll_filter_clear\") {\r\n            createFilterOptions(ctr.filter_save);\r\n\r\n            $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").each(function(i){\r\n                let $top = $(this);\r\n                let item = ctr.optiongroups[i];\r\n                labelFilterOptionState($top, item.optionstate, item.rowhidden, item.caljs, false, item.st_r, item.ed_r, item.cindex, item.st_c, item.ed_c);\r\n            });\r\n\r\n            server.saveParam(\"fsr\", Store.currentSheetIndex, { \"filter\": ctr.optiongroups, \"filter_select\": ctr.filter_save });\r\n\r\n            //config\r\n            Store.config = ctr.config;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            if(Store.config[\"rowhidden\"] == null){\r\n                Store.config[\"rowhidden\"] = {};\r\n            }\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, Store.config[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n\r\n            //行高、列宽 刷新  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n\r\n            $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        }\r\n        else if (ctr.type == \"datachangeAll_filter\") {\r\n            let $top = $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").eq(ctr[\"optionsindex\"]);\r\n            let st_r = $top.data(\"str\"), \r\n                ed_r = $top.data(\"edr\"), \r\n                cindex = $top.data(\"cindex\"), \r\n                st_c = $top.data(\"stc\"), \r\n                ed_c = $top.data(\"edc\");\r\n\r\n            labelFilterOptionState($top, json.hasKey(ctr.rowhidenPre), ctr.rowhidenPre, ctr.caljs, true, st_r, ed_r, cindex, st_c, ed_c);\r\n\r\n            //config\r\n            Store.config = ctr.config;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            if(Store.config[\"rowhidden\"] == null){\r\n                Store.config[\"rowhidden\"] = {};\r\n            }\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, Store.config[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n\r\n            //行高、列宽 刷新  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n            \r\n            $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        }\r\n        else if (ctr.type == \"filtershow\") {\r\n            $('#luckysheet-filter-selected-sheet' + ctr.sheetIndex + ', #luckysheet-filter-options-sheet' + ctr.sheetIndex).remove();\r\n            \r\n            if(server.allowUpdate){\r\n                server.saveParam(\"all\", ctr.sheetIndex, null, { \"k\": \"filter_select\" });\r\n            }\r\n        }\r\n        else if(ctr.type == \"pivotTable_change\"){\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].pivotTable = ctr.pivotTable;\r\n\r\n            pivotTable.getCellData(ctr.sheetIndex);\r\n            pivotTable.initialPivotManage(true);\r\n\r\n            pivotTable.refreshPivotTable();\r\n        }\r\n        else if (ctr.type == \"addSheet\") {\r\n            sheetmanage.deleteSheet(ctr.index);\r\n            sheetmanage.changeSheetExec(ctr.currentSheetIndex);\r\n            $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n            $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n        }\r\n        else if (ctr.type == \"copySheet\") {\r\n            sheetmanage.deleteSheet(ctr.index);\r\n            sheetmanage.changeSheetExec(ctr.copyindex);\r\n        }\r\n        else if (ctr.type == \"deleteSheet\") {\r\n            let isDupName = false;\r\n\r\n            for(let i = 0; i < Store.luckysheetfile.length; i++){\r\n                if(Store.luckysheetfile[i].name == ctr.name){\r\n                    isDupName = true;\r\n                }\r\n            }\r\n\r\n            if(!isDupName){\r\n                sheetmanage.createSheetbydata(ctr, \"isrenew\");\r\n                $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n                $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n            }\r\n        }\r\n        else if (ctr.type == \"sheetName\") {\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].name = ctr.oldtxt;\r\n            $(\"#luckysheet-sheets-item\" + ctr.sheetIndex).find(\".luckysheet-sheets-item-name\").html(ctr.oldtxt);\r\n\r\n            server.saveParam(\"all\", ctr.sheetIndex, ctr.oldtxt, { \"k\": \"name\" });\r\n        }\r\n        else if (ctr.type == \"sheetColor\") {\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].color = ctr.oldcolor;\r\n            \r\n            let luckysheetcurrentSheetitem = $(\"#luckysheet-sheets-item\" + ctr.sheetIndex);\r\n            luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").remove();\r\n\r\n            if(ctr.oldcolor != null){\r\n                luckysheetcurrentSheetitem.append('<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + ctr.oldcolor + ';\"></div>');\r\n            }\r\n\r\n            server.saveParam(\"all\", ctr.sheetIndex, ctr.oldcolor, { \"k\": \"color\" });\r\n        }\r\n        else if (ctr.type == \"mergeChange\") {\r\n            let allParam = {\r\n                \"cfg\": ctr.config,\r\n                calc: ctr.calc,\r\n                hyperlink: ctr.hyperlink,\r\n            }\r\n\r\n            jfrefreshgrid(ctr.data, ctr.range, allParam);\r\n        }\r\n        else if (ctr.type == \"updateDataVerification\"){\r\n            dataVerificationCtrl.ref(ctr.currentDataVerification, ctr.historyDataVerification, ctr.sheetIndex);\r\n        }\r\n        else if (ctr.type == \"updateDataVerificationOfCheckbox\"){\r\n            dataVerificationCtrl.refOfCheckbox(ctr.currentDataVerification, ctr.historyDataVerification, ctr.sheetIndex, ctr.data, ctr.range);\r\n        }\r\n        else if (ctr.type == \"updateHyperlink\"){\r\n            hyperlinkCtrl.ref(ctr.currentHyperlink, ctr.historyHyperlink, ctr.sheetIndex, ctr.data, ctr.range);\r\n        }\r\n        else if (ctr.type == \"updateCF\"){\r\n            let historyRules = ctr[\"data\"][\"historyRules\"];\r\n\r\n            for(let i = 0; i < historyRules.length; i++){\r\n                //条件规则\r\n                let sheetIndex = historyRules[i][\"sheetIndex\"];\r\n                Store.luckysheetfile[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"] = historyRules[i][\"luckysheet_conditionformat_save\"];\r\n            \r\n                if(server.allowUpdate){\r\n                    server.saveParam(\"all\", sheetIndex, historyRules[i][\"luckysheet_conditionformat_save\"], { \"k\": \"luckysheet_conditionformat_save\" });\r\n                }\r\n            }\r\n\r\n            //刷新一次表格\r\n            conditionformat.ref();\r\n        }\r\n        else if (ctr.type == \"updateAF\"){\r\n            let historyRules = ctr[\"data\"][\"historyRules\"];\r\n\r\n            let index = getSheetIndex(ctr[\"sheetIndex\"]);\r\n\r\n            Store.luckysheetfile[index][\"luckysheet_alternateformat_save\"] = $.extend(true, [], historyRules);\r\n\r\n            setTimeout(function () {\r\n                luckysheetrefreshgrid();\r\n            }, 1);\r\n        }\r\n        else if (ctr.type == \"borderChange\"){\r\n            if(ctr.config[\"borderInfo\"] == null){\r\n                server.saveParam(\"cg\", ctr.sheetIndex, [], { \"k\": \"borderInfo\" });\r\n            }\r\n            else{\r\n                server.saveParam(\"cg\", ctr.sheetIndex, ctr.config[\"borderInfo\"], { \"k\": \"borderInfo\" });\r\n            }\r\n\r\n            Store.config = ctr.config;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = Store.config;\r\n\r\n            setTimeout(function () {\r\n                luckysheetrefreshgrid();\r\n            }, 1);\r\n        }\r\n        else if (ctr.type == \"postil\"){\r\n            luckysheetPostil.ref(ctr.data, ctr.rc);\r\n\r\n            for(let i = 0; i < ctr.rc.length; i++){\r\n                let r = ctr.rc[i].split(\"_\")[0];\r\n                let c = ctr.rc[i].split(\"_\")[1];\r\n\r\n                if(ctr.data[r][c] != null && ctr.data[r][c].ps != null){\r\n                    luckysheetPostil.buildPs(r, c, ctr.data[r][c].ps);\r\n                }\r\n                else{\r\n                    luckysheetPostil.buildPs(r, c, null);\r\n                }\r\n            }\r\n        }\r\n        else if (ctr.type == \"imageCtrl\"){\r\n            imageCtrl.images = $.extend(true, {}, ctr.images);\r\n            imageCtrl.allImagesShow();\r\n            imageCtrl.ref();\r\n        }\r\n        else if (ctr.type==\"zoomChange\"){\r\n            Store.zoomRatio = ctr.zoomRatio;\r\n            server.saveParam(\"all\", ctr.sheetIndex, ctr.zoomRatio, { \"k\": \"zoomRatio\" });\r\n            zoomNumberDomBind();\r\n            zoomRefreshView();\r\n        }\r\n        \r\n        cleargridelement(e);\r\n        if (ctr.range) {\r\n            //使用深复制\r\n            Store.luckysheet_select_save = $.extend(true, [],ctr.range);\r\n            selectHightlightShow();\r\n        }\r\n        Store.clearjfundo = true;\r\n\r\n        // 撤销的时候curdata 跟 data 数据要调换一下\r\n        let newCtr = {...ctr, ...{data: ctr.curdata, curdata: ctr.data}}\r\n        // 钩子函数\r\n        method.createHookFunction('updated', newCtr)\r\n        \r\n    },\r\n    undo: function () {\r\n        if (Store.jfundo.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let ctr = Store.jfundo.pop();\r\n        Store.jfredo.push(ctr);\r\n        Store.clearjfundo = false;\r\n\r\n        if (sheetmanage.hasSheet(ctr.sheetIndex) && Store.currentSheetIndex != ctr.sheetIndex) {\r\n            sheetmanage.changeSheetExec(ctr.sheetIndex);\r\n        }\r\n\r\n        if (ctr.type == \"datachange\") {\r\n            formula.execFunctionGroup();\r\n\r\n            let allParam = {\r\n                \"cfg\": ctr.curConfig,\r\n                \"RowlChange\": ctr.RowlChange,\r\n                \"cdformat\": ctr.curCdformat,\r\n                \"dataVerification\": ctr.curDataVerification,\r\n                \"dynamicArray\": ctr.curDynamicArray,\r\n                \"hyperlink\": ctr.curHyperlink,\r\n            }\r\n\r\n            formulaHistoryHanddler(ctr, \"undo\");\r\n\r\n            //防止协同编辑时选区错误\r\n            server.saveParam(\"mv\", Store.currentSheetIndex, ctr.range);\r\n            jfrefreshgrid(ctr.curdata, ctr.range, allParam);\r\n        }\r\n        else if (ctr.type == \"pasteCut\") {\r\n            jfrefreshgrid_pastcut(ctr.source, ctr.target, ctr.RowlChange);\r\n        }\r\n        else if (ctr.type == \"rangechange\") {\r\n            // formula.execFunctionGroup();\r\n            formulaHistoryHanddler(ctr, \"undo\");\r\n            jfrefreshrange(ctr.curdata, ctr.range, ctr.curCdformat);\r\n        }\r\n        else if (ctr.type == \"resize\") {\r\n            Store.config = ctr.curconfig;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = Store.config;\r\n\r\n            if(ctr.ctrlType == \"resizeR\"){\r\n                server.saveParam(\"cg\", ctr.sheetIndex, ctr.curconfig[\"rowlen\"], { \"k\": \"rowlen\" });\r\n            }\r\n            else if(ctr.ctrlType == \"resizeC\"){\r\n                server.saveParam(\"cg\", ctr.sheetIndex, ctr.curconfig[\"columnlen\"], { \"k\": \"columnlen\" });\r\n            }\r\n\r\n            let images = $.extend(true, {}, ctr.curImages);\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].images = images;\r\n            server.saveParam(\"all\", ctr.sheetIndex, images, { \"k\": \"images\" });\r\n            imageCtrl.images = images;\r\n            imageCtrl.allImagesShow();\r\n\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        else if (ctr.type == \"cellRowChange\") {\r\n            jfrefreshgridall(ctr.curdata[0].length, ctr.curdata.length, ctr.curdata, ctr.curconfig, ctr.currange, ctr.ctrlType, ctr.ctrlValue, ctr.curCdformat);\r\n        }\r\n        else if (ctr.type == \"extend\") {\r\n            jfrefreshgridall(ctr.curdata[0].length, ctr.curdata.length, ctr.curdata, ctr.curconfig, ctr.currange, ctr.ctrlType, ctr.ctrlValue);\r\n        }\r\n        else if (ctr.type == \"dele\") {\r\n            let ctrlValue1 = $.extend(true, {}, ctr.ctrlValue);\r\n            ctrlValue1.restore = true;\r\n            jfrefreshgridall(ctr.curdata[0].length, ctr.curdata.length, ctr.curdata, ctr.curconfig, ctr.currange, ctr.ctrlType, ctr.ctrlValue);\r\n        }\r\n        else if (ctr.type == \"addRC\") { //增加行列重做操作\r\n            jfrefreshgrid_adRC(\r\n                ctr.curData, \r\n                ctr.curConfig, \r\n                \"addRC\", \r\n                ctr.ctrlValue, \r\n                ctr.curCalc, \r\n                ctr.curFilterObj, \r\n                ctr.curCf, \r\n                ctr.curAf, \r\n                ctr.curFreezen,\r\n                ctr.curDataVerification,\r\n                ctr.curHyperlink\r\n            );\r\n        }\r\n        else if (ctr.type == \"delRC\") { //删除行列重做操作\r\n            jfrefreshgrid_adRC(\r\n                ctr.curData, \r\n                ctr.curConfig, \r\n                \"delRC\", \r\n                ctr.ctrlValue, \r\n                ctr.curCalc, \r\n                ctr.curFilterObj, \r\n                ctr.curCf, \r\n                ctr.curAf, \r\n                ctr.curFreezen,\r\n                ctr.curDataVerification,\r\n                ctr.curHyperlink\r\n            );\r\n        }\r\n        else if (ctr.type == \"deleteCell\") { //删除单元格重做操作\r\n            jfrefreshgrid_deleteCell(\r\n                ctr.curData, \r\n                ctr.curConfig, \r\n                ctr.ctrl, \r\n                ctr.curCalc, \r\n                ctr.curFilterObj, \r\n                ctr.curCf,\r\n                ctr.curDataVerification,\r\n                ctr.curHyperlink\r\n            );\r\n        }\r\n        else if (ctr.type == \"showHidRows\") { // 隐藏、显示行 重做操作\r\n            //config\r\n            Store.config = ctr.curconfig;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.curconfig;\r\n        \r\n            server.saveParam(\"cg\", ctr.sheetIndex, ctr.curconfig[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n        \r\n            //行高、列宽 刷新  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        else if (ctr.type == \"showHidCols\") { // 隐藏、显示列 重做操作\r\n            //config\r\n            Store.config = ctr.curconfig;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.curconfig;\r\n        \r\n            server.saveParam(\"cg\", ctr.sheetIndex, ctr.curconfig[\"colhidden\"], { \"k\": \"colhidden\" });\r\n        \r\n            //行高、列宽 刷新  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        else if (ctr.type == \"datachangeAll\") {\r\n            formula.execFunctionGroup();\r\n            jfrefreshgridall(ctr.curdata[0].length, ctr.curdata.length, ctr.curdata, null, ctr.currange, \"datachangeAll\", ctr.ctrlValue);\r\n        }\r\n        else if (ctr.type == \"datachangeAll_filter_clear\") {\r\n            server.saveParam(\"fsc\", Store.currentSheetIndex, null);\r\n            \r\n            //config\r\n            Store.config = ctr.curconfig;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, {}, { \"k\": \"rowhidden\" });\r\n\r\n            //行高、列宽 刷新  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n            \r\n\r\n            $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").hide().find(\"input\").val();\r\n            $(\"#luckysheet-filter-selected span\").data(\"type\", \"0\").data(\"type\", null).text(\"无\");\r\n\r\n            $('#luckysheet-filter-selected-sheet' + Store.currentSheetIndex + ', #luckysheet-filter-options-sheet' + Store.currentSheetIndex).remove();\r\n            $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        }\r\n        else if (ctr.type == \"datachangeAll_filter\") {\r\n            let $top = $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").eq(ctr[\"optionsindex\"]);\r\n            let st_r = $top.data(\"str\"), \r\n                ed_r = $top.data(\"edr\"), \r\n                cindex = $top.data(\"cindex\"), \r\n                st_c = $top.data(\"stc\"), \r\n                ed_c = $top.data(\"edc\");\r\n\r\n            labelFilterOptionState($top, json.hasKey(ctr.rowhidden), ctr.rowhidden, ctr.caljs, true, st_r, ed_r, cindex, st_c, ed_c);\r\n\r\n            //config\r\n            Store.config = ctr.curconfig;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, Store.config[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n\r\n            //行高、列宽 刷新  \r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n\r\n            $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        }\r\n        else if (ctr.type == \"filtershow\") {\r\n            Store.luckysheet_select_save = [ctr.filter_save];\r\n            Store.filterchage = false;\r\n            createFilter();\r\n            Store.filterchage = true;\r\n            server.saveParam(\"all\", ctr.sheetIndex, ctr.filter_save, { \"k\": \"filter_select\" });\r\n        }\r\n        else if (ctr.type == \"pivotTable_change\") {\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].pivotTable = ctr.pivotTablecur;\r\n            pivotTable.getCellData(ctr.sheetIndex);\r\n            pivotTable.initialPivotManage(true);\r\n            pivotTable.refreshPivotTable();\r\n        }\r\n        else if (ctr.type == \"addSheet\") {\r\n            sheetmanage.createSheetbydata(ctr.sheetconfig);\r\n            $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n            $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n        }\r\n        else if (ctr.type == \"copySheet\") {\r\n            sheetmanage.copySheet(ctr.copyindex);\r\n        }\r\n        else if (ctr.type == \"deleteSheet\") {\r\n            sheetmanage.deleteSheet(ctr.index);\r\n\r\n            if (ctr.order == 0) {\r\n                sheetmanage.changeSheetExec(Store.luckysheetfile[0].index);\r\n            }\r\n            else {\r\n                sheetmanage.changeSheetExec(Store.luckysheetfile[ctr.order - 1].index);\r\n            }\r\n            \r\n            $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n            $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n        }\r\n        else if (ctr.type == \"sheetName\") {\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].name = ctr.txt;\r\n            $(\"#luckysheet-sheets-item\" + ctr.sheetIndex).find(\".luckysheet-sheets-item-name\").html(ctr.txt);\r\n            \r\n            server.saveParam(\"all\", ctr.sheetIndex, ctr.txt, { \"k\": \"name\" });\r\n        }\r\n        else if (ctr.type == \"sheetColor\") {\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].color = ctr.color;\r\n\r\n            let luckysheetcurrentSheetitem = $(\"#luckysheet-sheets-item\" + ctr.sheetIndex);\r\n            luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").remove();\r\n            \r\n            if(ctr.color != null){\r\n                luckysheetcurrentSheetitem.append('<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + ctr.color + ';\"></div>');\r\n            }\r\n            \r\n            server.saveParam(\"all\", ctr.sheetIndex, ctr.color, { \"k\": \"color\" });\r\n        }\r\n        else if (ctr.type == \"mergeChange\") {\r\n            let allParam = {\r\n                \"cfg\": ctr.curConfig,\r\n                calc: ctr.curCalc,\r\n                hyperlink: ctr.curHyperlink,\r\n            }\r\n\r\n            jfrefreshgrid(ctr.curData, ctr.range, allParam);\r\n        }\r\n        else if (ctr.type == \"updateDataVerification\"){\r\n            dataVerificationCtrl.ref(ctr.historyDataVerification, ctr.currentDataVerification, ctr.sheetIndex);\r\n        }\r\n        else if (ctr.type == \"updateDataVerificationOfCheckbox\"){\r\n            dataVerificationCtrl.refOfCheckbox(ctr.historyDataVerification, ctr.currentDataVerification, ctr.sheetIndex, ctr.curData, ctr.range);\r\n        }\r\n        else if (ctr.type == \"updateHyperlink\") {\r\n            hyperlinkCtrl.ref(ctr.historyHyperlink, ctr.currentHyperlink, ctr.sheetIndex, ctr.curData, ctr.range);\r\n        }\r\n        else if (ctr.type == \"updateCF\"){\r\n            let currentRules = ctr[\"data\"][\"currentRules\"];\r\n\r\n            for(let i = 0; i < currentRules.length; i++){\r\n                //条件规则\r\n                let sheetIndex = currentRules[i][\"sheetIndex\"];\r\n                Store.luckysheetfile[getSheetIndex(sheetIndex)][\"luckysheet_conditionformat_save\"] = currentRules[i][\"luckysheet_conditionformat_save\"];\r\n                \r\n                if(server.allowUpdate){\r\n                    server.saveParam(\"all\", sheetIndex, currentRules[i][\"luckysheet_conditionformat_save\"], { \"k\": \"luckysheet_conditionformat_save\" });\r\n                }\r\n            }\r\n\r\n            //刷新一次表格\r\n            conditionformat.ref();\r\n        }\r\n        else if (ctr.type == \"updateAF\"){\r\n            let currentRules = ctr[\"data\"][\"currentRules\"];\r\n\r\n            let index = getSheetIndex(ctr[\"sheetIndex\"]);\r\n\r\n            Store.luckysheetfile[index][\"luckysheet_alternateformat_save\"] = $.extend(true, [], currentRules);\r\n\r\n            setTimeout(function () {\r\n                luckysheetrefreshgrid();\r\n            }, 1);\r\n        }\r\n        else if (ctr.type == \"borderChange\"){\r\n            server.saveParam(\"cg\", ctr.sheetIndex, ctr.curconfig[\"borderInfo\"], { \"k\": \"borderInfo\" });\r\n\r\n            Store.config = ctr.curconfig;\r\n            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = Store.config;\r\n\r\n            setTimeout(function () {\r\n                luckysheetrefreshgrid();\r\n            }, 1);\r\n        }\r\n        else if (ctr.type == \"postil\"){\r\n            luckysheetPostil.ref(ctr.curdata, ctr.rc);\r\n\r\n            for(let i = 0; i < ctr.rc.length; i++){\r\n                let r = ctr.rc[i].split(\"_\")[0];\r\n                let c = ctr.rc[i].split(\"_\")[1];\r\n\r\n                if(ctr.curdata[r][c] != null && ctr.curdata[r][c].ps != null){\r\n                    luckysheetPostil.buildPs(r, c, ctr.curdata[r][c].ps);\r\n                }\r\n                else{\r\n                    luckysheetPostil.buildPs(r, c, null);\r\n                }\r\n            }\r\n        }\r\n        else if (ctr.type == \"imageCtrl\"){\r\n            imageCtrl.images = $.extend(true, {}, ctr.curImages);\r\n            imageCtrl.allImagesShow();\r\n            imageCtrl.ref();\r\n        }\r\n        else if (ctr.type==\"zoomChange\"){\r\n            Store.zoomRatio = ctr.curZoomRatio;\r\n            server.saveParam(\"all\", ctr.sheetIndex, ctr.curZoomRatio, { \"k\": \"zoomRatio\" });\r\n            zoomNumberDomBind();\r\n            zoomRefreshView();\r\n        }\r\n\r\n        if (ctr.range) {\r\n            //使用深复制\r\n            Store.luckysheet_select_save = $.extend(true, [],ctr.range);\r\n            selectHightlightShow();\r\n        }\r\n        Store.clearjfundo = true;\r\n\r\n    }\r\n};\r\n\r\nexport default controlHistory;"
  },
  {
    "path": "src/controllers/dataVerificationCtrl.js",
    "content": "import { replaceHtml } from '../utils/util';\r\nimport formula from '../global/formula';\r\nimport { isRealNum, isRealNull } from '../global/validate';\r\nimport { isdatetime, diff } from '../global/datecontroll';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport tooltip from '../global/tooltip';\r\nimport { setcellvalue } from '../global/setdata';\r\nimport { getcellvalue } from '../global/getdata';\r\nimport editor from '../global/editor';\r\nimport { modelHTML } from './constant';\r\nimport { selectionCopyShow } from './select';\r\nimport server from './server';\r\nimport menuButton from './menuButton';\r\nimport sheetmanage from './sheetmanage';\r\nimport { getSheetIndex, getRangetxt } from '../methods/get';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\n\r\nconst dataVerificationCtrl = {\r\n    defaultItem: {\r\n        type: 'dropdown',  //类型\r\n        type2: null,  //\r\n        value1: '',  //\r\n        value2: '',  //\r\n        checked: false,\r\n        remote: false,  //自动远程获取选项\r\n        prohibitInput: false,  //输入数据无效时禁止输入\r\n        hintShow: false,  //选中单元格时显示提示语\r\n        hintText: '',  //\r\n    },\r\n    curItem: null,\r\n    dataVerification: null,\r\n    selectRange: [],\r\n    selectStatus: false,\r\n    optionLabel: {\r\n        'number': '数值',\r\n        'number_integer': '整数',\r\n        'number_decimal': '小数',\r\n        'bw': '介于',\r\n        'nb': '不介于',\r\n        'eq': '等于',\r\n        'ne': '不等于',\r\n        'gt': '大于',\r\n        'lt': '小于',\r\n        'gte': '大于等于',\r\n        'lte': '小于等于',\r\n        'include': '包括',\r\n        'exclude': '不包括',\r\n        'equal': '等于',\r\n        'bf': '早于',\r\n        'nbf': '不早于',\r\n        'af': '晚于',\r\n        'naf': '不晚于',\r\n        'card': '身份证号码',\r\n        'phone': '手机号'\r\n    },\r\n    optionLabel_en: {\r\n        'number': 'numeric',\r\n        'number_integer': 'integer',\r\n        'number_decimal': 'decimal',\r\n        'bw': 'between',\r\n        'nb': 'not between',\r\n        'eq': 'equal to',\r\n        'ne': 'not equal to',\r\n        'gt': 'greater',\r\n        'lt': 'less than',\r\n        'gte': 'greater or equal to',\r\n        'lte': 'less than or equal to',\r\n        'include': 'include',\r\n        'exclude': 'not include',\r\n        'equal': 'equal to',\r\n        'bf': 'earlier than',\r\n        'nbf': 'not earlier than',\r\n        'af': 'later than',\r\n        'naf': 'not later than',\r\n        'card': 'identification number',\r\n        'phone': 'phone number'\r\n    },\r\n    createDialog: function(){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const dvText = _locale.dataVerification;\r\n        const toolbarText = _locale.toolbar;\r\n        const buttonText = _locale.button;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-dataVerification-dialog\").remove();\r\n\r\n        let content =  `<div class=\"box\">\r\n                            <div class=\"box-item\" style=\"border-top:1px solid #E1E4E8;\">\r\n                                <div class=\"box-item-title\">${dvText.cellRange}</div>\r\n                                <div id=\"data-verification-range\" class=\"range\">\r\n                                    <input class=\"formulaInputFocus\" spellcheck=\"false\">\r\n                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${dvText.selectCellRange}\"></i>\r\n                                </div>\r\n                            </div>\r\n                            <div class=\"box-item\">\r\n                                <div class=\"box-item-title\">${dvText.verificationCondition}</div>\r\n                                <select id=\"data-verification-type-select\">\r\n                                    <option value=\"dropdown\">${dvText.dropdown}</option>\r\n                                    <option value=\"checkbox\">${dvText.checkbox}</option>\r\n                                    <option value=\"number\">${dvText.number}</option>\r\n                                    <option value=\"number_integer\">${dvText.number_integer}</option>\r\n                                    <option value=\"number_decimal\">${dvText.number_decimal}</option>\r\n                                    <option value=\"text_content\">${dvText.text_content}</option>\r\n                                    <option value=\"text_length\">${dvText.text_length}</option>\r\n                                    <option value=\"date\">${dvText.date}</option>\r\n                                    <option value=\"validity\">${dvText.validity}</option>\r\n                                </select>\r\n                                <div class=\"show-box\">\r\n                                    <div class=\"show-box-item show-box-item-dropdown\">\r\n                                        <div class=\"range\">\r\n                                            <input class=\"formulaInputFocus data-verification-value1\" placeholder=\"${dvText.placeholder1}\" spellcheck=\"false\">\r\n                                            <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${dvText.selectCellRange}\"></i>\r\n                                        </div>\r\n                                        <div class=\"multi\">\r\n                                            <input type=\"checkbox\" id=\"data-verification-multi\" class=\"data-verification-multi\">\r\n                                            <label for=\"data-verification-multi\">${dvText.allowMultiSelect}</label>\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"show-box-item show-box-item-checkbox\">\r\n                                        <div class=\"check-box\">\r\n                                            <span>${dvText.selected} ——</span>\r\n                                            <input type=\"text\" class=\"data-verification-value1\" placeholder=\"${dvText.placeholder2}\">\r\n                                        </div>\r\n                                        <div class=\"check-box\">\r\n                                            <span>${dvText.notSelected} ——</span>\r\n                                            <input type=\"text\" class=\"data-verification-value2\" placeholder=\"${dvText.placeholder2}\">\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"show-box-item show-box-item-number\">\r\n                                        <select id=\"data-verification-number-select\">\r\n                                            <option value=\"bw\">${dvText.between}</option>\r\n                                            <option value=\"nb\">${dvText.notBetween}</option>\r\n                                            <option value=\"eq\">${dvText.equal}</option>\r\n                                            <option value=\"ne\">${dvText.notEqualTo}</option>\r\n                                            <option value=\"gt\">${dvText.moreThanThe}</option>\r\n                                            <option value=\"lt\">${dvText.lessThan}</option>\r\n                                            <option value=\"gte\">${dvText.greaterOrEqualTo}</option>\r\n                                            <option value=\"lte\">${dvText.lessThanOrEqualTo}</option>\r\n                                        </select>\r\n                                        <div class=\"input input1\">\r\n                                            <input type=\"number\" class=\"data-verification-value1\" placeholder=\"1\">\r\n                                            <span>-</span>\r\n                                            <input type=\"number\" class=\"data-verification-value2\" placeholder=\"100\">\r\n                                        </div>\r\n                                        <div class=\"input input2\">\r\n                                            <input type=\"number\" class=\"data-verification-value1\" placeholder=\"${dvText.placeholder3}\">\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"show-box-item show-box-item-text\">\r\n                                        <select id=\"data-verification-text-select\">\r\n                                            <option value=\"include\">${dvText.include}</option>\r\n                                            <option value=\"exclude\">${dvText.exclude}</option>\r\n                                            <option value=\"equal\">${dvText.equal}</option>\r\n                                        </select>\r\n                                        <div class=\"input input2\">\r\n                                            <input type=\"text\" class=\"data-verification-value1\" placeholder=\"${dvText.placeholder4}\"/>\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"show-box-item show-box-item-textLength\">\r\n                                        <select id=\"data-verification-textLength-select\">\r\n                                            <option value=\"bw\">${dvText.between}</option>\r\n                                            <option value=\"nb\">${dvText.notBetween}</option>\r\n                                            <option value=\"eq\">${dvText.equal}</option>\r\n                                            <option value=\"ne\">${dvText.notEqualTo}</option>\r\n                                            <option value=\"gt\">${dvText.moreThanThe}</option>\r\n                                            <option value=\"lt\">${dvText.lessThan}</option>\r\n                                            <option value=\"gte\">${dvText.greaterOrEqualTo}</option>\r\n                                            <option value=\"lte\">${dvText.lessThanOrEqualTo}</option>\r\n                                        </select>\r\n                                        <div class=\"input input1\">\r\n                                            <input type=\"number\" class=\"data-verification-value1\" placeholder=\"1\">\r\n                                            <span>-</span>\r\n                                            <input type=\"number\" class=\"data-verification-value2\" placeholder=\"100\">\r\n                                        </div>\r\n                                        <div class=\"input input2\">\r\n                                            <input type=\"number\" class=\"data-verification-value1\" placeholder=\"${dvText.placeholder3}\">\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"show-box-item show-box-item-date\">\r\n                                        <select id=\"data-verification-date-select\">\r\n                                            <option value=\"bw\">${dvText.between}</option>\r\n                                            <option value=\"nb\">${dvText.notBetween}</option>\r\n                                            <option value=\"eq\">${dvText.equal}</option>\r\n                                            <option value=\"ne\">${dvText.notEqualTo}</option>\r\n                                            <option value=\"bf\">${dvText.earlierThan}</option>\r\n                                            <option value=\"nbf\">${dvText.noEarlierThan}</option>\r\n                                            <option value=\"af\">${dvText.laterThan}</option>\r\n                                            <option value=\"naf\">${dvText.noLaterThan}</option>\r\n                                        </select>\r\n                                        <div class=\"input input1\">\r\n                                            <input type=\"date\" class=\"data-verification-value1\" placeholder=\"2020/9/10\">\r\n                                            <span>-</span>\r\n                                            <input type=\"date\" class=\"data-verification-value2\" placeholder=\"2020/9/10\">\r\n                                        </div>\r\n                                        <div class=\"input input2\">\r\n                                            <input type=\"date\" class=\"data-verification-value1\" placeholder=\"2020/9/10\">\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"show-box-item show-box-item-validity\">\r\n                                        <select id=\"data-verification-validity-select\">\r\n                                            <option value=\"card\">${dvText.identificationNumber}</option>\r\n                                            <option value=\"phone\">${dvText.phoneNumber}</option>\r\n                                        </select>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                            <div class=\"box-item\">\r\n                                <div class=\"check\">\r\n                                    <input type=\"checkbox\" id=\"data-verification-remote\" class=\"data-verification-remote\">\r\n                                    <label for=\"data-verification-remote\">${dvText.remote}</label>\r\n                                </div>\r\n                                <div class=\"check\">\r\n                                    <input type=\"checkbox\" id=\"data-verification-prohibitInput\">\r\n                                    <label for=\"data-verification-prohibitInput\">${dvText.prohibitInput}</label>\r\n                                </div>\r\n                                <div class=\"check\">\r\n                                    <input type=\"checkbox\" id=\"data-verification-hint-show\">\r\n                                    <label for=\"data-verification-hint-show\">${dvText.hintShow}</label>\r\n                                </div>\r\n                                <div class=\"data-verification-hint-text\">\r\n                                    <input type=\"text\" placeholder=\"${dvText.placeholder5}\">\r\n                                </div>\r\n                            </div>\r\n                        </div>`;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-dataVerification-dialog\", \r\n            \"addclass\": \"luckysheet-dataVerification-dialog\", \r\n            \"title\": toolbarText.dataVerification, \r\n            \"content\": content, \r\n            \"botton\":  `<button id=\"luckysheet-dataVerification-dialog-confirm\" class=\"btn btn-primary\">${buttonText.confirm}</button>\r\n                        <button id=\"luckysheet-dataVerification-dialog-delete\" class=\"btn btn-default\">${dvText.deleteVerification}</button>\r\n                        <button class=\"btn btn-default luckysheet-model-close-btn\">${buttonText.cancel}</button>`, \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-dataVerification-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 350).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), \r\n            winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), \r\n            scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-dataVerification-dialog\").css({ \r\n            \"left\": (winw + scrollLeft - myw) / 2, \r\n            \"top\": (winh + scrollTop - myh) / 3 \r\n        }).show();\r\n\r\n        _this.dataAllocation();\r\n    },\r\n    init: function(){\r\n        let _this = this;\r\n\r\n        const dvText = locale().dataVerification; \r\n\r\n        //单元格数据验证 类型是 下拉列表\r\n        $(document).off(\"click.dropdownBtn\").on(\"click.dropdownBtn\", \"#luckysheet-dataVerification-dropdown-btn\", function(e) {\r\n            _this.dropdownListShow();\r\n            e.stopPropagation();\r\n        });\r\n        $(document).off(\"click.dropdownListItem\").on(\"click.dropdownListItem\", \"#luckysheet-dataVerification-dropdown-List .dropdown-List-item\", function(e) {\r\n            var $item = $(this);\r\n            let value = e.target.innerText;\r\n            if ($item.hasClass('multi')) {\r\n                $item.toggleClass('checked');\r\n                value = $.map($(\"#luckysheet-dataVerification-dropdown-List\").children().filter('.checked'), function(el) {\r\n                    return el.innerText;\r\n                }).join(',');\r\n            } else {\r\n                $(\"#luckysheet-dataVerification-dropdown-List\").hide();\r\n            }\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n            let rowIndex = last.row_focus;\r\n            let colIndex = last.column_focus;\r\n\r\n            $(\"#luckysheet-rich-text-editor\").text(value);\r\n            formula.updatecell(rowIndex, colIndex);\r\n\r\n            e.stopPropagation();\r\n        });\r\n\r\n        //单元格范围\r\n        $(document).off(\"click.dvRange\").on(\"click.dvRange\", \"#data-verification-range .fa-table\", function(e) {\r\n            $(\"#luckysheet-dataVerification-dialog\").hide();\r\n\r\n            let dataSource = \"0\";\r\n            let txt = $(this).siblings(\"input\").val().trim(); \r\n\r\n            _this.rangeDialog(dataSource, txt);\r\n\r\n            _this.selectRange = [];\r\n\r\n            let range = _this.getRangeByTxt(txt);\r\n\r\n            formula.rangetosheet = Store.currentSheetIndex;\r\n\r\n            if(range[0].sheetIndex != Store.currentSheetIndex){\r\n                sheetmanage.changeSheetExec(range[0].sheetIndex);\r\n            }\r\n\r\n            if(range.length > 0){\r\n                for(let s = 0; s < range.length; s++){\r\n                    let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                    let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                    let row = Store.visibledatarow[r2], \r\n                        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                    let col = Store.visibledatacolumn[c2], \r\n                        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                    _this.selectRange.push({ \r\n                        \"left\": col_pre, \r\n                        \"width\": col - col_pre - 1, \r\n                        \"top\": row_pre, \r\n                        \"height\": row - row_pre - 1, \r\n                        \"left_move\": col_pre, \r\n                        \"width_move\": col - col_pre - 1, \r\n                        \"top_move\": row_pre, \r\n                        \"height_move\": row - row_pre - 1, \r\n                        \"row\": [r1, r2], \r\n                        \"column\": [c1, c2], \r\n                        \"row_focus\": r1, \r\n                        \"column_focus\": c1 \r\n                    });\r\n                }\r\n            }\r\n            \r\n            selectionCopyShow(_this.selectRange);\r\n        }); \r\n        $(document).off(\"click.dvRange2\").on(\"click.dvRange2\", \"#luckysheet-dataVerification-dialog .show-box-item-dropdown .range .fa-table\", function(e) {\r\n            $(\"#luckysheet-dataVerification-dialog\").hide();\r\n\r\n            let dataSource = \"1\";\r\n            let txt = $(this).siblings(\"input\").val().trim(); \r\n\r\n            _this.rangeDialog(dataSource, txt);\r\n\r\n            _this.selectRange = [];\r\n\r\n            let range = _this.getRangeByTxt(txt);\r\n\r\n            formula.rangetosheet = Store.currentSheetIndex;\r\n\r\n            if(range[0].sheetIndex != Store.currentSheetIndex){\r\n                sheetmanage.changeSheetExec(range[0].sheetIndex);\r\n            }\r\n\r\n            if(range.length > 0){\r\n                for(let s = 0; s < range.length; s++){\r\n                    let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                    let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                    let row = Store.visibledatarow[r2], \r\n                        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                    let col = Store.visibledatacolumn[c2], \r\n                        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                    _this.selectRange.push({ \r\n                        \"left\": col_pre, \r\n                        \"width\": col - col_pre - 1, \r\n                        \"top\": row_pre, \r\n                        \"height\": row - row_pre - 1, \r\n                        \"left_move\": col_pre, \r\n                        \"width_move\": col - col_pre - 1, \r\n                        \"top_move\": row_pre, \r\n                        \"height_move\": row - row_pre - 1, \r\n                        \"row\": [r1, r2], \r\n                        \"column\": [c1, c2], \r\n                        \"row_focus\": r1, \r\n                        \"column_focus\": c1 \r\n                    });\r\n                }\r\n            }\r\n            \r\n            selectionCopyShow(_this.selectRange);\r\n        });\r\n        $(document).off(\"click.dvRangeConfirm\").on(\"click.dvRangeConfirm\", \"#luckysheet-dataVerificationRange-dialog-confirm\", function(e) {\r\n            let dataSource = $(this).attr(\"data-source\");\r\n            let txt = $(this).parents(\"#luckysheet-dataVerificationRange-dialog\").find(\"input\").val();\r\n\r\n            if(_this.getRangeByTxt(txt).length > 1){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', '不能对多重选择区域执行此操作，请选择单个区域，然后再试');\r\n                return;\r\n            }\r\n\r\n            if(dataSource == '0'){\r\n                $(\"#luckysheet-dataVerification-dialog #data-verification-range input\").val(txt);\r\n            }\r\n            else if(dataSource == '1'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-dropdown .range input\").val(txt);\r\n            }\r\n            \r\n            $(\"#luckysheet-dataVerificationRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-dataVerification-dialog\").show();\r\n\r\n            if(formula.rangetosheet != null && formula.rangetosheet != Store.currentSheetIndex){\r\n                sheetmanage.changeSheetExec(formula.rangetosheet);\r\n                formula.rangetosheet = null;\r\n            }\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        });\r\n        $(document).off(\"click.dvRangeClose\").on(\"click.dvRangeClose\", \"#luckysheet-dataVerificationRange-dialog-close\", function(e) {\r\n            $(\"#luckysheet-dataVerificationRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-dataVerification-dialog\").show();\r\n\r\n            if(formula.rangetosheet != null && formula.rangetosheet != Store.currentSheetIndex){\r\n                sheetmanage.changeSheetExec(formula.rangetosheet);\r\n                formula.rangetosheet = null;\r\n            }\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        });\r\n        $(document).on(\"click\", \"#luckysheet-dataVerificationRange-dialog .luckysheet-modal-dialog-title-close\", function(e) {\r\n            $(\"#luckysheet-dataVerificationRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-dataVerification-dialog\").show();\r\n\r\n            if(formula.rangetosheet != null && formula.rangetosheet != Store.currentSheetIndex){\r\n                sheetmanage.changeSheetExec(formula.rangetosheet);\r\n                formula.rangetosheet = null;\r\n            }\r\n\r\n            let range = [];\r\n            selectionCopyShow(range);\r\n        })\r\n\r\n        //验证条件 下拉框\r\n        $(document).off(\"change.typeSelect\").on(\"change.typeSelect\", \"#data-verification-type-select\", function(e) {\r\n            $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item\").hide();\r\n\r\n            let value = this.value;\r\n            let item = _this.curItem;\r\n\r\n            if(value == 'dropdown'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item-dropdown\").show();\r\n\r\n                let value1 = \"\";\r\n\r\n                if(value == item.type){\r\n                    value1 = item.value1;\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1\").val(value1);\r\n                \r\n                $('#luckysheet-dataVerification-dialog #data-verification-multi').prop('checked', item.type2 ? true : false);\r\n            }\r\n            else if(value == 'checkbox'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item-checkbox\").show();\r\n\r\n                let value1 = \"\";\r\n                let value2 = \"\";\r\n\r\n                if(value == item.type){\r\n                    value1 = item.value1;\r\n                    value2 = item.value2;\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1\").val(value1);\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2\").val(value2);\r\n            }\r\n            else if(value == 'number' || value == 'number_integer' || value == 'number_decimal'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number\").show();\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input\").hide();\r\n\r\n                let type2 = \"bw\";\r\n                let value1 = \"\";\r\n                let value2 = \"\";\r\n\r\n                if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){\r\n                    type2 = item.type2;\r\n                    value1 = item.value1;\r\n                    value2 = item.value2;\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog #data-verification-number-select\").val(type2);\r\n            \r\n                if(type2 == 'bw' || type2 == 'nb'){\r\n                    $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input1\").show();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input2\").show();\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value1\").val(value1);\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value2\").val(value2);\r\n            }\r\n            else if(value == 'text_content'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-text\").show();\r\n\r\n                let type2 = \"include\";\r\n                let value1 = \"\";\r\n                \r\n                if(value == item.type){\r\n                    type2 = item.type2;\r\n                    value1 = item.value1;\r\n                }\r\n                \r\n                $(\"#luckysheet-dataVerification-dialog #data-verification-text-select\").val(type2);\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1\").val(value1);\r\n            }\r\n            else if(value == 'text_length'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength\").show();\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input\").hide();\r\n\r\n                let type2 = \"bw\";\r\n                let value1 = \"\";\r\n                let value2 = \"\";\r\n\r\n                if(value == item.type){\r\n                    type2 = item.type2;\r\n                    value1 = item.value1;\r\n                    value2 = item.value2;\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog #data-verification-textLength-select\").val(type2);\r\n            \r\n                if(type2 == 'bw' || type2 == 'nb'){\r\n                    $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input1\").show();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input2\").show();\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value1\").val(value1);\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value2\").val(value2);\r\n            }\r\n            else if(value == 'date'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date\").show();\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input\").hide();\r\n\r\n                let type2 = \"bw\";\r\n                let value1 = \"\";\r\n                let value2 = \"\";\r\n\r\n                if(value == item.type){\r\n                    type2 = item.type2;\r\n                    value1 = item.value1;\r\n                    value2 = item.value2;\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog #data-verification-date-select\").val(type2);\r\n\r\n                if(type2 == 'bw' || type2 == 'nb'){\r\n                    $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input1\").show();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input2\").show();\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value1\").val(value1);\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value2\").val(value2);\r\n            }\r\n            else if(value == 'validity'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item-validity\").show();\r\n\r\n                let type2 = \"card\";\r\n\r\n                if(value == item.type){\r\n                    type2 = item.type2;\r\n                }\r\n\r\n                $(\"#luckysheet-dataVerification-dialog #data-verification-validity-select\").val(type2);\r\n            }\r\n        });\r\n\r\n        $(document).off(\"change.numberSelect\").on(\"change.numberSelect\", \"#data-verification-number-select\", function(e) {\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input\").hide();\r\n\r\n            let value = this.value;\r\n\r\n            if(value == 'bw' || value == 'nb'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input1\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input2\").show();\r\n            }\r\n        });\r\n        // 文本长度选择变化\r\n        $(document).off(\"change.textLengthSelect\").on(\"change.textLengthSelect\", \"#data-verification-textLength-select\", function(e) {\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input\").hide();\r\n\r\n            let value = this.value;\r\n\r\n            if(value == 'bw' || value == 'nb'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input1\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input2\").show();\r\n            }\r\n        });\r\n\r\n        $(document).off(\"change.dateSelect\").on(\"change.dateSelect\", \"#data-verification-date-select\", function(e) {\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input\").hide();\r\n\r\n            let value = this.value;\r\n\r\n            if(value == 'bw' || value == 'nb'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input1\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input2\").show();\r\n            }\r\n        });\r\n\r\n        //选中单元格时显示提示语\r\n        $(document).off(\"change.hintShow\").on(\"change.hintShow\", \"#data-verification-hint-show\", function(e) {\r\n            if(this.checked){\r\n                $(\"#luckysheet-dataVerification-dialog .data-verification-hint-text\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .data-verification-hint-text\").hide();\r\n            }\r\n        });\r\n\r\n        //确认按钮\r\n        $(document).off(\"click.dvSaveConfirm\").on(\"click.dvSaveConfirm\", \"#luckysheet-dataVerification-dialog-confirm\", function(e) {\r\n            let rangeTxt = $(\"#luckysheet-dataVerification-dialog #data-verification-range input\").val().trim();\r\n            let range = _this.getRangeByTxt(rangeTxt);\r\n\r\n            if(range.length == 0){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.selectCellRange2);\r\n                return;\r\n            }\r\n\r\n            let str = range[range.length - 1].row[0],\r\n                edr = range[range.length - 1].row[1],\r\n                stc = range[range.length - 1].column[0],\r\n                edc = range[range.length - 1].column[1];\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n            if(str < 0){\r\n                str = 0;\r\n            }\r\n\r\n            if(edr > d.length - 1){\r\n                edr = d.length - 1;\r\n            }\r\n\r\n            if(stc < 0){\r\n                stc = 0;\r\n            }\r\n\r\n            if(edc > d[0].length - 1){\r\n                edc = d[0].length - 1;\r\n            }\r\n\r\n            let type = $(\"#luckysheet-dataVerification-dialog #data-verification-type-select\").val();\r\n            let type2 = null, value1 = \"\", value2 = \"\";\r\n\r\n            if(type == 'dropdown'){\r\n                value1 = $(\"#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1\").val().trim();\r\n            \r\n                if(value1.length == 0){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo1);\r\n                    return;\r\n                }\r\n                type2 = $(\"#luckysheet-dataVerification-dialog #data-verification-multi\").is(':checked');\r\n            }\r\n            else if(type == 'checkbox'){\r\n                value1 = $(\"#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1\").val().trim();\r\n                value2 = $(\"#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2\").val().trim();\r\n            \r\n                if(value1.length == 0 || value2.length == 0){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo2);\r\n                    return;\r\n                }\r\n            }\r\n            else if(type == 'number' || type == 'number_integer' || type == 'number_decimal'){\r\n                type2 = $(\"#luckysheet-dataVerification-dialog #data-verification-number-select\").val();\r\n                value1 = $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input:visible .data-verification-value1\").val().trim();\r\n                \r\n                if(!isRealNum(value1)){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n                    return;\r\n                }\r\n\r\n                if(type2 == 'bw' || type2 == 'nb'){\r\n                    value2 = $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input:visible .data-verification-value2\").val().trim();\r\n                \r\n                    if(!isRealNum(value2)){\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n                        return;\r\n                    }\r\n\r\n                    if(Number(value2) < Number(value1)){\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo4);\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n            else if(type == 'text_content'){\r\n                type2 = $(\"#luckysheet-dataVerification-dialog #data-verification-text-select\").val();\r\n                value1 = $(\"#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1\").val().trim();\r\n            \r\n                if(value1.length == 0){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo5);\r\n                    return;\r\n                }\r\n            }\r\n            else if(type == 'text_length'){\r\n                type2 = $(\"#luckysheet-dataVerification-dialog #data-verification-textLength-select\").val();\r\n                value1 = $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input:visible .data-verification-value1\").val().trim();\r\n                \r\n                if(!isRealNum(value1)){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n                    return;\r\n                }\r\n\r\n                if (!Number.isInteger(Number(value1)) || Number(value1) < 0) {\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.textlengthInteger);\r\n                    return;\r\n                }\r\n\r\n                if(type2 == 'bw' || type2 == 'nb'){\r\n                    value2 = $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input:visible .data-verification-value2\").val().trim();\r\n                \r\n                    if(!isRealNum(value2)){\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n                        return;\r\n                    }\r\n                    if (!Number.isInteger(Number(value2)) || Number(value2) < 0) {\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.textlengthInteger);\r\n                        return;\r\n                    }\r\n\r\n                    if(Number(value2) < Number(value1)){\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo4);\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n            else if(type == 'date'){\r\n                type2 = $(\"#luckysheet-dataVerification-dialog #data-verification-date-select\").val();\r\n                value1 = $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input:visible .data-verification-value1\").val().trim();\r\n                \r\n                if(!isdatetime(value1)){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo6);\r\n                    return;\r\n                }\r\n\r\n                if(type2 == 'bw' || type2 == 'nb'){\r\n                    value2 = $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input:visible .data-verification-value2\").val().trim();\r\n                \r\n                    if(!isdatetime(value2)){\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo6);\r\n                        return;\r\n                    }\r\n\r\n                    if(diff(value1, value2) > 0){\r\n                        tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo7);\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n            else if(type == 'validity'){\r\n                type2 = $(\"#luckysheet-dataVerification-dialog #data-verification-validity-select\").val();\r\n            }\r\n\r\n            let remote = $(\"#luckysheet-dataVerification-dialog #data-verification-remote\").is(\":checked\");\r\n            let prohibitInput = $(\"#luckysheet-dataVerification-dialog #data-verification-prohibitInput\").is(\":checked\");\r\n            let hintShow = $(\"#luckysheet-dataVerification-dialog #data-verification-hint-show\").is(\":checked\");\r\n            let hintText = \"\";\r\n\r\n            if(hintShow){\r\n                hintText = $(\"#luckysheet-dataVerification-dialog .data-verification-hint-text input\").val().trim();\r\n            }\r\n\r\n            let item = {\r\n                type: type,\r\n                type2: type2,  \r\n                value1: value1,  \r\n                value2: value2, \r\n                checked: false, \r\n                remote: remote, \r\n                prohibitInput: prohibitInput,  \r\n                hintShow: hintShow, \r\n                hintText: hintText,\r\n            }\r\n           \r\n            let historyDataVerification = $.extend(true, {}, _this.dataVerification);\r\n            let currentDataVerification = $.extend(true, {}, _this.dataVerification);\r\n\r\n            for(let r = str; r <= edr; r++){\r\n                for(let c = stc; c <= edc; c++){\r\n                    currentDataVerification[r + '_' + c] = item;\r\n\r\n                    if(type == 'checkbox'){\r\n                        setcellvalue(r, c, d, item.value2);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(type == 'checkbox'){\r\n                _this.refOfCheckbox(historyDataVerification, currentDataVerification, Store.currentSheetIndex, d, range[range.length - 1]);\r\n            }\r\n            else{\r\n                _this.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex);\r\n            }\r\n            \r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-dataVerification-dialog\").hide();\r\n        });\r\n\r\n        //删除验证按钮\r\n        $(document).off(\"click.delete\").on(\"click.delete\", \"#luckysheet-dataVerification-dialog-delete\", function(e) {\r\n            let rangeTxt = $(\"#luckysheet-dataVerification-dialog #data-verification-range input\").val().trim();\r\n            let range = _this.getRangeByTxt(rangeTxt);\r\n\r\n            if(range.length == 0){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.selectCellRange2);\r\n                return;\r\n            }\r\n            \r\n            let historyDataVerification = $.extend(true, {}, _this.dataVerification);\r\n            let currentDataVerification = $.extend(true, {}, _this.dataVerification);\r\n\r\n            let str = range[range.length - 1].row[0],\r\n                edr = range[range.length - 1].row[1],\r\n                stc = range[range.length - 1].column[0],\r\n                edc = range[range.length - 1].column[1];\r\n\r\n            for(let r = str; r <= edr; r++){\r\n                for(let c = stc; c <= edc; c++){\r\n                    delete currentDataVerification[r + '_' + c];\r\n                }\r\n            }\r\n\r\n            _this.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex);\r\n            \r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-dataVerification-dialog\").hide();\r\n        });\r\n\r\n        //info提示弹框 关闭\r\n        $(document).on(\"click\", \"#luckysheet-info .luckysheet-modal-dialog-title-close, #luckysheet-info .luckysheet-model-close-btn\", function(e) {\r\n            $(this).parents(\"#luckysheet-info\").hide();\r\n\r\n            if($(\"#luckysheet-dataVerification-dialog\").is(\":visible\")){\r\n                $(\"#luckysheet-modal-dialog-mask\").show();\r\n            }\r\n            e.stopPropagation();\r\n        });\r\n    },\r\n    dataAllocation: function(){\r\n        let _this = this;\r\n\r\n        //单元格范围\r\n        let range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rangeTxt = getRangetxt(Store.currentSheetIndex, range, Store.currentSheetIndex);\r\n        $(\"#luckysheet-dataVerification-dialog #data-verification-range input\").val(rangeTxt);\r\n\r\n        //focus单元格\r\n        let rowIndex = range.row_focus || range.row[0];\r\n        let colIndex = range.column_focus || range.column[0];\r\n        let dataVerification = $.extend(true, {}, _this.dataVerification); \r\n        let item = dataVerification[rowIndex + '_' + colIndex];\r\n\r\n        if(item == null){\r\n            item = $.extend(true, {}, _this.defaultItem);\r\n        }\r\n\r\n        _this.curItem = item;\r\n        \r\n        //验证条件\r\n        $(\"#luckysheet-dataVerification-dialog #data-verification-type-select\").val(item.type);\r\n        $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item\").hide();\r\n\r\n        if(item.type == 'dropdown'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item-dropdown\").show();\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-dropdown .data-verification-value1\").val(item.value1);\r\n            $('#luckysheet-dataVerification-dialog #data-verification-multi').prop('checked', item.type2 ? true : false);\r\n        }\r\n        else if(item.type == 'checkbox'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item-checkbox\").show();\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value1\").val(item.value1);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-checkbox .data-verification-value2\").val(item.value2);\r\n        }\r\n        else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-number\").show();\r\n            $(\"#luckysheet-dataVerification-dialog #data-verification-number-select\").val(item.type2);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input\").hide();\r\n            \r\n            if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input1\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-number .input2\").show();\r\n            }\r\n\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value1\").val(item.value1);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-number .data-verification-value2\").val(item.value2);\r\n        }\r\n        else if(item.type == 'text_content'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-text\").show();\r\n            $(\"#luckysheet-dataVerification-dialog #data-verification-text-select\").val(item.type2);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-text .data-verification-value1\").val(item.value1);\r\n        }\r\n        else if(item.type == 'text_length'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength\").show();\r\n            $(\"#luckysheet-dataVerification-dialog #data-verification-textLength-select\").val(item.type2);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input\").hide();\r\n\r\n            if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input1\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .input2\").show();\r\n            }\r\n\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value1\").val(item.value1);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-textLength .data-verification-value2\").val(item.value2);\r\n        }\r\n        else if(item.type == 'date'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-date\").show();\r\n            $(\"#luckysheet-dataVerification-dialog #data-verification-date-select\").val(item.type2);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input\").hide();\r\n\r\n            if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input1\").show();\r\n            }\r\n            else{\r\n                $(\"#luckysheet-dataVerification-dialog .show-box-item-date .input2\").show();\r\n            }\r\n\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value1\").val(item.value1);\r\n            $(\"#luckysheet-dataVerification-dialog .show-box-item-date .data-verification-value2\").val(item.value2);\r\n        }\r\n        else if(item.type == 'validity'){\r\n            $(\"#luckysheet-dataVerification-dialog .show-box .show-box-item-validity\").show();\r\n            $(\"#luckysheet-dataVerification-dialog #data-verification-validity-select\").val(item.type2);\r\n        }\r\n\r\n        //自动远程获取选项\r\n        $(\"#luckysheet-dataVerification-dialog #data-verification-remote\").prop(\"checked\", item.remote);\r\n\r\n        //输入数据无效时禁止输入\r\n        $(\"#luckysheet-dataVerification-dialog #data-verification-prohibitInput\").prop(\"checked\", item.prohibitInput);\r\n\r\n        //选中单元格时显示提示语\r\n        $(\"#luckysheet-dataVerification-dialog #data-verification-hint-show\").prop(\"checked\", item.hintShow);\r\n        \r\n        if(item.hintShow){\r\n            $(\"#luckysheet-dataVerification-dialog .data-verification-hint-text\").show();\r\n        }\r\n        else{\r\n            $(\"#luckysheet-dataVerification-dialog .data-verification-hint-text\").hide();\r\n        }\r\n        \r\n        $(\"#luckysheet-dataVerification-dialog .data-verification-hint-text input\").val(item.hintText);\r\n    },\r\n    rangeDialog: function(dataSource, txt){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const dvText = _locale.dataVerification;\r\n        const buttonText = _locale.button;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-dataVerificationRange-dialog\").remove();\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-dataVerificationRange-dialog\", \r\n            \"addclass\": \"luckysheet-dataVerificationRange-dialog\", \r\n            \"title\": dvText.selectCellRange, \r\n            \"content\": `<input readonly=\"readonly\" placeholder=\"${dvText.selectCellRange2}\" value=\"${txt}\"/>`, \r\n            \"botton\":  `<button id=\"luckysheet-dataVerificationRange-dialog-confirm\" class=\"btn btn-primary\" data-source=\"${dataSource}\">${buttonText.confirm}</button>\r\n                        <button id=\"luckysheet-dataVerificationRange-dialog-close\" class=\"btn btn-default\">${buttonText.close}</button>`, \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-dataVerificationRange-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-dataVerificationRange-dialog\").css({ \r\n            \"left\": (winw + scrollLeft - myw) / 2, \r\n            \"top\": (winh + scrollTop - myh) / 3 \r\n        }).show();\r\n    },\r\n    getTxtByRange: function(range){\r\n        if(range.length > 0){\r\n            let txt = [];\r\n\r\n            for(let s = 0; s < range.length; s++){\r\n                let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                let c1 = range[s].column[0], c2 = range[s].column[1];\r\n                \r\n                txt.push(getRangetxt(Store.currentSheetIndex, { \"row\": [r1, r2], \"column\": [c1, c2] }, Store.currentSheetIndex));\r\n            }\r\n\r\n            return txt.join(\",\");\r\n        }\r\n    },\r\n    getRangeByTxt: function(txt){\r\n        let range = [];\r\n\r\n        if(txt.indexOf(\",\") != -1){\r\n            let arr = txt.split(\",\");\r\n            for(let i = 0; i < arr.length; i++){\r\n                if(formula.iscelldata(arr[i])){\r\n                    range.push(formula.getcellrange(arr[i]));\r\n                }\r\n                else{\r\n                    range = [];\r\n                    break;    \r\n                }\r\n            }\r\n        }\r\n        else{\r\n            if(formula.iscelldata(txt)){\r\n                range.push(formula.getcellrange(txt));\r\n            }\r\n        }\r\n\r\n        return range;\r\n    },\r\n    cellFocus: function(r, c, clickMode){\r\n        $(\"#luckysheet-dataVerification-dropdown-btn\").hide();\r\n        $(\"#luckysheet-dataVerification-showHintBox\").hide();\r\n\r\n        let _this = this;\r\n\r\n        if(_this.dataVerification == null || _this.dataVerification[r + '_' + c] == null){\r\n            $(\"#luckysheet-dataVerification-dropdown-List\").hide();\r\n            return;\r\n        }\r\n\r\n        let row = Store.visibledatarow[r],\r\n            row_pre = r == 0 ? 0 : Store.visibledatarow[r - 1];\r\n        let col = Store.visibledatacolumn[c],\r\n            col_pre = c == 0 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n        if(!!margeset){\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n            \r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n        }\r\n\r\n        let item = _this.dataVerification[r + '_' + c];\r\n\r\n        //单元格数据验证 类型是 复选框\r\n        if(clickMode && item.type == 'checkbox'){\r\n            _this.checkboxChange(r, c);\r\n            return;\r\n        }\r\n\r\n        //单元格数据验证 类型是 下拉列表\r\n        if(item.type == 'dropdown'){\r\n            $(\"#luckysheet-dataVerification-dropdown-btn\").show().css({\r\n                'max-width': col - col_pre,\r\n                'max-height': row - row_pre,\r\n                'left': col - 20,\r\n                'top': row_pre + (row - row_pre - 20) / 2\r\n            })\r\n\r\n            if($(\"#luckysheet-dataVerification-dropdown-List\").is(\":visible\")){\r\n                let dataIndex = $(\"#luckysheet-dataVerification-dropdown-List\").prop(\"data-index\");\r\n                \r\n                if(dataIndex != (r + '_' + c)){\r\n                    $(\"#luckysheet-dataVerification-dropdown-List\").hide();\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            $(\"#luckysheet-dataVerification-dropdown-List\").hide();\r\n        }\r\n\r\n        //提示语\r\n        if(item.hintShow){\r\n            let hintText;\r\n\r\n            if(Store.lang == 'en'){\r\n                hintText = '<span style=\"color:#f5a623;\">Hint: </span>';\r\n            }\r\n            else{\r\n                hintText = '<span style=\"color:#f5a623;\">提示：</span>';\r\n            }\r\n\r\n            hintText += _this.getHintText(item);\r\n\r\n            $(\"#luckysheet-dataVerification-showHintBox\").html(hintText).show().css({\r\n                'left': col_pre,\r\n                'top': row\r\n            });\r\n\r\n            return;\r\n        }\r\n        \r\n        //数据验证未通过\r\n        let cellValue = getcellvalue(r, c, null);\r\n\r\n        if(isRealNull(cellValue)){\r\n            return;\r\n        }\r\n\r\n        let validate = _this.validateCellData(cellValue, item);\r\n\r\n        if(!validate){\r\n            let failureText;\r\n\r\n            if(Store.lang == 'en'){\r\n                failureText = '<span style=\"color:#f72626;\">Failure: </span>';\r\n            }\r\n            else{\r\n                failureText = '<span style=\"color:#f72626;\">失效：</span>';\r\n            }\r\n\r\n            failureText += _this.getFailureText(item);\r\n\r\n            $(\"#luckysheet-dataVerification-showHintBox\").html(failureText).show().css({\r\n                'left': col_pre,\r\n                'top': row\r\n            });\r\n        }\r\n    },\r\n    getHintText: function(item) {\r\n        let _this = this;\r\n\r\n        let hintText = item.hintText || '';\r\n\r\n        if(hintText.length == 0){\r\n            if(Store.lang == 'en'){\r\n                if(item.type == 'dropdown'){\r\n                    hintText += 'please select an option in the drop-down list';\r\n                }\r\n                else if(item.type == 'checkbox'){\r\n\r\n                }\r\n                else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){\r\n                    hintText += 'please enter a ' + _this.optionLabel_en[item.type] + ' ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n\r\n                    if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                        hintText += ' and ' + item.value2;\r\n                    }\r\n                }\r\n                else if(item.type == 'text_content'){\r\n                    hintText += 'please enter text ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n                }\r\n                else if(item.type == 'text_length'){\r\n                    hintText += 'please enter text with length ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n                    \r\n                    if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                        hintText += ' and ' + item.value2;\r\n                    }\r\n                }\r\n                else if(item.type == 'date'){\r\n                    hintText += 'please enter a date ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n\r\n                    if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                        hintText += ' and ' + item.value2;\r\n                    }\r\n                }\r\n                else if(item.type == 'validity'){\r\n                    hintText += 'please enter the correct ' + _this.optionLabel_en[item.type2];\r\n                }\r\n            }\r\n            else{\r\n                if(item.type == 'dropdown'){\r\n                    hintText += '请选择下拉列表中的选项';\r\n                }\r\n                else if(item.type == 'checkbox'){\r\n\r\n                }\r\n                else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){\r\n                    hintText += '请输入' + _this.optionLabel[item.type2] + item.value1;\r\n\r\n                    if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                        hintText += '和' + item.value2 + '之间';\r\n                    }\r\n\r\n                    hintText += '的' + _this.optionLabel[item.type];\r\n                }\r\n                else if(item.type == 'text_content'){\r\n                    hintText += '请输入内容' + _this.optionLabel[item.type2] + item.value1 + '的文本';\r\n                }\r\n                else if(item.type == 'text_length'){\r\n                    hintText += '请输入长度' + _this.optionLabel[item.type2] + item.value1;\r\n                    \r\n                    if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                        hintText += '和' + item.value2 + '之间';\r\n                    }\r\n\r\n                    hintText += '的文本';\r\n                }\r\n                else if(item.type == 'date'){\r\n                    hintText += '请输入' + _this.optionLabel[item.type2] + item.value1;\r\n\r\n                    if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                        hintText += '和' + item.value2 + '之间';\r\n                    }\r\n\r\n                    hintText += '的日期';\r\n                }\r\n                else if(item.type == 'validity'){\r\n                    hintText += '请输入正确的' + _this.optionLabel[item.type2];\r\n                }\r\n            }\r\n        }\r\n\r\n        return hintText;\r\n    },\r\n    getFailureText: function(item) {\r\n        let _this = this;\r\n\r\n        let failureText = '';\r\n\r\n        if(Store.lang == 'en'){\r\n            if(item.type == 'dropdown'){\r\n                failureText += 'what you selected is not an option in the drop-down list';\r\n            }\r\n            else if(item.type == 'checkbox'){\r\n\r\n            }\r\n            else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){\r\n                failureText += 'what you entered is not a ' + _this.optionLabel_en[item.type] + ' ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n\r\n                if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                    failureText += ' and ' + item.value2;\r\n                }\r\n            }\r\n            else if(item.type == 'text_content'){\r\n                failureText += 'what you entered is not text that ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n            }\r\n            else if(item.type == 'text_length'){\r\n                failureText += 'the text you entered is not length ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n                \r\n                if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                    failureText += ' and ' + item.value2;\r\n                }\r\n            }\r\n            else if(item.type == 'date'){\r\n                failureText += 'the date you entered is not ' + _this.optionLabel_en[item.type2] + ' ' + item.value1;\r\n\r\n                if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                    failureText += ' and ' + item.value2;\r\n                }\r\n            }\r\n            else if(item.type == 'validity'){\r\n                failureText += 'what you entered is not a correct ' + _this.optionLabel_en[item.type2];\r\n            }\r\n        }\r\n        else{\r\n            if(item.type == 'dropdown'){\r\n                failureText += '你选择的不是下拉列表中的选项';\r\n            }\r\n            else if(item.type == 'checkbox'){\r\n\r\n            }\r\n            else if(item.type == 'number' || item.type == 'number_integer' || item.type == 'number_decimal'){\r\n                failureText += '你输入的不是' + _this.optionLabel[item.type2] + item.value1;\r\n\r\n                if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                    failureText += '和' + item.value2 + '之间';\r\n                }\r\n\r\n                failureText += '的' + _this.optionLabel[item.type];\r\n            }\r\n            else if(item.type == 'text_content'){\r\n                failureText += '你输入的不是内容' + _this.optionLabel[item.type2] + item.value1 + '的文本';\r\n            }\r\n            else if(item.type == 'text_length'){\r\n                failureText += '你输入的不是长度' + _this.optionLabel[item.type2] + item.value1;\r\n                \r\n                if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                    failureText += '和' + item.value2 + '之间';\r\n                }\r\n\r\n                failureText += '的文本';\r\n            }\r\n            else if(item.type == 'date'){\r\n                failureText += '你输入的不是' + _this.optionLabel[item.type2] + item.value1;\r\n\r\n                if(item.type2 == 'bw' || item.type2 == 'nb'){\r\n                    failureText += '和' + item.value2 + '之间';\r\n                }\r\n\r\n                failureText += '的日期';\r\n            }\r\n            else if(item.type == 'validity'){\r\n                failureText += '你输入的不是一个正确的' + _this.optionLabel[item.type2];\r\n            }\r\n        }\r\n\r\n        return failureText;\r\n    },\r\n    validateCellData: function(cellValue, item){\r\n        let _this = this;\r\n\r\n        let type = item.type,\r\n            type2 = item.type2,\r\n            value1 = item.value1,\r\n            value2 = item.value2;\r\n\r\n        if(type == 'dropdown'){\r\n            let list = _this.getDropdownList(value1);\r\n\r\n            // 多选的情况 检查每个都在下拉列表中\r\n            if(type2 && cellValue){\r\n                return cellValue.split(',').every(function (i) {\r\n                    return list.indexOf(i) !== -1;\r\n                });\r\n            }\r\n\r\n            let result = false;\r\n\r\n            for(let i = 0; i < list.length; i++){\r\n                if(list[i] == cellValue){\r\n                    result = true;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(type == 'checkbox'){\r\n\r\n        }\r\n        else if(type == 'number' || type == 'number_integer' || type == 'number_decimal'){\r\n            if(!isRealNum(cellValue)){\r\n                return false;\r\n            }\r\n            \r\n            cellValue = Number(cellValue);\r\n\r\n            if(type == 'number_integer' && cellValue % 1 !== 0){\r\n                return false;\r\n            }\r\n\r\n            if(type == 'number_decimal' && cellValue % 1 === 0){\r\n                return false;\r\n            }\r\n\r\n            value1 = Number(value1);\r\n            value2 = Number(value2);\r\n\r\n            if(type2 == 'bw' && (cellValue < value1 || cellValue > value2)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'nb' && (cellValue >= value1 && cellValue <= value2)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'eq' && cellValue != value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'ne' && cellValue == value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'gt' && cellValue <= value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'lt' && cellValue >= value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'gte' && cellValue < value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'lte' && cellValue > value1){\r\n                return false;\r\n            }\r\n        }\r\n        else if(type == 'text_content'){\r\n            cellValue = cellValue.toString();\r\n            value1 = value1.toString();\r\n\r\n            if(type2 == 'include' && cellValue.indexOf(value1) == -1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'exclude' && cellValue.indexOf(value1) > -1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'equal' && cellValue != value1){\r\n                return false;\r\n            }\r\n        }\r\n        else if(type == 'text_length'){\r\n            cellValue = cellValue.toString().length;\r\n\r\n            value1 = Number(value1);\r\n            value2 = Number(value2);\r\n\r\n            if(type2 == 'bw' && (cellValue < value1 || cellValue > value2)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'nb' && (cellValue >= value1 && cellValue <= value2)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'eq' && cellValue != value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'ne' && cellValue == value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'gt' && cellValue <= value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'lt' && cellValue >= value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'gte' && cellValue < value1){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'lte' && cellValue > value1){\r\n                return false;\r\n            }\r\n        }\r\n        else if(type == 'date'){\r\n            if(!isdatetime(cellValue)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'bw' && (diff(cellValue, value1) < 0 || diff(cellValue, value2) > 0)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'nb' && (diff(cellValue, value1) >= 0 && diff(cellValue, value2) <= 0)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'eq' && diff(cellValue, value1) != 0){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'ne' && diff(cellValue, value1) == 0){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'bf' && diff(cellValue, value1) >= 0){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'nbf' && diff(cellValue, value1) < 0){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'af' && diff(cellValue, value1) <= 0){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'naf' && diff(cellValue, value1) > 0){\r\n                return false;\r\n            }\r\n        }\r\n        else if(type == 'validity'){\r\n            if(type2 == 'card' && !validateIdCard(cellValue)){\r\n                return false;\r\n            }\r\n\r\n            if(type2 == 'phone' && !/^1[3456789]\\d{9}$/.test(cellValue)){\r\n                return false;\r\n            }\r\n        }\r\n\r\n        return true;\r\n    },\r\n    dropdownListShow: function(){\r\n        $(\"#luckysheet-dataVerification-showHintBox\").hide();\r\n\r\n        let _this = this;\r\n\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rowIndex = last.row_focus;\r\n        let colIndex = last.column_focus;\r\n\r\n        let row = Store.visibledatarow[rowIndex],\r\n            row_pre = rowIndex == 0 ? 0 : Store.visibledatarow[rowIndex - 1];\r\n        let col = Store.visibledatacolumn[colIndex],\r\n            col_pre = colIndex == 0 ? 0 : Store.visibledatacolumn[colIndex - 1];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, rowIndex, colIndex);\r\n        if(!!margeset){\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n            \r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n        }\r\n\r\n        let item = _this.dataVerification[rowIndex + '_' + colIndex];\r\n        let list = _this.getDropdownList(item.value1);\r\n\r\n        let optionHtml = '';\r\n        if (item.type === 'dropdown' && item.type2) {\r\n            // 下拉多选的情况下 将已经选择的标出来\r\n            let cellValue = getcellvalue(rowIndex, colIndex, null);\r\n            let valueArr = isRealNull(cellValue) ? [] : cellValue.split(',');\r\n            list.forEach(i => {\r\n                let checked = valueArr.indexOf(i) !== -1;\r\n                optionHtml += `<div class=\"dropdown-List-item  luckysheet-mousedown-cancel multi${checked ? ' checked': ''}\">${i}</div>`;\r\n            });\r\n        } else {\r\n            list.forEach(i => {\r\n                optionHtml += `<div class=\"dropdown-List-item luckysheet-mousedown-cancel\">${i}</div>`;\r\n            });\r\n        }\r\n\r\n        $(\"#luckysheet-dataVerification-dropdown-List\")\r\n        .html(optionHtml)\r\n        .prop(\"data-index\", rowIndex + '_' + colIndex)\r\n        .show()\r\n        .css({\r\n            'width': col - col_pre - 1,\r\n            'left': col_pre,\r\n            'top': row,\r\n        });\r\n\r\n        let myh = $(\"#luckysheet-dataVerification-dropdown-List\").outerHeight();\r\n        let currentWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n\r\n        if(row + myh > currentWinH - 42 - 6){\r\n            $(\"#luckysheet-dataVerification-dropdown-List\").css({\r\n                'top': row_pre - myh,\r\n            })\r\n        }\r\n    },\r\n    getDropdownList: function(txt){\r\n        let list = [];\r\n\r\n        if(formula.iscelldata(txt)){\r\n            let range = formula.getcellrange(txt);\r\n            let d = Store.luckysheetfile[getSheetIndex(range.sheetIndex)].data;\r\n\r\n            for(let r = range.row[0]; r <= range.row[1]; r++){\r\n                for(let c = range.column[0]; c <= range.column[1]; c++){\r\n                    if(d[r] == null){\r\n                        continue;\r\n                    }\r\n\r\n                    let cell = d[r][c];\r\n\r\n                    if(cell == null || cell.v == null){\r\n                        continue;\r\n                    }\r\n\r\n                    let v = cell.m || cell.v;\r\n\r\n                    if(!list.includes(v)){\r\n                        list.push(v);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            let arr = txt.split(\",\");\r\n\r\n            for(let i = 0; i < arr.length; i++){\r\n                let v = arr[i];\r\n\r\n                if(v.length == 0){\r\n                    continue;\r\n                }\r\n\r\n                if(!list.includes(v)){\r\n                    list.push(v);\r\n                }\r\n            }\r\n        }\r\n\r\n        return list;\r\n    },\r\n    checkboxChange: function(r, c){\r\n        let _this = this;\r\n\r\n        let historyDataVerification = $.extend(true, {}, _this.dataVerification);\r\n        let currentDataVerification = $.extend(true, {}, _this.dataVerification);\r\n\r\n        let item = currentDataVerification[r + '_' + c];\r\n        item.checked = !item.checked;\r\n\r\n        let value = item.value2;\r\n        if(item.checked){\r\n            value = item.value1;\r\n        }\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        setcellvalue(r, c, d, value);\r\n\r\n        _this.refOfCheckbox(\r\n            historyDataVerification, \r\n            currentDataVerification, \r\n            Store.currentSheetIndex, \r\n            d, \r\n            { \"row\": [r, r], \"column\": [c, c] }\r\n        );\r\n    },\r\n    ref: function(historyDataVerification, currentDataVerification, sheetIndex){\r\n        let _this = this;\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n\r\n            let redo = {};\r\n            redo[\"type\"] = \"updateDataVerification\";\r\n            redo[\"sheetIndex\"] = sheetIndex;\r\n            redo[\"historyDataVerification\"] = historyDataVerification;\r\n            redo[\"currentDataVerification\"] = currentDataVerification;\r\n            Store.jfredo.push(redo); \r\n        }\r\n        \r\n        _this.dataVerification = currentDataVerification;\r\n        Store.luckysheetfile[getSheetIndex(sheetIndex)].dataVerification = currentDataVerification;\r\n\r\n        //共享编辑模式\r\n        if(server.allowUpdate){ \r\n            server.saveParam(\"all\", sheetIndex, currentDataVerification, { \"k\": \"dataVerification\" });\r\n        }\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    },\r\n    refOfCheckbox: function(historyDataVerification, currentDataVerification, sheetIndex, d, range){\r\n        let _this = this;\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n\r\n            let redo = {};\r\n            redo[\"type\"] = \"updateDataVerificationOfCheckbox\";\r\n            redo[\"sheetIndex\"] = sheetIndex;\r\n            redo[\"historyDataVerification\"] = historyDataVerification;\r\n            redo[\"currentDataVerification\"] = currentDataVerification;\r\n            redo[\"data\"] = Store.flowdata; \r\n            redo[\"curData\"] = d;\r\n            redo[\"range\"] = range; \r\n            Store.jfredo.push(redo); \r\n        }\r\n\r\n        _this.dataVerification = currentDataVerification;\r\n        Store.luckysheetfile[getSheetIndex(sheetIndex)].dataVerification = currentDataVerification;\r\n\r\n        Store.flowdata = d;\r\n        editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n        Store.luckysheetfile[getSheetIndex(sheetIndex)].data = Store.flowdata;\r\n\r\n        //共享编辑模式\r\n        if(server.allowUpdate){ \r\n            server.saveParam(\"all\", sheetIndex, currentDataVerification, { \"k\": \"dataVerification\" });\r\n            server.historyParam(Store.flowdata, sheetIndex, range);\r\n        }\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    },\r\n}\r\n\r\nfunction validateIdCard(idCard) {\r\n    // 15位和18位身份证号码的正则表达式\r\n    var regIdCard = /^(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)$/;\r\n\r\n    // 如果通过该验证，说明身份证格式正确，但准确性还需计算\r\n    if (regIdCard.test(idCard)) {\r\n        if (idCard.length == 18) {\r\n            var idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); // 将前17位加权因子保存在数组里\r\n            var idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2); // 这是除以11后，可能产生的11位余数、验证码，也保存成数组\r\n            var idCardWiSum = 0; // 用来保存前17位各自乖以加权因子后的总和\r\n            for (var i = 0; i < 17; i++) {\r\n                idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i];\r\n            }\r\n\r\n            var idCardMod = idCardWiSum % 11; // 计算出校验码所在数组的位置\r\n            var idCardLast = idCard.substring(17); // 得到最后一位身份证号码\r\n\r\n            // 如果等于2，则说明校验码是10，身份证号码最后一位应该是X\r\n            if (idCardMod == 2) {\r\n                if (idCardLast == \"X\" || idCardLast == \"x\") {\r\n                    return true;\r\n                } else {\r\n                    return false;\r\n                }\r\n            } else {\r\n                // 用计算出的验证码与最后一位身份证号码匹配，如果一致，说明通过，否则是无效的身份证号码\r\n                if (idCardLast == idCardY[idCardMod]) {\r\n                    return true;\r\n                } else {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n    } else {\r\n        return false;\r\n    }\r\n}\r\n\r\nexport default dataVerificationCtrl;"
  },
  {
    "path": "src/controllers/dropCell.js",
    "content": "import { rowLocationByIndex, colLocationByIndex } from '../global/location';\r\nimport { countfunc } from '../global/count';\r\nimport { getBorderInfoCompute } from '../global/border';\r\nimport { isRealNum } from '../global/validate';\r\nimport { genarate, update } from '../global/format';\r\nimport { jfrefreshgrid } from '../global/refresh';\r\nimport editor from '../global/editor';\r\nimport formula from '../global/formula';\r\nimport conditionformat from './conditionformat';\r\nimport {checkProtectionLockedRangeList} from './protection';\r\nimport { selectHightlightShow } from './select';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { getObjType, replaceHtml } from '../utils/util';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport dayjs from 'dayjs'\r\n\r\n//选区下拉\r\nconst luckysheetDropCell = {\r\n    iconHtml: '<div id=\"luckysheet-dropCell-icon\" style=\"position: absolute;padding: 2px;background-color: #f1f1f1;z-index: 990;cursor: pointer;\">'+\r\n                '<div id=\"icon_dropCell\"></div>'+\r\n              '</div>',\r\n    typeListHtml: '<div id=\"luckysheet-dropCell-typeList\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel\">'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"0\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${copyCell}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"1\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${sequence}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"2\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${onlyFormat}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"3\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${noFormat}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"4\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${day}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"5\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${workDay}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"6\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${month}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"7\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${year}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                    '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" data-type=\"8\">'+\r\n                        '<div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 2px;\">'+\r\n                            '<span style=\"margin-right:5px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span>${chineseNumber}'+\r\n                        '</div>'+\r\n                    '</div>'+\r\n                  '</div>',\r\n    copyRange: {}, //复制范围\r\n    applyRange: {}, //应用范围\r\n    applyType: null, //0复制单元格，1填充序列，2仅填充格式，3不带格式填充，4以天数填充，5以工作日填充，6以月填充，7以年填充，8以中文小写数字序列填充\r\n    direction: null, //down-往下拖拽，right-往右拖拽，up-往上拖拽，left-往左拖拽\r\n    chnNumChar: {\"零\": 0, \"一\": 1, \"二\": 2, \"三\": 3, \"四\": 4, \"五\": 5, \"六\": 6, \"七\": 7, \"八\": 8, \"九\": 9},\r\n    chnNameValue: {\r\n        \"十\": {value: 10, secUnit: false},\r\n        \"百\": {value: 100, secUnit: false},\r\n        \"千\": {value: 1000, secUnit: false},\r\n        \"万\": {value: 10000, secUnit: true},\r\n        \"亿\": {value: 100000000, secUnit: true}\r\n    },\r\n    ChineseToNumber: function(chnStr){\r\n        let _this = this;\r\n\r\n        let rtn = 0;\r\n        let section = 0;\r\n        let number = 0;\r\n        let secUnit = false;\r\n        let str = chnStr.split(\"\");\r\n\r\n        for(let i = 0; i < str.length; i++){\r\n            let num = _this.chnNumChar[str[i]];\r\n\r\n            if(typeof num != \"undefined\"){\r\n                number = num;\r\n\r\n                if(i == str.length - 1){\r\n                    section += number;\r\n                }\r\n            }\r\n            else{\r\n                let unit = _this.chnNameValue[str[i]].value;\r\n                secUnit = _this.chnNameValue[str[i]].secUnit;\r\n\r\n                if(secUnit){\r\n                    section = (section + number) * unit;\r\n                    rtn += section;\r\n                    section = 0;\r\n                }\r\n                else{\r\n                    section += (number * unit);\r\n                }\r\n\r\n                number = 0;\r\n            }\r\n        }\r\n\r\n        return rtn + section;\r\n    },\r\n    chnNumChar2: [\"零\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\", \"七\", \"八\", \"九\"],\r\n    chnUnitSection: [\"\", \"万\", \"亿\", \"万亿\", \"亿亿\"],\r\n    chnUnitChar: [\"\", \"十\", \"百\", \"千\"],\r\n    SectionToChinese: function(section){\r\n        let _this = this;\r\n\r\n        let strIns = '', chnStr = '';\r\n        let unitPos = 0;\r\n        let zero = true;\r\n\r\n        while(section > 0){\r\n            let v = section % 10;\r\n\r\n            if(v == 0){\r\n                if(!zero){\r\n                    zero = true;\r\n                    chnStr = _this.chnNumChar2[v] + chnStr;\r\n                }\r\n            }\r\n            else{\r\n                zero = false;\r\n                strIns = _this.chnNumChar2[v];\r\n                strIns += _this.chnUnitChar[unitPos];\r\n                chnStr = strIns + chnStr;\r\n            }\r\n\r\n            unitPos++;\r\n            section = Math.floor(section / 10);\r\n        }\r\n\r\n        return chnStr;\r\n    },\r\n    NumberToChinese: function(num){\r\n        let _this = this;\r\n\r\n        let unitPos = 0;\r\n        let strIns = '', chnStr = '';\r\n        let needZero = false;\r\n\r\n        if(num == 0){\r\n            return _this.chnNumChar2[0];\r\n        }\r\n        while(num > 0){\r\n            let section = num % 10000;\r\n\r\n            if(needZero){\r\n                chnStr = _this.chnNumChar2[0] + chnStr;\r\n            }\r\n\r\n            strIns = _this.SectionToChinese(section);\r\n            strIns += (section != 0) ? _this.chnUnitSection[unitPos] : _this.chnUnitSection[0];\r\n            chnStr = strIns + chnStr;\r\n            needZero = (section < 1000) && (section > 0);\r\n            num = Math.floor(num / 10000);\r\n            unitPos++;\r\n        }\r\n\r\n        return chnStr;\r\n    },\r\n    isChnNumber: function(txt){\r\n        let _this = this;\r\n\r\n        let isChnNumber = true;\r\n\r\n        if (txt) {//如果不判断，出现undefined的时候这里会报错\r\n            if(txt.length == 1){\r\n                if(txt == \"日\" || (txt in _this.chnNumChar)){\r\n                    isChnNumber = true;\r\n                }\r\n                else{\r\n                    isChnNumber = false;\r\n                }\r\n            }\r\n            else{\r\n                let str = txt.split(\"\");\r\n                for(let i = 0; i < str.length; i++){\r\n                    if(!((str[i] in _this.chnNumChar) || (str[i] in _this.chnNameValue))){\r\n                        isChnNumber = false;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        return isChnNumber;\r\n    },\r\n    isExtendNumber: function(txt){\r\n        let reg = /0|([1-9]+[0-9]*)/g;\r\n        let isExtendNumber = reg.test(txt);\r\n\r\n        if(isExtendNumber){\r\n            let match = txt.match(reg);\r\n            let matchTxt = match[match.length - 1];\r\n            let matchIndex = txt.lastIndexOf(matchTxt);\r\n            let beforeTxt = txt.substr(0, matchIndex);\r\n            let afterTxt = txt.substr(matchIndex + matchTxt.length);\r\n\r\n            return [isExtendNumber, Number(matchTxt), beforeTxt, afterTxt];\r\n        }\r\n        else {\r\n            return [isExtendNumber]\r\n        }\r\n    },\r\n    isChnWeek1: function(txt){\r\n        let _this = this;\r\n\r\n        let isChnWeek1;\r\n        if(txt.length == 1){\r\n            if(txt == \"日\" || _this.ChineseToNumber(txt) < 7){\r\n                isChnWeek1 = true;\r\n            }\r\n            else{\r\n                isChnWeek1 = false;\r\n            }\r\n        }\r\n        else{\r\n            isChnWeek1 = false;\r\n        }\r\n\r\n        return isChnWeek1;\r\n    },\r\n    isChnWeek2: function(txt){\r\n        let isChnWeek2;\r\n        if(txt.length == 2){\r\n            if(txt == \"周一\" || txt == \"周二\" || txt == \"周三\" || txt == \"周四\" || txt == \"周五\" || txt == \"周六\" || txt == \"周日\"){\r\n                isChnWeek2 = true;\r\n            }\r\n            else{\r\n                isChnWeek2 = false;\r\n            }\r\n        }\r\n        else{\r\n            isChnWeek2 = false;\r\n        }\r\n\r\n        return isChnWeek2;\r\n    },\r\n    isChnWeek3: function(txt){\r\n        let isChnWeek3;\r\n        if(txt.length == 3){\r\n            if(txt == \"星期一\" || txt == \"星期二\" || txt == \"星期三\" || txt == \"星期四\" || txt == \"星期五\" || txt == \"星期六\" || txt == \"星期日\"){\r\n                isChnWeek3 = true;\r\n            }\r\n            else{\r\n                isChnWeek3 = false;\r\n            }\r\n        }\r\n        else{\r\n            isChnWeek3 = false;\r\n        }\r\n\r\n        return isChnWeek3;\r\n    },\r\n    createIcon: function(){\r\n        let _this = this;\r\n\r\n        let copy_r = _this.copyRange[\"row\"][1],\r\n            copy_c = _this.copyRange[\"column\"][1];\r\n        let apply_r = _this.applyRange[\"row\"][1],\r\n            apply_c = _this.applyRange[\"column\"][1];\r\n\r\n        let row_index, col_index;\r\n        if(apply_r >= copy_r && apply_c >= copy_c){\r\n            row_index = apply_r;\r\n            col_index = apply_c;\r\n        }\r\n        else{\r\n            row_index = copy_r;\r\n            col_index = copy_c;\r\n        }\r\n\r\n        let row = rowLocationByIndex(row_index)[1],\r\n            row_pre = rowLocationByIndex(row_index)[0];\r\n        let col = colLocationByIndex(col_index)[1],\r\n            col_pre = colLocationByIndex(col_index)[0];\r\n\r\n        $(\"#luckysheet-dropCell-icon\").remove();\r\n        $(\"#luckysheet-cell-main\").append(_this.iconHtml);\r\n        $(\"#luckysheet-dropCell-icon\").css({\"left\": col, \"top\": row});\r\n\r\n        //点击icon\r\n        $(\"#luckysheet-dropCell-icon\").mouseover(function(){\r\n            $(this).css(\"background-color\", \"#ffe8e8\");\r\n        }).mouseleave(function(){\r\n            $(this).css(\"background-color\", \"#f1f1f1\");\r\n        }).mousedown(function(event){\r\n            $(\"#luckysheet-dropCell-typeList\").remove();\r\n            const _locale = locale();\r\n            const locale_dropCell = _locale.dropCell;\r\n            $(\"body\").append(replaceHtml(_this.typeListHtml,{\r\n                copyCell:locale_dropCell.copyCell,\r\n                sequence:locale_dropCell.sequence,\r\n                onlyFormat:locale_dropCell.onlyFormat,\r\n                noFormat:locale_dropCell.noFormat,\r\n                day:locale_dropCell.day,\r\n                workDay:locale_dropCell.workDay,\r\n                month:locale_dropCell.month,\r\n                year:locale_dropCell.year,\r\n                chineseNumber:locale_dropCell.chineseNumber,\r\n            }));\r\n\r\n            let typeItemHide = _this.typeItemHide();\r\n            if(!typeItemHide[0] && !typeItemHide[1] && !typeItemHide[2] && !typeItemHide[3] && !typeItemHide[4] && !typeItemHide[5] && !typeItemHide[6]){\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=1]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=4]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=5]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=6]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=7]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=8]\").hide();\r\n            }\r\n\r\n            if(!typeItemHide[2]){\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=4]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=5]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=6]\").hide();\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=7]\").hide();\r\n            }\r\n\r\n            if(!typeItemHide[3]){\r\n                $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=8]\").hide();\r\n            }\r\n\r\n            let left = $(this).offset().left;\r\n            let top = $(this).offset().top + 25;\r\n            let winH = $(window).height(), winW = $(window).width();\r\n            let menuW = $(\"#luckysheet-dropCell-typeList\").width(),\r\n                menuH = $(\"#luckysheet-dropCell-typeList\").height();\r\n\r\n            if (left + menuW > winW) {\r\n                left = left - menuW;\r\n            }\r\n\r\n            if (top + menuH > winH) {\r\n                top = top - menuH - 38;\r\n            }\r\n\r\n            if (top < 0) {\r\n                top = 0;\r\n            }\r\n\r\n            $(\"#luckysheet-dropCell-typeList\").css({\"left\": left, \"top\": top}).show();\r\n            $(\"#luckysheet-dropCell-icon\").mouseleave(function(){ $(this).css(\"backgroundColor\", \"#ffe8e8\") });\r\n\r\n            let type = _this.applyType;\r\n            $(\"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=\"+ type +\"]\").find(\"span\").append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n            event.stopPropagation();\r\n        });\r\n\r\n        //点击数据填充类型\r\n        $(document).off(\"click.dCtypeList\").on(\"click.dCtypeList\", \"#luckysheet-dropCell-typeList .luckysheet-cols-menuitem\", function(){\r\n            $(\"#luckysheet-dropCell-typeList .fa-check\").remove();\r\n            $(this).find(\"span\").append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n\r\n            let type = $(this).attr(\"data-type\");\r\n            _this.applyType = type;\r\n\r\n            _this.update();\r\n\r\n            $(\"#luckysheet-dropCell-typeList\").hide();\r\n            $(\"#luckysheet-dropCell-icon\").css(\"backgroundColor\", \"#f1f1f1\");\r\n            $(\"#luckysheet-dropCell-icon\").mouseleave(function(){ $(this).css(\"backgroundColor\", \"#f1f1f1\") });\r\n\r\n            countfunc();\r\n        });\r\n    },\r\n    typeItemHide: function(){\r\n        let _this = this;\r\n\r\n        let copyRange = _this.copyRange;\r\n        let str_r = copyRange[\"row\"][0], end_r = copyRange[\"row\"][1];\r\n        let str_c = copyRange[\"column\"][0], end_c = copyRange[\"column\"][1];\r\n\r\n        let hasNumber = false,\r\n            hasExtendNumber = false,\r\n            hasDate = false,\r\n            hasChn = false,\r\n            hasChnWeek1 = false,\r\n            hasChnWeek2 = false,\r\n            hasChnWeek3 = false;\r\n\r\n        for(let r = str_r; r <= end_r; r++){\r\n            for(let c = str_c; c <= end_c; c++){\r\n                if(!!Store.flowdata[r][c]){\r\n                    let cell = Store.flowdata[r][c];\r\n\r\n                    if(getObjType(cell) == \"object\" && cell[\"v\"] != null && cell[\"f\"] == null){\r\n                        if(cell[\"ct\"] != null && cell[\"ct\"].t == \"n\"){\r\n                            hasNumber = true;\r\n                        }\r\n                        else if(cell[\"ct\"] != null && cell[\"ct\"].t == \"d\"){\r\n                            hasDate = true;\r\n                        }\r\n                        else if(_this.isExtendNumber(cell[\"m\"])[0]){\r\n                            hasExtendNumber = true;\r\n                        }\r\n                        else if(_this.isChnNumber(cell[\"m\"]) && cell[\"m\"] != \"日\"){\r\n                            hasChn = true;\r\n                        }\r\n                        else if(cell[\"m\"] == \"日\"){\r\n                            hasChnWeek1 = true;\r\n                        }\r\n                        else if(_this.isChnWeek2(cell[\"m\"])){\r\n                            hasChnWeek2 = true;\r\n                        }\r\n                        else if(_this.isChnWeek3(cell[\"m\"])){\r\n                            hasChnWeek3 = true;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return [hasNumber, hasExtendNumber, hasDate, hasChn, hasChnWeek1, hasChnWeek2, hasChnWeek3];\r\n    },\r\n    update: function(){\r\n        let _this = this;\r\n\r\n        if(!checkProtectionLockedRangeList([_this.applyRange], Store.currentSheetIndex)){\r\n            return;\r\n        }\r\n\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        let borderInfoCompute = getBorderInfoCompute();\r\n        let dataVerification = $.extend(true, {}, file[\"dataVerification\"]);\r\n\r\n        let direction = _this.direction;\r\n        let type = _this.applyType;\r\n\r\n        //复制范围\r\n        let copyRange = _this.copyRange;\r\n        let copy_str_r = copyRange[\"row\"][0], copy_end_r = copyRange[\"row\"][1];\r\n        let copy_str_c = copyRange[\"column\"][0], copy_end_c = copyRange[\"column\"][1];\r\n        let copyData = _this.getCopyData(d, copy_str_r, copy_end_r, copy_str_c, copy_end_c, direction);\r\n\r\n        let csLen;\r\n        if(direction == \"down\" || direction == \"up\"){\r\n            csLen = copy_end_r - copy_str_r + 1;\r\n        }\r\n        else if(direction == \"right\" || direction == \"left\"){\r\n            csLen = copy_end_c - copy_str_c + 1;\r\n        }\r\n\r\n        //应用范围\r\n        let applyRange = _this.applyRange;\r\n        let apply_str_r = applyRange[\"row\"][0], apply_end_r = applyRange[\"row\"][1];\r\n        let apply_str_c = applyRange[\"column\"][0], apply_end_c = applyRange[\"column\"][1];\r\n\r\n        if(direction == \"down\" || direction == \"up\"){\r\n            let asLen = apply_end_r - apply_str_r + 1;\r\n\r\n            for(let i = apply_str_c; i <= apply_end_c; i++){\r\n                let copyD = copyData[i - apply_str_c];\r\n\r\n                let applyData = _this.getApplyData(copyD, csLen, asLen);\r\n\r\n                if(direction == \"down\"){\r\n                    for(let j = apply_str_r; j <= apply_end_r; j++){\r\n                        let cell = applyData[j - apply_str_r];\r\n\r\n                        if(cell.f != null){\r\n                            let f = \"=\" + formula.functionCopy(cell.f, \"down\", j - apply_str_r + 1);\r\n                            let v = formula.execfunction(f, j, i);\r\n\r\n                            formula.execFunctionGroup(j, i, v[1], undefined, d);\r\n\r\n                            cell.f = v[2];\r\n                            cell.v = v[1];\r\n\r\n                            if(cell.spl != null){\r\n                                cell.spl = v[3].data;\r\n                            }\r\n                            else{\r\n                                if(isRealNum(cell.v) && !/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(cell.v)){\r\n                                    if(cell.v == Infinity || cell.v == -Infinity){\r\n                                        cell.m = cell.v.toString();\r\n                                    }\r\n                                    else{\r\n                                        if(cell.v.toString().indexOf(\"e\") > -1){\r\n                                            let len = cell.v.toString().split(\".\")[1].split(\"e\")[0].length;\r\n                                            if(len > 5){\r\n                                                len = 5;\r\n                                            }\r\n\r\n                                            cell.m = cell.v.toExponential(len).toString();\r\n                                        }\r\n                                        else{\r\n                                            let mask;\r\n                                            if(cell.ct.fa === \"##0.00\"){\r\n                                               /* 如果是数字类型 */\r\n                                               mask = genarate(Math.round(cell.v * 1000000000) / 1000000000 + \".00\") ;\r\n                                               cell.m = mask[0].toString();\r\n                                            }else {\r\n                                                mask = genarate(Math.round(cell.v * 1000000000) / 1000000000);\r\n                                                cell.m = mask[0].toString();\r\n                                            }\r\n                                        }\r\n                                    }\r\n\r\n                                    cell.ct = cell.ct || { \"fa\": \"General\", \"t\": \"n\" };\r\n                                }\r\n                                else{\r\n                                    let mask = genarate(cell.v);\r\n                                    cell.m = mask[0].toString();\r\n                                    cell.ct = mask[1];\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        d[j][i] = cell;\r\n\r\n                        //边框\r\n                        let bd_r = copy_str_r + (j - apply_str_r) % csLen;\r\n                        let bd_c = i;\r\n\r\n                        if(borderInfoCompute[bd_r + \"_\" + bd_c]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": j,\r\n                                    \"col_index\": i,\r\n                                    \"l\": borderInfoCompute[bd_r + \"_\" + bd_c].l,\r\n                                    \"r\": borderInfoCompute[bd_r + \"_\" + bd_c].r,\r\n                                    \"t\": borderInfoCompute[bd_r + \"_\" + bd_c].t,\r\n                                    \"b\": borderInfoCompute[bd_r + \"_\" + bd_c].b\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n                        else if(borderInfoCompute[j + \"_\" + i]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": j,\r\n                                    \"col_index\": i,\r\n                                    \"l\": null,\r\n                                    \"r\": null,\r\n                                    \"t\": null,\r\n                                    \"b\": null\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n\r\n                        //数据验证\r\n                        if(dataVerification[bd_r + \"_\" + bd_c]){\r\n                            dataVerification[j + \"_\" + i] = dataVerification[bd_r + \"_\" + bd_c];\r\n                        }\r\n                    }\r\n                }\r\n                if(direction == \"up\"){\r\n                    for(let j = apply_end_r; j >= apply_str_r; j--){\r\n                        let cell = applyData[apply_end_r - j];\r\n\r\n                        if(cell.f != null){\r\n                            let f = \"=\" + formula.functionCopy(cell.f, \"up\", apply_end_r - j + 1);\r\n                            let v = formula.execfunction(f, j, i);\r\n\r\n                            formula.execFunctionGroup(j, i, v[1], undefined, d);\r\n\r\n                            cell.f = v[2];\r\n                            cell.v = v[1];\r\n\r\n                            if(cell.spl != null){\r\n                                cell.spl = v[3].data;\r\n                            }\r\n                            else{\r\n                                if(isRealNum(cell.v) && !/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(cell.v)){\r\n                                    if(cell.v == Infinity || cell.v == -Infinity){\r\n                                        cell.m = cell.v.toString();\r\n                                    }\r\n                                    else{\r\n                                        if(cell.v.toString().indexOf(\"e\") > -1){\r\n                                            let len = cell.v.toString().split(\".\")[1].split(\"e\")[0].length;\r\n                                            if(len > 5){\r\n                                                len = 5;\r\n                                            }\r\n\r\n                                            cell.m = cell.v.toExponential(len).toString();\r\n                                        }\r\n                                        else{\r\n                                            let mask = genarate(Math.round(cell.v * 1000000000) / 1000000000);\r\n                                            cell.m = mask[0].toString();\r\n                                        }\r\n                                    }\r\n\r\n                                    cell.ct = { \"fa\": \"General\", \"t\": \"n\" };\r\n                                }\r\n                                else{\r\n                                    let mask = genarate(cell.v);\r\n                                    cell.m = mask[0].toString();\r\n                                    cell.ct = mask[1];\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        d[j][i] = cell;\r\n\r\n                        //边框\r\n                        let bd_r = copy_end_r - (apply_end_r - j) % csLen;\r\n                        let bd_c = i;\r\n\r\n                        if(borderInfoCompute[bd_r + \"_\" + bd_c]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": j,\r\n                                    \"col_index\": i,\r\n                                    \"l\": borderInfoCompute[bd_r + \"_\" + bd_c].l,\r\n                                    \"r\": borderInfoCompute[bd_r + \"_\" + bd_c].r,\r\n                                    \"t\": borderInfoCompute[bd_r + \"_\" + bd_c].t,\r\n                                    \"b\": borderInfoCompute[bd_r + \"_\" + bd_c].b\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n                        else if(borderInfoCompute[j + \"_\" + i]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": j,\r\n                                    \"col_index\": i,\r\n                                    \"l\": null,\r\n                                    \"r\": null,\r\n                                    \"t\": null,\r\n                                    \"b\": null\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n\r\n                        //数据验证\r\n                        if(dataVerification[bd_r + \"_\" + bd_c]){\r\n                            dataVerification[j + \"_\" + i] = dataVerification[bd_r + \"_\" + bd_c];\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if(direction == \"right\" || direction == \"left\"){\r\n            let asLen = apply_end_c - apply_str_c + 1;\r\n\r\n            for(let i = apply_str_r; i <= apply_end_r; i++){\r\n                let copyD = copyData[i - apply_str_r];\r\n\r\n                let applyData = _this.getApplyData(copyD, csLen, asLen);\r\n\r\n                if(direction == \"right\"){\r\n                    for(let j = apply_str_c; j <= apply_end_c; j++){\r\n                        let cell = applyData[j - apply_str_c];\r\n\r\n                        if(cell.f != null){\r\n                            let f = \"=\" + formula.functionCopy(cell.f, \"right\", j - apply_str_c + 1);\r\n                            let v = formula.execfunction(f, i, j);\r\n\r\n                            formula.execFunctionGroup(i, j, v[1], undefined, d);\r\n\r\n                            cell.f = v[2];\r\n                            cell.v = v[1];\r\n\r\n                            if(cell.spl != null){\r\n                                cell.spl = v[3].data;\r\n                            }\r\n                            else{\r\n                                if(isRealNum(cell.v) && !/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(cell.v)){\r\n                                    if(cell.v == Infinity || cell.v == -Infinity){\r\n                                        cell.m = cell.v.toString();\r\n                                    }\r\n                                    else{\r\n                                        if(cell.v.toString().indexOf(\"e\") > -1){\r\n                                            let len = cell.v.toString().split(\".\")[1].split(\"e\")[0].length;\r\n                                            if(len > 5){\r\n                                                len = 5;\r\n                                            }\r\n\r\n                                            cell.m = cell.v.toExponential(len).toString();\r\n                                        }\r\n                                        else{\r\n                                            let mask = genarate(Math.round(cell.v * 1000000000) / 1000000000);\r\n                                            cell.m = mask[0].toString();\r\n                                        }\r\n                                    }\r\n\r\n                                    cell.ct = { \"fa\": \"General\", \"t\": \"n\" };\r\n                                }\r\n                                else{\r\n                                    let mask = genarate(cell.v);\r\n                                    cell.m = mask[0].toString();\r\n                                    cell.ct = mask[1];\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        d[i][j] = cell;\r\n\r\n                        //边框\r\n                        let bd_r = i;\r\n                        let bd_c = copy_str_c + (j - apply_str_c) % csLen;\r\n\r\n                        if(borderInfoCompute[bd_r + \"_\" + bd_c]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": i,\r\n                                    \"col_index\": j,\r\n                                    \"l\": borderInfoCompute[bd_r + \"_\" + bd_c].l,\r\n                                    \"r\": borderInfoCompute[bd_r + \"_\" + bd_c].r,\r\n                                    \"t\": borderInfoCompute[bd_r + \"_\" + bd_c].t,\r\n                                    \"b\": borderInfoCompute[bd_r + \"_\" + bd_c].b\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n                        else if(borderInfoCompute[i + \"_\" + j]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": i,\r\n                                    \"col_index\": j,\r\n                                    \"l\": null,\r\n                                    \"r\": null,\r\n                                    \"t\": null,\r\n                                    \"b\": null\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n\r\n                        //数据验证\r\n                        if(dataVerification[bd_r + \"_\" + bd_c]){\r\n                            dataVerification[i + \"_\" + j] = dataVerification[bd_r + \"_\" + bd_c];\r\n                        }\r\n                    }\r\n                }\r\n                if(direction == \"left\"){\r\n                    for(let j = apply_end_c; j >= apply_str_c; j--){\r\n                        let cell = applyData[apply_end_c - j];\r\n\r\n                        if(cell.f != null){\r\n                            let f = \"=\" + formula.functionCopy(cell.f, \"left\", apply_end_c - j + 1);\r\n                            let v = formula.execfunction(f, i, j);\r\n\r\n                            formula.execFunctionGroup(i, j, v[1], undefined, d);\r\n\r\n                            cell.f = v[2];\r\n                            cell.v = v[1];\r\n\r\n                            if(cell.spl != null){\r\n                                cell.spl = v[3].data;\r\n                            }\r\n                            else{\r\n                                if(isRealNum(cell.v) && !/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(cell.v)){\r\n                                    if(cell.v == Infinity || cell.v == -Infinity){\r\n                                        cell.m = cell.v.toString();\r\n                                    }\r\n                                    else{\r\n                                        if(cell.v.toString().indexOf(\"e\") > -1){\r\n                                            let len = cell.v.toString().split(\".\")[1].split(\"e\")[0].length;\r\n                                            if(len > 5){\r\n                                                len = 5;\r\n                                            }\r\n\r\n                                            cell.m = cell.v.toExponential(len).toString();\r\n                                        }\r\n                                        else{\r\n                                            let mask = genarate(Math.round(cell.v * 1000000000) / 1000000000);\r\n                                            cell.m = mask[0].toString();\r\n                                        }\r\n                                    }\r\n\r\n                                    cell.ct = { \"fa\": \"General\", \"t\": \"n\" };\r\n                                }\r\n                                else{\r\n                                    let mask = genarate(cell.v);\r\n                                    cell.m = mask[0].toString();\r\n                                    cell.ct = mask[1];\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        d[i][j] = cell;\r\n\r\n                        //边框\r\n                        let bd_r = i;\r\n                        let bd_c = copy_end_c - (apply_end_c - j) % csLen;\r\n\r\n                        if(borderInfoCompute[bd_r + \"_\" + bd_c]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": i,\r\n                                    \"col_index\": j,\r\n                                    \"l\": borderInfoCompute[bd_r + \"_\" + bd_c].l,\r\n                                    \"r\": borderInfoCompute[bd_r + \"_\" + bd_c].r,\r\n                                    \"t\": borderInfoCompute[bd_r + \"_\" + bd_c].t,\r\n                                    \"b\": borderInfoCompute[bd_r + \"_\" + bd_c].b\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n                        else if(borderInfoCompute[i + \"_\" + j]){\r\n                            let bd_obj = {\r\n                                \"rangeType\": \"cell\",\r\n                                \"value\": {\r\n                                    \"row_index\": i,\r\n                                    \"col_index\": j,\r\n                                    \"l\": null,\r\n                                    \"r\": null,\r\n                                    \"t\": null,\r\n                                    \"b\": null\r\n                                }\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n\r\n                        //数据验证\r\n                        if(dataVerification[bd_r + \"_\" + bd_c]){\r\n                            dataVerification[i + \"_\" + j] = dataVerification[bd_r + \"_\" + bd_c];\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        //条件格式\r\n        let cdformat = $.extend(true, [], file[\"luckysheet_conditionformat_save\"]);\r\n        if(cdformat != null && cdformat.length > 0){\r\n            for(let i = 0; i < cdformat.length; i++){\r\n                let cdformat_cellrange = cdformat[i].cellrange;\r\n\r\n                let emptyRange = [];\r\n\r\n                for(let j = 0; j < cdformat_cellrange.length; j++){\r\n                    let range = conditionformat.CFSplitRange(cdformat_cellrange[j], {\"row\": copyRange[\"row\"], \"column\": copyRange[\"column\"]}, {\"row\": applyRange[\"row\"], \"column\": applyRange[\"column\"]}, \"operatePart\");\r\n                    if(range.length > 0){\r\n                        emptyRange = emptyRange.concat(range);\r\n                    }\r\n                }\r\n\r\n                if(emptyRange.length > 0){\r\n                    cdformat[i].cellrange.push(applyRange);\r\n                }\r\n            }\r\n        }\r\n\r\n        //刷新一次表格\r\n        let allParam = {\r\n            \"cfg\": cfg,\r\n            \"cdformat\": cdformat,\r\n            \"dataVerification\": dataVerification\r\n        }\r\n        jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n\r\n        selectHightlightShow();\r\n    },\r\n    getCopyData: function(d, r1, r2, c1, c2, direction){\r\n        let _this = this;\r\n\r\n        let copyData = [];\r\n\r\n        let a1, a2, b1, b2;\r\n        if(direction == \"down\" || direction == \"up\"){\r\n            a1 = c1;\r\n            a2 = c2;\r\n            b1 = r1;\r\n            b2 = r2;\r\n        }\r\n        else if(direction == \"right\" || direction == \"left\"){\r\n            a1 = r1;\r\n            a2 = r2;\r\n            b1 = c1;\r\n            b2 = c2;\r\n        }\r\n\r\n        for(let a = a1; a <= a2; a++){\r\n            let obj = {};\r\n\r\n            let arrData = [];\r\n            let arrIndex = [];\r\n            let text = \"\";\r\n            let extendNumberBeforeStr = null;\r\n            let extendNumberAfterStr = null;\r\n            let isSameStr = true;\r\n\r\n            for(let b = b1; b <= b2; b++){\r\n                //单元格\r\n                let data;\r\n                if(direction == \"down\" || direction == \"up\"){\r\n                    data = d[b][a];\r\n                }\r\n                else if(direction == \"right\" || direction == \"left\"){\r\n                    data = d[a][b];\r\n                }\r\n\r\n                //单元格值类型\r\n                let str;\r\n                if(!!data && !!data[\"v\"] && data[\"f\"] == null){\r\n                    if(!!data[\"ct\"] && data[\"ct\"][\"t\"] == \"n\"){\r\n                        str = \"number\";\r\n                        extendNumberBeforeStr = null;\r\n                        extendNumberAfterStr = null;\r\n                    }\r\n                    else if(!!data[\"ct\"] && data[\"ct\"][\"t\"] == \"d\"){\r\n                        str = \"date\";\r\n                        extendNumberBeforeStr = null;\r\n                        extendNumberAfterStr = null;\r\n                    }\r\n                    else if(_this.isExtendNumber(data[\"m\"])[0]){\r\n                        str = \"extendNumber\";\r\n\r\n                        let isExtendNumber = _this.isExtendNumber(data[\"m\"]);\r\n\r\n                        if(extendNumberBeforeStr == null || extendNumberAfterStr == null){\r\n                            isSameStr = true;\r\n                            extendNumberBeforeStr = isExtendNumber[2];\r\n                            extendNumberAfterStr = isExtendNumber[3];\r\n                        }\r\n                        else {\r\n                            if(isExtendNumber[2] != extendNumberBeforeStr || isExtendNumber[3] != extendNumberAfterStr){\r\n                                isSameStr = false;\r\n                                extendNumberBeforeStr = isExtendNumber[2];\r\n                                extendNumberAfterStr = isExtendNumber[3];\r\n                            }\r\n                            else {\r\n                                isSameStr = true;\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(_this.isChnNumber(data[\"m\"])){\r\n                        str = \"chnNumber\";\r\n                        extendNumberBeforeStr = null;\r\n                        extendNumberAfterStr = null;\r\n                    }\r\n                    else if(_this.isChnWeek2(data[\"m\"])){\r\n                        str = \"chnWeek2\";\r\n                        extendNumberBeforeStr = null;\r\n                        extendNumberAfterStr = null;\r\n                    }\r\n                    else if(_this.isChnWeek3(data[\"m\"])){\r\n                        str = \"chnWeek3\";\r\n                        extendNumberBeforeStr = null;\r\n                        extendNumberAfterStr = null;\r\n                    }\r\n                    else{\r\n                        str = \"other\";\r\n                        extendNumberBeforeStr = null;\r\n                        extendNumberAfterStr = null;\r\n                    }\r\n                }\r\n                else{\r\n                    str = \"other\";\r\n                    extendNumberBeforeStr = null;\r\n                    extendNumberAfterStr = null;\r\n                }\r\n\r\n                if(str == \"extendNumber\"){\r\n                    if(b == b1){\r\n                        if(b1 == b2){\r\n                            text = str;\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n\r\n                            obj[text] = [];\r\n                            obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                        }\r\n                        else{\r\n                            text = str;\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n                        }\r\n                    }\r\n                    else if(b == b2){\r\n                        if(text == str && isSameStr){\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                        }\r\n                        else{\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n\r\n                            text = str;\r\n                            arrData = [];\r\n                            arrData.push(data);\r\n                            arrIndex = [];\r\n                            arrIndex.push(b - b1 + 1);\r\n\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                        }\r\n                    }\r\n                    else{\r\n                        if(text == str && isSameStr){\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n                        }\r\n                        else{\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n\r\n                            text = str;\r\n                            arrData = [];\r\n                            arrData.push(data);\r\n                            arrIndex = [];\r\n                            arrIndex.push(b - b1 + 1);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    if(b == b1){\r\n                        if(b1 == b2){\r\n                            text = str;\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n\r\n                            obj[text] = [];\r\n                            obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                        }\r\n                        else{\r\n                            text = str;\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n                        }\r\n                    }\r\n                    else if(b == b2){\r\n                        if(text == str){\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                        }\r\n                        else{\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n\r\n                            text = str;\r\n                            arrData = [];\r\n                            arrData.push(data);\r\n                            arrIndex = [];\r\n                            arrIndex.push(b - b1 + 1);\r\n\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                        }\r\n                    }\r\n                    else{\r\n                        if(text == str){\r\n                            arrData.push(data);\r\n                            arrIndex.push(b - b1 + 1);\r\n                        }\r\n                        else{\r\n                            if(text in obj){\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n                            else{\r\n                                obj[text] = [];\r\n                                obj[text].push({\"data\": arrData, \"index\": arrIndex});\r\n                            }\r\n\r\n                            text = str;\r\n                            arrData = [];\r\n                            arrData.push(data);\r\n                            arrIndex = [];\r\n                            arrIndex.push(b - b1 + 1);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            copyData.push(obj);\r\n        }\r\n\r\n        return copyData;\r\n    },\r\n    getApplyData: function(copyD, csLen, asLen){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        let direction = _this.direction;\r\n        let type = _this.applyType;\r\n\r\n        let num = Math.floor(asLen / csLen);\r\n        let rsd = asLen % csLen;\r\n\r\n        //纯数字类型\r\n        let copyD_number = copyD[\"number\"];\r\n        let applyD_number = [];\r\n        if(!!copyD_number){\r\n            for(let i = 0; i < copyD_number.length; i++){\r\n                let s = _this.getLenS(copyD_number[i][\"index\"], rsd);\r\n                let len = copyD_number[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"1\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_number[i][\"data\"], len, direction, type, \"number\");\r\n                }\r\n                else if(type == \"2\"){\r\n                    arrData = _this.getDataByType(copyD_number[i][\"data\"], len, direction, type);\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_number[i][\"data\"], len, direction, \"0\");\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_number[i][\"index\"]);\r\n                applyD_number.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        //扩展数字型（即一串字符最后面的是数字）\r\n        let copyD_extendNumber = copyD[\"extendNumber\"];\r\n        let applyD_extendNumber = [];\r\n        if(!!copyD_extendNumber){\r\n            for(let i = 0; i < copyD_extendNumber.length; i++){\r\n                let s = _this.getLenS(copyD_extendNumber[i][\"index\"], rsd);\r\n                let len = copyD_extendNumber[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"1\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_extendNumber[i][\"data\"], len, direction, type, \"extendNumber\");\r\n                }\r\n                else if(type == \"2\"){\r\n                    arrData = _this.getDataByType(copyD_extendNumber[i][\"data\"], len, direction, type);\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_extendNumber[i][\"data\"], len, direction, \"0\");\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_extendNumber[i][\"index\"]);\r\n                applyD_extendNumber.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        //日期类型\r\n        let copyD_date = copyD[\"date\"];\r\n        let applyD_date = [];\r\n        if(!!copyD_date){\r\n            for(let i = 0; i < copyD_date.length; i++){\r\n                let s = _this.getLenS(copyD_date[i][\"index\"], rsd);\r\n                let len = copyD_date[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"1\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_date[i][\"data\"], len, direction, type, \"date\");\r\n                }\r\n                else if(type == \"8\"){\r\n                    arrData = _this.getDataByType(copyD_date[i][\"data\"], len, direction, \"0\");\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_date[i][\"data\"], len, direction, type);\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_date[i][\"index\"]);\r\n                applyD_date.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        //中文小写数字 或 一~日\r\n        let copyD_chnNumber = copyD[\"chnNumber\"];\r\n        let applyD_chnNumber = [];\r\n        if(!!copyD_chnNumber){\r\n            for(let i = 0; i < copyD_chnNumber.length; i++){\r\n                let s = _this.getLenS(copyD_chnNumber[i][\"index\"], rsd);\r\n                let len = copyD_chnNumber[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"1\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_chnNumber[i][\"data\"], len, direction, type, \"chnNumber\");\r\n                }\r\n                else if(type == \"2\" || type == \"8\"){\r\n                    arrData = _this.getDataByType(copyD_chnNumber[i][\"data\"], len, direction, type);\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_chnNumber[i][\"data\"], len, direction, \"0\");\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_chnNumber[i][\"index\"]);\r\n                applyD_chnNumber.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        //周一~周日\r\n        let copyD_chnWeek2 = copyD[\"chnWeek2\"];\r\n        let applyD_chnWeek2 = [];\r\n        if(!!copyD_chnWeek2){\r\n            for(let i = 0; i < copyD_chnWeek2.length; i++){\r\n                let s = _this.getLenS(copyD_chnWeek2[i][\"index\"], rsd);\r\n                let len = copyD_chnWeek2[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"1\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_chnWeek2[i][\"data\"], len, direction, type, \"chnWeek2\");\r\n                }\r\n                else if(type == \"2\"){\r\n                    arrData = _this.getDataByType(copyD_chnWeek2[i][\"data\"], len, direction, type);\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_chnWeek2[i][\"data\"], len, direction, \"0\");\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_chnWeek2[i][\"index\"]);\r\n                applyD_chnWeek2.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        //星期一~星期日\r\n        let copyD_chnWeek3 = copyD[\"chnWeek3\"];\r\n        let applyD_chnWeek3 = [];\r\n        if(!!copyD_chnWeek3){\r\n            for(let i = 0; i < copyD_chnWeek3.length; i++){\r\n                let s = _this.getLenS(copyD_chnWeek3[i][\"index\"], rsd);\r\n                let len = copyD_chnWeek3[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"1\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_chnWeek3[i][\"data\"], len, direction, type, \"chnWeek3\");\r\n                }\r\n                else if(type == \"2\"){\r\n                    arrData = _this.getDataByType(copyD_chnWeek3[i][\"data\"], len, direction, type);\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_chnWeek3[i][\"data\"], len, direction, \"0\");\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_chnWeek3[i][\"index\"]);\r\n                applyD_chnWeek3.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        //其它\r\n        let copyD_other = copyD[\"other\"];\r\n        let applyD_other = [];\r\n        if(!!copyD_other){\r\n            for(let i = 0; i < copyD_other.length; i++){\r\n                let s = _this.getLenS(copyD_other[i][\"index\"], rsd);\r\n                let len = copyD_other[i][\"index\"].length * num + s;\r\n\r\n                let arrData;\r\n                if(type == \"2\" || type == \"3\"){\r\n                    arrData = _this.getDataByType(copyD_other[i][\"data\"], len, direction, type);\r\n                }\r\n                else{\r\n                    arrData = _this.getDataByType(copyD_other[i][\"data\"], len, direction, \"0\");\r\n                }\r\n\r\n                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_other[i][\"index\"]);\r\n                applyD_other.push({\"data\": arrData, \"index\": arrIndex});\r\n            }\r\n        }\r\n\r\n        for(let x = 1; x <= asLen; x++){\r\n            if(applyD_number.length > 0){\r\n                for(let y = 0; y < applyD_number.length; y++){\r\n                    if(x in applyD_number[y][\"index\"]){\r\n                        applyData.push(applyD_number[y][\"data\"][applyD_number[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(applyD_extendNumber.length > 0){\r\n                for(let y = 0; y < applyD_extendNumber.length; y++){\r\n                    if(x in applyD_extendNumber[y][\"index\"]){\r\n                        applyData.push(applyD_extendNumber[y][\"data\"][applyD_extendNumber[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(applyD_date.length > 0){\r\n                for(let y = 0; y < applyD_date.length; y++){\r\n                    if(x in applyD_date[y][\"index\"]){\r\n                        applyData.push(applyD_date[y][\"data\"][applyD_date[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(applyD_chnNumber.length > 0){\r\n                for(let y = 0; y < applyD_chnNumber.length; y++){\r\n                    if(x in applyD_chnNumber[y][\"index\"]){\r\n                        applyData.push(applyD_chnNumber[y][\"data\"][applyD_chnNumber[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(applyD_chnWeek2.length > 0){\r\n                for(let y = 0; y < applyD_chnWeek2.length; y++){\r\n                    if(x in applyD_chnWeek2[y][\"index\"]){\r\n                        applyData.push(applyD_chnWeek2[y][\"data\"][applyD_chnWeek2[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(applyD_chnWeek3.length > 0){\r\n                for(let y = 0; y < applyD_chnWeek3.length; y++){\r\n                    if(x in applyD_chnWeek3[y][\"index\"]){\r\n                        applyData.push(applyD_chnWeek3[y][\"data\"][applyD_chnWeek3[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(applyD_other.length > 0){\r\n                for(let y = 0; y < applyD_other.length; y++){\r\n                    if(x in applyD_other[y][\"index\"]){\r\n                        applyData.push(applyD_other[y][\"data\"][applyD_other[y][\"index\"][x]]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    getLenS: function(indexArr, rsd){\r\n        let s = 0;\r\n\r\n        for(let j = 0; j < indexArr.length; j++){\r\n            if(indexArr[j] <= rsd){\r\n                s++;\r\n            }\r\n            else{\r\n                break;\r\n            }\r\n        }\r\n\r\n        return s;\r\n    },\r\n    getDataIndex: function(csLen, asLen, indexArr){\r\n        let obj = {};\r\n\r\n        let num = Math.floor(asLen / csLen);\r\n        let rsd = asLen % csLen;\r\n\r\n        let sum = 0;\r\n        if(num > 0){\r\n            for(let i = 1; i <= num; i++){\r\n                for(let j = 0; j < indexArr.length; j++){\r\n                    obj[indexArr[j] + (i - 1) * csLen] = sum;\r\n                    sum++;\r\n                }\r\n            }\r\n            for(let a = 0; a < indexArr.length; a++){\r\n                if(indexArr[a] <= rsd){\r\n                    obj[indexArr[a] + csLen * num] = sum;\r\n                    sum++;\r\n                }\r\n                else{\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            for(let a = 0; a < indexArr.length; a++){\r\n                if(indexArr[a] <= rsd){\r\n                    obj[indexArr[a]] = sum;\r\n                    sum++;\r\n                }\r\n                else{\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        return obj;\r\n    },\r\n    getDataByType: function(data, len, direction, type ,dataType){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        if(type == \"0\"){ //复制单元格\r\n            if(direction == \"up\" || direction == \"left\"){\r\n                data.reverse();\r\n            }\r\n\r\n            applyData = _this.FillCopy(data, len);\r\n        }\r\n        else if(type == \"1\"){ //填充序列\r\n            if(dataType == \"number\"){\r\n                //数据类型是 数字\r\n                applyData = _this.FillSeries(data, len, direction);\r\n            }\r\n            else if(dataType == \"extendNumber\"){\r\n                //扩展数字\r\n                if(data.length == 1){\r\n                    let step;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step = -1;\r\n                    }\r\n\r\n                    applyData = _this.FillExtendNumber(data, len, step);\r\n                }\r\n                else{\r\n                    let dataNumArr = [];\r\n\r\n                    for(let i = 0; i < data.length; i++){\r\n                        let txt = data[i][\"m\"];\r\n                        dataNumArr.push(Number(_this.isExtendNumber(txt)[1]));\r\n                    }\r\n\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                        dataNumArr.reverse();\r\n                    }\r\n\r\n                    if(_this.isEqualDiff(dataNumArr)){\r\n                        //等差数列，以等差为step\r\n                        let step = dataNumArr[1] - dataNumArr[0];\r\n                        applyData = _this.FillExtendNumber(data, len, step);\r\n                    }\r\n                    else{\r\n                        //不是等差数列，复制数据\r\n                        applyData = _this.FillCopy(data, len);\r\n                    }\r\n                }\r\n            }\r\n            else if(dataType == \"date\"){\r\n                //数据类型是 日期\r\n                if(data.length == 1){\r\n                    //以一天为step\r\n                    let step;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step = -1;\r\n                    }\r\n\r\n                    applyData = _this.FillDays(data, len, step);\r\n                }\r\n                else{\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let judgeDate = _this.judgeDate(data);\r\n                    if(judgeDate[0] && judgeDate[3]){\r\n                        //日一样，月差为等差数列，以月差为step\r\n                        let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n                        applyData = _this.FillMonths(data, len, step);\r\n                    }\r\n                    else if(!judgeDate[0] && judgeDate[2]){\r\n                        //日不一样，日差为等差数列，以日差为step\r\n                        let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"days\");\r\n                        applyData = _this.FillDays(data, len, step);\r\n                    }\r\n                    else{\r\n                        //其它，复制数据\r\n                        applyData = _this.FillCopy(data, len);\r\n                    }\r\n                }\r\n            }\r\n            else if(dataType == \"chnNumber\"){\r\n                //数据类型是 中文小写数字\r\n                if(data.length == 1){\r\n                    if(data[0][\"m\"] == \"日\" || _this.ChineseToNumber(data[0][\"m\"]) < 7){\r\n                        //数字小于7，以周一~周日序列填充\r\n                        let step;\r\n                        if(direction == \"down\" || direction == \"right\"){\r\n                            step = 1;\r\n                        }\r\n                        else if(direction == \"up\" || direction == \"left\"){\r\n                            step = -1;\r\n                        }\r\n\r\n                        applyData = _this.FillChnWeek(data, len, step);\r\n                    }\r\n                    else{\r\n                        //数字大于7，以中文小写数字序列填充\r\n                        let step\r\n                        if(direction == \"down\" || direction == \"right\"){\r\n                            step = 1;\r\n                        }\r\n                        else if(direction == \"up\" || direction == \"left\"){\r\n                            step = -1;\r\n                        }\r\n\r\n                        applyData = _this.FillChnNumber(data, len, step);\r\n                    }\r\n                }\r\n                else{\r\n                    let hasweek = false;\r\n                    for(let i = 0; i < data.length; i++){\r\n                        if(data[i][\"m\"] == \"日\"){\r\n                            hasweek = true;\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    let dataNumArr = [];\r\n                    let weekIndex = 0;\r\n                    for(let i = 0; i < data.length; i++){\r\n                        if(data[i][\"m\"] == \"日\"){\r\n                            if(i == 0){\r\n                                dataNumArr.push(0);\r\n                            }\r\n                            else{\r\n                                weekIndex++;\r\n                                dataNumArr.push(weekIndex * 7);\r\n                            }\r\n                        }\r\n                        else if(hasweek && _this.ChineseToNumber(data[i][\"m\"]) > 0 && _this.ChineseToNumber(data[i][\"m\"]) < 7){\r\n                            dataNumArr.push(_this.ChineseToNumber(data[i][\"m\"]) + weekIndex * 7);\r\n                        }\r\n                        else{\r\n                            dataNumArr.push(_this.ChineseToNumber(data[i][\"m\"]));\r\n                        }\r\n                    }\r\n\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                        dataNumArr.reverse();\r\n                    }\r\n\r\n                    if(_this.isEqualDiff(dataNumArr)){\r\n                        if(hasweek || (dataNumArr[dataNumArr.length - 1] < 6 && dataNumArr[0] > 0) || (dataNumArr[0] < 6 && dataNumArr[dataNumArr.length - 1] > 0)){\r\n                            //以周一~周日序列填充\r\n                            let step = dataNumArr[1] - dataNumArr[0];\r\n                            applyData = _this.FillChnWeek(data, len, step);\r\n                        }\r\n                        else{\r\n                            //以中文小写数字序列填充\r\n                            let step = dataNumArr[1] - dataNumArr[0];\r\n                            applyData = _this.FillChnNumber(data, len, step);\r\n                        }\r\n                    }\r\n                    else{\r\n                        //不是等差数列，复制数据\r\n                        applyData = _this.FillCopy(data, len);\r\n                    }\r\n                }\r\n            }\r\n            else if(dataType == \"chnWeek2\"){\r\n                //周一~周日\r\n                if(data.length == 1){\r\n                    let step;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step = -1;\r\n                    }\r\n\r\n                    applyData = _this.FillChnWeek2(data, len, step);\r\n                }\r\n                else{\r\n                    let dataNumArr = [];\r\n                    let weekIndex = 0;\r\n\r\n                    for(let i = 0; i < data.length; i++){\r\n                        let lastTxt = data[i][\"m\"].substr(data[i][\"m\"].length - 1, 1);\r\n                        if(data[i][\"m\"] == \"周日\"){\r\n                            if(i == 0){\r\n                                dataNumArr.push(0);\r\n                            }\r\n                            else{\r\n                                weekIndex++;\r\n                                dataNumArr.push(weekIndex * 7);\r\n                            }\r\n                        }\r\n                        else{\r\n                            dataNumArr.push(_this.ChineseToNumber(lastTxt) + weekIndex * 7);\r\n                        }\r\n                    }\r\n\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                        dataNumArr.reverse();\r\n                    }\r\n\r\n                    if(_this.isEqualDiff(dataNumArr)){\r\n                        //等差数列，以等差为step\r\n                        let step = dataNumArr[1] - dataNumArr[0];\r\n                        applyData = _this.FillChnWeek2(data, len, step);\r\n                    }\r\n                    else{\r\n                        //不是等差数列，复制数据\r\n                        applyData = _this.FillCopy(data, len);\r\n                    }\r\n                }\r\n            }\r\n            else if(dataType == \"chnWeek3\"){\r\n                //星期一~星期日\r\n                if(data.length == 1){\r\n                    let step;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step = -1;\r\n                    }\r\n\r\n                    applyData = _this.FillChnWeek3(data, len, step);\r\n                }\r\n                else{\r\n                    let dataNumArr = [];\r\n                    let weekIndex = 0;\r\n\r\n                    for(let i = 0; i < data.length; i++){\r\n                        let lastTxt = data[i][\"m\"].substr(data[i][\"m\"].length - 1, 1);\r\n                        if(data[i][\"m\"] == \"星期日\"){\r\n                            if(i == 0){\r\n                                dataNumArr.push(0);\r\n                            }\r\n                            else{\r\n                                weekIndex++;\r\n                                dataNumArr.push(weekIndex * 7);\r\n                            }\r\n                        }\r\n                        else{\r\n                            dataNumArr.push(_this.ChineseToNumber(lastTxt) + weekIndex * 7);\r\n                        }\r\n                    }\r\n\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                        dataNumArr.reverse();\r\n                    }\r\n\r\n                    if(_this.isEqualDiff(dataNumArr)){\r\n                        //等差数列，以等差为step\r\n                        let step = dataNumArr[1] - dataNumArr[0];\r\n                        applyData = _this.FillChnWeek3(data, len, step);\r\n                    }\r\n                    else{\r\n                        //不是等差数列，复制数据\r\n                        applyData = _this.FillCopy(data, len);\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                //数据类型是 其它\r\n                if(direction == \"up\" || direction == \"left\"){\r\n                    data.reverse();\r\n                }\r\n\r\n                applyData = _this.FillCopy(data, len);\r\n            }\r\n        }\r\n        else if(type == \"2\"){ //仅填充格式\r\n            if(direction == \"up\" || direction == \"left\"){\r\n                data.reverse();\r\n            }\r\n\r\n            applyData = _this.FillOnlyFormat(data, len);\r\n        }\r\n        else if(type == \"3\"){ //不带格式填充\r\n            let dataArr = _this.getDataByType(data, len, direction, \"1\" ,dataType);\r\n            applyData = _this.FillWithoutFormat(dataArr);\r\n        }\r\n        else if(type == \"4\"){ //以天数填充\r\n            if(data.length == 1){\r\n                //以一天为step\r\n                let step;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    step = 1;\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    step = -1;\r\n                }\r\n\r\n                applyData = _this.FillDays(data, len, step);\r\n            }\r\n            else if(data.length == 2){\r\n                //以日差为step\r\n                if(direction == \"up\" || direction == \"left\"){\r\n                    data.reverse();\r\n                }\r\n\r\n                let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"days\");\r\n                applyData = _this.FillDays(data, len, step);\r\n            }\r\n            else{\r\n                if(direction == \"up\" || direction == \"left\"){\r\n                    data.reverse();\r\n                }\r\n\r\n                let judgeDate = _this.judgeDate(data);\r\n                if(judgeDate[0] && judgeDate[3]){\r\n                    //日一样，且月差为等差数列，以月差为step\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n                    applyData = _this.FillMonths(data, len, step);\r\n                }\r\n                else if(!judgeDate[0] && judgeDate[2]){\r\n                    //日不一样，且日差为等差数列，以日差为step\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"days\");\r\n                    applyData = _this.FillDays(data, len, step);\r\n                }\r\n                else{\r\n                    //日差不是等差数列，复制数据\r\n                    applyData = _this.FillCopy(data, len);\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"5\"){ //以工作日填充\r\n            if(data.length == 1){\r\n                //以一天为step（若那天为休息日，则跳过）\r\n                let step;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    step = 1;\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    step = -1;\r\n                }\r\n\r\n                let newLen = Math.round(len * 1.5);\r\n                for(let i = 1; i <= newLen; i++){\r\n                    let d = $.extend(true, {}, data[0]);\r\n\r\n                    let day = dayjs(d[\"m\"]).add(i, \"days\").day();\r\n                    if(day == 0 || day == 6){\r\n                        continue;\r\n                    }\r\n\r\n                    let date = dayjs(d[\"m\"]).add(step * i, \"days\").format(\"YYYY-MM-DD\");\r\n                    d[\"m\"] = date;\r\n                    d[\"v\"] = genarate(date)[2];\r\n                    applyData.push(d);\r\n\r\n                    if(applyData.length == len){\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n            else if(data.length == 2){\r\n                if(dayjs(data[1][\"m\"]).date() == dayjs(data[0][\"m\"]).date() && dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\") != 0){\r\n                    //日一样，且月差大于一月，以月差为step（若那天为休息日，则向前取最近的工作日）\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n\r\n                    for(let i = 1; i <= len; i++){\r\n                        let index = (i - 1) % data.length;\r\n                        let d = $.extend(true, {}, data[index]);\r\n\r\n                        let day = dayjs(data[data.length - 1]).add(step * i, \"months\").day(),\r\n                            date;\r\n                        if(day == 0){\r\n                            date = dayjs(data[data.length - 1]).add(step * i, \"months\").subtract(2, \"days\").format(\"YYYY-MM-DD\");\r\n                        }\r\n                        else if(day == 6){\r\n                            date = dayjs(data[data.length - 1]).add(step * i, \"months\").subtract(1, \"days\").format(\"YYYY-MM-DD\");\r\n                        }\r\n                        else{\r\n                            date = dayjs(data[data.length - 1]).add(step * i, \"months\").format(\"YYYY-MM-DD\");\r\n                        }\r\n\r\n                        d[\"m\"] = date;\r\n                        d[\"v\"] = genarate(date)[2];\r\n                        applyData.push(d);\r\n                    }\r\n                }\r\n                else{\r\n                    //日不一样\r\n                    if(Math.abs(dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]))) > 7){\r\n                        //若日差大于7天，以一月为step（若那天是休息日，则向前取最近的工作日）\r\n                        let step_month;\r\n                        if(direction == \"down\" || direction == \"right\"){\r\n                            step_month = 1;\r\n                        }\r\n                        else if(direction == \"up\" || direction == \"left\"){\r\n                            step_month = -1;\r\n                            data.reverse();\r\n                        }\r\n\r\n                        let step; //以数组第一个为对比\r\n                        for(let i = 1; i <= len; i++){\r\n                            let index = (i - 1) % data.length;\r\n                            let d = $.extend(true, {}, data[index]);\r\n\r\n                            let num = Math.ceil(i / data.length);\r\n                            if(index == 0){\r\n                                step = dayjs(d[\"m\"]).add(step_month * num, \"months\").diff(dayjs(d[\"m\"]), \"days\");\r\n                            }\r\n\r\n                            let day = dayjs(d[\"m\"]).add(step, \"days\").day(),\r\n                                date;\r\n                            if(day == 0){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(2, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else if(day == 6){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(1, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else{\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n\r\n                            d[\"m\"] = date;\r\n                            d[\"v\"] = genarate(date)[2];\r\n                            applyData.push(d);\r\n                        }\r\n                    }\r\n                    else{\r\n                        //若日差小于等于7天，以7天为step（若那天是休息日，则向前取最近的工作日）\r\n                        let step_day;\r\n                        if(direction == \"down\" || direction == \"right\"){\r\n                            step_day = 7;\r\n                        }\r\n                        else if(direction == \"up\" || direction == \"left\"){\r\n                            step_day = -7;\r\n                            data.reverse();\r\n                        }\r\n\r\n                        let step; //以数组第一个为对比\r\n                        for(let i = 1; i <= len; i++){\r\n                            let index = (i - 1) % data.length;\r\n                            let d = $.extend(true, {}, data[index]);\r\n\r\n                            let num = Math.ceil(i / data.length);\r\n                            if(index == 0){\r\n                                step = dayjs(d[\"m\"]).add(step_day * num, \"days\").diff(dayjs(d[\"m\"]), \"days\");\r\n                            }\r\n\r\n                            let day = dayjs(d[\"m\"]).add(step, \"days\").day(),\r\n                                date;\r\n                            if(day == 0){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(2, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else if(day == 6){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(1, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else{\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n\r\n                            d[\"m\"] = date;\r\n                            d[\"v\"] = genarate(date)[2];\r\n                            applyData.push(d);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                let judgeDate = _this.judgeDate(data);\r\n                if(judgeDate[0] && judgeDate[3]){\r\n                    //日一样，且月差为等差数列，以月差为step（若那天为休息日，则向前取最近的工作日）\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n\r\n                    for(let i = 1; i <= len; i++){\r\n                        let index = (i - 1) % data.length;\r\n                        let d = $.extend(true, {}, data[index]);\r\n\r\n                        let day = dayjs(data[data.length - 1][\"m\"]).add(step * i, \"months\").day(),\r\n                            date;\r\n                        if(day == 0){\r\n                            date = dayjs(data[data.length - 1][\"m\"]).add(step * i, \"months\").subtract(2, \"days\").format(\"YYYY-MM-DD\");\r\n                        }\r\n                        else if(day == 6){\r\n                            date = dayjs(data[data.length - 1][\"m\"]).add(step * i, \"months\").subtract(1, \"days\").format(\"YYYY-MM-DD\");\r\n                        }\r\n                        else{\r\n                            date = dayjs(data[data.length - 1][\"m\"]).add(step * i, \"months\").format(\"YYYY-MM-DD\");\r\n                        }\r\n\r\n                        d[\"m\"] = date;\r\n                        d[\"v\"] = genarate(date)[2];\r\n                        applyData.push(d);\r\n                    }\r\n                }\r\n                else if(!judgeDate[0] && judgeDate[2]){\r\n                    //日不一样，且日差为等差数列\r\n                    if(Math.abs(dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]))) > 7){\r\n                        //若日差大于7天，以一月为step（若那天是休息日，则向前取最近的工作日）\r\n                        let step_month\r\n                        if(direction == \"down\" || direction == \"right\"){\r\n                            step_month = 1;\r\n                        }\r\n                        else if(direction == \"up\" || direction == \"left\"){\r\n                            step_month = -1;\r\n                            data.reverse();\r\n                        }\r\n\r\n                        let step; //以数组第一个为对比\r\n                        for(let i = 1; i <= len; i++){\r\n                            let index = (i - 1) % data.length;\r\n                            let d = $.extend(true, {}, data[index]);\r\n\r\n                            let num = Math.ceil(i / data.length);\r\n                            if(index == 0){\r\n                                step = dayjs(d[\"m\"]).add(step_month * num, \"months\").diff(dayjs(d[\"m\"]), \"days\");\r\n                            }\r\n\r\n                            let day = dayjs(d[\"m\"]).add(step, \"days\").day(),\r\n                                date;\r\n                            if(day == 0){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(2, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else if(day == 6){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(1, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else{\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n\r\n                            d[\"m\"] = date;\r\n                            d[\"v\"] = genarate(date)[2];\r\n                            applyData.push(d);\r\n                        }\r\n                    }\r\n                    else{\r\n                        //若日差小于等于7天，以7天为step（若那天是休息日，则向前取最近的工作日）\r\n                        let step_day;\r\n                        if(direction == \"down\" || direction == \"right\"){\r\n                            step_day = 7;\r\n                        }\r\n                        else if(direction == \"up\" || direction == \"left\"){\r\n                            step_day = -7;\r\n                            data.reverse();\r\n                        }\r\n\r\n                        let step; //以数组第一个为对比\r\n                        for(let i = 1; i <= len; i++){\r\n                            let index = (i - 1) % data.length;\r\n                            let d = $.extend(true, {}, data[index]);\r\n\r\n                            let num = Math.ceil(i / data.length);\r\n                            if(index == 0){\r\n                                step = dayjs(d[\"m\"]).add(step_day * num, \"days\").diff(dayjs(d[\"m\"]), \"days\");\r\n                            }\r\n\r\n                            let day = dayjs(d[\"m\"]).add(step, \"days\").day(),\r\n                                date;\r\n                            if(day == 0){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(2, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else if(day == 6){\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").subtract(1, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n                            else{\r\n                                date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                            }\r\n\r\n                            d[\"m\"] = date;\r\n                            d[\"v\"] = genarate(date)[2];\r\n                            applyData.push(d);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    //日差不是等差数列，复制数据\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    applyData = _this.FillCopy(data, len);\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"6\"){ //以月填充\r\n            if(data.length == 1){\r\n                //以一月为step\r\n                let step;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    step = 1;\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    step = -1;\r\n                }\r\n\r\n                applyData = _this.FillMonths(data, len, step);\r\n            }\r\n            else if(data.length == 2){\r\n                if(dayjs(data[1][\"m\"]).date() == dayjs(data[0][\"m\"]).date() && dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\") != 0){\r\n                    //日一样，且月差大于一月，以月差为step\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n                    applyData = _this.FillMonths(data, len, step);\r\n                }\r\n                else{\r\n                    //以一月为step\r\n                    let step_month;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step_month = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step_month = -1;\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step; //以数组第一个为对比\r\n                    for(let i = 1; i <= len; i++){\r\n                        let index = (i - 1) % data.length;\r\n                        let d = $.extend(true, {}, data[index]);\r\n\r\n                        let num = Math.ceil(i / data.length);\r\n                        if(index == 0){\r\n                            step = dayjs(d[\"m\"]).add(step_month * num, \"months\").diff(dayjs(d[\"m\"]), \"days\");\r\n                        }\r\n\r\n                        let date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                        d[\"m\"] = date;\r\n                        d[\"v\"] = genarate(date)[2];\r\n                        applyData.push(d);\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                let judgeDate = _this.judgeDate(data);\r\n                if(judgeDate[0] && judgeDate[3]){\r\n                    //日一样，且月差为等差数列，以月差为step\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n                    applyData = _this.FillMonths(data, len, step);\r\n                }\r\n                else if(!judgeDate[0] && judgeDate[2]){\r\n                    //日不一样，且日差为等差数列，以一月为step\r\n                    let step_month;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step_month = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step_month = -1;\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step; //以数组第一个为对比\r\n                    for(let i = 1; i <= len; i++){\r\n                        let index = (i - 1) % data.length;\r\n                        let d = $.extend(true, {}, data[index]);\r\n\r\n                        let num = Math.ceil(i / data.length);\r\n                        if(index == 0){\r\n                            step = dayjs(d[\"m\"]).add(step_month * num, \"months\").diff(dayjs(d[\"m\"]), \"days\");\r\n                        }\r\n\r\n                        let date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                        d[\"m\"] = date;\r\n                        d[\"v\"] = genarate(date)[2];\r\n                        applyData.push(d);\r\n                    }\r\n                }\r\n                else{\r\n                    //日差不是等差数列，复制数据\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    applyData = _this.FillCopy(data, len);\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"7\"){ //以年填充\r\n            if(data.length == 1){\r\n                //以一年为step\r\n                let step;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    step = 1;\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    step = -1;\r\n                }\r\n\r\n                applyData = _this.FillYears(data, len, step);\r\n            }\r\n            else if(data.length == 2){\r\n                if(dayjs(data[1][\"m\"]).date() == dayjs(data[0][\"m\"]).date() && dayjs(data[1][\"m\"]).month() == dayjs(data[0][\"m\"]).month() && dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"years\") != 0){\r\n                    //日月一样，且年差大于一年，以年差为step\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"years\");\r\n                    applyData = _this.FillYears(data, len, step);\r\n                }\r\n                else{\r\n                    //以一年为step\r\n                    let step_year;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step_year = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step_year = -1;\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step; //以数组第一个为对比\r\n                    for(let i = 1; i <= len; i++){\r\n                        let index = (i - 1) % data.length;\r\n                        let d = $.extend(true, {}, data[index]);\r\n\r\n                        let num = Math.ceil(i / data.length);\r\n                        if(index == 0){\r\n                            step = dayjs(d[\"m\"]).add(step_year * num, \"years\").diff(dayjs(d[\"m\"]), \"days\");\r\n                        }\r\n\r\n                        let date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                        d[\"m\"] = date;\r\n                        d[\"v\"] = genarate(date)[2];\r\n                        applyData.push(d);\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                let judgeDate = _this.judgeDate(data);\r\n                if(judgeDate[0] && judgeDate[1] && judgeDate[4]){\r\n                    //日月一样，且年差为等差数列，以年差为step\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"years\");\r\n                    applyData = _this.FillYears(data, len, step);\r\n                }\r\n                else if((judgeDate[0] && judgeDate[3]) || judgeDate[2]){\r\n                    //日一样且月差为等差数列，或天差为等差数列，以一年为step\r\n                    let step_year;\r\n                    if(direction == \"down\" || direction == \"right\"){\r\n                        step_year = 1;\r\n                    }\r\n                    else if(direction == \"up\" || direction == \"left\"){\r\n                        step_year = -1;\r\n                        data.reverse();\r\n                    }\r\n\r\n                    let step; //以数组第一个为对比\r\n                    for(let i = 1; i <= len; i++){\r\n                        let index = (i - 1) % data.length;\r\n                        let d = $.extend(true, {}, data[index]);\r\n\r\n                        let num = Math.ceil(i / data.length);\r\n                        if(index == 0){\r\n                            step = dayjs(d[\"m\"]).add(step_year * num, \"years\").diff(dayjs(d[\"m\"]), \"days\");\r\n                        }\r\n\r\n                        let date = dayjs(d[\"m\"]).add(step, \"days\").format(\"YYYY-MM-DD\");\r\n                        d[\"m\"] = date;\r\n                        d[\"v\"] = genarate(date)[2];\r\n                        applyData.push(d);\r\n                    }\r\n                }\r\n                else{\r\n                    //日差不是等差数列，复制数据\r\n                    if(direction == \"up\" || direction == \"left\"){\r\n                        data.reverse();\r\n                    }\r\n\r\n                    applyData = _this.FillCopy(data, len);\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"8\"){ //以中文小写数字序列填充\r\n            if(data.length == 1){\r\n                let step;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    step = 1;\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    step = -1;\r\n                }\r\n\r\n                applyData = _this.FillChnNumber(data, len, step);\r\n            }\r\n            else{\r\n                let dataNumArr = [];\r\n                for(let i = 0; i < data.length; i++){\r\n                    dataNumArr.push(_this.ChineseToNumber(data[i][\"m\"]));\r\n                }\r\n\r\n                if(direction == \"up\" || direction == \"left\"){\r\n                    data.reverse();\r\n                    dataNumArr.reverse();\r\n                }\r\n\r\n                if(_this.isEqualDiff(dataNumArr)){\r\n                    let step = dataNumArr[1] - dataNumArr[0];\r\n                    applyData = _this.FillChnNumber(data, len, step);\r\n                }\r\n                else{\r\n                    //不是等差数列，复制数据\r\n                    applyData = _this.FillCopy(data, len);\r\n                }\r\n            }\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillCopy: function(data, len){\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillSeries: function(data, len, direction){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        let dataNumArr = [];\r\n        for(let j = 0; j < data.length; j++){\r\n            dataNumArr.push(Number(data[j][\"v\"]));\r\n        }\r\n\r\n        if(data.length > 2 && _this.isEqualRatio(dataNumArr)){\r\n            //等比数列\r\n            for(let i = 1; i <= len; i++){\r\n                let index = (i - 1) % data.length;\r\n                let d = $.extend(true, {}, data[index]);\r\n\r\n                let num;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    num = Number(data[data.length -1][\"v\"]) * Math.pow(Number(data[1][\"v\"]) / Number(data[0][\"v\"]), i);\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    num = Number(data[0][\"v\"]) / Math.pow(Number(data[1][\"v\"]) / Number(data[0][\"v\"]), i);\r\n                }\r\n\r\n                d[\"v\"] = num;\r\n                d[\"m\"] = update(d[\"ct\"][\"fa\"], num);\r\n                applyData.push(d);\r\n            }\r\n        }\r\n        else{\r\n            //线性数列\r\n            let xArr = _this.getXArr(data.length);\r\n            for(let i = 1; i <= len; i++){\r\n                let index = (i - 1) % data.length;\r\n                let d = $.extend(true, {}, data[index]);\r\n\r\n                let y;\r\n                if(direction == \"down\" || direction == \"right\"){\r\n                    y = _this.forecast(data.length + i, dataNumArr, xArr);\r\n                }\r\n                else if(direction == \"up\" || direction == \"left\"){\r\n                    y = _this.forecast(1 - i, dataNumArr, xArr);\r\n                }\r\n\r\n                d[\"v\"] = y;\r\n                d[\"m\"] = update(d[\"ct\"][\"fa\"], y);\r\n                applyData.push(d);\r\n            }\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillExtendNumber: function(data, len, step){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n        let reg = /0|([1-9]+[0-9]*)/g;\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let last = data[data.length - 1][\"m\"];\r\n            let match = last.match(reg)\r\n            let lastTxt = match[match.length -1];\r\n            \r\n            let num = Math.abs(Number(lastTxt) + step * i);\r\n            let lastIndex = last.lastIndexOf(lastTxt);\r\n            let valueTxt = last.substr(0, lastIndex) + num.toString() + last.substr(lastIndex + lastTxt.length);\r\n\r\n            d[\"v\"] = valueTxt;\r\n            d[\"m\"] = valueTxt;\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillOnlyFormat: function(data, len){\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            delete d[\"f\"];\r\n            delete d[\"m\"];\r\n            delete d[\"v\"];\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillWithoutFormat: function(dataArr){\r\n        let applyData = [];\r\n\r\n        for(let i = 0; i < dataArr.length; i++){\r\n            let d = $.extend(true, {}, dataArr[i]);\r\n\r\n            let obj;\r\n            if(d[\"f\"] == null){\r\n                obj = {\"m\": d[\"v\"].toString(), \"v\": d[\"v\"]};\r\n            }\r\n            else{\r\n                obj = {\"f\": d[\"f\"], \"m\": d[\"v\"].toString(), \"v\": d[\"v\"]};\r\n            }\r\n\r\n            applyData.push(obj);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillDays: function(data, len, step){\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let date = update(\"yyyy-MM-dd\", d[\"v\"]);\r\n            date = dayjs(date).add(step * i, \"days\").format(\"YYYY-MM-DD\");\r\n\r\n            d[\"v\"] = genarate(date)[2];\r\n            d[\"m\"] = update(d[\"ct\"][\"fa\"], d[\"v\"]);\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillMonths: function(data, len, step){\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let date = update(\"yyyy-MM-dd\", d[\"v\"]);\r\n            date = dayjs(date).add(step * i, \"months\").format(\"YYYY-MM-DD\");\r\n\r\n            d[\"v\"] = genarate(date)[2];\r\n            d[\"m\"] = update(d[\"ct\"][\"fa\"], d[\"v\"]);\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillYears: function(data, len, step){\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let date = update(\"yyyy-MM-dd\", d[\"v\"]);\r\n            date = dayjs(date).add(step * i, \"years\").format(\"YYYY-MM-DD\");\r\n\r\n            d[\"v\"] = genarate(date)[2];\r\n            d[\"m\"] = update(d[\"ct\"][\"fa\"], d[\"v\"]);\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillChnWeek: function(data, len, step){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let num;\r\n            if(data[data.length - 1][\"m\"] == \"日\"){\r\n                num = 7 + step * i;\r\n            }\r\n            else{\r\n                num = _this.ChineseToNumber(data[data.length - 1][\"m\"]) + step * i;\r\n            }\r\n\r\n            if(num < 0){\r\n                num = Math.ceil(Math.abs(num) / 7) * 7 + num;\r\n            }\r\n\r\n            let rsd = num % 7;\r\n            if(rsd == 0){\r\n                d[\"m\"] = \"日\";\r\n                d[\"v\"] = \"日\";\r\n            }\r\n            else if(rsd == 1){\r\n                d[\"m\"] = \"一\";\r\n                d[\"v\"] = \"一\";\r\n            }\r\n            else if(rsd == 2){\r\n                d[\"m\"] = \"二\";\r\n                d[\"v\"] = \"二\";\r\n            }\r\n            else if(rsd == 3){\r\n                d[\"m\"] = \"三\";\r\n                d[\"v\"] = \"三\";\r\n            }\r\n            else if(rsd == 4){\r\n                d[\"m\"] = \"四\";\r\n                d[\"v\"] = \"四\";\r\n            }\r\n            else if(rsd == 5){\r\n                d[\"m\"] = \"五\";\r\n                d[\"v\"] = \"五\";\r\n            }\r\n            else if(rsd == 6){\r\n                d[\"m\"] = \"六\";\r\n                d[\"v\"] = \"六\";\r\n            }\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillChnWeek2: function(data, len, step){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let num;\r\n            if(data[data.length - 1][\"m\"] == \"周日\"){\r\n                num = 7 + step * i;\r\n            }\r\n            else{\r\n                let last = data[data.length - 1][\"m\"];\r\n                let txt = last.substr(last.length - 1, 1);\r\n                num = _this.ChineseToNumber(txt) + step * i;\r\n            }\r\n\r\n            if(num < 0){\r\n                num = Math.ceil(Math.abs(num) / 7) * 7 + num;\r\n            }\r\n\r\n            let rsd = num % 7;\r\n            if(rsd == 0){\r\n                d[\"m\"] = \"周日\";\r\n                d[\"v\"] = \"周日\";\r\n            }\r\n            else if(rsd == 1){\r\n                d[\"m\"] = \"周一\";\r\n                d[\"v\"] = \"周一\";\r\n            }\r\n            else if(rsd == 2){\r\n                d[\"m\"] = \"周二\";\r\n                d[\"v\"] = \"周二\";\r\n            }\r\n            else if(rsd == 3){\r\n                d[\"m\"] = \"周三\";\r\n                d[\"v\"] = \"周三\";\r\n            }\r\n            else if(rsd == 4){\r\n                d[\"m\"] = \"周四\";\r\n                d[\"v\"] = \"周四\";\r\n            }\r\n            else if(rsd == 5){\r\n                d[\"m\"] = \"周五\";\r\n                d[\"v\"] = \"周五\";\r\n            }\r\n            else if(rsd == 6){\r\n                d[\"m\"] = \"周六\";\r\n                d[\"v\"] = \"周六\";\r\n            }\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillChnWeek3: function(data, len, step){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let num;\r\n            if(data[data.length - 1][\"m\"] == \"星期日\"){\r\n                num = 7 + step * i;\r\n            }\r\n            else{\r\n                let last = data[data.length - 1][\"m\"];\r\n                let txt = last.substr(last.length - 1, 1);\r\n                num = _this.ChineseToNumber(txt) + step * i;\r\n            }\r\n\r\n            if(num < 0){\r\n                num = Math.ceil(Math.abs(num) / 7) * 7 + num;\r\n            }\r\n\r\n            let rsd = num % 7;\r\n            if(rsd == 0){\r\n                d[\"m\"] = \"星期日\";\r\n                d[\"v\"] = \"星期日\";\r\n            }\r\n            else if(rsd == 1){\r\n                d[\"m\"] = \"星期一\";\r\n                d[\"v\"] = \"星期一\";\r\n            }\r\n            else if(rsd == 2){\r\n                d[\"m\"] = \"星期二\";\r\n                d[\"v\"] = \"星期二\";\r\n            }\r\n            else if(rsd == 3){\r\n                d[\"m\"] = \"星期三\";\r\n                d[\"v\"] = \"星期三\";\r\n            }\r\n            else if(rsd == 4){\r\n                d[\"m\"] = \"星期四\";\r\n                d[\"v\"] = \"星期四\";\r\n            }\r\n            else if(rsd == 5){\r\n                d[\"m\"] = \"星期五\";\r\n                d[\"v\"] = \"星期五\";\r\n            }\r\n            else if(rsd == 6){\r\n                d[\"m\"] = \"星期六\";\r\n                d[\"v\"] = \"星期六\";\r\n            }\r\n\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    FillChnNumber: function(data, len, step){\r\n        let _this = this;\r\n\r\n        let applyData = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            let index = (i - 1) % data.length;\r\n            let d = $.extend(true, {}, data[index]);\r\n\r\n            let num = _this.ChineseToNumber(data[data.length - 1][\"m\"]) + step * i,\r\n                txt;\r\n            if(num <= 0){\r\n                txt = \"零\";\r\n            }\r\n            else{\r\n                txt = _this.NumberToChinese(num);\r\n            }\r\n\r\n            d[\"v\"] = txt;\r\n            d[\"m\"] = txt.toString();\r\n            applyData.push(d);\r\n        }\r\n\r\n        return applyData;\r\n    },\r\n    isEqualDiff: function(arr){\r\n        let diff = true;\r\n        let step = arr[1] - arr[0];\r\n\r\n        for(let i = 1; i < arr.length; i++){\r\n            if(arr[i] - arr[i - 1] != step){\r\n                diff = false;\r\n                break;\r\n            }\r\n        }\r\n\r\n        return diff;\r\n    },\r\n    isEqualRatio: function(arr){\r\n        let ratio = true;\r\n        let step = arr[1] / arr[0];\r\n\r\n        for(let i = 1; i < arr.length; i++){\r\n            if(arr[i] / arr[i - 1] != step){\r\n                ratio = false;\r\n                break;\r\n            }\r\n        }\r\n\r\n        return ratio;\r\n    },\r\n    getXArr: function(len){\r\n        let xArr = [];\r\n\r\n        for(let i = 1; i <= len; i++){\r\n            xArr.push(i);\r\n        }\r\n\r\n        return xArr;\r\n    },\r\n    forecast: function(x, yArr, xArr){\r\n        function getAverage(arr){\r\n            let sum = 0;\r\n\r\n            for(let i = 0; i < arr.length; i++){\r\n                sum += arr[i];\r\n            }\r\n\r\n            return sum / arr.length;\r\n        }\r\n\r\n        let ax = getAverage(xArr); //x数组 平均值\r\n        let ay = getAverage(yArr); //y数组 平均值\r\n\r\n        let sum_d = 0, sum_n = 0;\r\n        for(let j = 0; j < xArr.length; j++){\r\n            //分母和\r\n            sum_d += (xArr[j] - ax)*(yArr[j] - ay);\r\n            //分子和\r\n            sum_n += (xArr[j] - ax)*(xArr[j] - ax);\r\n        }\r\n\r\n        let b;\r\n        if(sum_n == 0){\r\n            b = 1;\r\n        }\r\n        else{\r\n            b = sum_d / sum_n;\r\n        }\r\n\r\n        let a = ay - b * ax;\r\n\r\n        return Math.round((a + b * x) * 100000) / 100000;\r\n    },\r\n    judgeDate: function(data){\r\n        let isSameDay = true,\r\n            isSameMonth = true,\r\n            isEqualDiffDays = true,\r\n            isEqualDiffMonths = true,\r\n            isEqualDiffYears = true;\r\n        let sameDay = dayjs(data[0][\"m\"]).date(),\r\n            sameMonth = dayjs(data[0][\"m\"]).month();\r\n        let equalDiffDays = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"days\");\r\n        let equalDiffMonths = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"months\");\r\n        let equalDiffYears = dayjs(data[1][\"m\"]).diff(dayjs(data[0][\"m\"]), \"years\");\r\n\r\n        for(let i = 1; i < data.length; i++){\r\n            //日是否一样\r\n            if(dayjs(data[i][\"m\"]).date() != sameDay){\r\n                isSameDay = false;\r\n            }\r\n            //月是否一样\r\n            if(dayjs(data[i][\"m\"]).month() != sameMonth){\r\n                isSameMonth = false;\r\n            }\r\n            //日差是否是 等差数列\r\n            if(dayjs(data[i][\"m\"]).diff(dayjs(data[i - 1][\"m\"]), \"days\") != equalDiffDays){\r\n                isEqualDiffDays = false;\r\n            }\r\n            //月差是否是 等差数列\r\n            if(dayjs(data[i][\"m\"]).diff(dayjs(data[i - 1][\"m\"]), \"months\") != equalDiffMonths){\r\n                isEqualDiffMonths = false;\r\n            }\r\n            //年差是否是 等差数列\r\n            if(dayjs(data[i][\"m\"]).diff(dayjs(data[i - 1][\"m\"]), \"years\") != equalDiffYears){\r\n                isEqualDiffYears = false;\r\n            }\r\n        }\r\n\r\n        if(equalDiffDays == 0){\r\n            isEqualDiffDays = false;\r\n        }\r\n        if(equalDiffMonths == 0){\r\n            isEqualDiffMonths = false;\r\n        }\r\n        if(equalDiffYears == 0){\r\n            isEqualDiffYears = false;\r\n        }\r\n\r\n        return [isSameDay, isSameMonth, isEqualDiffDays, isEqualDiffMonths, isEqualDiffYears];\r\n    }\r\n}\r\n\r\nexport default luckysheetDropCell;\r\n"
  },
  {
    "path": "src/controllers/expendPlugins.js",
    "content": "import { chart } from '../expendPlugins/chart/plugin'\r\nimport { print } from '../expendPlugins/print/plugin'\r\nimport { exportXlsx } from '../expendPlugins/exportXlsx/plugin'\r\n\r\nconst pluginsObj = {\r\n    'chart':chart,\r\n    'print':print,\r\n    'exportXlsx':exportXlsx\r\n}\r\n\r\nconst isDemo = true\r\n\r\n/**\r\n * Register plugins\r\n * \r\n * plugins:[\r\n * {name:'chart'},\r\n * {name:'print'},\r\n * {name:'exportXlsx',config:{url:''}}\r\n * ]\r\n */\r\nfunction initPlugins(plugins , options){\r\n    if(plugins.length){\r\n        plugins.forEach(plugin => {\r\n            pluginsObj[plugin.name](options, plugin.config, isDemo)\r\n        });\r\n    }\r\n}\r\n\r\nexport {\r\n    initPlugins\r\n}"
  },
  {
    "path": "src/controllers/filter.js",
    "content": "import { getSheetIndex } from '../methods/get';\r\nimport editor from '../global/editor';\r\nimport { isRealNull, isEditMode } from '../global/validate';\r\nimport tooltip from '../global/tooltip';\r\nimport { rowlenByRange } from '../global/getRowlen';\r\nimport { selectHightlightShow } from './select';\r\nimport { luckysheetMoveEndCell } from './sheetMove';\r\nimport { luckysheetlodingHTML } from '../controllers/constant';\r\nimport server from './server';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\nimport menuButton from './menuButton';\r\nimport conditionformat from './conditionformat';\r\nimport alternateformat from './alternateformat';\r\nimport {checkProtectionAuthorityNormal} from './protection';\r\nimport { \r\n    rgbTohex, \r\n    showrightclickmenu, \r\n} from '../utils/util';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport { \r\n    jfrefreshgrid, \r\n    jfrefreshgrid_rhcw,\r\n} from '../global/refresh';\r\nimport { orderbydata, orderbydata1D } from '../global/sort';\r\nimport json from '../global/json';\r\nimport { update, genarate } from '../global/format';\r\n\r\n//筛选配置状态\r\nfunction labelFilterOptionState($top, optionstate, rowhidden, caljs, notSave, str, edr, cindex, stc, edc) {\r\n    if (optionstate) {\r\n        $top.addClass(\"luckysheet-filter-options-active\").data(\"rowhidden\", JSON.stringify(rowhidden)).data(\"caljs\", JSON.stringify(caljs)).html('<i class=\"fa fa-filter luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>');\r\n\r\n        if (caljs != null) {\r\n            $top.data(\"byconditionvalue\", caljs[\"value\"]).data(\"byconditiontype\", caljs[\"type\"]).data(\"byconditiontext\", caljs[\"text\"]);\r\n            \r\n            if (caljs[\"value1\"] != null) {\r\n                $top.data(\"byconditionvalue1\", caljs[\"value1\"]);\r\n            }\r\n\r\n            if (caljs[\"value2\"] != null) {\r\n                $top.data(\"byconditionvalue2\", caljs[\"value2\"]);\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        $top.removeClass(\"luckysheet-filter-options-active\").data(\"rowhidden\", \"\").data(\"caljs\", \"\").html('<i class=\"fa fa-caret-down luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>');\r\n\r\n        $top.data(\"byconditionvalue\", \"null\").data(\"byconditiontype\", \"0\").data(\"byconditiontext\", \"无\").data(\"byconditionvalue1\", \"\").data(\"byconditionvalue2\", \"\");\r\n    }\r\n\r\n    if(!!notSave){\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n        if(file.filter == null){\r\n            file.filter = {};\r\n        }\r\n\r\n        if (optionstate) {\r\n            let param = {\r\n                \"caljs\": caljs, \r\n                \"rowhidden\": rowhidden, \r\n                \"optionstate\": optionstate,\r\n                \"str\": str,\r\n                \"edr\": edr,\r\n                \"cindex\": cindex,\r\n                \"stc\": stc,\r\n                \"edc\": edc\r\n            };\r\n            file.filter[cindex - stc] = param;\r\n        }\r\n        else {\r\n            delete file.filter[cindex - stc];\r\n        }\r\n\r\n        server.saveParam(\"all\", Store.currentSheetIndex, file.filter, { \"k\": \"filter\" });\r\n    }\r\n}\r\n\r\n//筛选排序\r\nfunction orderbydatafiler(str, stc, edr, edc, index, asc) {\r\n    let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n    str = str + 1;\r\n\r\n    let hasMc = false; //排序选区是否有合并单元格\r\n    let data = [];\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        let data_row = [];\r\n\r\n        for(let c = stc; c <= edc; c++){\r\n            if(d[r][c] != null && d[r][c].mc != null){\r\n                hasMc = true;\r\n                break;\r\n            }\r\n\r\n            data_row.push(d[r][c]);\r\n        }\r\n\r\n        data.push(data_row);\r\n    }\r\n\r\n    if(hasMc){\r\n        const locale_filter = locale().filter;\r\n\r\n        if(isEditMode()){\r\n            alert(locale_filter.mergeError);\r\n        }\r\n        else{\r\n            tooltip.info(locale_filter.mergeError, \"\");\r\n        }\r\n\r\n        return;\r\n    }\r\n\r\n    data = orderbydata(data, index - stc, asc);\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        for(let c = stc; c <= edc; c++){\r\n            d[r][c] = data[r - str][c - stc];\r\n        }\r\n    }\r\n\r\n    let allParam = {};\r\n    if(Store.config[\"rowlen\"] != null){\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        cfg = rowlenByRange(d, str, edr, cfg);\r\n\r\n        allParam = {\r\n            \"cfg\": cfg,\r\n            \"RowlChange\": true\r\n        }\r\n    }\r\n\r\n    jfrefreshgrid(d, [{ \"row\": [str, edr], \"column\": [stc, edc] }], allParam);\r\n}\r\n\r\n//创建筛选按钮\r\nfunction createFilter() {\r\n\r\n    if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"filter\")){\r\n        return;\r\n    }\r\n\r\n    if(Store.luckysheet_select_save.length > 1){\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        $(\"#\" + Store.container).attr(\"tabindex\", 0).focus();\r\n\r\n        const locale_splitText = locale().splitText;\r\n\r\n        if(isEditMode()){\r\n            alert(locale_splitText.tipNoMulti);\r\n        }\r\n        else{\r\n            tooltip.info(locale_splitText.tipNoMulti, \"\");\r\n        }\r\n\r\n        return;\r\n    }\r\n\r\n    if(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].isPivotTable){\r\n        return;\r\n    }\r\n\r\n    $('#luckysheet-filter-selected-sheet' + Store.currentSheetIndex + ', #luckysheet-filter-options-sheet' + Store.currentSheetIndex).remove();\r\n\r\n    let last = Store.luckysheet_select_save[0];\r\n    if (last[\"row\"][0] == last[\"row\"][1] && last[\"column\"][0] == last[\"column\"][1]) {\r\n        let st_c, ed_c, curR = last[\"row\"][1];\r\n\r\n        for (let c = 0; c < Store.flowdata[curR].length; c++) {\r\n            let cell = Store.flowdata[curR][c];\r\n\r\n            if (cell != null && !isRealNull(cell.v)) {\r\n                if (st_c == null) {\r\n                    st_c = c;\r\n                }\r\n            }\r\n            else if (st_c != null) {\r\n                ed_c = c - 1;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (ed_c == null) {\r\n            ed_c = Store.flowdata[curR].length - 1;\r\n        }\r\n\r\n        Store.luckysheet_select_save = [{ \"row\": [curR, curR], \"column\": [st_c, ed_c] }];\r\n        selectHightlightShow();\r\n\r\n        Store.luckysheet_shiftpositon = $.extend(true, {}, last);\r\n        luckysheetMoveEndCell(\"down\", \"range\");\r\n    }\r\n    else if (last[\"row\"][1] - last[\"row\"][0] < 2) {\r\n        Store.luckysheet_shiftpositon = $.extend(true, {}, last);\r\n        luckysheetMoveEndCell(\"down\", \"range\");\r\n    }\r\n\r\n    Store.luckysheet_filter_save = $.extend(true, {}, Store.luckysheet_select_save[0]);\r\n\r\n    createFilterOptions(Store.luckysheet_filter_save);\r\n\r\n    server.saveParam(\"all\", Store.currentSheetIndex, Store.luckysheet_filter_save, { \"k\": \"filter_select\" });\r\n\r\n    if (Store.filterchage) {\r\n        Store.jfredo.push({ \r\n            \"type\": \"filtershow\", \r\n            \"data\": [], \r\n            \"curdata\": [], \r\n            \"sheetIndex\": Store.currentSheetIndex, \r\n            \"filter_save\": Store.luckysheet_filter_save \r\n        });\r\n    }\r\n}\r\n\r\n//创建筛选配置\r\nfunction createFilterOptions(luckysheet_filter_save, filterObj) {\r\n    $(\"#luckysheet-filter-selected-sheet\" + Store.currentSheetIndex).remove();\r\n    $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex).remove();\r\n    \r\n    if(luckysheet_filter_save == null || JSON.stringify(luckysheet_filter_save) == \"{}\"){\r\n        return;\r\n    }\r\n\r\n    let r1 = luckysheet_filter_save.row[0], \r\n        r2 = luckysheet_filter_save.row[1];\r\n    let c1 = luckysheet_filter_save.column[0], \r\n        c2 = luckysheet_filter_save.column[1];\r\n\r\n    let row = Store.visibledatarow[r2], \r\n        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n    let col = Store.visibledatacolumn[c2], \r\n        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n    \r\n    let newSelectedHTML = '<div id=\"luckysheet-filter-selected-sheet'+ Store.currentSheetIndex +'\" class=\"luckysheet-cell-selected luckysheet-filter-selected\"  style=\"left:'+ col_pre +'px;width:'+ (col - col_pre - 1) +'px;top:'+ row_pre +'px;height:'+ (row - row_pre - 1) +'px;display:block;border-color:#897BFF;z-index:20;background:none;\"></div>';\r\n    $(\"#luckysheet-cell-main\").append(newSelectedHTML);\r\n    \r\n    let optionHTML = \"\";\r\n\r\n    for (let c = c1; c <= c2; c++) {\r\n        const isHide = Store.config != null && Store.config[\"colhidden\"] != null && c in Store.config[\"colhidden\"]\r\n\r\n        if(filterObj == null || filterObj[c - c1] == null){\r\n            optionHTML += '<div data-rowhidden=\"\" data-str=\"'+ r1 +'\" data-edr=\"'+ r2 +'\" data-cindex=\"'+ c +'\" data-stc=\"'+ c1 +'\" data-edc=\"'+ c2 +'\" class=\"luckysheet-filter-options\" style=\"left:'+ (Store.visibledatacolumn[c] - 20) +'px;top:'+ row_pre +'px;display:'+ (isHide ? 'none' : 'block') +';\"><i class=\"fa fa-caret-down\" aria-hidden=\"true\"></i></div>';\r\n        }\r\n        else{\r\n            let caljs_data;\r\n\r\n            if(filterObj[c - c1].caljs != null){\r\n                let caljs_value1_data;\r\n                if (filterObj[c - c1].caljs[\"value1\"] != null) {\r\n                    caljs_value1_data = 'data-byconditionvalue1=\"'+ filterObj[c - c1].caljs[\"value1\"] +'\" ';\r\n                }\r\n                else{\r\n                    caljs_value1_data = '';\r\n                }\r\n\r\n                let caljs_value2_data;\r\n                if (filterObj[c - c1].caljs[\"value2\"] != null) {\r\n                    caljs_value2_data = 'data-byconditionvalue2=\"'+ filterObj[c - c1].caljs[\"value2\"] +'\" ';\r\n                }\r\n                else{\r\n                    caljs_value2_data = '';\r\n                }\r\n\r\n                caljs_data = 'data-caljs=\"'+ JSON.stringify(filterObj[c - c1].caljs) +'\" ' +\r\n                                 'data-byconditionvalue=\"'+ filterObj[c - c1].caljs[\"value\"] +'\" ' + \r\n                                 'data-byconditiontype=\"'+ filterObj[c - c1].caljs[\"type\"] +'\" ' +\r\n                                 'data-byconditiontext=\"'+ filterObj[c - c1].caljs[\"text\"] +'\" ' +\r\n                                 caljs_value1_data + caljs_value2_data;\r\n            }\r\n            else{\r\n                caljs_data = '';\r\n            }\r\n\r\n            optionHTML += '<div data-rowhidden=\"'+ JSON.stringify(filterObj[c - c1].rowhidden).replace(/\\\"/g, \"'\") +'\" '+ caljs_data +' data-str=\"'+ r1 +'\" data-edr=\"'+ r2 +'\" data-cindex=\"'+ c +'\" data-stc=\"'+ c1 +'\" data-edc=\"'+ c2 +'\" class=\"luckysheet-filter-options luckysheet-filter-options-active\" style=\"left:'+ (Store.visibledatacolumn[c] - 20) +'px;top:'+ row_pre +'px;display:'+ (isHide ? 'none' : 'block') +';\"><i class=\"fa fa-filter luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i></div>';\r\n        }\r\n    }\r\n\r\n    $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-filter-options-sheet'+ Store.currentSheetIndex +'\" class=\"luckysheet-filter-options-c\">' + optionHTML + '</div>');\r\n    $(\"#luckysheet-rightclick-menu\").hide();\r\n    $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n\r\n    if ($(\"#luckysheet-cell-main\").scrollTop() > luckysheet_filter_save[\"top_move\"]) {\r\n        $(\"#luckysheet-scrollbar-y\").scrollTop(luckysheet_filter_save[\"top_move\"]);\r\n    }\r\n\r\n    let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n    file.filter_select = luckysheet_filter_save;\r\n}\r\n\r\nfunction initialFilterHandler(){\r\n    //filter event handler\r\n    let hidefilersubmenu = null;\r\n    const _locale = locale();\r\n    const locale_filter = _locale.filter;\r\n    const locale_button= _locale.button;\r\n    $(\"#luckysheetfilter\").click(createFilter);\r\n\r\n    //右键菜单 菜单项hover\r\n    let submenuhide = null, rightclickmenu = null;\r\n    $(\".luckysheet-cols-menu .luckysheet-cols-submenu\").hover(\r\n        function () {\r\n            let $t = $(this), attrid = $t.attr(\"id\"), $attr = $(\"#\" + attrid + \"_sub\"), $con = $t.parent();\r\n            let winW = $(window).width(), winH = $(window).height();\r\n            let menuW = $con.width(), attrH = $attr.height() + 25, attrW = $attr.width() + 5;\r\n            let offset = $t.offset();\r\n            let top = offset.top, left = offset.left + menuW;\r\n\r\n            if (left + attrW > winW) {\r\n                left = offset.left - attrW;\r\n            }\r\n\r\n            if (top + attrH > winH) {\r\n                top = winH - attrH;\r\n            }\r\n\r\n            $attr.css({ \"top\": top, \"left\": left }).show();\r\n            rightclickmenu = $t;\r\n        },\r\n        function () {\r\n            let $t = $(this), attrid = $t.attr(\"id\"), $attr = $(\"#\" + attrid + \"_sub\");\r\n            submenuhide = setTimeout(function () { $attr.hide(); }, 200);\r\n        }\r\n    );\r\n\r\n    $(\".luckysheet-rightgclick-menu-sub\").hover(\r\n        function () {\r\n            rightclickmenu.addClass(\"luckysheet-cols-menuitem-hover\");\r\n            clearTimeout(submenuhide);\r\n        },\r\n        function () {\r\n            rightclickmenu.removeClass(\"luckysheet-cols-menuitem-hover\");\r\n            $(this).hide();\r\n        }\r\n    );\r\n\r\n    $(\"#luckysheet-filter-menu\").mouseover(function () {\r\n        clearTimeout(hidefilersubmenu);\r\n        \r\n        hidefilersubmenu = setTimeout(function () {\r\n            $(\"#luckysheet-filter-submenu\").hide();\r\n        }, 500);\r\n    });\r\n    \r\n\r\n    $(\"#luckysheet-filter-submenu\").mouseover(function () {\r\n        clearTimeout(hidefilersubmenu);\r\n    }).find(\".luckysheet-cols-menuitem\").click(function (e) {\r\n        $(\"#luckysheet-filter-selected span\").html($(this).find(\".luckysheet-cols-menuitem-content\").text()).data(\"value\", $(this).data(\"value\"));\r\n        $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").hide();\r\n\r\n        let $type = $(this).data(\"type\");\r\n        let $value = $(this).attr(\"data-value\");\r\n        \r\n        if ($type == \"2\") {\r\n            $(\"#luckysheet-filter-selected span\").data(\"type\", \"2\");\r\n            $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input2\").show();\r\n            $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input input\").prop(\"type\", \"number\");\r\n        }\r\n        else if ($type == \"0\") {\r\n            $(\"#luckysheet-filter-selected span\").data(\"type\", \"0\");\r\n        }\r\n        else {\r\n            $(\"#luckysheet-filter-selected span\").data(\"type\", \"1\");\r\n            $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").eq(0).show();\r\n            \r\n            //若是日期 改变input type类型为date\r\n            if($value == \"dateequal\" || $value == \"datelessthan\" || $value == \"datemorethan\"){\r\n                $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input input\").prop(\"type\", \"date\");\r\n            }\r\n            else if($value == \"morethan\" || $value == \"moreequalthan\" || $value == \"lessthan\" || $value == \"lessequalthan\" || $value == \"equal\" || $value == \"noequal\"){\r\n                $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input input\").prop(\"type\", \"number\");\r\n            }\r\n            else{\r\n                $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input input\").prop(\"type\", \"text\");\r\n            }\r\n        }\r\n\r\n        $(\"#luckysheet-filter-byvalue\").next().slideUp();\r\n        $(\"#luckysheet-filter-submenu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheet-filter-bycondition, #luckysheet-filter-byvalue\").click(function () {\r\n        let $t = $(this);\r\n        $t.next().slideToggle(200);\r\n\r\n        setTimeout(function () {\r\n            if ($t.attr(\"id\") == \"luckysheet-filter-bycondition\" && $(\"#luckysheet-filter-bycondition\").next().is(\":visible\")) {\r\n                if ($(\"#luckysheet-filter-selected span\").text() != locale_filter.filiterInputNone) {\r\n                    $(\"#luckysheet-filter-byvalue\").next().slideUp(200);\r\n                }\r\n            }\r\n\r\n            if ($t.is($(\"#luckysheet-filter-bycondition\"))) {\r\n                if ($(\"#luckysheet-filter-bycondition\").next().is(\":hidden\") && $(\"#luckysheet-filter-byvalue\").next().is(\":hidden\")) {\r\n                    $(\"#luckysheet-filter-byvalue\").next().slideDown(200);\r\n                }\r\n            }\r\n        }, 300);\r\n    });\r\n\r\n    $(\"#luckysheet-filter-selected\").click(function () {\r\n        let $t = $(this), toffset = $t.offset(), $menu = $(\"#luckysheet-filter-submenu\");\r\n        $menu.hide();\r\n    \r\n        let winH = $(window).height(), winW = $(window).width();\r\n        let menuW = $menu.width(), menuH = $menu.height();\r\n        let top = toffset.top, left = toffset.left, mheight = winH - toffset.top - 20;\r\n        \r\n        if (toffset.left + menuW > winW) {\r\n            left = toffset.left - menuW;\r\n        }\r\n    \r\n        if (toffset.top > winH / 2) {\r\n            top = winH - toffset.top;\r\n            \r\n            if (top < 0) {\r\n                top = 0;\r\n            }\r\n    \r\n            mheight = toffset.top - 20;\r\n        }\r\n    \r\n        $menu.css({ \"top\": top, \"left\": left, \"height\": mheight }).show();\r\n        clearTimeout(hidefilersubmenu);\r\n    });\r\n\r\n    //筛选按钮点击事件\r\n    $(\"#luckysheet-cell-main\").on(\"click\", \".luckysheet-filter-options\", function (e) {\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"filter\")){\r\n            return;\r\n        }\r\n        let $t = $(e.currentTarget), \r\n            toffset = $t.offset(), \r\n            $menu = $(\"#luckysheet-filter-menu\"), \r\n            winH = $(window).height(), \r\n            winW = $(window).width();\r\n\r\n        let st_r = $t.data(\"str\"), \r\n            ed_r = $t.data(\"edr\"), \r\n            cindex = $t.data(\"cindex\"), \r\n            st_c = $t.data(\"stc\"), \r\n            ed_c = $t.data(\"edc\"), \r\n            rowhidden = $t.data(\"rowhidden\") == \"\" ? {} : JSON.parse($t.data(\"rowhidden\").replace(/\\'/g, '\"'));\r\n\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        $(\"#luckysheet-filter-byvalue-input\").val(\"\");\r\n        $(\"#luckysheet-filter-bycondition\").next().hide();\r\n        $(\"#luckysheet-filter-byvalue\").next().show();\r\n        \r\n        $menu.data(\"str\", st_r);\r\n        $menu.data(\"edr\", ed_r);\r\n        $menu.data(\"cindex\", cindex);\r\n        $menu.data(\"stc\", st_c);\r\n        $menu.data(\"edc\", ed_c);\r\n\r\n        $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").hide().find(\"input\").val();\r\n        $(\"#luckysheet-filter-selected span\").data(\"type\", \"0\").data(\"type\", null).text(locale_filter.filiterInputNone);\r\n\r\n        let byconditiontype = $t.data(\"byconditiontype\");\r\n        $(\"#luckysheet-filter-selected span\").data(\"value\", $t.data(\"byconditionvalue\")).data(\"type\", byconditiontype).text($t.data(\"byconditiontext\"));\r\n\r\n        if (byconditiontype == \"2\") {\r\n            let $input = $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input2\").show().find(\"input\");\r\n            $input.eq(0).val($t.data(\"byconditionvalue1\"));\r\n            $input.eq(1).val($t.data(\"byconditionvalue2\"));\r\n        }\r\n        else if (byconditiontype == \"1\") {\r\n            $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").eq(0).show().find(\"input\").val($t.data(\"byconditionvalue1\"));\r\n        }\r\n\r\n        $(\"#luckysheet-filter-orderby-asc\").off(\"click\").on(\"click\", function () {\r\n            orderbydatafiler(st_r, st_c, ed_r, ed_c, cindex, true);\r\n        });\r\n\r\n        $(\"#luckysheet-filter-orderby-desc\").off(\"click\").on(\"click\", function () {\r\n            orderbydatafiler(st_r, st_c, ed_r, ed_c, cindex, false);\r\n        });\r\n\r\n        const loadingObj = luckysheetlodingHTML(\"#luckysheet-filter-byvalue-select\",{text:locale_filter.filiterMoreDataTip});\r\n        $(\"#luckysheet-filter-byvalue-select\").empty().append(loadingObj.el);\r\n\r\n        let rowhiddenother = {}; //其它筛选列的隐藏行\r\n        $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").not(this).each(function () {\r\n            let $t = $(this), rh = $t.data(\"rowhidden\");\r\n            \r\n            if (rh == \"\") {\r\n                return true;\r\n            }\r\n\r\n            rh = JSON.parse(rh.replace(/\\'/g, '\"'));\r\n            \r\n            for (let r in rh) {\r\n                rowhiddenother[r] = 0;\r\n            }\r\n        });\r\n\r\n        let data = Store.flowdata;\r\n\r\n        setTimeout(function () {\r\n            //日期值\r\n            let dvmap = {};  \r\n            let dvmap_uncheck = {};\r\n\r\n            //除日期以外的值\r\n            let vmap = {}; \r\n            let vmap_uncheck = {};  \r\n\r\n            for (let r = st_r + 1; r <= ed_r; r++) {\r\n                if(r in rowhiddenother){\r\n                    continue;\r\n                }\r\n\r\n                if(Store.flowdata[r] == null){\r\n                    continue;\r\n                }\r\n\r\n                let cell = Store.flowdata[r][cindex];\r\n\r\n                if(cell != null && !isRealNull(cell.v) && cell.ct != null && cell.ct.t == \"d\" ){ //单元格是日期\r\n                    let v = update(\"YYYY-MM-DD\", cell.v);\r\n\r\n                    let y = v.split(\"-\")[0];\r\n                    let m = v.split(\"-\")[1];\r\n                    let d = v.split(\"-\")[2];\r\n\r\n                    if(!(y in dvmap)){\r\n                        dvmap[y] = {};\r\n                    }\r\n\r\n                    if(!(m in dvmap[y])){\r\n                        dvmap[y][m] = {};\r\n                    }\r\n\r\n                    if(!(d in dvmap[y][m])){\r\n                        dvmap[y][m][d] = 0;\r\n                    }\r\n                    \r\n                    dvmap[y][m][d]++;\r\n\r\n                    if(r in rowhidden){\r\n                        dvmap_uncheck[y] = 0;\r\n                        dvmap_uncheck[m] = 0;\r\n                        dvmap_uncheck[d] = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    let v, m;\r\n                    if((cell == null || isRealNull(cell.v)) && cell?.mc){\r\n                        const { r, c } = cell.mc;\r\n                        const mainCell = Store.flowdata[r][c];\r\n                        v = mainCell.v;\r\n                        m = mainCell.m;\r\n                    }\r\n                    else if(cell == null || isRealNull(cell.v)){\r\n                        v = null;\r\n                        m = null;\r\n                    }\r\n                    else{\r\n                        v = cell.v;\r\n                        m = cell.m;\r\n                    }\r\n\r\n                    if(!(v in vmap)){\r\n                        vmap[v] = {};\r\n                    }\r\n\r\n                    if(!(m in vmap[v])){\r\n                        vmap[v][m] = 0;                            \r\n                    }\r\n\r\n                    vmap[v][m]++;\r\n\r\n                    if(r in rowhidden){\r\n                        vmap_uncheck[v + \"#$$$#\" + m] = 0;\r\n                    }\r\n                }\r\n            }\r\n\r\n            //遍历数据加到页面\r\n            let item = [];\r\n\r\n            if(JSON.stringify(dvmap).length > 2){\r\n                for(let y in dvmap){\r\n                    let ysum = 0;\r\n                    let monthHtml = '';\r\n\r\n                    for(let m in dvmap[y]){\r\n                        let msum = 0;\r\n                        let dayHtml = '';\r\n\r\n                        for(let d in dvmap[y][m]){\r\n                            let dayL = dvmap[y][m][d];\r\n                            msum += dayL;\r\n\r\n                            //月 小于 10\r\n                            let mT;\r\n                            if(Number(m) < 10){\r\n                                mT = \"0\" + Number(m);\r\n                            }\r\n                            else{\r\n                                mT = m;    \r\n                            }\r\n\r\n                            //日 小于 10\r\n                            let dT;\r\n                            if(Number(d) < 10){\r\n                                dT = \"0\" + Number(d);\r\n                            }\r\n                            else{\r\n                                dT = d;    \r\n                            }\r\n\r\n                            //日是否选中状态\r\n                            if((y in dvmap_uncheck) && (m in dvmap_uncheck) && (d in dvmap_uncheck)){\r\n                                dayHtml +=  '<div class=\"day luckysheet-mousedown-cancel cf\" data-check=\"false\" title=\"'+ y +'-'+ mT +'-'+ dT +'\">' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + d + '</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + dayL + ' )</span>' +\r\n                                            '</div>';\r\n                            }\r\n                            else{\r\n                                dayHtml +=  '<div class=\"day luckysheet-mousedown-cancel cf\" data-check=\"true\" title=\"'+ y +'-'+ mT +'-'+ dT +'\">' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + d + '</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + dayL + ' )</span>' +\r\n                                            '</div>';\r\n                            }\r\n                        }\r\n\r\n                        ysum += msum;\r\n                        \r\n                        //月 小于 10\r\n                        let mT2;\r\n                        if(Number(m) < 10){\r\n                            mT2 = \"0\" + Number(m);\r\n                        }\r\n                        else{\r\n                            mT2 = m;    \r\n                        }\r\n\r\n                        //月是否选中状态\r\n                        if((y in dvmap_uncheck) && (m in dvmap_uncheck)){\r\n                            monthHtml += '<div class=\"monthBox luckysheet-mousedown-cancel\">' +\r\n                                            '<div class=\"month luckysheet-mousedown-cancel cf\" data-check=\"false\" title=\"'+ y +'-'+ mT2 +'\">' +\r\n                                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + m + ''+ locale_filter.filiterMonthText +'</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + msum + ' )</span>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"dayList luckysheet-mousedown-cancel\">' + dayHtml + '</div>' +\r\n                                        '</div>';\r\n                        }\r\n                        else{\r\n                            monthHtml += '<div class=\"monthBox luckysheet-mousedown-cancel\">' +\r\n                                            '<div class=\"month luckysheet-mousedown-cancel cf\" data-check=\"true\" title=\"'+ y +'-'+ mT2 +'\">' +\r\n                                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + m + ''+ locale_filter.filiterMonthText +'</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + msum + ' )</span>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"dayList luckysheet-mousedown-cancel\">' + dayHtml + '</div>' +\r\n                                        '</div>';\r\n                        }\r\n                    }\r\n\r\n                    //年是否选中状态\r\n                    let yearHtml;\r\n                    if(y in dvmap_uncheck){\r\n                        yearHtml =  '<div class=\"yearBox luckysheet-mousedown-cancel\">' +\r\n                                            '<div class=\"year luckysheet-mousedown-cancel cf\" data-check=\"false\" title=\"'+ y +'\">' +\r\n                                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + y + ''+ locale_filter.filiterYearText +'</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + ysum + ' )</span>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"monthList luckysheet-mousedown-cancel\">' + monthHtml + '</div>' +\r\n                                        '</div>';\r\n                    }\r\n                    else{\r\n                        yearHtml =  '<div class=\"yearBox luckysheet-mousedown-cancel\">' +\r\n                                            '<div class=\"year luckysheet-mousedown-cancel cf\" data-check=\"true\" title=\"'+ y +'\">' +\r\n                                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + y + ''+ locale_filter.filiterYearText +'</label>' +\r\n                                                '<span class=\"count luckysheet-mousedown-cancel\">( ' + ysum + ' )</span>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"monthList luckysheet-mousedown-cancel\">' + monthHtml + '</div>' +\r\n                                        '</div>';\r\n                    }\r\n\r\n                    item.unshift(yearHtml);\r\n                }\r\n            }\r\n\r\n            if(JSON.stringify(vmap).length > 2){\r\n                let vmapKeys = Object.keys(vmap);\r\n                vmapKeys = orderbydata1D(vmapKeys, true);\r\n\r\n                for(let i = 0; i < vmapKeys.length; i++){\r\n                    let v = vmapKeys[i];\r\n\r\n                    for(let x in vmap[v]){\r\n                        let text;\r\n                        if((v + \"#$$$#\" + x) == \"null#$$$#null\"){\r\n                            text = locale_filter.valueBlank;\r\n                        }\r\n                        else{\r\n                            text = x;\r\n                        }\r\n\r\n                        //是否选中状态\r\n                        let dataHtml;\r\n                        if((v + \"#$$$#\" + x) in vmap_uncheck){\r\n                            dataHtml =  '<div class=\"textBox luckysheet-mousedown-cancel cf\" data-check=\"false\" data-filter=\"'+ (v + \"#$$$#\" + x) +'\" title=\"'+ text +'\">' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + text + '</label>' +\r\n                                                '<span class=\"luckysheet-mousedown-cancel count\">( ' + vmap[v][x] + ' )</span>' +\r\n                                            '</div>';\r\n                        }\r\n                        else{\r\n                            dataHtml =  '<div class=\"textBox luckysheet-mousedown-cancel cf\" data-check=\"true\" data-filter=\"'+ (v + \"#$$$#\" + x) +'\" title=\"'+ text +'\">' +\r\n                                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                                '<label class=\"luckysheet-mousedown-cancel\">' + text + '</label>' +\r\n                                                '<span class=\"luckysheet-mousedown-cancel count\">( ' + vmap[v][x] + ' )</span>' +\r\n                                            '</div>';\r\n                        }\r\n\r\n                        item.push(dataHtml);\r\n                    }\r\n                }\r\n            }\r\n\r\n            // 适配小屏设备\r\n            let containerH = winH - toffset.top - 350\r\n            if (containerH < 0) containerH = 100\r\n            //$(\"#luckysheet-filter-byvalue-select\").html(\"<div class='ListBox luckysheet-mousedown-cancel' style='min-height: 100px; max-height: \" + containerH + \"px; overflow-y: auto; overflow-x: hidden;'><table cellspacing='0' style='width:100%;' class='luckysheet-mousedown-cancel'>\" + item.join(\"\") + \"</table></div>\");\r\n\r\n            $(\"#luckysheet-filter-byvalue-select\").append(\"<div class='ListBox luckysheet-mousedown-cancel' style='min-height: 100px; max-height: \" + containerH + \"px; overflow-y: auto; overflow-x: hidden;'><table cellspacing='0' style='width:100%;' class='luckysheet-mousedown-cancel'>\" + item.join(\"\") + \"</table></div>\");\r\n            loadingObj.close();\r\n        }, 1);\r\n\r\n        showrightclickmenu($menu, toffset.left, toffset.top + 20);\r\n\r\n        e.stopPropagation();\r\n        return false;\r\n    });\r\n\r\n    //按颜色筛选\r\n    $(\"#luckysheet-filter-orderby-color\").hover(\r\n        function(){\r\n            //遍历筛选列颜色\r\n            let $menu = $(\"#luckysheet-filter-menu\");\r\n            let st_r = $menu.data(\"str\"), \r\n                ed_r = $menu.data(\"edr\"), \r\n                cindex = $menu.data(\"cindex\"), \r\n                st_c = $menu.data(\"stc\"), \r\n                ed_c = $menu.data(\"edc\");\r\n            let bgMap = {}; //单元格颜色\r\n            let fcMap = {}; //字体颜色\r\n    \r\n            let af_compute = alternateformat.getComputeMap();\r\n            let cf_compute = conditionformat.getComputeMap();\r\n    \r\n            for (let r = st_r + 1; r <= ed_r; r++) {\r\n                let cell = Store.flowdata[r][cindex];\r\n    \r\n                //单元格颜色\r\n                let bg = menuButton.checkstatus(Store.flowdata, r, cindex , \"bg\");\r\n\r\n                if(bg == null){\r\n                    bg = \"#ffffff\";\r\n                }\r\n    \r\n                let checksAF = alternateformat.checksAF(r, cindex, af_compute);\r\n                if(checksAF != null){//若单元格有交替颜色\r\n                    bg = checksAF[1];\r\n                }\r\n    \r\n                let checksCF = conditionformat.checksCF(r, cindex, cf_compute);\r\n                if(checksCF != null && checksCF[\"cellColor\"] != null){//若单元格有条件格式\r\n                    bg = checksCF[\"cellColor\"];\r\n                }\r\n    \r\n                if(bg.indexOf(\"rgb\") > -1){\r\n                    bg = rgbTohex(bg);\r\n                }\r\n    \r\n                if(bg.length == 4){\r\n                    bg = bg.substr(0, 1) + bg.substr(1, 1).repeat(2) + bg.substr(2, 1).repeat(2) + bg.substr(3, 1).repeat(2);\r\n                }\r\n    \r\n                //字体颜色\r\n                let fc = menuButton.checkstatus(Store.flowdata, r, cindex , \"fc\");\r\n                \r\n                if(checksAF != null){//若单元格有交替颜色\r\n                    fc = checksAF[0];\r\n                }\r\n    \r\n                if(checksCF != null && checksCF[\"textColor\"] != null){//若单元格有条件格式\r\n                    fc = checksCF[\"textColor\"];\r\n                }\r\n    \r\n                if(fc.indexOf(\"rgb\") > -1){\r\n                    fc = rgbTohex(fc);\r\n                }\r\n    \r\n                if(fc.length == 4){\r\n                    fc = fc.substr(0, 1) + fc.substr(1, 1).repeat(2) + fc.substr(2, 1).repeat(2) + fc.substr(3, 1).repeat(2);\r\n                }\r\n    \r\n                if(Store.config != null && Store.config[\"rowhidden\"] != null && r in Store.config[\"rowhidden\"]){\r\n                    bgMap[bg] = 1;\r\n    \r\n                    if(cell != null && !isRealNull(cell.v)){\r\n                        fcMap[fc] = 1;\r\n                    }\r\n                }\r\n                else{\r\n                    bgMap[bg] = 0;\r\n    \r\n                    if(cell != null && !isRealNull(cell.v)){\r\n                        fcMap[fc] = 0;\r\n                    }\r\n                }\r\n            }\r\n            //\r\n            let filterBgColorHtml = '';\r\n            if(JSON.stringify(bgMap).length > 2 && Object.keys(bgMap).length > 1){\r\n                let bgColorItemHtml = '';\r\n                for(let b in bgMap){\r\n                    if(bgMap[b] == 0){\r\n                        bgColorItemHtml += '<div class=\"item luckysheet-mousedown-cancel\"><label class=\"luckysheet-mousedown-cancel\" style=\"background-color: ' + b + '\" title=\"' + b + '\"></label><input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/></div>';\r\n                    }\r\n                    else{\r\n                        bgColorItemHtml += '<div class=\"item luckysheet-mousedown-cancel\"><label class=\"luckysheet-mousedown-cancel\" style=\"background-color: ' + b + '\" title=\"' + b + '\"></label><input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/></div>';\r\n                    }\r\n                }\r\n                filterBgColorHtml = '<div id=\"filterBgColor\" class=\"box luckysheet-mousedown-cancel\"><div class=\"title luckysheet-mousedown-cancel\">'+locale_filter.filiterByColorTip+'</div><div style=\"max-height:128px;overflow:auto;\" class=\"luckysheet-mousedown-cancel\">' + bgColorItemHtml + '</div></div>';\r\n            }\r\n    \r\n            let filterFcColorHtml = '';\r\n            if(JSON.stringify(fcMap).length > 2 && Object.keys(fcMap).length > 1){\r\n                let fcColorItemHtml = '';\r\n                for(let f in fcMap){\r\n                    if(fcMap[f] == 0){\r\n                        fcColorItemHtml += '<div class=\"item luckysheet-mousedown-cancel\"><label class=\"luckysheet-mousedown-cancel\" style=\"background-color: ' + f + '\" title=\"' + f + '\"></label><input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/></div>';\r\n                    }\r\n                    else{\r\n                        fcColorItemHtml += '<div class=\"item luckysheet-mousedown-cancel\"><label class=\"luckysheet-mousedown-cancel\" style=\"background-color: ' + f + '\" title=\"' + f + '\"></label><input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/></div>';\r\n                    }\r\n                }\r\n                filterFcColorHtml = '<div id=\"filterFcColor\" class=\"box luckysheet-mousedown-cancel\"><div class=\"title luckysheet-mousedown-cancel\">'+locale_filter.filiterByTextColorTip+'</div><div style=\"max-height:128px;overflow:auto;\" class=\"luckysheet-mousedown-cancel\">' + fcColorItemHtml + '</div></div>';\r\n            }\r\n            //\r\n            let content;\r\n            if(filterBgColorHtml == '' && filterFcColorHtml == ''){\r\n                content = '<div class=\"luckysheet-mousedown-cancel\" style=\"padding: 10px 30px;text-align: center;\">'+locale_filter.filterContainerOneColorTip+'</div>';\r\n            }\r\n            else{\r\n                content = filterBgColorHtml + filterFcColorHtml + '<div class=\"luckysheet-mousedown-cancel\"><button id=\"luckysheet-filter-orderby-color-confirm\" class=\"btn btn-primary luckysheet-mousedown-cancel\" style=\"margin: 5px 20px;width: 70px;\">'+locale_button.confirm+'</button></div>';\r\n            }\r\n            //颜色筛选子菜单\r\n            $(\"#luckysheet-filter-orderby-color-submenu\").remove();\r\n            $(\"body\").append('<div id=\"luckysheet-filter-orderby-color-submenu\" class=\"luckysheet-cols-menu luckysheet-mousedown-cancel\">'+content+'</div>');\r\n            let $t = $(\"#luckysheet-filter-orderby-color-submenu\").end();\r\n            let $con = $(this).parent();\r\n            let winW = $(window).width(), winH = $(window).height();\r\n            let menuW = $con.width(), \r\n                myh = $t.height() + 25, \r\n                myw = $t.width() + 5;\r\n            let offset = $(this).offset();\r\n            let top = offset.top, left = offset.left + menuW;\r\n    \r\n            if (left + myw > winW) {\r\n                left = offset.left - myw;\r\n            }\r\n    \r\n            if (top + myh > winH) {\r\n                top = winH - myh;\r\n            }\r\n    \r\n            $(\"#luckysheet-filter-orderby-color-submenu\").css({ \"top\": top, \"left\": left }).show();\r\n        },\r\n        function(){\r\n            submenuhide = setTimeout(function () { $(\"#luckysheet-filter-orderby-color-submenu\").hide(); }, 200);\r\n        }\r\n    );\r\n\r\n    $(document).on(\"mouseover mouseleave\", \"#luckysheet-filter-orderby-color-submenu\", function(e){\r\n        if (e.type === \"mouseover\") {\r\n            clearTimeout(submenuhide);\r\n        } \r\n        else {\r\n            $(this).hide();\r\n        }\r\n    });\r\n    $(document).on(\"click\", \"#luckysheet-filter-orderby-color-submenu .item label\", function(){\r\n        $(this).siblings(\"input[type='checkbox']\").click();\r\n    });\r\n    $(document).off(\"click.orderbyColorConfirm\").on(\"click.orderbyColorConfirm\", \"#luckysheet-filter-orderby-color-submenu #luckysheet-filter-orderby-color-confirm\", function(){\r\n        let bg_colorMap = {};\r\n        let fc_colorMap = {};\r\n        \r\n        $(\"#luckysheet-filter-orderby-color-submenu .item\").each(function(i, e){\r\n            if($(e).find(\"input[type='checkbox']\").is(\":checked\")){\r\n                let color = $(this).find(\"label\").attr(\"title\");\r\n                let $id = $(this).closest(\".box\").attr(\"id\");\r\n    \r\n                if($id == \"filterBgColor\"){\r\n                    bg_colorMap[color] = 0;\r\n                }\r\n                else if($id == \"filterFcColor\"){\r\n                    fc_colorMap[color] = 0;\r\n                }\r\n            }\r\n        });\r\n        \r\n        let bg_filter;\r\n        if($(\"#luckysheet-filter-orderby-color-submenu #filterBgColor\").length > 0){\r\n            bg_filter = true;\r\n        }\r\n        else{\r\n            bg_filter = false;\r\n        }\r\n        \r\n        let fc_filter;\r\n        if($(\"#luckysheet-filter-orderby-color-submenu #filterFcColor\").length > 0){\r\n            fc_filter = true;\r\n        }\r\n        else{\r\n            fc_filter = false;\r\n        }\r\n    \r\n        let $menu = $(\"#luckysheet-filter-menu\");\r\n        let st_r = $menu.data(\"str\"), \r\n            ed_r = $menu.data(\"edr\"), \r\n            cindex = $menu.data(\"cindex\"), \r\n            st_c = $menu.data(\"stc\"), \r\n            ed_c = $menu.data(\"edc\");\r\n    \r\n        let rowhiddenother = {}; //其它筛选列的隐藏行\r\n        $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").not($(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").eq(cindex - st_c).get(0)).each(function () {\r\n            let $t = $(this), rh = $t.data(\"rowhidden\");\r\n    \r\n            if (rh == \"\") {\r\n                return true;\r\n            }\r\n    \r\n            rh = JSON.parse(rh);\r\n            \r\n            for (let r in rh) {\r\n                rowhiddenother[r] = 0;\r\n            }\r\n        });\r\n    \r\n        let filterdata = {};\r\n        let rowhidden = {};\r\n        let caljs = {};\r\n    \r\n        let af_compute = alternateformat.getComputeMap();\r\n        let cf_compute = conditionformat.getComputeMap();\r\n    \r\n        for (let r = st_r + 1; r <= ed_r; r++) {\r\n            if(r in rowhiddenother){\r\n                continue;\r\n            }\r\n    \r\n            if(Store.flowdata[r] == null){\r\n                continue;\r\n            }\r\n    \r\n            let cell = Store.flowdata[r][cindex];\r\n    \r\n            //单元格颜色\r\n            let bg = menuButton.checkstatus(Store.flowdata, r, cindex , \"bg\");\r\n    \r\n            let checksAF = alternateformat.checksAF(r, cindex, af_compute);\r\n            if(checksAF != null){//若单元格有交替颜色\r\n                bg = checksAF[1];\r\n            }\r\n    \r\n            let checksCF = conditionformat.checksCF(r, cindex, cf_compute);\r\n            if(checksCF != null && checksCF[\"cellColor\"] != null){//若单元格有条件格式\r\n                bg = checksCF[\"cellColor\"];\r\n            }\r\n            \r\n            // bg maybe null\r\n            bg = bg == null ? '#ffffff' : bg;\r\n\r\n            if(bg.indexOf(\"rgb\") > -1){\r\n                bg = rgbTohex(bg);\r\n            }\r\n    \r\n            if(bg.length == 4){\r\n                bg = bg.substr(0, 1) + bg.substr(1, 1).repeat(2) + bg.substr(2, 1).repeat(2) + bg.substr(3, 1).repeat(2);\r\n            }\r\n    \r\n            //文本颜色\r\n            let fc = menuButton.checkstatus(Store.flowdata, r, cindex , \"fc\");\r\n    \r\n            if(checksAF != null){//若单元格有交替颜色\r\n                fc = checksAF[0];\r\n            }\r\n    \r\n            if(checksCF != null && checksCF[\"textColor\"] != null){//若单元格有条件格式\r\n                fc = checksCF[\"textColor\"];\r\n            }\r\n    \r\n            if(fc.indexOf(\"rgb\") > -1){\r\n                fc = rgbTohex(fc);\r\n            }\r\n    \r\n            if(fc.length == 4){\r\n                fc = fc.substr(0, 1) + fc.substr(1, 1).repeat(2) + fc.substr(2, 1).repeat(2) + fc.substr(3, 1).repeat(2);\r\n            }\r\n    \r\n            if(bg_filter && fc_filter){\r\n                if(!(bg in bg_colorMap) && (!(fc in fc_colorMap) || cell == null || isRealNull(cell.v))){\r\n                    rowhidden[r] = 0;\r\n                }\r\n            }\r\n            else if(bg_filter){\r\n                if(!(bg in bg_colorMap)){\r\n                    rowhidden[r] = 0;\r\n                }\r\n            }\r\n            else if(fc_filter){\r\n                if(!(fc in fc_colorMap) || cell == null || isRealNull(cell.v)){\r\n                    rowhidden[r] = 0;\r\n                }\r\n            }\r\n        }\r\n    \r\n        let $top = $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").eq(cindex - st_c);\r\n    \r\n        let optionstate = Object.keys(rowhidden).length > 0;\r\n    \r\n        let rowhiddenall = $.extend(true, rowhiddenother, rowhidden), \r\n            rowhidenPre = json.parseJsonParm($top.data(\"rowhidden\"));\r\n    \r\n        labelFilterOptionState($top, optionstate, rowhidden, caljs, true, st_r, ed_r, cindex, st_c, ed_c);\r\n    \r\n        let cfg = $.extend(true, {}, Store.config);\r\n        cfg[\"rowhidden\"] = rowhiddenall;\r\n    \r\n        //保存撤销\r\n        if(Store.clearjfundo){\r\n            let redo = {};\r\n            redo[\"type\"] = \"datachangeAll_filter\";\r\n            redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n    \r\n            redo[\"config\"] = $.extend(true, {}, Store.config);\r\n            redo[\"curconfig\"] = cfg;\r\n    \r\n            redo[\"optionstate\"] = optionstate;\r\n            redo[\"optionsindex\"] = cindex - st_c;\r\n    \r\n            redo[\"rowhidden\"] = $.extend(true, {}, rowhidden);\r\n            redo[\"rowhidenPre\"] = $.extend(true, {}, rowhidenPre);\r\n    \r\n            if (caljs != null) {\r\n                redo[\"caljs\"] = caljs;\r\n            }\r\n    \r\n            Store.jfundo.length  = 0;\r\n            Store.jfredo.push(redo);\r\n        }\r\n    \r\n        //config\r\n        Store.config = cfg;\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n    \r\n        server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n    \r\n        //行高、列宽 刷新  \r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    \r\n        $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu, #luckysheet-filter-orderby-color-submenu\").hide();\r\n        cleargridelement();\r\n    });\r\n\r\n    //点击复选框\r\n    $(document).off(\"click.filterCheckbox1\").on(\"click.filterCheckbox1\", \"#luckysheet-filter-byvalue-select .textBox\",function(){\r\n        if($(this).attr(\"data-check\") == \"true\"){\r\n            $(this).attr(\"data-check\", \"false\");\r\n            $(this).find(\"input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n        else{\r\n            $(this).attr(\"data-check\", \"true\");\r\n            $(this).find(\"input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n    })\r\n    $(document).off(\"click.filterCheckbox2\").on(\"click.filterCheckbox2\", \"#luckysheet-filter-byvalue-select .year\",function(){\r\n        if($(this).attr(\"data-check\") == \"true\"){\r\n            $(this).attr(\"data-check\", \"false\");\r\n            $(this).parents(\".yearBox\").find(\".month\").attr(\"data-check\", \"false\");\r\n            $(this).parents(\".yearBox\").find(\".day\").attr(\"data-check\", \"false\");\r\n            $(this).parents(\".yearBox\").find(\"input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n        else{\r\n            $(this).attr(\"data-check\", \"true\");\r\n            $(this).parents(\".yearBox\").find(\".month\").attr(\"data-check\", \"true\");\r\n            $(this).parents(\".yearBox\").find(\".day\").attr(\"data-check\", \"true\");\r\n            $(this).parents(\".yearBox\").find(\"input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n    })\r\n    $(document).off(\"click.filterCheckbox3\").on(\"click.filterCheckbox3\", \"#luckysheet-filter-byvalue-select .month\",function(){\r\n        //月份 对应的 天\r\n        if($(this).attr(\"data-check\") == \"true\"){\r\n            $(this).attr(\"data-check\", \"false\");\r\n            $(this).parents(\".monthBox\").find(\".day\").attr(\"data-check\", \"false\");\r\n            $(this).parents(\".monthBox\").find(\"input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n        else{\r\n            $(this).attr(\"data-check\", \"true\");\r\n            $(this).parents(\".monthBox\").find(\".day\").attr(\"data-check\", \"true\");\r\n            $(this).parents(\".monthBox\").find(\"input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n        //月份 对应的 年份\r\n        let yearDayAllCheck = true;\r\n        let $yearDay = $(this).parents(\".yearBox\").find(\".day\");\r\n        $yearDay.each(function(i,e){\r\n            if($(e).attr(\"data-check\") == \"true\"){\r\n                \r\n            }\r\n            else{\r\n                yearDayAllCheck = false;\r\n            }\r\n        });\r\n        if(yearDayAllCheck){\r\n            $(this).parents(\".yearBox\").find(\".year\").attr(\"data-check\", \"true\");\r\n            $(this).parents(\".yearBox\").find(\".year input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n        else{\r\n            $(this).parents(\".yearBox\").find(\".year\").attr(\"data-check\", \"false\");\r\n            $(this).parents(\".yearBox\").find(\".year input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n    })\r\n    $(document).off(\"click.filterCheckbox4\").on(\"click.filterCheckbox4\", \"#luckysheet-filter-byvalue-select .day\",function(){\r\n        if($(this).attr(\"data-check\") == \"true\"){\r\n            $(this).attr(\"data-check\", \"false\");\r\n            $(this).find(\"input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n        else{\r\n            $(this).attr(\"data-check\", \"true\");\r\n            $(this).find(\"input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n        //天 对应的 月份\r\n        let monthDayAllCheck = true;\r\n        let $monthDay = $(this).parents(\".monthBox\").find(\".day\");\r\n        $monthDay.each(function(i,e){\r\n            if($(e).attr(\"data-check\") == \"true\"){\r\n                \r\n            }\r\n            else{\r\n                monthDayAllCheck = false;\r\n            }\r\n        });\r\n        if(monthDayAllCheck){\r\n            $(this).parents(\".monthBox\").find(\".month\").attr(\"data-check\", \"true\");\r\n            $(this).parents(\".monthBox\").find(\".month input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n        else{\r\n            $(this).parents(\".monthBox\").find(\".month\").attr(\"data-check\", \"false\");\r\n            $(this).parents(\".monthBox\").find(\".month input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n        //天 对应的 年份\r\n        let yearDayAllCheck = true;\r\n        let $yearDay = $(this).parents(\".yearBox\").find(\".day\");\r\n        $yearDay.each(function(i,e){\r\n            if($(e).attr(\"data-check\") == \"true\"){\r\n                \r\n            }\r\n            else{\r\n                yearDayAllCheck = false;\r\n            }\r\n        });\r\n        if(yearDayAllCheck){\r\n            $(this).parents(\".yearBox\").find(\".year\").attr(\"data-check\", \"true\");\r\n            $(this).parents(\".yearBox\").find(\".year input[type='checkbox']\").prop(\"checked\", true);\r\n        }\r\n        else{\r\n            $(this).parents(\".yearBox\").find(\".year\").attr(\"data-check\", \"false\");\r\n            $(this).parents(\".yearBox\").find(\".year input[type='checkbox']\").removeAttr(\"checked\");\r\n        }\r\n    })\r\n\r\n    //日期 三级下拉显示\r\n    $(document).off(\"click.filterYearDropdown\").on(\"click.filterYearDropdown\", \"#luckysheet-filter-byvalue-select .yearBox .fa-caret-right\",function(event){\r\n        let $p = $(this).parents(\".luckysheet-mousedown-cancel\");\r\n        if($p.hasClass(\"year\")){\r\n            $(this).parents(\".yearBox\").find(\".monthList\").slideToggle();\r\n        }\r\n        if($p.hasClass(\"month\")){\r\n            $(this).parents(\".monthBox\").find(\".dayList\").slideToggle();\r\n        }\r\n\r\n        event.stopPropagation();\r\n    });\r\n\r\n    //全选\r\n    $(\"#luckysheet-filter-byvalue-btn-all\").click(function () {\r\n        $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\").prop(\"checked\", true);\r\n        $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\").parents(\".luckysheet-mousedown-cancel\").attr(\"data-check\", \"true\");\r\n    });\r\n\r\n    //清除\r\n    $(\"#luckysheet-filter-byvalue-btn-clear\").click(function () {\r\n        $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\").removeAttr(\"checked\");\r\n        $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\").parents(\".luckysheet-mousedown-cancel\").attr(\"data-check\", \"false\");\r\n    });\r\n\r\n    //反选\r\n    $(\"#luckysheet-filter-byvalue-btn-contra\").click(function () {\r\n        let $input = $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\");\r\n        $input.each(function(i, e){\r\n            if($(e).is(\":checked\")){\r\n                $(e).removeAttr(\"checked\");\r\n                $(e).parents(\".luckysheet-mousedown-cancel\").attr(\"data-check\", \"false\");\r\n            }\r\n            else{\r\n                $(e).prop(\"checked\", true);\r\n                $(e).parents(\".luckysheet-mousedown-cancel\").attr(\"data-check\", \"true\");\r\n            }\r\n        });\r\n        //天 对应的 月份\r\n        let $month = $(\"#luckysheet-filter-byvalue-select .ListBox .monthBox\");\r\n        $month.each(function(index, event){\r\n            let monthDayAllCheck = true;\r\n            let $monthDay = $(event).find(\".day input[type='checkbox']\");\r\n            $monthDay.each(function(i,e){\r\n                if($(e).is(\":checked\")){\r\n                    \r\n                }\r\n                else{\r\n                    monthDayAllCheck = false;\r\n                }\r\n            });\r\n            if(monthDayAllCheck){\r\n                $(event).find(\".month input[type='checkbox']\").prop(\"checked\", true);\r\n                $(event).attr(\"data-check\", \"true\");\r\n            }\r\n            else{\r\n                $(event).find(\".month input[type='checkbox']\").removeAttr(\"checked\");\r\n                $(event).attr(\"data-check\", \"false\");\r\n            }\r\n        });\r\n        //天 对应的 年份\r\n        let $year = $(\"#luckysheet-filter-byvalue-select .ListBox .yearBox\");\r\n        $year.each(function(index, event){\r\n            let yearDayAllCheck = true;\r\n            let $yearDay = $(event).find(\".day input[type='checkbox']\");\r\n            $yearDay.each(function(i,e){\r\n                if($(e).is(\":checked\")){\r\n                    \r\n                }\r\n                else{\r\n                    yearDayAllCheck = false;\r\n                }\r\n            });\r\n            if(yearDayAllCheck){\r\n                $(event).find(\".year input[type='checkbox']\").prop(\"checked\", true);\r\n                $(event).attr(\"data-check\", \"true\");\r\n            }\r\n            else{\r\n                $(event).find(\".year input[type='checkbox']\").removeAttr(\"checked\");\r\n                $(event).attr(\"data-check\", \"false\");\r\n            }\r\n        });\r\n    });\r\n\r\n    //清除筛选\r\n    $(\"#luckysheet-filter-initial\").click(function () {\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"filter\")){\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").hide().find(\"input\").val();\r\n        $(\"#luckysheet-filter-selected span\").data(\"type\", \"0\").data(\"type\", null).text(locale_filter.conditionNone);\r\n\r\n        let redo = {};\r\n        redo[\"type\"] = \"datachangeAll_filter_clear\";\r\n        redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n        redo[\"config\"] = $.extend(true, {}, Store.config);\r\n        Store.config[\"rowhidden\"] = {};\r\n        redo[\"curconfig\"] = $.extend(true, {}, Store.config);\r\n\r\n        redo[\"filter_save\"] = $.extend(true, {}, Store.luckysheet_filter_save);\r\n\r\n        let optiongroups = [];\r\n        $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").each(function () {\r\n            let $t = $(this);\r\n\r\n            let optionstate = $t.hasClass(\"luckysheet-filter-options-active\");\r\n            let rowhidden = json.parseJsonParm($t.data(\"rowhidden\"));\r\n            let caljs = json.parseJsonParm($t.data(\"caljs\"));\r\n\r\n            optiongroups.push({\r\n                \"optionstate\":optionstate,\r\n                \"rowhidden\": rowhidden, \r\n                \"caljs\":caljs, \r\n                \"str\": $t.data(\"str\"),\r\n                \"edr\": $t.data(\"edr\"),\r\n                \"cindex\": $t.data(\"cindex\"),\r\n                \"stc\": $t.data(\"stc\"),\r\n                \"edc\": $t.data(\"edc\")\r\n            });\r\n        });\r\n        redo[\"optiongroups\"] = optiongroups;\r\n\r\n        Store.jfundo.length  = 0;\r\n        Store.jfredo.push(redo);\r\n\r\n        $('#luckysheet-filter-selected-sheet' + Store.currentSheetIndex + ', #luckysheet-filter-options-sheet' + Store.currentSheetIndex).remove();\r\n        $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n\r\n        //清除筛选发送给后台\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].filter = null;\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].filter_select = null;\r\n\r\n        server.saveParam(\"fsc\", Store.currentSheetIndex, null);\r\n\r\n        //config\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n        server.saveParam(\"cg\", Store.currentSheetIndex, {}, { \"k\": \"rowhidden\" });\r\n\r\n        //行高、列宽 刷新  \r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    });\r\n\r\n    //按照值进行筛选\r\n    $(\"#luckysheet-filter-byvalue-input\").on('input propertychange', function () {\r\n        let v = $(this).val().toString();\r\n        $(\"#luckysheet-filter-byvalue-select .ListBox .luckysheet-mousedown-cancel\").show();\r\n        \r\n        if(v != \"\"){\r\n            $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\").each(function(i, e){\r\n                if($(e).closest(\".day\").length > 0){\r\n                    let day = $(e).siblings(\"label\").text().toString();\r\n                    let month = $(e).closest(\".monthBox\").find(\".month label\").text().toString();\r\n                    let year = $(e).closest(\".yearBox\").find(\".year label\").text().toString();\r\n                    let itemV = year + \"-\" + month + \"-\" + day;\r\n\r\n                    if(itemV.indexOf(v) == -1){\r\n                        $(e).closest(\".day\").hide();\r\n                        \r\n                        //天 对应的 月份\r\n                        let $monthDay = $(e).closest(\".dayList\").find(\".day:visible\");\r\n                        if($monthDay.length == 0){\r\n                            $(e).closest(\".monthBox\").find(\".month\").hide();\r\n                        }\r\n\r\n                        //天 对应的 年份\r\n                        let $yearDay = $(e).closest(\".monthList\").find(\".day:visible\");\r\n                        if($yearDay.length == 0){\r\n                            $(e).closest(\".yearBox\").find(\".year\").hide();\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if($(e).closest(\".textBox\").length > 0){\r\n                    let itemV = $(e).siblings(\"label\").text().toString();\r\n                    \r\n                    if(itemV.indexOf(v) == -1){\r\n                        $(e).parents(\".textBox\").hide();\r\n                    }\r\n                }\r\n            });\r\n        }\r\n    });\r\n\r\n    //筛选取消\r\n    $(\"#luckysheet-filter-cancel\").click(function () {\r\n        $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n    });\r\n\r\n    //筛选 确认\r\n    $(\"#luckysheet-filter-confirm\").click(function () {\r\n        let $menu = $(\"#luckysheet-filter-menu\");\r\n        let st_r = $menu.data(\"str\"), \r\n            ed_r = $menu.data(\"edr\"), \r\n            cindex = $menu.data(\"cindex\"), \r\n            st_c = $menu.data(\"stc\"), \r\n            ed_c = $menu.data(\"edc\");\r\n\r\n        let rowhiddenother = {}; //其它筛选列的隐藏行\r\n        $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").not($(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").eq(cindex - st_c).get(0)).each(function () {\r\n            let $t = $(this), rh = $t.data(\"rowhidden\");\r\n\r\n            if (rh == \"\") {\r\n                return true;\r\n            }\r\n\r\n            rh = JSON.parse(rh.replace(/\\'/g, '\"'));\r\n            \r\n            for (let r in rh) {\r\n                rowhiddenother[r] = 0;\r\n            }\r\n        });\r\n\r\n        let filterdata = {};\r\n        let rowhidden = {};\r\n        let caljs = {};\r\n\r\n        if ($(\"#luckysheet-filter-bycondition\").next().is(\":visible\") && $(\"#luckysheet-filter-byvalue\").next().is(\":hidden\") && $(\"#luckysheet-filter-selected span\").data(\"value\") != \"null\") {\r\n            let $t = $(\"#luckysheet-filter-selected span\");\r\n            let type = $t.data(\"type\"), value = $t.data(\"value\");\r\n\r\n            caljs[\"value\"] = value;\r\n            caljs[\"text\"] = $t.text();\r\n\r\n            if (type == \"0\") {\r\n                caljs[\"type\"] = \"0\";\r\n            }\r\n            else if (type == \"2\") {\r\n                let $input = $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input2 input\");\r\n                caljs[\"type\"] = \"2\";\r\n                caljs[\"value1\"] = $input.eq(0).val();\r\n                caljs[\"value2\"] = $input.eq(1).val();\r\n            }\r\n            else {\r\n                caljs[\"type\"] = \"1\";\r\n                caljs[\"value1\"] = $(\"#luckysheet-filter-menu .luckysheet-filter-selected-input\").eq(0).find(\"input\").val();\r\n            }\r\n\r\n            for (let r = st_r + 1; r <= ed_r; r++) {\r\n                if(r in rowhiddenother){\r\n                    continue;\r\n                }\r\n\r\n                if(Store.flowdata[r] == null){\r\n                    continue;\r\n                }\r\n\r\n                let cell = Store.flowdata[r][cindex];\r\n                \r\n                if (value == \"cellnull\") { //单元格为空\r\n                    if(cell != null && !isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"cellnonull\") { //单元格有数据\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"textinclude\") { //文本包含 \r\n                    let value1 = caljs[\"value1\"];\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else{\r\n                        if(cell.m.indexOf(value1) == -1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                }\r\n                else if (value == \"textnotinclude\") { //文本不包含\r\n                    let value1 = caljs[\"value1\"];\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n\r\n                    }\r\n                    else{\r\n                        if(cell.m.indexOf(value1) > -1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                }\r\n                else if (value == \"textstart\") { //文本开头为\r\n                    let value1 = caljs[\"value1\"], valuelen = value1.length;\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else{\r\n                        if(cell.m.substr(0, valuelen) != value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                }\r\n                else if (value == \"textend\") { //文本结尾为\r\n                    let value1 = caljs[\"value1\"], valuelen = value1.length;\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else{\r\n                        if(valuelen > cell.m.length || cell.m.substr(cell.m.length - valuelen, valuelen) != value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                }\r\n                else if (value == \"textequal\") { //文本等于\r\n                    let value1 = caljs[\"value1\"];\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else{\r\n                        if(cell.m != value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                }\r\n                else if (value == \"dateequal\") { //日期等于\r\n                    let value1 = genarate(caljs[\"value1\"])[2];\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"d\"){\r\n                        if(parseInt(cell.v) != value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"datelessthan\") { //日期早于\r\n                    let value1 = genarate(caljs[\"value1\"])[2];\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"d\"){\r\n                        if(parseInt(cell.v) >= value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"datemorethan\") { //日期晚于\r\n                    let value1 = genarate(caljs[\"value1\"])[2];\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"d\"){\r\n                        if(parseInt(cell.v) <= value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"morethan\") { //大于\r\n                    let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v <= value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"moreequalthan\") { //大于等于\r\n                    let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v < value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"lessthan\") { //小于\r\n                    let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v >= value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"lessequalthan\") { //小于等于\r\n                    let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v > value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"equal\") { //等于\r\n                    let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v != value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"noequal\") { //不等于\r\n                    let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v == value1){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"include\") { //介于\r\n                    let value1 = parseFloat(caljs[\"value1\"]), value2 = parseFloat(caljs[\"value2\"]);\r\n\r\n                    let min, max;\r\n                    if(value1 < value2){\r\n                        min = value1;\r\n                        max = value2;\r\n                    }\r\n                    else{\r\n                        max = value1;\r\n                        min = value2;   \r\n                    }\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v < min || cell.v > max){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n                else if (value == \"noinclude\") { //不在其中\r\n                    let value1 = parseFloat(caljs[\"value1\"]), value2 = parseFloat(caljs[\"value2\"]);\r\n\r\n                    let min, max;\r\n                    if(value1 < value2){\r\n                        min = value1;\r\n                        max = value2;\r\n                    }\r\n                    else{\r\n                        max = value1;\r\n                        min = value2;   \r\n                    }\r\n\r\n                    if(cell == null || isRealNull(cell.v)){\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                    else if(cell.ct != null && cell.ct.t == \"n\"){\r\n                        if(cell.v >= min && cell.v <= max){\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                    else{\r\n                        rowhidden[r] = 0;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']\").each(function(i, e){\r\n                if($(e).is(\":visible\") && $(e).is(\":checked\")){\r\n                    return true;\r\n                }\r\n\r\n                if($(e).closest(\".day\").length > 0){\r\n                    let day = $(e).siblings(\"label\").text();\r\n                    if(Number(day) < 10){\r\n                        day = \"0\" + Number(day);\r\n                    }\r\n\r\n                    let month = $(e).closest(\".monthBox\").find(\".month label\").text().replace(locale_filter.filiterMonthText, \"\");\r\n                    if(Number(month) < 10){\r\n                        month = \"0\" + Number(month);\r\n                    }\r\n\r\n                    let year = $(e).closest(\".yearBox\").find(\".year label\").text().replace(locale_filter.filiterYearText, \"\");\r\n\r\n                    let itemV = locale_filter.filterDateFormatTip +\"#$$$#\" + year + \"-\" + month + \"-\" + day;\r\n\r\n                    filterdata[itemV] = \"1\";\r\n                }\r\n\r\n                if($(e).closest(\".textBox\").length > 0){\r\n                    let itemV = $(e).closest(\".textBox\").data(\"filter\");\r\n\r\n                    filterdata[itemV] = \"1\";\r\n                }\r\n            });\r\n            \r\n            for (let r = st_r + 1; r <= ed_r; r++) {\r\n                if(r in rowhiddenother){\r\n                    continue;\r\n                }\r\n\r\n                if(Store.flowdata[r] == null){\r\n                    continue;\r\n                }\r\n\r\n                let cell = Store.flowdata[r][cindex];\r\n\r\n                let value;\r\n                if((cell == null || isRealNull(cell.v)) && cell?.mc){\r\n                    const { r, c } = cell.mc\r\n                    const mainCell = Store.flowdata[r][c]\r\n                    value = mainCell.v + \"#$$$#\" + mainCell.m;\r\n                }\r\n                else if(cell == null || isRealNull(cell.v)){\r\n                    value = \"null#$$$#null\";\r\n                }\r\n                else if(cell.ct != null && cell.ct.t == \"d\"){\r\n                    let fmt = update(\"YYYY-MM-DD\", cell.v);\r\n                    value = locale_filter.filterDateFormatTip +\"#$$$#\" + fmt;\r\n                }\r\n                else{\r\n                    value = cell.v + \"#$$$#\" + cell.m;\r\n                }\r\n\r\n                if(value in filterdata){\r\n                    rowhidden[r] = 0;\r\n                }\r\n            }\r\n        }\r\n\r\n        let $top = $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").eq(cindex - st_c);\r\n\r\n        let optionstate = $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']:visible:checked\").length < $(\"#luckysheet-filter-byvalue-select .ListBox input[type='checkbox']:visible\").length || $(\"#luckysheet-filter-byvalue-input\").val().length > 0 || ($(\"#luckysheet-filter-bycondition\").next().is(\":visible\") && $(\"#luckysheet-filter-byvalue\").next().is(\":hidden\") && $(\"#luckysheet-filter-selected span\").data(\"value\") != \"null\");\r\n\r\n        let rowhiddenall = $.extend(true, rowhiddenother, rowhidden), \r\n            rowhidenPre = json.parseJsonParm($top.data(\"rowhidden\"));\r\n\r\n        labelFilterOptionState($top, optionstate, rowhidden, caljs, true, st_r, ed_r, cindex, st_c, ed_c);\r\n\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        cfg[\"rowhidden\"] = rowhiddenall;\r\n\r\n        //保存撤销\r\n        if(Store.clearjfundo){\r\n            let redo = {};\r\n            redo[\"type\"] = \"datachangeAll_filter\";\r\n            redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n            redo[\"config\"] = $.extend(true, {}, Store.config);\r\n            redo[\"curconfig\"] = cfg;\r\n\r\n            redo[\"optionstate\"] = optionstate;\r\n            redo[\"optionsindex\"] = cindex - st_c;\r\n\r\n            redo[\"rowhidden\"] = $.extend(true, {}, rowhidden);\r\n            redo[\"rowhidenPre\"] = $.extend(true, {}, rowhidenPre);\r\n\r\n            if (caljs != null) {\r\n                redo[\"caljs\"] = caljs;\r\n            }\r\n\r\n            Store.jfundo.length  = 0;\r\n            Store.jfredo.push(redo);\r\n        }\r\n\r\n        //config\r\n        Store.config = cfg;\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n        server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n\r\n        //行高、列宽 刷新  \r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n\r\n        $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n        cleargridelement();\r\n    });\r\n}\r\n\r\nexport {\r\n    labelFilterOptionState,\r\n    orderbydatafiler,\r\n    createFilter,\r\n    createFilterOptions,\r\n    initialFilterHandler\r\n}"
  },
  {
    "path": "src/controllers/formulaBar.js",
    "content": "import menuButton from './menuButton';\r\nimport {luckysheetupdateCell} from './updateCell';\r\nimport { keycode } from './constant';\r\nimport { \r\n    luckysheetMoveHighlightCell,\r\n} from './sheetMove';\r\n\r\nimport insertFormula from './insertFormula';\r\nimport { \r\n    rowLocation, \r\n    colLocation, \r\n    mouseposition \r\n} from '../global/location';\r\nimport { isEditMode } from '../global/validate';\r\nimport formula from '../global/formula';\r\nimport tooltip from '../global/tooltip';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\n\r\nexport function formulaBarInitial(){\r\n    //公式栏处理\r\n\r\n    const _locale = locale();\r\n    const locale_formula= _locale.formula;\r\n\r\n    $(\"#luckysheet-functionbox-cell\").focus(function () {\r\n        if(isEditMode()){//此模式下禁用公式栏\r\n            return;\r\n        }\r\n\r\n        if(Store.luckysheet_select_save.length > 0){\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n            let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n            \r\n            // let $input = $(\"#luckysheet-rich-text-editor\"),value = $input.text();\r\n            // if(value) {\r\n            //     formula.updatecell(row_index, col_index);\r\n            // }\r\n            luckysheetupdateCell(row_index, col_index, Store.flowdata, null, true);\r\n            formula.rangeResizeTo = $(\"#luckysheet-functionbox-cell\");\r\n        }\r\n    }).keydown(function (event) {\r\n        if(isEditMode()){//此模式下禁用公式栏\r\n            return;\r\n        }\r\n\r\n        let ctrlKey = event.ctrlKey;\r\n        let altKey = event.altKey;\r\n        let shiftKey = event.shiftKey;\r\n        let kcode = event.keyCode;\r\n        let $inputbox = $(\"#luckysheet-input-box\");\r\n\r\n        if (kcode == keycode.ENTER && parseInt($inputbox.css(\"top\")) > 0) {\r\n            if ($(\"#luckysheet-formula-search-c\").is(\":visible\") && formula.searchFunctionCell != null) {\r\n                formula.searchFunctionEnter($(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\"));\r\n            }\r\n            else {\r\n                formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                Store.luckysheet_select_save = [{ \"row\": [Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[0]], \"column\": [Store.luckysheetCellUpdate[1], Store.luckysheetCellUpdate[1]], \"row_focus\": Store.luckysheetCellUpdate[0], \"column_focus\": Store.luckysheetCellUpdate[1] }];\r\n                luckysheetMoveHighlightCell(\"down\", 1, \"rangeOfSelect\");\r\n                //$(\"#luckysheet-functionbox-cell\").blur();\r\n                $(\"#luckysheet-rich-text-editor\").focus();\r\n            }\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.ESC && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.dontupdate();\r\n            luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n            //$(\"#luckysheet-functionbox-cell\").blur();\r\n            $(\"#luckysheet-rich-text-editor\").focus();\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.F4 && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.setfreezonFuc(event);\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.UP && parseInt($inputbox.css(\"top\")) > 0) {\r\n            if ($(\"#luckysheet-formula-search-c\").is(\":visible\")) {\r\n                let $up = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\").prev();\r\n                if ($up.length == 0) {\r\n                    $up = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").last();\r\n                }\r\n                $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").removeClass(\"luckysheet-formula-search-item-active\");\r\n                $up.addClass(\"luckysheet-formula-search-item-active\");\r\n                event.preventDefault();\r\n            }\r\n        }\r\n        else if (kcode == keycode.DOWN && parseInt($inputbox.css(\"top\")) > 0) {\r\n            if ($(\"#luckysheet-formula-search-c\").is(\":visible\")) {\r\n                let $up = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\").next();\r\n                if ($up.length == 0) {\r\n                    $up = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").first();\r\n                }\r\n                $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").removeClass(\"luckysheet-formula-search-item-active\");\r\n                $up.addClass(\"luckysheet-formula-search-item-active\");\r\n                event.preventDefault();\r\n            }\r\n        }\r\n        else if (kcode == keycode.LEFT && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.rangeHightlightselected($(\"#luckysheet-functionbox-cell\"));\r\n        }\r\n        else if (kcode == keycode.RIGHT && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.rangeHightlightselected($(\"#luckysheet-functionbox-cell\"));\r\n        }\r\n        else if (!((kcode >= 112 && kcode <= 123) || kcode <= 46 || kcode == 144 || kcode == 108 || event.ctrlKey || event.altKey || (event.shiftKey && (kcode == 37 || kcode == 38 || kcode == 39 || kcode == 40))) || kcode == 8 || kcode == 32 || kcode == 46 || (event.ctrlKey && kcode == 86)) {\r\n            formula.functionInputHanddler($(\"#luckysheet-rich-text-editor\"), $(\"#luckysheet-functionbox-cell\"), kcode);\r\n        }\r\n    }).click(function () {\r\n        if(isEditMode()){//此模式下禁用公式栏\r\n            return;\r\n        }\r\n\r\n        formula.rangeHightlightselected($(\"#luckysheet-functionbox-cell\"));\r\n    });\r\n\r\n    //公式栏 取消（X）按钮\r\n    $(\"#luckysheet-wa-functionbox-cancel\").click(function () {\r\n        if (!$(this).hasClass(\"luckysheet-wa-calculate-active\")) {\r\n            return;\r\n        }\r\n        //若有参数弹出框，隐藏\r\n        if($(\"#luckysheet-search-formula-parm\").is(\":visible\")){\r\n            $(\"#luckysheet-search-formula-parm\").hide();\r\n        }\r\n        //若有参数选取范围弹出框，隐藏\r\n        if($(\"#luckysheet-search-formula-parm-select\").is(\":visible\")){\r\n            $(\"#luckysheet-search-formula-parm-select\").hide();\r\n        }\r\n\r\n        formula.dontupdate();\r\n        luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n    });\r\n\r\n    //公式栏 确认（）按钮\r\n    $(\"#luckysheet-wa-functionbox-confirm\").click(function () {\r\n        if (!$(this).hasClass(\"luckysheet-wa-calculate-active\")) {\r\n            return;\r\n        }\r\n        //若有参数弹出框，隐藏\r\n        if($(\"#luckysheet-search-formula-parm\").is(\":visible\")){\r\n            $(\"#luckysheet-search-formula-parm\").hide();\r\n        }\r\n        //若有参数选取范围弹出框，隐藏\r\n        if($(\"#luckysheet-search-formula-parm-select\").is(\":visible\")){\r\n            $(\"#luckysheet-search-formula-parm-select\").hide();\r\n        }\r\n\r\n        formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n        luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n    });\r\n\r\n    //公式栏 fx按钮\r\n    $(\"#luckysheet-wa-functionbox-fx\").click(function () {\r\n        //点击函数查找弹出框\r\n        if(Store.luckysheet_select_save.length == 0){\r\n            if(isEditMode()){\r\n                alert(locale_formula.tipSelectCell);\r\n            }\r\n            else{\r\n                tooltip.info(locale_formula.tipSelectCell,\"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n        let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n\r\n        luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n        \r\n        let cell = Store.flowdata[row_index][col_index];\r\n        if(cell != null && cell.f != null){\r\n            //单元格有计算\r\n            let functionStr = formula.getfunctionParam(cell.f);\r\n            if(functionStr.fn != null){\r\n                //有函数公式\r\n                insertFormula.formulaParmDialog(functionStr.fn, functionStr.param);\r\n            }\r\n            else{\r\n                //无函数公式\r\n                insertFormula.formulaListDialog();\r\n            }\r\n        }\r\n        else{\r\n            //单元格无计算\r\n            $(\"#luckysheet-rich-text-editor\").html('<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span>');\r\n            $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n            insertFormula.formulaListDialog();\r\n        }\r\n\r\n        insertFormula.init();\r\n    });\r\n\r\n    //公式选区操作\r\n    $(\"#luckysheet-formula-functionrange\").on(\"mousedown\", \".luckysheet-copy\", function (event) {\r\n        formula.rangeMove = true;\r\n        Store.luckysheet_scroll_status = true;\r\n        formula.rangeMoveObj = $(this).parent();\r\n        formula.rangeMoveIndex = $(this).parent().attr(\"rangeindex\");\r\n        \r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n        $(\"#luckysheet-formula-functionrange-highlight-\" + formula.rangeMoveIndex).find(\".luckysheet-selection-copy-hc\").css(\"opacity\", 0.13);\r\n        \r\n        let type = $(this).data(\"type\");\r\n        if (type == \"top\") {\r\n            y += 3;\r\n        }\r\n        else if (type == \"right\") {\r\n            x -= 3;\r\n        }\r\n        else if (type == \"bottom\") {\r\n            y -= 3;\r\n        }\r\n        else if (type == \"left\") {\r\n            x += 3;\r\n        }\r\n\r\n        let row_index = rowLocation(y)[2];\r\n        let col_index = colLocation(x)[2];\r\n\r\n        formula.rangeMovexy = [row_index, col_index];\r\n        $(\"#luckysheet-sheettable\").css(\"cursor\", \"move\");\r\n        event.stopPropagation();\r\n    });\r\n\r\n    $(\"#luckysheet-formula-functionrange\").on(\"mousedown\", \".luckysheet-highlight\", function (event) {\r\n        formula.rangeResize = $(this).data(\"type\");//开始状态resize\r\n        formula.rangeResizeIndex = $(this).parent().attr(\"rangeindex\");\r\n        \r\n        let mouse = mouseposition(event.pageX, event.pageY), \r\n            scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(), \r\n            scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let x = mouse[0] + scrollLeft;\r\n        let y = mouse[1] + scrollTop;\r\n        formula.rangeResizeObj = $(this).parent();\r\n        $(\"#luckysheet-formula-functionrange-highlight-\" + formula.rangeResizeIndex).find(\".luckysheet-selection-copy-hc\").css(\"opacity\", 0.13);\r\n        \r\n        if (formula.rangeResize == \"lt\") {\r\n            x += 3;\r\n            y += 3;\r\n        }\r\n        else if (formula.rangeResize == \"lb\") {\r\n            x += 3;\r\n            y -= 3;\r\n        }\r\n        else if (formula.rangeResize == \"rt\") {\r\n            x -= 3;\r\n            y += 3;\r\n        }\r\n        else if (formula.rangeResize == \"rb\") {\r\n            x -= 3;\r\n            y -= 3;\r\n        }\r\n\r\n        let row_location = rowLocation(y), \r\n            row = row_location[1], \r\n            row_pre = row_location[0], \r\n            row_index = row_location[2];\r\n        let col_location = colLocation(x), \r\n            col = col_location[1], \r\n            col_pre = col_location[0], \r\n            col_index = col_location[2];\r\n\r\n        let position = formula.rangeResizeObj.position();\r\n        formula.rangeResizexy = [\r\n            col_pre, \r\n            row_pre, \r\n            formula.rangeResizeObj.width(), \r\n            formula.rangeResizeObj.height(), \r\n            position.left + scrollLeft, \r\n            position.top + scrollTop, col, row\r\n        ];\r\n        formula.rangeResizeWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n        formula.rangeResizeWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n        Store.luckysheet_scroll_status = true;\r\n        event.stopPropagation();\r\n    });\r\n}"
  },
  {
    "path": "src/controllers/freezen.js",
    "content": "import { getSheetIndex } from '../methods/get';\r\nimport { luckysheet_searcharray } from './sheetSearch';\r\nimport { selectHightlightShow } from './select';\r\nimport { createFilterOptions } from './filter';\r\nimport server from './server';\r\nimport menuButton from './menuButton';\r\nimport luckysheetPostil from './postil';\r\nimport luckysheetDropCell from './dropCell';\r\nimport { rowLocationByIndex, colLocationByIndex } from '../global/location';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\n\r\n\r\nconst luckysheetFreezen = {\r\n    freezenHorizontalHTML: '<div id=\"luckysheet-freezebar-horizontal\" class=\"luckysheet-freezebar\" tabindex=\"0\"><div class=\"luckysheet-freezebar-handle luckysheet-freezebar-horizontal-handle\" ><div class=\"luckysheet-freezebar-handle-bar luckysheet-freezebar-horizontal-handle-title\" ></div><div class=\"luckysheet-freezebar-handle-bar luckysheet-freezebar-horizontal-handle-bar\" ></div></div><div class=\"luckysheet-freezebar-drop luckysheet-freezebar-horizontal-drop\" ><div class=\"luckysheet-freezebar-drop-bar luckysheet-freezebar-horizontal-drop-title\" ></div><div class=\"luckysheet-freezebar-drop-bar luckysheet-freezebar-horizontal-drop-bar\" >&nbsp;</div></div></div>',\r\n    freezenVerticalHTML: '<div id=\"luckysheet-freezebar-vertical\" class=\"luckysheet-freezebar\" tabindex=\"0\"><div class=\"luckysheet-freezebar-handle luckysheet-freezebar-vertical-handle\" ><div class=\"luckysheet-freezebar-handle-bar luckysheet-freezebar-vertical-handle-title\" ></div><div class=\"luckysheet-freezebar-handle-bar luckysheet-freezebar-vertical-handle-bar\" ></div></div><div class=\"luckysheet-freezebar-drop luckysheet-freezebar-vertical-drop\" ><div class=\"luckysheet-freezebar-drop-bar luckysheet-freezebar-vertical-drop-title\" ></div><div class=\"luckysheet-freezebar-drop-bar luckysheet-freezebar-vertical-drop-bar\" >&nbsp;</div></div></div>',\r\n    initialHorizontal: true,\r\n    initialVertical: true,\r\n    horizontalmovestate: false,\r\n    horizontalmoveposition: null,\r\n    verticalmovestate: false,\r\n    verticalmoveposition: null,\r\n    windowHeight: null,\r\n    windowWidth: null,\r\n    freezenhorizontaldata: null,\r\n    freezenverticaldata: null,\r\n    // 定义冻结首行、首列是实际的第一行第一列还是当前视图的第一行第一列\r\n    // excel 为视图的第一行第一列，但此处实现有问题，如滚动到15行冻结首行，当前冻结了15行，保存再进去实际冻结了第一行\r\n    // 冻结真实的第一行、第一列更符合直觉\r\n    freezenRealFirstRowColumn: true, \r\n    cutVolumn: function (arr, cutindex) {\r\n        if(cutindex <= 0){\r\n            return arr;\r\n        }\r\n\r\n        let pre = arr.slice(0, cutindex);\r\n        let premax = pre[pre.length - 1];\r\n        let ret = arr.slice(cutindex);\r\n        \r\n        // for (let i = 0; i < ret.length; i++) {\r\n        //     ret[i] -= premax;\r\n        // }\r\n\r\n        return ret;\r\n    },\r\n    cancelFreezenVertical: function (sheetIndex) {\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_freezen = _locale.freezen;\r\n        // 解决freeze 不垂直居中的问题\r\n        const freezeHTML = `\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function iconfont-luckysheet luckysheet-iconfont-dongjie1\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        ${locale_freezen.default}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        `\r\n\r\n        $(\"#luckysheet-freezen-btn-horizontal\").html(freezeHTML);\r\n\r\n        $(\"#luckysheet-freezen-btn-vertical\").html('<i class=\"fa fa-indent\"></i> '+locale_freezen.freezenColumn);\r\n        _this.freezenverticaldata = null;\r\n        let isvertical = $(\"#luckysheet-freezebar-vertical\").is(\":visible\");\r\n        $(\"#luckysheet-freezebar-vertical\").hide();\r\n\r\n        if (sheetIndex == null) {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        let currentSheet = Store.luckysheetfile[getSheetIndex(sheetIndex)];\r\n        if (currentSheet.freezen != null) {\r\n            currentSheet.freezen.vertical = null;\r\n        }\r\n\r\n        if(currentSheet.frozen != null && isvertical){\r\n            server.saveParam(\"all\", sheetIndex, currentSheet.frozen, { \"k\": \"frozen\" });\r\n        }\r\n    },\r\n    createFreezenVertical: function (freezenverticaldata, left) {\r\n        let _this = this;\r\n\r\n        if (_this.initialVertical) {\r\n            _this.initialVertical = false;\r\n            $(\"#luckysheet-grid-window-1\").append(_this.freezenVerticalHTML);\r\n\r\n            $(\"#luckysheet-freezebar-vertical\").find(\".luckysheet-freezebar-vertical-drop\").hover(function () {\r\n                $(this).parent().addClass(\"luckysheet-freezebar-hover\");\r\n            }, function () {\r\n                $(this).parent().removeClass(\"luckysheet-freezebar-hover\");\r\n            });\r\n\r\n\r\n            $(\"#luckysheet-freezebar-vertical\").find(\".luckysheet-freezebar-vertical-drop\").mousedown(function () {\r\n                _this.verticalmovestate = true;\r\n                _this.verticalmoveposition = $(this).position().left;\r\n                _this.windowWidth = $(\"#luckysheet-grid-window-1\").width();\r\n\r\n                $(this).parent().addClass(\"luckysheet-freezebar-active\");\r\n                $(\"#luckysheet-freezebar-vertical\").find(\".luckysheet-freezebar-vertical-handle\").css(\"cursor\", \"-webkit-grabbing\");\r\n            });\r\n\r\n            let gridheight = $(\"#luckysheet-grid-window-1\").height();\r\n            $(\"#luckysheet-freezebar-vertical\").find(\".luckysheet-freezebar-vertical-handle\").css({ \r\n                \"height\": gridheight - 10, \r\n                \"width\": \"4px\", \r\n                \"cursor\": \"-webkit-grab\", \r\n                \"top\": \"0px\" \r\n            }).end().find(\".luckysheet-freezebar-vertical-drop\").css({ \r\n                \"height\": gridheight - 10, \r\n                \"width\": \"4px\", \r\n                \"top\": \"0px\", \r\n                \"cursor\": \"-webkit-grab\" \r\n            });\r\n        }\r\n\r\n        if (freezenverticaldata == null) {\r\n            if (_this.freezenRealFirstRowColumn) {\r\n                let dataset_col_st = 0;\r\n                left = Store.visibledatacolumn[dataset_col_st] - 2 + Store.rowHeaderWidth;\r\n                freezenverticaldata = [\r\n                    Store.visibledatacolumn[dataset_col_st], \r\n                    dataset_col_st + 1, \r\n                    0, \r\n                    _this.cutVolumn(Store.visibledatacolumn, dataset_col_st + 1), \r\n                    left\r\n                ];\r\n            } else {\r\n                let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                let dataset_col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n                if (dataset_col_st == -1) {\r\n                    dataset_col_st = 0;\r\n                }\r\n    \r\n                left = Store.visibledatacolumn[dataset_col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n                freezenverticaldata = [\r\n                    Store.visibledatacolumn[dataset_col_st], \r\n                    dataset_col_st + 1, \r\n                    scrollLeft, \r\n                    _this.cutVolumn(Store.visibledatacolumn, dataset_col_st + 1), \r\n                    left\r\n                ];\r\n            }\r\n\r\n            _this.saveFreezen(null, null, freezenverticaldata, left);\r\n        }\r\n\r\n        _this.freezenverticaldata = freezenverticaldata;\r\n\r\n        // $(\"#luckysheet-freezen-btn-horizontal\").html('<i class=\"luckysheet-icon-img-container iconfont-luckysheet luckysheet-iconfont-dongjie1\"></i> '+locale().freezen.freezenCancel);\r\n\r\n        // 解决freeze 不垂直居中的问题\r\n        const freezeHTML = `\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function iconfont-luckysheet luckysheet-iconfont-dongjie1\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        ${locale().freezen.freezenCancel}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        `\r\n        $(\"#luckysheet-freezen-btn-horizontal\").html(freezeHTML);\r\n\r\n        $(\"#luckysheet-freezebar-vertical\").show().find(\".luckysheet-freezebar-vertical-handle\").css({ \"left\": left }).end().find(\".luckysheet-freezebar-vertical-drop\").css({ \"left\": left });\r\n    },\r\n    saveFreezen: function (freezenhorizontaldata, top, freezenverticaldata, left) {\r\n        let currentSheet = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        if (currentSheet.freezen == null) {\r\n            currentSheet.freezen = {};\r\n        }\r\n\r\n        if (freezenhorizontaldata != null) {\r\n            if (currentSheet.freezen.horizontal == null) {\r\n                currentSheet.freezen.horizontal = {};\r\n            }\r\n\r\n            currentSheet.freezen.horizontal.freezenhorizontaldata = freezenhorizontaldata;\r\n            currentSheet.freezen.horizontal.top = top;\r\n        }\r\n\r\n        if (freezenverticaldata != null) {\r\n            if (currentSheet.freezen.vertical == null) {\r\n                currentSheet.freezen.vertical = {};\r\n            }\r\n\r\n            currentSheet.freezen.vertical.freezenverticaldata = freezenverticaldata;\r\n            currentSheet.freezen.vertical.left = left;\r\n        }\r\n\r\n        // if(currentSheet.freezen != null){\r\n        //     server.saveParam(\"all\", Store.currentSheetIndex, currentSheet.freezen, { \"k\": \"freezen\" });\r\n        // }\r\n\r\n        // use new property frozen\r\n        if(currentSheet.frozen != null){\r\n            server.saveParam(\"all\", Store.currentSheetIndex, currentSheet.frozen, { \"k\": \"frozen\" });\r\n        }\r\n    },\r\n    initialFreezen: function (sheetIndex) {\r\n        let _this = this;\r\n\r\n        // when init ,we get frozen, but here, we need freezen,so tranform it\r\n        _this.frozenTofreezen();\r\n\r\n        let currentSheet = Store.luckysheetfile[getSheetIndex(sheetIndex)];\r\n        if (currentSheet.freezen != null && currentSheet.freezen.horizontal != null && currentSheet.freezen.horizontal.freezenhorizontaldata != null) {\r\n            _this.createFreezenHorizontal(currentSheet.freezen.horizontal.freezenhorizontaldata, currentSheet.freezen.horizontal.top);\r\n        }\r\n        else {\r\n            _this.cancelFreezenHorizontal(sheetIndex);\r\n        }\r\n\r\n        if (currentSheet.freezen != null && currentSheet.freezen.vertical != null && currentSheet.freezen.vertical.freezenverticaldata != null) {\r\n            _this.createFreezenVertical(currentSheet.freezen.vertical.freezenverticaldata, currentSheet.freezen.vertical.left);\r\n        }\r\n        else {\r\n            _this.cancelFreezenVertical(sheetIndex);\r\n        }\r\n\r\n        _this.createAssistCanvas();\r\n    },\r\n    changeFreezenIndex: function (originindex, type) {\r\n        let _this = this;\r\n\r\n        if (type == \"v\" && _this.freezenverticaldata != null) {\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offset = luckysheet_searcharray(Store.visibledatacolumn, $(\"#luckysheet-cell-main\").scrollLeft());\r\n\r\n            if (originindex - offset < freezen_colindex) {\r\n                originindex = originindex - offset;\r\n            }\r\n        }\r\n        else if (type == \"h\" && _this.freezenhorizontaldata != null) {\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let offset = luckysheet_searcharray(Store.visibledatarow, $(\"#luckysheet-cell-main\").scrollTop());\r\n            \r\n            if (originindex - offset < freezen_rowindex) {\r\n                originindex = originindex - offset;\r\n            }\r\n        }\r\n        \r\n        return originindex;\r\n    },\r\n    scrollFreezen: function () {\r\n        let _this = this;\r\n\r\n        let row;\r\n        let row_focus = Store.luckysheet_select_save[0][\"row_focus\"];\r\n        if(row_focus == Store.luckysheet_select_save[0][\"row\"][0]){\r\n            row = Store.luckysheet_select_save[0][\"row\"][1];\r\n        }\r\n        else if(row_focus == Store.luckysheet_select_save[0][\"row\"][1]){\r\n            row = Store.luckysheet_select_save[0][\"row\"][0];\r\n        }\r\n\r\n        let column;\r\n        let column_focus = Store.luckysheet_select_save[0][\"column_focus\"];\r\n        if(column_focus == Store.luckysheet_select_save[0][\"column\"][0]){\r\n            column = Store.luckysheet_select_save[0][\"column\"][1];\r\n        }\r\n        else if(column_focus == Store.luckysheet_select_save[0][\"column\"][1]){\r\n            column = Store.luckysheet_select_save[0][\"column\"][0];\r\n        }\r\n\r\n        if (_this.freezenverticaldata != null) {\r\n            let freezen_colindex = _this.freezenverticaldata[1];            \r\n\r\n            let offset = luckysheet_searcharray(_this.freezenverticaldata[3], $(\"#luckysheet-cell-main\").scrollLeft());\r\n\r\n            let top = _this.freezenverticaldata[4];\r\n\r\n            freezen_colindex += offset;\r\n\r\n            if(column>=Store.visibledatacolumn.length){\r\n                column = Store.visibledatacolumn.length - 1;\r\n            }\r\n\r\n            if(freezen_colindex>=Store.visibledatacolumn.length){\r\n                freezen_colindex = Store.visibledatacolumn.length - 1;\r\n            }\r\n            \r\n            let column_px = Store.visibledatacolumn[column], freezen_px = Store.visibledatacolumn[freezen_colindex];\r\n\r\n            if (column_px <= freezen_px+top) {\r\n                setTimeout(function () { $(\"#luckysheet-scrollbar-x\").scrollLeft(0); }, 100);\r\n            }\r\n        }\r\n\r\n        if (_this.freezenhorizontaldata != null) {\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            \r\n            let offset = luckysheet_searcharray(_this.freezenhorizontaldata[3], $(\"#luckysheet-cell-main\").scrollTop());\r\n\r\n            let left = _this.freezenhorizontaldata[4];\r\n\r\n            freezen_rowindex += offset;\r\n\r\n            if(row>=Store.visibledatarow.length){\r\n                row = Store.visibledatarow.length - 1;\r\n            }\r\n\r\n            if(freezen_rowindex>=Store.visibledatarow.length){\r\n                freezen_rowindex = Store.visibledatarow.length - 1;\r\n            }\r\n\r\n            let row_px = Store.visibledatarow[row], freezen_px = Store.visibledatarow[freezen_rowindex];\r\n\r\n            if (row_px <= freezen_px+left) {\r\n                setTimeout(function () {$(\"#luckysheet-scrollbar-y\").scrollTop(0);}, 100);\r\n            }\r\n        }\r\n    },\r\n    cancelFreezenHorizontal: function (sheetIndex) {\r\n        let _this = this;\r\n\r\n        // $(\"#luckysheet-freezen-btn-horizontal\").html('<i class=\"luckysheet-icon-img-container iconfont-luckysheet luckysheet-iconfont-dongjie1\"></i> '+locale().freezen.default);\r\n\r\n        // 解决freeze 不垂直居中的问题\r\n        const freezeHTML = `\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function iconfont-luckysheet luckysheet-iconfont-dongjie1\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        ${locale().freezen.default}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        `\r\n\r\n        $(\"#luckysheet-freezen-btn-horizontal\").html(freezeHTML);\r\n\r\n        _this.freezenhorizontaldata = null;\r\n        let ishorizontal = $(\"#luckysheet-freezebar-horizontal\").is(\":visible\");\r\n        $(\"#luckysheet-freezebar-horizontal\").hide();\r\n\r\n        if (sheetIndex == null) {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        let currentSheet = Store.luckysheetfile[getSheetIndex(sheetIndex)];\r\n        if (currentSheet.freezen != null) {\r\n            currentSheet.freezen.horizontal = null;\r\n        }\r\n\r\n        if(currentSheet.frozen != null && ishorizontal){\r\n            server.saveParam(\"all\", sheetIndex, currentSheet.frozen, { \"k\": \"frozen\" });\r\n        }\r\n    },\r\n    createFreezenHorizontal: function (freezenhorizontaldata, top) {\r\n        let _this = this;\r\n\r\n        if (_this.initialHorizontal) {\r\n            _this.initialHorizontal = false;\r\n            $(\"#luckysheet-grid-window-1\").append(_this.freezenHorizontalHTML);\r\n\r\n            $(\"#luckysheet-freezebar-horizontal\").find(\".luckysheet-freezebar-horizontal-drop\").hover(function () {\r\n                $(this).parent().addClass(\"luckysheet-freezebar-hover\");\r\n            }, function () {\r\n                $(this).parent().removeClass(\"luckysheet-freezebar-hover\");\r\n            });\r\n\r\n            $(\"#luckysheet-freezebar-horizontal\").find(\".luckysheet-freezebar-horizontal-drop\").mousedown(function () {\r\n                _this.horizontalmovestate = true;\r\n                _this.horizontalmoveposition = $(this).position().top;\r\n                _this.windowHeight = $(\"#luckysheet-grid-window-1\").height();\r\n\r\n                $(this).parent().addClass(\"luckysheet-freezebar-active\");\r\n                $(\"#luckysheet-freezebar-horizontal\").find(\".luckysheet-freezebar-horizontal-handle\").css(\"cursor\", \"-webkit-grabbing\");\r\n            });\r\n\r\n            let gridwidth = $(\"#luckysheet-grid-window-1\").width();\r\n            $(\"#luckysheet-freezebar-horizontal\").find(\".luckysheet-freezebar-horizontal-handle\").css({ \r\n                \"width\": gridwidth - 10, \r\n                \"height\": \"4px\", \r\n                \"cursor\": \"-webkit-grab\", \r\n                \"left\": \"0px\" \r\n            }).end().find(\".luckysheet-freezebar-horizontal-drop\").css({ \r\n                \"width\": gridwidth - 10, \r\n                \"height\": \"4px\", \r\n                \"left\": \"0px\", \r\n                \"cursor\": \"-webkit-grab\" \r\n            });\r\n        }\r\n\r\n        if (freezenhorizontaldata == null) {\r\n            let dataset_row_st;\r\n            if (_this.freezenRealFirstRowColumn) {\r\n                dataset_row_st = 0;\r\n                top = Store.visibledatarow[dataset_row_st] - 2 + Store.columnHeaderHeight;\r\n                freezenhorizontaldata = [\r\n                    Store.visibledatarow[dataset_row_st], \r\n                    dataset_row_st + 1, \r\n                    0, \r\n                    _this.cutVolumn(Store.visibledatarow, dataset_row_st + 1), \r\n                    top\r\n                ];\r\n                _this.saveFreezen(freezenhorizontaldata, top, null, null);\r\n                // todo: 没有下面代码 如果有滚动，冻结之后首行的行号仍显示的之前滚动的行号\r\n                // todo: 不 setTimeout 这里直接刷新的话，冻结的首行显示有问题，没有列的分割线\r\n                setTimeout(() => {\r\n                    luckysheetFreezen.createAssistCanvas();\r\n                    luckysheetrefreshgrid();\r\n                });\r\n            } else {\r\n                let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                dataset_row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n                if (dataset_row_st == -1) {\r\n                    dataset_row_st = 0;\r\n                }\r\n    \r\n                top = Store.visibledatarow[dataset_row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n                freezenhorizontaldata = [\r\n                    Store.visibledatarow[dataset_row_st], \r\n                    dataset_row_st + 1, \r\n                    scrollTop, \r\n                    _this.cutVolumn(Store.visibledatarow, dataset_row_st + 1), \r\n                    top\r\n                ];\r\n                _this.saveFreezen(freezenhorizontaldata, top, null, null);\r\n            }\r\n        }\r\n\r\n        _this.freezenhorizontaldata = freezenhorizontaldata;\r\n\r\n        // $(\"#luckysheet-freezen-btn-horizontal\").html('<i class=\"fa fa-list-alt\"></i> '+locale().freezen.freezenCancel);\r\n\r\n        // $(\"#luckysheet-freezen-btn-horizontal\").html('<i class=\"luckysheet-icon-img-container iconfont-luckysheet luckysheet-iconfont-dongjie1\"></i> '+locale().freezen.freezenCancel);\r\n\r\n        const freezeHTML = `\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function iconfont-luckysheet luckysheet-iconfont-dongjie1\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        ${locale().freezen.freezenCancel}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        `\r\n\r\n        $(\"#luckysheet-freezen-btn-horizontal\").html(freezeHTML);\r\n\r\n        $(\"#luckysheet-freezebar-horizontal\").show().find(\".luckysheet-freezebar-horizontal-handle\").css({ \"top\": top }).end().find(\".luckysheet-freezebar-horizontal-drop\").css({ \"top\": top });\r\n\r\n    },\r\n    createAssistCanvas: function(){\r\n        let _this = this;\r\n        _this.removeAssistCanvas();\r\n\r\n        if (_this.freezenverticaldata != null || _this.freezenhorizontaldata != null) {\r\n            let freezen_horizon_px, freezen_horizon_ed, freezen_horizon_scrollTop;\r\n            let freezen_vertical_px, freezen_vertical_ed, freezen_vertical_scrollTop;\r\n            let drawWidth = Store.luckysheetTableContentHW[0], \r\n                drawHeight = Store.luckysheetTableContentHW[1];\r\n\r\n            //双向freezen\r\n            if (_this.freezenverticaldata != null && _this.freezenhorizontaldata != null) {\r\n                freezen_horizon_px = _this.freezenhorizontaldata[0];\r\n                freezen_horizon_ed = _this.freezenhorizontaldata[1];\r\n                freezen_horizon_scrollTop = _this.freezenhorizontaldata[2];\r\n\r\n                freezen_vertical_px = _this.freezenverticaldata[0];\r\n                freezen_vertical_ed = _this.freezenverticaldata[1];\r\n                freezen_vertical_scrollTop = _this.freezenverticaldata[2];\r\n\r\n                //3\r\n                _this.createCanvas(\"freezen_3\", freezen_vertical_px - freezen_vertical_scrollTop, freezen_horizon_px - freezen_horizon_scrollTop + 1, Store.rowHeaderWidth - 1, Store.columnHeaderHeight - 1);\r\n                //4\r\n                _this.createCanvas(\"freezen_4\", drawWidth - freezen_vertical_px + freezen_vertical_scrollTop, freezen_horizon_px - freezen_horizon_scrollTop + 1, freezen_vertical_px - freezen_vertical_scrollTop + Store.rowHeaderWidth - 1, Store.columnHeaderHeight - 1);\r\n                //7\r\n                _this.createCanvas(\"freezen_7\", freezen_vertical_px - freezen_vertical_scrollTop, drawHeight - freezen_horizon_px + freezen_horizon_scrollTop - Store.columnHeaderHeight, Store.rowHeaderWidth - 1, freezen_horizon_px - freezen_horizon_scrollTop + Store.columnHeaderHeight - 1);\r\n            }\r\n            //水平freezen\r\n            else if (_this.freezenhorizontaldata != null) {\r\n                freezen_horizon_px = _this.freezenhorizontaldata[0];\r\n                freezen_horizon_ed = _this.freezenhorizontaldata[1];\r\n                freezen_horizon_scrollTop = _this.freezenhorizontaldata[2];\r\n\r\n                _this.createCanvas(\"freezen_h\", drawWidth, freezen_horizon_px - freezen_horizon_scrollTop + 1, Store.rowHeaderWidth - 1, Store.columnHeaderHeight - 1);\r\n            }\r\n            //垂直freezen\r\n            else if (_this.freezenverticaldata != null) {\r\n                freezen_vertical_px = _this.freezenverticaldata[0];\r\n                freezen_vertical_ed = _this.freezenverticaldata[1];\r\n                freezen_vertical_scrollTop = _this.freezenverticaldata[2];\r\n\r\n                _this.createCanvas(\"freezen_v\", freezen_vertical_px - freezen_vertical_scrollTop, drawHeight, Store.rowHeaderWidth - 1, Store.columnHeaderHeight - 1);\r\n            }\r\n\r\n            _this.scrollAdapt();\r\n        }\r\n    },\r\n    createCanvas: function(id, width, height, left, top){\r\n        let c = $(\"<canvas/>\").appendTo(\"#luckysheet-grid-window-1\").attr({\r\n            \"id\": id, \r\n            \"width\": Math.ceil(width * Store.devicePixelRatio), \r\n            \"height\": Math.ceil(height * Store.devicePixelRatio)\r\n        }).css({\r\n            \"user-select\": \"none\",\r\n            \"postion\": \"absolute\",\r\n            \"left\": left, \r\n            \"top\": top,\r\n            \"width\": width, \r\n            \"height\": height, \r\n            \"z-index\": 10, \r\n            \"pointer-events\": \"none\"\r\n        });\r\n    },\r\n    removeAssistCanvas: function(){\r\n        $(\"#luckysheet-grid-window-1 > canvas\").not($(\"#luckysheetTableContent\")).remove();\r\n        $(\"#luckysheet-cell-selected\").css(\"z-index\", 15);\r\n    },\r\n    scrollAdapt: function(){\r\n        let _this = this;\r\n\r\n        //有冻结时 选区框 滚动适应\r\n        if(Store.luckysheet_select_save != null && Store.luckysheet_select_save.length > 0){\r\n            _this.scrollAdaptOfselect();    \r\n        }\r\n\r\n        //有冻结时 图片 滚动适应\r\n        if($(\".luckysheet-modal-dialog-image\").length > 0 && imageCtrl.images != undefined){\r\n            _this.scrollAdaptOfImage();\r\n        }\r\n\r\n        //有冻结时 图表框 滚动适应\r\n        if($(\"#luckysheet-cell-main .luckysheet-data-visualization-chart\").length > 0){\r\n\r\n            // 当前sheet有图表才需要滚动适应\r\n            const chart = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"chart\"];\r\n            \r\n            if(chart != null && chart.length > 0){\r\n                _this.scrollAdaptOfchart();\r\n            }\r\n        }\r\n\r\n        //有冻结时 批注框 滚动适应\r\n        if($(\"#luckysheet-postil-showBoxs .luckysheet-postil-show\").length > 0){\r\n            _this.scrollAdaptOfpostil();               \r\n        }\r\n\r\n        //有冻结时 下拉选区图标 滚动适应\r\n        if($(\"#luckysheet-dropCell-icon\").length > 0){\r\n            _this.scrollAdaptOfdpicon();\r\n        }\r\n\r\n        //有冻结时 筛选下拉按钮 滚动适应\r\n        if($(\"#luckysheet-filter-options-sheet\"+ Store.currentSheetIndex +\" .luckysheet-filter-options\").length > 0){\r\n            _this.scrollAdaptOffilteroptions();\r\n        }\r\n    },\r\n    scrollAdaptOfselect: function(){\r\n        let _this = this;\r\n\r\n        if($(\"#luckysheet-row-count-show\").is(\":visible\")){\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n        }\r\n\r\n        if($(\"#luckysheet-column-count-show\").is(\":visible\")){\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n        }\r\n\r\n        $(\"#luckysheet-rows-h-selected\").empty();\r\n        $(\"#luckysheet-cols-h-selected\").empty();\r\n\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n        if (_this.freezenhorizontaldata != null && _this.freezenverticaldata != null) {\r\n            let freezenTop = _this.freezenhorizontaldata[0];\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let offTop = scrollTop - _this.freezenhorizontaldata[2];\r\n\r\n            let freezenLeft = _this.freezenverticaldata[0];\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offLeft = scrollLeft - _this.freezenverticaldata[2];\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let obj = $.extend(true, {}, Store.luckysheet_select_save[s]);\r\n\r\n                let r1 = obj.row[0], \r\n                    r2 = obj.row[1];\r\n\r\n                let row = Store.visibledatarow[r2], \r\n                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n\r\n                let top_move = row_pre;\r\n                let height_move = row - row_pre - 1;\r\n\r\n                let rangeshow = true;\r\n\r\n                if(r1 >= freezen_rowindex){//原选区在冻结区外\r\n                    if(top_move + height_move < freezenTop + offTop){\r\n                        rangeshow = false;\r\n                    }\r\n                    else if(top_move < freezenTop + offTop){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": freezenTop + offTop,\r\n                            \"height\": height_move - (freezenTop + offTop - top_move)\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": top_move,\r\n                            \"height\": height_move\r\n                        });\r\n                    }\r\n                }\r\n                else if(r2 >= freezen_rowindex){//原选区有一部分在冻结区内\r\n                    if(top_move + height_move < freezenTop + offTop){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": top_move + offTop,\r\n                            \"height\": freezenTop - top_move\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": top_move + offTop,\r\n                            \"height\": height_move - offTop\r\n                        });\r\n                    }\r\n                }\r\n                else{//原选区在冻结区内\r\n                    $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css(\"top\", top_move + offTop);\r\n                }\r\n\r\n                let c1 = obj.column[0], \r\n                    c2 = obj.column[1];\r\n\r\n                let col = Store.visibledatacolumn[c2], \r\n                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                let left_move = col_pre;\r\n                let width_move = col - col_pre - 1;\r\n\r\n                if(c1 >= freezen_colindex){//原选区在冻结区外\r\n                    if(left_move + width_move < freezenLeft + offLeft){\r\n                        rangeshow = false;\r\n                    }\r\n                    else if(left_move < freezenLeft + offLeft){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": freezenLeft + offLeft,\r\n                            \"width\": width_move - (freezenLeft + offLeft - left_move)\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": left_move,\r\n                            \"width\": width_move\r\n                        });\r\n                    }\r\n                }\r\n                else if(c2 >= freezen_colindex){//原选区有一部分在冻结区内\r\n                    if(left_move + width_move < freezenLeft + offLeft){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": left_move + offLeft,\r\n                            \"width\": freezenLeft - left_move\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": left_move + offLeft,\r\n                            \"width\": width_move - offLeft\r\n                        });\r\n                    }\r\n                }\r\n                else{//原选区在冻结区内\r\n                    $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css(\"left\", left_move + offLeft);\r\n                }\r\n\r\n                if(!rangeshow){\r\n                    $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).hide();\r\n                }\r\n\r\n                if(s == Store.luckysheet_select_save.length - 1){\r\n                    let rf = obj.row_focus == null ? r1 : obj.row_focus;\r\n                    let cf = obj.column_focus == null ? c1 : obj.column_focus;\r\n                    \r\n                    let row_f = Store.visibledatarow[rf], \r\n                        row_pre_f = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1];\r\n                    let col_f = Store.visibledatacolumn[cf], \r\n                        col_pre_f = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1];\r\n\r\n                    let margeset = menuButton.mergeborer(Store.flowdata, rf, cf);\r\n                    if(!!margeset){\r\n                        row_f = margeset.row[1];\r\n                        row_pre_f = margeset.row[0];\r\n\r\n                        col_f = margeset.column[1];\r\n                        col_pre_f = margeset.column[0];\r\n                    }\r\n\r\n                    let top = row_pre_f;\r\n                    let height = row_f - row_pre_f - 1;\r\n\r\n                    let left = col_pre_f;\r\n                    let width = col_f - col_pre_f - 1;\r\n\r\n                    let focuscell = true;\r\n\r\n                    if(top >= freezenTop){\r\n                        if(top + height < freezenTop + offTop){\r\n                            focuscell = false;\r\n                        }\r\n                        else if(top < freezenTop + offTop){ \r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": freezenTop + offTop,\r\n                                \"height\": height - (freezenTop + offTop - top)\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": top,\r\n                                \"height\": height\r\n                            });\r\n                        }\r\n                    }\r\n                    else if(top + height >= freezenTop){\r\n                        if(top + height < freezenTop + offTop){\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": top + offTop,\r\n                                \"height\": freezenTop - top\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": top + offTop,\r\n                                \"height\": height - offTop\r\n                            })\r\n                        }\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-focus\").show().css(\"top\", top + offTop);\r\n                    }\r\n\r\n                    if(left >= freezenLeft){\r\n                        if(left + width < freezenLeft + offLeft){\r\n                            focuscell = false;\r\n                        }\r\n                        else if(left < freezenLeft + offLeft){ \r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": freezenLeft + offLeft,\r\n                                \"width\": width - (freezenLeft + offLeft - left)\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": left,\r\n                                \"width\": width\r\n                            });\r\n                        }\r\n                    }\r\n                    else if(left + width >= freezenLeft){\r\n                        if(left + width < freezenLeft + offLeft){\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": left + offLeft,\r\n                                \"width\": freezenLeft - left\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": left + offLeft,\r\n                                \"width\": width - offLeft\r\n                            })\r\n                        }\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-focus\").show().css(\"left\", left + offLeft);\r\n                    }\r\n\r\n                    if(!focuscell){\r\n                        $(\"#luckysheet-cell-selected-focus\").hide();\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if (_this.freezenhorizontaldata != null) {\r\n            let freezenTop = _this.freezenhorizontaldata[0];\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let offTop = scrollTop - _this.freezenhorizontaldata[2];\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let obj = $.extend(true, {}, Store.luckysheet_select_save[s]);\r\n\r\n                let r1 = obj.row[0], \r\n                    r2 = obj.row[1];\r\n\r\n                let row = Store.visibledatarow[r2], \r\n                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n\r\n                let top_move = row_pre;\r\n                let height_move = row - row_pre - 1;\r\n\r\n                if(r1 >= freezen_rowindex){//原选区在冻结区外\r\n                    if(top_move + height_move < freezenTop + offTop){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).hide();\r\n                    }\r\n                    else if(top_move < freezenTop + offTop){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": freezenTop + offTop,\r\n                            \"height\": height_move - (freezenTop + offTop - top_move)\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": top_move,\r\n                            \"height\": height_move\r\n                        });\r\n                    }\r\n                }\r\n                else if(r2 >= freezen_rowindex){//原选区有一部分在冻结区内\r\n                    if(top_move + height_move < freezenTop + offTop){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": top_move + offTop,\r\n                            \"height\": freezenTop - top_move\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"top\": top_move + offTop,\r\n                            \"height\": height_move - offTop\r\n                        });\r\n                    }\r\n                }\r\n                else{//原选区在冻结区内\r\n                    $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css(\"top\", top_move + offTop);\r\n                }\r\n\r\n                if(s == Store.luckysheet_select_save.length - 1){\r\n                    let rf = obj.row_focus == null ? r1 : obj.row_focus;\r\n                    let cf = obj.column_focus == null ? obj.column[0] : obj.column_focus;\r\n                    \r\n                    let row_f = Store.visibledatarow[rf], \r\n                        row_pre_f = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1];\r\n\r\n                    let margeset = menuButton.mergeborer(Store.flowdata, rf, cf);\r\n                    if(!!margeset){\r\n                        row_f = margeset.row[1];\r\n                        row_pre_f = margeset.row[0];\r\n                    }\r\n\r\n                    let top = row_pre_f;\r\n                    let height = row_f - row_pre_f - 1;\r\n\r\n                    if(top >= freezenTop){\r\n                        if(top + height < freezenTop + offTop){\r\n                            $(\"#luckysheet-cell-selected-focus\").hide();\r\n                        }\r\n                        else if(top < freezenTop + offTop){ \r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": freezenTop + offTop,\r\n                                \"height\": height - (freezenTop + offTop - top)\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": top,\r\n                                \"height\": height\r\n                            });\r\n                        }\r\n                    }\r\n                    else if(top + height >= freezenTop){\r\n                        if(top + height < freezenTop + offTop){\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": top + offTop,\r\n                                \"height\": freezenTop - top\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"top\": top + offTop,\r\n                                \"height\": height - offTop\r\n                            })\r\n                        }\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-focus\").show().css(\"top\", top + offTop);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if (_this.freezenverticaldata != null) {\r\n            let freezenLeft = _this.freezenverticaldata[0];\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offLeft = scrollLeft - _this.freezenverticaldata[2];\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let obj = $.extend(true, {}, Store.luckysheet_select_save[s]);\r\n\r\n                let c1 = obj.column[0], \r\n                    c2 = obj.column[1];\r\n\r\n                let col = Store.visibledatacolumn[c2], \r\n                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                let left_move = col_pre;\r\n                let width_move = col - col_pre - 1;\r\n\r\n                if(c1 >= freezen_colindex){//原选区在冻结区外\r\n                    if(left_move + width_move < freezenLeft + offLeft){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).hide();\r\n                    }\r\n                    else if(left_move < freezenLeft + offLeft){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": freezenLeft + offLeft,\r\n                            \"width\": width_move - (freezenLeft + offLeft - left_move)\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": left_move,\r\n                            \"width\": width_move\r\n                        });\r\n                    }\r\n                }\r\n                else if(c2 >= freezen_colindex){//原选区有一部分在冻结区内\r\n                    if(left_move + width_move < freezenLeft + offLeft){\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": left_move + offLeft,\r\n                            \"width\": freezenLeft - left_move\r\n                        });\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css({\r\n                            \"left\": left_move + offLeft,\r\n                            \"width\": width_move - offLeft\r\n                        });\r\n                    }\r\n                }\r\n                else{//原选区在冻结区内\r\n                    $(\"#luckysheet-cell-selected-boxs\").find(\".luckysheet-cell-selected\").eq(s).show().css(\"left\", left_move + offLeft);\r\n                }\r\n\r\n                if(s == Store.luckysheet_select_save.length - 1){\r\n                    let rf = obj.row_focus == null ? obj.row[0] : obj.row_focus;\r\n                    let cf = obj.column_focus == null ? c1 : obj.column_focus;\r\n                    \r\n                    let col_f = Store.visibledatacolumn[cf], \r\n                        col_pre_f = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1];\r\n\r\n                    let margeset = menuButton.mergeborer(Store.flowdata, rf, cf);\r\n                    if(!!margeset){\r\n                        col_f = margeset.column[1];\r\n                        col_pre_f = margeset.column[0];\r\n                    }\r\n\r\n                    let left = col_pre_f;\r\n                    let width = col_f - col_pre_f - 1;\r\n\r\n                    if(left >= freezenLeft){\r\n                        if(left + width < freezenLeft + offLeft){\r\n                            $(\"#luckysheet-cell-selected-focus\").hide();\r\n                        }\r\n                        else if(left < freezenLeft + offLeft){ \r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": freezenLeft + offLeft,\r\n                                \"width\": width - (freezenLeft + offLeft - left)\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": left,\r\n                                \"width\": width\r\n                            });\r\n                        }\r\n                    }\r\n                    else if(left + width >= freezenLeft){\r\n                        if(left + width < freezenLeft + offLeft){\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": left + offLeft,\r\n                                \"width\": freezenLeft - left\r\n                            })\r\n                        }\r\n                        else{\r\n                            $(\"#luckysheet-cell-selected-focus\").show().css({\r\n                                \"left\": left + offLeft,\r\n                                \"width\": width - offLeft\r\n                            })\r\n                        }\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet-cell-selected-focus\").show().css(\"left\", left + offLeft);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            selectHightlightShow();\r\n        }\r\n    },\r\n    scrollAdaptOfImage: function () {\r\n\r\n        let _this = this;\r\n\r\n        var images = imageCtrl.images;\r\n\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n        let freezenTop =  _this.freezenhorizontaldata != null ? (_this.freezenhorizontaldata[0] - _this.freezenhorizontaldata[2]) : -1;\r\n        let freezenLeft = _this.freezenverticaldata != null ? (_this.freezenverticaldata[0] - _this.freezenverticaldata[2]) : -1;\r\n\r\n        let zoomRatio = Store.zoomRatio;\r\n\r\n        $.each(images, function (i) {\r\n\r\n            let image = images[i];\r\n            let dialogImage = $(\"#\" + i);\r\n            let x = dialogImage.position();\r\n\r\n            let width = dialogImage.width();\r\n            let height = dialogImage.height();\r\n            let defaultTop = image.default.top * zoomRatio;\r\n            let defaultLeft = image.default.left * zoomRatio;\r\n\r\n            let isHidden = false;\r\n\r\n            //行冻结\r\n            if (defaultTop >= freezenTop) {//原图片在冻结区外\r\n                if (x.top < freezenTop) { //在界面上的位置已经进入冻结区里面了\r\n                    dialogImage.css(\"visibility\", \"hidden\");\r\n                    isHidden = true;\r\n                }\r\n                else {\r\n                    dialogImage.css({\r\n                        \"visibility\": \"visible\"\r\n                    });\r\n                }\r\n            }\r\n            else {//原图片在冻结区内\r\n                dialogImage.css({\r\n                    \"top\": defaultTop + scrollTop,\r\n                    \"height\": height,\r\n                    \"visibility\": \"visible\"\r\n                });\r\n            }\r\n\r\n            //列冻结\r\n            if (!isHidden) {\r\n                if (defaultLeft >= freezenLeft) {//原图片在冻结区外\r\n                    if (x.left < freezenLeft) { //在界面上的位置已经进入冻结区里面了\r\n                        dialogImage.css(\"visibility\", \"hidden\");\r\n                    }\r\n                    else {\r\n                        dialogImage.css({\r\n                            \"visibility\": \"visible\"\r\n                        });\r\n                    }\r\n                }\r\n                else {//原图片在冻结区内\r\n                    dialogImage.css({\r\n                        \"left\": defaultLeft + scrollLeft,\r\n                        \"width\": width,\r\n                        \"visibility\": \"visible\"\r\n                    });\r\n                }\r\n            }\r\n        });\r\n    },\r\n    scrollAdaptOfchart: function(){\r\n        let _this = this;\r\n\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n        if(_this.freezenhorizontaldata != null && _this.freezenverticaldata != null){\r\n            let freezenTop = _this.freezenhorizontaldata[0] - _this.freezenhorizontaldata[2];\r\n            let freezenLeft = _this.freezenverticaldata[0] - _this.freezenverticaldata[2];\r\n\r\n            $(\"#luckysheet-cell-main .luckysheet-data-visualization-chart\").each(function(i, e){\r\n                let x = $(e).position();\r\n                let width = $(e).width();\r\n                let height = $(e).height();\r\n\r\n                let $canvas_width = $(e).find(\"canvas\").width();\r\n                let $canvas_height = $(e).find(\"canvas\").height();\r\n\r\n                let height_diff = $canvas_height - height;\r\n                let width_diff = $canvas_width - width;\r\n\r\n                if((x.top - height_diff) < freezenTop){\r\n                    let size = freezenTop - (x.top - height_diff);\r\n\r\n                    if(size > ($canvas_height + 40 + 2)){\r\n                        $(e).css(\"visibility\", \"hidden\");\r\n                    }\r\n                    else{\r\n                        $(e).css({\r\n                            \"top\": freezenTop + scrollTop,\r\n                            \"height\": $canvas_height - size,\r\n                            \"visibility\": \"visible\"\r\n                        });   \r\n                        $(e).find(\"canvas\").css(\"top\", - size);\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).css({\r\n                        \"top\": x.top - height_diff + scrollTop,\r\n                        \"height\": $canvas_height,\r\n                        \"visibility\": \"visible\"\r\n                    }); \r\n                    $(e).find(\"canvas\").css(\"top\", 0);\r\n                }\r\n\r\n                if((x.left - width_diff) < freezenLeft){\r\n                    let size = freezenLeft - (x.left - width_diff);\r\n\r\n                    if(size > ($canvas_width + 20 + 2)){\r\n                        $(e).css(\"visibility\", \"hidden\");\r\n                    }\r\n                    else{\r\n                        $(e).css({\r\n                            \"left\": freezenLeft + scrollLeft,\r\n                            \"width\": $canvas_width - size,\r\n                            \"visibility\": \"visible\"\r\n                        });   \r\n                        $(e).find(\"canvas\").css(\"left\", - size);\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).css({\r\n                        \"left\": x.left - width_diff + scrollLeft,\r\n                        \"width\": $canvas_width,\r\n                        \"visibility\": \"visible\"\r\n                    }); \r\n                    $(e).find(\"canvas\").css(\"left\", 0);\r\n                }\r\n            })\r\n        }\r\n        else if(_this.freezenhorizontaldata != null){\r\n            let freezenTop = _this.freezenhorizontaldata[0] - _this.freezenhorizontaldata[2];\r\n\r\n            $(\"#luckysheet-cell-main .luckysheet-data-visualization-chart\").each(function(i, e){\r\n                let x = $(e).position();\r\n                let height = $(e).height();\r\n                \r\n                let $canvas_height = $(e).find(\"canvas\").height();\r\n\r\n                let height_diff = $canvas_height - height;\r\n\r\n                if((x.top - height_diff) < freezenTop){\r\n                    let size = freezenTop - (x.top - height_diff);\r\n\r\n                    if(size > ($canvas_height + 40 + 2)){\r\n                        $(e).css(\"visibility\", \"hidden\");\r\n                    }\r\n                    else{\r\n                        $(e).css({\r\n                            \"top\": freezenTop + scrollTop,\r\n                            \"height\": $canvas_height - size,\r\n                            \"visibility\": \"visible\"\r\n                        });   \r\n                        $(e).find(\"canvas\").css(\"top\", - size);\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).css({\r\n                        \"top\": x.top - height_diff + scrollTop,\r\n                        \"height\": $canvas_height,\r\n                        \"visibility\": \"visible\"\r\n                    }); \r\n                    $(e).find(\"canvas\").css(\"top\", 0);\r\n                }\r\n            })\r\n        }\r\n        else if(_this.freezenverticaldata != null){\r\n            let freezenLeft = _this.freezenverticaldata[0] - _this.freezenverticaldata[2];\r\n\r\n            $(\"#luckysheet-cell-main .luckysheet-data-visualization-chart\").each(function(i, e){\r\n                let x = $(e).position();\r\n                let width = $(e).width();\r\n\r\n                let $canvas_width = $(e).find(\"canvas\").width();\r\n\r\n                let width_diff = $canvas_width - width;\r\n\r\n                if((x.left - width_diff) < freezenLeft){\r\n                    let size = freezenLeft - (x.left - width_diff);\r\n\r\n                    if(size > ($canvas_width + 20 + 2)){\r\n                        $(e).css(\"visibility\", \"hidden\");\r\n                    }\r\n                    else{\r\n                        $(e).css({\r\n                            \"left\": freezenLeft + scrollLeft,\r\n                            \"width\": $canvas_width - size,\r\n                            \"visibility\": \"visible\"\r\n                        });   \r\n                        $(e).find(\"canvas\").css(\"left\", - size);\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).css({\r\n                        \"left\": x.left - width_diff + scrollLeft,\r\n                        \"width\": $canvas_width,\r\n                        \"visibility\": \"visible\"\r\n                    }); \r\n                    $(e).find(\"canvas\").css(\"left\", 0);\r\n                }\r\n            })\r\n        }\r\n        else{\r\n            $(\"#luckysheet-cell-main .luckysheet-data-visualization-chart\").each(function(i, e){\r\n                let x = $(e).position();\r\n                let width = $(e).width();\r\n                let height = $(e).height();\r\n\r\n                let $canvas_width = $(e).find(\"canvas\").width();\r\n                let $canvas_height = $(e).find(\"canvas\").height();\r\n\r\n                let height_diff = $canvas_height - height;\r\n                let width_diff = $canvas_width - width;\r\n\r\n                $(e).css({\r\n                    \"top\": x.top - height_diff + scrollTop,\r\n                    \"height\": $canvas_height,\r\n                    \"left\": x.left - width_diff + scrollLeft,\r\n                    \"width\": $canvas_width,\r\n                    \"visibility\": \"visible\"\r\n                }); \r\n\r\n                $(e).find(\"canvas\").css({\r\n                    \"top\": 0,\r\n                    \"left\": 0\r\n                });\r\n            })\r\n        }\r\n    },\r\n    scrollAdaptOfpostil: function(){\r\n        let _this = this;\r\n\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n        if(_this.freezenhorizontaldata != null && _this.freezenverticaldata != null){\r\n            let freezenTop = _this.freezenhorizontaldata[0];\r\n            let freezenLeft = _this.freezenverticaldata[0];\r\n\r\n            let offTop = scrollTop - _this.freezenhorizontaldata[2];\r\n            let offLeft = scrollLeft - _this.freezenverticaldata[2];\r\n\r\n            $(\"#luckysheet-postil-showBoxs .luckysheet-postil-show\").each(function(i, e){\r\n                let id = $(e).attr(\"id\");\r\n\r\n                let r = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n                let c = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n                let postil = Store.flowdata[r][c].ps;\r\n\r\n                let row = Store.visibledatarow[r], \r\n                    row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n                let col = Store.visibledatacolumn[c], \r\n                    col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n                let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n                if(!!margeset){\r\n                    row = margeset.row[1];\r\n                    row_pre = margeset.row[0];\r\n                    \r\n                    col = margeset.column[1];\r\n                    col_pre = margeset.column[0];\r\n                }\r\n\r\n                let toX = col;\r\n                let toY = row_pre;\r\n\r\n                let postil_left = postil[\"left\"] == null ? toX + 18 : postil[\"left\"];\r\n                let postil_top = postil[\"top\"] == null ? toY - 18 : postil[\"top\"];\r\n                let postil_width = postil[\"width\"] == null ? luckysheetPostil.defaultWidth : postil[\"width\"];\r\n                let postil_height = postil[\"height\"] == null ? luckysheetPostil.defaultHeight : postil[\"height\"];\r\n\r\n                if(postil_top < 0){\r\n                    postil_top = 2;\r\n                }\r\n\r\n                let size = luckysheetPostil.getArrowCanvasSize(postil_left, postil_top, toX, toY);\r\n                let show = true;\r\n                let show2 = true;\r\n\r\n                if(r >= _this.freezenhorizontaldata[1]){\r\n                    if(postil_top + postil_height < freezenTop){\r\n                        $(e).show().find(\".luckysheet-postil-show-main\").css(\"top\", postil_top + offTop);\r\n                        $(e).show().find(\".arrowCanvas\").css(\"top\", size[1] + offTop);\r\n                    }\r\n                    else{\r\n                        if(postil_top < freezenTop + offTop){\r\n                            if(postil_top + postil_height <= freezenTop + offTop){\r\n                                show = false;\r\n                            }\r\n                            else{\r\n                                $(e).show().find(\".luckysheet-postil-show-main\").css({ \"top\": freezenTop + offTop, \"height\": postil_height - (freezenTop + offTop - postil_top) });\r\n                                $(e).show().find(\".formulaInputFocus\").css(\"margin-top\", -(freezenTop + offTop - postil_top));\r\n                                $(e).show().find(\".arrowCanvas\").hide(); \r\n\r\n                                show2 = false;\r\n                            }\r\n                        }\r\n                        else{\r\n                            $(e).show().find(\".luckysheet-postil-show-main\").css({\r\n                                \"top\": postil_top,\r\n                                \"height\": postil_height\r\n                            });\r\n                            $(e).show().find(\".formulaInputFocus\").css(\"margin-top\", 0);\r\n                            $(e).show().find(\".arrowCanvas\").css(\"top\", size[1]);\r\n                            // luckysheetPostil.buildPs(r, c, postil);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).show().find(\".luckysheet-postil-show-main\").css(\"top\", postil_top + offTop);\r\n                    $(e).show().find(\".arrowCanvas\").css(\"top\", size[1] + offTop);\r\n                }\r\n\r\n                if(c >= _this.freezenverticaldata[1]){\r\n                    if(postil_left + postil_width < freezenLeft){\r\n                        $(e).show().find(\".luckysheet-postil-show-main\").css(\"left\", postil_left + offLeft);\r\n                        $(e).show().find(\".arrowCanvas\").css(\"left\", size[0] + offLeft);\r\n                    }\r\n                    else{\r\n                        if(postil_left < freezenLeft + offLeft){\r\n                            if(postil_left + postil_width <= freezenLeft + offLeft){\r\n                                show = false;\r\n                            }\r\n                            else{\r\n                                $(e).show().find(\".luckysheet-postil-show-main\").css({ \"left\": freezenLeft + offLeft, \"width\": postil_width - (freezenLeft + offLeft - postil_left) });\r\n                                $(e).show().find(\".formulaInputFocus\").css(\"margin-left\", -(freezenLeft + offLeft - postil_left));\r\n                                $(e).show().find(\".arrowCanvas\").hide(); \r\n\r\n                                show2 = false;\r\n                            }\r\n                        }\r\n                        else{\r\n                            $(e).show().find(\".luckysheet-postil-show-main\").css({\r\n                                \"left\": postil_left,\r\n                                \"width\": postil_width   \r\n                            });\r\n                            $(e).show().find(\".formulaInputFocus\").css(\"margin-left\", 0);\r\n                            $(e).show().find(\".arrowCanvas\").css(\"left\", size[0]);\r\n                            // luckysheetPostil.buildPs(r, c, postil);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).show().find(\".luckysheet-postil-show-main\").css(\"left\", postil_left + offLeft);\r\n                    $(e).show().find(\".arrowCanvas\").css(\"left\", size[0] + offLeft);\r\n                }\r\n\r\n                if(!show){\r\n                    $(e).hide();\r\n                }\r\n\r\n                if(show && show2){\r\n                    $(e).show().find(\".arrowCanvas\").show();\r\n                }\r\n            })\r\n        }\r\n        else if(_this.freezenhorizontaldata != null){\r\n            let freezenTop = _this.freezenhorizontaldata[0];\r\n            let offTop = scrollTop - _this.freezenhorizontaldata[2];\r\n\r\n            $(\"#luckysheet-postil-showBoxs .luckysheet-postil-show\").each(function(i, e){\r\n                let id = $(e).attr(\"id\");\r\n\r\n                let r = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n                let c = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n                let postil = Store.flowdata[r][c].ps;\r\n\r\n                let row = Store.visibledatarow[r], \r\n                    row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n                let col = Store.visibledatacolumn[c], \r\n                    col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n                let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n                if(!!margeset){\r\n                    row = margeset.row[1];\r\n                    row_pre = margeset.row[0];\r\n                    \r\n                    col = margeset.column[1];\r\n                    col_pre = margeset.column[0];\r\n                }\r\n\r\n                let toX = col;\r\n                let toY = row_pre;\r\n\r\n                let postil_left = postil[\"left\"] == null ? toX + 18 : postil[\"left\"];\r\n                let postil_top = postil[\"top\"] == null ? toY - 18 : postil[\"top\"];\r\n                let postil_width = postil[\"width\"] == null ? luckysheetPostil.defaultWidth : postil[\"width\"];\r\n                let postil_height = postil[\"height\"] == null ? luckysheetPostil.defaultHeight : postil[\"height\"];\r\n\r\n                if(postil_top < 0){\r\n                    postil_top = 2;\r\n                }\r\n\r\n                let size = luckysheetPostil.getArrowCanvasSize(postil_left, postil_top, toX, toY);\r\n\r\n                if(r >= _this.freezenhorizontaldata[1]){\r\n                    if(postil_top + postil_height < freezenTop){\r\n                        $(e).show().find(\".luckysheet-postil-show-main\").css(\"top\", postil_top + offTop);\r\n                        $(e).show().find(\".arrowCanvas\").css(\"top\", size[1] + offTop);\r\n                    }\r\n                    else{\r\n                        if(postil_top < freezenTop + offTop){\r\n                            if(postil_top + postil_height <= freezenTop + offTop){\r\n                                $(e).hide();\r\n                            }\r\n                            else{\r\n                                $(e).show().find(\".luckysheet-postil-show-main\").css({ \"top\": freezenTop + offTop, \"height\": postil_height - (freezenTop + offTop - postil_top) });\r\n                                $(e).show().find(\".formulaInputFocus\").css(\"margin-top\", -(freezenTop + offTop - postil_top));\r\n                                $(e).show().find(\".arrowCanvas\").hide(); \r\n                            }\r\n                        }\r\n                        else{\r\n                            luckysheetPostil.buildPs(r, c, postil);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).show().find(\".luckysheet-postil-show-main\").css(\"top\", postil_top + offTop);\r\n                    $(e).show().find(\".arrowCanvas\").css(\"top\", size[1] + offTop);\r\n                }\r\n            })\r\n        }\r\n        else if(_this.freezenverticaldata != null){\r\n            let freezenLeft = _this.freezenverticaldata[0];\r\n            let offLeft = scrollLeft - _this.freezenverticaldata[2];\r\n\r\n            $(\"#luckysheet-postil-showBoxs .luckysheet-postil-show\").each(function(i, e){\r\n                let id = $(e).attr(\"id\");\r\n\r\n                let r = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n                let c = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n                let postil = Store.flowdata[r][c].ps;\r\n\r\n                let row = Store.visibledatarow[r], \r\n                    row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n                let col = Store.visibledatacolumn[c], \r\n                    col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n                let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n                if(!!margeset){\r\n                    row = margeset.row[1];\r\n                    row_pre = margeset.row[0];\r\n                    \r\n                    col = margeset.column[1];\r\n                    col_pre = margeset.column[0];\r\n                }\r\n\r\n                let toX = col;\r\n                let toY = row_pre;\r\n\r\n                let postil_left = postil[\"left\"] == null ? toX + 18 : postil[\"left\"];\r\n                let postil_top = postil[\"top\"] == null ? toY - 18 : postil[\"top\"];\r\n                let postil_width = postil[\"width\"] == null ? luckysheetPostil.defaultWidth : postil[\"width\"];\r\n                let postil_height = postil[\"height\"] == null ? luckysheetPostil.defaultHeight : postil[\"height\"];\r\n\r\n                if(postil_top < 0){\r\n                    postil_top = 2;\r\n                }\r\n\r\n                let size = luckysheetPostil.getArrowCanvasSize(postil_left, postil_top, toX, toY);\r\n\r\n                if(c >= _this.freezenverticaldata[1]){\r\n                    if(postil_left + postil_width < freezenLeft){\r\n                        $(e).show().find(\".luckysheet-postil-show-main\").css(\"left\", postil_left + offLeft);\r\n                        $(e).show().find(\".arrowCanvas\").css(\"left\", size[0] + offLeft);\r\n                    }\r\n                    else{\r\n                        if(postil_left < freezenLeft + offLeft){\r\n                            if(postil_left + postil_width <= freezenLeft + offLeft){\r\n                                $(e).hide();\r\n                            }\r\n                            else{\r\n                                $(e).show().find(\".luckysheet-postil-show-main\").css({ \"left\": freezenLeft + offLeft, \"width\": postil_width - (freezenLeft + offLeft - postil_left) });\r\n                                $(e).show().find(\".formulaInputFocus\").css(\"margin-left\", -(freezenLeft + offLeft - postil_left));\r\n                                $(e).show().find(\".arrowCanvas\").hide(); \r\n                            }\r\n                        }\r\n                        else{\r\n                            luckysheetPostil.buildPs(r, c, postil);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).show().find(\".luckysheet-postil-show-main\").css(\"left\", postil_left + offLeft);\r\n                    $(e).show().find(\".arrowCanvas\").css(\"left\", size[0] + offLeft);\r\n                }\r\n            })\r\n        }\r\n        else{\r\n            $(\"#luckysheet-postil-showBoxs .luckysheet-postil-show\").each(function(i, e){\r\n                let id = $(e).attr(\"id\");\r\n\r\n                let r = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n                let c = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n                let postil = Store.flowdata[r][c].ps;\r\n\r\n                luckysheetPostil.buildPs(r, c, postil);\r\n            })\r\n        }\r\n    },\r\n    scrollAdaptOfdpicon: function(){\r\n        let _this = this;\r\n\r\n        let copy_r = luckysheetDropCell.copyRange[\"row\"][1], \r\n            copy_c = luckysheetDropCell.copyRange[\"column\"][1];\r\n        \r\n        let apply_r = luckysheetDropCell.applyRange[\"row\"][1], \r\n            apply_c = luckysheetDropCell.applyRange[\"column\"][1];\r\n        \r\n        let row_index, col_index;\r\n        if(apply_r >= copy_r && apply_c >= copy_c){\r\n            row_index = apply_r;\r\n            col_index = apply_c;\r\n        }\r\n        else{\r\n            row_index = copy_r;\r\n            col_index = copy_c;   \r\n        }\r\n\r\n        if(_this.freezenhorizontaldata != null && _this.freezenverticaldata != null){\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let offsetRow = luckysheet_searcharray(_this.freezenhorizontaldata[3], $(\"#luckysheet-cell-main\").scrollTop() - _this.freezenhorizontaldata[2]);\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offsetColumn = luckysheet_searcharray(_this.freezenverticaldata[3], $(\"#luckysheet-cell-main\").scrollLeft() - _this.freezenverticaldata[2]);\r\n\r\n            if(row_index >= freezen_rowindex && col_index >= freezen_colindex){\r\n                if(row_index < (freezen_rowindex + offsetRow - 1) || col_index < (freezen_colindex + offsetColumn - 1)){\r\n                    $(\"#luckysheet-dropCell-icon\").hide();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-dropCell-icon\").show();\r\n                }\r\n            }\r\n            else if(row_index >= freezen_rowindex){\r\n                if(row_index < (freezen_rowindex + offsetRow - 1)){\r\n                    $(\"#luckysheet-dropCell-icon\").hide();\r\n                }\r\n                else{\r\n                    let col = colLocationByIndex(col_index + offsetColumn)[1];\r\n\r\n                    $(\"#luckysheet-dropCell-icon\").show().css(\"left\", col);\r\n                }\r\n            }\r\n            else if(col_index >= freezen_colindex){\r\n                if(col_index < (freezen_colindex + offsetColumn - 1)){\r\n                    $(\"#luckysheet-dropCell-icon\").hide();\r\n                }\r\n                else{\r\n                    let row = rowLocationByIndex(row_index + offsetRow)[1];\r\n\r\n                    $(\"#luckysheet-dropCell-icon\").show().css(\"top\", row);\r\n                }\r\n            }\r\n            else{\r\n                let row = rowLocationByIndex(row_index + offsetRow)[1],\r\n                    col = colLocationByIndex(col_index + offsetColumn)[1];\r\n\r\n                $(\"#luckysheet-dropCell-icon\").show().css({ \"left\": col, \"top\": row });\r\n            }\r\n        }\r\n        else if(_this.freezenhorizontaldata != null){\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let offsetRow = luckysheet_searcharray(_this.freezenhorizontaldata[3], $(\"#luckysheet-cell-main\").scrollTop() - _this.freezenhorizontaldata[2]);\r\n\r\n            if(row_index >= freezen_rowindex){\r\n                if(row_index < (freezen_rowindex + offsetRow - 1)){\r\n                    $(\"#luckysheet-dropCell-icon\").hide();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-dropCell-icon\").show();\r\n                }\r\n            }\r\n            else{\r\n                let row = rowLocationByIndex(row_index + offsetRow)[1];\r\n\r\n                $(\"#luckysheet-dropCell-icon\").show().css(\"top\", row);\r\n            }\r\n        }\r\n        else if(_this.freezenverticaldata != null){\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offsetColumn = luckysheet_searcharray(_this.freezenverticaldata[3], $(\"#luckysheet-cell-main\").scrollLeft() - _this.freezenverticaldata[2]);\r\n\r\n            if(col_index >= freezen_colindex){\r\n                if(col_index < (freezen_colindex + offsetColumn - 1)){\r\n                    $(\"#luckysheet-dropCell-icon\").hide();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-dropCell-icon\").show();\r\n                }\r\n            }\r\n            else{\r\n                let col = colLocationByIndex(col_index + offsetColumn)[1];\r\n\r\n                $(\"#luckysheet-dropCell-icon\").show().css(\"left\", col);\r\n            }\r\n        }\r\n        else{\r\n            let row = rowLocationByIndex(row_index)[1],\r\n                col = colLocationByIndex(col_index)[1];\r\n\r\n            $(\"#luckysheet-dropCell-icon\").show().css({ \"left\": col, \"top\": row });\r\n        }\r\n    },\r\n    scrollAdaptOffilteroptions: function(){\r\n        let _this = this;\r\n\r\n        if(_this.freezenhorizontaldata != null && _this.freezenverticaldata != null){\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let freezen_top = _this.freezenhorizontaldata[0] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offsetColumn = luckysheet_searcharray(_this.freezenverticaldata[3], $(\"#luckysheet-cell-main\").scrollLeft() - _this.freezenverticaldata[2]);\r\n\r\n            $(\"#luckysheet-filter-options-sheet\"+ Store.currentSheetIndex +\" .luckysheet-filter-options\").each(function(i, e){\r\n                let row_index = $(e).data(\"str\");\r\n                let top = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1];\r\n\r\n                let col_index = $(e).data(\"cindex\");\r\n\r\n                if(row_index >= freezen_rowindex && col_index >= freezen_colindex){\r\n                    if(top < freezen_top || col_index < (freezen_colindex + offsetColumn)){\r\n                        $(e).hide();\r\n                    }\r\n                    else{\r\n                        $(e).show();\r\n                    }\r\n                }\r\n                else if(row_index >= freezen_rowindex){\r\n                    if(top < freezen_top){\r\n                        $(e).hide();\r\n                    }\r\n                    else{\r\n                        let left = Store.visibledatacolumn[col_index + offsetColumn] - 20;\r\n\r\n                        $(e).show().css(\"left\", left);\r\n                    }\r\n                }\r\n                else if(col_index >= freezen_colindex){\r\n                    if(col_index < (freezen_colindex + offsetColumn)){\r\n                        $(e).hide();\r\n                    }\r\n                    else{\r\n                        $(e).show().css(\"top\", top + $(\"#luckysheet-cell-main\").scrollTop());\r\n                    }\r\n                }\r\n                else{\r\n                    let left = Store.visibledatacolumn[col_index + offsetColumn] - 20;\r\n\r\n                    $(e).show().css({ \"left\": left, \"top\": top + $(\"#luckysheet-cell-main\").scrollTop() });\r\n                }\r\n            });\r\n        }\r\n        else if(_this.freezenhorizontaldata != null){\r\n            let freezen_rowindex = _this.freezenhorizontaldata[1];\r\n            let freezen_top = _this.freezenhorizontaldata[0] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            $(\"#luckysheet-filter-options-sheet\"+ Store.currentSheetIndex +\" .luckysheet-filter-options\").each(function(i, e){\r\n                let row_index = $(e).data(\"str\");\r\n                let top = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1];\r\n\r\n                if(row_index >= freezen_rowindex){\r\n                    if(top < freezen_top){\r\n                        $(e).hide();\r\n                    }\r\n                    else{\r\n                        $(e).show();\r\n                    }\r\n                }\r\n                else{\r\n                    $(e).show().css(\"top\", top + $(\"#luckysheet-cell-main\").scrollTop());\r\n                }\r\n            });\r\n        }\r\n        else if(_this.freezenverticaldata != null){\r\n            let freezen_colindex = _this.freezenverticaldata[1];\r\n            let offsetColumn = luckysheet_searcharray(_this.freezenverticaldata[3], $(\"#luckysheet-cell-main\").scrollLeft() - _this.freezenverticaldata[2]);\r\n\r\n            $(\"#luckysheet-filter-options-sheet\"+ Store.currentSheetIndex +\" .luckysheet-filter-options\").each(function(i, e){\r\n                let col_index = $(e).data(\"cindex\");\r\n\r\n                if(col_index >= freezen_colindex){\r\n                    if(col_index < (freezen_colindex + offsetColumn)){\r\n                        $(e).hide();\r\n                    }\r\n                    else{\r\n                        $(e).show();\r\n                    }\r\n                }\r\n                else{\r\n                    let left = Store.visibledatacolumn[col_index + offsetColumn] - 20;\r\n\r\n                    $(e).show().css(\"left\", left);\r\n                }\r\n            });\r\n        }\r\n        else{\r\n            $(\"#luckysheet-filter-options-sheet\"+ Store.currentSheetIndex).empty();\r\n            createFilterOptions(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].filter_select);\r\n        }\r\n    },\r\n    /**\r\n     * \r\n     * @param {string} operate  \"freezenRow\"/ \"freezenColumn\"......\r\n     * @param {Number | String} order 工作表索引；默认值为当前工作表索引\r\n     * @param {Object} focus 冻结选区时的focus单元格行列值构成的对象；格式为{ row_focus:0, column_focus:0 }\r\n     */\r\n    saveFrozen: function(operate, order, focus = {}) {\r\n        if (order == null) {\r\n            order = getSheetIndex(Store.currentSheetIndex)\r\n        }\r\n        \r\n        // New configuration attribute of sheet: frozen, which stores more semantic configuration for initialization and transmission to the backend. freezenhorizontaldata is still used as local data\r\n\r\n        const select_save = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n        const row_focus = select_save[\"row_focus\"] == null ? select_save[\"row\"][0] : select_save[\"row_focus\"];\r\n        const column_focus = select_save[\"column_focus\"] == null ? select_save[\"column\"][0] : select_save[\"column_focus\"];\r\n\r\n        const range = {\r\n            row_focus: focus.row_focus || row_focus,\r\n            column_focus: focus.column_focus || column_focus\r\n        }\r\n\r\n        const frozen = {\r\n            \"freezenRow\": {\r\n                type: 'row'\r\n            },\r\n            \"freezenColumn\": {\r\n                type: 'column'\r\n            },\r\n            \"freezenRC\": {\r\n                type: 'both'\r\n            },\r\n            \"freezenRowRange\": {\r\n                type: 'rangeRow',\r\n                range: range\r\n            },\r\n            \"freezenColumnRange\": {\r\n                type: 'rangeColumn',\r\n                range: range\r\n            },\r\n            \"freezenRCRange\": {\r\n                type: 'rangeBoth',\r\n                range: range\r\n            },\r\n            \"freezenCancel\": {\r\n                type: 'cancel'\r\n            }\r\n        }\r\n\r\n        // store frozen\r\n        Store.luckysheetfile[order][\"frozen\"] = frozen[operate];\r\n    },\r\n    frozenTofreezen: function() {\r\n        // get frozen type\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        const frozen = file[\"frozen\"];\r\n\r\n        if(frozen == null){\r\n            return;\r\n        }\r\n\r\n        let freezen = null;\r\n\r\n        // transform to freezen\r\n        if(frozen.type === 'row'){\r\n            let scrollTop = 0;\r\n            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n            if(row_st == -1){\r\n                row_st = 0;\r\n            }\r\n            let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];\r\n            \r\n            freezen = {\r\n                horizontal:{\r\n                    freezenhorizontaldata: freezenhorizontaldata,\r\n                    top: top\r\n                }\r\n            }\r\n            \r\n        }\r\n        else if(frozen.type === 'column'){\r\n            let scrollLeft = 0;\r\n            let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n            if(col_st == -1){\r\n                col_st = 0;\r\n            }\r\n            let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];\r\n\r\n            freezen = {\r\n                vertical:{\r\n                    freezenverticaldata: freezenverticaldata,\r\n                    left: left\r\n                }\r\n            }\r\n        }\r\n        else if(frozen.type === 'both'){\r\n            let scrollTop = 0;\r\n            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n            if(row_st == -1){\r\n                row_st = 0;\r\n            }\r\n            let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];\r\n            \r\n            let scrollLeft = 0;\r\n            let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n            if(col_st == -1){\r\n                col_st = 0;\r\n            }\r\n            let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];\r\n\r\n            freezen = {\r\n                horizontal:{\r\n                    freezenhorizontaldata: freezenhorizontaldata,\r\n                    top: top\r\n                },\r\n                vertical:{\r\n                    freezenverticaldata: freezenverticaldata,\r\n                    left: left\r\n                }\r\n            }\r\n\r\n        }\r\n        else if(frozen.type === 'rangeRow'){\r\n            let scrollTop = 0;\r\n            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n\r\n            let row_focus = frozen.range[\"row_focus\"];\r\n\r\n            if(row_focus > row_st){\r\n                row_st = row_focus;\r\n            }\r\n            \r\n            if(row_st == -1){\r\n                row_st = 0;\r\n            }\r\n\r\n            let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];\r\n\r\n            freezen = {\r\n                horizontal:{\r\n                    freezenhorizontaldata: freezenhorizontaldata,\r\n                    top: top\r\n                }\r\n            }\r\n\r\n        }\r\n        else if(frozen.type === 'rangeColumn'){\r\n            let scrollLeft = 0;\r\n            let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n\r\n            let column_focus = frozen.range[\"column_focus\"];\r\n\r\n            if(column_focus > col_st){\r\n                col_st = column_focus;\r\n            }\r\n\r\n            if(col_st == -1){\r\n                col_st = 0;\r\n            }\r\n\r\n            let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];\r\n\r\n            freezen = {\r\n                vertical:{\r\n                    freezenverticaldata: freezenverticaldata,\r\n                    left: left\r\n                }\r\n            }\r\n\r\n        }\r\n        else if(frozen.type === 'rangeBoth'){\r\n            let scrollTop = 0;\r\n            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n\r\n            let row_focus = frozen.range[\"row_focus\"];\r\n\r\n            if(row_focus > row_st){\r\n                row_st = row_focus;\r\n            }\r\n            \r\n            if(row_st == -1){\r\n                row_st = 0;\r\n            }\r\n\r\n            let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];\r\n\r\n            let scrollLeft = 0;\r\n            let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n\r\n            let column_focus = frozen.range[\"column_focus\"];\r\n\r\n            if(column_focus > col_st){\r\n                col_st = column_focus;\r\n            }\r\n\r\n            if(col_st == -1){\r\n                col_st = 0;\r\n            }\r\n\r\n            let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];\r\n\r\n            freezen = {\r\n                horizontal:{\r\n                    freezenhorizontaldata: freezenhorizontaldata,\r\n                    top: top\r\n                },\r\n                vertical:{\r\n                    freezenverticaldata: freezenverticaldata,\r\n                    left: left\r\n                }\r\n            }\r\n        }\r\n        else if(frozen.type === 'cancel'){\r\n            freezen = {\r\n                horizontal: null,\r\n                vertical: null\r\n            }\r\n        }\r\n\r\n        file[\"freezen\"] = freezen;\r\n    }\r\n}\r\n\r\nexport default luckysheetFreezen;\r\n"
  },
  {
    "path": "src/controllers/handler.js",
    "content": "import mobileinit from \"./mobile\";\r\nimport luckysheetConfigsetting from \"./luckysheetConfigsetting\";\r\nimport luckysheetFreezen from \"./freezen\";\r\nimport pivotTable from \"./pivotTable\";\r\nimport luckysheetDropCell from \"./dropCell\";\r\nimport luckysheetPostil from \"./postil\";\r\nimport imageCtrl from \"./imageCtrl\";\r\nimport hyperlinkCtrl from \"./hyperlinkCtrl\";\r\nimport dataVerificationCtrl from \"./dataVerificationCtrl\";\r\nimport menuButton from \"./menuButton\";\r\nimport conditionformat from \"./conditionformat\";\r\nimport alternateformat from \"./alternateformat\";\r\nimport ifFormulaGenerator from \"./ifFormulaGenerator\";\r\nimport sheetmanage from \"./sheetmanage\";\r\nimport server from \"./server\";\r\nimport { luckysheetupdateCell } from \"./updateCell\";\r\nimport { luckysheet_searcharray } from \"./sheetSearch\";\r\nimport luckysheetsizeauto from \"./resize\";\r\nimport { luckysheetMoveHighlightCell } from \"./sheetMove\";\r\nimport {\r\n    selectHightlightShow,\r\n    selectIsOverlap,\r\n    selectionCopyShow,\r\n    luckysheet_count_show,\r\n    selectHelpboxFill,\r\n} from \"./select\";\r\nimport selection from \"./selection\";\r\nimport controlHistory from \"./controlHistory\";\r\nimport splitColumn from \"./splitColumn\";\r\nimport { hideMenuByCancel } from \"../global/cursorPos\";\r\nimport { luckysheetdefaultstyle } from \"./constant\";\r\nimport {\r\n    checkProtectionLockedRangeList,\r\n    checkProtectionAllSelected,\r\n    checkProtectionSelectLockedOrUnLockedCells,\r\n    checkProtectionNotEnable,\r\n    checkProtectionAuthorityNormal,\r\n} from \"./protection\";\r\nimport { openCellFormatModel } from \"./cellFormat\";\r\n\r\nimport {\r\n    replaceHtml,\r\n    getObjType,\r\n    chatatABC,\r\n    ArrayUnique,\r\n    showrightclickmenu,\r\n    luckysheetactiveCell,\r\n    luckysheetContainerFocus,\r\n    $$,\r\n} from \"../utils/util\";\r\nimport { getSheetIndex, getRangetxt } from \"../methods/get\";\r\nimport { rowLocation, colLocation, mouseposition } from \"../global/location\";\r\nimport { rowlenByRange } from \"../global/getRowlen\";\r\nimport { isRealNull, hasPartMC, isEditMode, checkIsAllowEdit } from \"../global/validate\";\r\nimport { countfunc } from \"../global/count\";\r\nimport browser from \"../global/browser\";\r\nimport formula from \"../global/formula\";\r\nimport { luckysheetextendtable } from \"../global/extend\";\r\nimport luckysheetscrollevent from \"../global/scroll\";\r\nimport { jfrefreshgrid, jfrefreshgrid_rhcw, luckysheetrefreshgrid } from \"../global/refresh\";\r\nimport { getdatabyselection, datagridgrowth } from \"../global/getdata\";\r\nimport tooltip from \"../global/tooltip\";\r\nimport editor from \"../global/editor\";\r\nimport { genarate, update } from \"../global/format\";\r\nimport method from \"../global/method\";\r\nimport { getBorderInfoCompute } from \"../global/border\";\r\nimport { luckysheetDrawMain } from \"../global/draw\";\r\nimport locale from \"../locale/locale\";\r\nimport Store from \"../store\";\r\nimport { createLuckyChart, hideAllNeedRangeShow } from \"../expendPlugins/chart/plugin\";\r\nimport luckysheetformula from \"../global/formula\";\r\nimport {createExportDialog,fetchAndDownloadXlsx} from \"../expendPlugins/exportXlsx/plugin\";\r\n\r\n//, columeflowset, rowflowset\r\nexport default function luckysheetHandler() {\r\n    const os = browser.detectOS(),\r\n        isMobile = browser.mobilecheck();\r\n\r\n    //移动端\r\n    if (isMobile) {\r\n        mobileinit();\r\n    }\r\n    if (!Date.now)\r\n        Date.now = function() {\r\n            return new Date().getTime();\r\n        };\r\n    //requestAnimationFrame method\r\n    (function() {\r\n        \"use strict\";\r\n\r\n        var vendors = [\"webkit\", \"moz\"];\r\n        for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {\r\n            var vp = vendors[i];\r\n            window.requestAnimationFrame = window[vp + \"RequestAnimationFrame\"];\r\n            window.cancelAnimationFrame =\r\n                window[vp + \"CancelAnimationFrame\"] || window[vp + \"CancelRequestAnimationFrame\"];\r\n        }\r\n        if (\r\n            /iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || // iOS6 is buggy\r\n            !window.requestAnimationFrame ||\r\n            !window.cancelAnimationFrame\r\n        ) {\r\n            var lastTime = 0;\r\n            window.requestAnimationFrame = function(callback) {\r\n                var now = Date.now();\r\n                var nextTime = Math.max(lastTime + 16, now);\r\n                return setTimeout(function() {\r\n                    callback((lastTime = nextTime));\r\n                }, nextTime - now);\r\n            };\r\n            window.cancelAnimationFrame = clearTimeout;\r\n        }\r\n    })();\r\n\r\n    $(\"#luckysheet-sheet-container-c\").mousewheel(function(event, delta) {\r\n        let scrollNum = event.deltaFactor < 40 ? 1 : event.deltaFactor < 80 ? 2 : 3;\r\n        let scrollLeft = $(this).scrollLeft();\r\n        if (event.deltaY != 0) {\r\n            if (event.deltaY < 0) {\r\n                scrollLeft = scrollLeft + 10 * scrollNum;\r\n            } else {\r\n                scrollLeft = scrollLeft - 10 * scrollNum;\r\n            }\r\n        } else if (event.deltaX != 0) {\r\n            if (event.deltaX > 0) {\r\n                scrollLeft = scrollLeft + 10 * scrollNum;\r\n            } else {\r\n                scrollLeft = scrollLeft - 10 * scrollNum;\r\n            }\r\n        }\r\n        $(this).scrollLeft(scrollLeft);\r\n        event.preventDefault();\r\n    });\r\n\r\n    //滚动监听\r\n    $(\"#luckysheet-cell-main\")\r\n        .scroll(function() {})\r\n        .mousewheel(function(event, delta) {\r\n            event.preventDefault();\r\n        });\r\n\r\n    const _locale = locale();\r\n    const locale_drag = _locale.drag;\r\n    const locale_info = _locale.info;\r\n    let prev, mousewheelArrayUniqueTimeout;\r\n    $(\"#luckysheet-grid-window-1\").mousewheel(function(event, delta) {\r\n        let scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft(),\r\n            scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n        let visibledatacolumn_c = Store.visibledatacolumn,\r\n            visibledatarow_c = Store.visibledatarow;\r\n\r\n        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n            visibledatarow_c = luckysheetFreezen.freezenhorizontaldata[3];\r\n        }\r\n\r\n        if (luckysheetFreezen.freezenverticaldata != null) {\r\n            visibledatacolumn_c = luckysheetFreezen.freezenverticaldata[3];\r\n        }\r\n\r\n        clearTimeout(mousewheelArrayUniqueTimeout);\r\n\r\n        // if(Store.visibledatacolumn.length!=visibledatacolumn_c.length){\r\n        if (Store.visibledatacolumn_unique != null) {\r\n            visibledatacolumn_c = Store.visibledatacolumn_unique;\r\n        } else {\r\n            visibledatacolumn_c = ArrayUnique(visibledatacolumn_c);\r\n            Store.visibledatacolumn_unique = visibledatacolumn_c;\r\n        }\r\n        // }\r\n\r\n        // if(Store.visibledatarow.length!=visibledatarow_c.length){\r\n        if (Store.visibledatarow_unique != null) {\r\n            visibledatarow_c = Store.visibledatarow_unique;\r\n        } else {\r\n            visibledatarow_c = ArrayUnique(visibledatarow_c);\r\n            Store.visibledatarow_unique = visibledatarow_c;\r\n        }\r\n        // }\r\n\r\n        // visibledatacolumn_c = ArrayUnique(visibledatacolumn_c);\r\n        // visibledatarow_c = ArrayUnique(visibledatarow_c);\r\n\r\n        let col_st = luckysheet_searcharray(visibledatacolumn_c, scrollLeft);\r\n        let row_st = luckysheet_searcharray(visibledatarow_c, scrollTop);\r\n\r\n        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n            row_st = luckysheet_searcharray(visibledatarow_c, scrollTop + luckysheetFreezen.freezenhorizontaldata[0]);\r\n        }\r\n\r\n        let colscroll = 0;\r\n        let rowscroll = 0;\r\n\r\n        let scrollNum = event.deltaFactor < 40 ? 1 : event.deltaFactor < 80 ? 2 : 3;\r\n        //一次滚动三行或三列\r\n        if (event.deltaY != 0) {\r\n            let row_ed,\r\n                step = Math.round(scrollNum / Store.zoomRatio);\r\n            step = step < 1 ? 1 : step;\r\n            if (event.deltaY < 0) {\r\n                row_ed = row_st + step;\r\n\r\n                if (row_ed >= visibledatarow_c.length) {\r\n                    row_ed = visibledatarow_c.length - 1;\r\n                }\r\n            } else {\r\n                row_ed = row_st - step;\r\n\r\n                if (row_ed < 0) {\r\n                    row_ed = 0;\r\n                }\r\n            }\r\n\r\n            rowscroll = row_ed == 0 ? 0 : visibledatarow_c[row_ed - 1];\r\n\r\n            if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n                rowscroll -= luckysheetFreezen.freezenhorizontaldata[0];\r\n            }\r\n\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(rowscroll);\r\n        } else if (event.deltaX != 0) {\r\n            let col_ed;\r\n\r\n            // if((isMac && event.deltaX >0 ) || (!isMac && event.deltaX < 0)){\r\n            if (event.deltaX > 0) {\r\n                scrollLeft = scrollLeft + 20 * Store.zoomRatio;\r\n\r\n                // if(col_ed >= visibledatacolumn_c.length){\r\n                //     col_ed = visibledatacolumn_c.length - 1;\r\n                // }\r\n            } else {\r\n                scrollLeft = scrollLeft - 20 * Store.zoomRatio;\r\n\r\n                // if(col_ed < 0){\r\n                //     col_ed = 0;\r\n                // }\r\n            }\r\n\r\n            // colscroll = col_ed == 0 ? 0 : visibledatacolumn_c[col_ed - 1];\r\n\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(scrollLeft);\r\n        }\r\n\r\n        mousewheelArrayUniqueTimeout = setTimeout(() => {\r\n            Store.visibledatacolumn_unique = null;\r\n            Store.visibledatarow_unique = null;\r\n        }, 500);\r\n    });\r\n\r\n    $(\"#luckysheet-scrollbar-x\")\r\n        .scroll(function() {\r\n            // setTimeout(function(){\r\n            luckysheetscrollevent();\r\n            // },10);\r\n        })\r\n        .mousewheel(function(event, delta) {\r\n            event.preventDefault();\r\n        });\r\n\r\n    $(\"#luckysheet-scrollbar-y\")\r\n        .scroll(function() {\r\n            // setTimeout(function(){\r\n            luckysheetscrollevent();\r\n            // },10);\r\n        })\r\n        .mousewheel(function(event, delta) {\r\n            event.preventDefault();\r\n        });\r\n\r\n    //页面resize\r\n    $(window).resize(function() {\r\n        let luckysheetDocument = document.getElementById(Store.container);\r\n        if (luckysheetDocument) {\r\n            luckysheetsizeauto();\r\n        }\r\n    });\r\n\r\n    $(\"#luckysheet-rich-text-editor\").mouseup(function(e) {\r\n        menuButton.inputMenuButtonFocus(e.target);\r\n    });\r\n\r\n    //表格mousedown\r\n    $(\"#luckysheet-cell-main, #luckysheetTableContent\")\r\n        .mousedown(function(event) {\r\n            if ($(event.target).hasClass(\"luckysheet-mousedown-cancel\")) {\r\n                return;\r\n            }\r\n\r\n            // 协同编辑其他用户不在操作的时候，用户名框隐藏\r\n            hideUsername();\r\n\r\n            $(\"#luckysheet-cell-selected\")\r\n                .find(\".luckysheet-cs-fillhandle\")\r\n                .css(\"cursor\", \"default\")\r\n                .end()\r\n                .find(\".luckysheet-cs-draghandle\")\r\n                .css(\"cursor\", \"default\");\r\n            $(\"#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0\").css(\"cursor\", \"default\");\r\n\r\n            //有批注在编辑时\r\n            luckysheetPostil.removeActivePs();\r\n\r\n            //图片 active/cropping\r\n            if (\r\n                $(\"#luckysheet-modal-dialog-activeImage\").is(\":visible\") ||\r\n                $(\"#luckysheet-modal-dialog-cropping\").is(\":visible\")\r\n            ) {\r\n                imageCtrl.cancelActiveImgItem();\r\n            }\r\n\r\n            //luckysheetautoadjustmousedown = 1;\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            if (\r\n                mouse[0] >= Store.cellmainWidth - Store.cellMainSrollBarSize ||\r\n                mouse[1] >= Store.cellmainHeight - Store.cellMainSrollBarSize\r\n            ) {\r\n                return;\r\n            }\r\n\r\n            let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            if (\r\n                luckysheetFreezen.freezenverticaldata != null &&\r\n                mouse[0] < luckysheetFreezen.freezenverticaldata[0] - luckysheetFreezen.freezenverticaldata[2]\r\n            ) {\r\n                x = mouse[0] + luckysheetFreezen.freezenverticaldata[2];\r\n            }\r\n\r\n            if (\r\n                luckysheetFreezen.freezenhorizontaldata != null &&\r\n                mouse[1] < luckysheetFreezen.freezenhorizontaldata[0] - luckysheetFreezen.freezenhorizontaldata[2]\r\n            ) {\r\n                y = mouse[1] + luckysheetFreezen.freezenhorizontaldata[2];\r\n            }\r\n\r\n            let sheetFile = sheetmanage.getSheetByIndex();\r\n            let luckysheetTableContent = $(\"#luckysheetTableContent\")\r\n                .get(0)\r\n                .getContext(\"2d\");\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n\r\n            let row_index_ed = row_index,\r\n                col_index_ed = col_index;\r\n            let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n            if (!!margeset) {\r\n                row = margeset.row[1];\r\n                row_pre = margeset.row[0];\r\n                row_index = margeset.row[2];\r\n                row_index_ed = margeset.row[3];\r\n\r\n                col = margeset.column[1];\r\n                col_pre = margeset.column[0];\r\n                col_index = margeset.column[2];\r\n                col_index_ed = margeset.column[3];\r\n            }\r\n\r\n            //单元格单击之前\r\n            if (\r\n                !method.createHookFunction(\r\n                    \"cellMousedownBefore\",\r\n                    Store.flowdata[row_index][col_index],\r\n                    {\r\n                        r: row_index,\r\n                        c: col_index,\r\n                        start_r: row_pre,\r\n                        start_c: col_pre,\r\n                        end_r: row,\r\n                        end_c: col,\r\n                    },\r\n                    sheetFile,\r\n                    luckysheetTableContent,\r\n                )\r\n            ) {\r\n                return;\r\n            }\r\n\r\n            //数据验证 单元格聚焦\r\n            dataVerificationCtrl.cellFocus(row_index, col_index, true);\r\n            luckysheetformula.cellFocus(row_index, col_index);\r\n\r\n            //若点击单元格部分不在视图内\r\n            if (col_pre < $(\"#luckysheet-cell-main\").scrollLeft()) {\r\n                $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre);\r\n            }\r\n\r\n            if (row_pre < $(\"#luckysheet-cell-main\").scrollTop()) {\r\n                $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre);\r\n            }\r\n\r\n            //mousedown是右键\r\n            if (event.which == \"3\") {\r\n                $(\"#luckysheet-dataVerification-showHintBox\").hide();\r\n\r\n                let isright = false;\r\n\r\n                for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                    if (\r\n                        Store.luckysheet_select_save[s][\"row\"] != null &&\r\n                        row_index >= Store.luckysheet_select_save[s][\"row\"][0] &&\r\n                        row_index <= Store.luckysheet_select_save[s][\"row\"][1] &&\r\n                        col_index >= Store.luckysheet_select_save[s][\"column\"][0] &&\r\n                        col_index <= Store.luckysheet_select_save[s][\"column\"][1]\r\n                    ) {\r\n                        isright = true;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (isright) {\r\n                    return;\r\n                }\r\n            }\r\n\r\n            //单元格数据下钻\r\n            if (\r\n                Store.flowdata[row_index] != null &&\r\n                Store.flowdata[row_index][col_index] != null &&\r\n                Store.flowdata[row_index][col_index].dd != null\r\n            ) {\r\n                if (\r\n                    luckysheetConfigsetting.fireMousedown != null &&\r\n                    getObjType(luckysheetConfigsetting.fireMousedown) == \"function\"\r\n                ) {\r\n                    luckysheetConfigsetting.fireMousedown(Store.flowdata[row_index][col_index].dd);\r\n                    return;\r\n                }\r\n            }\r\n\r\n            //链接 单元格聚焦\r\n            if (hyperlinkCtrl.hyperlink && hyperlinkCtrl.hyperlink[row_index + \"_\" + col_index] && event.which != \"3\") {\r\n                hyperlinkCtrl.cellFocus(row_index, col_index);\r\n                return;\r\n            }\r\n\r\n            Store.luckysheet_scroll_status = true;\r\n\r\n            //公式相关\r\n            let $input = $(\"#luckysheet-input-box\");\r\n            if (parseInt($input.css(\"top\")) > 0) {\r\n                if (\r\n                    formula.rangestart ||\r\n                    formula.rangedrag_column_start ||\r\n                    formula.rangedrag_row_start ||\r\n                    formula.israngeseleciton()\r\n                ) {\r\n                    //公式选区\r\n                    let rowseleted = [row_index, row_index_ed];\r\n                    let columnseleted = [col_index, col_index_ed];\r\n\r\n                    let left = col_pre;\r\n                    let width = col - col_pre - 1;\r\n                    let top = row_pre;\r\n                    let height = row - row_pre - 1;\r\n\r\n                    if (event.shiftKey) {\r\n                        let last = formula.func_selectedrange;\r\n\r\n                        let top = 0,\r\n                            height = 0,\r\n                            rowseleted = [];\r\n                        if (last.top > row_pre) {\r\n                            top = row_pre;\r\n                            height = last.top + last.height - row_pre;\r\n\r\n                            if (last.row[1] > last.row_focus) {\r\n                                last.row[1] = last.row_focus;\r\n                            }\r\n\r\n                            rowseleted = [row_index, last.row[1]];\r\n                        } else if (last.top == row_pre) {\r\n                            top = row_pre;\r\n                            height = last.top + last.height - row_pre;\r\n                            rowseleted = [row_index, last.row[0]];\r\n                        } else {\r\n                            top = last.top;\r\n                            height = row - last.top - 1;\r\n\r\n                            if (last.row[0] < last.row_focus) {\r\n                                last.row[0] = last.row_focus;\r\n                            }\r\n\r\n                            rowseleted = [last.row[0], row_index];\r\n                        }\r\n\r\n                        let left = 0,\r\n                            width = 0,\r\n                            columnseleted = [];\r\n                        if (last.left > col_pre) {\r\n                            left = col_pre;\r\n                            width = last.left + last.width - col_pre;\r\n\r\n                            if (last.column[1] > last.column_focus) {\r\n                                last.column[1] = last.column_focus;\r\n                            }\r\n\r\n                            columnseleted = [col_index, last.column[1]];\r\n                        } else if (last.left == col_pre) {\r\n                            left = col_pre;\r\n                            width = last.left + last.width - col_pre;\r\n                            columnseleted = [col_index, last.column[0]];\r\n                        } else {\r\n                            left = last.left;\r\n                            width = col - last.left - 1;\r\n\r\n                            if (last.column[0] < last.column_focus) {\r\n                                last.column[0] = last.column_focus;\r\n                            }\r\n\r\n                            columnseleted = [last.column[0], col_index];\r\n                        }\r\n\r\n                        let changeparam = menuButton.mergeMoveMain(\r\n                            columnseleted,\r\n                            rowseleted,\r\n                            last,\r\n                            top,\r\n                            height,\r\n                            left,\r\n                            width,\r\n                        );\r\n                        if (changeparam != null) {\r\n                            columnseleted = changeparam[0];\r\n                            rowseleted = changeparam[1];\r\n                            top = changeparam[2];\r\n                            height = changeparam[3];\r\n                            left = changeparam[4];\r\n                            width = changeparam[5];\r\n                        }\r\n\r\n                        luckysheet_count_show(left, top, width, height, rowseleted, columnseleted);\r\n\r\n                        last[\"row\"] = rowseleted;\r\n                        last[\"column\"] = columnseleted;\r\n\r\n                        last[\"left_move\"] = left;\r\n                        last[\"width_move\"] = width;\r\n                        last[\"top_move\"] = top;\r\n                        last[\"height_move\"] = height;\r\n\r\n                        formula.func_selectedrange = last;\r\n                    } else if (\r\n                        event.ctrlKey &&\r\n                        $(\"#luckysheet-rich-text-editor\")\r\n                            .find(\"span\")\r\n                            .last()\r\n                            .text() != \",\"\r\n                    ) {\r\n                        //按住ctrl 选择选区时  先处理上一个选区\r\n                        let vText = $(\"#luckysheet-rich-text-editor\").text();\r\n\r\n                        if (vText[vText.length - 1] === \")\") {\r\n                            vText = vText.substr(0, vText.length - 1); //先删除最后侧的圆括号)\r\n                        }\r\n\r\n                        if (vText.length > 0) {\r\n                            let lastWord = vText.substr(vText.length - 1, 1);\r\n                            if (lastWord != \",\" && lastWord != \"=\" && lastWord != \"(\") {\r\n                                vText += \",\";\r\n                            }\r\n                        }\r\n                        if (vText.length > 0 && vText.substr(0, 1) == \"=\") {\r\n                            vText = formula.functionHTMLGenerate(vText);\r\n\r\n                            if (window.getSelection) {\r\n                                // all browsers, except IE before version 9\r\n                                let currSelection = window.getSelection();\r\n                                formula.functionRangeIndex = [\r\n                                    $(currSelection.anchorNode)\r\n                                        .parent()\r\n                                        .index(),\r\n                                    currSelection.anchorOffset,\r\n                                ];\r\n                            } else {\r\n                                // Internet Explorer before version 9\r\n                                let textRange = document.selection.createRange();\r\n                                formula.functionRangeIndex = textRange;\r\n                            }\r\n\r\n                            /* 在显示前重新 + 右侧的圆括号) */\r\n\r\n                            $(\"#luckysheet-rich-text-editor\").html(vText + \")\");\r\n\r\n                            formula.canceFunctionrangeSelected();\r\n                            formula.createRangeHightlight();\r\n                        }\r\n\r\n                        formula.rangestart = false;\r\n                        formula.rangedrag_column_start = false;\r\n                        formula.rangedrag_row_start = false;\r\n\r\n                        $(\"#luckysheet-functionbox-cell\").html(vText + \")\");\r\n                        formula.rangeHightlightselected($(\"#luckysheet-rich-text-editor\"));\r\n\r\n                        //再进行 选区的选择\r\n                        formula.israngeseleciton();\r\n                        formula.func_selectedrange = {\r\n                            left: left,\r\n                            width: width,\r\n                            top: top,\r\n                            height: height,\r\n                            left_move: left,\r\n                            width_move: width,\r\n                            top_move: top,\r\n                            height_move: height,\r\n                            row: rowseleted,\r\n                            column: columnseleted,\r\n                            row_focus: row_index,\r\n                            column_focus: col_index,\r\n                        };\r\n                    } else {\r\n                        formula.func_selectedrange = {\r\n                            left: left,\r\n                            width: width,\r\n                            top: top,\r\n                            height: height,\r\n                            left_move: left,\r\n                            width_move: width,\r\n                            top_move: top,\r\n                            height_move: height,\r\n                            row: rowseleted,\r\n                            column: columnseleted,\r\n                            row_focus: row_index,\r\n                            column_focus: col_index,\r\n                        };\r\n                    }\r\n\r\n                    formula.rangeSetValue({ row: rowseleted, column: columnseleted });\r\n\r\n                    formula.rangestart = true;\r\n                    formula.rangedrag_column_start = false;\r\n                    formula.rangedrag_row_start = false;\r\n\r\n                    $(\"#luckysheet-formula-functionrange-select\")\r\n                        .css({\r\n                            left: left,\r\n                            width: width,\r\n                            top: top,\r\n                            height: height,\r\n                        })\r\n                        .show();\r\n                    $(\"#luckysheet-formula-help-c\").hide();\r\n                    luckysheet_count_show(left, top, width, height, rowseleted, columnseleted);\r\n\r\n                    setTimeout(function() {\r\n                        let currSelection = window.getSelection();\r\n                        let anchorOffset = currSelection.anchorNode;\r\n\r\n                        let $editor;\r\n                        if (\r\n                            $(\"#luckysheet-search-formula-parm\").is(\":visible\") ||\r\n                            $(\"#luckysheet-search-formula-parm-select\").is(\":visible\")\r\n                        ) {\r\n                            $editor = $(\"#luckysheet-rich-text-editor\");\r\n                            formula.rangechangeindex = formula.data_parm_index;\r\n                        } else {\r\n                            $editor = $(anchorOffset).closest(\"div\");\r\n                        }\r\n\r\n                        let $span = $editor.find(\"span[rangeindex='\" + formula.rangechangeindex + \"']\");\r\n                        if ($span && $span != undefined && $span != null && $span && $span.html().length) {\r\n                            formula.setCaretPosition($span.get(0), 0, $span.html().length);\r\n                        }\r\n                    }, 1);\r\n                    return;\r\n                } else {\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    Store.luckysheet_select_status = true;\r\n\r\n                    if ($(\"#luckysheet-info\").is(\":visible\")) {\r\n                        Store.luckysheet_select_status = false;\r\n                    }\r\n                }\r\n            } else {\r\n                if (checkProtectionSelectLockedOrUnLockedCells(row_index, col_index, Store.currentSheetIndex)) {\r\n                    Store.luckysheet_select_status = true;\r\n                }\r\n            }\r\n\r\n            //条件格式 应用范围可选择多个单元格\r\n            if ($(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                conditionformat.selectStatus = true;\r\n                Store.luckysheet_select_status = false;\r\n\r\n                if (event.shiftKey) {\r\n                    let last = conditionformat.selectRange[conditionformat.selectRange.length - 1];\r\n\r\n                    let top = 0,\r\n                        height = 0,\r\n                        rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if (last.row[1] > last.row_focus) {\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    } else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    } else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if (last.row[0] < last.row_focus) {\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    let left = 0,\r\n                        width = 0,\r\n                        columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if (last.column[1] > last.column_focus) {\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    } else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    } else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if (last.column[0] < last.column_focus) {\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    let changeparam = menuButton.mergeMoveMain(\r\n                        columnseleted,\r\n                        rowseleted,\r\n                        last,\r\n                        top,\r\n                        height,\r\n                        left,\r\n                        width,\r\n                    );\r\n                    if (changeparam != null) {\r\n                        columnseleted = changeparam[0];\r\n                        rowseleted = changeparam[1];\r\n                        top = changeparam[2];\r\n                        height = changeparam[3];\r\n                        left = changeparam[4];\r\n                        width = changeparam[5];\r\n                    }\r\n\r\n                    last[\"row\"] = rowseleted;\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    conditionformat.selectRange[conditionformat.selectRange.length - 1] = last;\r\n                } else if (event.ctrlKey) {\r\n                    conditionformat.selectRange.push({\r\n                        left: col_pre,\r\n                        width: col - col_pre - 1,\r\n                        top: row_pre,\r\n                        height: row - row_pre - 1,\r\n                        left_move: col_pre,\r\n                        width_move: col - col_pre - 1,\r\n                        top_move: row_pre,\r\n                        height_move: row - row_pre - 1,\r\n                        row: [row_index, row_index_ed],\r\n                        column: [col_index, col_index_ed],\r\n                        row_focus: row_index,\r\n                        column_focus: col_index,\r\n                    });\r\n                } else {\r\n                    conditionformat.selectRange = [];\r\n                    conditionformat.selectRange.push({\r\n                        left: col_pre,\r\n                        width: col - col_pre - 1,\r\n                        top: row_pre,\r\n                        height: row - row_pre - 1,\r\n                        left_move: col_pre,\r\n                        width_move: col - col_pre - 1,\r\n                        top_move: row_pre,\r\n                        height_move: row - row_pre - 1,\r\n                        row: [row_index, row_index_ed],\r\n                        column: [col_index, col_index_ed],\r\n                        row_focus: row_index,\r\n                        column_focus: col_index,\r\n                    });\r\n                }\r\n\r\n                selectionCopyShow(conditionformat.selectRange);\r\n\r\n                let range = conditionformat.getTxtByRange(conditionformat.selectRange);\r\n                $(\"#luckysheet-multiRange-dialog input\").val(range);\r\n\r\n                return;\r\n            } else {\r\n                conditionformat.selectStatus = false;\r\n                conditionformat.selectRange = [];\r\n            }\r\n\r\n            //条件格式 条件值只能选择单个单元格\r\n            if ($(\"#luckysheet-singleRange-dialog\").is(\":visible\")) {\r\n                Store.luckysheet_select_status = false;\r\n\r\n                selectionCopyShow([{ row: [row_index, row_index], column: [col_index, col_index] }]);\r\n\r\n                let range = getRangetxt(\r\n                    Store.currentSheetIndex,\r\n                    { row: [row_index, row_index], column: [col_index, col_index] },\r\n                    Store.currentSheetIndex,\r\n                );\r\n                $(\"#luckysheet-singleRange-dialog input\").val(range);\r\n\r\n                return;\r\n            }\r\n\r\n            //数据验证 单元格范围选择\r\n            if ($(\"#luckysheet-dataVerificationRange-dialog\").is(\":visible\")) {\r\n                dataVerificationCtrl.selectStatus = true;\r\n                Store.luckysheet_select_status = false;\r\n\r\n                if (event.shiftKey) {\r\n                    let last = dataVerificationCtrl.selectRange[dataVerificationCtrl.selectRange.length - 1];\r\n\r\n                    let top = 0,\r\n                        height = 0,\r\n                        rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if (last.row[1] > last.row_focus) {\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    } else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    } else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if (last.row[0] < last.row_focus) {\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    let left = 0,\r\n                        width = 0,\r\n                        columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if (last.column[1] > last.column_focus) {\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    } else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    } else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if (last.column[0] < last.column_focus) {\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    let changeparam = menuButton.mergeMoveMain(\r\n                        columnseleted,\r\n                        rowseleted,\r\n                        last,\r\n                        top,\r\n                        height,\r\n                        left,\r\n                        width,\r\n                    );\r\n                    if (changeparam != null) {\r\n                        columnseleted = changeparam[0];\r\n                        rowseleted = changeparam[1];\r\n                        top = changeparam[2];\r\n                        height = changeparam[3];\r\n                        left = changeparam[4];\r\n                        width = changeparam[5];\r\n                    }\r\n\r\n                    last[\"row\"] = rowseleted;\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    dataVerificationCtrl.selectRange[dataVerificationCtrl.selectRange.length - 1] = last;\r\n                } else {\r\n                    dataVerificationCtrl.selectRange = [];\r\n                    dataVerificationCtrl.selectRange.push({\r\n                        left: col_pre,\r\n                        width: col - col_pre - 1,\r\n                        top: row_pre,\r\n                        height: row - row_pre - 1,\r\n                        left_move: col_pre,\r\n                        width_move: col - col_pre - 1,\r\n                        top_move: row_pre,\r\n                        height_move: row - row_pre - 1,\r\n                        row: [row_index, row_index_ed],\r\n                        column: [col_index, col_index_ed],\r\n                        row_focus: row_index,\r\n                        column_focus: col_index,\r\n                    });\r\n                }\r\n\r\n                selectionCopyShow(dataVerificationCtrl.selectRange);\r\n\r\n                let range = dataVerificationCtrl.getTxtByRange(dataVerificationCtrl.selectRange);\r\n                if (formula.rangetosheet && formula.rangetosheet != Store.currentSheetIndex) {\r\n                    range = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name + \"!\" + range;\r\n                }\r\n                $(\"#luckysheet-dataVerificationRange-dialog input\").val(range);\r\n\r\n                return;\r\n            } else {\r\n                dataVerificationCtrl.selectStatus = false;\r\n                dataVerificationCtrl.selectRange = [];\r\n            }\r\n\r\n            //if公式生成器\r\n            if (ifFormulaGenerator.singleRangeFocus) {\r\n                $(\"#luckysheet-ifFormulaGenerator-dialog .singRange\").click();\r\n            }\r\n            if ($(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").is(\":visible\")) {\r\n                //选择单个单元格\r\n                Store.luckysheet_select_status = false;\r\n                formula.rangestart = false;\r\n\r\n                $(\"#luckysheet-formula-functionrange-select\")\r\n                    .css({\r\n                        left: col_pre,\r\n                        width: col - col_pre - 1,\r\n                        top: row_pre,\r\n                        height: row - row_pre - 1,\r\n                    })\r\n                    .show();\r\n                $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n                let range = getRangetxt(\r\n                    Store.currentSheetIndex,\r\n                    { row: [row_index, row_index], column: [col_index, col_index] },\r\n                    Store.currentSheetIndex,\r\n                );\r\n                $(\"#luckysheet-ifFormulaGenerator-singleRange-dialog input\").val(range);\r\n\r\n                return;\r\n            }\r\n            if ($(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").is(\":visible\")) {\r\n                //选择范围\r\n                Store.luckysheet_select_status = false;\r\n                formula.func_selectedrange = {\r\n                    left: col_pre,\r\n                    width: col - col_pre - 1,\r\n                    top: row_pre,\r\n                    height: row - row_pre - 1,\r\n                    left_move: col_pre,\r\n                    width_move: col - col_pre - 1,\r\n                    top_move: row_pre,\r\n                    height_move: row - row_pre - 1,\r\n                    row: [row_index, row_index],\r\n                    column: [col_index, col_index],\r\n                    row_focus: row_index,\r\n                    column_focus: col_index,\r\n                };\r\n                formula.rangestart = true;\r\n\r\n                $(\"#luckysheet-formula-functionrange-select\")\r\n                    .css({\r\n                        left: col_pre,\r\n                        width: col - col_pre - 1,\r\n                        top: row_pre,\r\n                        height: row - row_pre - 1,\r\n                    })\r\n                    .show();\r\n                $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n                let range = getRangetxt(\r\n                    Store.currentSheetIndex,\r\n                    { row: [row_index, row_index], column: [col_index, col_index] },\r\n                    Store.currentSheetIndex,\r\n                );\r\n                $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog input\").val(range);\r\n\r\n                $(\"#luckysheet-row-count-show\").hide();\r\n                $(\"#luckysheet-column-count-show\").hide();\r\n\r\n                return;\r\n            }\r\n\r\n            if (Store.luckysheet_select_status) {\r\n                if (event.shiftKey) {\r\n                    //按住shift点击，选择范围\r\n                    let last = $.extend(\r\n                        true,\r\n                        {},\r\n                        Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n                    ); //选区最后一个\r\n\r\n                    let top = 0,\r\n                        height = 0,\r\n                        rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if (last.row[1] > last.row_focus) {\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    } else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    } else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if (last.row[0] < last.row_focus) {\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    let left = 0,\r\n                        width = 0,\r\n                        columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if (last.column[1] > last.column_focus) {\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    } else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    } else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if (last.column[0] < last.column_focus) {\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    let changeparam = menuButton.mergeMoveMain(\r\n                        columnseleted,\r\n                        rowseleted,\r\n                        last,\r\n                        top,\r\n                        height,\r\n                        left,\r\n                        width,\r\n                    );\r\n                    if (changeparam != null) {\r\n                        columnseleted = changeparam[0];\r\n                        rowseleted = changeparam[1];\r\n                        top = changeparam[2];\r\n                        height = changeparam[3];\r\n                        left = changeparam[4];\r\n                        width = changeparam[5];\r\n                    }\r\n\r\n                    last[\"row\"] = rowseleted;\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n\r\n                    //交替颜色选择范围\r\n                    if ($(\"#luckysheet-alternateformat-rangeDialog\").is(\":visible\")) {\r\n                        $(\"#luckysheet-alternateformat-rangeDialog input\").val(\r\n                            getRangetxt(Store.currentSheetIndex, Store.luckysheet_select_save),\r\n                        );\r\n                    }\r\n\r\n                    if (pivotTable.luckysheet_pivotTable_select_state) {\r\n                        $(\"#luckysheet-pivotTable-range-selection-input\").val(\r\n                            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name +\r\n                                \"!\" +\r\n                                chatatABC(Store.luckysheet_select_save[0][\"column\"][0]) +\r\n                                (Store.luckysheet_select_save[0][\"row\"][0] + 1) +\r\n                                \":\" +\r\n                                chatatABC(Store.luckysheet_select_save[0][\"column\"][1]) +\r\n                                (Store.luckysheet_select_save[0][\"row\"][1] + 1),\r\n                        );\r\n                    }\r\n                } else if (event.ctrlKey) {\r\n                    //选区添加\r\n                    Store.luckysheet_select_save.push({\r\n                        left: col_pre,\r\n                        width: col - col_pre - 1,\r\n                        top: row_pre,\r\n                        height: row - row_pre - 1,\r\n                        left_move: col_pre,\r\n                        width_move: col - col_pre - 1,\r\n                        top_move: row_pre,\r\n                        height_move: row - row_pre - 1,\r\n                        row: [row_index, row_index_ed],\r\n                        column: [col_index, col_index_ed],\r\n                        row_focus: row_index,\r\n                        column_focus: col_index,\r\n                    });\r\n                } else {\r\n                    Store.luckysheet_select_save.length = 0;\r\n                    Store.luckysheet_select_save.push({\r\n                        left: col_pre,\r\n                        width: col - col_pre - 1,\r\n                        top: row_pre,\r\n                        height: row - row_pre - 1,\r\n                        left_move: col_pre,\r\n                        width_move: col - col_pre - 1,\r\n                        top_move: row_pre,\r\n                        height_move: row - row_pre - 1,\r\n                        row: [row_index, row_index_ed],\r\n                        column: [col_index, col_index_ed],\r\n                        row_focus: row_index,\r\n                        column_focus: col_index,\r\n                    });\r\n\r\n                    //单元格格式icon对应\r\n                    menuButton.menuButtonFocus(Store.flowdata, row_index, col_index);\r\n                    //函数公式显示栏\r\n                    formula.fucntionboxshow(row_index, col_index);\r\n                }\r\n\r\n                selectHightlightShow();\r\n\r\n                if (luckysheetFreezen.freezenhorizontaldata != null || luckysheetFreezen.freezenverticaldata != null) {\r\n                    luckysheetFreezen.scrollAdaptOfselect();\r\n                }\r\n\r\n                if (!browser.mobilecheck()) {\r\n                    //非移动端聚焦输入框\r\n                    luckysheetactiveCell();\r\n                }\r\n\r\n                //允许编辑后的后台更新时\r\n                server.saveParam(\"mv\", Store.currentSheetIndex, Store.luckysheet_select_save);\r\n            }\r\n\r\n            //交替颜色\r\n            if (alternateformat.rangefocus) {\r\n                alternateformat.rangefocus = false;\r\n                $(\"#luckysheet-alternateformat-range .fa-table\").click();\r\n            }\r\n\r\n            $(\"#luckysheet-row-count-show, #luckysheet-column-count-show\").hide();\r\n\r\n            if (!isEditMode()) {\r\n                //chartMix 隐藏当前页的数据选择区域高亮\r\n                hideAllNeedRangeShow();\r\n            }\r\n\r\n            // selectHelpboxFill();\r\n\r\n            //数据透视表\r\n            pivotTable.pivotclick(row_index, col_index, Store.currentSheetIndex);\r\n\r\n            luckysheetContainerFocus();\r\n\r\n            method.createHookFunction(\r\n                \"cellMousedown\",\r\n                Store.flowdata[row_index][col_index],\r\n                {\r\n                    r: row_index,\r\n                    c: col_index,\r\n                    start_r: row_pre,\r\n                    start_c: col_pre,\r\n                    end_r: row,\r\n                    end_c: col,\r\n                },\r\n                sheetFile,\r\n                luckysheetTableContent,\r\n            );\r\n\r\n            //$(\"#luckysheet-cols-h-c .luckysheet-cols-h-cells-c .luckysheet-cols-h-cells-clip .luckysheet-cols-h-cell-sel\").removeClass(\"luckysheet-cols-h-cell-sel\").addClass(\"luckysheet-cols-h-cell-nosel\");\r\n\r\n            //$(\"#luckysheet-rows-h .luckysheet-rows-h-cells .luckysheet-rows-h-cells-c .luckysheet-rows-h-cells-clip .luckysheet-rows-h-cell-sel\").removeClass(\"luckysheet-rows-h-cell-sel\").addClass(\"luckysheet-rows-h-cell-nosel\");\r\n\r\n            //$(\"#luckysheet-cols-h-c .luckysheet-cols-h-cells-c .luckysheet-cols-h-cells-clip .luckysheet-cols-h-cell-nosel\").eq(col_index).removeClass(\"luckysheet-cols-h-cell-nosel\").addClass(\"luckysheet-cols-h-cell-sel\");\r\n\r\n            //$(\"#luckysheet-rows-h .luckysheet-rows-h-cells .luckysheet-rows-h-cells-c .luckysheet-rows-h-cells-clip .luckysheet-rows-h-cell-nosel\").eq(row_index).removeClass(\"luckysheet-rows-h-cell-nosel\").addClass(\"luckysheet-rows-h-cell-sel\");\r\n\r\n            //event.stopImmediatePropagation();\r\n        })\r\n        .mouseup(function(event) {\r\n            if (event.which == \"3\") {\r\n                //禁止前台编辑(只可 框选单元格、滚动查看表格)\r\n                if (!Store.allowEdit) {\r\n                    return;\r\n                }\r\n\r\n                if (isEditMode()) {\r\n                    //非编辑模式下禁止右键功能框\r\n                    return;\r\n                }\r\n\r\n                let x = event.pageX;\r\n                let y = event.pageY;\r\n                let data = Store.flowdata;\r\n\r\n                let obj_s = Store.luckysheet_select_save[0];\r\n\r\n                const cellRightClickConfig = luckysheetConfigsetting.cellRightClickConfig;\r\n\r\n                $(\"#luckysheet-cols-rows-data\").show();\r\n                $(\"#luckysheet-cols-rows-handleincell\").show();\r\n                $(\"#luckysheet-cols-rows-add, #luckysheet-cols-rows-shift\").hide();\r\n\r\n                $$(\"#luckysheet-cols-rows-data .luckysheet-menuseparator\").style.display = \"block\";\r\n                $$(\"#luckysheet-cols-rows-handleincell .luckysheet-menuseparator\").style.display = \"block\";\r\n\r\n                if (obj_s[\"row\"] != null && obj_s[\"row\"][0] == 0 && obj_s[\"row\"][1] == Store.flowdata.length - 1) {\r\n                    // 如果全部按钮都隐藏，则整个菜单容器也要隐藏\r\n                    if (\r\n                        !cellRightClickConfig.copy &&\r\n                        !cellRightClickConfig.copyAs &&\r\n                        !cellRightClickConfig.paste &&\r\n                        !cellRightClickConfig.insertColumn &&\r\n                        !cellRightClickConfig.deleteColumn &&\r\n                        !cellRightClickConfig.hideColumn &&\r\n                        !cellRightClickConfig.columnWidth &&\r\n                        !cellRightClickConfig.clear &&\r\n                        !cellRightClickConfig.matrix &&\r\n                        !cellRightClickConfig.sort &&\r\n                        !cellRightClickConfig.filter &&\r\n                        !cellRightClickConfig.chart &&\r\n                        !cellRightClickConfig.image &&\r\n                        !cellRightClickConfig.link &&\r\n                        !cellRightClickConfig.data &&\r\n                        !cellRightClickConfig.cellFormat\r\n                    ) {\r\n                        return;\r\n                    }\r\n\r\n                    Store.luckysheetRightHeadClickIs = \"column\";\r\n\r\n                    $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word\").text(locale().rightclick.column);\r\n                    $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size\").text(locale().rightclick.width);\r\n                    $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left\").text(locale().rightclick.left);\r\n                    $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right\").text(locale().rightclick.right);\r\n\r\n                    $(\"#luckysheet-cols-rows-add\").show();\r\n                    // $(\"#luckysheet-cols-rows-data\").show();\r\n                    $(\"#luckysheet-cols-rows-shift\").hide();\r\n                    $(\"#luckysheet-cols-rows-handleincell\").hide();\r\n                    Store.luckysheet_cols_menu_status = true;\r\n\r\n                    $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"block\";\r\n\r\n                    // 自定义右键菜单：向左向右增加列，删除列，隐藏显示列，设置列宽\r\n                    $$(\"#luckysheet-top-left-add-selected\").style.display = cellRightClickConfig.insertColumn\r\n                        ? \"block\"\r\n                        : \"none\";\r\n                    $$(\"#luckysheet-bottom-right-add-selected\").style.display = cellRightClickConfig.insertColumn\r\n                        ? \"block\"\r\n                        : \"none\";\r\n                    $$(\"#luckysheet-del-selected\").style.display = cellRightClickConfig.deleteColumn ? \"block\" : \"none\";\r\n                    $$(\"#luckysheet-hide-selected\").style.display = cellRightClickConfig.hideColumn ? \"block\" : \"none\";\r\n                    $$(\"#luckysheet-show-selected\").style.display = cellRightClickConfig.hideColumn ? \"block\" : \"none\";\r\n                    $$(\"#luckysheet-column-row-width-selected\").style.display = cellRightClickConfig.columnWidth\r\n                        ? \"block\"\r\n                        : \"none\";\r\n\r\n                    // 1. 当一个功能菜单块上方的功能块按钮都隐藏的时候，下方的功能块的顶部分割线也需要隐藏\r\n                    if (!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste) {\r\n                        $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"none\";\r\n\r\n                        if (\r\n                            !cellRightClickConfig.insertColumn &&\r\n                            !cellRightClickConfig.deleteColumn &&\r\n                            !cellRightClickConfig.hideColumn &&\r\n                            !cellRightClickConfig.columnWidth\r\n                        ) {\r\n                            $$(\"#luckysheet-cols-rows-data .luckysheet-menuseparator\").style.display = \"none\";\r\n                        }\r\n                    }\r\n\r\n                    // 2.当一个功能菜单块内所有的按钮都隐藏的时候，它顶部的分割线也需要隐藏掉\r\n                    if (\r\n                        !cellRightClickConfig.insertColumn &&\r\n                        !cellRightClickConfig.deleteColumn &&\r\n                        !cellRightClickConfig.hideColumn &&\r\n                        !cellRightClickConfig.columnWidth\r\n                    ) {\r\n                        $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"none\";\r\n                    }\r\n\r\n                    //列宽默认值\r\n                    let cfg = $.extend(true, {}, Store.config);\r\n                    if (cfg[\"columnlen\"] == null) {\r\n                        cfg[\"columnlen\"] = {};\r\n                    }\r\n\r\n                    let first_collen =\r\n                        cfg[\"columnlen\"][Store.luckysheet_select_save[0].column[0]] == null\r\n                            ? Store.defaultcollen\r\n                            : cfg[\"columnlen\"][Store.luckysheet_select_save[0].column[0]];\r\n                    let isSame = true;\r\n\r\n                    for (let i = 0; i < Store.luckysheet_select_save.length; i++) {\r\n                        let s = Store.luckysheet_select_save[i];\r\n                        let c1 = s.column[0],\r\n                            c2 = s.column[1];\r\n\r\n                        for (let c = c1; c <= c2; c++) {\r\n                            let collen = cfg[\"columnlen\"][c] == null ? Store.defaultcollen : cfg[\"columnlen\"][c];\r\n\r\n                            if (collen != first_collen) {\r\n                                isSame = false;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (isSame) {\r\n                        $(\"#luckysheet-cols-rows-add\")\r\n                            .find(\"input[type='number'].rcsize\")\r\n                            .val(first_collen);\r\n                    } else {\r\n                        $(\"#luckysheet-cols-rows-add\")\r\n                            .find(\"input[type='number'].rcsize\")\r\n                            .val(\"\");\r\n                    }\r\n                } else if (\r\n                    obj_s[\"column\"] != null &&\r\n                    obj_s[\"column\"][0] == 0 &&\r\n                    obj_s[\"column\"][1] == Store.flowdata[0].length - 1\r\n                ) {\r\n                    // 如果全部按钮都隐藏，则整个菜单容器也要隐藏\r\n                    if (\r\n                        !cellRightClickConfig.copy &&\r\n                        !cellRightClickConfig.copyAs &&\r\n                        !cellRightClickConfig.paste &&\r\n                        !cellRightClickConfig.insertRow &&\r\n                        !cellRightClickConfig.deleteRow &&\r\n                        !cellRightClickConfig.hideRow &&\r\n                        !cellRightClickConfig.rowHeight &&\r\n                        !cellRightClickConfig.clear &&\r\n                        !cellRightClickConfig.matrix &&\r\n                        !cellRightClickConfig.sort &&\r\n                        !cellRightClickConfig.filter &&\r\n                        !cellRightClickConfig.chart &&\r\n                        !cellRightClickConfig.image &&\r\n                        !cellRightClickConfig.link &&\r\n                        !cellRightClickConfig.data &&\r\n                        !cellRightClickConfig.cellFormat\r\n                    ) {\r\n                        return;\r\n                    }\r\n\r\n                    Store.luckysheetRightHeadClickIs = \"row\";\r\n\r\n                    $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word\").text(locale().rightclick.row);\r\n                    $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size\").text(locale().rightclick.height);\r\n                    $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left\").text(locale().rightclick.top);\r\n                    $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right\").text(locale().rightclick.bottom);\r\n                    $(\"#luckysheet-cols-rows-add\").show();\r\n                    // $(\"#luckysheet-cols-rows-data\").show();\r\n                    $(\"#luckysheet-cols-rows-shift\").hide();\r\n                    $(\"#luckysheet-cols-rows-handleincell\").hide();\r\n                    Store.luckysheet_cols_menu_status = true;\r\n\r\n                    $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"block\";\r\n\r\n                    // 自定义右键菜单：向上向下增加行，删除行，隐藏显示行，设置行高\r\n                    $$(\"#luckysheet-top-left-add-selected\").style.display = cellRightClickConfig.insertRow\r\n                        ? \"block\"\r\n                        : \"none\";\r\n                    $$(\"#luckysheet-bottom-right-add-selected\").style.display = cellRightClickConfig.insertRow\r\n                        ? \"block\"\r\n                        : \"none\";\r\n                    $$(\"#luckysheet-del-selected\").style.display = cellRightClickConfig.deleteRow ? \"block\" : \"none\";\r\n                    $$(\"#luckysheet-hide-selected\").style.display = cellRightClickConfig.hideRow ? \"block\" : \"none\";\r\n                    $$(\"#luckysheet-show-selected\").style.display = cellRightClickConfig.hideRow ? \"block\" : \"none\";\r\n                    $$(\"#luckysheet-column-row-width-selected\").style.display = cellRightClickConfig.rowHeight\r\n                        ? \"block\"\r\n                        : \"none\";\r\n\r\n                    // 1. 当一个功能菜单块上方的功能块按钮都隐藏的时候，下方的功能块的顶部分割线也需要隐藏\r\n                    if (!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste) {\r\n                        $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"none\";\r\n\r\n                        if (\r\n                            !cellRightClickConfig.insertRow &&\r\n                            !cellRightClickConfig.deleteRow &&\r\n                            !cellRightClickConfig.hideRow &&\r\n                            !cellRightClickConfig.rowHeight\r\n                        ) {\r\n                            $$(\"#luckysheet-cols-rows-data .luckysheet-menuseparator\").style.display = \"none\";\r\n                        }\r\n                    }\r\n\r\n                    // 2. 当一个功能菜单块内所有的按钮都隐藏的时候，它顶部的分割线也需要隐藏掉\r\n                    if (\r\n                        !cellRightClickConfig.insertRow &&\r\n                        !cellRightClickConfig.deleteRow &&\r\n                        !cellRightClickConfig.hideRow &&\r\n                        !cellRightClickConfig.rowHeight\r\n                    ) {\r\n                        $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"none\";\r\n                    }\r\n\r\n                    //行高默认值\r\n                    let cfg = $.extend(true, {}, Store.config);\r\n                    if (cfg[\"rowlen\"] == null) {\r\n                        cfg[\"rowlen\"] = {};\r\n                    }\r\n\r\n                    let first_rowlen =\r\n                        cfg[\"rowlen\"][Store.luckysheet_select_save[0].row[0]] == null\r\n                            ? Store.defaultrowlen\r\n                            : cfg[\"rowlen\"][Store.luckysheet_select_save[0].row[0]];\r\n                    let isSame = true;\r\n\r\n                    for (let i = 0; i < Store.luckysheet_select_save.length; i++) {\r\n                        let s = Store.luckysheet_select_save[i];\r\n                        let r1 = s.row[0],\r\n                            r2 = s.row[1];\r\n\r\n                        for (let r = r1; r <= r2; r++) {\r\n                            let rowlen = cfg[\"rowlen\"][r] == null ? Store.defaultrowlen : cfg[\"rowlen\"][r];\r\n\r\n                            if (rowlen != first_rowlen) {\r\n                                isSame = false;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (isSame) {\r\n                        $(\"#luckysheet-cols-rows-add\")\r\n                            .find(\"input[type='number'].rcsize\")\r\n                            .val(first_rowlen);\r\n                    } else {\r\n                        $(\"#luckysheet-cols-rows-add\")\r\n                            .find(\"input[type='number'].rcsize\")\r\n                            .val(\"\");\r\n                    }\r\n                } else {\r\n                    // 如果全部按钮都隐藏，则整个菜单容器也要隐藏\r\n                    if (\r\n                        !cellRightClickConfig.copy &&\r\n                        !cellRightClickConfig.copyAs &&\r\n                        !cellRightClickConfig.paste &&\r\n                        !cellRightClickConfig.insertRow &&\r\n                        !cellRightClickConfig.insertColumn &&\r\n                        !cellRightClickConfig.deleteRow &&\r\n                        !cellRightClickConfig.deleteColumn &&\r\n                        !cellRightClickConfig.deleteCell &&\r\n                        !cellRightClickConfig.clear &&\r\n                        !cellRightClickConfig.matrix &&\r\n                        !cellRightClickConfig.sort &&\r\n                        !cellRightClickConfig.filter &&\r\n                        !cellRightClickConfig.chart &&\r\n                        !cellRightClickConfig.image &&\r\n                        !cellRightClickConfig.link &&\r\n                        !cellRightClickConfig.data &&\r\n                        !cellRightClickConfig.cellFormat\r\n                    ) {\r\n                        return;\r\n                    }\r\n\r\n                    // 当一个功能菜单块上方的功能块按钮都隐藏的时候，下方的功能块的顶部分割线也需要隐藏\r\n                    if (!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste) {\r\n                        $$(\"#luckysheet-cols-rows-handleincell .luckysheet-menuseparator\").style.display = \"none\";\r\n\r\n                        if (\r\n                            !cellRightClickConfig.insertRow &&\r\n                            !cellRightClickConfig.insertColumn &&\r\n                            !cellRightClickConfig.deleteRow &&\r\n                            !cellRightClickConfig.deleteColumn &&\r\n                            !cellRightClickConfig.deleteCell\r\n                        ) {\r\n                            $$(\"#luckysheet-cols-rows-data .luckysheet-menuseparator\").style.display = \"none\";\r\n                        }\r\n                    }\r\n\r\n                    if (\r\n                        !cellRightClickConfig.insertRow &&\r\n                        !cellRightClickConfig.insertColumn &&\r\n                        !cellRightClickConfig.deleteRow &&\r\n                        !cellRightClickConfig.deleteColumn &&\r\n                        !cellRightClickConfig.deleteCell\r\n                    ) {\r\n                        $$(\"#luckysheet-cols-rows-handleincell .luckysheet-menuseparator\").style.display = \"none\";\r\n                    }\r\n                }\r\n\r\n                // 当一个功能菜单块内所有的按钮都隐藏的时候，它顶部的分割线也需要隐藏掉\r\n                if (\r\n                    !cellRightClickConfig.clear &&\r\n                    !cellRightClickConfig.matrix &&\r\n                    !cellRightClickConfig.sort &&\r\n                    !cellRightClickConfig.filter &&\r\n                    !cellRightClickConfig.chart &&\r\n                    !cellRightClickConfig.image &&\r\n                    !cellRightClickConfig.link &&\r\n                    !cellRightClickConfig.data &&\r\n                    !cellRightClickConfig.cellFormat\r\n                ) {\r\n                    $$(\"#luckysheet-cols-rows-data .luckysheet-menuseparator\").style.display = \"none\";\r\n                }\r\n\r\n                showrightclickmenu($(\"#luckysheet-rightclick-menu\"), x, y);\r\n            }\r\n\r\n            // 备注：在mousedown中发送光标信息会漏处理部分(选区)范围\r\n            server.saveParam(\"mv\", Store.currentSheetIndex, Store.luckysheet_select_save);\r\n        })\r\n        .dblclick(function(event) {\r\n            if ($(event.target).hasClass(\"luckysheet-mousedown-cancel\")) {\r\n                return;\r\n            }\r\n\r\n            //禁止前台编辑(只可 框选单元格、滚动查看表格)\r\n            if (!Store.allowEdit) {\r\n                return;\r\n            }\r\n\r\n            if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0) {\r\n                return;\r\n            }\r\n\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            if (\r\n                mouse[0] >= Store.cellmainWidth - Store.cellMainSrollBarSize ||\r\n                mouse[1] >= Store.cellmainHeight - Store.cellMainSrollBarSize\r\n            ) {\r\n                return;\r\n            }\r\n\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(),\r\n                scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let x = mouse[0] + scrollLeft;\r\n            let y = mouse[1] + scrollTop;\r\n\r\n            if (\r\n                luckysheetFreezen.freezenverticaldata != null &&\r\n                mouse[0] < luckysheetFreezen.freezenverticaldata[0] - luckysheetFreezen.freezenverticaldata[2]\r\n            ) {\r\n                x = mouse[0] + luckysheetFreezen.freezenverticaldata[2];\r\n            }\r\n\r\n            if (\r\n                luckysheetFreezen.freezenhorizontaldata != null &&\r\n                mouse[1] < luckysheetFreezen.freezenhorizontaldata[0] - luckysheetFreezen.freezenhorizontaldata[2]\r\n            ) {\r\n                y = mouse[1] + luckysheetFreezen.freezenhorizontaldata[2];\r\n            }\r\n\r\n            let row_location = rowLocation(y),\r\n                row_index = row_location[2];\r\n\r\n            let col_location = colLocation(x),\r\n                col_index = col_location[2];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n            if (!!margeset) {\r\n                row_index = margeset.row[2];\r\n                col_index = margeset.column[2];\r\n            }\r\n\r\n            if (pivotTable.isPivotRange(row_index, col_index)) {\r\n                //数据透视表没有 任何数据\r\n                if (\r\n                    (pivotTable.filter == null || pivotTable.filter.length == 0) &&\r\n                    (pivotTable.row == null || pivotTable.row.length == 0) &&\r\n                    (pivotTable.column == null || pivotTable.column.length == 0) &&\r\n                    (pivotTable.values == null || pivotTable.values.length == 0)\r\n                ) {\r\n                    return;\r\n                }\r\n\r\n                //数据透视表没有 数值数据\r\n                if (pivotTable.values == null || pivotTable.values.length == 0) {\r\n                    return;\r\n                }\r\n\r\n                //点击位置不是 数值数据 所在区域\r\n                if (row_index == 0 || col_index == 0) {\r\n                    return;\r\n                }\r\n\r\n                if (pivotTable.column != null && pivotTable.column.length > 0) {\r\n                    if (pivotTable.values.length >= 2 && pivotTable.showType == \"column\") {\r\n                        if (\r\n                            row_index <= pivotTable.column.length ||\r\n                            col_index >= pivotTable.pivotDatas[0].length - pivotTable.values.length\r\n                        ) {\r\n                            return;\r\n                        }\r\n                    } else {\r\n                        if (\r\n                            row_index <= pivotTable.column.length - 1 ||\r\n                            col_index >= pivotTable.pivotDatas[0].length - 1\r\n                        ) {\r\n                            return;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (pivotTable.row != null && pivotTable.row.length > 0) {\r\n                    if (pivotTable.values.length >= 2 && pivotTable.showType == \"row\") {\r\n                        if (\r\n                            col_index <= pivotTable.row.length ||\r\n                            row_index >= pivotTable.pivotDatas.length - pivotTable.values.length\r\n                        ) {\r\n                            return;\r\n                        }\r\n                    } else {\r\n                        if (col_index <= pivotTable.row.length - 1 || row_index >= pivotTable.pivotDatas.length - 1) {\r\n                            return;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                sheetmanage.addNewSheet(event);\r\n\r\n                pivotTable.drillDown(row_index, col_index);\r\n                return;\r\n            }\r\n\r\n            if (\r\n                $(\"#luckysheet-search-formula-parm\").is(\":visible\") ||\r\n                $(\"#luckysheet-search-formula-parm-select\").is(\":visible\")\r\n            ) {\r\n                //公式参数栏显示\r\n                $(\"#luckysheet-cell-selected\").hide();\r\n            } else if (\r\n                $(\"#luckysheet-conditionformat-dialog\").is(\":visible\") ||\r\n                $(\"#luckysheet-administerRule-dialog\").is(\":visible\") ||\r\n                $(\"#luckysheet-newConditionRule-dialog\").is(\":visible\") ||\r\n                $(\"#luckysheet-editorConditionRule-dialog\").is(\":visible\") ||\r\n                $(\"#luckysheet-singleRange-dialog\").is(\":visible\") ||\r\n                $(\"#luckysheet-multiRange-dialog\").is(\":visible\")\r\n            ) {\r\n                //条件格式\r\n                return;\r\n            } else if (\r\n                $(\"#luckysheet-modal-dialog-slider-alternateformat\").is(\":visible\") ||\r\n                $(\"#luckysheet-alternateformat-rangeDialog\").is(\":visible\")\r\n            ) {\r\n                //交替颜色\r\n                return;\r\n            } else {\r\n                if (menuButton.luckysheetPaintModelOn) {\r\n                    menuButton.cancelPaintModel();\r\n                }\r\n\r\n                // 检查当前坐标和焦点坐标是否一致，如果不一致那么进行修正\r\n                let column_focus = Store.luckysheet_select_save[0][\"column_focus\"];\r\n                let row_focus = Store.luckysheet_select_save[0][\"row_focus\"];\r\n                if (column_focus !== col_index || row_focus !== row_index) {\r\n                    row_index = row_focus;\r\n                    col_index = column_focus;\r\n                }\r\n                luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n\r\n                /* 设置选区高亮 */\r\n                selectHightlightShow();\r\n            }\r\n        });\r\n\r\n    //监听拖拽\r\n    document.getElementById(\"luckysheet-cell-main\").addEventListener(\r\n        \"drop\",\r\n        function(e) {\r\n            e.preventDefault();\r\n            e.stopPropagation();\r\n\r\n            let files = e.dataTransfer.files;\r\n\r\n            //拖拽插入图片\r\n            if (files.length == 1 && files[0].type.indexOf(\"image\") > -1) {\r\n                if (!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\")) {\r\n                    return;\r\n                }\r\n                imageCtrl.insertImg(files[0]);\r\n            }\r\n            handleCellDragStopEvent(e);\r\n        },\r\n        false,\r\n    );\r\n    document.getElementById(\"luckysheet-cell-main\").addEventListener(\r\n        \"dragover\",\r\n        function(e) {\r\n            e.preventDefault();\r\n            e.stopPropagation();\r\n        },\r\n        false,\r\n    );\r\n\r\n    /**\r\n     * 处理单元格上鼠标拖拽停止事件\r\n     * @param {DragEvent} event\r\n     */\r\n    function handleCellDragStopEvent(event) {\r\n        if (luckysheetConfigsetting && luckysheetConfigsetting.hook && luckysheetConfigsetting.hook.cellDragStop) {\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n            if (!!margeset) {\r\n                row = margeset.row[1];\r\n                row_pre = margeset.row[0];\r\n                row_index = margeset.row[2];\r\n\r\n                col = margeset.column[1];\r\n                col_pre = margeset.column[0];\r\n                col_index = margeset.column[2];\r\n            }\r\n\r\n            let sheetFile = sheetmanage.getSheetByIndex();\r\n\r\n            let luckysheetTableContent = $(\"#luckysheetTableContent\")\r\n                .get(0)\r\n                .getContext(\"2d\");\r\n            method.createHookFunction(\r\n                \"cellDragStop\",\r\n                Store.flowdata[row_index][col_index],\r\n                {\r\n                    r: row_index,\r\n                    c: col_index,\r\n                    start_r: row_pre,\r\n                    start_c: col_pre,\r\n                    end_r: row,\r\n                    end_c: col,\r\n                },\r\n                sheetFile,\r\n                luckysheetTableContent,\r\n                event,\r\n            );\r\n        }\r\n    }\r\n\r\n    //表格mousemove\r\n    $(document).on(\"mousemove.luckysheetEvent\", function(event) {\r\n        luckysheetPostil.overshow(event); //有批注显示\r\n        hyperlinkCtrl.overshow(event); //链接提示显示\r\n\r\n        window.cancelAnimationFrame(Store.jfautoscrollTimeout);\r\n\r\n        if (luckysheetConfigsetting && luckysheetConfigsetting.hook && luckysheetConfigsetting.hook.sheetMousemove) {\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n            if (!!margeset) {\r\n                row = margeset.row[1];\r\n                row_pre = margeset.row[0];\r\n                row_index = margeset.row[2];\r\n\r\n                col = margeset.column[1];\r\n                col_pre = margeset.column[0];\r\n                col_index = margeset.column[2];\r\n            }\r\n\r\n            // if(Store.flowdata[row_index] && Store.flowdata[row_index][col_index]){\r\n            let sheetFile = sheetmanage.getSheetByIndex();\r\n\r\n            let moveState = {\r\n                functionResizeStatus: formula.functionResizeStatus,\r\n                horizontalmoveState: !!luckysheetFreezen.horizontalmovestate,\r\n                verticalmoveState: !!luckysheetFreezen.verticalmovestate,\r\n                pivotTableMoveState: !!pivotTable && pivotTable.movestate,\r\n                sheetMoveStatus: Store.luckysheet_sheet_move_status,\r\n                scrollStatus: !!Store.luckysheet_scroll_status,\r\n                selectStatus: !!Store.luckysheet_select_status,\r\n                rowsSelectedStatus: !!Store.luckysheet_rows_selected_status,\r\n                colsSelectedStatus: !!Store.luckysheet_cols_selected_status,\r\n                cellSelectedMove: !!Store.luckysheet_cell_selected_move,\r\n                cellSelectedExtend: !!Store.luckysheet_cell_selected_extend,\r\n                colsChangeSize: !!Store.luckysheet_cols_change_size,\r\n                rowsChangeSize: !!Store.luckysheet_rows_change_size,\r\n                chartMove: !!Store.chartparam.luckysheetCurrentChartMove,\r\n                chartResize: !!Store.chartparam.luckysheetCurrentChartResize,\r\n                rangeResize: !!formula.rangeResize,\r\n                rangeMove: !!formula.rangeMove,\r\n            };\r\n\r\n            let luckysheetTableContent = $(\"#luckysheetTableContent\")\r\n                .get(0)\r\n                .getContext(\"2d\");\r\n\r\n            if (Store.flowdata && Store.flowdata[row_index]) {\r\n                method.createHookFunction(\r\n                    \"sheetMousemove\",\r\n                    Store.flowdata[row_index][col_index],\r\n                    {\r\n                        r: row_index,\r\n                        c: col_index,\r\n                        start_r: row_pre,\r\n                        start_c: col_pre,\r\n                        end_r: row,\r\n                        end_c: col,\r\n                    },\r\n                    sheetFile,\r\n                    moveState,\r\n                    luckysheetTableContent,\r\n                );\r\n            }\r\n            // }\r\n        }\r\n\r\n        if (formula.functionResizeStatus) {\r\n            let y = event.pageY;\r\n            let movepx = y - formula.functionResizeData.y;\r\n            let mpx = formula.functionResizeData.calculatebarHeight + movepx;\r\n            let winh = Math.round($(window).height() / 2);\r\n\r\n            if (mpx <= 28) {\r\n                if (mpx <= 20) {\r\n                    return;\r\n                }\r\n                mpx = 28;\r\n            } else if (mpx >= winh) {\r\n                if (mpx >= winh + 8) {\r\n                    return;\r\n                }\r\n                mpx = winh;\r\n            }\r\n\r\n            Store.calculatebarHeight = mpx;\r\n            $(\"#luckysheet-wa-calculate\").css(\"height\", Store.calculatebarHeight - 2);\r\n            $(\"#luckysheet-wa-calculate-size\").css({ background: \"#5e5e5e\", cursor: \"ns-resize\" });\r\n\r\n            clearTimeout(formula.functionResizeTimeout);\r\n            formula.functionResizeTimeout = setTimeout(function() {\r\n                luckysheetsizeauto();\r\n            }, 15);\r\n        } else if (!!luckysheetFreezen.horizontalmovestate) {\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let x = mouse[0] + scrollLeft;\r\n            let y = mouse[1] + scrollTop;\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n            let top = mouse[1] + Store.columnHeaderHeight;\r\n\r\n            if (top < Store.columnHeaderHeight) {\r\n                top = Store.columnHeaderHeight;\r\n            }\r\n\r\n            if (top > luckysheetFreezen.windowHeight - 4) {\r\n                top = luckysheetFreezen.windowHeight - 4;\r\n            }\r\n\r\n            $(\"#luckysheet-freezebar-horizontal\")\r\n                .find(\".luckysheet-freezebar-horizontal-handle\")\r\n                .css({ top: top });\r\n\r\n            if (top + scrollTop - Store.columnHeaderHeight >= row_pre + (row - row_pre) / 2) {\r\n                top = row - 2 - scrollTop + Store.columnHeaderHeight;\r\n                luckysheetFreezen.freezenhorizontaldata = [\r\n                    row,\r\n                    row_index + 1,\r\n                    scrollTop,\r\n                    luckysheetFreezen.cutVolumn(Store.visibledatarow, row_index + 1),\r\n                    top,\r\n                ];\r\n            } else {\r\n                top = row_pre - 2 - scrollTop + Store.columnHeaderHeight;\r\n                luckysheetFreezen.freezenhorizontaldata = [\r\n                    row_pre,\r\n                    row_index,\r\n                    scrollTop,\r\n                    luckysheetFreezen.cutVolumn(Store.visibledatarow, row_index),\r\n                    top,\r\n                ];\r\n            }\r\n\r\n            $(\"#luckysheet-freezebar-horizontal\")\r\n                .find(\".luckysheet-freezebar-horizontal-drop\")\r\n                .css({ top: top });\r\n            luckysheetFreezen.saveFreezen(luckysheetFreezen.freezenhorizontaldata, top, null, null);\r\n        } else if (!!luckysheetFreezen.verticalmovestate) {\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let x = mouse[0] + scrollLeft;\r\n            let y = mouse[1] + scrollTop;\r\n\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n\r\n            let left = mouse[0] + Store.rowHeaderWidth;\r\n\r\n            if (left < Store.rowHeaderWidth) {\r\n                left = Store.rowHeaderWidth;\r\n            }\r\n\r\n            if (left > luckysheetFreezen.windowWidth - 4) {\r\n                left = luckysheetFreezen.windowWidth - 4;\r\n            }\r\n\r\n            $(\"#luckysheet-freezebar-vertical\")\r\n                .find(\".luckysheet-freezebar-vertical-handle\")\r\n                .css({ left: left });\r\n\r\n            if (left + scrollLeft - Store.rowHeaderWidth >= col_pre + (col - col_pre) / 2) {\r\n                left = col - 2 - scrollLeft + Store.rowHeaderWidth;\r\n                luckysheetFreezen.freezenverticaldata = [\r\n                    col,\r\n                    col_index + 1,\r\n                    scrollLeft,\r\n                    luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_index + 1),\r\n                    left,\r\n                ];\r\n            } else {\r\n                left = col_pre - 2 - scrollLeft + Store.rowHeaderWidth;\r\n                luckysheetFreezen.freezenverticaldata = [\r\n                    col_pre,\r\n                    col_index,\r\n                    scrollLeft,\r\n                    luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_index),\r\n                    left,\r\n                ];\r\n            }\r\n\r\n            $(\"#luckysheet-freezebar-vertical\")\r\n                .find(\".luckysheet-freezebar-vertical-drop\")\r\n                .css({ left: left });\r\n            luckysheetFreezen.saveFreezen(null, null, luckysheetFreezen.freezenverticaldata, left);\r\n            luckysheetsizeauto(); //调节选区时下部单元格溢出\r\n        } else if (!!pivotTable && pivotTable.movestate) {\r\n            let x = event.pageX,\r\n                y = event.pageY;\r\n            $(\"#luckysheet-modal-dialog-slider-pivot-move\").css({\r\n                left: x - pivotTable.movesave.width / 2,\r\n                top: y - pivotTable.movesave.height,\r\n            });\r\n        } else if (Store.luckysheet_sheet_move_status) {\r\n            let scrollLeft = $(\"#luckysheet-sheet-container-c\").scrollLeft();\r\n            let x = event.pageX + scrollLeft;\r\n\r\n            if (Math.abs(event.pageX - Store.luckysheet_sheet_move_data.pageX) < 3) {\r\n                return;\r\n            }\r\n\r\n            let winW = $(\"#luckysheet-sheet-container\").width();\r\n            let left = x - Store.luckysheet_sheet_move_data.curleft - $(\"#luckysheet-sheet-container\").offset().left;\r\n            Store.luckysheet_sheet_move_data.activeobject.css({ left: left });\r\n\r\n            let row_index = luckysheet_searcharray(\r\n                Store.luckysheet_sheet_move_data.widthlist,\r\n                left + Store.luckysheet_sheet_move_data.curleft,\r\n            );\r\n            Store.luckysheet_sheet_move_data.cursorobject.css({ cursor: \"move\" });\r\n\r\n            if (left - scrollLeft <= 6) {\r\n                $(\"#luckysheet-sheets-leftscroll\").click();\r\n            }\r\n\r\n            if (left - scrollLeft >= winW - 40) {\r\n                $(\"#luckysheet-sheets-rightscroll\").click();\r\n            }\r\n\r\n            if (row_index != Store.luckysheet_sheet_move_data.curindex) {\r\n                if (row_index == -1 && left > 0) {\r\n                    row_index = Store.luckysheet_sheet_move_data.widthlist.length - 1;\r\n                    $(\"#luckysheet-sheets-item-clone\").insertAfter(\r\n                        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\").eq(row_index),\r\n                    );\r\n                } else if (row_index == -1 && left <= 0) {\r\n                    $(\"#luckysheet-sheets-item-clone\").insertBefore(\r\n                        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\").eq(0),\r\n                    );\r\n                } else {\r\n                    $(\"#luckysheet-sheets-item-clone\").insertAfter(\r\n                        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\").eq(row_index),\r\n                    );\r\n                }\r\n\r\n                Store.luckysheet_sheet_move_data.widthlist = [];\r\n                $(\"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\").each(function(i) {\r\n                    if (i == 0) {\r\n                        Store.luckysheet_sheet_move_data.widthlist.push(parseInt($(this).outerWidth()));\r\n                    } else {\r\n                        Store.luckysheet_sheet_move_data.widthlist.push(\r\n                            parseInt($(this).outerWidth()) + Store.luckysheet_sheet_move_data.widthlist[i - 1],\r\n                        );\r\n                    }\r\n                });\r\n\r\n                Store.luckysheet_sheet_move_data.curindex = $(\r\n                    \"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\",\r\n                ).index($(\"#luckysheet-sheets-item-clone\"));\r\n            }\r\n        } else if (Store.luckysheet_model_move_state) {\r\n            let scrollTop = $(document).scrollTop(),\r\n                scrollLeft = $(document).scrollLeft();\r\n            let y = event.pageY + scrollTop,\r\n                x = event.pageX + scrollLeft;\r\n            let winH = $(window).height(),\r\n                winW = $(window).width();\r\n            let myh = Store.luckysheet_model_move_obj.height(),\r\n                myw = Store.luckysheet_model_move_obj.width();\r\n            let top = y - Store.luckysheet_model_xy[1],\r\n                left = x - Store.luckysheet_model_xy[0];\r\n\r\n            if (top < 0) {\r\n                top = 0;\r\n            }\r\n\r\n            if (top + myh + 62 > winH) {\r\n                top = winH - myh - 62;\r\n            }\r\n\r\n            if (left < 0) {\r\n                left = 0;\r\n            }\r\n\r\n            if (left + myw + 86 > winW) {\r\n                left = winW - myw - 86;\r\n            }\r\n\r\n            Store.luckysheet_model_move_obj.css({ top: top, left: left });\r\n            event.preventDefault();\r\n        } else if (\r\n            !!Store.luckysheet_scroll_status ||\r\n            !!Store.luckysheet_select_status ||\r\n            !!Store.luckysheet_rows_selected_status ||\r\n            !!Store.luckysheet_cols_selected_status ||\r\n            !!Store.luckysheet_cell_selected_move ||\r\n            !!Store.luckysheet_cell_selected_extend ||\r\n            !!Store.luckysheet_cols_change_size ||\r\n            !!Store.luckysheet_rows_change_size ||\r\n            !!Store.chartparam.luckysheetCurrentChartMove ||\r\n            !!Store.chartparam.luckysheetCurrentChartResize ||\r\n            !!formula.rangeResize ||\r\n            !!formula.rangeMove\r\n        ) {\r\n            if (Store.luckysheet_select_status) {\r\n                clearTimeout(Store.countfuncTimeout);\r\n                Store.countfuncTimeout = setTimeout(function() {\r\n                    countfunc();\r\n                }, 500);\r\n            }\r\n\r\n            function mouseRender() {\r\n                if (\r\n                    Store.luckysheet_scroll_status &&\r\n                    !Store.luckysheet_cols_change_size &&\r\n                    !Store.luckysheet_rows_change_size\r\n                ) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let left = $(\"#luckysheet-scrollbar-x\").scrollLeft(),\r\n                        top = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n                    let x = mouse[0];\r\n                    let y = mouse[1];\r\n                    let winH = $(\"#luckysheet-cell-main\").height() - 20 * Store.zoomRatio,\r\n                        winW = $(\"#luckysheet-cell-main\").width() - 60 * Store.zoomRatio;\r\n\r\n                    if (y < 0 || y > winH) {\r\n                        let stop;\r\n                        if (y < 0) {\r\n                            stop = top + y / 2;\r\n                        } else {\r\n                            stop = top + (y - winH) / 2;\r\n                        }\r\n                        $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n                    }\r\n\r\n                    if (x < 0 || x > winW) {\r\n                        let sleft;\r\n                        if (x < 0) {\r\n                            sleft = left + x / 2;\r\n                        } else {\r\n                            sleft = left + (x - winW) / 2;\r\n                        }\r\n\r\n                        $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n                    }\r\n                }\r\n                if (Store.luckysheet_select_status) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n\r\n                    if (!checkProtectionSelectLockedOrUnLockedCells(row_index, col_index, Store.currentSheetIndex)) {\r\n                        // Store.luckysheet_select_status = false;\r\n                        return;\r\n                    }\r\n\r\n                    let last = $.extend(\r\n                        true,\r\n                        {},\r\n                        Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n                    );\r\n\r\n                    let top = 0,\r\n                        height = 0,\r\n                        rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if (last.row[1] > last.row_focus) {\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    } else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    } else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if (last.row[0] < last.row_focus) {\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    let left = 0,\r\n                        width = 0,\r\n                        columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if (last.column[1] > last.column_focus) {\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    } else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    } else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if (last.column[0] < last.column_focus) {\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    let changeparam = menuButton.mergeMoveMain(\r\n                        columnseleted,\r\n                        rowseleted,\r\n                        last,\r\n                        top,\r\n                        height,\r\n                        left,\r\n                        width,\r\n                    );\r\n                    if (changeparam != null) {\r\n                        columnseleted = changeparam[0];\r\n                        rowseleted = changeparam[1];\r\n                        top = changeparam[2];\r\n                        height = changeparam[3];\r\n                        left = changeparam[4];\r\n                        width = changeparam[5];\r\n                    }\r\n\r\n                    last[\"row\"] = rowseleted;\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n\r\n                    selectHightlightShow();\r\n                    luckysheetFreezen.scrollFreezen();\r\n\r\n                    // selectHelpboxFill();\r\n\r\n                    //交替颜色选择范围\r\n                    if ($(\"#luckysheet-alternateformat-rangeDialog\").is(\":visible\")) {\r\n                        $(\"#luckysheet-alternateformat-rangeDialog input\").val(\r\n                            getRangetxt(\r\n                                Store.currentSheetIndex,\r\n                                Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n                            ),\r\n                        );\r\n                    }\r\n\r\n                    if (pivotTable.luckysheet_pivotTable_select_state) {\r\n                        $(\"#luckysheet-pivotTable-range-selection-input\").val(\r\n                            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name +\r\n                                \"!\" +\r\n                                chatatABC(Store.luckysheet_select_save[0][\"column\"][0]) +\r\n                                (Store.luckysheet_select_save[0][\"row\"][0] + 1) +\r\n                                \":\" +\r\n                                chatatABC(Store.luckysheet_select_save[0][\"column\"][1]) +\r\n                                (Store.luckysheet_select_save[0][\"row\"][1] + 1),\r\n                        );\r\n                    }\r\n                } else if (conditionformat.selectStatus) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n\r\n                    let last = conditionformat.selectRange[conditionformat.selectRange.length - 1];\r\n\r\n                    let top = 0,\r\n                        height = 0,\r\n                        rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if (last.row[1] > last.row_focus) {\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    } else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    } else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if (last.row[0] < last.row_focus) {\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    let left = 0,\r\n                        width = 0,\r\n                        columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if (last.column[1] > last.column_focus) {\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    } else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    } else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if (last.column[0] < last.column_focus) {\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    let changeparam = menuButton.mergeMoveMain(\r\n                        columnseleted,\r\n                        rowseleted,\r\n                        last,\r\n                        top,\r\n                        height,\r\n                        left,\r\n                        width,\r\n                    );\r\n                    if (changeparam != null) {\r\n                        columnseleted = changeparam[0];\r\n                        rowseleted = changeparam[1];\r\n                        top = changeparam[2];\r\n                        height = changeparam[3];\r\n                        left = changeparam[4];\r\n                        width = changeparam[5];\r\n                    }\r\n\r\n                    last[\"row\"] = rowseleted;\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    conditionformat.selectRange[conditionformat.selectRange.length - 1] = last;\r\n\r\n                    selectionCopyShow(conditionformat.selectRange);\r\n\r\n                    let range = conditionformat.getTxtByRange(conditionformat.selectRange);\r\n                    $(\"#luckysheet-multiRange-dialog input\").val(range);\r\n                } else if (dataVerificationCtrl.selectStatus) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n\r\n                    let last = dataVerificationCtrl.selectRange[dataVerificationCtrl.selectRange.length - 1];\r\n\r\n                    let top = 0,\r\n                        height = 0,\r\n                        rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if (last.row[1] > last.row_focus) {\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    } else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    } else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if (last.row[0] < last.row_focus) {\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    let left = 0,\r\n                        width = 0,\r\n                        columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if (last.column[1] > last.column_focus) {\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    } else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    } else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if (last.column[0] < last.column_focus) {\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    let changeparam = menuButton.mergeMoveMain(\r\n                        columnseleted,\r\n                        rowseleted,\r\n                        last,\r\n                        top,\r\n                        height,\r\n                        left,\r\n                        width,\r\n                    );\r\n                    if (changeparam != null) {\r\n                        columnseleted = changeparam[0];\r\n                        rowseleted = changeparam[1];\r\n                        top = changeparam[2];\r\n                        height = changeparam[3];\r\n                        left = changeparam[4];\r\n                        width = changeparam[5];\r\n                    }\r\n\r\n                    last[\"row\"] = rowseleted;\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    dataVerificationCtrl.selectRange[dataVerificationCtrl.selectRange.length - 1] = last;\r\n\r\n                    selectionCopyShow(dataVerificationCtrl.selectRange);\r\n\r\n                    let range = dataVerificationCtrl.getTxtByRange(dataVerificationCtrl.selectRange);\r\n                    if (formula.rangetosheet && formula.rangetosheet != Store.currentSheetIndex) {\r\n                        range = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name + \"!\" + range;\r\n                    }\r\n                    $(\"#luckysheet-dataVerificationRange-dialog input\").val(range);\r\n                } else if (formula.rangestart) {\r\n                    formula.rangedrag(event);\r\n                } else if (formula.rangedrag_row_start) {\r\n                    formula.rangedrag_row(event);\r\n                } else if (formula.rangedrag_column_start) {\r\n                    formula.rangedrag_column(event);\r\n                } else if (Store.luckysheet_rows_selected_status) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let y = mouse[1] + $(\"#luckysheet-rows-h\").scrollTop();\r\n                    if (y < 0) {\r\n                        return false;\r\n                    }\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n                    let col_index = Store.visibledatacolumn.length - 1,\r\n                        col = Store.visibledatacolumn[col_index],\r\n                        col_pre = 0;\r\n\r\n                    let last = $.extend(\r\n                        true,\r\n                        {},\r\n                        Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n                    );\r\n\r\n                    let top = 0,\r\n                        height = 0,\r\n                        rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if (last.row[1] > last.row_focus) {\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    } else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    } else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if (last.row[0] < last.row_focus) {\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    last[\"row\"] = rowseleted;\r\n\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n\r\n                    selectHightlightShow();\r\n                    clearTimeout(Store.countfuncTimeout);\r\n                    Store.countfuncTimeout = setTimeout(function() {\r\n                        countfunc();\r\n                    }, 500);\r\n                } else if (Store.luckysheet_cols_selected_status) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cols-h-c\").scrollLeft();\r\n                    if (x < 0) {\r\n                        return false;\r\n                    }\r\n\r\n                    let row_index = Store.visibledatarow.length - 1,\r\n                        row = Store.visibledatarow[row_index],\r\n                        row_pre = 0;\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n\r\n                    let last = $.extend(\r\n                        true,\r\n                        {},\r\n                        Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n                    );\r\n\r\n                    let left = 0,\r\n                        width = 0,\r\n                        columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if (last.column[1] > last.column_focus) {\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    } else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    } else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if (last.column[0] < last.column_focus) {\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n\r\n                    Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n\r\n                    selectHightlightShow();\r\n                    clearTimeout(Store.countfuncTimeout);\r\n                    Store.countfuncTimeout = setTimeout(function() {\r\n                        countfunc();\r\n                    }, 500);\r\n                } else if (Store.luckysheet_cell_selected_move) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n\r\n                    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    let x = mouse[0] + scrollLeft;\r\n                    let y = mouse[1] + scrollTop;\r\n\r\n                    let winH = $(window).height() + scrollTop - Store.sheetBarHeight - Store.statisticBarHeight,\r\n                        winW = $(window).width() + scrollLeft;\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n\r\n                    let row_index_original = Store.luckysheet_cell_selected_move_index[0],\r\n                        col_index_original = Store.luckysheet_cell_selected_move_index[1];\r\n\r\n                    let row_s = Store.luckysheet_select_save[0][\"row\"][0] - row_index_original + row_index,\r\n                        row_e = Store.luckysheet_select_save[0][\"row\"][1] - row_index_original + row_index;\r\n\r\n                    let col_s = Store.luckysheet_select_save[0][\"column\"][0] - col_index_original + col_index,\r\n                        col_e = Store.luckysheet_select_save[0][\"column\"][1] - col_index_original + col_index;\r\n\r\n                    if (row_s < 0 || y < 0) {\r\n                        row_s = 0;\r\n                        row_e = Store.luckysheet_select_save[0][\"row\"][1] - Store.luckysheet_select_save[0][\"row\"][0];\r\n                    }\r\n\r\n                    if (col_s < 0 || x < 0) {\r\n                        col_s = 0;\r\n                        col_e =\r\n                            Store.luckysheet_select_save[0][\"column\"][1] - Store.luckysheet_select_save[0][\"column\"][0];\r\n                    }\r\n\r\n                    if (row_e >= Store.visibledatarow[Store.visibledatarow.length - 1] || y > winH) {\r\n                        row_s =\r\n                            Store.visibledatarow.length -\r\n                            1 -\r\n                            Store.luckysheet_select_save[0][\"row\"][1] +\r\n                            Store.luckysheet_select_save[0][\"row\"][0];\r\n                        row_e = Store.visibledatarow.length - 1;\r\n                    }\r\n\r\n                    if (col_e >= Store.visibledatacolumn[Store.visibledatacolumn.length - 1] || x > winW) {\r\n                        col_s =\r\n                            Store.visibledatacolumn.length -\r\n                            1 -\r\n                            Store.luckysheet_select_save[0][\"column\"][1] +\r\n                            Store.luckysheet_select_save[0][\"column\"][0];\r\n                        col_e = Store.visibledatacolumn.length - 1;\r\n                    }\r\n\r\n                    col_pre = col_s - 1 == -1 ? 0 : Store.visibledatacolumn[col_s - 1];\r\n                    col = Store.visibledatacolumn[col_e];\r\n                    row_pre = row_s - 1 == -1 ? 0 : Store.visibledatarow[row_s - 1];\r\n                    row = Store.visibledatarow[row_e];\r\n\r\n                    $(\"#luckysheet-cell-selected-move\").css({\r\n                        left: col_pre,\r\n                        width: col - col_pre - 2,\r\n                        top: row_pre,\r\n                        height: row - row_pre - 2,\r\n                        display: \"block\",\r\n                    });\r\n                } else if (Store.luckysheet_cell_selected_extend) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft() - 5;\r\n                    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop() - 5;\r\n\r\n                    let x = mouse[0] + scrollLeft;\r\n                    let y = mouse[1] + scrollTop;\r\n\r\n                    let winH = $(window).height() + scrollTop - Store.sheetBarHeight - Store.statisticBarHeight,\r\n                        winW = $(window).width() + scrollLeft;\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n\r\n                    let row_index_original = Store.luckysheet_cell_selected_extend_index[0],\r\n                        col_index_original = Store.luckysheet_cell_selected_extend_index[1];\r\n\r\n                    let row_s = Store.luckysheet_select_save[0][\"row\"][0],\r\n                        row_e = Store.luckysheet_select_save[0][\"row\"][1];\r\n                    let col_s = Store.luckysheet_select_save[0][\"column\"][0],\r\n                        col_e = Store.luckysheet_select_save[0][\"column\"][1];\r\n\r\n                    if (row_s < 0 || y < 0) {\r\n                        row_s = 0;\r\n                        row_e = Store.luckysheet_select_save[0][\"row\"][1] - Store.luckysheet_select_save[0][\"row\"][0];\r\n                    }\r\n\r\n                    if (col_s < 0 || x < 0) {\r\n                        col_s = 0;\r\n                        col_e =\r\n                            Store.luckysheet_select_save[0][\"column\"][1] - Store.luckysheet_select_save[0][\"column\"][0];\r\n                    }\r\n\r\n                    if (row_e >= Store.visibledatarow[Store.visibledatarow.length - 1] || y > winH) {\r\n                        row_s =\r\n                            Store.visibledatarow.length -\r\n                            1 -\r\n                            Store.luckysheet_select_save[0][\"row\"][1] +\r\n                            Store.luckysheet_select_save[0][\"row\"][0];\r\n                        row_e = Store.visibledatarow.length - 1;\r\n                    }\r\n\r\n                    if (col_e >= Store.visibledatacolumn[Store.visibledatacolumn.length - 1] || x > winW) {\r\n                        col_s =\r\n                            Store.visibledatacolumn.length -\r\n                            1 -\r\n                            Store.luckysheet_select_save[0][\"column\"][1] +\r\n                            Store.luckysheet_select_save[0][\"column\"][0];\r\n                        col_e = Store.visibledatacolumn.length - 1;\r\n                    }\r\n\r\n                    let top = Store.luckysheet_select_save[0].top_move,\r\n                        height = Store.luckysheet_select_save[0].height_move;\r\n                    let left = Store.luckysheet_select_save[0].left_move,\r\n                        width = Store.luckysheet_select_save[0].width_move;\r\n\r\n                    if (Math.abs(row_index_original - row_index) > Math.abs(col_index_original - col_index)) {\r\n                        if (!(row_index >= row_s && row_index <= row_e)) {\r\n                            if (Store.luckysheet_select_save[0].top_move >= row_pre) {\r\n                                top = row_pre;\r\n                                height =\r\n                                    Store.luckysheet_select_save[0].top_move +\r\n                                    Store.luckysheet_select_save[0].height_move -\r\n                                    row_pre;\r\n                            } else {\r\n                                top = Store.luckysheet_select_save[0].top_move;\r\n                                height = row - Store.luckysheet_select_save[0].top_move - 1;\r\n                            }\r\n                        }\r\n                    } else {\r\n                        if (!(col_index >= col_s && col_index <= col_e)) {\r\n                            if (Store.luckysheet_select_save[0].left_move >= col_pre) {\r\n                                left = col_pre;\r\n                                width =\r\n                                    Store.luckysheet_select_save[0].left_move +\r\n                                    Store.luckysheet_select_save[0].width_move -\r\n                                    col_pre;\r\n                            } else {\r\n                                left = Store.luckysheet_select_save[0].left_move;\r\n                                width = col - Store.luckysheet_select_save[0].left_move - 1;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    $(\"#luckysheet-cell-selected-extend\").css({\r\n                        left: left,\r\n                        width: width,\r\n                        top: top,\r\n                        height: height,\r\n                        display: \"block\",\r\n                    });\r\n                } else if (Store.luckysheet_cols_change_size) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let scrollLeft = $(\"#luckysheet-cols-h-c\").scrollLeft();\r\n                    let x = mouse[0] + scrollLeft;\r\n                    let winW = $(window).width();\r\n\r\n                    let row_index = Store.visibledatarow.length - 1,\r\n                        row = Store.visibledatarow[row_index],\r\n                        row_pre = 0;\r\n                    let col_location = colLocation(x),\r\n                        col = col_location[1],\r\n                        col_pre = col_location[0],\r\n                        col_index = col_location[2];\r\n\r\n                    if (x + 3 - Store.luckysheet_cols_change_size_start[0] > 30 && x < winW + scrollLeft - 100) {\r\n                        $(\"#luckysheet-change-size-line\").css({ left: x });\r\n                        $(\"#luckysheet-cols-change-size\").css({ left: x - 2 });\r\n                    }\r\n                } else if (Store.luckysheet_rows_change_size) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let scrollTop = $(\"#luckysheet-rows-h\").scrollTop();\r\n                    let y = mouse[1] + scrollTop;\r\n                    let winH = $(window).height();\r\n\r\n                    let row_location = rowLocation(y),\r\n                        row = row_location[1],\r\n                        row_pre = row_location[0],\r\n                        row_index = row_location[2];\r\n\r\n                    if (y + 3 - Store.luckysheet_rows_change_size_start[0] > 19 && y < winH + scrollTop - 200) {\r\n                        $(\"#luckysheet-change-size-line\").css({ top: y });\r\n                        $(\"#luckysheet-rows-change-size\").css({ top: y });\r\n                    }\r\n                }\r\n                // chart move\r\n                else if (!!Store.chartparam.luckysheetCurrentChartMove) {\r\n                    const mouse = mouseposition(event.pageX, event.pageY);\r\n                    const x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    const y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    const myh = Store.chartparam.luckysheetCurrentChartMoveObj.height(),\r\n                        myw = Store.chartparam.luckysheetCurrentChartMoveObj.width();\r\n                    let top = y - Store.chartparam.luckysheetCurrentChartMoveXy[1],\r\n                        left = x - Store.chartparam.luckysheetCurrentChartMoveXy[0];\r\n\r\n                    if (top < 0) {\r\n                        top = 0;\r\n                    }\r\n\r\n                    if (top + myh + 42 + 6 > Store.chartparam.luckysheetCurrentChartMoveWinH) {\r\n                        top = Store.chartparam.luckysheetCurrentChartMoveWinH - myh - 42 - 6;\r\n                    }\r\n\r\n                    if (left < 0) {\r\n                        left = 0;\r\n                    }\r\n\r\n                    if (left + myw + 22 + 36 > Store.chartparam.luckysheetCurrentChartMoveWinW) {\r\n                        left = Store.chartparam.luckysheetCurrentChartMoveWinW - myw - 22 - 36;\r\n                    }\r\n\r\n                    Store.chartparam.luckysheetCurrentChartMoveObj.css({ top: top, left: left });\r\n\r\n                    if (\r\n                        luckysheetFreezen.freezenhorizontaldata != null ||\r\n                        luckysheetFreezen.freezenverticaldata != null\r\n                    ) {\r\n                        luckysheetFreezen.scrollAdapt();\r\n\r\n                        const toffset = Store.chartparam.luckysheetCurrentChartMoveObj.offset();\r\n                        const tpsition = Store.chartparam.luckysheetCurrentChartMoveObj.position();\r\n                        Store.chartparam.luckysheetCurrentChartMoveXy = [\r\n                            event.pageX - toffset.left,\r\n                            event.pageY - toffset.top,\r\n                            tpsition.left,\r\n                            tpsition.top,\r\n                            $(\"#luckysheet-scrollbar-x\").scrollLeft(),\r\n                            $(\"#luckysheet-scrollbar-y\").scrollTop(),\r\n                        ];\r\n                    }\r\n                }\r\n                // chart resize\r\n                else if (!!Store.chartparam.luckysheetCurrentChartResize) {\r\n                    const scrollTop = $(\"#luckysheet-cell-main\").scrollTop(),\r\n                        scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    const mouse = mouseposition(event.pageX, event.pageY);\r\n                    const x = mouse[0] + scrollLeft;\r\n                    const y = mouse[1] + scrollTop;\r\n\r\n                    if (x < 0 || y < 0) {\r\n                        return false;\r\n                    }\r\n\r\n                    const myh = Store.chartparam.luckysheetCurrentChartResizeObj.height(),\r\n                        myw = Store.chartparam.luckysheetCurrentChartResizeObj.width();\r\n                    const topchange = y - Store.chartparam.luckysheetCurrentChartResizeXy[1],\r\n                        leftchange = x - Store.chartparam.luckysheetCurrentChartResizeXy[0];\r\n\r\n                    let top = Store.chartparam.luckysheetCurrentChartResizeXy[5],\r\n                        height = Store.chartparam.luckysheetCurrentChartResizeXy[3],\r\n                        left = Store.chartparam.luckysheetCurrentChartResizeXy[4],\r\n                        width = Store.chartparam.luckysheetCurrentChartResizeXy[2];\r\n\r\n                    if (\r\n                        Store.chartparam.luckysheetCurrentChartResize == \"lm\" ||\r\n                        Store.chartparam.luckysheetCurrentChartResize == \"lt\" ||\r\n                        Store.chartparam.luckysheetCurrentChartResize == \"lb\"\r\n                    ) {\r\n                        left = x;\r\n                        width = Store.chartparam.luckysheetCurrentChartResizeXy[2] - leftchange;\r\n                        if (\r\n                            left >\r\n                            Store.chartparam.luckysheetCurrentChartResizeXy[2] +\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[4] -\r\n                                60\r\n                        ) {\r\n                            left =\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[2] +\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[4] -\r\n                                60;\r\n                            width =\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[2] -\r\n                                (Store.chartparam.luckysheetCurrentChartResizeXy[2] +\r\n                                    Store.chartparam.luckysheetCurrentChartResizeXy[4] -\r\n                                    60 -\r\n                                    Store.chartparam.luckysheetCurrentChartResizeXy[0]);\r\n                        } else if (left <= 0) {\r\n                            left = 0;\r\n                            width =\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[2] +\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[0];\r\n                        }\r\n                    }\r\n\r\n                    if (\r\n                        Store.chartparam.luckysheetCurrentChartResize == \"rm\" ||\r\n                        Store.chartparam.luckysheetCurrentChartResize == \"rt\" ||\r\n                        Store.chartparam.luckysheetCurrentChartResize == \"rb\"\r\n                    ) {\r\n                        width = Store.chartparam.luckysheetCurrentChartResizeXy[2] + leftchange;\r\n                        if (width < 60) {\r\n                            width = 60;\r\n                        } else if (\r\n                            width >=\r\n                            Store.chartparam.luckysheetCurrentChartResizeWinW -\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[4] -\r\n                                22 -\r\n                                36\r\n                        ) {\r\n                            width =\r\n                                Store.chartparam.luckysheetCurrentChartResizeWinW -\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[4] -\r\n                                22 -\r\n                                36;\r\n                        }\r\n                    }\r\n\r\n                    if (\r\n                        Store.chartparam.luckysheetCurrentChartResize == \"mt\" ||\r\n                        Store.chartparam.luckysheetCurrentChartResize == \"lt\" ||\r\n                        Store.chartparam.luckysheetCurrentChartResize == \"rt\"\r\n                    ) {\r\n                        top = y;\r\n                        height = Store.chartparam.luckysheetCurrentChartResizeXy[3] - topchange;\r\n                        if (\r\n                            top >\r\n                            Store.chartparam.luckysheetCurrentChartResizeXy[3] +\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[5] -\r\n                                60\r\n                        ) {\r\n                            top =\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[3] +\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[5] -\r\n                                60;\r\n                            height =\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[3] -\r\n                                (Store.chartparam.luckysheetCurrentChartResizeXy[3] +\r\n                                    Store.chartparam.luckysheetCurrentChartResizeXy[5] -\r\n                                    60 -\r\n                                    Store.chartparam.luckysheetCurrentChartResizeXy[1]);\r\n                        } else if (top <= 0) {\r\n                            top = 0;\r\n                            height =\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[3] +\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[1];\r\n                        }\r\n                    }\r\n\r\n                    if (\r\n                        Store.chartparam.luckysheetCurrentChartResize == \"mb\" ||\r\n                        Store.chartparam.luckysheetCurrentChartResize == \"lb\" ||\r\n                        Store.chartparam.luckysheetCurrentChartResize == \"rb\"\r\n                    ) {\r\n                        height = Store.chartparam.luckysheetCurrentChartResizeXy[3] + topchange;\r\n                        if (height < 60) {\r\n                            height = 60;\r\n                        } else if (\r\n                            height >=\r\n                            Store.chartparam.luckysheetCurrentChartResizeWinH -\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[5] -\r\n                                42 -\r\n                                6\r\n                        ) {\r\n                            height =\r\n                                Store.chartparam.luckysheetCurrentChartResizeWinH -\r\n                                Store.chartparam.luckysheetCurrentChartResizeXy[5] -\r\n                                42 -\r\n                                6;\r\n                        }\r\n                    }\r\n\r\n                    const resizedata = { top: top, left: left, height: height, width: width };\r\n                    Store.chartparam.luckysheetCurrentChartResizeObj.css(resizedata);\r\n                    // resize chart\r\n                    Store.resizeChart(Store.chartparam.luckysheetCurrentChart);\r\n                }\r\n                //image move\r\n                else if (imageCtrl.move) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    let imgItem = imageCtrl.images[imageCtrl.currentImgId];\r\n                    if (imgItem.isFixedPos) {\r\n                        x = event.pageX;\r\n                        y = event.pageY;\r\n                    }\r\n\r\n                    let myh = $(\"#luckysheet-modal-dialog-activeImage\").height(),\r\n                        myw = $(\"#luckysheet-modal-dialog-activeImage\").width();\r\n\r\n                    let top = y - imageCtrl.moveXY[1],\r\n                        left = x - imageCtrl.moveXY[0];\r\n\r\n                    let minTop = 0,\r\n                        maxTop = imageCtrl.currentWinH - myh - 42 - 6,\r\n                        minLeft = 0,\r\n                        maxLeft = imageCtrl.currentWinW - myw - 22 - 36;\r\n\r\n                    if (imgItem.isFixedPos) {\r\n                        minTop =\r\n                            Store.infobarHeight +\r\n                            Store.toolbarHeight +\r\n                            Store.calculatebarHeight +\r\n                            Store.columnHeaderHeight;\r\n                        maxTop = minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - myh;\r\n                        minLeft = Store.rowHeaderWidth;\r\n                        maxLeft = minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - myw;\r\n                    }\r\n\r\n                    if (top < minTop) {\r\n                        top = minTop;\r\n                    }\r\n\r\n                    if (top > maxTop) {\r\n                        top = maxTop;\r\n                    }\r\n\r\n                    if (left < minLeft) {\r\n                        left = minLeft;\r\n                    }\r\n\r\n                    if (left > maxLeft) {\r\n                        left = maxLeft;\r\n                    }\r\n\r\n                    $(\"#luckysheet-modal-dialog-activeImage\").css({ left: left, top: top });\r\n                }\r\n                //image resize\r\n                else if (!!imageCtrl.resize) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                    let x = mouse[0] + scrollLeft;\r\n                    let y = mouse[1] + scrollTop;\r\n\r\n                    if (x < 0 || y < 0) {\r\n                        return false;\r\n                    }\r\n\r\n                    let resizeXY = imageCtrl.resizeXY;\r\n\r\n                    let topchange = y - resizeXY[1],\r\n                        leftchange = x - resizeXY[0];\r\n\r\n                    let top = resizeXY[5],\r\n                        height = resizeXY[3],\r\n                        left = resizeXY[4],\r\n                        width = resizeXY[2];\r\n\r\n                    let resize = imageCtrl.resize;\r\n                    let imgItem = imageCtrl.images[imageCtrl.currentImgId];\r\n\r\n                    if (imgItem.isFixedPos) {\r\n                        let minTop =\r\n                            Store.infobarHeight +\r\n                            Store.toolbarHeight +\r\n                            Store.calculatebarHeight +\r\n                            Store.columnHeaderHeight;\r\n                        let minLeft = Store.rowHeaderWidth;\r\n\r\n                        if (resize == \"lt\") {\r\n                            //左上\r\n                            left = resizeXY[4] - resizeXY[6] + leftchange;\r\n\r\n                            if (left < minLeft) {\r\n                                left = minLeft;\r\n                            }\r\n\r\n                            if (left > resizeXY[4] - resizeXY[6] + resizeXY[2] - 1) {\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - 1;\r\n                            }\r\n\r\n                            width = resizeXY[4] - resizeXY[6] + resizeXY[2] - left;\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n                            top = resizeXY[5] - resizeXY[7] + resizeXY[3] - height;\r\n\r\n                            if (top < minTop) {\r\n                                top = minTop;\r\n                                height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - width;\r\n                            }\r\n\r\n                            if (top > resizeXY[5] - resizeXY[7] + resizeXY[3] - 1) {\r\n                                top = resizeXY[5] - resizeXY[7] + resizeXY[3] - 1;\r\n                                height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - width;\r\n                            }\r\n                        } else if (resize == \"lm\") {\r\n                            //左中\r\n                            left = resizeXY[4] - resizeXY[6] + leftchange;\r\n\r\n                            if (left < minLeft) {\r\n                                left = minLeft;\r\n                            }\r\n\r\n                            if (left > resizeXY[4] - resizeXY[6] + resizeXY[2] - 1) {\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - 1;\r\n                            }\r\n\r\n                            width = resizeXY[4] - resizeXY[6] + resizeXY[2] - left;\r\n\r\n                            top = resizeXY[5] - resizeXY[7];\r\n                            height = resizeXY[3];\r\n                        } else if (resize == \"lb\") {\r\n                            //左下\r\n                            left = resizeXY[4] - resizeXY[6] + leftchange;\r\n\r\n                            if (left < minLeft) {\r\n                                left = minLeft;\r\n                            }\r\n\r\n                            if (left > resizeXY[4] - resizeXY[6] + resizeXY[2] - 1) {\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - 1;\r\n                            }\r\n\r\n                            width = resizeXY[4] - resizeXY[6] + resizeXY[2] - left;\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n\r\n                            top = resizeXY[5] - resizeXY[7];\r\n\r\n                            if (height < 1) {\r\n                                height = 1;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - width;\r\n                            }\r\n\r\n                            if (height > minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top) {\r\n                                height = minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - width;\r\n                            }\r\n                        } else if (resize == \"rt\") {\r\n                            //右上\r\n                            left = resizeXY[4] - resizeXY[6];\r\n\r\n                            width = resizeXY[2] + leftchange;\r\n\r\n                            if (width < 1) {\r\n                                width = 1;\r\n                            }\r\n\r\n                            if (width > minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - left) {\r\n                                width = minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - left;\r\n                            }\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n                            top = resizeXY[5] - resizeXY[7] + resizeXY[3] - height;\r\n\r\n                            if (top < minTop) {\r\n                                top = minTop;\r\n                                height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n\r\n                            if (top > resizeXY[5] - resizeXY[7] + resizeXY[3] - 1) {\r\n                                top = resizeXY[5] - resizeXY[7] + resizeXY[3] - 1;\r\n                                height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n                        } else if (resize == \"rm\") {\r\n                            //右中\r\n                            left = resizeXY[4] - resizeXY[6];\r\n\r\n                            width = resizeXY[2] + leftchange;\r\n\r\n                            if (width < 1) {\r\n                                width = 1;\r\n                            }\r\n\r\n                            if (width > minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - left) {\r\n                                width = minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - left;\r\n                            }\r\n\r\n                            top = resizeXY[5] - resizeXY[7];\r\n                            height = resizeXY[3];\r\n                        } else if (resize == \"rb\") {\r\n                            //右下\r\n                            left = resizeXY[4] - resizeXY[6];\r\n\r\n                            width = resizeXY[2] + leftchange;\r\n\r\n                            if (width < 1) {\r\n                                width = 1;\r\n                            }\r\n\r\n                            if (width > minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - left) {\r\n                                width = minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - left;\r\n                            }\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n                            top = resizeXY[5] - resizeXY[7];\r\n\r\n                            if (height < 1) {\r\n                                height = 1;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n\r\n                            if (height > minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top) {\r\n                                height = minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n                        } else if (resize == \"mt\") {\r\n                            //中上\r\n                            left = resizeXY[4] - resizeXY[6];\r\n                            width = resizeXY[2];\r\n\r\n                            top = resizeXY[5] - resizeXY[7] + topchange;\r\n\r\n                            if (top < minTop) {\r\n                                top = minTop;\r\n                            }\r\n\r\n                            if (top > resizeXY[5] - resizeXY[7] + resizeXY[3] - 1) {\r\n                                top = resizeXY[5] - resizeXY[7] + resizeXY[3] - 1;\r\n                            }\r\n\r\n                            height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top;\r\n                        } else if (resize == \"mb\") {\r\n                            //中下\r\n                            left = resizeXY[4] - resizeXY[6];\r\n                            width = resizeXY[2];\r\n\r\n                            top = resizeXY[5] - resizeXY[7];\r\n\r\n                            height = resizeXY[3] + topchange;\r\n\r\n                            if (height < 1) {\r\n                                height = 1;\r\n                            }\r\n\r\n                            if (height > minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top) {\r\n                                height = minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top;\r\n                            }\r\n                        }\r\n                    } else {\r\n                        if (resize == \"lt\") {\r\n                            //左上\r\n                            left = x;\r\n                            width = resizeXY[2] - leftchange;\r\n\r\n                            if (left > resizeXY[2] + resizeXY[4] - 1) {\r\n                                left = resizeXY[2] + resizeXY[4] - 1;\r\n                                width = resizeXY[2] + resizeXY[0] - (resizeXY[2] + resizeXY[4] - 1);\r\n                            } else if (left <= 0) {\r\n                                left = 0;\r\n                                width = resizeXY[2] + resizeXY[0];\r\n                            }\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n                            top = resizeXY[3] + resizeXY[1] - height;\r\n\r\n                            if (top > resizeXY[3] + resizeXY[5] - 1) {\r\n                                top = resizeXY[3] + resizeXY[5] - 1;\r\n                                height = resizeXY[3] + resizeXY[1] - (resizeXY[3] + resizeXY[5] - 1);\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[2] + resizeXY[0] - width;\r\n                            } else if (top <= 0) {\r\n                                top = 0;\r\n                                height = resizeXY[3] + resizeXY[1];\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[2] + resizeXY[0] - width;\r\n                            }\r\n                        } else if (resize == \"lm\") {\r\n                            //左中\r\n                            left = x;\r\n                            width = resizeXY[2] - leftchange;\r\n\r\n                            if (left > resizeXY[2] + resizeXY[4] - 1) {\r\n                                left = resizeXY[2] + resizeXY[4] - 1;\r\n                                width = resizeXY[2] + resizeXY[0] - (resizeXY[2] + resizeXY[4] - 1);\r\n                            } else if (left <= 0) {\r\n                                left = 0;\r\n                                width = resizeXY[2] + resizeXY[0];\r\n                            }\r\n                        } else if (resize == \"lb\") {\r\n                            //左下\r\n                            left = x;\r\n                            width = resizeXY[2] - leftchange;\r\n\r\n                            if (left > resizeXY[2] + resizeXY[4] - 1) {\r\n                                left = resizeXY[2] + resizeXY[4] - 1;\r\n                                width = resizeXY[2] + resizeXY[0] - (resizeXY[2] + resizeXY[4] - 1);\r\n                            } else if (left <= 0) {\r\n                                left = 0;\r\n                                width = resizeXY[2] + resizeXY[0];\r\n                            }\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n\r\n                            if (height < 1) {\r\n                                height = 1;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[2] + resizeXY[0] - width;\r\n                            } else if (height >= imageCtrl.currentWinH - resizeXY[5] - 42 - 6) {\r\n                                height = imageCtrl.currentWinH - resizeXY[5] - 42 - 6;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                                left = resizeXY[2] + resizeXY[0] - width;\r\n                            }\r\n                        } else if (resize == \"rt\") {\r\n                            //右上\r\n                            width = resizeXY[2] + leftchange;\r\n\r\n                            if (width < 1) {\r\n                                width = 1;\r\n                            } else if (width >= imageCtrl.currentWinW - resizeXY[4] - 22 - 36) {\r\n                                width = imageCtrl.currentWinW - resizeXY[4] - 22 - 36;\r\n                            }\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n                            top = resizeXY[3] + resizeXY[1] - height;\r\n\r\n                            if (top > resizeXY[3] + resizeXY[5] - 1) {\r\n                                top = resizeXY[3] + resizeXY[5] - 1;\r\n                                height = resizeXY[3] + resizeXY[1] - (resizeXY[3] + resizeXY[5] - 1);\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            } else if (top <= 0) {\r\n                                top = 0;\r\n                                height = resizeXY[3] + resizeXY[1];\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n                        } else if (resize == \"rm\") {\r\n                            //右中\r\n                            width = resizeXY[2] + leftchange;\r\n\r\n                            if (width < 1) {\r\n                                width = 1;\r\n                            } else if (width >= imageCtrl.currentWinW - resizeXY[4] - 22 - 36) {\r\n                                width = imageCtrl.currentWinW - resizeXY[4] - 22 - 36;\r\n                            }\r\n                        } else if (resize == \"rb\") {\r\n                            //右下\r\n                            width = resizeXY[2] + leftchange;\r\n\r\n                            if (width < 1) {\r\n                                width = 1;\r\n                            } else if (width >= imageCtrl.currentWinW - resizeXY[4] - 22 - 36) {\r\n                                width = imageCtrl.currentWinW - resizeXY[4] - 22 - 36;\r\n                            }\r\n\r\n                            height = Math.round(width * (resizeXY[3] / resizeXY[2]));\r\n\r\n                            if (height < 1) {\r\n                                height = 1;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            } else if (height >= imageCtrl.currentWinH - resizeXY[5] - 42 - 6) {\r\n                                height = imageCtrl.currentWinH - resizeXY[5] - 42 - 6;\r\n\r\n                                width = Math.round(height * (resizeXY[2] / resizeXY[3]));\r\n                            }\r\n                        } else if (resize == \"mt\") {\r\n                            //中上\r\n                            top = y;\r\n                            height = resizeXY[3] - topchange;\r\n\r\n                            if (top > resizeXY[3] + resizeXY[5] - 1) {\r\n                                top = resizeXY[3] + resizeXY[5] - 1;\r\n                                height = resizeXY[3] + resizeXY[1] - (resizeXY[3] + resizeXY[5] - 1);\r\n                            } else if (top <= 0) {\r\n                                top = 0;\r\n                                height = resizeXY[3] + resizeXY[1];\r\n                            }\r\n                        } else if (resize == \"mb\") {\r\n                            //中下\r\n                            height = resizeXY[3] + topchange;\r\n\r\n                            if (height < 1) {\r\n                                height = 1;\r\n                            } else if (height >= imageCtrl.currentWinH - resizeXY[5] - 42 - 6) {\r\n                                height = imageCtrl.currentWinH - resizeXY[5] - 42 - 6;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    $(\"#luckysheet-modal-dialog-activeImage\").css({\r\n                        width: width,\r\n                        height: height,\r\n                        left: left,\r\n                        top: top,\r\n                    });\r\n\r\n                    let scaleX = width / imgItem.crop.width;\r\n                    let scaleY = height / imgItem.crop.height;\r\n                    let defaultWidth = Math.round(imgItem.default.width * scaleX);\r\n                    let defaultHeight = Math.round(imgItem.default.height * scaleY);\r\n                    let offsetLeft = Math.round(imgItem.crop.offsetLeft * scaleX);\r\n                    let offsetTop = Math.round(imgItem.crop.offsetTop * scaleY);\r\n\r\n                    $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content\").css({\r\n                        \"background-size\": defaultWidth + \"px \" + defaultHeight + \"px\",\r\n                        \"background-position\": -offsetLeft + \"px \" + -offsetTop + \"px\",\r\n                    });\r\n                }\r\n                //image cropChange\r\n                else if (!!imageCtrl.cropChange) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    if (x < 0 || y < 0) {\r\n                        return false;\r\n                    }\r\n\r\n                    let cropChangeXY = imageCtrl.cropChangeXY;\r\n\r\n                    let topchange = y - cropChangeXY[1],\r\n                        leftchange = x - cropChangeXY[0];\r\n\r\n                    let imgItem = imageCtrl.images[imageCtrl.currentImgId];\r\n                    let cropChange = imageCtrl.cropChange;\r\n                    let width, height, offsetLeft, offsetTop;\r\n\r\n                    if (cropChange == \"lt\") {\r\n                        //左上\r\n                        offsetLeft = imgItem.crop.offsetLeft + leftchange;\r\n\r\n                        if (offsetLeft < 0) {\r\n                            offsetLeft = 0;\r\n                        }\r\n\r\n                        if (offsetLeft > imgItem.crop.width + imgItem.crop.offsetLeft - 1) {\r\n                            offsetLeft = imgItem.crop.width + imgItem.crop.offsetLeft - 1;\r\n                        }\r\n\r\n                        width = imgItem.crop.width + imgItem.crop.offsetLeft - offsetLeft;\r\n\r\n                        offsetTop = imgItem.crop.offsetTop + topchange;\r\n\r\n                        if (offsetTop < 0) {\r\n                            offsetTop = 0;\r\n                        }\r\n\r\n                        if (offsetTop > imgItem.crop.height + imgItem.crop.offsetTop - 1) {\r\n                            offsetTop = imgItem.crop.height + imgItem.crop.offsetTop - 1;\r\n                        }\r\n\r\n                        height = imgItem.crop.height + imgItem.crop.offsetTop - offsetTop;\r\n                    } else if (cropChange == \"lm\") {\r\n                        //左中\r\n                        offsetLeft = imgItem.crop.offsetLeft + leftchange;\r\n\r\n                        if (offsetLeft < 0) {\r\n                            offsetLeft = 0;\r\n                        }\r\n\r\n                        if (offsetLeft > imgItem.crop.width + imgItem.crop.offsetLeft - 1) {\r\n                            offsetLeft = imgItem.crop.width + imgItem.crop.offsetLeft - 1;\r\n                        }\r\n\r\n                        width = imgItem.crop.width + imgItem.crop.offsetLeft - offsetLeft;\r\n\r\n                        offsetTop = imgItem.crop.offsetTop;\r\n                        height = imgItem.crop.height;\r\n                    } else if (cropChange == \"lb\") {\r\n                        //左下\r\n                        offsetLeft = imgItem.crop.offsetLeft + leftchange;\r\n\r\n                        if (offsetLeft < 0) {\r\n                            offsetLeft = 0;\r\n                        }\r\n\r\n                        if (offsetLeft > imgItem.crop.width + imgItem.crop.offsetLeft - 1) {\r\n                            offsetLeft = imgItem.crop.width + imgItem.crop.offsetLeft - 1;\r\n                        }\r\n\r\n                        width = imgItem.crop.width + imgItem.crop.offsetLeft - offsetLeft;\r\n\r\n                        offsetTop = imgItem.crop.offsetTop;\r\n\r\n                        height = imgItem.crop.height + topchange;\r\n\r\n                        if (height < 1) {\r\n                            height = 1;\r\n                        }\r\n\r\n                        if (height > imgItem.default.height - offsetTop) {\r\n                            height = imgItem.default.height - offsetTop;\r\n                        }\r\n                    } else if (cropChange == \"rt\") {\r\n                        //右上\r\n                        offsetLeft = imgItem.crop.offsetLeft;\r\n\r\n                        width = imgItem.crop.width + leftchange;\r\n\r\n                        if (width < 1) {\r\n                            width = 1;\r\n                        }\r\n\r\n                        if (width > imgItem.default.width - offsetLeft) {\r\n                            width = imgItem.default.width - offsetLeft;\r\n                        }\r\n\r\n                        offsetTop = imgItem.crop.offsetTop + topchange;\r\n\r\n                        if (offsetTop < 0) {\r\n                            offsetTop = 0;\r\n                        }\r\n\r\n                        if (offsetTop > imgItem.crop.height + imgItem.crop.offsetTop - 1) {\r\n                            offsetTop = imgItem.crop.height + imgItem.crop.offsetTop - 1;\r\n                        }\r\n\r\n                        height = imgItem.crop.height + imgItem.crop.offsetTop - offsetTop;\r\n                    } else if (cropChange == \"rm\") {\r\n                        //右中\r\n                        offsetLeft = imgItem.crop.offsetLeft;\r\n\r\n                        width = imgItem.crop.width + leftchange;\r\n\r\n                        if (width < 1) {\r\n                            width = 1;\r\n                        }\r\n\r\n                        if (width > imgItem.default.width - offsetLeft) {\r\n                            width = imgItem.default.width - offsetLeft;\r\n                        }\r\n\r\n                        offsetTop = imgItem.crop.offsetTop;\r\n                        height = imgItem.crop.height;\r\n                    } else if (cropChange == \"rb\") {\r\n                        //右下\r\n                        offsetLeft = imgItem.crop.offsetLeft;\r\n\r\n                        width = imgItem.crop.width + leftchange;\r\n\r\n                        if (width < 1) {\r\n                            width = 1;\r\n                        }\r\n\r\n                        if (width > imgItem.default.width - offsetLeft) {\r\n                            width = imgItem.default.width - offsetLeft;\r\n                        }\r\n\r\n                        offsetTop = imgItem.crop.offsetTop;\r\n\r\n                        height = imgItem.crop.height + topchange;\r\n\r\n                        if (height < 1) {\r\n                            height = 1;\r\n                        }\r\n\r\n                        if (height > imgItem.default.height - offsetTop) {\r\n                            height = imgItem.default.height - offsetTop;\r\n                        }\r\n                    } else if (cropChange == \"mt\") {\r\n                        //中上\r\n                        offsetLeft = imgItem.crop.offsetLeft;\r\n                        width = imgItem.crop.width;\r\n\r\n                        offsetTop = imgItem.crop.offsetTop + topchange;\r\n\r\n                        if (offsetTop < 0) {\r\n                            offsetTop = 0;\r\n                        }\r\n\r\n                        if (offsetTop > imgItem.crop.height + imgItem.crop.offsetTop - 1) {\r\n                            offsetTop = imgItem.crop.height + imgItem.crop.offsetTop - 1;\r\n                        }\r\n\r\n                        height = imgItem.crop.height + imgItem.crop.offsetTop - offsetTop;\r\n                    } else if (cropChange == \"mb\") {\r\n                        //中下\r\n                        offsetLeft = imgItem.crop.offsetLeft;\r\n                        width = imgItem.crop.width;\r\n\r\n                        offsetTop = imgItem.crop.offsetTop;\r\n\r\n                        height = imgItem.crop.height + topchange;\r\n\r\n                        if (height < 1) {\r\n                            height = 1;\r\n                        }\r\n\r\n                        if (height > imgItem.default.height - offsetTop) {\r\n                            height = imgItem.default.height - offsetTop;\r\n                        }\r\n                    }\r\n\r\n                    let left = imgItem.default.left + offsetLeft;\r\n                    let top = imgItem.default.top + offsetTop;\r\n\r\n                    if (imgItem.isFixedPos) {\r\n                        left = imgItem.fixedLeft + offsetLeft;\r\n                        top = imgItem.fixedTop + offsetTop;\r\n                    }\r\n\r\n                    $(\"#luckysheet-modal-dialog-cropping\")\r\n                        .show()\r\n                        .css({\r\n                            width: width,\r\n                            height: height,\r\n                            left: left,\r\n                            top: top,\r\n                        });\r\n\r\n                    let imageUrlHandle = Store.toJsonOptions && Store.toJsonOptions[\"imageUrlHandle\"];\r\n                    let imgSrc = typeof imageUrlHandle === \"function\" ? imageUrlHandle(imgItem.src) : imgItem.src;\r\n\r\n                    $(\"#luckysheet-modal-dialog-cropping .cropping-mask\").css({\r\n                        width: imgItem.default.width,\r\n                        height: imgItem.default.height,\r\n                        \"background-image\": \"url(\" + imgSrc + \")\",\r\n                        left: -offsetLeft,\r\n                        top: -offsetTop,\r\n                    });\r\n\r\n                    $(\"#luckysheet-modal-dialog-cropping .cropping-content\").css({\r\n                        \"background-image\": \"url(\" + imgSrc + \")\",\r\n                        \"background-size\": imgItem.default.width + \"px \" + imgItem.default.height + \"px\",\r\n                        \"background-position\": -offsetLeft + \"px \" + -offsetTop + \"px\",\r\n                    });\r\n\r\n                    imageCtrl.cropChangeObj = {\r\n                        width: width,\r\n                        height: height,\r\n                        offsetLeft: offsetLeft,\r\n                        offsetTop: offsetTop,\r\n                    };\r\n                } else if (luckysheetPostil.move) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    let myh = luckysheetPostil.currentObj.outerHeight(),\r\n                        myw = luckysheetPostil.currentObj.outerWidth();\r\n\r\n                    let top = y - luckysheetPostil.moveXY[1],\r\n                        left = x - luckysheetPostil.moveXY[0];\r\n\r\n                    if (top < 0) {\r\n                        top = 0;\r\n                    }\r\n\r\n                    if (top + myh + 42 + 6 > luckysheetPostil.currentWinH) {\r\n                        top = luckysheetPostil.currentWinH - myh - 42 - 6;\r\n                    }\r\n\r\n                    if (left < 0) {\r\n                        left = 0;\r\n                    }\r\n\r\n                    if (left + myw + 22 + 36 > luckysheetPostil.currentWinW) {\r\n                        left = luckysheetPostil.currentWinW - myw - 22 - 36;\r\n                    }\r\n\r\n                    luckysheetPostil.currentObj.css({ left: left, top: top });\r\n                } else if (!!luckysheetPostil.resize) {\r\n                    let mouse = mouseposition(event.pageX, event.pageY);\r\n                    let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n                    let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                    if (x < 0 || y < 0) {\r\n                        return false;\r\n                    }\r\n\r\n                    let resizeXY = luckysheetPostil.resizeXY;\r\n\r\n                    let topchange = y - resizeXY[1],\r\n                        leftchange = x - resizeXY[0];\r\n\r\n                    let top = resizeXY[5],\r\n                        height = resizeXY[3],\r\n                        left = resizeXY[4],\r\n                        width = resizeXY[2];\r\n\r\n                    let resize = luckysheetPostil.resize;\r\n\r\n                    if (resize == \"lm\" || resize == \"lt\" || resize == \"lb\") {\r\n                        left = x;\r\n                        width = resizeXY[2] - leftchange;\r\n\r\n                        if (left > resizeXY[2] + resizeXY[4] - 60) {\r\n                            left = resizeXY[2] + resizeXY[4] - 60;\r\n                            width = resizeXY[2] - (resizeXY[2] + resizeXY[4] - 60 - resizeXY[0]);\r\n                        } else if (left <= 0) {\r\n                            left = 0;\r\n                            width = resizeXY[2] + resizeXY[0];\r\n                        }\r\n                    }\r\n\r\n                    if (resize == \"rm\" || resize == \"rt\" || resize == \"rb\") {\r\n                        width = resizeXY[2] + leftchange;\r\n\r\n                        if (width < 60) {\r\n                            width = 60;\r\n                        } else if (width >= luckysheetPostil.currentWinW - resizeXY[4] - 22 - 36) {\r\n                            width = luckysheetPostil.currentWinW - resizeXY[4] - 22 - 36;\r\n                        }\r\n                    }\r\n\r\n                    if (resize == \"mt\" || resize == \"lt\" || resize == \"rt\") {\r\n                        top = y;\r\n                        height = resizeXY[3] - topchange;\r\n\r\n                        if (top > resizeXY[3] + resizeXY[5] - 60) {\r\n                            top = resizeXY[3] + resizeXY[5] - 60;\r\n                            height = resizeXY[3] - (resizeXY[3] + resizeXY[5] - 60 - resizeXY[1]);\r\n                        } else if (top <= 0) {\r\n                            top = 0;\r\n                            height = resizeXY[3] + resizeXY[1];\r\n                        }\r\n                    }\r\n\r\n                    if (resize == \"mb\" || resize == \"lb\" || resize == \"rb\") {\r\n                        height = resizeXY[3] + topchange;\r\n\r\n                        if (height < 60) {\r\n                            height = 60;\r\n                        } else if (height >= luckysheetPostil.currentWinH - resizeXY[5] - 42 - 6) {\r\n                            height = luckysheetPostil.currentWinH - resizeXY[5] - 42 - 6;\r\n                        }\r\n                    }\r\n\r\n                    luckysheetPostil.currentObj.css({ width: width, height: height, left: left, top: top });\r\n                } else if (!!formula.rangeResize) {\r\n                    formula.rangeResizeDraging(\r\n                        event,\r\n                        formula.rangeResizeObj,\r\n                        formula.rangeResizexy,\r\n                        formula.rangeResize,\r\n                        formula.rangeResizeWinW,\r\n                        formula.rangeResizeWinH,\r\n                        Store.ch_width,\r\n                        Store.rh_height,\r\n                    );\r\n                } else if (!!formula.rangeMove) {\r\n                    formula.rangeMoveDraging(\r\n                        event,\r\n                        formula.rangeMovexy,\r\n                        formula.rangeMoveObj.data(\"range\"),\r\n                        formula.rangeMoveObj,\r\n                        Store.sheetBarHeight,\r\n                        Store.statisticBarHeight,\r\n                    );\r\n                } else if (!!Store.chart_selection.rangeResize) {\r\n                    Store.chart_selection.rangeResizeDraging(event, Store.sheetBarHeight, Store.statisticBarHeight);\r\n                } else if (!!Store.chart_selection.rangeMove) {\r\n                    Store.chart_selection.rangeMoveDraging(event, Store.sheetBarHeight, Store.statisticBarHeight);\r\n                }\r\n\r\n                Store.jfautoscrollTimeout = window.requestAnimationFrame(mouseRender);\r\n            }\r\n\r\n            Store.jfautoscrollTimeout = window.requestAnimationFrame(mouseRender);\r\n        }\r\n    });\r\n    //表格mouseup\r\n    $(document).on(\"mouseup.luckysheetEvent\", function(event) {\r\n        if (luckysheetConfigsetting && luckysheetConfigsetting.hook && luckysheetConfigsetting.hook.sheetMouseup) {\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n            if (!!margeset) {\r\n                row = margeset.row[1];\r\n                row_pre = margeset.row[0];\r\n                row_index = margeset.row[2];\r\n\r\n                col = margeset.column[1];\r\n                col_pre = margeset.column[0];\r\n                col_index = margeset.column[2];\r\n            }\r\n\r\n            // if(Store.flowdata[row_index] && Store.flowdata[row_index][col_index]){\r\n            let sheetFile = sheetmanage.getSheetByIndex();\r\n\r\n            let moveState = {\r\n                functionResizeStatus: formula.functionResizeStatus,\r\n                horizontalmoveState: !!luckysheetFreezen.horizontalmovestate,\r\n                verticalmoveState: !!luckysheetFreezen.verticalmovestate,\r\n                pivotTableMoveState: !!pivotTable && pivotTable.movestate,\r\n                sheetMoveStatus: Store.luckysheet_sheet_move_status,\r\n                scrollStatus: !!Store.luckysheet_scroll_status,\r\n                selectStatus: !!Store.luckysheet_select_status,\r\n                rowsSelectedStatus: !!Store.luckysheet_rows_selected_status,\r\n                colsSelectedStatus: !!Store.luckysheet_cols_selected_status,\r\n                cellSelectedMove: !!Store.luckysheet_cell_selected_move,\r\n                cellSelectedExtend: !!Store.luckysheet_cell_selected_extend,\r\n                colsChangeSize: !!Store.luckysheet_cols_change_size,\r\n                rowsChangeSize: !!Store.luckysheet_rows_change_size,\r\n                chartMove: !!Store.chartparam.luckysheetCurrentChartMove,\r\n                chartResize: !!Store.chartparam.luckysheetCurrentChartResize,\r\n                rangeResize: !!formula.rangeResize,\r\n                rangeMove: !!formula.rangeMove,\r\n            };\r\n\r\n            let luckysheetTableContent = $(\"#luckysheetTableContent\")\r\n                .get(0)\r\n                .getContext(\"2d\");\r\n\r\n            method.createHookFunction(\r\n                \"sheetMouseup\",\r\n                Store.flowdata[row_index][col_index],\r\n                {\r\n                    r: row_index,\r\n                    c: col_index,\r\n                    start_r: row_pre,\r\n                    start_c: col_pre,\r\n                    end_r: row,\r\n                    end_c: col,\r\n                },\r\n                sheetFile,\r\n                moveState,\r\n                luckysheetTableContent,\r\n            );\r\n            // }\r\n        }\r\n\r\n        //数据窗格主体\r\n        if (Store.luckysheet_select_status) {\r\n            clearTimeout(Store.countfuncTimeout);\r\n            Store.countfuncTimeout = setTimeout(function() {\r\n                countfunc();\r\n            }, 0);\r\n\r\n            //格式刷\r\n            if (menuButton.luckysheetPaintModelOn) {\r\n                selection.pasteHandlerOfPaintModel(Store.luckysheet_copy_save);\r\n\r\n                if (menuButton.luckysheetPaintSingle) {\r\n                    //单次 格式刷\r\n                    menuButton.cancelPaintModel();\r\n                }\r\n            }\r\n        }\r\n\r\n        Store.luckysheet_select_status = false;\r\n        window.cancelAnimationFrame(Store.jfautoscrollTimeout);\r\n        Store.luckysheet_scroll_status = false;\r\n\r\n        $(\"#luckysheet-cell-selected\")\r\n            .find(\".luckysheet-cs-fillhandle\")\r\n            .css(\"cursor\", \"crosshair\")\r\n            .end()\r\n            .find(\".luckysheet-cs-draghandle\")\r\n            .css(\"cursor\", \"move\");\r\n        $(\"#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0\").css(\"cursor\", \"default\");\r\n\r\n        //行标题窗格主体\r\n        Store.luckysheet_rows_selected_status = false;\r\n\r\n        //列标题窗格主体\r\n        Store.luckysheet_cols_selected_status = false;\r\n\r\n        Store.luckysheet_model_move_state = false;\r\n\r\n        if (formula.functionResizeStatus) {\r\n            formula.functionResizeStatus = false;\r\n            $(\"#luckysheet-wa-calculate-size\").removeAttr(\"style\");\r\n        }\r\n\r\n        if (!!luckysheetFreezen.horizontalmovestate) {\r\n            luckysheetFreezen.horizontalmovestate = false;\r\n            $(\"#luckysheet-freezebar-horizontal\").removeClass(\"luckysheet-freezebar-active\");\r\n            $(\"#luckysheet-freezebar-horizontal\")\r\n                .find(\".luckysheet-freezebar-horizontal-handle\")\r\n                .css(\"cursor\", \"-webkit-grab\");\r\n            if (luckysheetFreezen.freezenhorizontaldata[4] <= Store.columnHeaderHeight) {\r\n                luckysheetFreezen.cancelFreezenHorizontal();\r\n            }\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n\r\n        if (!!luckysheetFreezen.verticalmovestate) {\r\n            luckysheetFreezen.verticalmovestate = false;\r\n            $(\"#luckysheet-freezebar-vertical\").removeClass(\"luckysheet-freezebar-active\");\r\n            $(\"#luckysheet-freezebar-vertical\")\r\n                .find(\".luckysheet-freezebar-vertical-handle\")\r\n                .css(\"cursor\", \"-webkit-grab\");\r\n            if (luckysheetFreezen.freezenverticaldata[4] <= Store.rowHeaderWidth) {\r\n                luckysheetFreezen.cancelFreezenVertical();\r\n            }\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n\r\n        if (!!pivotTable && pivotTable.movestate) {\r\n            $(\"#luckysheet-modal-dialog-slider-pivot-move\").remove();\r\n            pivotTable.movestate = false;\r\n            $(\r\n                \"#luckysheet-modal-dialog-pivotTable-list, #luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\",\r\n            ).css(\"cursor\", \"default\");\r\n            if (pivotTable.movesave.containerid != \"luckysheet-modal-dialog-pivotTable-list\") {\r\n                let $cur = $(event.target).closest(\".luckysheet-modal-dialog-slider-config-list\");\r\n                if ($cur.length == 0) {\r\n                    if (pivotTable.movesave.containerid == \"luckysheet-modal-dialog-config-value\") {\r\n                        pivotTable.resetOrderby(pivotTable.movesave.obj);\r\n                    }\r\n\r\n                    pivotTable.movesave.obj.remove();\r\n                    pivotTable.showvaluecolrow();\r\n                    $(\"#luckysheet-modal-dialog-pivotTable-list\")\r\n                        .find(\".luckysheet-modal-dialog-slider-list-item\")\r\n                        .each(function() {\r\n                            $(this)\r\n                                .find(\".luckysheet-slider-list-item-selected\")\r\n                                .find(\"i\")\r\n                                .remove();\r\n                        });\r\n\r\n                    $(\r\n                        \"#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\",\r\n                    )\r\n                        .find(\".luckysheet-modal-dialog-slider-config-item\")\r\n                        .each(function() {\r\n                            let index = $(this).data(\"index\");\r\n\r\n                            $(\"#luckysheet-modal-dialog-pivotTable-list\")\r\n                                .find(\".luckysheet-modal-dialog-slider-list-item\")\r\n                                .each(function() {\r\n                                    let $seleted = $(this).find(\".luckysheet-slider-list-item-selected\");\r\n                                    if ($(this).data(\"index\") == index && $seleted.find(\"i\").length == 0) {\r\n                                        $seleted.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n                                    }\r\n                                });\r\n                        });\r\n\r\n                    pivotTable.refreshPivotTable();\r\n                }\r\n            }\r\n        }\r\n\r\n        if (Store.luckysheet_sheet_move_status) {\r\n            Store.luckysheet_sheet_move_status = false;\r\n            Store.luckysheet_sheet_move_data.activeobject.insertBefore($(\"#luckysheet-sheets-item-clone\"));\r\n            Store.luckysheet_sheet_move_data.activeobject.removeAttr(\"style\");\r\n            $(\"#luckysheet-sheets-item-clone\").remove();\r\n            Store.luckysheet_sheet_move_data.cursorobject.css({ cursor: \"pointer\" });\r\n            Store.luckysheet_sheet_move_data = {};\r\n            sheetmanage.reOrderAllSheet();\r\n        }\r\n\r\n        // chart move debounce timer clear\r\n        clearTimeout(Store.chartparam.luckysheetCurrentChartMoveTimeout);\r\n\r\n        //图表拖动 chartMix\r\n        if (!!Store.chartparam.luckysheetCurrentChartMove) {\r\n            Store.chartparam.luckysheetCurrentChartMove = false;\r\n            if (Store.chartparam.luckysheetInsertChartTosheetChange) {\r\n                //myTop, myLeft: 本次的chart框位置，scrollLeft,scrollTop: 上一次的滚动条位置\r\n                var myTop = Store.chartparam.luckysheetCurrentChartMoveObj.css(\"top\"),\r\n                    myLeft = Store.chartparam.luckysheetCurrentChartMoveObj.css(\"left\"),\r\n                    scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(),\r\n                    scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                //点击时候存储的信息，即上一次操作结束的图表信息，x,y: chart框位置，scrollLeft1,scrollTop1: 滚动条位置\r\n                var x = Store.chartparam.luckysheetCurrentChartMoveXy[2];\r\n                var y = Store.chartparam.luckysheetCurrentChartMoveXy[3];\r\n\r\n                var scrollLeft1 = Store.chartparam.luckysheetCurrentChartMoveXy[4];\r\n                var scrollTop1 = Store.chartparam.luckysheetCurrentChartMoveXy[5];\r\n\r\n                var chart_id = Store.chartparam.luckysheetCurrentChartMoveObj\r\n                    .find(\".luckysheet-modal-dialog-content\")\r\n                    .attr(\"id\");\r\n\r\n                //去除chartobj,改用chart_id代替即可定位到此图表\r\n                Store.jfredo.push({\r\n                    type: \"moveChart\",\r\n                    chart_id: chart_id,\r\n                    sheetIndex: Store.currentSheetIndex,\r\n                    myTop: myTop,\r\n                    myLeft: myLeft,\r\n                    scrollTop: scrollTop,\r\n                    scrollLeft: scrollLeft,\r\n                    x: x,\r\n                    y: y,\r\n                    scrollTop1: scrollTop1,\r\n                    scrollLeft1: scrollLeft1,\r\n                });\r\n\r\n                // luckysheet.sheetmanage.saveChart({ \"chart_id\": chart_id, \"sheetIndex\": sheetIndex, \"top\": myTop, \"left\": myLeft });\r\n                //存储滚动条位置//协同编辑时可能影响用户操作，可以考虑不存储滚动条位置,或者滚动条信息仅仅保存到后台，但是不分发到其他设备（google sheet没有存储滚动条位置）\r\n                // Store.server.saveParam(\"c\", sheetIndex, { \"left\":myLeft, \"top\":myTop,\"scrollTop\": scrollTop, \"scrollLeft\": scrollLeft }, { \"op\":\"xy\", \"cid\": chart_id});\r\n            }\r\n        }\r\n\r\n        //图表改变大小 chartMix\r\n        if (!!Store.chartparam.luckysheetCurrentChartResize) {\r\n            Store.chartparam.luckysheetCurrentChartResize = null;\r\n            if (Store.chartparam.luckysheetInsertChartTosheetChange) {\r\n                var myHeight = Store.chartparam.luckysheetCurrentChartResizeObj.height(),\r\n                    myWidth = Store.chartparam.luckysheetCurrentChartResizeObj.width(),\r\n                    scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(),\r\n                    scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n                var myTop = Store.chartparam.luckysheetCurrentChartMoveObj.css(\"top\"),\r\n                    myLeft = Store.chartparam.luckysheetCurrentChartMoveObj.css(\"left\");\r\n\r\n                var chart_id = Store.chartparam.luckysheetCurrentChartResizeObj\r\n                    .find(\".luckysheet-modal-dialog-content\")\r\n                    .attr(\"id\");\r\n\r\n                var myWidth1 = Store.chartparam.luckysheetCurrentChartResizeXy[2];\r\n                var myHeight1 = Store.chartparam.luckysheetCurrentChartResizeXy[3];\r\n                var x = Store.chartparam.luckysheetCurrentChartResizeXy[4]; //增加上一次的位置x，y\r\n                var y = Store.chartparam.luckysheetCurrentChartResizeXy[5];\r\n                var scrollLeft1 = Store.chartparam.luckysheetCurrentChartResizeXy[6];\r\n                var scrollTop1 = Store.chartparam.luckysheetCurrentChartResizeXy[7];\r\n\r\n                Store.jfredo.push({\r\n                    type: \"resizeChart\",\r\n                    chart_id: chart_id,\r\n                    sheetIndex: Store.currentSheetIndex,\r\n                    myTop: myTop,\r\n                    myLeft: myLeft,\r\n                    myHeight: myHeight,\r\n                    myWidth: myWidth,\r\n                    scrollTop: scrollTop,\r\n                    scrollLeft: scrollLeft,\r\n                    x: x,\r\n                    y: y,\r\n                    myWidth1: myWidth1,\r\n                    myHeight1: myHeight1,\r\n                    scrollTop1: scrollTop1,\r\n                    scrollLeft1: scrollLeft1,\r\n                });\r\n\r\n                //加上滚动条的位置\r\n                // luckysheet.sheetmanage.saveChart({ \"chart_id\": chart_id, \"sheetIndex\": sheetIndex, \"height\": myHeight, \"width\": myWidth, \"top\": myTop, \"left\": myLeft, \"scrollTop\": scrollTop, \"scrollLeft\": scrollLeft });\r\n\r\n                // Store.server.saveParam(\"c\", sheetIndex, { \"width\":myWidth, \"height\":myHeight, \"top\": myTop, \"left\": myLeft, \"scrollTop\": scrollTop, \"scrollLeft\": scrollLeft}, { \"op\":\"wh\", \"cid\": chart_id});\r\n            }\r\n        }\r\n\r\n        if (!!formula.rangeResize) {\r\n            formula.rangeResizeDragged(\r\n                event,\r\n                formula.rangeResizeObj,\r\n                formula.rangeResize,\r\n                formula.rangeResizexy,\r\n                formula.rangeResizeWinW,\r\n                formula.rangeResizeWinH,\r\n            );\r\n        }\r\n\r\n        //image move\r\n        if (imageCtrl.move) {\r\n            imageCtrl.moveImgItem();\r\n        }\r\n\r\n        //image resize\r\n        if (imageCtrl.resize) {\r\n            imageCtrl.resizeImgItem();\r\n        }\r\n\r\n        //image cropChange\r\n        if (imageCtrl.cropChange) {\r\n            imageCtrl.cropChangeImgItem();\r\n        }\r\n\r\n        //批注框 移动\r\n        if (luckysheetPostil.move) {\r\n            luckysheetPostil.move = false;\r\n\r\n            let ps_id = luckysheetPostil.currentObj.closest(\".luckysheet-postil-show\").attr(\"id\");\r\n\r\n            let ps_r = ps_id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n            let ps_c = ps_id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let rc = [];\r\n\r\n            d[ps_r][ps_c].ps.left = luckysheetPostil.currentObj.position().left;\r\n            d[ps_r][ps_c].ps.top = luckysheetPostil.currentObj.position().top;\r\n            d[ps_r][ps_c].ps.value = luckysheetPostil.currentObj\r\n                .find(\".formulaInputFocus\")\r\n                .html()\r\n                .replaceAll(\"<div>\", \"\\n\")\r\n                .replaceAll(/<(.*)>.*?|<(.*) \\/>/g, \"\")\r\n                .trim();\r\n\r\n            rc.push(ps_r + \"_\" + ps_c);\r\n\r\n            luckysheetPostil.ref(d, rc);\r\n\r\n            $(\"#\" + ps_id).remove();\r\n\r\n            if (d[ps_r][ps_c].ps.isshow) {\r\n                luckysheetPostil.buildPs(ps_r, ps_c, d[ps_r][ps_c].ps);\r\n                $(\"#\" + ps_id).addClass(\"luckysheet-postil-show-active\");\r\n                $(\"#\" + ps_id)\r\n                    .find(\".luckysheet-postil-dialog-resize\")\r\n                    .show();\r\n            } else {\r\n                luckysheetPostil.editPs(ps_r, ps_c);\r\n            }\r\n        }\r\n\r\n        //批注框 改变大小\r\n        if (!!luckysheetPostil.resize) {\r\n            luckysheetPostil.resize = null;\r\n\r\n            let ps_id = luckysheetPostil.currentObj.closest(\".luckysheet-postil-show\").attr(\"id\");\r\n\r\n            let ps_r = ps_id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n            let ps_c = ps_id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let rc = [];\r\n\r\n            d[ps_r][ps_c].ps.left = luckysheetPostil.currentObj.position().left;\r\n            d[ps_r][ps_c].ps.top = luckysheetPostil.currentObj.position().top;\r\n            d[ps_r][ps_c].ps.width = luckysheetPostil.currentObj.outerWidth();\r\n            d[ps_r][ps_c].ps.height = luckysheetPostil.currentObj.outerHeight();\r\n            d[ps_r][ps_c].ps.value = luckysheetPostil.currentObj\r\n                .find(\".formulaInputFocus\")\r\n                .html()\r\n                .replaceAll(\"<div>\", \"\\n\")\r\n                .replaceAll(/<(.*)>.*?|<(.*) \\/>/g, \"\")\r\n                .trim();\r\n\r\n            rc.push(ps_r + \"_\" + ps_c);\r\n\r\n            luckysheetPostil.ref(d, rc);\r\n\r\n            $(\"#\" + ps_id).remove();\r\n\r\n            if (d[ps_r][ps_c].ps.isshow) {\r\n                luckysheetPostil.buildPs(ps_r, ps_c, d[ps_r][ps_c].ps);\r\n                $(\"#\" + ps_id).addClass(\"luckysheet-postil-show-active\");\r\n                $(\"#\" + ps_id)\r\n                    .find(\".luckysheet-postil-dialog-resize\")\r\n                    .show();\r\n            } else {\r\n                luckysheetPostil.editPs(ps_r, ps_c);\r\n            }\r\n        }\r\n\r\n        //改变行高\r\n        if (Store.luckysheet_rows_change_size) {\r\n            Store.luckysheet_rows_change_size = false;\r\n\r\n            $(\"#luckysheet-change-size-line\").hide();\r\n            $(\"#luckysheet-rows-change-size\").css(\"opacity\", 0);\r\n            $(\"#luckysheet-sheettable, #luckysheet-rows-h, #luckysheet-rows-h canvas\").css(\"cursor\", \"default\");\r\n\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let scrollTop = $(\"#luckysheet-rows-h\").scrollTop();\r\n            let y = mouse[1] + scrollTop;\r\n            let winH = $(window).height();\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n\r\n            let size = y + 3 - Store.luckysheet_rows_change_size_start[0];\r\n\r\n            if (y + 3 - Store.luckysheet_rows_change_size_start[0] < 19) {\r\n                size = 19;\r\n            }\r\n\r\n            if (y >= winH - 200 + scrollTop) {\r\n                size = winH - 200 - Store.luckysheet_rows_change_size_start[0] + scrollTop;\r\n            }\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if (cfg[\"rowlen\"] == null) {\r\n                cfg[\"rowlen\"] = {};\r\n            }\r\n\r\n            if (cfg[\"customHeight\"] == null) {\r\n                cfg[\"customHeight\"] = {};\r\n            }\r\n\r\n            cfg[\"customHeight\"][Store.luckysheet_rows_change_size_start[1]] = 1;\r\n\r\n            const changeRowIndex = Store.luckysheet_rows_change_size_start[1];\r\n            let changeRowSelected = false;\r\n            if (Store[\"luckysheet_select_save\"].length > 0) {\r\n                Store[\"luckysheet_select_save\"]\r\n                    .filter((select) => select.row_select)\r\n                    .some((select) => {\r\n                        if (changeRowIndex >= select.row[0] && changeRowIndex <= select.row[1]) {\r\n                            changeRowSelected = true;\r\n                        }\r\n                        return changeRowSelected;\r\n                    });\r\n            }\r\n            if (changeRowSelected) {\r\n                Store[\"luckysheet_select_save\"]\r\n                    .filter((select) => select.row_select)\r\n                    .forEach((select) => {\r\n                        for (let r = select.row[0]; r <= select.row[1]; r++) {\r\n                            cfg[\"rowlen\"][r] = Math.ceil(size / Store.zoomRatio);\r\n                        }\r\n                    });\r\n            } else {\r\n                cfg[\"rowlen\"][Store.luckysheet_rows_change_size_start[1]] = Math.ceil(size / Store.zoomRatio);\r\n            }\r\n\r\n            let images = imageCtrl.moveChangeSize(\"row\", Store.luckysheet_rows_change_size_start[1], size);\r\n\r\n            if (Store.clearjfundo) {\r\n                Store.jfundo.length = 0;\r\n\r\n                Store.jfredo.push({\r\n                    type: \"resize\",\r\n                    ctrlType: \"resizeR\",\r\n                    sheetIndex: Store.currentSheetIndex,\r\n                    config: $.extend(true, {}, Store.config),\r\n                    curconfig: $.extend(true, {}, cfg),\r\n                    images: $.extend(true, {}, imageCtrl.images),\r\n                    curImages: $.extend(true, {}, images),\r\n                });\r\n            }\r\n\r\n            //config\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowlen\"], { k: \"rowlen\" });\r\n\r\n            //images\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].images = images;\r\n            server.saveParam(\"all\", Store.currentSheetIndex, images, { k: \"images\" });\r\n            imageCtrl.images = images;\r\n            imageCtrl.allImagesShow();\r\n\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, null);\r\n        }\r\n\r\n        //改变列宽\r\n        if (Store.luckysheet_cols_change_size) {\r\n            Store.luckysheet_cols_change_size = false;\r\n            $(\"#luckysheet-change-size-line\").hide();\r\n            $(\"#luckysheet-cols-change-size\").css(\"opacity\", 0);\r\n            $(\r\n                \"#luckysheet-sheettable, #luckysheet-cols-h-c, .luckysheet-cols-h-cells, .luckysheet-cols-h-cells canvas\",\r\n            ).css(\"cursor\", \"default\");\r\n\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let scrollLeft = $(\"#luckysheet-cols-h-c\").scrollLeft();\r\n            let x = mouse[0] + scrollLeft;\r\n            let winW = $(window).width();\r\n\r\n            let row_index = Store.visibledatarow.length - 1,\r\n                row = Store.visibledatarow[row_index],\r\n                row_pre = 0;\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n            let size = x + 3 - Store.luckysheet_cols_change_size_start[0];\r\n\r\n            let firstcolumnlen = Store.defaultcollen;\r\n            if (\r\n                Store.config[\"columnlen\"] != null &&\r\n                Store.config[\"columnlen\"][Store.luckysheet_cols_change_size_start[1]] != null\r\n            ) {\r\n                firstcolumnlen = Store.config[\"columnlen\"][Store.luckysheet_cols_change_size_start[1]];\r\n            }\r\n\r\n            if (Math.abs(size - firstcolumnlen) < 3) {\r\n                return;\r\n            }\r\n            if (x + 3 - Store.luckysheet_cols_change_size_start[0] < 30) {\r\n                size = 30;\r\n            }\r\n\r\n            if (x >= winW - 100 + scrollLeft) {\r\n                size = winW - 100 - Store.luckysheet_cols_change_size_start[0] + scrollLeft;\r\n            }\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if (cfg[\"columnlen\"] == null) {\r\n                cfg[\"columnlen\"] = {};\r\n            }\r\n\r\n            if (cfg[\"customWidth\"] == null) {\r\n                cfg[\"customWidth\"] = {};\r\n            }\r\n\r\n            cfg[\"customWidth\"][Store.luckysheet_cols_change_size_start[1]] = 1;\r\n\r\n            const changeColumnIndex = Store.luckysheet_cols_change_size_start[1];\r\n            let changeColumnSelected = false;\r\n            if (Store[\"luckysheet_select_save\"].length > 0) {\r\n                Store[\"luckysheet_select_save\"]\r\n                    .filter((select) => select.column_select)\r\n                    .some((select) => {\r\n                        if (changeColumnIndex >= select.column[0] && changeColumnIndex <= select.column[1]) {\r\n                            changeColumnSelected = true;\r\n                        }\r\n                        return changeColumnSelected;\r\n                    });\r\n            }\r\n            if (changeColumnSelected) {\r\n                Store[\"luckysheet_select_save\"]\r\n                    .filter((select) => select.column_select)\r\n                    .forEach((select) => {\r\n                        for (let r = select.column[0]; r <= select.column[1]; r++) {\r\n                            cfg[\"columnlen\"][r] = Math.ceil(size / Store.zoomRatio);\r\n                        }\r\n                    });\r\n            } else {\r\n                cfg[\"columnlen\"][Store.luckysheet_cols_change_size_start[1]] = Math.ceil(size / Store.zoomRatio);\r\n            }\r\n\r\n            let images = imageCtrl.moveChangeSize(\"column\", Store.luckysheet_cols_change_size_start[1], size);\r\n\r\n            if (Store.clearjfundo) {\r\n                Store.jfundo.length = 0;\r\n\r\n                Store.jfredo.push({\r\n                    type: \"resize\",\r\n                    ctrlType: \"resizeC\",\r\n                    sheetIndex: Store.currentSheetIndex,\r\n                    config: $.extend(true, {}, Store.config),\r\n                    curconfig: $.extend(true, {}, cfg),\r\n                    images: $.extend(true, {}, imageCtrl.images),\r\n                    curImages: $.extend(true, {}, images),\r\n                });\r\n            }\r\n\r\n            //config\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"columnlen\"], { k: \"columnlen\" });\r\n\r\n            //images\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].images = images;\r\n            server.saveParam(\"all\", Store.currentSheetIndex, images, { k: \"images\" });\r\n            imageCtrl.images = images;\r\n            imageCtrl.allImagesShow();\r\n\r\n            jfrefreshgrid_rhcw(null, Store.flowdata[0].length);\r\n\r\n            setTimeout(function() {\r\n                luckysheetrefreshgrid();\r\n            }, 1);\r\n        }\r\n\r\n        if (formula.rangeMove) {\r\n            formula.rangeMoveDragged(formula.rangeMoveObj);\r\n        }\r\n\r\n        //改变选择框的位置并替换目标单元格\r\n        if (Store.luckysheet_cell_selected_move) {\r\n            $(\"#luckysheet-cell-selected-move\").hide();\r\n\r\n            Store.luckysheet_cell_selected_move = false;\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n\r\n            if (!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)) {\r\n                return;\r\n            }\r\n\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let x = mouse[0] + scrollLeft;\r\n            let y = mouse[1] + scrollTop;\r\n\r\n            let winH = $(window).height() + scrollTop - Store.sheetBarHeight - Store.statisticBarHeight,\r\n                winW = $(window).width() + scrollLeft;\r\n\r\n            let row_index = rowLocation(y)[2];\r\n            let col_index = colLocation(x)[2];\r\n\r\n            let row_index_original = Store.luckysheet_cell_selected_move_index[0],\r\n                col_index_original = Store.luckysheet_cell_selected_move_index[1];\r\n\r\n            if (row_index == row_index_original && col_index == col_index_original) {\r\n                return;\r\n            }\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n            let data = getdatabyselection(last);\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if (cfg[\"merge\"] == null) {\r\n                cfg[\"merge\"] = {};\r\n            }\r\n            if (cfg[\"rowlen\"] == null) {\r\n                cfg[\"rowlen\"] = {};\r\n            }\r\n\r\n            //选区包含部分单元格\r\n            if (hasPartMC(cfg, last[\"row\"][0], last[\"row\"][1], last[\"column\"][0], last[\"column\"][1])) {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMerge);\r\n                } else {\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', locale_drag.noMerge);\r\n                }\r\n                return;\r\n            }\r\n\r\n            let row_s = last[\"row\"][0] - row_index_original + row_index,\r\n                row_e = last[\"row\"][1] - row_index_original + row_index;\r\n            let col_s = last[\"column\"][0] - col_index_original + col_index,\r\n                col_e = last[\"column\"][1] - col_index_original + col_index;\r\n\r\n            if (\r\n                !checkProtectionLockedRangeList(\r\n                    [{ row: [row_s, row_e], column: [col_s, col_e] }],\r\n                    Store.currentSheetIndex,\r\n                )\r\n            ) {\r\n                return;\r\n            }\r\n\r\n            if (row_s < 0 || y < 0) {\r\n                row_s = 0;\r\n                row_e = last[\"row\"][1] - last[\"row\"][0];\r\n            }\r\n\r\n            if (col_s < 0 || x < 0) {\r\n                col_s = 0;\r\n                col_e = last[\"column\"][1] - last[\"column\"][0];\r\n            }\r\n\r\n            if (row_e >= Store.visibledatarow[Store.visibledatarow.length - 1] || y > winH) {\r\n                row_s = Store.visibledatarow.length - 1 - last[\"row\"][1] + last[\"row\"][0];\r\n                row_e = Store.visibledatarow.length - 1;\r\n            }\r\n\r\n            if (col_e >= Store.visibledatacolumn[Store.visibledatacolumn.length - 1] || x > winW) {\r\n                col_s = Store.visibledatacolumn.length - 1 - last[\"column\"][1] + last[\"column\"][0];\r\n                col_e = Store.visibledatacolumn.length - 1;\r\n            }\r\n\r\n            //替换的位置包含部分单元格\r\n            if (hasPartMC(cfg, row_s, row_e, col_s, col_e)) {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMerge);\r\n                } else {\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', locale_drag.noMerge);\r\n                }\r\n                return;\r\n            }\r\n\r\n            let borderInfoCompute = getBorderInfoCompute(Store.currentSheetIndex);\r\n\r\n            //删除原本位置的数据\r\n            let RowlChange = null;\r\n            for (let r = last[\"row\"][0]; r <= last[\"row\"][1]; r++) {\r\n                if (r in cfg[\"rowlen\"]) {\r\n                    RowlChange = true;\r\n                }\r\n\r\n                for (let c = last[\"column\"][0]; c <= last[\"column\"][1]; c++) {\r\n                    let cell = d[r][c];\r\n\r\n                    if (getObjType(cell) == \"object\" && \"mc\" in cell) {\r\n                        if (cell[\"mc\"].r + \"_\" + cell[\"mc\"].c in cfg[\"merge\"]) {\r\n                            delete cfg[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n                        }\r\n                    }\r\n\r\n                    d[r][c] = null;\r\n                }\r\n            }\r\n\r\n            //边框\r\n            if (cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0) {\r\n                let borderInfo = [];\r\n\r\n                for (let i = 0; i < cfg[\"borderInfo\"].length; i++) {\r\n                    let bd_rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n                    if (bd_rangeType == \"range\") {\r\n                        let bd_range = cfg[\"borderInfo\"][i].range;\r\n                        let bd_emptyRange = [];\r\n\r\n                        for (let j = 0; j < bd_range.length; j++) {\r\n                            bd_emptyRange = bd_emptyRange.concat(\r\n                                conditionformat.CFSplitRange(\r\n                                    bd_range[j],\r\n                                    { row: last[\"row\"], column: last[\"column\"] },\r\n                                    { row: [row_s, row_e], column: [col_s, col_e] },\r\n                                    \"restPart\",\r\n                                ),\r\n                            );\r\n                        }\r\n\r\n                        cfg[\"borderInfo\"][i].range = bd_emptyRange;\r\n\r\n                        borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                    } else if (bd_rangeType == \"cell\") {\r\n                        let bd_r = cfg[\"borderInfo\"][i].value.row_index;\r\n                        let bd_c = cfg[\"borderInfo\"][i].value.col_index;\r\n\r\n                        if (\r\n                            !(\r\n                                bd_r >= last[\"row\"][0] &&\r\n                                bd_r <= last[\"row\"][1] &&\r\n                                bd_c >= last[\"column\"][0] &&\r\n                                bd_c <= last[\"column\"][1]\r\n                            )\r\n                        ) {\r\n                            borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                cfg[\"borderInfo\"] = borderInfo;\r\n            }\r\n            //替换位置数据更新\r\n            let offsetMC = {};\r\n            for (let r = 0; r < data.length; r++) {\r\n                for (let c = 0; c < data[0].length; c++) {\r\n                    if (borderInfoCompute[r + last[\"row\"][0] + \"_\" + (c + last[\"column\"][0])]) {\r\n                        let bd_obj = {\r\n                            rangeType: \"cell\",\r\n                            value: {\r\n                                row_index: r + row_s,\r\n                                col_index: c + col_s,\r\n                                l: borderInfoCompute[r + last[\"row\"][0] + \"_\" + (c + last[\"column\"][0])].l,\r\n                                r: borderInfoCompute[r + last[\"row\"][0] + \"_\" + (c + last[\"column\"][0])].r,\r\n                                t: borderInfoCompute[r + last[\"row\"][0] + \"_\" + (c + last[\"column\"][0])].t,\r\n                                b: borderInfoCompute[r + last[\"row\"][0] + \"_\" + (c + last[\"column\"][0])].b,\r\n                            },\r\n                        };\r\n\r\n                        if (cfg[\"borderInfo\"] == null) {\r\n                            cfg[\"borderInfo\"] = [];\r\n                        }\r\n\r\n                        cfg[\"borderInfo\"].push(bd_obj);\r\n                    }\r\n\r\n                    let value = \"\";\r\n                    if (data[r] != null && data[r][c] != null) {\r\n                        value = data[r][c];\r\n                    }\r\n\r\n                    if (getObjType(value) == \"object\" && \"mc\" in value) {\r\n                        let mc = $.extend(true, {}, value[\"mc\"]);\r\n                        if (\"rs\" in value[\"mc\"]) {\r\n                            offsetMC[mc.r + \"_\" + mc.c] = [r + row_s, c + col_s];\r\n\r\n                            value[\"mc\"].r = r + row_s;\r\n                            value[\"mc\"].c = c + col_s;\r\n\r\n                            cfg[\"merge\"][r + row_s + \"_\" + (c + col_s)] = value[\"mc\"];\r\n                        } else {\r\n                            value[\"mc\"].r = offsetMC[mc.r + \"_\" + mc.c][0];\r\n                            value[\"mc\"].c = offsetMC[mc.r + \"_\" + mc.c][1];\r\n                        }\r\n                    }\r\n                    d[r + row_s][c + col_s] = value;\r\n                }\r\n            }\r\n\r\n            if (RowlChange) {\r\n                cfg = rowlenByRange(d, last[\"row\"][0], last[\"row\"][1], cfg);\r\n                cfg = rowlenByRange(d, row_s, row_e, cfg);\r\n            }\r\n\r\n            //条件格式\r\n            let cdformat = $.extend(\r\n                true,\r\n                [],\r\n                Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"],\r\n            );\r\n            if (cdformat != null && cdformat.length > 0) {\r\n                for (let i = 0; i < cdformat.length; i++) {\r\n                    let cdformat_cellrange = cdformat[i].cellrange;\r\n                    let emptyRange = [];\r\n                    for (let j = 0; j < cdformat_cellrange.length; j++) {\r\n                        let range = conditionformat.CFSplitRange(\r\n                            cdformat_cellrange[j],\r\n                            { row: last[\"row\"], column: last[\"column\"] },\r\n                            { row: [row_s, row_e], column: [col_s, col_e] },\r\n                            \"allPart\",\r\n                        );\r\n                        emptyRange = emptyRange.concat(range);\r\n                    }\r\n                    cdformat[i].cellrange = emptyRange;\r\n                }\r\n            }\r\n\r\n            let rf;\r\n            if (Store.luckysheet_select_save[0].row_focus == Store.luckysheet_select_save[0].row[0]) {\r\n                rf = row_s;\r\n            } else {\r\n                rf = row_e;\r\n            }\r\n\r\n            let cf;\r\n            if (Store.luckysheet_select_save[0].column_focus == Store.luckysheet_select_save[0].column[0]) {\r\n                cf = col_s;\r\n            } else {\r\n                cf = col_e;\r\n            }\r\n\r\n            let range = [];\r\n            range.push({ row: last[\"row\"], column: last[\"column\"] });\r\n            range.push({ row: [row_s, row_e], column: [col_s, col_e] });\r\n\r\n            last[\"row\"] = [row_s, row_e];\r\n            last[\"column\"] = [col_s, col_e];\r\n            last[\"row_focus\"] = rf;\r\n            last[\"column_focus\"] = cf;\r\n\r\n            let allParam = {\r\n                cfg: cfg,\r\n                RowlChange: RowlChange,\r\n                cdformat: cdformat,\r\n            };\r\n\r\n            jfrefreshgrid(d, range, allParam);\r\n\r\n            selectHightlightShow();\r\n\r\n            $(\"#luckysheet-sheettable\").css(\"cursor\", \"default\");\r\n            clearTimeout(Store.countfuncTimeout);\r\n            Store.countfuncTimeout = setTimeout(function() {\r\n                countfunc();\r\n            }, 500);\r\n        }\r\n\r\n        //图表选区拖拽移动\r\n        if (Store.chart_selection.rangeMove) {\r\n            Store.chart_selection.rangeMoveDragged();\r\n        }\r\n\r\n        //图表选区拖拽拉伸\r\n        if (!!Store.chart_selection.rangeResize) {\r\n            Store.chart_selection.rangeResizeDragged();\r\n        }\r\n\r\n        //选区下拉\r\n        if (Store.luckysheet_cell_selected_extend) {\r\n            Store.luckysheet_cell_selected_extend = false;\r\n            $(\"#luckysheet-cell-selected-extend\").hide();\r\n\r\n            if (!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)) {\r\n                return;\r\n            }\r\n\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let x = mouse[0] + scrollLeft - 5;\r\n            let y = mouse[1] + scrollTop - 5;\r\n\r\n            let winH = $(window).height() + scrollTop - Store.sheetBarHeight - Store.statisticBarHeight,\r\n                winW = $(window).width() + scrollLeft;\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n\r\n            let row_index_original = Store.luckysheet_cell_selected_extend_index[0],\r\n                col_index_original = Store.luckysheet_cell_selected_extend_index[1];\r\n\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n            let row_s = last[\"row\"][0],\r\n                row_e = last[\"row\"][1];\r\n            let col_s = last[\"column\"][0],\r\n                col_e = last[\"column\"][1];\r\n\r\n            if (row_s < 0 || y < 0) {\r\n                row_s = 0;\r\n                row_e = last[\"row\"][1] - last[\"row\"][0];\r\n            }\r\n\r\n            if (col_s < 0 || x < 0) {\r\n                col_s = 0;\r\n                col_e = last[\"column\"][1] - last[\"column\"][0];\r\n            }\r\n\r\n            if (row_e >= Store.visibledatarow[Store.visibledatarow.length - 1] || y > winH) {\r\n                row_s = Store.visibledatarow.length - 1 - last[\"row\"][1] + last[\"row\"][0];\r\n                row_e = Store.visibledatarow.length - 1;\r\n            }\r\n\r\n            if (col_e >= Store.visibledatacolumn[Store.visibledatacolumn.length - 1] || x > winW) {\r\n                col_s = Store.visibledatacolumn.length - 1 - last[\"column\"][1] + last[\"column\"][0];\r\n                col_e = Store.visibledatacolumn.length - 1;\r\n            }\r\n\r\n            //复制范围\r\n            luckysheetDropCell.copyRange = {\r\n                row: $.extend(true, [], last[\"row\"]),\r\n                column: $.extend(true, [], last[\"column\"]),\r\n            };\r\n            //applyType\r\n            let typeItemHide = luckysheetDropCell.typeItemHide();\r\n\r\n            if (\r\n                !typeItemHide[0] &&\r\n                !typeItemHide[1] &&\r\n                !typeItemHide[2] &&\r\n                !typeItemHide[3] &&\r\n                !typeItemHide[4] &&\r\n                !typeItemHide[5] &&\r\n                !typeItemHide[6]\r\n            ) {\r\n                luckysheetDropCell.applyType = \"0\";\r\n            } else {\r\n                luckysheetDropCell.applyType = \"1\";\r\n            }\r\n\r\n            if (Math.abs(row_index_original - row_index) > Math.abs(col_index_original - col_index)) {\r\n                if (!(row_index >= row_s && row_index <= row_e)) {\r\n                    if (Store.luckysheet_select_save[0].top_move >= row_pre) {\r\n                        //当往上拖拽时\r\n                        luckysheetDropCell.applyRange = {\r\n                            row: [row_index, last[\"row\"][0] - 1],\r\n                            column: last[\"column\"],\r\n                        };\r\n                        luckysheetDropCell.direction = \"up\";\r\n\r\n                        row_s -= last[\"row\"][0] - row_index;\r\n\r\n                        //是否有数据透视表范围\r\n                        if (pivotTable.isPivotRange(row_s, col_e)) {\r\n                            tooltip.info(locale_drag.affectPivot, \"\");\r\n                            return;\r\n                        }\r\n                    } else {\r\n                        //当往下拖拽时\r\n                        luckysheetDropCell.applyRange = {\r\n                            row: [last[\"row\"][1] + 1, row_index],\r\n                            column: last[\"column\"],\r\n                        };\r\n                        luckysheetDropCell.direction = \"down\";\r\n\r\n                        row_e += row_index - last[\"row\"][1];\r\n\r\n                        //是否有数据透视表范围\r\n                        if (pivotTable.isPivotRange(row_e, col_e)) {\r\n                            tooltip.info(locale_drag.affectPivot, \"\");\r\n                            return;\r\n                        }\r\n                    }\r\n                } else {\r\n                    return;\r\n                }\r\n            } else {\r\n                if (!(col_index >= col_s && col_index <= col_e)) {\r\n                    if (Store.luckysheet_select_save[0].left_move >= col_pre) {\r\n                        //当往左拖拽时\r\n                        luckysheetDropCell.applyRange = {\r\n                            row: last[\"row\"],\r\n                            column: [col_index, last[\"column\"][0] - 1],\r\n                        };\r\n                        luckysheetDropCell.direction = \"left\";\r\n\r\n                        col_s -= last[\"column\"][0] - col_index;\r\n\r\n                        //是否有数据透视表范围\r\n                        if (pivotTable.isPivotRange(row_e, col_s)) {\r\n                            tooltip.info(locale_drag.affectPivot, \"\");\r\n                            return;\r\n                        }\r\n                    } else {\r\n                        //当往右拖拽时\r\n                        luckysheetDropCell.applyRange = {\r\n                            row: last[\"row\"],\r\n                            column: [last[\"column\"][1] + 1, col_index],\r\n                        };\r\n                        luckysheetDropCell.direction = \"right\";\r\n\r\n                        col_e += col_index - last[\"column\"][1];\r\n\r\n                        //是否有数据透视表范围\r\n                        if (pivotTable.isPivotRange(row_e, col_e)) {\r\n                            tooltip.info(locale_drag.affectPivot, \"\");\r\n                            return;\r\n                        }\r\n                    }\r\n                } else {\r\n                    return;\r\n                }\r\n            }\r\n\r\n            if (Store.config[\"merge\"] != null) {\r\n                let hasMc = false;\r\n\r\n                for (let r = last[\"row\"][0]; r <= last[\"row\"][1]; r++) {\r\n                    for (let c = last[\"column\"][0]; c <= last[\"column\"][1]; c++) {\r\n                        let cell = Store.flowdata[r][c];\r\n\r\n                        if (cell != null && cell.mc != null) {\r\n                            hasMc = true;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (hasMc) {\r\n                    if (isEditMode()) {\r\n                        alert(locale_drag.noMerge);\r\n                    } else {\r\n                        tooltip.info(locale_drag.noMerge, \"\");\r\n                    }\r\n\r\n                    return;\r\n                }\r\n\r\n                for (let r = row_s; r <= row_e; r++) {\r\n                    for (let c = col_s; c <= col_e; c++) {\r\n                        let cell = Store.flowdata[r][c];\r\n\r\n                        if (cell != null && cell.mc != null) {\r\n                            hasMc = true;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (hasMc) {\r\n                    if (isEditMode()) {\r\n                        alert(locale_drag.noMerge);\r\n                    } else {\r\n                        tooltip.info(locale_drag.noMerge, \"\");\r\n                    }\r\n\r\n                    return;\r\n                }\r\n            }\r\n\r\n            last[\"row\"] = [row_s, row_e];\r\n            last[\"column\"] = [col_s, col_e];\r\n\r\n            luckysheetDropCell.update();\r\n            luckysheetDropCell.createIcon();\r\n\r\n            $(\"#luckysheet-cell-selected-move\").hide();\r\n\r\n            $(\"#luckysheet-sheettable\").css(\"cursor\", \"default\");\r\n            clearTimeout(Store.countfuncTimeout);\r\n            Store.countfuncTimeout = setTimeout(function() {\r\n                countfunc();\r\n            }, 500);\r\n        }\r\n    });\r\n\r\n    //禁止浏览器 右键默认菜单\r\n    $(\".luckysheet-grid-container, #luckysheet-rightclick-menu\").on(\"contextmenu\", function(e) {\r\n        e.preventDefault();\r\n    });\r\n\r\n    // //禁止前台编辑(只可 框选单元格、滚动查看表格)\r\n    // if(!Store.allowEdit){\r\n    //     return;\r\n    // }\r\n\r\n    //选区拖动替换\r\n    $(\"#luckysheet-cell-main div.luckysheet-cs-draghandle\").mousedown(function(event) {\r\n        if (isEditMode() || Store.allowEdit === false) {\r\n            //此模式下禁用选区拖动\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-cell-selected\")\r\n            .find(\".luckysheet-cs-fillhandle\")\r\n            .css(\"cursor\", \"move\")\r\n            .end()\r\n            .find(\".luckysheet-cs-draghandle\")\r\n            .css(\"cursor\", \"move\");\r\n        $(\"#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0\").css(\"cursor\", \"move\");\r\n\r\n        Store.luckysheet_cell_selected_move = true;\r\n        Store.luckysheet_scroll_status = true;\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n        let row_location = rowLocation(y),\r\n            row_pre = row_location[0],\r\n            row = row_location[1],\r\n            row_index = row_location[2];\r\n        let col_location = colLocation(x),\r\n            col_pre = col_location[0],\r\n            col = col_location[1],\r\n            col_index = col_location[2];\r\n\r\n        Store.luckysheet_cell_selected_move_index = [row_index, col_index];\r\n\r\n        $(\"#luckysheet-cell-selected-move\").css({\r\n            left: col_pre,\r\n            width: col - col_pre - 1,\r\n            top: row_pre,\r\n            height: row - row_pre - 1,\r\n            display: \"block\",\r\n        });\r\n\r\n        event.stopPropagation();\r\n    });\r\n\r\n    //选区下拉\r\n    $(\"#luckysheet-cell-main div.luckysheet-cs-fillhandle\")\r\n        .mousedown(function(event) {\r\n            if (isEditMode() || Store.allowEdit === false) {\r\n                //此模式下禁用选区下拉\r\n                return;\r\n            }\r\n\r\n            $(\"#luckysheet-cell-selected\")\r\n                .find(\".luckysheet-cs-fillhandle\")\r\n                .css(\"cursor\", \"crosshair\")\r\n                .end()\r\n                .find(\".luckysheet-cs-draghandle\")\r\n                .css(\"cursor\", \"crosshair\");\r\n            $(\"#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0\").css(\"cursor\", \"crosshair\");\r\n\r\n            Store.luckysheet_cell_selected_extend_time = setTimeout(function() {\r\n                Store.luckysheet_cell_selected_extend = true;\r\n                Store.luckysheet_scroll_status = true;\r\n\r\n                let mouse = mouseposition(event.pageX, event.pageY);\r\n                let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft() - 5;\r\n                let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop() - 5;\r\n\r\n                let row_location = rowLocation(y),\r\n                    row_pre = row_location[0],\r\n                    row = row_location[1],\r\n                    row_index = row_location[2];\r\n                let col_location = colLocation(x),\r\n                    col_pre = col_location[0],\r\n                    col = col_location[1],\r\n                    col_index = col_location[2];\r\n\r\n                Store.luckysheet_cell_selected_extend_index = [row_index, col_index];\r\n\r\n                $(\"#luckysheet-cell-selected-extend\").css({\r\n                    left: col_pre,\r\n                    width: col - col_pre - 1,\r\n                    top: row_pre,\r\n                    height: row - row_pre - 1,\r\n                    display: \"block\",\r\n                });\r\n            }, 100);\r\n\r\n            event.stopPropagation();\r\n        })\r\n        .click(function() {\r\n            clearTimeout(Store.luckysheet_cell_selected_extend_time);\r\n            event.stopPropagation();\r\n        })\r\n        .dblclick(function() {\r\n            let last = Store.luckysheet_select_save[0];\r\n\r\n            let r0 = last.row[0],\r\n                r1 = last.row[1],\r\n                c0 = last.column[0],\r\n                c1 = last.column[1];\r\n\r\n            if (pivotTable.isPivotRange(r0, c0)) {\r\n                return;\r\n            }\r\n\r\n            let dropCellState = false;\r\n            let step = 0;\r\n\r\n            for (let r = r1 + 1; r < Store.flowdata.length; r++) {\r\n                if (c0 - 1 >= 0 && c1 + 1 < Store.flowdata[0].length) {\r\n                    let cell1 = Store.flowdata[r][c0 - 1];\r\n                    let cell2 = Store.flowdata[r][c1 + 1];\r\n\r\n                    if (r == r1 + 1) {\r\n                        if ((cell1 == null || isRealNull(cell1.v)) && (cell2 == null || isRealNull(cell2.v))) {\r\n                            dropCellState = false;\r\n                            break;\r\n                        } else {\r\n                            dropCellState = true;\r\n                            step++;\r\n                        }\r\n                    } else {\r\n                        if ((cell1 == null || isRealNull(cell1.v)) && (cell2 == null || isRealNull(cell2.v))) {\r\n                            break;\r\n                        }\r\n\r\n                        step++;\r\n                    }\r\n                } else if (c0 - 1 >= 0) {\r\n                    let cell = Store.flowdata[r][c0 - 1];\r\n\r\n                    if (r == r1 + 1) {\r\n                        if (cell == null || isRealNull(cell.v)) {\r\n                            dropCellState = false;\r\n                            break;\r\n                        } else {\r\n                            dropCellState = true;\r\n                            step++;\r\n                        }\r\n                    } else {\r\n                        if (cell == null || isRealNull(cell.v)) {\r\n                            break;\r\n                        }\r\n\r\n                        step++;\r\n                    }\r\n                } else if (c1 + 1 < Store.flowdata[0].length) {\r\n                    let cell = Store.flowdata[r][c1 + 1];\r\n\r\n                    if (r == r1 + 1) {\r\n                        if (cell == null || isRealNull(cell.v)) {\r\n                            dropCellState = false;\r\n                            break;\r\n                        } else {\r\n                            dropCellState = true;\r\n                            step++;\r\n                        }\r\n                    } else {\r\n                        if (cell == null || isRealNull(cell.v)) {\r\n                            break;\r\n                        }\r\n\r\n                        step++;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (!dropCellState || step == 0) {\r\n                event.stopPropagation();\r\n                return;\r\n            }\r\n\r\n            //复制范围\r\n            luckysheetDropCell.copyRange = { row: [r0, r1], column: [c0, c1] };\r\n\r\n            //applyType\r\n            let typeItemHide = luckysheetDropCell.typeItemHide();\r\n\r\n            if (\r\n                !typeItemHide[0] &&\r\n                !typeItemHide[1] &&\r\n                !typeItemHide[2] &&\r\n                !typeItemHide[3] &&\r\n                !typeItemHide[4] &&\r\n                !typeItemHide[5] &&\r\n                !typeItemHide[6]\r\n            ) {\r\n                luckysheetDropCell.applyType = \"0\";\r\n            } else {\r\n                luckysheetDropCell.applyType = \"1\";\r\n            }\r\n\r\n            luckysheetDropCell.applyRange = { row: [r1 + 1, r1 + step], column: [c0, c1] };\r\n            luckysheetDropCell.direction = \"down\";\r\n\r\n            Store.luckysheet_select_save = [{ row: [r0, r1 + step], column: [c0, c1] }];\r\n\r\n            luckysheetDropCell.update();\r\n            luckysheetDropCell.createIcon();\r\n\r\n            $(\"#luckysheet-cell-selected-move\").hide();\r\n\r\n            $(\"#luckysheet-sheettable\").css(\"cursor\", \"default\");\r\n            clearTimeout(Store.countfuncTimeout);\r\n            Store.countfuncTimeout = setTimeout(function() {\r\n                countfunc();\r\n            }, 500);\r\n\r\n            event.stopPropagation();\r\n        });\r\n\r\n    //\r\n    $(\"#luckysheet-bottom-add-row, #luckysheet-bottom-add-row-input, #luckysheet-bottom-return-top\").on(\r\n        \"mousedown dblclick mouseup\",\r\n        function(e) {\r\n            e.stopPropagation();\r\n        },\r\n    );\r\n\r\n    //底部添加行按钮\r\n    $(\"#luckysheet-bottom-add-row\").on(\"click\", function(e) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        let $t = $(this),\r\n            value = $(\"#luckysheet-bottom-add-row-input\").val();\r\n\r\n        if (value == \"\") {\r\n            value = luckysheetConfigsetting.addRowCount || 100;\r\n        }\r\n\r\n        if (isNaN(parseInt(value))) {\r\n            if (isEditMode()) {\r\n                alert(locale_info.tipInputNumber);\r\n            } else {\r\n                tooltip.info(\"error\", locale_info.tipInputNumber);\r\n            }\r\n            return;\r\n        }\r\n\r\n        value = parseInt(value);\r\n        if (value < 1 || value > 100) {\r\n            if (isEditMode()) {\r\n                alert(locale_info.tipInputNumberLimit);\r\n            } else {\r\n                tooltip.info(\"error\", locale_info.tipInputNumberLimit);\r\n            }\r\n            return;\r\n        }\r\n\r\n        luckysheetextendtable(\"row\", Store.flowdata.length - 1, value);\r\n    });\r\n\r\n    $(\"#luckysheet-bottom-return-top\").on(\"click\", function(e) {\r\n        $(\"#luckysheet-scrollbar-y\").scrollTop(0);\r\n    });\r\n\r\n    //右键菜单 复制按钮\r\n    $(\"#luckysheet-copy-btn, #luckysheet-cols-copy-btn, #luckysheet-paste-btn-title\").click(function(event) {\r\n        $(this)\r\n            .parent()\r\n            .hide();\r\n        //复制范围内包含部分合并单元格，提示\r\n        if (Store.config[\"merge\"] != null) {\r\n            let has_PartMC = false;\r\n\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                let r1 = Store.luckysheet_select_save[s].row[0],\r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0],\r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if (has_PartMC) {\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (has_PartMC) {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noPartMerge);\r\n                } else {\r\n                    tooltip.info(locale_drag.noPartMerge, \"\");\r\n                }\r\n                return;\r\n            }\r\n        }\r\n\r\n        //多重选区 有条件格式时 提示\r\n        let cdformat = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].luckysheet_conditionformat_save;\r\n        if (Store.luckysheet_select_save.length > 1 && cdformat != null && cdformat.length > 0) {\r\n            let hasCF = false;\r\n\r\n            let cf_compute = conditionformat.getComputeMap();\r\n\r\n            label: for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                if (hasCF) {\r\n                    break;\r\n                }\r\n\r\n                let r1 = Store.luckysheet_select_save[s].row[0],\r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0],\r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                for (let r = r1; r <= r2; r++) {\r\n                    for (let c = c1; c <= c2; c++) {\r\n                        if (conditionformat.checksCF(r, c, cf_compute) != null) {\r\n                            hasCF = true;\r\n                            continue label;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (hasCF) {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                } else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n                return;\r\n            }\r\n        }\r\n\r\n        //多重选区 行不一样且列不一样时 提示\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            let isSameRow = true,\r\n                str_r = Store.luckysheet_select_save[0].row[0],\r\n                end_r = Store.luckysheet_select_save[0].row[1];\r\n            let isSameCol = true,\r\n                str_c = Store.luckysheet_select_save[0].column[0],\r\n                end_c = Store.luckysheet_select_save[0].column[1];\r\n\r\n            for (let s = 1; s < Store.luckysheet_select_save.length; s++) {\r\n                if (\r\n                    Store.luckysheet_select_save[s].row[0] != str_r ||\r\n                    Store.luckysheet_select_save[s].row[1] != end_r\r\n                ) {\r\n                    isSameRow = false;\r\n                }\r\n                if (\r\n                    Store.luckysheet_select_save[s].column[0] != str_c ||\r\n                    Store.luckysheet_select_save[s].column[1] != end_c\r\n                ) {\r\n                    isSameCol = false;\r\n                }\r\n            }\r\n\r\n            if ((!isSameRow && !isSameCol) || selectIsOverlap()) {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                } else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n                return;\r\n            }\r\n        }\r\n\r\n        selection.copy(event);\r\n    });\r\n\r\n    //右键菜单 粘贴按钮\r\n    $(\"#luckysheet-copy-paste, #luckysheet-cols-paste-btn, #luckysheet-paste-btn-title\").click(function(event) {\r\n        selection.paste(event, \"btn\");\r\n        $(this)\r\n            .parent()\r\n            .hide();\r\n    });\r\n\r\n    //Menu bar, Chart button\r\n    $(\"#luckysheet-chart-btn-title\").click(function() {\r\n        createLuckyChart();\r\n    });\r\n\r\n    // Right-click the menu, chart generation\r\n    $(\"#luckysheetdatavisual\").click(function() {\r\n        createLuckyChart();\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n    });\r\n\r\n    //菜单栏 数据透视表\r\n    $(\"#luckysheet-pivot-btn-title\").click(function(e) {\r\n        if (!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"usePivotTablereports\")) {\r\n            return;\r\n        }\r\n        pivotTable.createPivotTable(e);\r\n    });\r\n\r\n    //菜单栏 截图按钮\r\n    $(\"#luckysheet-chart-btn-screenshot\").click(function() {\r\n        const locale_screenshot = _locale.screenshot;\r\n        if (Store.luckysheet_select_save.length == 0) {\r\n            if (isEditMode()) {\r\n                alert(locale_screenshot.screenshotTipNoSelection);\r\n            } else {\r\n                tooltip.info(locale_screenshot.screenshotTipTitle, locale_screenshot.screenshotTipNoSelection);\r\n            }\r\n            return;\r\n        }\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            if (isEditMode()) {\r\n                alert(locale_screenshot.screenshotTipHasMulti);\r\n            } else {\r\n                tooltip.info(locale_screenshot.screenshotTipTitle, locale_screenshot.screenshotTipHasMulti);\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        //截图范围内包含部分合并单元格，提示\r\n        if (Store.config[\"merge\"] != null) {\r\n            let has_PartMC = false;\r\n\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                let r1 = Store.luckysheet_select_save[s].row[0],\r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0],\r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if (has_PartMC) {\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (has_PartMC) {\r\n                if (isEditMode()) {\r\n                    alert(locale_screenshot.screenshotTipHasMerge);\r\n                } else {\r\n                    tooltip.info(locale_screenshot.screenshotTipTitle, locale_screenshot.screenshotTipHasMerge);\r\n                }\r\n                return;\r\n            }\r\n        }\r\n\r\n        let st_r = Store.luckysheet_select_save[0].row[0],\r\n            ed_r = Store.luckysheet_select_save[0].row[1];\r\n        let st_c = Store.luckysheet_select_save[0].column[0],\r\n            ed_c = Store.luckysheet_select_save[0].column[1];\r\n\r\n        let scrollHeight, rh_height;\r\n        if (st_r - 1 < 0) {\r\n            scrollHeight = 0;\r\n            rh_height = Store.visibledatarow[ed_r];\r\n        } else {\r\n            scrollHeight = Store.visibledatarow[st_r - 1];\r\n            rh_height = Store.visibledatarow[ed_r] - Store.visibledatarow[st_r - 1];\r\n        }\r\n\r\n        let scrollWidth, ch_width;\r\n        if (st_c - 1 < 0) {\r\n            scrollWidth = 0;\r\n            ch_width = Store.visibledatacolumn[ed_c];\r\n        } else {\r\n            scrollWidth = Store.visibledatacolumn[st_c - 1];\r\n            ch_width = Store.visibledatacolumn[ed_c] - Store.visibledatacolumn[st_c - 1];\r\n        }\r\n\r\n        let newCanvas = $(\"<canvas>\")\r\n            .attr({\r\n                width: Math.ceil(ch_width * Store.devicePixelRatio),\r\n                height: Math.ceil(rh_height * Store.devicePixelRatio),\r\n            })\r\n            .css({ width: ch_width, height: rh_height });\r\n\r\n        luckysheetDrawMain(scrollWidth, scrollHeight, ch_width, rh_height, 1, 1, null, null, newCanvas);\r\n        let ctx_newCanvas = newCanvas.get(0).getContext(\"2d\");\r\n\r\n        //补上 左边框和上边框\r\n        ctx_newCanvas.beginPath();\r\n        ctx_newCanvas.moveTo(0, 0);\r\n        ctx_newCanvas.lineTo(0, Store.devicePixelRatio * rh_height);\r\n        ctx_newCanvas.lineWidth = Store.devicePixelRatio * 2;\r\n        ctx_newCanvas.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n        ctx_newCanvas.stroke();\r\n        ctx_newCanvas.closePath();\r\n\r\n        ctx_newCanvas.beginPath();\r\n        ctx_newCanvas.moveTo(0, 0);\r\n        ctx_newCanvas.lineTo(Store.devicePixelRatio * ch_width, 0);\r\n        ctx_newCanvas.lineWidth = Store.devicePixelRatio * 2;\r\n        ctx_newCanvas.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n        ctx_newCanvas.stroke();\r\n        ctx_newCanvas.closePath();\r\n\r\n        let image = new Image();\r\n        let url = newCanvas.get(0).toDataURL(\"image/png\");\r\n        image.src = url;\r\n\r\n        if (ch_width > rh_height) {\r\n            image.style.width = \"100%\";\r\n        } else {\r\n            image.style.height = \"100%\";\r\n        }\r\n\r\n        let maxHeight = $(window).height() - 200;\r\n        tooltip.screenshot(\r\n            locale_screenshot.screenshotTipSuccess,\r\n            '<div id=\"luckysheet-confirm-screenshot-save\" style=\"height:' + maxHeight + 'px;overflow:auto;\"></div>',\r\n            url,\r\n        );\r\n        $(\"#luckysheet-confirm-screenshot-save\").append(image);\r\n        newCanvas.remove();\r\n    });\r\n\r\n    //截图下载\r\n    $(document).on(\"click.luckysheetEvent\", \"a.download\", function() {\r\n        let dataURI = $(\"#luckysheet-confirm-screenshot-save img\").attr(\"src\");\r\n        const locale_screenshot = _locale.screenshot;\r\n        let binStr = atob(dataURI.split(\",\")[1]),\r\n            len = binStr.length,\r\n            arr = new Uint8Array(len);\r\n\r\n        for (let i = 0; i < len; i++) {\r\n            arr[i] = binStr.charCodeAt(i);\r\n        }\r\n\r\n        let blob = new Blob([arr]);\r\n\r\n        let element = document.createElement(\"a\");\r\n        element.setAttribute(\"href\", URL.createObjectURL(blob));\r\n        element.setAttribute(\"download\", locale_screenshot.screenshotImageName + \".png\");\r\n\r\n        element.style.display = \"none\";\r\n        document.body.appendChild(element);\r\n\r\n        element.click();\r\n\r\n        let clickHandler;\r\n        element.addEventListener(\r\n            \"click\",\r\n            (clickHandler = function() {\r\n                requestAnimationFrame(function() {\r\n                    URL.revokeObjectURL(element.href);\r\n                });\r\n\r\n                element.removeAttribute(\"href\");\r\n                element.removeEventListener(\"click\", clickHandler);\r\n            }),\r\n        );\r\n\r\n        document.body.removeChild(element);\r\n    });\r\n\r\n    //菜单栏 分列按钮\r\n    $(\"#luckysheet-splitColumn-btn-title\").click(function() {\r\n        if (!checkProtectionNotEnable(Store.currentSheetIndex)) {\r\n            return;\r\n        }\r\n\r\n        if (Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0) {\r\n            return;\r\n        }\r\n\r\n        const locale_splitText = _locale.splitText;\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            tooltip.info(locale_splitText.tipNoMulti, \"\");\r\n            return;\r\n        }\r\n\r\n        if (Store.luckysheet_select_save[0].column[0] != Store.luckysheet_select_save[0].column[1]) {\r\n            tooltip.info(locale_splitText.tipNoMultiColumn, \"\");\r\n            return;\r\n        }\r\n\r\n        splitColumn.createDialog();\r\n        splitColumn.init();\r\n    });\r\n\r\n    //菜单栏 插入图片按钮\r\n    $(\"#luckysheet-insertImg-btn-title\").click(function() {\r\n        // *如果禁止前台编辑，则中止下一步操作\r\n        if (!checkIsAllowEdit()) {\r\n            tooltip.info(\"\", locale().pivotTable.errorNotAllowEdit);\r\n            return;\r\n        }\r\n        if (!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\")) {\r\n            return;\r\n        }\r\n        $(\"#luckysheet-imgUpload\").click();\r\n    });\r\n    $(\"#luckysheetInsertImage\").click(function() {\r\n        if (!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\")) {\r\n            return;\r\n        }\r\n        $(\"#luckysheet-imgUpload\").click();\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n    });\r\n    $(\"#luckysheet-imgUpload\").click(function(e) {\r\n        e.stopPropagation();\r\n    });\r\n    $(\"#luckysheet-imgUpload\").on(\"change\", function(e) {\r\n        if (!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\", false)) {\r\n            return;\r\n        }\r\n        let file = e.currentTarget.files[0];\r\n        imageCtrl.insertImg(file);\r\n    });\r\n\r\n    //菜单栏 插入链接按钮\r\n    $(\"#luckysheet-insertLink-btn-title\").click(function() {\r\n        // *如果禁止前台编辑，则中止下一步操作\r\n        if (!checkIsAllowEdit()) {\r\n            tooltip.info(\"\", locale().pivotTable.errorNotAllowEdit);\r\n        }\r\n        if (!checkProtectionNotEnable(Store.currentSheetIndex)) {\r\n            return;\r\n            return;\r\n        }\r\n\r\n        hyperlinkCtrl.createDialog();\r\n        hyperlinkCtrl.init();\r\n    });\r\n    $(\"#luckysheetInsertLink\").click(function() {\r\n        $(\"#luckysheet-insertLink-btn-title\").click();\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n    });\r\n\r\n    //菜单栏 数据验证按钮\r\n    $(\"#luckysheet-dataVerification-btn-title\").click(function() {\r\n        if (!checkProtectionNotEnable(Store.currentSheetIndex)) {\r\n            return;\r\n        }\r\n\r\n        if (Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0) {\r\n            return;\r\n        }\r\n\r\n        dataVerificationCtrl.createDialog();\r\n        dataVerificationCtrl.init();\r\n    });\r\n    $(\"#luckysheetDataVerification\").click(function() {\r\n        $(\"#luckysheet-dataVerification-btn-title\").click();\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n    });\r\n\r\n    //Cell format\r\n    $(\"#luckysheetCellFormatRightClickMenu\").click(function() {\r\n        openCellFormatModel();\r\n    });\r\n\r\n    //冻结行列\r\n    $(\"#luckysheet-freezen-btn-horizontal\").click(function() {\r\n        if ($.trim($(this).text()) == locale().freezen.freezenCancel) {\r\n            luckysheetFreezen.saveFrozen(\"freezenCancel\");\r\n\r\n            if (luckysheetFreezen.freezenverticaldata != null) {\r\n                luckysheetFreezen.cancelFreezenVertical();\r\n                luckysheetFreezen.createAssistCanvas();\r\n                luckysheetrefreshgrid();\r\n            }\r\n\r\n            if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n                luckysheetFreezen.cancelFreezenHorizontal();\r\n                luckysheetFreezen.createAssistCanvas();\r\n                luckysheetrefreshgrid();\r\n            }\r\n\r\n            luckysheetFreezen.scrollAdapt();\r\n            // cancel 之后 勾勾取消\r\n            $(\"#luckysheet-icon-freezen-menu-menuButton\")\r\n                .find(\".fa.fa-check\")\r\n                .remove();\r\n        } else {\r\n            luckysheetFreezen.saveFrozen(\"freezenRow\");\r\n\r\n            if (luckysheetFreezen.freezenverticaldata != null) {\r\n                luckysheetFreezen.cancelFreezenVertical();\r\n                luckysheetFreezen.createAssistCanvas();\r\n                luckysheetrefreshgrid();\r\n            }\r\n\r\n            if (luckysheetFreezen.freezenhorizontaldata == null) {\r\n                luckysheetFreezen.createFreezenHorizontal();\r\n                luckysheetFreezen.createAssistCanvas();\r\n            }\r\n        }\r\n    });\r\n\r\n    $(\"#luckysheet-freezen-btn-vertical\").click(function() {\r\n        if (luckysheetFreezen.freezenverticaldata != null) {\r\n            luckysheetFreezen.saveFrozen(\"freezenCancel\");\r\n\r\n            luckysheetFreezen.cancelFreezenVertical();\r\n            luckysheetrefreshgrid();\r\n        } else {\r\n            luckysheetFreezen.saveFrozen(\"freezenColumn\");\r\n\r\n            luckysheetFreezen.createFreezenVertical();\r\n        }\r\n        luckysheetFreezen.createAssistCanvas();\r\n    });\r\n\r\n    $(\"#luckysheet-rightclick-menu input\").on(\"keydown\", function(e) {\r\n        e.stopPropagation();\r\n    });\r\n\r\n    $(\"#luckysheet-modal-dialog-mask\").on(\"click dbclick mousedown mousemove mouseup\", function(e) {\r\n        e.stopPropagation();\r\n        e.preventDefault();\r\n    });\r\n\r\n    //菜单栏 导出按钮\r\n    $(\"#luckysheet-exportXlsx-btn-title\").click(function() {\r\n\r\n        const exportXlsxInfo =  Store.plugins.find(plugin => plugin.name === 'exportXlsx')\r\n        if(exportXlsxInfo){\r\n            const url = exportXlsxInfo?.config?.url;\r\n            if(url){\r\n                createExportDialog(url)\r\n            }\r\n        }else{\r\n            tooltip.info(_locale.exportXlsx.notice, \"\");\r\n        }\r\n    });\r\n\r\n    let copychange = function() {\r\n        if (document.hidden || document.webkitHidden || document.msHidden) {\r\n            Store.iscopyself = false;\r\n        }\r\n    };\r\n\r\n    $(document)\r\n        .on(\r\n            \"visibilitychange.luckysheetEvent webkitvisibilitychange.luckysheetEvent msvisibilitychange.luckysheetEvent\",\r\n            copychange,\r\n        )\r\n        .on(\"mouseleave.luckysheetEvent\", function() {\r\n            Store.iscopyself = false;\r\n        })\r\n        .on(\"mousedown.luckysheetEvent\", function(event) {\r\n            //有批注在编辑时\r\n            luckysheetPostil.removeActivePs();\r\n\r\n            hideMenuByCancel(event);\r\n\r\n            //点击功能栏时 如果是单元格编辑模式 则退出编辑模式\r\n            if (\r\n                $(event.target).closest(\"#luckysheet-wa-editor\").length > 0 &&\r\n                parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0\r\n            ) {\r\n                formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n            }\r\n        });\r\n\r\n    //表格左上角点击 全选表格\r\n    $(\"#luckysheet-left-top\").click(function(event) {\r\n        if (!checkProtectionAllSelected(Store.currentSheetIndex)) {\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-wa-functionbox-confirm\").click();\r\n        Store.luckysheet_select_status = false;\r\n\r\n        Store.luckysheet_select_save = [\r\n            {\r\n                row: [0, Store.flowdata.length - 1],\r\n                column: [0, Store.flowdata[0].length - 1],\r\n                row_focus: 0,\r\n                column_focus: 0,\r\n                row_select: true,\r\n                column_select: true,\r\n            },\r\n        ];\r\n        selectHightlightShow();\r\n\r\n        clearTimeout(Store.countfuncTimeout);\r\n        Store.countfuncTimeout = setTimeout(function() {\r\n            countfunc();\r\n        }, 500);\r\n\r\n        /* 选中区域：发送网络请求 */\r\n        server.saveParam(\"mv\", Store.currentSheetIndex, Store.luckysheet_select_save);\r\n\r\n        event.stopPropagation();\r\n    });\r\n\r\n    //回退 重做 按钮\r\n    $(\"#luckysheet-icon-undo\").click(function(event) {\r\n        if ($(this).hasClass(\"disabled\")) {\r\n            return;\r\n        }\r\n        controlHistory.redo(event);\r\n    });\r\n    $(\"#luckysheet-icon-redo\").click(function(event) {\r\n        if ($(this).hasClass(\"disabled\")) {\r\n            return;\r\n        }\r\n        controlHistory.undo(event);\r\n    });\r\n\r\n    //模态框拖动\r\n    $(document).on(\"mousedown.luckysheetEvent\", \"div.luckysheet-modal-dialog\", function(e) {\r\n        if (!$(e.target).is(\".luckysheet-modal-dialog\")) {\r\n            return;\r\n        }\r\n\r\n        Store.luckysheet_model_move_state = true;\r\n\r\n        Store.luckysheet_model_move_obj = $(e.currentTarget);\r\n        let toffset = Store.luckysheet_model_move_obj.offset();\r\n        Store.luckysheet_model_xy = [e.pageX - toffset.left, e.pageY - toffset.top];\r\n    });\r\n\r\n    //模态框关闭\r\n    $(document).on(\r\n        \"click.luckysheetEvent\",\r\n        \".luckysheet-modal-dialog-title-close, .luckysheet-model-close-btn\",\r\n        function(e) {\r\n            //选择文本颜色和单元格颜色弹出框取消\r\n            if ($(\"#textcolorselect\").is(\":visible\") || $(\"#cellcolorselect\").is(\":visible\")) {\r\n                $(\"#luckysheet-conditionformat-dialog\").show();\r\n            }\r\n            $(e.currentTarget)\r\n                .parents(\".luckysheet-modal-dialog\")\r\n                .hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n\r\n            //函数查找功能所有弹出框关闭和取消\r\n            if (\r\n                $(this)\r\n                    .parents(\".luckysheet-modal-dialog\")\r\n                    .hasClass(\"luckysheet-search-formula\")\r\n            ) {\r\n                formula.dontupdate();\r\n                luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n            }\r\n            if (\r\n                $(this)\r\n                    .parents(\".luckysheet-modal-dialog\")\r\n                    .hasClass(\"luckysheet-search-formula-parm\")\r\n            ) {\r\n                formula.dontupdate();\r\n                luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n            }\r\n            if (\r\n                $(this)\r\n                    .parents(\".luckysheet-modal-dialog\")\r\n                    .hasClass(\"luckysheet-search-formula-parm-select\")\r\n            ) {\r\n                formula.dontupdate();\r\n                luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n            }\r\n\r\n            luckysheetContainerFocus();\r\n        },\r\n    );\r\n\r\n    //左上角返回按钮\r\n    $(\"#luckysheet_info_detail_title\").click(function() {\r\n        window.open(luckysheetConfigsetting.myFolderUrl, \"_self\");\r\n    });\r\n\r\n    //图表选区mousedown\r\n    $(\"#luckysheet-chart-rangeShow\").on(\"mousedown.chartRangeShowMove\", \".luckysheet-chart-rangeShow-move\", function(\r\n        event,\r\n    ) {\r\n        Store.chart_selection.rangeMove = true;\r\n        Store.luckysheet_scroll_status = true;\r\n\r\n        Store.chart_selection.rangeMoveObj = $(this).parent();\r\n\r\n        let chart_json = Store.currentChart;\r\n\r\n        let $id = $(this)\r\n            .parent()\r\n            .attr(\"id\");\r\n        if ($id == \"luckysheet-chart-rangeShow-content\") {\r\n            let row_s = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.content.row[0];\r\n            let col_s = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.content.column[0];\r\n\r\n            Store.chart_selection.rangeMoveIndex = [row_s, col_s];\r\n        } else if ($id == \"luckysheet-chart-rangeShow-rowtitle\") {\r\n            let row_s = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.rowtitle.row[0];\r\n            let col_s = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.rowtitle.column[0];\r\n\r\n            Store.chart_selection.rangeMoveIndex = [row_s, col_s];\r\n        } else if ($id == \"luckysheet-chart-rangeShow-coltitle\") {\r\n            let row_s = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.coltitle.row[0];\r\n            let col_s = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.coltitle.column[0];\r\n\r\n            Store.chart_selection.rangeMoveIndex = [row_s, col_s];\r\n        }\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n        let type = $(this).data(\"type\");\r\n        if (type == \"top\") {\r\n            y += 3;\r\n        } else if (type == \"right\") {\r\n            x -= 3;\r\n        } else if (type == \"bottom\") {\r\n            y -= 3;\r\n        } else if (type == \"left\") {\r\n            x += 3;\r\n        }\r\n\r\n        let row_index = rowLocation(y)[2];\r\n        let col_index = colLocation(x)[2];\r\n\r\n        Store.chart_selection.rangeMovexy = [row_index, col_index];\r\n\r\n        event.stopPropagation();\r\n    });\r\n\r\n    $(\"#luckysheet-chart-rangeShow\").on(\r\n        \"mousedown.chartRangeShowResize\",\r\n        \".luckysheet-chart-rangeShow-resize\",\r\n        function(event) {\r\n            Store.chart_selection.rangeResize = $(this).data(\"type\"); //开始状态resize\r\n            Store.luckysheet_scroll_status = true;\r\n\r\n            Store.chart_selection.rangeResizeObj = $(this).parent();\r\n\r\n            let chart_json = Store.currentChart;\r\n            let row_s;\r\n            let row_e;\r\n            let col_s;\r\n            let col_e;\r\n\r\n            let $id = $(this)\r\n                .parent()\r\n                .attr(\"id\");\r\n            if ($id == \"luckysheet-chart-rangeShow-content\") {\r\n                if (chart_json.rangeRowCheck.exits) {\r\n                    row_s = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.content.row[0];\r\n                    row_e = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.content.row[1];\r\n                } else {\r\n                    row_s = chart_json.rangeSplitArray.content.row[0];\r\n                    row_e = chart_json.rangeSplitArray.content.row[0];\r\n                }\r\n\r\n                if (chart_json.rangeColCheck.exits) {\r\n                    col_s = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.content.column[0];\r\n                    col_e = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.content.column[1];\r\n                } else {\r\n                    col_s = chart_json.rangeSplitArray.content.column[0];\r\n                    col_e = chart_json.rangeSplitArray.content.column[1];\r\n                }\r\n\r\n                Store.chart_selection.rangeResizeIndex = { row: [row_s, row_e], column: [col_s, col_e] };\r\n            } else if ($id == \"luckysheet-chart-rangeShow-rowtitle\") {\r\n                let row_s = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.rowtitle.row[0];\r\n                let row_e = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.rowtitle.row[1];\r\n\r\n                let col_s = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.rowtitle.column[0];\r\n                let col_e = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.rowtitle.column[1];\r\n\r\n                Store.chart_selection.rangeResizeIndex = { row: [row_s, row_e], column: [col_s, col_e] };\r\n            } else if ($id == \"luckysheet-chart-rangeShow-coltitle\") {\r\n                let row_s = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.coltitle.row[0];\r\n                let row_e = chart_json.rangeArray[0].row[0] + chart_json.rangeSplitArray.coltitle.row[1];\r\n\r\n                let col_s = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.coltitle.column[0];\r\n                let col_e = chart_json.rangeArray[0].column[0] + chart_json.rangeSplitArray.coltitle.column[1];\r\n\r\n                Store.chart_selection.rangeResizeIndex = { row: [row_s, row_e], column: [col_s, col_e] };\r\n            }\r\n\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            if (Store.chart_selection.rangeResize == \"lt\") {\r\n                x += 3;\r\n                y += 3;\r\n            } else if (Store.chart_selection.rangeResize == \"lb\") {\r\n                x += 3;\r\n                y -= 3;\r\n            } else if (Store.chart_selection.rangeResize == \"rt\") {\r\n                x -= 3;\r\n                y += 3;\r\n            } else if (Store.chart_selection.rangeResize == \"rb\") {\r\n                x -= 3;\r\n                y -= 3;\r\n            }\r\n\r\n            let row_index = rowLocation(y)[2];\r\n            let col_index = colLocation(x)[2];\r\n\r\n            Store.chart_selection.rangeResizexy = [row_index, col_index];\r\n\r\n            event.stopPropagation();\r\n        },\r\n    );\r\n\r\n    $(\"#luckysheet-wa-calculate-size\").mousedown(function(e) {\r\n        let y = e.pageY;\r\n        formula.functionResizeData.y = y;\r\n        formula.functionResizeStatus = true;\r\n        formula.functionResizeData.calculatebarHeight = Store.calculatebarHeight;\r\n        if (formula.rangetosheet && formula.rangetosheet != null) {\r\n            formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n        }\r\n    });\r\n\r\n    // 点击设置字体大小的下拉箭头，把自动聚焦输入框去除（认为下拉设置字体大小，不需要聚焦输入框）\r\n    // //toolbar菜单\r\n    // $(\"#\" + Store.container + \" .luckysheet-wa-editor\").on(\"click\", \".luckysheet-toolbar-zoom-combobox\", function (e) {\r\n    //     $(e.currentTarget).addClass(\"luckysheet-toolbar-combo-button-open\");\r\n    //     $(e.currentTarget).find(\".luckysheet-toolbar-combo-button-input\").focus();\r\n    // });\r\n\r\n    // $(\"#\" + Store.container + \" .luckysheet-wa-editor\").on(\"blur\", \".luckysheet-toolbar-combo-button-input\", function (e) {\r\n    //     $(e.currentTarget).closest(\".luckysheet-toolbar-zoom-combobox\").removeClass(\"luckysheet-toolbar-combo-button-open\");\r\n    // });\r\n\r\n    //表格格式处理\r\n    menuButton.initialMenuButton();\r\n\r\n    let dpi_x = document.getElementById(\"testdpidiv\").offsetWidth * Store.devicePixelRatio;\r\n    let dpi_y = document.getElementById(\"testdpidiv\").offsetHeight * Store.devicePixelRatio;\r\n\r\n    //粘贴事件处理\r\n    $(document).on(\"paste.luckysheetEvent\", function(e) {\r\n        if (isEditMode()) {\r\n            //此模式下禁用粘贴\r\n            return;\r\n        }\r\n\r\n        if (selection.isPasteAction) {\r\n            $(\"#luckysheet-rich-text-editor\").blur();\r\n            selection.isPasteAction = false;\r\n\r\n            let clipboardData = window.clipboardData; //for IE\r\n            if (!clipboardData) {\r\n                // for chrome\r\n                clipboardData = e.originalEvent.clipboardData;\r\n            }\r\n\r\n            let txtdata = clipboardData.getData(\"text/html\") || clipboardData.getData(\"text/plain\");\r\n\r\n            //如果标示是qksheet复制的内容，判断剪贴板内容是否是当前页面复制的内容\r\n            let isEqual = true;\r\n            if (\r\n                txtdata.indexOf(\"luckysheet_copy_action_table\") > -1 &&\r\n                Store.luckysheet_copy_save[\"copyRange\"] != null &&\r\n                Store.luckysheet_copy_save[\"copyRange\"].length > 0\r\n            ) {\r\n                //剪贴板内容解析\r\n                let cpDataArr = [];\r\n\r\n                let reg = new RegExp(\"<tr.*?>(.*?)</tr>\", \"gs\");\r\n                let reg2 = new RegExp(\"<td.*?>(.*?)</td>\", \"gs\");\r\n\r\n                let regArr = txtdata.match(reg) || [];\r\n\r\n                for (let i = 0; i < regArr.length; i++) {\r\n                    let cpRowArr = [];\r\n\r\n                    let reg2Arr = regArr[i].match(reg2);\r\n\r\n                    if (reg2Arr != null) {\r\n                        for (let j = 0; j < reg2Arr.length; j++) {\r\n                            let cpValue = reg2Arr[j].replace(/<td.*?>/gs, \"\").replace(/<\\/td>/gs, \"\");\r\n                            cpRowArr.push(cpValue);\r\n                        }\r\n                    }\r\n\r\n                    cpDataArr.push(cpRowArr);\r\n                }\r\n\r\n                //当前页面复制区内容\r\n                let copy_r1 = Store.luckysheet_copy_save[\"copyRange\"][0].row[0],\r\n                    copy_r2 = Store.luckysheet_copy_save[\"copyRange\"][0].row[1],\r\n                    copy_c1 = Store.luckysheet_copy_save[\"copyRange\"][0].column[0],\r\n                    copy_c2 = Store.luckysheet_copy_save[\"copyRange\"][0].column[1];\r\n\r\n                let copy_index = Store.luckysheet_copy_save[\"dataSheetIndex\"];\r\n\r\n                let d;\r\n                if (copy_index == Store.currentSheetIndex) {\r\n                    d = editor.deepCopyFlowData(Store.flowdata);\r\n                } else {\r\n                    d = Store.luckysheetfile[getSheetIndex(copy_index)].data;\r\n                }\r\n\r\n                for (let r = copy_r1; r <= copy_r2; r++) {\r\n                    if (r - copy_r1 > cpDataArr.length - 1) {\r\n                        break;\r\n                    }\r\n\r\n                    for (let c = copy_c1; c <= copy_c2; c++) {\r\n                        let cell = d[r][c];\r\n                        let isInlineStr = false;\r\n                        if (cell != null && cell.mc != null && cell.mc.rs == null) {\r\n                            continue;\r\n                        }\r\n\r\n                        let v;\r\n                        if (cell != null) {\r\n                            if (cell.ct != null && cell.ct.fa.indexOf(\"w\") > -1) {\r\n                                v = d[r][c].v;\r\n                            } else {\r\n                                v = d[r][c].m;\r\n                            }\r\n                        } else {\r\n                            v = \"\";\r\n                        }\r\n\r\n                        if (v == null && d[r][c] && d[r][c].ct && d[r][c].ct.t == \"inlineStr\") {\r\n                            v = d[r][c].ct.s.map((val) => val.v).join(\"\");\r\n                            isInlineStr = true;\r\n                        }\r\n                        if (v == null) {\r\n                            v = \"\";\r\n                        }\r\n                        if (isInlineStr) {\r\n                            const cpData = $(cpDataArr[r - copy_r1][c - copy_c1])\r\n                                .text()\r\n                                .replace(/\\s|\\n/g, \" \");\r\n                            const storeValue = v.replace(/\\n/g, \"\").replace(/\\s/g, \" \");\r\n                            if (cpData != storeValue) {\r\n                                isEqual = false;\r\n                                break;\r\n                            }\r\n                        } else {\r\n                            if (cpDataArr[r - copy_r1][c - copy_c1] != v) {\r\n                                isEqual = false;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            const locale_fontjson = locale().fontjson;\r\n\r\n            // hook\r\n            if (!method.createHookFunction(\"rangePasteBefore\", Store.luckysheet_select_save, txtdata)) {\r\n                return;\r\n            }\r\n\r\n            if (\r\n                txtdata.indexOf(\"luckysheet_copy_action_table\") > -1 &&\r\n                Store.luckysheet_copy_save[\"copyRange\"] != null &&\r\n                Store.luckysheet_copy_save[\"copyRange\"].length > 0 &&\r\n                isEqual\r\n            ) {\r\n                //剪切板内容 和 luckysheet本身复制的内容 一致\r\n                if (Store.luckysheet_paste_iscut) {\r\n                    Store.luckysheet_paste_iscut = false;\r\n                    selection.pasteHandlerOfCutPaste(Store.luckysheet_copy_save);\r\n                    selection.clearcopy(e);\r\n                } else {\r\n                    selection.pasteHandlerOfCopyPaste(Store.luckysheet_copy_save);\r\n                }\r\n            } else if (txtdata.indexOf(\"luckysheet_copy_action_image\") > -1) {\r\n                imageCtrl.pasteImgItem();\r\n            } else {\r\n                if (txtdata.indexOf(\"table\") > -1) {\r\n                    $(\"#luckysheet-copy-content\").html(txtdata);\r\n\r\n                    let data = new Array($(\"#luckysheet-copy-content\").find(\"table tr\").length);\r\n                    let colLen = 0;\r\n                    const cellElements = \"th, td\";\r\n                    $(\"#luckysheet-copy-content\")\r\n                        .find(\"table tr\")\r\n                        .eq(0)\r\n                        .find(cellElements)\r\n                        .each(function() {\r\n                            let colspan = parseInt($(this).attr(\"colspan\"));\r\n                            if (isNaN(colspan)) {\r\n                                colspan = 1;\r\n                            }\r\n                            colLen += colspan;\r\n                        });\r\n\r\n                    for (let i = 0; i < data.length; i++) {\r\n                        data[i] = new Array(colLen);\r\n                    }\r\n\r\n                    let r = 0;\r\n                    let borderInfo = {};\r\n                    $(\"#luckysheet-copy-content\")\r\n                        .find(\"table tr\")\r\n                        .each(function() {\r\n                            let $tr = $(this);\r\n                            let c = 0;\r\n                            $tr.find(cellElements).each(function() {\r\n                                let $td = $(this);\r\n                                let cell = {};\r\n                                let txt = $td.text();\r\n                                if ($.trim(txt).length == 0) {\r\n                                    cell.v = null;\r\n                                    cell.m = \"\";\r\n                                } else {\r\n                                    let mask = genarate($td.text());\r\n                                    cell.v = mask[2];\r\n                                    cell.ct = mask[1];\r\n                                    cell.m = mask[0];\r\n                                }\r\n\r\n                                let bg = $td.css(\"background-color\");\r\n                                if (bg == \"rgba(0, 0, 0, 0)\") {\r\n                                    bg = null;\r\n                                }\r\n\r\n                                cell.bg = bg;\r\n\r\n                                let bl = $td.css(\"font-weight\");\r\n                                if (bl == 400 || bl == \"normal\") {\r\n                                    cell.bl = 0;\r\n                                } else {\r\n                                    cell.bl = 1;\r\n                                }\r\n\r\n                                // 检测下划线\r\n                                let un = $td.css(\"text-decoration\");\r\n                                if (un.indexOf(\"underline\") != -1) {\r\n                                    cell.un = 1;\r\n                                }\r\n\r\n                                let it = $td.css(\"font-style\");\r\n                                if (it == \"normal\") {\r\n                                    cell.it = 0;\r\n                                } else {\r\n                                    cell.it = 1;\r\n                                }\r\n\r\n                                let ff = $td.css(\"font-family\");\r\n                                let ffs = ff.split(\",\");\r\n                                for (let i = 0; i < ffs.length; i++) {\r\n                                    let fa = $.trim(ffs[i].toLowerCase());\r\n                                    fa = locale_fontjson[fa];\r\n                                    if (fa == null) {\r\n                                        cell.ff = 0;\r\n                                    } else {\r\n                                        cell.ff = fa;\r\n                                        break;\r\n                                    }\r\n                                }\r\n                                let fs = Math.round((parseInt($td.css(\"font-size\")) * 72) / 96);\r\n                                cell.fs = fs;\r\n\r\n                                let fc = $td.css(\"color\");\r\n                                cell.fc = fc;\r\n\r\n                                // 水平对齐属性\r\n                                let ht = $td.css(\"text-align\");\r\n                                if (ht == \"center\") {\r\n                                    cell.ht = 0;\r\n                                } else if (ht == \"right\") {\r\n                                    cell.ht = 2;\r\n                                } else {\r\n                                    cell.ht = 1;\r\n                                }\r\n\r\n                                // 垂直对齐属性\r\n                                let vt = $td.css(\"vertical-align\");\r\n                                if (vt == \"middle\") {\r\n                                    cell.vt = 0;\r\n                                } else if (vt == \"top\" || vt == \"text-top\") {\r\n                                    cell.vt = 1;\r\n                                } else {\r\n                                    cell.vt = 2;\r\n                                }\r\n\r\n                                while (c < colLen && data[r][c] != null) {\r\n                                    c++;\r\n                                }\r\n\r\n                                if (c == colLen) {\r\n                                    return true;\r\n                                }\r\n\r\n                                if (data[r][c] == null) {\r\n                                    data[r][c] = cell;\r\n                                    let rowspan = parseInt($td.attr(\"rowspan\"));\r\n                                    let colspan = parseInt($td.attr(\"colspan\"));\r\n\r\n                                    if (isNaN(rowspan)) {\r\n                                        rowspan = 1;\r\n                                    }\r\n\r\n                                    if (isNaN(colspan)) {\r\n                                        colspan = 1;\r\n                                    }\r\n\r\n                                    let r_ab = Store.luckysheet_select_save[0][\"row\"][0] + r;\r\n                                    let c_ab = Store.luckysheet_select_save[0][\"column\"][0] + c;\r\n\r\n                                    for (let rp = 0; rp < rowspan; rp++) {\r\n                                        for (let cp = 0; cp < colspan; cp++) {\r\n                                            if (rp == 0) {\r\n                                                let bt = $td.css(\"border-top\");\r\n                                                if (\r\n                                                    bt != null &&\r\n                                                    bt.length > 0 &&\r\n                                                    bt.substr(0, 3).toLowerCase() != \"0px\"\r\n                                                ) {\r\n                                                    let width = $td.css(\"border-top-width\");\r\n                                                    let type = $td.css(\"border-top-style\");\r\n                                                    let color = $td.css(\"border-top-color\");\r\n                                                    let borderconfig = menuButton.getQKBorder(width, type, color);\r\n\r\n                                                    if (borderInfo[r + rp + \"_\" + (c + cp)] == null) {\r\n                                                        borderInfo[r + rp + \"_\" + (c + cp)] = {};\r\n                                                    }\r\n\r\n                                                    borderInfo[r + rp + \"_\" + (c + cp)].t = {\r\n                                                        style: borderconfig[0],\r\n                                                        color: borderconfig[1],\r\n                                                    };\r\n                                                }\r\n                                            }\r\n\r\n                                            if (rp == rowspan - 1) {\r\n                                                let bb = $td.css(\"border-bottom\");\r\n                                                if (\r\n                                                    bb != null &&\r\n                                                    bb.length > 0 &&\r\n                                                    bb.substr(0, 3).toLowerCase() != \"0px\"\r\n                                                ) {\r\n                                                    let width = $td.css(\"border-bottom-width\");\r\n                                                    let type = $td.css(\"border-bottom-style\");\r\n                                                    let color = $td.css(\"border-bottom-color\");\r\n                                                    let borderconfig = menuButton.getQKBorder(width, type, color);\r\n\r\n                                                    if (borderInfo[r + rp + \"_\" + (c + cp)] == null) {\r\n                                                        borderInfo[r + rp + \"_\" + (c + cp)] = {};\r\n                                                    }\r\n\r\n                                                    borderInfo[r + rp + \"_\" + (c + cp)].b = {\r\n                                                        style: borderconfig[0],\r\n                                                        color: borderconfig[1],\r\n                                                    };\r\n                                                }\r\n                                            }\r\n\r\n                                            if (cp == 0) {\r\n                                                let bl = $td.css(\"border-left\");\r\n                                                if (\r\n                                                    bl != null &&\r\n                                                    bl.length > 0 &&\r\n                                                    bl.substr(0, 3).toLowerCase() != \"0px\"\r\n                                                ) {\r\n                                                    let width = $td.css(\"border-left-width\");\r\n                                                    let type = $td.css(\"border-left-style\");\r\n                                                    let color = $td.css(\"border-left-color\");\r\n                                                    let borderconfig = menuButton.getQKBorder(width, type, color);\r\n\r\n                                                    if (borderInfo[r + rp + \"_\" + (c + cp)] == null) {\r\n                                                        borderInfo[r + rp + \"_\" + (c + cp)] = {};\r\n                                                    }\r\n\r\n                                                    borderInfo[r + rp + \"_\" + (c + cp)].l = {\r\n                                                        style: borderconfig[0],\r\n                                                        color: borderconfig[1],\r\n                                                    };\r\n                                                }\r\n                                            }\r\n\r\n                                            if (cp == colspan - 1) {\r\n                                                let br = $td.css(\"border-right\");\r\n                                                if (\r\n                                                    br != null &&\r\n                                                    br.length > 0 &&\r\n                                                    br.substr(0, 3).toLowerCase() != \"0px\"\r\n                                                ) {\r\n                                                    let width = $td.css(\"border-right-width\");\r\n                                                    let type = $td.css(\"border-right-style\");\r\n                                                    let color = $td.css(\"border-right-color\");\r\n                                                    let borderconfig = menuButton.getQKBorder(width, type, color);\r\n\r\n                                                    if (borderInfo[r + rp + \"_\" + (c + cp)] == null) {\r\n                                                        borderInfo[r + rp + \"_\" + (c + cp)] = {};\r\n                                                    }\r\n\r\n                                                    borderInfo[r + rp + \"_\" + (c + cp)].r = {\r\n                                                        style: borderconfig[0],\r\n                                                        color: borderconfig[1],\r\n                                                    };\r\n                                                }\r\n                                            }\r\n\r\n                                            if (rp == 0 && cp == 0) {\r\n                                                continue;\r\n                                            }\r\n\r\n                                            data[r + rp][c + cp] = { mc: { r: r_ab, c: c_ab } };\r\n                                        }\r\n                                    }\r\n\r\n                                    if (rowspan > 1 || colspan > 1) {\r\n                                        let first = { rs: rowspan, cs: colspan, r: r_ab, c: c_ab };\r\n                                        data[r][c].mc = first;\r\n                                    }\r\n                                }\r\n\r\n                                c++;\r\n\r\n                                if (c == colLen) {\r\n                                    return true;\r\n                                }\r\n                            });\r\n\r\n                            r++;\r\n                        });\r\n\r\n                    Store.luckysheet_selection_range = [];\r\n                    selection.pasteHandler(data, borderInfo);\r\n                    $(\"#luckysheet-copy-content\").empty();\r\n                }\r\n\r\n                //复制的是图片\r\n                else if (clipboardData.files.length == 1 && clipboardData.files[0].type.indexOf(\"image\") > -1) {\r\n                    imageCtrl.insertImg(clipboardData.files[0]);\r\n\r\n                    return;\r\n                } else {\r\n                    txtdata = clipboardData.getData(\"text/plain\");\r\n                    selection.pasteHandler(txtdata);\r\n                }\r\n                $(\"#luckysheet-copy-content\").empty();\r\n            }\r\n        } else if ($(e.target).closest(\"#luckysheet-rich-text-editor\").length > 0) {\r\n            // 阻止默认粘贴\r\n            e.preventDefault();\r\n\r\n            let clipboardData = window.clipboardData; //for IE\r\n            if (!clipboardData) {\r\n                // for chrome\r\n                clipboardData = e.originalEvent.clipboardData;\r\n            }\r\n            let text = clipboardData.getData(\"text/plain\");\r\n            // 插入\r\n            document.execCommand(\"insertText\", false, text);\r\n        }\r\n    });\r\n\r\n    //是否允许加载下一页\r\n    if (luckysheetConfigsetting.enablePage) {\r\n        $(\"#luckysheet-bottom-page-next\")\r\n            .click(function() {\r\n                let queryExps = luckysheetConfigsetting.pageInfo.queryExps;\r\n                let reportId = luckysheetConfigsetting.pageInfo.reportId;\r\n                let fields = luckysheetConfigsetting.pageInfo.fields;\r\n                let mobile = luckysheetConfigsetting.pageInfo.mobile;\r\n                let frezon = luckysheetConfigsetting.pageInfo.frezon;\r\n                let currentPage = luckysheetConfigsetting.pageInfo.currentPage;\r\n                let totalPage = luckysheetConfigsetting.pageInfo.totalPage;\r\n                let pageUrl = luckysheetConfigsetting.pageInfo.pageUrl;\r\n\r\n                method.addDataAjax(\r\n                    {\r\n                        queryExps: queryExps,\r\n                        reportId: reportId,\r\n                        fields: fields,\r\n                        mobile: mobile,\r\n                        frezon: frezon,\r\n                        pageIndex: currentPage,\r\n                        currentPage: currentPage,\r\n                    },\r\n                    Store.currentSheetIndex,\r\n                    pageUrl,\r\n                    function() {\r\n                        luckysheetConfigsetting.pageInfo.currentPage++;\r\n                        if (\r\n                            luckysheetConfigsetting.pageInfo.totalPage == luckysheetConfigsetting.pageInfo.currentPage\r\n                        ) {\r\n                            $(\"#luckysheet-bottom-page-next\").hide();\r\n                            let pageInfoFull = replaceHtml(locale_info.pageInfoFull, {\r\n                                total: luckysheetConfigsetting.total,\r\n                                totalPage: luckysheetConfigsetting.pageInfo.totalPage,\r\n                            });\r\n                            $(\"#luckysheet-bottom-page-info\").html(pageInfoFull);\r\n                        } else {\r\n                            let pageInfo = replaceHtml(locale_info.pageInfo, {\r\n                                total: luckysheetConfigsetting.total,\r\n                                totalPage: luckysheetConfigsetting.pageInfo.totalPage,\r\n                                currentPage: luckysheetConfigsetting.pageInfo.currentPage,\r\n                            });\r\n                            $(\"#luckysheet-bottom-page-info\").html(pageInfo);\r\n                        }\r\n                    },\r\n                );\r\n            })\r\n            .mousedown(function(e) {\r\n                e.stopPropagation();\r\n            });\r\n    }\r\n\r\n    //回到顶部\r\n    $(\"#luckysheet-bottom-bottom-top\")\r\n        .click(function() {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(0);\r\n        })\r\n        .mousedown(function(e) {\r\n            e.stopPropagation();\r\n        });\r\n\r\n    $(\"#luckysheet-wa-editor,#luckysheet-icon-morebtn-div,.luckysheet-toolbar-button\").click(function(e) {\r\n        if (this.id != \"luckysheet-icon-paintformat\" && menuButton.luckysheetPaintModelOn) {\r\n            menuButton.cancelPaintModel();\r\n        }\r\n    });\r\n}\r\n\r\n// 协同编辑其他用户不在操作的时候，且已经展示了用户名10秒，则用户名框隐藏\r\nfunction hideUsername() {\r\n    let $showEle = $$(\".luckysheet-multipleRange-show\");\r\n\r\n    if ($showEle.length === undefined) {\r\n        $showEle = [$showEle];\r\n    }\r\n\r\n    $showEle.forEach((ele) => {\r\n        const id = ele.id.replace(\"luckysheet-multipleRange-show-\", \"\");\r\n\r\n        if (Store.cooperativeEdit.usernameTimeout[\"user\" + id] === null) {\r\n            $$(\".username\", ele).style.display = \"none\";\r\n        }\r\n    });\r\n}\r\n"
  },
  {
    "path": "src/controllers/hyperlinkCtrl.js",
    "content": "import { replaceHtml } from '../utils/util';\r\nimport { getcellvalue } from '../global/getdata';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport { rowLocation, colLocation, mouseposition } from '../global/location';\r\nimport formula from '../global/formula';\r\nimport tooltip from '../global/tooltip';\r\nimport editor from '../global/editor';\r\nimport { modelHTML } from './constant';\r\nimport { selectHightlightShow } from './select';\r\nimport server from './server';\r\nimport sheetmanage from './sheetmanage';\r\nimport luckysheetFreezen from './freezen';\r\nimport menuButton from './menuButton';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\n\r\nconst hyperlinkCtrl = {\r\n    item: {\r\n        linkType: 'external', //链接类型 external外部链接，internal内部链接\r\n        linkAddress: '',  //链接地址 网页地址或工作表单元格引用\r\n        linkTooltip: '',  //提示\r\n    },\r\n    hyperlink: null,\r\n    createDialog: function(){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const hyperlinkText = _locale.insertLink;\r\n        const toolbarText = _locale.toolbar;\r\n        const buttonText = _locale.button;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-insertLink-dialog\").remove();\r\n\r\n        let sheetListOption = '';\r\n        Store.luckysheetfile.forEach(item => {\r\n            sheetListOption += `<option value=\"${item.name}\">${item.name}</option>`;\r\n        })\r\n\r\n        let content =  `<div class=\"box\">\r\n                            <div class=\"box-item\">\r\n                                <label for=\"luckysheet-insertLink-dialog-linkText\">${hyperlinkText.linkText}：</label>\r\n                                <input type=\"text\" id=\"luckysheet-insertLink-dialog-linkText\"/>\r\n                            </div>\r\n                            <div class=\"box-item\">\r\n                                <label for=\"luckysheet-insertLink-dialog-linkType\">${hyperlinkText.linkType}：</label>\r\n                                <select id=\"luckysheet-insertLink-dialog-linkType\">\r\n                                    <option value=\"external\">${hyperlinkText.external}</option>\r\n                                    <option value=\"internal\">${hyperlinkText.internal}</option>\r\n                                </select>\r\n                            </div>\r\n                            <div class=\"show-box show-box-external\">\r\n                                <div class=\"box-item\">\r\n                                    <label for=\"luckysheet-insertLink-dialog-linkAddress\">${hyperlinkText.linkAddress}：</label>\r\n                                    <input type=\"text\" id=\"luckysheet-insertLink-dialog-linkAddress\" placeholder=\"${hyperlinkText.placeholder1}\" />\r\n                                </div>\r\n                            </div>\r\n                            <div class=\"show-box show-box-internal\">\r\n                                <div class=\"box-item\">\r\n                                    <label for=\"luckysheet-insertLink-dialog-linkSheet\">${hyperlinkText.linkSheet}：</label>\r\n                                    <select id=\"luckysheet-insertLink-dialog-linkSheet\">\r\n                                        ${sheetListOption}\r\n                                    </select>\r\n                                </div>\r\n                                <div class=\"box-item\">\r\n                                    <label for=\"luckysheet-insertLink-dialog-linkCell\">${hyperlinkText.linkCell}：</label>\r\n                                    <input type=\"text\" id=\"luckysheet-insertLink-dialog-linkCell\" value=\"A1\" placeholder=\"${hyperlinkText.placeholder2}\" />\r\n                                </div>\r\n                            </div>\r\n                            <div class=\"box-item\">\r\n                                <label for=\"luckysheet-insertLink-dialog-linkTooltip\">${hyperlinkText.linkTooltip}：</label>\r\n                                <input type=\"text\" id=\"luckysheet-insertLink-dialog-linkTooltip\" placeholder=\"${hyperlinkText.placeholder3}\" />\r\n                            </div>\r\n                        </div>`;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-insertLink-dialog\", \r\n            \"addclass\": \"luckysheet-insertLink-dialog\", \r\n            \"title\": toolbarText.insertLink, \r\n            \"content\": content, \r\n            \"botton\":  `<button id=\"luckysheet-insertLink-dialog-confirm\" class=\"btn btn-primary\">${buttonText.confirm}</button>\r\n                        <button class=\"btn btn-default luckysheet-model-close-btn\">${buttonText.cancel}</button>`, \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-insertLink-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 350).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), \r\n            winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), \r\n            scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-insertLink-dialog\").css({ \r\n            \"left\": (winw + scrollLeft - myw) / 2, \r\n            \"top\": (winh + scrollTop - myh) / 3 \r\n        }).show();\r\n\r\n        _this.dataAllocation();\r\n    },\r\n    init: function (){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const hyperlinkText = _locale.insertLink;\r\n\r\n        //链接类型\r\n        $(document).off(\"change.linkType\").on(\"change.linkType\", \"#luckysheet-insertLink-dialog-linkType\", function(e){\r\n            let value = this.value;\r\n\r\n            $(\"#luckysheet-insertLink-dialog .show-box\").hide();\r\n            $(\"#luckysheet-insertLink-dialog .show-box-\" + value).show();\r\n        })\r\n\r\n        //确认按钮\r\n        $(document).off(\"click.confirm\").on(\"click.confirm\", \"#luckysheet-insertLink-dialog-confirm\", function(e){\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n            let rowIndex = last.row_focus || last.row[0];\r\n            let colIndex = last.column_focus || last.column[0];\r\n\r\n            //文本\r\n            let linkText = $(\"#luckysheet-insertLink-dialog-linkText\").val();\r\n\r\n            let linkType = $(\"#luckysheet-insertLink-dialog-linkType\").val();\r\n            let linkAddress = $(\"#luckysheet-insertLink-dialog-linkAddress\").val();\r\n            let linkSheet = $(\"#luckysheet-insertLink-dialog-linkSheet\").val();\r\n            let linkCell = $(\"#luckysheet-insertLink-dialog-linkCell\").val();\r\n            let linkTooltip = $(\"#luckysheet-insertLink-dialog-linkTooltip\").val();\r\n\r\n            if(linkType == 'external'){\r\n                if(!/^http[s]?:\\/\\//.test(linkAddress)){\r\n                    linkAddress = 'https://' + linkAddress;\r\n                }\r\n\r\n                if(!/^http[s]?:\\/\\/([\\w\\-\\.]+)+[\\w-]*([\\w\\-\\.\\/\\?%&=]+)?$/ig.test(linkAddress)){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', hyperlinkText.tooltipInfo1);\r\n                    return;\r\n                }\r\n            }\r\n            else{\r\n                if(!formula.iscelldata(linkCell)){\r\n                    tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', hyperlinkText.tooltipInfo2);\r\n                    return;\r\n                }\r\n\r\n                linkAddress = linkSheet + \"!\" + linkCell;\r\n            }\r\n\r\n            if(linkText == null || linkText.replace(/\\s/g, '') == ''){\r\n                linkText = linkAddress;\r\n            }\r\n\r\n            let item = {\r\n                linkType: linkType,\r\n                linkAddress: linkAddress,\r\n                linkTooltip: linkTooltip,\r\n            }\r\n\r\n            let historyHyperlink = $.extend(true, {}, _this.hyperlink);\r\n            let currentHyperlink = $.extend(true, {}, _this.hyperlink);\r\n\r\n            currentHyperlink[rowIndex + \"_\" + colIndex] = item;\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let cell = d[rowIndex][colIndex];\r\n\r\n            if(cell == null){\r\n                cell = {};\r\n            }\r\n\r\n            cell.fc = 'rgb(0, 0, 255)';\r\n            cell.un = 1;\r\n            cell.v = cell.m = linkText;\r\n\r\n            d[rowIndex][colIndex] = cell;\r\n\r\n            _this.ref(\r\n                historyHyperlink, \r\n                currentHyperlink, \r\n                Store.currentSheetIndex, \r\n                d, \r\n                [{ row: [rowIndex, rowIndex], column: [colIndex, colIndex] }]\r\n            );\r\n\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-insertLink-dialog\").hide();\r\n        })\r\n    },\r\n    dataAllocation: function(){\r\n        let _this = this;\r\n\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rowIndex = last.row_focus || last.row[0];\r\n        let colIndex = last.column_focus || last.column[0];\r\n\r\n        let hyperlink = _this.hyperlink || {};\r\n        let item = hyperlink[rowIndex + \"_\" + colIndex] || {};\r\n\r\n        //文本\r\n        let text = getcellvalue(rowIndex, colIndex, null, 'm');\r\n        $(\"#luckysheet-insertLink-dialog-linkText\").val(text);\r\n\r\n        //链接类型\r\n        let linkType = item.linkType || 'external';\r\n        $(\"#luckysheet-insertLink-dialog-linkType\").val(linkType);\r\n\r\n        $(\"#luckysheet-insertLink-dialog .show-box\").hide();\r\n        $(\"#luckysheet-insertLink-dialog .show-box-\" + linkType).show();\r\n\r\n        //链接地址\r\n        let linkAddress = item.linkAddress || '';\r\n\r\n        if(linkType == 'external'){\r\n            $(\"#luckysheet-insertLink-dialog-linkAddress\").val(linkAddress);\r\n        }\r\n        else{\r\n            if(formula.iscelldata(linkAddress)){\r\n                let sheettxt = linkAddress.split(\"!\")[0];\r\n                let rangetxt = linkAddress.split(\"!\")[1];\r\n\r\n                $(\"#luckysheet-insertLink-dialog-linkSheet\").val(sheettxt);\r\n                $(\"#luckysheet-insertLink-dialog-linkCell\").val(rangetxt);\r\n            }\r\n        }\r\n\r\n        //提示\r\n        let linkTooltip = item.linkTooltip || '';\r\n        $(\"#luckysheet-insertLink-dialog-linkTooltip\").val(linkTooltip);\r\n    },\r\n    cellFocus: function(r, c){\r\n        let _this = this;\r\n\r\n        if(_this.hyperlink == null || _this.hyperlink[r + '_' + c] == null){\r\n            return;\r\n        }\r\n\r\n        let item = _this.hyperlink[r + '_' + c];\r\n\r\n        if(item.linkType == 'external'){\r\n            window.open(item.linkAddress);\r\n        }\r\n        else{\r\n            let cellrange = formula.getcellrange(item.linkAddress);\r\n            let sheetIndex = cellrange.sheetIndex;\r\n            let range = [{\r\n                row: cellrange.row,\r\n                column: cellrange.column\r\n            }];\r\n\r\n            if(sheetIndex != Store.currentSheetIndex){\r\n                $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n                $(\"#luckysheet-sheets-item\" + sheetIndex).addClass(\"luckysheet-sheets-item-active\");\r\n\r\n                sheetmanage.changeSheet(sheetIndex);\r\n            }\r\n\r\n            Store.luckysheet_select_save = range;\r\n            selectHightlightShow(true);\r\n\r\n            let row_pre = cellrange.row[0] - 1 == -1 ? 0 : Store.visibledatarow[cellrange.row[0] - 1];\r\n            let col_pre = cellrange.column[0] - 1 == -1 ? 0 : Store.visibledatacolumn[cellrange.column[0] - 1];\r\n\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre);\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre);\r\n        }\r\n    },\r\n    overshow: function(event){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-hyperlink-overshow\").remove();\r\n\r\n        if($(event.target).closest(\"#luckysheet-cell-main\").length == 0){\r\n            return;\r\n        }\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let x = mouse[0] + scrollLeft;\r\n        let y = mouse[1] + scrollTop;\r\n\r\n        if(luckysheetFreezen.freezenverticaldata != null && mouse[0] < (luckysheetFreezen.freezenverticaldata[0] - luckysheetFreezen.freezenverticaldata[2])){\r\n            return;\r\n        }\r\n\r\n        if(luckysheetFreezen.freezenhorizontaldata != null && mouse[1] < (luckysheetFreezen.freezenhorizontaldata[0] - luckysheetFreezen.freezenhorizontaldata[2])){\r\n            return;\r\n        }\r\n\r\n        let row_index = rowLocation(y)[2];\r\n        let col_index = colLocation(x)[2];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n        if(!!margeset){\r\n            row_index = margeset.row[2];\r\n            col_index = margeset.column[2];\r\n        }\r\n\r\n        if(_this.hyperlink == null || _this.hyperlink[row_index + \"_\" + col_index] == null){\r\n            return;\r\n        }\r\n\r\n        let item = _this.hyperlink[row_index + \"_\" + col_index];\r\n        let linkTooltip = item.linkTooltip;\r\n\r\n        if(linkTooltip == null || linkTooltip.replace(/\\s/g, '') == ''){\r\n            linkTooltip = item.linkAddress;\r\n        }\r\n\r\n        let row = Store.visibledatarow[row_index], \r\n            row_pre = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1];\r\n        let col = Store.visibledatacolumn[col_index], \r\n            col_pre = col_index - 1 == -1 ? 0 : Store.visibledatacolumn[col_index - 1];\r\n\r\n        if(!!margeset){\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n            \r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n        }\r\n\r\n        let html = `<div id=\"luckysheet-hyperlink-overshow\" style=\"background:#fff;padding:5px 10px;border:1px solid #000;box-shadow:2px 2px #999;position:absolute;left:${col_pre}px;top:${row + 5}px;z-index:100;\">\r\n                        <div>${linkTooltip}</div>\r\n                        <div>单击鼠标可以追踪</div>\r\n                    </div>`;\r\n\r\n        $(html).appendTo($(\"#luckysheet-cell-main\"));\r\n    },\r\n    ref: function(historyHyperlink, currentHyperlink, sheetIndex, d, range){\r\n        let _this = this;\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n\r\n            let redo = {};\r\n            redo[\"type\"] = \"updateHyperlink\";\r\n            redo[\"sheetIndex\"] = sheetIndex;\r\n            redo[\"historyHyperlink\"] = historyHyperlink;\r\n            redo[\"currentHyperlink\"] = currentHyperlink;\r\n            redo[\"data\"] = Store.flowdata; \r\n            redo[\"curData\"] = d;\r\n            redo[\"range\"] = range; \r\n            Store.jfredo.push(redo); \r\n        }\r\n\r\n        _this.hyperlink = currentHyperlink;\r\n        Store.luckysheetfile[getSheetIndex(sheetIndex)].hyperlink = currentHyperlink;\r\n\r\n        Store.flowdata = d;\r\n        editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n        Store.luckysheetfile[getSheetIndex(sheetIndex)].data = Store.flowdata;\r\n\r\n        //共享编辑模式\r\n        if(server.allowUpdate){ \r\n            server.saveParam(\"all\", sheetIndex, currentHyperlink, { \"k\": \"hyperlink\" });\r\n            server.historyParam(Store.flowdata, sheetIndex, range[0]);\r\n        }\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n}\r\n\r\nexport default hyperlinkCtrl;"
  },
  {
    "path": "src/controllers/ifFormulaGenerator.js",
    "content": "import formula from '../global/formula';\r\nimport editor from '../global/editor';\r\nimport {luckysheetupdateCell} from './updateCell';\r\nimport { modelHTML } from './constant';\r\nimport { replaceHtml } from '../utils/util';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n//if公式生成器\r\nconst ifFormulaGenerator = {\r\n    singleRangeFocus: false,\r\n    init: function(){\r\n        let _this = this;\r\n        const _locale = locale();\r\n        const locale_formula = _locale.formula;\r\n        const locale_button = _locale.button;\r\n        //点击选择单元格\r\n        $(document).off(\"focus.IFcompareValue\").on(\"focus.IFcompareValue\", \"#luckysheet-ifFormulaGenerator-dialog #compareValue\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            _this.singleRangeFocus = true;\r\n        });\r\n        $(document).off(\"click.IFsingRange\").on(\"click.IFsingRange\", \"#luckysheet-ifFormulaGenerator-dialog .singRange\", function(){\r\n            let value = $(\"#luckysheet-ifFormulaGenerator-dialog #compareValue\").val().trim();\r\n\r\n            if(formula.iscelldata(value)){\r\n                _this.singleRangeDialog(value);\r\n            }\r\n            else{\r\n                _this.singleRangeDialog();\r\n            }\r\n        });\r\n        $(document).off(\"click.IFsingRangeConfirm\").on(\"click.IFsingRangeConfirm\", \"#luckysheet-ifFormulaGenerator-singleRange-confirm\", function(){\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n\r\n            $(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").show();\r\n\r\n            let value = $(this).parents(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").find(\"input\").val().trim();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog #compareValue\").val(value);\r\n\r\n            _this.singleRangeFocus = false;                 \r\n        });\r\n        $(document).off(\"click.IFsingRangeCancel\").on(\"click.IFsingRangeCancel\", \"#luckysheet-ifFormulaGenerator-singleRange-cancel\", function(){\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n\r\n            $(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").show();\r\n\r\n            _this.singleRangeFocus = false;                 \r\n        });\r\n        $(document).off(\"click.IFsingRangeClose\").on(\"click.IFsingRangeClose\", \"#luckysheet-ifFormulaGenerator-singleRange-dialog .luckysheet-modal-dialog-title-close\", function(){\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").show();\r\n\r\n            _this.singleRangeFocus = false;\r\n        });\r\n\r\n        //点击选择范围\r\n        $(document).off(\"click.IFmultiRange\").on(\"click.IFmultiRange\", \"#luckysheet-ifFormulaGenerator-dialog .multiRange\", function(){\r\n            _this.multiRangeDialog();\r\n\r\n            _this.singleRangeFocus = false;\r\n        });\r\n        $(document).off(\"click.IFmultiRangeConfirm\").on(\"click.IFmultiRangeConfirm\", \"#luckysheet-ifFormulaGenerator-multiRange-confirm\", function(){\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n\r\n            $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").show();\r\n\r\n            let value = $(this).parents(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").find(\"input\").val().trim();\r\n            let cellrange = formula.getcellrange(value);\r\n            let str_r = cellrange[\"row\"][0], \r\n                end_r = cellrange[\"row\"][1], \r\n                str_c = cellrange[\"column\"][0], \r\n                end_c = cellrange[\"column\"][1];\r\n            let d = editor.deepCopyFlowData(Store.flowdata);//取数据\r\n            let arr = [];\r\n            \r\n            //获取范围内所有数值\r\n            for(let r = str_r; r <= end_r; r++){\r\n                for(let c = str_c; c <= end_c; c++){\r\n                    if(d[r] != null && d[r][c] != null && d[r][c][\"ct\"] != null && d[r][c][\"ct\"][\"t\"] == \"n\"){\r\n                        arr.push(d[r][c][\"v\"]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            //从大到小排序\r\n            for(let j = 0; j < arr.length; j++){\r\n                for(let k = 0; k < arr.length - 1 - j; k++){\r\n                    if(arr[k] < arr[k + 1]){\r\n                        let temp = arr[k];\r\n                        arr[k] = arr[k + 1];\r\n                        arr[k + 1] = temp;\r\n                    }\r\n                }\r\n            }\r\n\r\n            let largeNum = arr[0];\r\n            let smallNum = arr[arr.length - 1];\r\n            \r\n            //赋值\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog #smallRange\").val(smallNum);\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog #largeRange\").val(largeNum);\r\n        });\r\n        $(document).off(\"click.IFmultiRangeCancel\").on(\"click.IFmultiRangeCancel\", \"#luckysheet-ifFormulaGenerator-multiRange-cancel\", function(){\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n\r\n            $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").show();\r\n        });\r\n        $(document).off(\"click.IFmultiRangeClose\").on(\"click.IFmultiRangeClose\", \"#luckysheet-ifFormulaGenerator-multiRange-dialog .luckysheet-modal-dialog-title-close\", function(){\r\n            $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").show();\r\n        });\r\n\r\n        //选择 划分方式\r\n        $(document).on(\"change\", \"#DivisionMethod\", function(){\r\n            let value = $(this).find(\"option:selected\").val();\r\n\r\n            if(value == \"2\"){\r\n                $(\"#DivisionMethodVal\").hide();\r\n            }\r\n            else{\r\n                $(\"#DivisionMethodVal\").show();   \r\n            }\r\n\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog .ifList\").empty();\r\n        });\r\n\r\n        //点击 生成 按钮\r\n        $(document).off(\"click.IFcreateBtn\").on(\"click.IFcreateBtn\", \"#luckysheet-ifFormulaGenerator-dialog #createBtn\", function(){\r\n            let compareValue = $(this).parents(\"#luckysheet-ifFormulaGenerator-dialog\").find(\"#compareValue\").val().trim();\r\n            if(compareValue == \"\"){\r\n                _this.info(locale_formula.ifGenTipNotNullValue);\r\n                return;\r\n            }\r\n\r\n            let method = $(this).parents(\"#luckysheet-ifFormulaGenerator-dialog\").find(\"#DivisionMethod option:selected\").val();\r\n            if(method == \"2\"){\r\n                let itemHtml =  '<div class=\"item\">'+\r\n                                    '<input type=\"number\" class=\"smallNum formulaInputFocus\"/>'+\r\n                                    '<select class=\"operator\">'+\r\n                                        '<option value=\"0\"> <= </option>'+\r\n                                        '<option value=\"1\"> < </option>'+\r\n                                    '</select>'+\r\n                                    '<span class=\"compareValue\">'+ compareValue +'</span>'+\r\n                                    '<select class=\"operator2\">'+\r\n                                        '<option value=\"0\"> <= </option>'+\r\n                                        '<option value=\"1\" selected=\"selected\"> < </option>'+\r\n                                    '</select>'+\r\n                                    '<input type=\"number\" class=\"largeNum formulaInputFocus\"/>'+\r\n                                    '<span>'+locale_formula.ifGenTipLableTitile+'：</span>'+\r\n                                    '<input type=\"text\" class=\"markText formulaInputFocus\" value=\"\">'+\r\n                                    '<i class=\"fa fa-remove\" aria-hidden=\"true\"></i>'+\r\n                                '</div>';\r\n                $(\"#luckysheet-ifFormulaGenerator-dialog .ifList\").append(itemHtml);                \r\n            }\r\n            else{\r\n                let smallRange = $(this).parents(\"#luckysheet-ifFormulaGenerator-dialog\").find(\"#smallRange\").val().trim();\r\n                let largeRange = $(this).parents(\"#luckysheet-ifFormulaGenerator-dialog\").find(\"#largeRange\").val().trim();\r\n                let DivisionMethodVal = $(this).parents(\"#luckysheet-ifFormulaGenerator-dialog\").find(\"#DivisionMethodVal\").val().trim();\r\n                \r\n                if(smallRange == \"\" || largeRange == \"\"){\r\n                    _this.info(locale_formula.ifGenTipRangeNotforNull);\r\n                    return;\r\n                }\r\n                else if(DivisionMethodVal == \"\"){\r\n                    _this.info(locale_formula.ifGenTipCutValueNotforNull);\r\n                    return;\r\n                }\r\n\r\n                _this.getIfList(compareValue, smallRange, largeRange, method, DivisionMethodVal);\r\n            }\r\n        });\r\n\r\n        //点击 删除条件\r\n        $(document).on(\"click\", \"#luckysheet-ifFormulaGenerator-dialog .item .fa-remove\", function(){\r\n            $(this).parents(\".item\").remove();\r\n        });\r\n\r\n        //点击 确认 按钮\r\n        $(document).off(\"click.IFconfirmBtn\").on(\"click.IFconfirmBtn\", \"#luckysheet-ifFormulaGenerator-dialog-confirm\", function(){\r\n            let $item = $(this).parents(\"#luckysheet-ifFormulaGenerator-dialog\").find(\".ifList .item\");\r\n            let str = '';\r\n\r\n            $($item.toArray().reverse()).each(function(i, e){\r\n                let smallNum = $(e).find(\".smallNum\").val().trim();\r\n                let largeNum = $(e).find(\".largeNum\").val().trim();\r\n                let operator = $(e).find(\".operator option:selected\").val();\r\n                let operator2 = $(e).find(\".operator2 option:selected\").val();\r\n                let compareValue = $(e).find(\".compareValue\").text();\r\n\r\n                let markText = $(e).find(\".markText\").val().trim();\r\n                if(markText == \"\"){\r\n                    markText = locale_formula.ifGenTipLableTitile + (i + 1);\r\n                }\r\n\r\n                if(smallNum == \"\" && largeNum == \"\"){\r\n                    return true;\r\n                }\r\n\r\n                let s;\r\n                if(operator == \"0\"){\r\n                    s = compareValue + \">=\" + smallNum;\r\n                }\r\n                else{\r\n                    s = compareValue + \">\" + smallNum;\r\n                }\r\n\r\n                let l;\r\n                if(operator2 == \"0\"){\r\n                    l = compareValue + \"<=\" + largeNum;\r\n                }\r\n                else{\r\n                    l = compareValue + \"<\" + largeNum;\r\n                }\r\n\r\n                let a;\r\n                if(i == 0 && largeNum == \"\"){\r\n                    a = s;\r\n                }\r\n                else if(i == ($item.length - 1) && smallNum == \"\"){\r\n                    a = l;\r\n                }\r\n                else{\r\n                    a = \"and(\"+s+\",\"+l+\")\";\r\n                }\r\n\r\n                if(i == 0){\r\n                    str = 'if('+ a +',\"'+ markText +'\")';\r\n                }\r\n                else{\r\n                    str = 'if('+ a +',\"'+ markText +'\",'+ str +')';\r\n                }\r\n            })\r\n            \r\n            if(str.length == 0){\r\n                _this.info(locale_formula.ifGenTipNotGenCondition);\r\n                return;\r\n            }\r\n\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog\").hide();\r\n\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n            let row_index = last[\"row_focus\"], \r\n                col_index = last[\"column_focus\"];\r\n            \r\n            luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n\r\n            $(\"#luckysheet-rich-text-editor\").html(\"=\" + str);\r\n            $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n\r\n            $(\"#luckysheet-wa-functionbox-confirm\").click();\r\n        });\r\n\r\n        //info\r\n        $(document).on(\"click\", \"#luckysheet-ifFormulaGenerator-info .luckysheet-model-close-btn\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n        });\r\n        $(document).on(\"click\", \"#luckysheet-ifFormulaGenerator-info .luckysheet-modal-dialog-title-close\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").show();\r\n        });\r\n    },\r\n    ifFormulaDialog: function(fp){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_formula = _locale.formula;\r\n        const locale_button = _locale.button;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-ifFormulaGenerator-dialog\").remove();\r\n\r\n        let compareValue = \"\";\r\n        let ifListHtml = '';\r\n\r\n        if(!!fp){\r\n            let arr = fp.split(\"if(\");\r\n\r\n            for(let i = 1; i < arr.length; i++){\r\n                let txt = arr[i].replace(\"and(\",\"\").replace(/\\)/g,\"\").replace(/\\\"/g,\"\");\r\n                let arr2 = txt.split(\",\");\r\n                arr2 = _this.clearArr(arr2);\r\n                \r\n                compareValue = _this.splitTxt(arr2[0])[0];\r\n\r\n                let smallNum, largeNum, markText;\r\n                if(arr2.length == 3){\r\n                    smallNum = _this.splitTxt(arr2[0])[1];\r\n                    largeNum = _this.splitTxt(arr2[1])[2];\r\n                    markText = arr2[2];\r\n                }\r\n                else{\r\n                    smallNum = _this.splitTxt(arr2[0])[1];\r\n                    largeNum = _this.splitTxt(arr2[0])[2];\r\n                    markText = arr2[1];\r\n                }\r\n\r\n                let itemHtml =  '<div class=\"item\">'+\r\n                                    '<input type=\"number\" class=\"smallNum formulaInputFocus\" value=\"'+ smallNum +'\"/>'+\r\n                                    '<select class=\"operator\">'+\r\n                                        '<option value=\"0\"> <= </option>'+\r\n                                        '<option value=\"1\"> < </option>'+\r\n                                    '</select>'+\r\n                                    '<span class=\"compareValue\">'+ compareValue +'</span>'+\r\n                                    '<select class=\"operator2\">'+\r\n                                        '<option value=\"0\"> <= </option>'+\r\n                                        '<option value=\"1\" selected=\"selected\"> < </option>'+\r\n                                    '</select>'+\r\n                                    '<input type=\"number\" class=\"largeNum formulaInputFocus\" value=\"'+ largeNum +'\"/>'+\r\n                                    '<span>'+locale_formula.ifGenTipLableTitile+'：</span>'+\r\n                                    '<input type=\"text\" class=\"markText formulaInputFocus\" value=\"'+ markText +'\">'+\r\n                                    '<i class=\"fa fa-remove\" aria-hidden=\"true\"></i>'+\r\n                                '</div>'; \r\n                ifListHtml += itemHtml;                             \r\n            }\r\n        }\r\n\r\n        let content = '<div class=\"ifAttr\">'+\r\n                        '<div class=\"attrBox\">'+\r\n                            '<label for=\"compareValue\"> '+ locale_formula.ifGenCompareValueTitle +' </label>'+\r\n                            '<div class=\"inpBox\">'+\r\n                                '<input id=\"compareValue\" class=\"formulaInputFocus\" value=\"'+ compareValue +'\"/>'+\r\n                                '<i class=\"singRange fa fa-table\" aria-hidden=\"true\" title=\"'+ locale_formula.ifGenSelectCellTitle +'\"></i>'+\r\n                            '</div>'+\r\n                        '</div>'+\r\n                        '<div class=\"attrBox\">'+\r\n                            '<label for=\"smallRange\"> '+ locale_formula.ifGenRangeTitle +' </label>'+\r\n                            '<input type=\"number\" id=\"smallRange\" class=\"formulaInputFocus\"/>'+\r\n                            '<span class=\"text\"> '+ locale_formula.ifGenRangeTo +' </span>'+\r\n                            '<input type=\"number\" id=\"largeRange\" class=\"formulaInputFocus\"/>'+\r\n                            '<div id=\"rangeAssess\">'+\r\n                                '<span> '+ locale_formula.ifGenRangeEvaluate +' </span>'+\r\n                                '<i class=\"multiRange fa fa-table\" aria-hidden=\"true\" title=\"'+ locale_formula.ifGenSelectRangeTitle +'\"></i>'+\r\n                            '</div>'+\r\n                        '</div>'+\r\n                        '<div class=\"attrBox\">'+\r\n                            '<label for=\"DivisionMethod\"> '+ locale_formula.ifGenCutWay +' </label>'+\r\n                            '<select id=\"DivisionMethod\">'+\r\n                                '<option value=\"0\"> '+ locale_formula.ifGenCutSame +' </option>'+\r\n                                '<option value=\"1\"> '+ locale_formula.ifGenCutNpiece +' </option>'+\r\n                                '<option value=\"2\"> '+ locale_formula.ifGenCutCustom +' </option>'+\r\n                            '</select>'+\r\n                            '<input id=\"DivisionMethodVal\" class=\"formulaInputFocus\"/>'+\r\n                            '<div id=\"createBtn\"> '+ locale_formula.ifGenCutSame +' </div>'+\r\n                        '</div>'+\r\n                      '</div>'+\r\n                      '<div class=\"ifList\">'+ifListHtml+'</div>';\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-ifFormulaGenerator-dialog\", \r\n            \"addclass\": \"luckysheet-ifFormulaGenerator-dialog\", \r\n            \"title\": locale_formula.ifGenerate, \r\n            \"content\": content, \r\n            \"botton\": '<button id=\"luckysheet-ifFormulaGenerator-dialog-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-ifFormulaGenerator-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 590).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-ifFormulaGenerator-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n    },\r\n    clearArr: function(arr){\r\n        for(let i = 0; i < arr.length; i++){\r\n            if(arr[i] == \"\" || arr[i] == null || arr[i] == undefined){\r\n                arr.splice(i, 1);\r\n            }\r\n        }\r\n\r\n        return arr;\r\n    },\r\n    splitTxt: function(txt){\r\n        let compareValue, smallNum, largeNum;\r\n        \r\n        if(txt.indexOf(\">=\") != -1){\r\n            compareValue = txt.split(\">=\")[0];\r\n            smallNum = txt.split(\">=\")[1];\r\n\r\n            return [compareValue, smallNum, largeNum];\r\n        }\r\n        else if(txt.indexOf(\">\") != -1){\r\n            compareValue = txt.split(\">\")[0];\r\n            smallNum = txt.split(\">\")[1];\r\n\r\n            return [compareValue, smallNum, largeNum];\r\n        }\r\n        else if(txt.indexOf(\"<=\") != -1){\r\n            compareValue = txt.split(\"<=\")[0];\r\n            largeNum = txt.split(\"<=\")[1];\r\n\r\n            return [compareValue, smallNum, largeNum];\r\n        }\r\n        else if(txt.indexOf(\"<\") != -1){\r\n            compareValue = txt.split(\"<\")[0];\r\n            largeNum = txt.split(\"<\")[1];\r\n\r\n            return [compareValue, smallNum, largeNum];\r\n        }\r\n    },\r\n    singleRangeDialog: function(value){\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-ifFormulaGenerator-dialog\").hide();\r\n        $(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").remove();\r\n\r\n        const _locale = locale();\r\n        const locale_formula = _locale.formula;\r\n        const locale_button = _locale.button;\r\n\r\n        if(value == null){\r\n            value = \"\";\r\n        }\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-ifFormulaGenerator-singleRange-dialog\", \r\n            \"addclass\": \"luckysheet-ifFormulaGenerator-singleRange-dialog\", \r\n            \"title\": locale_formula.ifGenTipSelectCell, \r\n            \"content\": '<input readonly=\"readonly\" placeholder=\"'+locale_formula.ifGenTipSelectCellPlace+'\" value=\"'+ value +'\">', \r\n            \"botton\": '<button id=\"luckysheet-ifFormulaGenerator-singleRange-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button id=\"luckysheet-ifFormulaGenerator-singleRange-cancel\" class=\"btn btn-default\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 400).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-ifFormulaGenerator-singleRange-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n    },\r\n    multiRangeDialog: function(){\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-ifFormulaGenerator-dialog\").hide();\r\n        $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").remove();\r\n\r\n        const _locale = locale();\r\n        const locale_formula = _locale.formula;\r\n        const locale_button = _locale.button;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-ifFormulaGenerator-multiRange-dialog\", \r\n            \"addclass\": \"luckysheet-ifFormulaGenerator-multiRange-dialog\", \r\n            \"title\": locale_formula.ifGenTipSelectRange, \r\n            \"content\": '<input readonly=\"readonly\" placeholder=\"'+locale_formula.ifGenTipSelectRangePlace+'\" value=\"\">', \r\n            \"botton\": '<button id=\"luckysheet-ifFormulaGenerator-multiRange-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button id=\"luckysheet-ifFormulaGenerator-multiRange-cancel\" class=\"btn btn-default\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 400).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n    },\r\n    getIfList: function(compareValue, smallRange, largeRange, method, methodVal){\r\n        const locale_formula = locale().formula;\r\n\r\n        $(\"#luckysheet-ifFormulaGenerator-dialog .ifList\").empty();\r\n\r\n        smallRange = parseInt(smallRange);\r\n        largeRange = parseInt(largeRange);\r\n        methodVal = parseInt(methodVal);\r\n\r\n        let arr = [];\r\n\r\n        if(method == \"0\"){\r\n            let len = Math.ceil((largeRange - smallRange) / methodVal); \r\n            for(let i = 0; i <= len; i++){\r\n                let num = smallRange + methodVal * i;\r\n                if(i == 0 || num >= largeRange){\r\n                    arr.push(\"\");\r\n                }\r\n                else{\r\n                    arr.push(num);\r\n                }\r\n            }\r\n            \r\n        }\r\n        else if(method == \"1\"){\r\n            let addnum = Math.ceil((largeRange - smallRange) / methodVal);\r\n            for(let i = 0; i <= methodVal; i++){\r\n                let num = smallRange + addnum * i;\r\n                if(i == 0 || num >= largeRange){\r\n                    arr.push(\"\");\r\n                }\r\n                else{\r\n                    arr.push(num);\r\n                }\r\n            }\r\n        }\r\n        for(let j = 0; j < arr.length - 1; j++){\r\n            let markText;\r\n            if(j == 0){\r\n                markText = \"小于\" + arr[j + 1];\r\n            }\r\n            else if(j == arr.length - 2){\r\n                markText = \"大于等于\" + arr[j];\r\n            }\r\n            else{\r\n                markText = arr[j] + \"到\" + arr[j + 1];\r\n            }\r\n\r\n            let itemHtml =  '<div class=\"item\">'+\r\n                                '<input type=\"number\" class=\"smallNum formulaInputFocus\" value=\"'+ arr[j] +'\"/>'+\r\n                                '<select class=\"operator\">'+\r\n                                    '<option value=\"0\"> <= </option>'+\r\n                                    '<option value=\"1\"> < </option>'+\r\n                                '</select>'+\r\n                                '<span class=\"compareValue\">'+ compareValue +'</span>'+\r\n                                '<select class=\"operator2\">'+\r\n                                    '<option value=\"0\"> <= </option>'+\r\n                                    '<option value=\"1\" selected=\"selected\"> < </option>'+\r\n                                '</select>'+\r\n                                '<input type=\"number\" class=\"largeNum formulaInputFocus\" value=\"'+ arr[j + 1] +'\"/>'+\r\n                                '<span>'+locale_formula.ifGenTipLableTitile+'：</span>'+\r\n                                '<input type=\"text\" class=\"markText formulaInputFocus\" value=\"'+ markText +'\">'+\r\n                                '<i class=\"fa fa-remove\" aria-hidden=\"true\"></i>'+\r\n                            '</div>';\r\n            $(\"#luckysheet-ifFormulaGenerator-dialog .ifList\").append(itemHtml);\r\n        }\r\n    },\r\n    info: function(title){\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-ifFormulaGenerator-info\").remove();\r\n\r\n        const _locale = locale();\r\n        const locale_button = _locale.button;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-ifFormulaGenerator-info\", \r\n            \"addclass\": \"\", \r\n            \"title\": title, \r\n            \"content\": \"\", \r\n            \"botton\": '<button class=\"btn btn-default luckysheet-model-close-btn\">&nbsp;&nbsp;'+locale_button.close+'&nbsp;&nbsp;</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-ifFormulaGenerator-info\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-ifFormulaGenerator-info\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n    }\r\n}\r\n\r\nexport default ifFormulaGenerator;"
  },
  {
    "path": "src/controllers/imageCtrl.js",
    "content": "import { mouseposition } from '../global/location';\r\nimport server from './server';\r\nimport luckysheetsizeauto from './resize';\r\nimport { modelHTML } from './constant';\r\nimport {checkProtectionAuthorityNormal} from './protection';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { setluckysheet_scroll_status } from '../methods/set';\r\nimport { replaceHtml } from '../utils/util';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport tooltip from '../global/tooltip';\r\nimport method from '../global/method';\r\n\r\nconst imageCtrl = {\r\n    imgItem: {\r\n        type: '3',  //1移动并调整单元格大小 2移动并且不调整单元格的大小 3不要移动单元格并调整其大小\r\n        src: '',  //图片url\r\n        originWidth: null,  //图片原始宽度\r\n        originHeight: null,  //图片原始高度\r\n        default: {\r\n            width: null,  //图片 宽度\r\n            height: null,  //图片 高度\r\n            left: null,  //图片离表格左边的 位置\r\n            top: null,  //图片离表格顶部的 位置\r\n        },\r\n        crop: {\r\n            width: null,  //图片裁剪后 宽度\r\n            height: null,  //图片裁剪后 高度\r\n            offsetLeft: 0,  //图片裁剪后离未裁剪时 左边的位移\r\n            offsetTop: 0,  //图片裁剪后离未裁剪时 顶部的位移\r\n        },\r\n        isFixedPos: false,  //固定位置\r\n        fixedLeft: null,  //固定位置 左位移\r\n        fixedTop: null,  //固定位置 右位移\r\n        border: {\r\n            width: 0,  //边框宽度\r\n            radius: 0,  //边框半径\r\n            style: 'solid',  //边框类型\r\n            color: '#000',  //边框颜色\r\n        }\r\n    },\r\n    images: null,\r\n    currentImgId: null,\r\n    currentWinW: null,\r\n    currentWinH: null,\r\n    resize: null,  \r\n    resizeXY: null,\r\n    move: false,\r\n    moveXY: null,\r\n    cropChange: null,  \r\n    cropChangeXY: null,\r\n    cropChangeObj: null,\r\n    copyImgItemObj: null,\r\n    insertImg: function (file) {\r\n        const uploadImage = Store.toJsonOptions && Store.toJsonOptions['uploadImage'];\r\n        if (typeof uploadImage === 'function') {\r\n            // 上传形式\r\n            uploadImage(file).then(url => {\r\n                imageCtrl._insertImg(url);\r\n            }).catch(error => {\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', '图片上传失败');\r\n            });\r\n        } else {\r\n            // 内部base64形式\r\n            let render = new FileReader();\r\n            render.readAsDataURL(file);\r\n\r\n            render.onload = function(event){\r\n                let src = event.target.result;\r\n                imageCtrl._insertImg(src);\r\n                $(\"#luckysheet-imgUpload\").val(\"\");\r\n            }\r\n        }\r\n    },\r\n\r\n    _insertImg: function(src){\r\n        let _this = this;\r\n        \r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rowIndex = last.row_focus || 0;\r\n        let colIndex = last.column_focus || 0;\r\n        let left = colIndex == 0 ? 0 : Store.visibledatacolumn[colIndex - 1];\r\n        let top = rowIndex == 0 ? 0 : Store.visibledatarow[rowIndex - 1];\r\n\r\n        let image = new Image();\r\n        image.onload = function(){\r\n            let width = image.width,\r\n                height = image.height;\r\n\r\n            let img = {\r\n                src: src,\r\n                left: left,\r\n                top: top,\r\n                originWidth: width,\r\n                originHeight: height\r\n            }\r\n\r\n            _this.addImgItem(img);\r\n        }\r\n        let imageUrlHandle = Store.toJsonOptions && Store.toJsonOptions['imageUrlHandle'];\r\n        image.src = typeof imageUrlHandle === 'function' ? imageUrlHandle(src) : src;\r\n    },\r\n    generateRandomId: function(prefix) {\r\n        if(prefix == null){\r\n            prefix = \"img\";\r\n        }\r\n\r\n        let userAgent = window.navigator.userAgent.replace(/[^a-zA-Z0-9]/g, \"\").split(\"\");\r\n\r\n        let mid = \"\";\r\n\r\n        for(let i = 0; i < 12; i++){\r\n            mid += userAgent[Math.round(Math.random() * (userAgent.length - 1))];\r\n        }\r\n\r\n        let time = new Date().getTime();\r\n\r\n        return prefix + \"_\" + mid + \"_\" + time;\r\n    },\r\n    modelHtml: function(id, imgItem) {\r\n        let _this = this;\r\n\r\n        let imageUrlHandle = Store.toJsonOptions && Store.toJsonOptions['imageUrlHandle'];\r\n        let src = typeof imageUrlHandle === 'function' ? imageUrlHandle(imgItem.src) : imgItem.src;\r\n        let imgItemParam = _this.getImgItemParam(imgItem);\r\n\r\n        let width = imgItemParam.width;\r\n        let height = imgItemParam.height;\r\n        let left = imgItemParam.left;\r\n        let top = imgItemParam.top;\r\n        let position = imgItemParam.position;\r\n\r\n        let borderWidth = imgItem.border.width;\r\n\r\n        return  `<div id=\"${id}\" class=\"luckysheet-modal-dialog luckysheet-modal-dialog-image\" style=\"width:${width}px;height:${height}px;padding:0;position:${position};left:${left}px;top:${top}px;z-index:200;\">\r\n                    <div class=\"luckysheet-modal-dialog-content\" style=\"width:100%;height:100%;overflow:hidden;position:relative;\">\r\n                        <img src=\"${src}\" style=\"position:absolute;width:${imgItem.default.width * Store.zoomRatio}px;height:${imgItem.default.height * Store.zoomRatio}px;left:${-imgItem.crop.offsetLeft * Store.zoomRatio}px;top:${-imgItem.crop.offsetTop * Store.zoomRatio}px;\" />\r\n                    </div>\r\n                    <div class=\"luckysheet-modal-dialog-border\" style=\"border:${borderWidth}px ${imgItem.border.style} ${imgItem.border.color};border-radius:${imgItem.border.radius * Store.zoomRatio}px;position:absolute;left:${-borderWidth}px;right:${-borderWidth}px;top:${-borderWidth}px;bottom:${-borderWidth}px;\"></div>\r\n                </div>`;\r\n    },\r\n    getSliderHtml: function() {\r\n        let imageText = locale().imageText;\r\n\r\n        return `<div id=\"luckysheet-modal-dialog-slider-imageCtrl\" class=\"luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-imageCtrl\" style=\"display:block;\">\r\n                    <div class=\"luckysheet-modal-dialog-slider-title\">\r\n                        <span>${imageText.imageSetting}</span>\r\n                        <span class=\"luckysheet-model-close-btn\" title=\"${imageText.close}\">\r\n                            <i class=\"fa fa-times\" aria-hidden=\"true\"></i>\r\n                        </span>\r\n                    </div>\r\n                    <div class=\"luckysheet-modal-dialog-slider-content\">\r\n                        <div class=\"slider-box\">\r\n                            <div class=\"slider-box-title\">${imageText.conventional}</div>\r\n                            <div class=\"slider-box-radios\">\r\n                                <div class=\"radio-item\">\r\n                                    <input type=\"radio\" id=\"imgItemType1\" name=\"imgItemType\" value=\"1\">\r\n                                    <label for=\"imgItemType1\">${imageText.moveCell1}</label>\r\n                                </div>\r\n                                <div class=\"radio-item\">\r\n                                    <input type=\"radio\" id=\"imgItemType2\" name=\"imgItemType\" value=\"2\">\r\n                                    <label for=\"imgItemType2\">${imageText.moveCell2}</label>\r\n                                </div>\r\n                                <div class=\"radio-item\">\r\n                                    <input type=\"radio\" id=\"imgItemType3\" name=\"imgItemType\" value=\"3\">\r\n                                    <label for=\"imgItemType3\">${imageText.moveCell3}</label>\r\n                                </div>\r\n                            </div>\r\n                            <div class=\"slider-box-checkbox\">\r\n                                <input type=\"checkbox\" id=\"imgItemIsFixedPos\">\r\n                                <label for=\"imgItemIsFixedPos\">${imageText.fixedPos}</label>\r\n                            </div>\r\n                        </div>\r\n                        <div class=\"slider-box\">\r\n                            <div class=\"slider-box-title\">${imageText.border}</div>\r\n                            <div class=\"slider-box-borderConfig\">\r\n                                <div class=\"border-item\">\r\n                                    <label>${imageText.width}</label>\r\n                                    <input type=\"number\" id=\"imgItemBorderWidth\" min=\"0\">\r\n                                </div>\r\n                                <div class=\"border-item\">\r\n                                    <label>${imageText.radius}</label>\r\n                                    <input type=\"number\" id=\"imgItemBorderRadius\" min=\"0\">\r\n                                </div>\r\n                                <div class=\"border-item\">\r\n                                    <label>${imageText.style}</label>\r\n                                    <select id=\"imgItemBorderStyle\">\r\n                                        <option value=\"solid\">${imageText.solid}</option>\r\n                                        <option value=\"dashed\">${imageText.dashed}</option>\r\n                                        <option value=\"dotted\">${imageText.dotted}</option>\r\n                                        <option value=\"double\">${imageText.double}</option>\r\n                                    </select>\r\n                                </div>\r\n                                <div class=\"border-item\">\r\n                                    <label>${imageText.color}</label>\r\n                                    <div id=\"imgItemBorderColor\" class=\"imgItemBorderColor\">\r\n                                        <span></span>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>`;\r\n    },\r\n    sliderHtmlShow: function() {\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").remove();\r\n\r\n        let sliderHtml = _this.getSliderHtml();\r\n        $(\"body\").append(sliderHtml);\r\n        luckysheetsizeauto();\r\n\r\n        let imgItem = _this.images[_this.currentImgId];\r\n\r\n        //类型\r\n        let type = imgItem.type;\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemType\" + type).prop(\"checked\", true);\r\n\r\n        //固定位置\r\n        let isFixedPos = imgItem.isFixedPos;\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemIsFixedPos\").prop(\"checked\", isFixedPos);\r\n\r\n        //边框宽度\r\n        let border = imgItem.border;\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderWidth\").val(border.width);\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderRadius\").val(border.radius);\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderStyle\").val(border.style);\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderColor span\").css(\"background-color\", border.color).attr(\"title\", border.color);\r\n    \r\n        _this.init();\r\n    },\r\n    colorSelectDialog: function(currenColor){\r\n        const _locale = locale();\r\n        const locale_button = _locale.button;\r\n        const locale_toolbar = _locale.toolbar;\r\n        const locale_imageCtrl = _locale.imageCtrl;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-imageCtrl-colorSelect-dialog\").remove();\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-imageCtrl-colorSelect-dialog\", \r\n            \"addclass\": \"luckysheet-imageCtrl-colorSelect-dialog\", \r\n            \"title\": locale_imageCtrl.borderTile, \r\n            \"content\": `<div class=\"currenColor\">\r\n                            ${locale_imageCtrl.borderCur}:<span title=\"${currenColor}\" style=\"background-color:${currenColor}\"></span>\r\n                        </div>\r\n                        <div class=\"colorshowbox\"></div>`, \r\n            \"botton\":  `<button id=\"luckysheet-imageCtrl-colorSelect-dialog-confirm\" class=\"btn btn-primary\">${locale_button.confirm}</button>\r\n                        <button class=\"btn btn-default luckysheet-model-close-btn\">${locale_button.cancel}</button>`, \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-imageCtrl-colorSelect-dialog\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 300)\r\n                .end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-imageCtrl-colorSelect-dialog\").css({ \r\n            \"left\": (winw + scrollLeft - myw) / 2, \r\n            \"top\": (winh + scrollTop - myh) / 3 \r\n        }).show();\r\n        \r\n        //初始化选择颜色插件\r\n        $(\"#luckysheet-imageCtrl-colorSelect-dialog\").find(\".colorshowbox\").spectrum({\r\n            showPalette: true,\r\n            showPaletteOnly: true,\r\n            preferredFormat: \"hex\",\r\n            clickoutFiresChange: false,\r\n            showInitial: true,\r\n            showInput: true,\r\n            flat: true,\r\n            hideAfterPaletteSelect: true,\r\n            showSelectionPalette: true,\r\n            showButtons: false,//隐藏选择取消按钮\r\n            maxPaletteSize: 8,\r\n            maxSelectionSize: 8,\r\n            color: currenColor,\r\n            cancelText: locale_button.cancel,\r\n            chooseText: locale_toolbar.confirmColor,\r\n            togglePaletteMoreText: locale_toolbar.customColor,\r\n            togglePaletteLessText: locale_toolbar.collapse,\r\n            togglePaletteOnly: true,\r\n            clearText: locale_toolbar.clearText,\r\n            noColorSelectedText: locale_toolbar.noColorSelectedText,\r\n            localStorageKey: \"spectrum.textcolor\" + server.gridKey,\r\n            palette: [\r\n                [\"#000\", \"#444\", \"#666\", \"#999\", \"#ccc\", \"#eee\", \"#f3f3f3\", \"#fff\"],\r\n                [\"#f00\", \"#f90\", \"#ff0\", \"#0f0\", \"#0ff\", \"#00f\", \"#90f\", \"#f0f\"],\r\n                [\"#f4cccc\", \"#fce5cd\", \"#fff2cc\", \"#d9ead3\", \"#d0e0e3\", \"#cfe2f3\", \"#d9d2e9\", \"#ead1dc\"],\r\n                [\"#ea9999\", \"#f9cb9c\", \"#ffe599\", \"#b6d7a8\", \"#a2c4c9\", \"#9fc5e8\", \"#b4a7d6\", \"#d5a6bd\"],\r\n                [\"#e06666\", \"#f6b26b\", \"#ffd966\", \"#93c47d\", \"#76a5af\", \"#6fa8dc\", \"#8e7cc3\", \"#c27ba0\"],\r\n                [\"#c00\", \"#e69138\", \"#f1c232\", \"#6aa84f\", \"#45818e\", \"#3d85c6\", \"#674ea7\", \"#a64d79\"],\r\n                [\"#900\", \"#b45f06\", \"#bf9000\", \"#38761d\", \"#134f5c\", \"#0b5394\", \"#351c75\", \"#741b47\"],\r\n                [\"#600\", \"#783f04\", \"#7f6000\", \"#274e13\", \"#0c343d\", \"#073763\", \"#20124d\", \"#4c1130\"]\r\n            ],\r\n            move: function(color){\r\n                if (color != null) {\r\n                    color = color.toHexString();\r\n                }\r\n                else {\r\n                    color = \"#000\";\r\n                }\r\n\r\n                $(\"#luckysheet-imageCtrl-colorSelect-dialog .currenColor span\").css(\"background-color\", color).attr(\"title\", color);\r\n            }\r\n        });\r\n    },\r\n    init: function() {\r\n        let _this = this;\r\n\r\n        //关闭\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl .luckysheet-model-close-btn\").click(function () {\r\n            $(\"#luckysheet-modal-dialog-slider-imageCtrl\").hide();\r\n            luckysheetsizeauto();\r\n        });\r\n\r\n        //常规\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").off(\"change.radio\").on(\"change.radio\", \".radio-item input[type=radio][name=imgItemType]\", function() {\r\n            _this.configChange(\"type\", this.value);\r\n        })\r\n\r\n        //固定位置\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").off(\"change.checkbox\").on(\"change.checkbox\", \".slider-box-checkbox input[type=checkbox]\", function() {\r\n            _this.configChange(\"fixedPos\", this.checked);\r\n        })\r\n\r\n        //边框宽度\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").off(\"change.borderWidth\").on(\"change.borderWidth\", \"#imgItemBorderWidth\", function() {\r\n            _this.configChange(\"border-width\", this.valueAsNumber);\r\n        })\r\n\r\n        //边框半径\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").off(\"change.borderRadius\").on(\"change.borderRadius\", \"#imgItemBorderRadius\", function() {\r\n            _this.configChange(\"border-radius\", this.valueAsNumber);\r\n        })\r\n\r\n        //边框样式\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").off(\"change.borderStyle\").on(\"change.borderStyle\", \"#imgItemBorderStyle\", function() {\r\n            _this.configChange(\"border-style\", this.value);\r\n        })\r\n\r\n        //边框颜色 选择\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").off(\"click.color\").on(\"click.color\", \"#imgItemBorderColor\", function() {\r\n            let currenColor = $(this).find(\"span\").attr(\"title\");\r\n            _this.colorSelectDialog(currenColor);\r\n        })\r\n\r\n        //边框选择颜色 确定 \r\n        $(document).off(\"click.selectColorConfirm\").on(\"click.selectColorConfirm\", \"#luckysheet-imageCtrl-colorSelect-dialog-confirm\", function(){\r\n            let $parent = $(this).parents(\"#luckysheet-imageCtrl-colorSelect-dialog\");\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $parent.hide();\r\n\r\n            let currenColor = $parent.find(\".currenColor span\").attr(\"title\");\r\n            $(\"#luckysheet-modal-dialog-slider-imageCtrl #imgItemBorderColor span\").css(\"background-color\", currenColor).attr(\"title\", currenColor);\r\n\r\n            _this.configChange(\"border-color\", currenColor);            \r\n        });\r\n\r\n        //image active\r\n        $(\"#luckysheet-image-showBoxs\").off(\"mousedown.active\").on(\"mousedown.active\", \".luckysheet-modal-dialog-image\", function(e) {\r\n            \r\n\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n                return;\r\n            }\r\n\r\n            $(this).hide();\r\n            let id = $(this).attr(\"id\");\r\n\r\n            if(_this.currentImgId != null && _this.currentImgId != id){\r\n                _this.cancelActiveImgItem();\r\n            }\r\n\r\n            _this.currentImgId = id;\r\n\r\n            let item = _this.images[id];\r\n            let imgItemParam = _this.getImgItemParam(item);\r\n\r\n            let width = imgItemParam.width;\r\n            let height = imgItemParam.height;\r\n            let left = imgItemParam.left;\r\n            let top = imgItemParam.top;\r\n            let position = imgItemParam.position;\r\n        \r\n            $(\"#luckysheet-modal-dialog-activeImage\").show().css({\r\n                \"width\": width,\r\n                \"height\": height,\r\n                \"left\": left,\r\n                \"top\": top,\r\n                \"position\": position\r\n            });\r\n            let imageUrlHandle = Store.toJsonOptions && Store.toJsonOptions['imageUrlHandle'];\r\n            let imgUrl = typeof imageUrlHandle === 'function' ? imageUrlHandle(item.src) : item.src;\r\n            $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content\").css({\r\n                \"background-image\": \"url(\" + imgUrl + \")\",\r\n                \"background-size\": item.default.width * Store.zoomRatio + \"px \" + item.default.height * Store.zoomRatio + \"px\",\r\n                \"background-position\": -item.crop.offsetLeft * Store.zoomRatio + \"px \" + -item.crop.offsetTop * Store.zoomRatio + \"px\"\r\n            })\r\n\r\n            $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border\").css({\r\n                \"border-width\": item.border.width * Store.zoomRatio,\r\n                \"border-style\": item.border.style,\r\n                \"border-color\": item.border.color,\r\n                \"border-radius\": item.border.radius * Store.zoomRatio,\r\n                \"left\": -item.border.width * Store.zoomRatio,\r\n                \"right\": -item.border.width * Store.zoomRatio,\r\n                \"top\": -item.border.width * Store.zoomRatio,\r\n                \"bottom\": -item.border.width * Store.zoomRatio,\r\n            })\r\n\r\n            _this.sliderHtmlShow();\r\n\r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image move\r\n        $(\"#luckysheet-modal-dialog-activeImage\").off(\"mousedown.move\").on(\"mousedown.move\", \".luckysheet-modal-dialog-content\", function(e) {\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n                return;\r\n            }\r\n            \r\n            if(!$(\"#luckysheet-modal-dialog-slider-imageCtrl\").is(\":visible\")){\r\n                _this.sliderHtmlShow();\r\n            }\r\n            \r\n            _this.move = true;\r\n            \r\n            _this.currentWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n            _this.currentWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n\r\n            let offset = $(\"#luckysheet-modal-dialog-activeImage\").offset();\r\n\r\n            _this.moveXY = [\r\n                e.pageX - offset.left, \r\n                e.pageY - offset.top, \r\n            ];\r\n\r\n            setluckysheet_scroll_status(true);\r\n\r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image resize\r\n        $(\"#luckysheet-modal-dialog-activeImage\").off(\"mousedown.resize\").on(\"mousedown.resize\", \".luckysheet-modal-dialog-resize-item\", function(e) {\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n                return;\r\n            }\r\n            \r\n            _this.currentWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n            _this.currentWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n\r\n            _this.resize = $(this).data(\"type\");\r\n\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), \r\n                scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let mouse = mouseposition(e.pageX, e.pageY);\r\n            let x = mouse[0] + scrollLeft;\r\n            let y = mouse[1] + scrollTop;\r\n\r\n            let position = $(\"#luckysheet-modal-dialog-activeImage\").position();\r\n            let width = $(\"#luckysheet-modal-dialog-activeImage\").width();\r\n            let height = $(\"#luckysheet-modal-dialog-activeImage\").height();\r\n\r\n            _this.resizeXY = [\r\n                x, \r\n                y, \r\n                width, \r\n                height, \r\n                position.left + scrollLeft, \r\n                position.top + scrollTop, \r\n                scrollLeft, \r\n                scrollTop\r\n            ];\r\n\r\n            setluckysheet_scroll_status(true);\r\n            \r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image croppingEnter\r\n        $(\"#luckysheet-modal-dialog-activeImage\").off(\"mousedown.croppingEnter\").on(\"mousedown.croppingEnter\", \".luckysheet-modal-controll-crop\", function(e) {\r\n            _this.croppingEnter();\r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image croppingExit\r\n        $(\"#luckysheet-modal-dialog-cropping\").off(\"mousedown.croppingExit\").on(\"mousedown.croppingExit\", \".luckysheet-modal-controll-crop\", function(e) {\r\n            _this.croppingExit();\r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image crop change\r\n        $(\"#luckysheet-modal-dialog-cropping\").off(\"mousedown.cropChange\").on(\"mousedown.cropChange\", \".resize-item\", function(e) {\r\n            _this.cropChange = $(this).data(\"type\");\r\n\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), \r\n                scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let mouse = mouseposition(e.pageX, e.pageY);\r\n            let x = mouse[0] + scrollLeft;\r\n            let y = mouse[1] + scrollTop;\r\n\r\n            _this.cropChangeXY = [\r\n                x, \r\n                y\r\n            ];\r\n\r\n            setluckysheet_scroll_status(true);\r\n            \r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image restore\r\n        $(\"#luckysheet-image-showBoxs\").off(\"mousedown.restore\").on(\"mousedown.restore\", \".luckysheet-modal-controll-restore\", function(e) {\r\n            _this.restoreImgItem();\r\n            e.stopPropagation();\r\n        })\r\n\r\n        //image delete\r\n        $(\"#luckysheet-image-showBoxs\").off(\"mousedown.delete\").on(\"mousedown.delete\", \".luckysheet-modal-controll-del\", function(e) {\r\n            _this.removeImgItem();\r\n            e.stopPropagation();\r\n        })\r\n    },\r\n    configChange: function(type, value){\r\n        let _this = this;\r\n\r\n        let imgItem = _this.images[_this.currentImgId];\r\n\r\n        switch(type){\r\n            case \"type\":\r\n                imgItem.type = value;\r\n                break;\r\n            case \"fixedPos\":\r\n                imgItem.isFixedPos = value;\r\n\r\n                let imgItemParam = _this.getImgItemParam(imgItem);\r\n                let width = imgItemParam.width;\r\n                let height = imgItemParam.height;\r\n                let left = imgItemParam.left;\r\n                let top = imgItemParam.top;\r\n                let position = imgItemParam.position;\r\n            \r\n                $(\"#luckysheet-modal-dialog-activeImage\").show().css({\r\n                    \"width\": width,\r\n                    \"height\": height,\r\n                    \"left\": left,\r\n                    \"top\": top,\r\n                    \"position\": position\r\n                });\r\n                break;\r\n            case \"border-width\":\r\n                imgItem.border.width = value;\r\n                $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border\").css({\r\n                    \"border-width\": value,\r\n                    \"left\": -value,\r\n                    \"right\": -value,\r\n                    \"top\": -value,\r\n                    \"bottom\": -value\r\n                });\r\n                break;\r\n            case \"border-radius\":\r\n                imgItem.border.radius = value;\r\n                $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border\").css(\"border-radius\", value);\r\n                break;\r\n            case \"border-style\":\r\n                imgItem.border.style = value;\r\n                $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border\").css(\"border-style\", value);\r\n                break;\r\n            case \"border-color\":\r\n                imgItem.border.color = value;\r\n                $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-border\").css(\"border-color\", value);\r\n                break;\r\n        }\r\n        \r\n        _this.ref();\r\n    },\r\n    getImgItemParam(imgItem){\r\n        let isFixedPos = imgItem.isFixedPos;\r\n\r\n        let width = imgItem.default.width * Store.zoomRatio,\r\n            height = imgItem.default.height * Store.zoomRatio,\r\n            left = imgItem.default.left * Store.zoomRatio,\r\n            top = imgItem.default.top * Store.zoomRatio;\r\n\r\n        if(imgItem.crop.width != width || imgItem.crop.height != height){\r\n            width = imgItem.crop.width * Store.zoomRatio;\r\n            height = imgItem.crop.height * Store.zoomRatio;\r\n            left += imgItem.crop.offsetLeft * Store.zoomRatio;\r\n            top += imgItem.crop.offsetTop * Store.zoomRatio;\r\n        }\r\n\r\n        let position = 'absolute';\r\n        if(isFixedPos){\r\n            position = 'fixed';\r\n            left = imgItem.fixedLeft + imgItem.crop.offsetLeft;\r\n            top = imgItem.fixedTop + imgItem.crop.offsetTop;\r\n\r\n            // only need to scale the distance relative to the main area, otherwise it will continue to shift and overflow the main area.\r\n            // Note: After scaling here, there is no need to scale again when using this position externally\r\n            // fix #174\r\n            const operateAreaWidth = Store.rowHeaderWidth;\r\n            const operateAreaHeight = Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight;\r\n            left = (left - operateAreaWidth) * Store.zoomRatio + operateAreaWidth\r\n            top = (top - operateAreaHeight) * Store.zoomRatio + operateAreaHeight\r\n        }\r\n\r\n        return {\r\n            width: width,\r\n            height: height,\r\n            left: left,\r\n            top: top,\r\n            position: position\r\n        }\r\n    },\r\n    cancelActiveImgItem: function(){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-modal-dialog-activeImage\").hide();\r\n        $(\"#luckysheet-modal-dialog-cropping\").hide();\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").hide();\r\n\r\n        let imgItem = _this.images[_this.currentImgId];\r\n        let imgItemParam = _this.getImgItemParam(imgItem);\r\n\r\n        let width = imgItemParam.width;\r\n        let height = imgItemParam.height;\r\n        let left = imgItemParam.left;\r\n        let top = imgItemParam.top;\r\n        let position = imgItemParam.position;\r\n\r\n        $(\"#\" + _this.currentImgId).show().css({\r\n            \"width\": width,\r\n            \"height\": height,\r\n            \"left\": left,\r\n            \"top\": top,\r\n            \"position\": position\r\n        });\r\n        $(\"#\" + _this.currentImgId + \" img\").css({\r\n            \"width\": imgItem.default.width * Store.zoomRatio,\r\n            \"height\": imgItem.default.height * Store.zoomRatio,\r\n            \"left\": -imgItem.crop.offsetLeft * Store.zoomRatio,\r\n            \"top\": -imgItem.crop.offsetTop * Store.zoomRatio\r\n        });\r\n        $(\"#\" + _this.currentImgId + \" .luckysheet-modal-dialog-border\").css({\r\n            \"border-width\": imgItem.border.width * Store.zoomRatio,\r\n            \"border-style\": imgItem.border.style,\r\n            \"border-color\": imgItem.border.color,\r\n            \"border-radius\": imgItem.border.radius * Store.zoomRatio,\r\n            \"left\": -imgItem.border.width * Store.zoomRatio,\r\n            \"right\": -imgItem.border.width * Store.zoomRatio,\r\n            \"top\": -imgItem.border.width * Store.zoomRatio,\r\n            \"bottom\": -imgItem.border.width * Store.zoomRatio,\r\n        })\r\n\r\n        _this.currentImgId = null;\r\n    },\r\n    addImgItem: function(img) {\r\n        let _this = this;\r\n\r\n        let width, height;\r\n        let max = 400;\r\n\r\n        if(img.originHeight < img.originWidth){\r\n            height = Math.round(img.originHeight * (max / img.originWidth));\r\n            width = max;\r\n        }\r\n        else{\r\n            width = Math.round(img.originWidth * (max / img.originHeight));\r\n            height = max;\r\n        }\r\n\r\n        if(_this.images == null){\r\n            _this.images = {};\r\n        }\r\n\r\n        let imgItem = $.extend(true, {}, _this.imgItem);\r\n        imgItem.src = img.src;\r\n        imgItem.originWidth = img.originWidth;\r\n        imgItem.originHeight = img.originHeight;\r\n        imgItem.default.width = width;\r\n        imgItem.default.height = height;\r\n        imgItem.default.left = img.left;\r\n        imgItem.default.top = img.top;\r\n        imgItem.crop.width = width;\r\n        imgItem.crop.height = height;\r\n\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), \r\n            scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n        imgItem.fixedLeft = img.left - scrollLeft + Store.rowHeaderWidth;\r\n        imgItem.fixedTop = img.top - scrollTop + Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight;\r\n\r\n        let id = _this.generateRandomId();\r\n        let modelHtml = _this.modelHtml(id, imgItem);\r\n\r\n        $(\"#luckysheet-image-showBoxs .img-list\").append(modelHtml);\r\n\r\n        _this.images[id] = imgItem;\r\n        _this.ref();\r\n\r\n        _this.init();\r\n    },\r\n    moveImgItem: function() {\r\n        let _this = this;\r\n\r\n        _this.move = false;\r\n\r\n        let obj = $(\"#luckysheet-modal-dialog-activeImage\")[0];\r\n        let item = _this.images[_this.currentImgId];\r\n\r\n\t\tvar zoomRatio = Store.zoomRatio;\r\n\t\t\r\n        if(item.isFixedPos){\r\n\t\t\t\r\n            item.fixedLeft = (obj.offsetLeft - item.crop.offsetLeft) / zoomRatio;\r\n            item.fixedTop = (obj.offsetTop - item.crop.offsetTop) / zoomRatio;\r\n        }\r\n        else{\r\n            item.default.left = (obj.offsetLeft - item.crop.offsetLeft) / zoomRatio;\r\n            item.default.top = (obj.offsetTop - item.crop.offsetTop) / zoomRatio;\r\n        }\r\n\r\n        _this.ref();\r\n    },\r\n    resizeImgItem: function() {\r\n        let _this = this;\r\n\r\n        _this.resize = null;\r\n\t\t\r\n\t\tvar zoomRatio = Store.zoomRatio;\r\n\r\n        let obj = $(\"#luckysheet-modal-dialog-activeImage\")[0];\r\n\r\n        let item = _this.images[_this.currentImgId];\r\n        let scaleX = obj.clientWidth / item.crop.width;\r\n        let scaleY = obj.clientHeight / item.crop.height;\r\n\r\n        item.default.width = Math.round(item.default.width * scaleX / zoomRatio);\r\n        item.default.height = Math.round(item.default.height * scaleY / zoomRatio);\r\n\r\n        item.crop.width = Math.round(item.crop.width * scaleX / zoomRatio);\r\n        item.crop.height = Math.round(item.crop.height * scaleY / zoomRatio);\r\n        item.crop.offsetLeft = Math.round(item.crop.offsetLeft * scaleX / zoomRatio);\r\n        item.crop.offsetTop = Math.round(item.crop.offsetTop * scaleY / zoomRatio);\r\n\r\n        if(item.isFixedPos){\r\n            item.fixedLeft = obj.offsetLeft / zoomRatio;\r\n            item.fixedTop = obj.offsetTop / zoomRatio;\r\n        }\r\n        else{\r\n            item.default.left = (obj.offsetLeft - item.crop.offsetLeft) / zoomRatio;\r\n            item.default.top = (obj.offsetTop - item.crop.offsetTop) / zoomRatio;\r\n        }\r\n\r\n        _this.ref();\r\n    },\r\n    croppingEnter: function() {\r\n        let _this = this;\r\n        _this.cropping = true;\r\n\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-modal-dialog-activeImage\").hide();\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").hide();\r\n\r\n        let item = _this.images[_this.currentImgId];\r\n        let imgItemParam = _this.getImgItemParam(item);\r\n\r\n        let width = imgItemParam.width;\r\n        let height = imgItemParam.height;\r\n        let left = imgItemParam.left;\r\n        let top = imgItemParam.top;\r\n        let position = imgItemParam.position;\r\n    \r\n        $(\"#luckysheet-modal-dialog-cropping\").show().css({\r\n            \"width\": width,\r\n            \"height\": height,\r\n            \"left\": left,\r\n            \"top\": top,\r\n            \"position\": position\r\n        });\r\n\r\n        let imageUrlHandle = Store.toJsonOptions && Store.toJsonOptions['imageUrlHandle'];\r\n        let imgSrc = typeof imageUrlHandle === 'function' ? imageUrlHandle(item.src) : item.src;\r\n\r\n        $(\"#luckysheet-modal-dialog-cropping .cropping-mask\").css({\r\n            \"width\": item.default.width,\r\n            \"height\": item.default.height,\r\n            \"background-image\": \"url(\" + imgSrc + \")\",\r\n            \"left\": -item.crop.offsetLeft,\r\n            \"top\": -item.crop.offsetTop\r\n        })\r\n\r\n        $(\"#luckysheet-modal-dialog-cropping .cropping-content\").css({\r\n            \"background-image\": \"url(\" + imgSrc + \")\",\r\n            \"background-size\": item.default.width + \"px \" + item.default.height + \"px\",\r\n            \"background-position\": -item.crop.offsetLeft + \"px \" + -item.crop.offsetTop + \"px\"\r\n        })\r\n\r\n        $(\"#luckysheet-modal-dialog-cropping .luckysheet-modal-dialog-border\").css({\r\n            \"border-width\": item.border.width,\r\n            \"border-style\": item.border.style,\r\n            \"border-color\": item.border.color,\r\n            \"border-radius\": item.border.radius,\r\n            \"left\": -item.border.width,\r\n            \"right\": -item.border.width,\r\n            \"top\": -item.border.width,\r\n            \"bottom\": -item.border.width,\r\n        })\r\n    },\r\n    croppingExit: function() {\r\n        let _this = this;\r\n        _this.cropping = false;\r\n\r\n        $(\"#luckysheet-modal-dialog-cropping\").hide();\r\n\r\n        let item = _this.images[_this.currentImgId];\r\n        let imgItemParam = _this.getImgItemParam(item);\r\n\r\n        let width = imgItemParam.width;\r\n        let height = imgItemParam.height;\r\n        let left = imgItemParam.left;\r\n        let top = imgItemParam.top;\r\n        let position = imgItemParam.position;\r\n\r\n        $(\"#luckysheet-modal-dialog-activeImage\").show().css({\r\n            \"width\": width,\r\n            \"height\": height,\r\n            \"left\": left,\r\n            \"top\": top,\r\n            \"position\": position\r\n        });\r\n        let imageUrlHandle = Store.toJsonOptions && Store.toJsonOptions['imageUrlHandle'];\r\n        let imgSrc = typeof imageUrlHandle === 'function' ? imageUrlHandle(item.src) : item.src;\r\n\r\n        $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content\").css({\r\n            \"background-image\": \"url(\" + imgSrc + \")\",\r\n            \"background-size\": item.default.width + \"px \" + item.default.height + \"px\",\r\n            \"background-position\": -item.crop.offsetLeft + \"px \" + -item.crop.offsetTop + \"px\"\r\n        })\r\n    },\r\n    cropChangeImgItem: function() {\r\n        let _this = this;\r\n\r\n        _this.cropChange = null;\r\n\r\n        let item = _this.images[_this.currentImgId];\r\n        item.crop.width = _this.cropChangeObj.width;\r\n        item.crop.height = _this.cropChangeObj.height;\r\n        item.crop.offsetLeft = _this.cropChangeObj.offsetLeft;\r\n        item.crop.offsetTop = _this.cropChangeObj.offsetTop;\r\n\r\n        _this.ref();\r\n    },\r\n    restoreImgItem: function() {\r\n        let _this = this;\r\n        let imgItem = _this.images[_this.currentImgId];\r\n\r\n        imgItem.default.width = imgItem.originWidth;\r\n        imgItem.default.height = imgItem.originHeight;\r\n\r\n        imgItem.crop.width = imgItem.originWidth;\r\n        imgItem.crop.height = imgItem.originHeight;\r\n        imgItem.crop.offsetLeft = 0;\r\n        imgItem.crop.offsetTop = 0;\r\n\r\n        let imgItemParam = _this.getImgItemParam(imgItem);\r\n\r\n        let width = imgItemParam.width;\r\n        let height = imgItemParam.height;\r\n        let left = imgItemParam.left;\r\n        let top = imgItemParam.top;\r\n        let position = imgItemParam.position;\r\n        \r\n        $(\"#luckysheet-modal-dialog-activeImage\").show().css({\r\n            \"width\": width,\r\n            \"height\": height,\r\n            \"left\": left,\r\n            \"top\": top,\r\n            \"position\": position\r\n        });\r\n\r\n        let imageUrlHandle = Store.toJsonOptions && Store.toJsonOptions['imageUrlHandle'];\r\n        let imgSrc = typeof imageUrlHandle === 'function' ? imageUrlHandle(imgItem.src) : imgItem.src;\r\n\r\n        $(\"#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content\").css({\r\n            \"background-image\": \"url(\" + imgSrc + \")\",\r\n            \"background-size\": imgItem.default.width + \"px \" + imgItem.default.height + \"px\",\r\n            \"background-position\": -imgItem.crop.offsetLeft + \"px \" + -imgItem.crop.offsetTop + \"px\"\r\n        })\r\n\r\n        _this.ref();\r\n    },\r\n    removeImgItem: function() {\r\n        let _this = this;\r\n        let imgItem = _this.images[_this.currentImgId];\r\n\r\n        // 钩子 imageDeleteBefore\r\n        if(!method.createHookFunction('imageDeleteBefore', imgItem)){\r\n            return;\r\n        }\r\n        \r\n        $(\"#luckysheet-modal-dialog-activeImage\").hide();\r\n        $(\"#luckysheet-modal-dialog-cropping\").hide();\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").hide();\r\n        $(\"#\" + _this.currentImgId).remove();\r\n\r\n\r\n        delete _this.images[_this.currentImgId];\r\n        _this.currentImgId = null;\r\n\r\n        // 钩子 imageDeleteAfter\r\n        method.createHookFunction('imageDeleteAfter', imgItem);\r\n        _this.ref();\r\n    },\r\n    copyImgItem: function(e) {\r\n        let _this = this;\r\n\r\n        _this.copyImgItemObj = $.extend(true, {}, _this.images[_this.currentImgId]);\r\n\r\n        let clipboardData = window.clipboardData; //for IE\r\n        if (!clipboardData) { // for chrome\r\n            clipboardData = e.originalEvent.clipboardData;\r\n        }\r\n\r\n        let cpdata = '<table data-type=\"luckysheet_copy_action_image\"><tr><td><td></tr></table>';\r\n\r\n        if (!clipboardData) {\r\n            let textarea = $(\"#luckysheet-copy-content\");\r\n            textarea.html(cpdata);\r\n            textarea.focus();\r\n            textarea.select();\r\n            document.execCommand(\"selectAll\");\r\n            document.execCommand(\"Copy\");\r\n            // 等50毫秒，keyPress事件发生了再去处理数据\r\n            setTimeout(function () { \r\n                $(\"#luckysheet-copy-content\").blur(); \r\n            }, 10);\r\n        }\r\n        else {\r\n            clipboardData.setData('Text', cpdata);\r\n            return false;//否则设不生效\r\n        }\r\n    },\r\n    pasteImgItem: function() {\r\n        let _this = this;\r\n\r\n        if(_this.images == null){\r\n            _this.images = {};\r\n        }\r\n\r\n        let rowIndex = Store.luckysheet_select_save[0].row_focus || 0;\r\n        let colIndex = Store.luckysheet_select_save[0].column_focus || 0;\r\n        let left = colIndex == 0 ? 0 : Store.visibledatacolumn[colIndex - 1];\r\n        let top = rowIndex == 0 ? 0 : Store.visibledatarow[rowIndex - 1];\r\n\r\n        let img = $.extend(true, {}, _this.copyImgItemObj);\r\n        \r\n        img.default.left = left - img.crop.offsetLeft;\r\n        img.default.top = top - img.crop.offsetTop;\r\n\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), \r\n            scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n        img.fixedLeft = img.default.left - scrollLeft + Store.rowHeaderWidth;\r\n        img.fixedTop = img.default.top - scrollTop + Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight;\r\n\r\n        let id = _this.generateRandomId();\r\n        let modelHtml = _this.modelHtml(id, img);\r\n\r\n        $(\"#luckysheet-image-showBoxs .img-list\").append(modelHtml);\r\n\r\n        _this.images[id] = img;\r\n        _this.ref();\r\n\r\n        _this.init();\r\n    },\r\n    allImagesShow: function() {\r\n        let _this = this;\r\n        \r\n        $(\"#luckysheet-modal-dialog-activeImage\").hide();\r\n        $(\"#luckysheet-modal-dialog-cropping\").hide();\r\n        $(\"#luckysheet-modal-dialog-slider-imageCtrl\").hide();\r\n        $(\"#luckysheet-image-showBoxs .img-list\").empty();\r\n\r\n        if(_this.images == null){\r\n            return;\r\n        }\r\n\r\n        for(let imgId in _this.images){\r\n            let imgItem = _this.images[imgId];\r\n            let modelHtml = _this.modelHtml(imgId, imgItem);\r\n            $(\"#luckysheet-image-showBoxs .img-list\").append(modelHtml);\r\n        }\r\n    },\r\n    moveChangeSize: function(rc, index, size) {\r\n        let _this = this;\r\n        let images = $.extend(true, {}, _this.images);\r\n\r\n        if(rc == \"row\"){\r\n            let row = Store.visibledatarow[index], \r\n                row_pre = index - 1 == -1 ? 0 : Store.visibledatarow[index - 1];\r\n            let changeSize = size - (row - row_pre - 1);\r\n            \r\n            for(let imgId in images){\r\n                let imgItem = images[imgId];\r\n                let imgItemParam = _this.getImgItemParam(imgItem);\r\n                let type = imgItem.type;\r\n\r\n                if(type == \"1\"){\r\n                    if(imgItemParam.top >= row){\r\n                        imgItem.default.top = imgItemParam.top + changeSize - imgItem.crop.offsetTop;\r\n                    }\r\n                    else{\r\n                        if(imgItemParam.top + imgItemParam.height >= row-2){\r\n                            if(imgItemParam.top < row + changeSize){\r\n                                let scaleY = (imgItemParam.height + changeSize) / imgItemParam.height;\r\n                                imgItem.default.height = Math.round(imgItem.default.height * scaleY);\r\n                                imgItem.crop.height = Math.round(imgItem.crop.height * scaleY);\r\n                                imgItem.crop.offsetTop = Math.round(imgItem.crop.offsetTop * scaleY);\r\n                            }\r\n                            else{\r\n                                let scaleY = (imgItemParam.top + imgItemParam.height - row) / imgItemParam.height;\r\n                                imgItem.default.height = Math.round(imgItem.default.height * scaleY);\r\n                                imgItem.crop.height = Math.round(imgItem.crop.height * scaleY);\r\n                                imgItem.crop.offsetTop = Math.round(imgItem.crop.offsetTop * scaleY);\r\n                                imgItem.default.top = row + changeSize - imgItem.crop.offsetTop;\r\n                            }\r\n                        }\r\n                        else{\r\n                            if(imgItemParam.top > row + changeSize){\r\n                                let scaleY = 1 / imgItemParam.height;\r\n                                imgItem.default.height = Math.round(imgItem.default.height * scaleY);\r\n                                imgItem.crop.height = Math.round(imgItem.crop.height * scaleY);\r\n                                imgItem.crop.offsetTop = Math.round(imgItem.crop.offsetTop * scaleY);\r\n                                imgItem.default.top = row + changeSize - imgItem.crop.offsetTop;\r\n                            }\r\n                            else if(imgItemParam.top + imgItemParam.height > row + changeSize){\r\n                                let scaleY = (row + changeSize - imgItemParam.top) / imgItemParam.height;\r\n                                imgItem.default.height = Math.round(imgItem.default.height * scaleY);\r\n                                imgItem.crop.height = Math.round(imgItem.crop.height * scaleY);\r\n                                imgItem.crop.offsetTop = Math.round(imgItem.crop.offsetTop * scaleY);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else if(type == \"2\"){\r\n                    if(imgItemParam.top >= row){\r\n                        imgItem.default.top = imgItemParam.top + changeSize - imgItem.crop.offsetTop;\r\n                    }\r\n                    else if(imgItemParam.top > row + changeSize){\r\n                        imgItem.default.top = row + changeSize - imgItem.crop.offsetTop;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if(rc == \"column\"){\r\n            let col = Store.visibledatacolumn[index], \r\n                col_pre = index - 1 == -1 ? 0 : Store.visibledatacolumn[index - 1];\r\n            let changeSize = size - (col - col_pre - 1);\r\n\r\n            for(let imgId in images){\r\n                let imgItem = images[imgId];\r\n                let imgItemParam = _this.getImgItemParam(imgItem);\r\n                let type = imgItem.type;\r\n\r\n                if(type == \"1\"){\r\n                    if(imgItemParam.left >= col){\r\n                        imgItem.default.left = imgItemParam.left + changeSize - imgItem.crop.offsetLeft;\r\n                    }\r\n                    else{\r\n                        if(imgItemParam.left + imgItemParam.width >= col-2){\r\n                            if(imgItemParam.left < col + changeSize){\r\n                                let scaleX = (imgItemParam.width + changeSize) / imgItemParam.width;\r\n                                imgItem.default.width = Math.round(imgItem.default.width * scaleX);\r\n                                imgItem.crop.width = Math.round(imgItem.crop.width * scaleX);\r\n                                imgItem.crop.offsetLeft = Math.round(imgItem.crop.offsetLeft * scaleX);\r\n                            }\r\n                            else{\r\n                                let scaleX = (imgItemParam.left + imgItemParam.width - col) / imgItemParam.width;\r\n                                imgItem.default.width = Math.round(imgItem.default.width * scaleX);\r\n                                imgItem.crop.width = Math.round(imgItem.crop.width * scaleX);\r\n                                imgItem.crop.offsetLeft = Math.round(imgItem.crop.offsetLeft * scaleX);\r\n                                imgItem.default.left = col + changeSize - imgItem.crop.offsetLeft;\r\n                            }\r\n                        }\r\n                        else{\r\n                            if(imgItemParam.left > col + changeSize){\r\n                                let scaleX = 1 / imgItemParam.width;\r\n                                imgItem.default.width = Math.round(imgItem.default.width * scaleX);\r\n                                imgItem.crop.width = Math.round(imgItem.crop.width * scaleX);\r\n                                imgItem.crop.offsetLeft = Math.round(imgItem.crop.offsetLeft * scaleX);\r\n                                imgItem.default.left = col + changeSize - imgItem.crop.offsetLeft;\r\n                            }\r\n                            else if(imgItemParam.left + imgItemParam.width > col + changeSize){\r\n                                let scaleX = (col + changeSize - imgItemParam.left) / imgItemParam.width;\r\n                                imgItem.default.width = Math.round(imgItem.default.width * scaleX);\r\n                                imgItem.crop.width = Math.round(imgItem.crop.width * scaleX);\r\n                                imgItem.crop.offsetLeft = Math.round(imgItem.crop.offsetLeft * scaleX);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else if(type == \"2\"){\r\n                    if(imgItemParam.left >= col){\r\n                        imgItem.default.left = imgItemParam.left + changeSize - imgItem.crop.offsetLeft;\r\n                    }\r\n                    else if(imgItemParam.left > col + changeSize){\r\n                        imgItem.default.left = col + changeSize - imgItem.crop.offsetLeft;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return images;\r\n    },\r\n    ref: function() {\r\n        let _this = this;\r\n\r\n        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        let images = _this.images;\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n\r\n            Store.jfredo.push({\r\n                \"type\": \"imageCtrl\",\r\n                \"sheetIndex\": Store.currentSheetIndex,\r\n                \"images\": file.images == null ? null : $.extend(true, {}, file.images),\r\n                \"curImages\": images\r\n            });\r\n        }\r\n\r\n        file.images = $.extend(true, {}, images);\r\n        server.saveParam(\"all\", Store.currentSheetIndex, file.images, { \"k\": \"images\" });\r\n    },\r\n}\r\n\r\nexport default imageCtrl;"
  },
  {
    "path": "src/controllers/imageUpdateCtrl.js",
    "content": "// 自定义图片的更新方法例如: customImageUpdate(\"POST\", \"http://127.0.0.1:8000/luckysheetimageprocess/\", d)\r\nfunction customImageUpdate(method, url, obj) {\r\n    return new Promise((resolve, reject) => {\r\n        const xhr = new XMLHttpRequest() || new ActiveXObject(\"Microsoft.XMLHTTP\");\r\n        xhr.open(method, url);\r\n        xhr.send(JSON.stringify(obj)); // 发送 POST/GET 数据\r\n        xhr.onreadystatechange = function () {\r\n            if (xhr.readyState == 4) {\r\n                if (xhr.status == 200) {\r\n                    resolve(xhr.responseText);\r\n                } else {\r\n                    reject(\"error\");\r\n                }\r\n            }\r\n        };\r\n    });\r\n}\r\n\r\nexport {\r\n    customImageUpdate\r\n}"
  },
  {
    "path": "src/controllers/inlineString.js",
    "content": "import {getFontStyleByCell, textTrim} from \"../global/getdata\";\r\nimport {selectTextContent,selectTextContentCross,selectTextContentCollapse} from '../global/cursorPos';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\n\r\nexport const inlineStyleAffectAttribute = {\"bl\":1, \"it\":1 , \"ff\":1, \"cl\":1, \"un\":1,\"fs\":1,\"fc\":1};\r\nexport const inlineStyleAffectCssName = {\"font-weight\":1, \"font-style\":1 , \"font-family\":1, \"text-decoration\":1, \"border-bottom\":1,\"font-size\":1,\"color\":1};\r\n\r\nexport function isInlineStringCell(cell){\r\n    let isIs = cell && cell.ct!=null && cell.ct.t==\"inlineStr\" && cell.ct.s!=null && cell.ct.s.length>0;\r\n    return isIs; \r\n}\r\n\r\nexport function isInlineStringCT(ct){\r\n    let isIs = ct!=null && ct.t==\"inlineStr\" && ct.s!=null && ct.s.length>0;\r\n    return isIs; \r\n}\r\n\r\nexport function updateInlineStringFormat(cell, attr, value, $input){\r\n    // let s = Store.inlineStringEditCache;\r\n    var  w = window.getSelection(); \r\n    var range;\r\n    if(w.type==\"None\"){\r\n        range = Store.inlineStringEditRange;\r\n    }\r\n    else{\r\n        range = w.getRangeAt(0);\r\n    } \r\n    \r\n\r\n    // if(isInlineStringCell(cell)){\r\n    //     if(Store.inlineStringEditCache==null){\r\n    //         Store.inlineStringEditCache = JSON.parse(JSON.stringify(cell.ct.s));\r\n    //     }\r\n    // }\r\n    // else{\r\n    //     Store.inlineStringEditCache = [{\r\n    //         v:cell.v\r\n    //     }];\r\n    // }\r\n\r\n    let cac = range.commonAncestorContainer;\r\n    let $textEditor;\r\n    if(cac.id==\"luckysheet-rich-text-editor\"){\r\n        $textEditor = $(cac);\r\n    }\r\n    else{\r\n        $textEditor = $(cac).closest(\"#luckysheet-rich-text-editor\");\r\n    }\r\n    let $functionbox = $(cac).closest(\"#luckysheet-functionbox-cell\");\r\n\r\n    if($textEditor.length==0 && $functionbox.length==0 && Store.inlineStringEditRange!=null){\r\n        range = Store.inlineStringEditRange;\r\n        cac = range.commonAncestorContainer;\r\n        if(cac.id==\"luckysheet-rich-text-editor\"){\r\n            $textEditor = $(cac);\r\n        }\r\n        else{\r\n            $textEditor = $(cac).closest(\"#luckysheet-rich-text-editor\");\r\n        }\r\n        $functionbox = $(cac).closest(\"#luckysheet-functionbox-cell\");\r\n    }\r\n\r\n    if(range.collapsed===true){\r\n        return;\r\n    }\r\n\r\n    let endContainer = range.endContainer, startContainer = range.startContainer;\r\n    let endOffset = range.endOffset, startOffset = range.startOffset;\r\n\r\n    if($textEditor.length>0){\r\n        if(startContainer===endContainer){\r\n            let span = startContainer.parentNode, spanIndex, inherit=false;\r\n            \r\n            let content = span.innerText;\r\n\r\n            let fullContent = $textEditor.html();\r\n            if(fullContent.substr(0,5) != \"<span\"){\r\n                inherit = true;\r\n            }\r\n\r\n            let left=\"\" , mid=\"\" , right=\"\";\r\n            let s1=0, s2=startOffset, s3 = endOffset, s4=content.length;\r\n            left = content.substring(s1, s2);\r\n            mid = content.substring(s2, s3);\r\n            right = content.substring(s3, s4);\r\n\r\n            let cont = \"\";\r\n            if(left!=\"\"){\r\n                let cssText = span.style.cssText;\r\n                if(inherit){\r\n                    let box = $(span).closest(\"#luckysheet-input-box\").get(0);\r\n                    if(box!=null){\r\n                        cssText = extendCssText(box.style.cssText, cssText);\r\n                    }\r\n                }\r\n                cont += \"<span style='\"+ cssText +\"'>\" + left + \"</span>\";\r\n            }\r\n\r\n            if(mid!=\"\"){\r\n                // let styleObj = {};\r\n                // styleObj[attr] = value;\r\n                // let s = getFontStyleByCell(styleObj, undefined, undefined, false);\r\n                // let ukey = textTrim(s.substr(0, s.indexOf(':')));\r\n                // let uvalue = textTrim(s.substr(s.indexOf(':')+1));\r\n                // uvalue = uvalue.substr(0, uvalue.length-1);\r\n                // let cssText = span.style.cssText;\r\n                // cssText = removeClassWidthCss(cssText, attr);\r\n\r\n                let cssText = getCssText(span.style.cssText, attr, value);\r\n\r\n                if(inherit){\r\n                    let box = $(span).closest(\"#luckysheet-input-box\").get(0);\r\n                    if(box!=null){\r\n                        cssText = extendCssText(box.style.cssText, cssText);\r\n                    }\r\n                }\r\n                \r\n                cont += \"<span style='\"+ cssText +\"'>\" + mid + \"</span>\";\r\n            }\r\n\r\n            if(right!=\"\"){\r\n                let cssText = span.style.cssText;\r\n                if(inherit){\r\n                    let box = $(span).closest(\"#luckysheet-input-box\").get(0);\r\n                    if(box!=null){\r\n                        cssText = extendCssText(box.style.cssText, cssText);\r\n                    }\r\n                }\r\n                cont += \"<span style='\"+ cssText +\"'>\" + right + \"</span>\";\r\n            }\r\n\r\n            if(startContainer.parentNode.tagName==\"SPAN\"){\r\n                spanIndex = $textEditor.find(\"span\").index(span);\r\n                $(span).replaceWith(cont);\r\n            }\r\n            else{\r\n                spanIndex = 0;\r\n                $(span).html(cont);\r\n            }\r\n            \r\n\r\n            let seletedNodeIndex = 0;\r\n            if(s1==s2){\r\n                seletedNodeIndex  = spanIndex;\r\n            }\r\n            else{\r\n                seletedNodeIndex  = spanIndex+1;\r\n            }\r\n\r\n            selectTextContent($textEditor.find(\"span\").get(seletedNodeIndex));\r\n        }\r\n        else{\r\n            if(startContainer.parentNode.tagName==\"SPAN\" && endContainer.parentNode.tagName==\"SPAN\"){\r\n                let startSpan = startContainer.parentNode, startSpanIndex;\r\n                let endSpan = endContainer.parentNode, endSpanIndex;\r\n\r\n                startSpanIndex = $textEditor.find(\"span\").index(startSpan);\r\n                endSpanIndex = $textEditor.find(\"span\").index(endSpan);\r\n\r\n                let startContent = startSpan.innerHTML, endContent = endSpan.innerHTML;\r\n                let sleft=\"\" , sright=\"\", eleft=\"\" , eright=\"\";\r\n                let s1=0, s2=startOffset, s3 = endOffset, s4=endContent.length;\r\n\r\n                sleft = startContent.substring(s1, s2);\r\n                sright = startContent.substring(s2, startContent.length);\r\n\r\n                eleft = endContent.substring(0, s3);\r\n                eright = endContent.substring(s3, s4);\r\n                let spans = $textEditor.find(\"span\");\r\n                let replaceSpans = spans.slice(startSpanIndex, endSpanIndex+1);\r\n                let cont = \"\";\r\n                for(let i=0;i<startSpanIndex;i++){\r\n                    let span = spans.get(i), content = span.innerHTML;\r\n                    cont += \"<span style='\"+ span.style.cssText +\"'>\" + content + \"</span>\";\r\n                }\r\n                if(sleft!=\"\"){\r\n                    cont += \"<span style='\"+ startSpan.style.cssText +\"'>\" + sleft + \"</span>\";\r\n                }\r\n\r\n                if(sright!=\"\"){\r\n                    let cssText = getCssText(startSpan.style.cssText, attr, value);\r\n                    cont += \"<span style='\"+ cssText +\"'>\" + sright + \"</span>\";\r\n                }\r\n\r\n                if(startSpanIndex<endSpanIndex){\r\n                    for(let i=startSpanIndex+1;i<endSpanIndex;i++){\r\n                        let span = spans.get(i), content = span.innerHTML;\r\n                        let cssText = getCssText(span.style.cssText, attr, value);\r\n                        cont += \"<span style='\"+ cssText +\"'>\" + content + \"</span>\";\r\n                    }\r\n                }\r\n\r\n                if(eleft!=\"\"){\r\n                    let cssText = getCssText(endSpan.style.cssText, attr, value);\r\n                    cont += \"<span style='\"+ cssText +\"'>\" + eleft + \"</span>\";\r\n                }                \r\n                \r\n                if(eright!=\"\"){\r\n                    cont += \"<span style='\"+ endSpan.style.cssText +\"'>\" + eright + \"</span>\";\r\n                }\r\n\r\n                for(let i=endSpanIndex+1;i<spans.length;i++){\r\n                    let span = spans.get(i), content = span.innerHTML;\r\n                    cont += \"<span style='\"+ span.style.cssText +\"'>\" + content + \"</span>\";\r\n                }\r\n\r\n                $textEditor.html(cont);\r\n\r\n                // console.log(replaceSpans, cont);\r\n                // replaceSpans.replaceWith(cont);\r\n\r\n                let startSeletedNodeIndex, endSeletedNodeIndex;\r\n                if(s1==s2){\r\n                    startSeletedNodeIndex  = startSpanIndex;\r\n                    endSeletedNodeIndex = endSpanIndex;\r\n                }\r\n                else{\r\n                    startSeletedNodeIndex  = startSpanIndex+1;\r\n                    endSeletedNodeIndex = endSpanIndex+1;\r\n                }\r\n\r\n                spans = $textEditor.find(\"span\");\r\n\r\n                selectTextContentCross(spans.get(startSeletedNodeIndex), spans.get(endSeletedNodeIndex));\r\n            }\r\n        }\r\n    }\r\n    else if($functionbox.length>0){\r\n\r\n    }\r\n}\r\n\r\nexport function enterKeyControll(cell){\r\n    var  w = window.getSelection(); \r\n    \r\n    if(w.type==\"None\"){\r\n        return\r\n    }\r\n    var range = w.getRangeAt(0);\r\n    let cac = range.commonAncestorContainer;\r\n    let $textEditor;\r\n    if(cac.id==\"luckysheet-rich-text-editor\"){\r\n        $textEditor = $(cac);\r\n    }\r\n    else{\r\n        $textEditor = $(cac).closest(\"#luckysheet-rich-text-editor\");\r\n    }\r\n    let $functionbox = $(cac).closest(\"#luckysheet-functionbox-cell\");\r\n\r\n    // if(range.collapsed===true){\r\n    //     return;\r\n    // }\r\n\r\n    let endContainer = range.endContainer, startContainer = range.startContainer;\r\n    let endOffset = range.endOffset, startOffset = range.startOffset;\r\n    \r\n    if($textEditor.length>0){\r\n        let startSpan = startContainer.parentNode;\r\n        if(startContainer.id==\"luckysheet-rich-text-editor\"){\r\n            startSpan = $(startContainer).find(\"span\");\r\n            if(startSpan.length==0){\r\n                // 在末尾换行操作会导致数据丢失(覆盖)\r\n                startContainer.innerHTML = `<span>${startContainer.innerText}</span>`;\r\n                startSpan = $(startContainer).find(\"span\");\r\n            }\r\n            startSpan = startSpan.get(startSpan.length-1);\r\n            startOffset = startSpan.innerHTML.length;\r\n        }\r\n        // let startSpanIndex = $textEditor.find(\"span\").index(startSpan);\r\n        if(range.collapsed===false){\r\n            range.deleteContents();\r\n        }\r\n\r\n        // 如果拷贝的内容为：pc&web ，那么innerHTML得到的值为：pc&amp;web ，执行换行操作存在问题\r\n        // let startContent = startSpan.innerHTML; \r\n        let startContent = startSpan.innerText;\r\n        let sleft=\"\" , sright=\"\";\r\n        let s1=0, s2=startOffset;\r\n\r\n        sleft = startContent.substring(s1, s2);\r\n        sright = startContent.substring(s2, startContent.length);\r\n\r\n        \r\n        let spanIndex,cont;\r\n        if(startContainer.parentNode.tagName==\"SPAN\"){\r\n            let textSpan = $textEditor.find(\"span\");\r\n            spanIndex = textSpan.index(startSpan);\r\n            if((spanIndex==textSpan.length-1) && sright==\"\"){\r\n                let txt = textSpan[spanIndex].innerHTML;\r\n                if(txt.substr(txt.length-1, 1)==\"\\n\"){\r\n                    cont = \"<span style='\"+ startSpan.style.cssText +\"'>\" + sleft + \"\\n\" + \"</span>\";\r\n                }\r\n                else{\r\n                    cont = \"<span style='\"+ startSpan.style.cssText +\"'>\" + sleft + \"\\n\\n\" + \"</span>\";\r\n                }\r\n                \r\n            }\r\n            else{\r\n                cont = \"<span style='\"+ startSpan.style.cssText +\"'>\" + sleft + \"\\n\" + sright + \"</span>\";\r\n            }\r\n            \r\n            $(startSpan).replaceWith(cont);\r\n        }\r\n        else{\r\n            // 这里不能取整个单元格的样式，因为如果设置了部分样式的话就会出问题\r\n            // let cssText = getFontStyleByCell(cell);\r\n            \r\n            let cssText = startSpan.style.cssText;\r\n\r\n            if(sright==\"\"){\r\n                cont = \"<span style='\"+ cssText +\"'>\" + sleft + \"\\n\\n\" + \"</span>\";\r\n            }\r\n            else{\r\n                cont = \"<span style='\"+ cssText +\"'>\" + sleft + \"\\n\" + sright + \"</span>\";\r\n            }\r\n            \r\n            if(startContainer.id==\"luckysheet-rich-text-editor\"){\r\n                $(startSpan).replaceWith(cont);\r\n                let textSpan = $textEditor.find(\"span\");\r\n                spanIndex = textSpan.length-1;\r\n                startOffset = textSpan.get(spanIndex).innerHTML.length-1;\r\n            }\r\n            else{\r\n                $(startSpan).html(cont);\r\n                spanIndex = 0;\r\n            }\r\n            \r\n        }\r\n\r\n        selectTextContentCollapse($textEditor.find(\"span\").get(spanIndex), startOffset+1);\r\n\r\n    }\r\n    else if($functionbox.length>0){\r\n\r\n    }\r\n}\r\n\r\nexport function updateInlineStringFormatOutside(cell, key, value){\r\n    if(cell.ct==null){\r\n        return;\r\n    }\r\n    let s = cell.ct.s;\r\n    if(s==null){\r\n        return;\r\n    }\r\n    for(let i=0;i<s.length;i++){\r\n        let item = s[i];\r\n        item[key] = value;\r\n    }\r\n}\r\n\r\nexport function convertSpanToShareString($dom){\r\n    let styles = [], preStyleList, preStyleListString=null;\r\n    for(let i=0;i<$dom.length;i++){\r\n        let span = $dom.get(i);\r\n        let styleList = convertCssToStyleList(span.style.cssText);\r\n\r\n        let curStyleListString = JSON.stringify(styleList);\r\n        // let v = span.innerHTML;\r\n        let v = span.innerText;\r\n        v = v.replace(/\\n/g, \"\\r\\n\");\r\n\r\n        if(curStyleListString==preStyleListString){\r\n            preStyleList.v += v;\r\n        }\r\n        else{\r\n            styleList.v = v;\r\n            styles.push(styleList); \r\n\r\n            preStyleListString = curStyleListString;\r\n            preStyleList = styleList;\r\n        }\r\n    }\r\n    return styles;\r\n}\r\n\r\nexport function convertCssToStyleList(cssText){\r\n    if(cssText==null || cssText.length==0){\r\n        return {};\r\n    }\r\n    let cssTextArray = cssText.split(\";\");\r\n\r\n\r\n    const _locale = locale();\r\n    const locale_fontarray = _locale.fontarray;\r\n    const locale_fontjson = _locale.fontjson;\r\n    let styleList = {    \r\n        \"ff\":locale_fontarray[0], //font family\r\n        \"fc\":\"#000000\",//font color\r\n        \"fs\":10,//font size\r\n        \"cl\":0,//strike\r\n        \"un\":0,//underline\r\n        \"bl\":0,//blod\r\n        \"it\":0,//italic\r\n    };\r\n    cssTextArray.forEach(s => {\r\n        s = s.toLowerCase();\r\n        let key = textTrim(s.substr(0, s.indexOf(':')));\r\n        let value = textTrim(s.substr(s.indexOf(':') + 1));\r\n        if(key==\"font-weight\"){\r\n            if(value==\"bold\"){\r\n                styleList[\"bl\"] = 1;\r\n            }\r\n            else{\r\n                styleList[\"bl\"] = 0;\r\n            }\r\n        }\r\n\r\n        if(key==\"font-style\"){\r\n            if(value==\"italic\"){\r\n                styleList[\"it\"] = 1;\r\n            }\r\n            else{\r\n                styleList[\"it\"] = 0;\r\n            }\r\n        }\r\n\r\n        if(key==\"font-family\"){\r\n            let ff = locale_fontjson[value];\r\n            if(ff==null){\r\n                styleList[\"ff\"] = value;\r\n            }\r\n            else{\r\n                styleList[\"ff\"] = ff;\r\n            }\r\n        }\r\n\r\n        if(key==\"font-size\"){\r\n            styleList[\"fs\"] = parseInt(value);\r\n        }\r\n\r\n        if(key==\"color\"){\r\n            styleList[\"fc\"] = value;\r\n        }\r\n\r\n        if(key==\"text-decoration\"){\r\n                styleList[\"cl\"] = 1;\r\n        }\r\n\r\n        if(key==\"border-bottom\"){\r\n            styleList[\"un\"] = 1;\r\n        }\r\n\r\n        if(key==\"lucky-strike\"){\r\n            styleList[\"cl\"] = value;\r\n        }\r\n\r\n        if(key==\"lucky-underline\"){\r\n            styleList[\"un\"] = value;\r\n        }\r\n\r\n    });\r\n\r\n    return styleList;\r\n}\r\n\r\nconst luckyToCssName = {\r\n    \"bl\":\"font-weight\",\r\n    \"it\":\"font-style\",\r\n    \"ff\":\"font-family\",\r\n    \"fs\":\"font-size\",\r\n    \"fc\":\"color\",\r\n    \"cl\":\"text-decoration\",\r\n    \"un\":\"border-bottom\",\r\n}\r\n\r\nfunction getClassWithcss(cssText, ukey){\r\n    let cssTextArray = cssText.split(\";\");\r\n    if(ukey==null || ukey.length==0){\r\n        return cssText;\r\n    }\r\n    if(cssText.indexOf(ukey)>-1){\r\n        for(let i=0;i<cssTextArray.length;i++){\r\n            let s = cssTextArray[i];\r\n            s = s.toLowerCase();\r\n            let key = textTrim(s.substr(0, s.indexOf(':')));\r\n            let value = textTrim(s.substr(s.indexOf(':') + 1));\r\n            if(key==ukey){\r\n                return value;\r\n            }\r\n        }\r\n    }\r\n\r\n    return \"\";\r\n}\r\n\r\nfunction upsetClassWithCss(cssText, ukey, uvalue){\r\n    let cssTextArray = cssText.split(\";\");\r\n    let newCss = \"\";\r\n    if(ukey==null || ukey.length==0){\r\n        return cssText;\r\n    }\r\n    if(cssText.indexOf(ukey)>-1){\r\n        for(let i=0;i<cssTextArray.length;i++){\r\n            let s = cssTextArray[i];\r\n            s = s.toLowerCase();\r\n            let key = textTrim(s.substr(0, s.indexOf(':')));\r\n            let value = textTrim(s.substr(s.indexOf(':') + 1));\r\n            if(key==ukey){\r\n                newCss += key + \":\" + uvalue + \";\";\r\n            }\r\n            else if(key.length>0){\r\n                newCss += key + \":\" + value + \";\";\r\n            }\r\n        }\r\n    }\r\n    else if(ukey.length>0){\r\n        cssText += ukey + \":\" + uvalue + \";\"; \r\n        newCss = cssText;\r\n    }\r\n\r\n    return newCss;\r\n}\r\n\r\nfunction removeClassWidthCss(cssText, ukey){\r\n    let cssTextArray = cssText.split(\";\");\r\n    let newCss = \"\";\r\n    let oUkey = ukey;\r\n    if(ukey==null || ukey.length==0){\r\n        return cssText;\r\n    }\r\n    if(ukey in luckyToCssName){\r\n        ukey = luckyToCssName[ukey];\r\n    }\r\n    if(cssText.indexOf(ukey)>-1){\r\n        for(let i=0;i<cssTextArray.length;i++){\r\n            let s = cssTextArray[i];\r\n            s = s.toLowerCase();\r\n            let key = textTrim(s.substr(0, s.indexOf(':')));\r\n            let value = textTrim(s.substr(s.indexOf(':') + 1));\r\n            if(key==ukey || (oUkey==\"cl\" && key==\"lucky-strike\") || (oUkey==\"un\" && key==\"lucky-underline\") ){\r\n                continue;\r\n            }\r\n            else if(key.length>0){\r\n                newCss += key + \":\" + value + \";\";\r\n            }\r\n        }\r\n    }\r\n    else{\r\n        newCss = cssText;\r\n    }\r\n\r\n    return newCss;\r\n}\r\n\r\nfunction getCssText(cssText, attr, value){\r\n    let styleObj = {};\r\n    styleObj[attr] = value;\r\n    if(attr==\"un\"){\r\n        let fontColor = getClassWithcss(cssText,\"color\");\r\n        if(fontColor==\"\"){\r\n            fontColor = \"#000000\";\r\n        }\r\n        let fs = getClassWithcss(cssText,\"font-size\");\r\n        if(fs==\"\"){\r\n            fs = 11;\r\n        }\r\n        fs = parseInt(fs);\r\n        styleObj[\"_fontSize\"] = fs;\r\n        styleObj[\"_color\"] = fontColor;\r\n    }\r\n    let s = getFontStyleByCell(styleObj, undefined, undefined, false);\r\n    let ukey = textTrim(s.substr(0, s.indexOf(':')));\r\n    let uvalue = textTrim(s.substr(s.indexOf(':')+1));\r\n    uvalue = uvalue.substr(0, uvalue.length-1);\r\n    // let cssText = span.style.cssText;\r\n    cssText = removeClassWidthCss(cssText, attr);\r\n\r\n    cssText = upsetClassWithCss(cssText, ukey, uvalue);\r\n\r\n    return cssText;\r\n}\r\n\r\nfunction extendCssText(origin, cover, isLimit=true){\r\n    let originArray = origin.split(\";\");\r\n    let coverArray = cover.split(\";\");\r\n    let newCss = \"\";\r\n    \r\n    let addKeyList = {};\r\n    for(let i=0;i<originArray.length;i++){\r\n        let so = originArray[i], isAdd=true;\r\n        so = so.toLowerCase();\r\n        let okey = textTrim(so.substr(0, so.indexOf(':')));\r\n\r\n        /* 不设置文字的大小，解决设置删除线等后字体变大的问题 */\r\n        if(okey == \"font-size\"){\r\n            continue;\r\n        }\r\n\r\n        let ovalue = textTrim(so.substr(so.indexOf(':') + 1));\r\n\r\n        if(isLimit){\r\n            if(!(okey in inlineStyleAffectCssName)){\r\n                continue;\r\n            }\r\n        }\r\n\r\n        for(let a=0;a<coverArray.length;a++){\r\n            let sc = coverArray[a];\r\n            sc = sc.toLowerCase();\r\n            let ckey = textTrim(sc.substr(0, sc.indexOf(':')));\r\n            let cvalue = textTrim(sc.substr(sc.indexOf(':') + 1));\r\n\r\n            if(okey==ckey){\r\n                newCss += ckey + \":\" + cvalue + \";\";\r\n                isAdd = false;\r\n                continue;\r\n            }\r\n        }\r\n\r\n        if(isAdd){\r\n            newCss += okey + \":\" + ovalue + \";\";\r\n        }\r\n\r\n        addKeyList[okey] = 1;\r\n    }\r\n\r\n    for(let a=0;a<coverArray.length;a++){\r\n        let sc = coverArray[a];\r\n        sc = sc.toLowerCase();\r\n        let ckey = textTrim(sc.substr(0, sc.indexOf(':')));\r\n        let cvalue = textTrim(sc.substr(sc.indexOf(':') + 1));\r\n\r\n        if(isLimit){\r\n            if(!(ckey in inlineStyleAffectCssName)){\r\n                continue;\r\n            }\r\n        }\r\n\r\n        if(!(ckey in addKeyList)){\r\n            newCss += ckey + \":\" + cvalue + \";\";\r\n        }\r\n    }\r\n\r\n    return newCss;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "src/controllers/insertFormula.js",
    "content": "import { luckysheet_getcelldata } from '../function/func';\r\n// import functionlist from '../function/functionlist';\r\n// import Store.luckysheet_function from '../function/Store.luckysheet_function';\r\nimport formula from '../global/formula';\r\nimport { isRealNum, isRealNull } from '../global/validate';\r\nimport { modelHTML } from './constant';\r\nimport { luckysheet_count_show } from './select';\r\nimport { replaceHtml, getObjType } from '../utils/util';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n//插入函数\r\nconst insertFormula = {\r\n    init: function(){\r\n        let _this = this;\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n        let locale_button = _locale.button;\r\n\r\n        $(document).off(\"keyup.fxSFLI\").on(\"keyup.fxSFLI\", \"#searchFormulaListInput\", function(){\r\n            $(\"#formulaTypeList\").empty();\r\n            let txt = $(this).val().toUpperCase();\r\n            let functionlist = Store.functionlist;\r\n\r\n            if(txt == \"\"){\r\n                //若没有查找内容则根据类别筛选\r\n                _this.formulaListByType($(\"#formulaTypeSelect option:selected\").val());\r\n            }\r\n            else{\r\n                for(let i = 0; i < functionlist.length; i++){\r\n                    if(/^[a-zA-Z]+$/.test(txt)){\r\n                        if(functionlist[i].n.indexOf(txt) != \"-1\"){\r\n                            $('<div class=\"listBox\" name=\"'+ functionlist[i].n +'\"><span>'+ functionlist[i].n +'</span><span>'+ functionlist[i].a +'</span></div>').appendTo($(\"#formulaTypeList\"));\r\n                        }\r\n                    }\r\n                    else if(functionlist[i].a.indexOf(txt) != \"-1\"){\r\n                        $('<div class=\"listBox\" name=\"'+ functionlist[i].n +'\"><span>'+ functionlist[i].n +'</span><span>'+ functionlist[i].a +'</span></div>').appendTo($(\"#formulaTypeList\"));\r\n                    }\r\n                }\r\n            }\r\n            \r\n            $(\"#formulaTypeList .listBox:first-child\").addClass(\"on\"); //默认公式列表第一个为选中状态\r\n        });\r\n\r\n        $(document).off(\"change.fxFormulaTS\").on(\"change.fxFormulaTS\", \"#formulaTypeSelect\", function(){\r\n            let type = $(\"#formulaTypeSelect option:selected\").val();\r\n            _this.formulaListByType(type);\r\n        });\r\n\r\n        $(document).off(\"click.fxListbox\").on(\"click.fxListbox\", \"#formulaTypeList .listBox\", function(){\r\n            $(this).addClass(\"on\").siblings().removeClass(\"on\");\r\n        });\r\n\r\n        //选择公式后弹出参数栏弹框\r\n        $(document).off(\"click.fxFormulaCf\").on(\"click.fxFormulaCf\", \"#luckysheet-search-formula-confirm\", function(){\r\n            let formula = $(\"#luckysheet-search-formula .listBox.on\").attr(\"name\");\r\n            let formulaTxt = '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">'+ formula.toUpperCase() +'</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">(</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">)</span>';\r\n            \r\n            $(\"#luckysheet-rich-text-editor\").html(formulaTxt);\r\n            $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n\r\n            _this.formulaParmDialog(formula);\r\n        });\r\n\r\n        //公式参数框\r\n        $(document).off(\"focus.fxParamInput\").on(\"focus.fxParamInput\", \"#luckysheet-search-formula-parm .parmBox input\", function(){\r\n            let parmIndex = $(this).parents(\".parmBox\").index();\r\n            formula.data_parm_index = parmIndex;\r\n\r\n            let formulatxt = $(this).parents(\"#luckysheet-search-formula-parm\").find(\".luckysheet-modal-dialog-title-text\").text();\r\n            let parmLen = Store.luckysheet_function[formulatxt].p.length;\r\n\r\n            let parmDetail, parmRepeat;\r\n            if(parmIndex >= parmLen){\r\n                parmDetail = Store.luckysheet_function[formulatxt].p[parmLen - 1].detail;\r\n                parmRepeat = Store.luckysheet_function[formulatxt].p[parmLen - 1].repeat;\r\n            }\r\n            else{\r\n                parmDetail = Store.luckysheet_function[formulatxt].p[parmIndex].detail;\r\n                parmRepeat = Store.luckysheet_function[formulatxt].p[parmIndex].repeat;\r\n            }\r\n\r\n            //参数选区显示，参数值显示\r\n            _this.parmTxtShow($(this).val());\r\n            \r\n            //计算结果\r\n            _this.functionStrCompute();\r\n            \r\n            //参数名称和释义切换\r\n            $(\"#luckysheet-search-formula-parm .parmDetailsBox\").empty();\r\n\r\n            let parmName = $(this).parents(\".parmBox\").find(\".name\").text();\r\n            $('<span>'+ parmName +':</span><span>'+ parmDetail +'</span>').appendTo($(\"#luckysheet-search-formula-parm .parmDetailsBox\"));\r\n            \r\n            //公式参数可自增（参数自增最多5个）\r\n            if(parmRepeat == \"y\"){\r\n                let parmCount = $(\"#luckysheet-search-formula-parm .parmBox\").length;\r\n\r\n                if(parmCount < 5 && parmIndex == (parmCount - 1)){\r\n                    $('<div class=\"parmBox\"><div class=\"name\">'+ locale_formulaMore.valueTitle +''+ (parmCount + 1) +'</div><div class=\"txt\"><input class=\"formulaInputFocus\" /><i class=\"fa fa-table\" aria-hidden=\"true\" title=\"'+locale_formulaMore.tipSelectDataRange+'\"></i></div><div class=\"val\">=</div></div>').appendTo($(\"#luckysheet-search-formula-parm .parmListBox\"));\r\n                }\r\n            }\r\n        });\r\n\r\n        $(document).off(\"blur.fxParamInput\").on(\"blur.fxParamInput\", \"#luckysheet-search-formula-parm .parmBox input\", function(){\r\n            let txt = $(this).val();\r\n\r\n            if(formula.getfunctionParam(txt).fn == null && !formula.iscelldata(txt)){\r\n                if(!isRealNum(txt) && txt != \"\" && txt.length <= 2 && txt.indexOf('\"') != 0 && txt.lastIndexOf('\"') != 0){\r\n                    txt = '\"' + txt + '\"';\r\n                    $(this).val(txt);\r\n\r\n                    _this.parmTxtShow(txt);\r\n                    _this.functionStrCompute();\r\n                }\r\n            }\r\n        });\r\n        \r\n        $(document).off(\"keyup.fxParamInput\").on(\"keyup.fxParamInput\", \"#luckysheet-search-formula-parm .parmBox input\", function(){\r\n            //参数选区显示，参数值显示\r\n            _this.parmTxtShow($(this).val());\r\n\r\n            //计算结果\r\n            _this.functionStrCompute();\r\n        });\r\n\r\n        //点击图标选取数据范围\r\n        $(document).off(\"click.fxParamI\").on(\"click.fxParamI\", \"#luckysheet-search-formula-parm .parmBox i\", function(){\r\n            formula.data_parm_index = $(this).parents(\".parmBox\").index();\r\n            \r\n            //选取范围弹出框\r\n            $(\"#luckysheet-search-formula-parm\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n\r\n            $(\"#luckysheet-search-formula-parm-select\").remove();\r\n            \r\n            if($(this).parents(\".parmBox\").find(\".txt input\").val() == \"\"){\r\n                $(\"body\").append(replaceHtml(modelHTML, { \r\n                    \"id\": \"luckysheet-search-formula-parm-select\", \r\n                    \"addclass\": \"luckysheet-search-formula-parm-select\", \r\n                    \"title\": locale_formulaMore.tipSelectDataRange, \r\n                    \"content\": \"<input id='luckysheet-search-formula-parm-select-input' class='luckysheet-datavisual-range-container' style='font-size: 14px;padding:5px;max-width:none;' spellcheck='false' aria-label='\"+ locale_formulaMore.tipDataRangeTile +\"' readonly='true' placeholder='\"+ locale_formulaMore.tipDataRangeTile +\"'>\", \r\n                    \"botton\": '<button id=\"luckysheet-search-formula-parm-select-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button>', \r\n                    \"style\": \"z-index:100003\" \r\n                }));\r\n            }\r\n            else{\r\n                $(\"body\").append(replaceHtml(modelHTML, { \r\n                    \"id\": \"luckysheet-search-formula-parm-select\", \r\n                    \"addclass\": \"luckysheet-search-formula-parm-select\", \r\n                    \"title\": locale_formulaMore.tipSelectDataRange, \r\n                    \"content\": \"<input id='luckysheet-search-formula-parm-select-input' class='luckysheet-datavisual-range-container' style='font-size: 14px;padding:5px;max-width:none;' spellcheck='false' aria-label='\"+ locale_formulaMore.tipDataRangeTile +\"' readonly='true' value='\"+ $(this).parents(\".parmBox\").find(\".txt input\").val() +\"'>\", \r\n                    \"botton\": '<button id=\"luckysheet-search-formula-parm-select-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button>', \r\n                    \"style\": \"z-index:100003\" \r\n                }));\r\n            }\r\n\r\n            let $t = $(\"#luckysheet-search-formula-parm-select\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n                myh = $t.outerHeight(), \r\n                myw = $t.outerWidth();\r\n            let winw = $(window).width(), winh = $(window).height();\r\n            let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n            $(\"#luckysheet-search-formula-parm-select\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n            \r\n            //参数选区虚线框\r\n            _this.parmTxtShow($(this).parents(\".parmBox\").find(\".txt input\").val());\r\n        });\r\n\r\n        //点击确定\r\n        $(document).off(\"click.fxParamCf\").on(\"click.fxParamCf\", \"#luckysheet-search-formula-parm-confirm\", function(){\r\n            $(\"#luckysheet-wa-functionbox-confirm\").click();\r\n        });\r\n\r\n        //选取范围后传回参数栏弹框\r\n        $(document).off(\"click.fxParamSelectCf\").on(\"click.fxParamSelectCf\", \"#luckysheet-search-formula-parm-select-confirm\", function(){\r\n            let parmIndex = $(\"#luckysheet-search-formula-parm-select-input\").attr(\"data_parm_index\");\r\n\r\n            $(\"#luckysheet-search-formula-parm-select\").hide();\r\n            $(\"#luckysheet-search-formula-parm\").show();\r\n            $(\"#luckysheet-search-formula-parm .parmBox\").eq(parmIndex).find(\".txt input\").focus();\r\n        });\r\n    },\r\n    formulaListDialog: function(){\r\n        let _this = this;\r\n\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n        let locale_button = _locale.button\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-search-formula\").remove();\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-search-formula\", \r\n            \"addclass\": \"luckysheet-search-formula\", \r\n            \"title\": \"\", \r\n            \"content\": \"<div class='inpbox'><label for='searchFormulaListInput'>\"+ locale_formulaMore.findFunctionTitle +\"：</label><input class='formulaInputFocus' id='searchFormulaListInput' placeholder='\"+ locale_formulaMore.tipInputFunctionName +\"' spellcheck='false'/></div><div class='selbox'><label>\"+locale_formulaMore.selectCategory+\"：</label><select id='formulaTypeSelect'><option value='0'>\"+locale_formulaMore.Math+\"</option><option value='1'>\"+locale_formulaMore.Statistical+\"</option><option value='2'>\"+locale_formulaMore.Lookup+\"</option><option value='3'>\"+locale_formulaMore.luckysheet+\"</option><option value='4'>\"+locale_formulaMore.dataMining+\"</option><option value='5'>\"+locale_formulaMore.Database+\"</option><option value='6'>\"+locale_formulaMore.Date+\"</option><option value='7'>\"+locale_formulaMore.Filter+\"</option><option value='8'>\"+locale_formulaMore.Financial+\"</option><option value='9'>\"+locale_formulaMore.Engineering+\"</option><option value='10'>\"+locale_formulaMore.Logical+\"</option><option value='11'>\"+locale_formulaMore.Operator+\"</option><option value='12'>\"+locale_formulaMore.Text+\"</option><option value='13'>\"+locale_formulaMore.Parser+\"</option><option value='14'>\"+locale_formulaMore.Array+\"</option><option value='-1'>\"+locale_formulaMore.other+\"</option></select></div><div class='listbox'><label>\"+locale_formulaMore.selectFunctionTitle+\"：</label><div id='formulaTypeList'></div></div>\", \r\n            \"botton\": '<button id=\"luckysheet-search-formula-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-search-formula\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-search-formula\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3, \"user-select\": \"none\" }).show();\r\n        \r\n        _this.formulaListByType(\"0\"); //默认公式列表为类型0\r\n        $(\"#searchFormulaListInput\").focus();\r\n    },\r\n    formulaListByType: function(type){\r\n        $(\"#formulaTypeList\").empty();\r\n        let functionlist = Store.functionlist;\r\n                    \r\n        for(let i = 0; i < functionlist.length; i++){\r\n            if((type == \"-1\" && functionlist[i].t > 14) || functionlist[i].t == type){\r\n                $('<div class=\"listBox\" name=\"'+ functionlist[i].n +'\"><span>'+ functionlist[i].n +'</span><span>'+ functionlist[i].a +'</span></div>').appendTo($(\"#formulaTypeList\"));\r\n            }\r\n        }\r\n\r\n        $(\"#formulaTypeList .listBox:first-child\").addClass(\"on\"); //默认公式列表第一个为选中状态\r\n    },\r\n    formulaParmDialog: function(formulaTxt, parm){ //参数弹出框\r\n        let parm_title = '',\r\n            parm_content = '',\r\n            parm_list_content = '';\r\n\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n        let locale_button = _locale.button;\r\n        let functionlist = Store.functionlist;\r\n\r\n        for(let i = 0; i < functionlist.length; i++){\r\n            if(functionlist[i].n == formulaTxt.toUpperCase()){\r\n                parm_title = functionlist[i].n;\r\n\r\n                for(let j = 0; j < functionlist[i].p.length; j++){\r\n                    if(parm == null){\r\n                        //无参数\r\n                        parm_list_content += '<div class=\"parmBox\">'+\r\n                                                '<div class=\"name\">'+ functionlist[i].p[j].name +'</div>'+\r\n                                                '<div class=\"txt\">'+\r\n                                                    '<input class=\"formulaInputFocus\" spellcheck=\"false\"/>' +\r\n                                                    '<i class=\"fa fa-table\" aria-hidden=\"true\" title=\"'+locale_formulaMore.tipSelectDataRange+'\"></i>'+\r\n                                                '</div>'+\r\n                                                '<div class=\"val\">=</div>'+\r\n                                             '</div>';\r\n                    }\r\n                    else{\r\n                        //有参数\r\n                        if(parm[j] == null){\r\n                            parm[j] = \"\";\r\n                        }\r\n\r\n                        parm_list_content += '<div class=\"parmBox\">'+\r\n                                                '<div class=\"name\">'+ functionlist[i].p[j].name +'</div>'+\r\n                                                '<div class=\"txt\">'+\r\n                                                    '<input class=\"formulaInputFocus\" value=\"'+ parm[j] +'\" spellcheck=\"false\"/>'+\r\n                                                    '<i class=\"fa fa-table\" aria-hidden=\"true\" title=\"'+locale_formulaMore.tipSelectDataRange+'\"></i>'+\r\n                                                '</div>'+\r\n                                                '<div class=\"val\">=</div>'+\r\n                                             '</div>';\r\n                    }\r\n                }\r\n\r\n                parm_content =  '<div>'+\r\n                                    '<div class=\"parmListBox\">'+ parm_list_content +'</div>'+\r\n                                    '<div class=\"formulaDetails\">'+ functionlist[i].d +'</div>'+\r\n                                    '<div class=\"parmDetailsBox\"></div>'+\r\n                                    '<div class=\"result\">'+locale_formulaMore.calculationResult+' = <span></span></div>'+\r\n                                '</div>';\r\n            }\r\n        }\r\n\r\n        $(\"#luckysheet-search-formula\").hide();\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        \r\n        $(\"#luckysheet-search-formula-parm\").remove();\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-search-formula-parm\", \r\n            \"addclass\": \"luckysheet-search-formula-parm\", \r\n            \"title\": parm_title, \r\n            \"content\": parm_content, \r\n            \"botton\": '<button id=\"luckysheet-search-formula-parm-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-search-formula-parm\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-search-formula-parm\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n        \r\n        //参数栏第一个参数聚焦，显示选取虚线框\r\n        $(\"#luckysheet-search-formula-parm .parmBox:eq(0) input\").focus();\r\n\r\n        //遍历参数，有参数显示值，无显示空\r\n        $(\"#luckysheet-search-formula-parm .parmBox\").each(function(index,e){\r\n            let parmtxt = $(e).find(\".txt input\").val();\r\n            \r\n            if(formula.getfunctionParam(parmtxt).fn == null){ //参数不是公式\r\n                if(formula.iscelldata(parmtxt)){ //参数是选区\r\n                    let txtdata = luckysheet_getcelldata(parmtxt).data;\r\n\r\n                    if(getObjType(txtdata) == \"array\"){ //参数为多个单元格选区\r\n                        let txtArr = [];\r\n                        \r\n                        for(let i = 0; i < txtdata.length; i++){\r\n                            for(let j = 0; j < txtdata[i].length; j++){\r\n                                let cell = txtdata[i][j];\r\n\r\n                                if(cell == null || isRealNull(cell.v)){\r\n                                    txtArr.push(null);\r\n                                }\r\n                                else{\r\n                                    txtArr.push(cell.v);\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        $(\"#luckysheet-search-formula-parm .parmBox\").eq(index).find(\".val\").text(\" = {\"+ txtArr.join(\",\") +\"}\");\r\n                    }\r\n                    else{ //参数为单个单元格选区\r\n                        $(\"#luckysheet-search-formula-parm .parmBox\").eq(index).find(\".val\").text(\" = {\"+ txtdata.v +\"}\");\r\n                    }\r\n                }\r\n                else{ //参数不是选区\r\n                    $(\"#luckysheet-search-formula-parm .parmBox\").eq(index).find(\".val\").text(\" = {\"+ parmtxt +\"}\");\r\n                }\r\n            }\r\n            else{ //参数是公式\r\n                $(\"#luckysheet-search-formula-parm .parmBox\").eq(index).find(\".val\").text(\" = {\"+ (new Function(\"return \" + $.trim(formula.functionParserExe(\"=\" + parmtxt)))()) +\"}\");\r\n            }\r\n        })\r\n\r\n        $(\"#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight\").remove();                        \r\n        formula.data_parm_index = 0;\r\n        formula.rangestart = true;\r\n    },\r\n    parmTxtShow: function(parmtxt){\r\n        if(formula.getfunctionParam(parmtxt).fn == null){ //参数不是公式\r\n            if(formula.iscelldata(parmtxt)){ //参数是选区\r\n                let cellrange = formula.getcellrange(parmtxt);\r\n                let r1 = cellrange.row[0], \r\n                    r2 = cellrange.row[1], \r\n                    c1 = cellrange.column[0], \r\n                    c2 = cellrange.column[1];\r\n                let row = Store.visibledatarow[r2], \r\n                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                let col = Store.visibledatacolumn[c2], \r\n                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                $(\"#luckysheet-formula-functionrange-select\").css({ \r\n                    \"left\": col_pre, \r\n                    \"width\": col - col_pre - 1, \r\n                    \"top\": row_pre, \r\n                    \"height\": row - row_pre - 1 \r\n                }).show();\r\n                $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n                luckysheet_count_show(col_pre, row_pre, col - col_pre - 1, row - row_pre - 1, cellrange.row, cellrange.column);\r\n\r\n                let txtdata = luckysheet_getcelldata(parmtxt).data;\r\n                if(getObjType(txtdata) == \"array\"){ //参数为多个单元格选区\r\n                    let txtArr = [];\r\n                    \r\n                    for(let i = 0; i < txtdata.length; i++){\r\n                        for(let j = 0; j < txtdata[i].length; j++){\r\n                            let cell = txtdata[i][j];\r\n\r\n                            if(cell == null || isRealNull(cell.v)){\r\n                                txtArr.push(null);\r\n                            }\r\n                            else{\r\n                                txtArr.push(cell.v);\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    $(\"#luckysheet-search-formula-parm .parmBox\").eq(formula.data_parm_index).find(\".val\").text(\" = {\"+ txtArr.join(\",\") +\"}\");\r\n                }\r\n                else{ //参数为单个单元格选区\r\n                    $(\"#luckysheet-search-formula-parm .parmBox\").eq(formula.data_parm_index).find(\".val\").text(\" = {\"+ txtdata.v +\"}\");\r\n                }\r\n            }\r\n            else{ //参数不是选区\r\n                $(\"#luckysheet-search-formula-parm .parmBox\").eq(formula.data_parm_index).find(\".val\").text(\" = {\"+ parmtxt +\"}\");\r\n\r\n                $(\"#luckysheet-formula-functionrange-select\").hide();\r\n            }\r\n        }\r\n        else{   \r\n            //参数是公式\r\n            let txt;\r\n            for(let k = 0; k < formula.getfunctionParam(parmtxt).param.length; k++){\r\n                if(formula.iscelldata(formula.getfunctionParam(parmtxt).param[k])){\r\n                    txt = formula.getfunctionParam(parmtxt).param[k];\r\n                    break;\r\n                }\r\n            }\r\n\r\n            let cellrange = formula.getcellrange(txt);\r\n            let r1 = cellrange.row[0], \r\n                r2 = cellrange.row[1], \r\n                c1 = cellrange.column[0], \r\n                c2 = cellrange.column[1];\r\n            let row = Store.visibledatarow[r2], \r\n                row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n            let col = Store.visibledatacolumn[c2], \r\n                col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n            $(\"#luckysheet-formula-functionrange-select\").css({ \r\n                \"left\": col_pre, \r\n                \"width\": col - col_pre - 1, \r\n                \"top\": row_pre, \r\n                \"height\": row - row_pre - 1 \r\n            }).show();\r\n            $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n            luckysheet_count_show(col_pre, row_pre, col - col_pre - 1, row - row_pre - 1, cellrange.row, cellrange.column);\r\n\r\n            $(\"#luckysheet-search-formula-parm .parmBox\").eq(formula.data_parm_index).find(\".val\").text(\" = {\"+ (new Function(\"return \" + $.trim(formula.functionParserExe(\"=\" + parmtxt)))()) +\"}\");\r\n        }\r\n    },\r\n    functionStrCompute: function(){\r\n        let isVal = true; //参数不为空\r\n        let parmValArr = []; //参数值集合\r\n        let lvi = -1; //最后一个有值的参数索引\r\n\r\n        let formulatxt = $(\"#luckysheet-search-formula-parm\").find(\".luckysheet-modal-dialog-title-text\").text();\r\n        let p = Store.luckysheet_function[formulatxt].p;\r\n        \r\n        $(\"#luckysheet-search-formula-parm .parmBox\").each(function(i, e){\r\n            let parmtxt = $(e).find(\".txt input\").val();\r\n\r\n            let parmRequire;\r\n            if(i < p.length){\r\n                parmRequire = p[i].require;\r\n            }\r\n            else{\r\n                parmRequire = p[p.length - 1].require;\r\n            }\r\n\r\n            if(parmtxt == \"\" && parmRequire == \"m\"){\r\n                isVal = false;\r\n            }\r\n\r\n            if(parmtxt != \"\"){\r\n                lvi = i;\r\n            }\r\n        });\r\n\r\n        //单元格显示\r\n        let functionHtmlTxt;\r\n        if(lvi == -1){\r\n            functionHtmlTxt = \"=\" + $(\"#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text\").text() + \"()\"; \r\n        }\r\n        else if(lvi == 0){\r\n            functionHtmlTxt = \"=\" + $(\"#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text\").text() + \"(\" + $(\"#luckysheet-search-formula-parm .parmBox\").eq(0).find(\".txt input\").val() + \")\"; \r\n        }\r\n        else{\r\n            for(let j = 0; j <= lvi; j++){\r\n                parmValArr.push($(\"#luckysheet-search-formula-parm .parmBox\").eq(j).find(\".txt input\").val());\r\n            }\r\n\r\n            functionHtmlTxt = \"=\" + $(\"#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text\").text() + \"(\" + parmValArr.join(\",\") + \")\";    \r\n        }\r\n\r\n        let function_str = formula.functionHTMLGenerate(functionHtmlTxt);\r\n        $(\"#luckysheet-rich-text-editor\").html(function_str);\r\n        $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n        \r\n        if(isVal){ //公式计算\r\n            let fp = $.trim(formula.functionParserExe($(\"#luckysheet-rich-text-editor\").text()));\r\n            \r\n            let result = null;\r\n\r\n            try {\r\n                result = new Function(\"return \" + fp)();\r\n            } \r\n            catch (e) {\r\n                result = formula.error.n;\r\n            }\r\n\r\n            $(\"#luckysheet-search-formula-parm .result span\").text(result);\r\n        }\r\n    }\r\n}\r\n\r\nexport default insertFormula;"
  },
  {
    "path": "src/controllers/keyboard.js",
    "content": "import luckysheetConfigsetting from './luckysheetConfigsetting';\r\nimport menuButton from './menuButton';\r\nimport conditionformat from './conditionformat';\r\nimport server from './server';\r\nimport {luckysheetupdateCell,setCenterInputPosition} from './updateCell';\r\nimport { keycode } from './constant';\r\nimport { \r\n    luckysheetMoveHighlightCell, \r\n    luckysheetMoveHighlightCell2, \r\n    luckysheetMoveHighlightRange, \r\n    luckysheetMoveHighlightRange2 \r\n} from './sheetMove';\r\nimport { selectHightlightShow, selectIsOverlap } from './select';\r\nimport selection from './selection';\r\nimport searchReplace from './searchReplace';\r\nimport controlHistory from './controlHistory';\r\nimport imageCtrl from './imageCtrl';\r\n\r\nimport { \r\n    getByteLen,\r\n    getNowDateTime,\r\n    luckysheetactiveCell,\r\n} from '../utils/util';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { hasPartMC, isEditMode } from '../global/validate';\r\nimport { luckysheetRangeLast } from '../global/cursorPos';\r\nimport formula from '../global/formula';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport tooltip from '../global/tooltip';\r\nimport locale from '../locale/locale';\r\nimport {enterKeyControll} from './inlineString';\r\nimport Store from '../store';\r\n\r\n\r\nlet luckysheet_shiftkeydown = false;\r\n\r\nfunction formulaMoveEvent(dir, ctrlKey, shiftKey, event){\r\n    if ($(\"#luckysheet-formula-search-c\").is(\":visible\") && (dir==\"up\" || dir==\"down\") ) {\r\n        let $obj;\r\n        if(dir==\"down\"){\r\n            $obj = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\").next();\r\n            if ($obj.length == 0) {\r\n                $obj = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").first();\r\n            }\r\n        }\r\n        else if(dir==\"up\"){\r\n            $obj = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\").prev();\r\n            if ($obj.length == 0) {\r\n                $obj = $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").last();\r\n            }\r\n        }\r\n        \r\n\r\n        $(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item\").removeClass(\"luckysheet-formula-search-item-active\");\r\n        $obj.addClass(\"luckysheet-formula-search-item-active\");\r\n\r\n        event.preventDefault();\r\n    }\r\n    else{\r\n        if($(\"#luckysheet-formula-functionrange-select\").is(\":visible\")){\r\n            if(ctrlKey && shiftKey){\r\n                luckysheetMoveHighlightRange2(dir, \"rangeOfFormula\");\r\n            }\r\n            else if(ctrlKey){\r\n                luckysheetMoveHighlightCell2(dir, \"rangeOfFormula\");\r\n            }\r\n            else if(shiftKey){\r\n                let dir_n = dir, step = 1;\r\n                if(dir == 'up'){\r\n                    dir_n = 'down';\r\n                    step = -1;\r\n                }\r\n                if(dir == 'left'){\r\n                    dir_n = 'right';\r\n                    step = -1;\r\n                }\r\n\r\n                luckysheetMoveHighlightRange(dir_n, step, \"rangeOfFormula\");\r\n            }\r\n            else{\r\n                let dir_n = dir, step = 1;\r\n                if(dir == 'up'){\r\n                    dir_n = 'down';\r\n                    step = -1;\r\n                }\r\n                if(dir == 'left'){\r\n                    dir_n = 'right';\r\n                    step = -1;\r\n                }\r\n\r\n                luckysheetMoveHighlightCell(dir_n, step, \"rangeOfFormula\");\r\n            }   \r\n            event.preventDefault();\r\n        }\r\n        else if(formula.israngeseleciton()){\r\n            let anchor = $(window.getSelection().anchorNode);\r\n            // console.log(anchor.parent().next().text());\r\n            if(anchor.parent().next().text() == null || anchor.parent().next().text() == \"\"){\r\n                let vText = $(\"#luckysheet-input-box #luckysheet-input-box-index\").text();\r\n                let range = formula.getcellrange(vText);\r\n\r\n                if(range == null){\r\n                    range = formula.getcellrange($(\"#luckysheet-input-box-index\").text());\r\n                }\r\n\r\n                let r1 = range[\"row\"][0], r2 = range[\"row\"][1];\r\n                let c1 = range[\"column\"][0], c2 = range[\"column\"][1];\r\n\r\n                let row = Store.visibledatarow[r2], \r\n                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                let col = Store.visibledatacolumn[c2], \r\n                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                formula.func_selectedrange = {\r\n                    \"left\": col_pre,\r\n                    \"width\": col - col_pre - 1,\r\n                    \"top\": row_pre,\r\n                    \"height\": row - row_pre - 1,\r\n                    \"left_move\": col_pre,\r\n                    \"width_move\": col - col_pre - 1,\r\n                    \"top_move\": row_pre,\r\n                    \"height_move\": row - row_pre - 1,\r\n                    \"row\": [r1, r2],\r\n                    \"column\": [c1, c2],\r\n                    \"row_focus\": r1,\r\n                    \"column_focus\": c1\r\n                };\r\n\r\n                formula.rangeSetValue({ \"row\": [r1, r2], \"column\": [c1, c2] });\r\n\r\n                formula.rangestart = true;\r\n                formula.rangedrag_column_start = false;\r\n                formula.rangedrag_row_start = false;\r\n                \r\n                if(ctrlKey && shiftKey){\r\n                    luckysheetMoveHighlightRange2(dir, \"rangeOfFormula\");\r\n                }\r\n                else if(ctrlKey){\r\n                    luckysheetMoveHighlightCell2(dir, \"rangeOfFormula\");\r\n                }\r\n                else if(shiftKey){\r\n                    let dir_n = dir, step = 1;\r\n                    if(dir == 'up'){\r\n                        dir_n = 'down';\r\n                        step = -1;\r\n                    }\r\n                    if(dir == 'left'){\r\n                        dir_n = 'right';\r\n                        step = -1;\r\n                    }\r\n                    \r\n                    luckysheetMoveHighlightRange(dir_n, step, \"rangeOfFormula\");\r\n                }\r\n                else{\r\n                    let dir_n = dir, step = 1;\r\n                    if(dir == 'up'){\r\n                        dir_n = 'down';\r\n                        step = -1;\r\n                    }\r\n                    if(dir == 'left'){\r\n                        dir_n = 'right';\r\n                        step = -1;\r\n                    }\r\n                    \r\n                    luckysheetMoveHighlightCell(dir_n, step, \"rangeOfFormula\");\r\n                } \r\n\r\n                event.preventDefault();\r\n            }\r\n\r\n        }\r\n        else if(!ctrlKey && !shiftKey){\r\n            let anchor = $(window.getSelection().anchorNode);\r\n            let anchorOffset = window.getSelection().anchorOffset;\r\n\r\n            if(dir == 'up'){\r\n                if(anchor.parent().is(\"span\") && anchor.parent().next().length == 0 && anchorOffset > 0){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"down\", -1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.is(\"#luckysheet-rich-text-editor\") && anchor.context.childElementCount == anchorOffset){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"down\", -1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.parent().is(\"#luckysheet-rich-text-editor\") && anchor.context.length == anchorOffset){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"down\", -1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n            }\r\n            else if(dir == 'down'){\r\n                if(anchor.parent().is(\"span\") && anchor.parent().next().length == 0 && anchorOffset > 0){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"down\", 1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.is(\"#luckysheet-rich-text-editor\") && anchor.context.childElementCount == anchorOffset){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"down\", 1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.parent().is(\"#luckysheet-rich-text-editor\") && anchor.context.length == anchorOffset){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"down\", 1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n            }\r\n            else if(dir == 'left'){\r\n                if(anchor.parent().is(\"span\") && anchor.parent().prev().length == 0 && anchorOffset == 0){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"right\", -1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.is(\"#luckysheet-rich-text-editor\") && anchorOffset == 1){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"right\", -1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.parent().is(\"#luckysheet-rich-text-editor\") && anchorOffset == 0){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"right\", -1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else{\r\n                    formula.rangeHightlightselected($(\"#luckysheet-rich-text-editor\"));\r\n                }\r\n            }\r\n            else if(dir == 'right'){\r\n                if(anchor.parent().is(\"span\") && anchor.parent().next().length == 0 && anchorOffset > 0){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"right\", 1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.is(\"#luckysheet-rich-text-editor\") && anchor.context.childElementCount == anchorOffset){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"right\", 1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else if(anchor.parent().is(\"#luckysheet-rich-text-editor\") && anchor.context.length == anchorOffset){\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    luckysheetMoveHighlightCell(\"right\", 1, \"rangeOfSelect\");\r\n\r\n                    event.preventDefault();\r\n                }\r\n                else{\r\n                    formula.rangeHightlightselected($(\"#luckysheet-rich-text-editor\"));\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nexport function keyboardInitial(){\r\n    const _locale = locale();\r\n    const locale_drag = _locale.drag;\r\n\r\n    //单元格编辑输入\r\n    $(\"#luckysheet-input-box\").click(function () {\r\n        formula.rangeHightlightselected($(\"#luckysheet-rich-text-editor\"));\r\n    }).add(\"#\" + Store.container).on(\"keydown\", function (event) {\r\n        let ctrlKey = event.ctrlKey;\r\n        let altKey = event.altKey;\r\n        let shiftKey = event.shiftKey;\r\n        let kcode = event.keyCode;\r\n\r\n        if ($(\"#luckysheet-modal-dialog-mask\").is(\":visible\") || $(event.target).hasClass(\"luckysheet-mousedown-cancel\") || $(event.target).hasClass(\"sp-input\") || (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0 && $(event.target).closest(\".luckysheet-input-box\").length > 0 && kcode != keycode.ENTER && kcode != keycode.TAB && kcode != keycode.UP && kcode != keycode.DOWN && kcode != keycode.LEFT && kcode != keycode.RIGHT)) {\r\n            let anchor = $(window.getSelection().anchorNode);\r\n            \r\n            if(anchor.parent().is(\"#luckysheet-helpbox-cell\") || anchor.is(\"#luckysheet-helpbox-cell\")){\r\n                if(kcode == keycode.ENTER){\r\n                    let helpboxValue = $(\"#luckysheet-helpbox-cell\").text();\r\n\r\n                    if(formula.iscelldata(helpboxValue)){\r\n                        let cellrange = formula.getcellrange(helpboxValue);\r\n                        \r\n                        Store.luckysheet_select_save = [{ \"row\": cellrange[\"row\"], \"column\": cellrange[\"column\"], \"row_focus\": cellrange[\"row\"][0], \"column_focus\": cellrange[\"column\"][0] }];\r\n                        selectHightlightShow();\r\n                        \r\n                        $(\"#luckysheet-helpbox-cell\").blur();\r\n\r\n                        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(), \r\n                            scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                        let winH = $(\"#luckysheet-cell-main\").height(), \r\n                            winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n                        let row = Store.visibledatarow[cellrange[\"row\"][1]], \r\n                            row_pre = cellrange[\"row\"][0] - 1 == -1 ? 0 : Store.visibledatarow[cellrange[\"row\"][0] - 1];\r\n                        let col = Store.visibledatacolumn[cellrange[\"column\"][1]], \r\n                            col_pre = cellrange[\"column\"][0] - 1 == -1 ? 0 : Store.visibledatacolumn[cellrange[\"column\"][0] - 1];\r\n\r\n                        if (col - scrollLeft - winW + 20 > 0) {\r\n                            $(\"#luckysheet-scrollbar-x\").scrollLeft(col - winW + 20);\r\n                        }\r\n                        else if (col_pre - scrollLeft - 20 < 0) {\r\n                            $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre - 20);\r\n                        }\r\n\r\n                        if (row - scrollTop - winH + 20 > 0) {\r\n                            $(\"#luckysheet-scrollbar-y\").scrollTop(row - winH + 20);\r\n                        }\r\n                        else if (row_pre - scrollTop - 20 < 0) {\r\n                            $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre - 20);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            \r\n            return;\r\n        }\r\n\r\n        if ($(\"#luckysheet-modal-dialog-mask\").is(\":visible\") || $(event.target).hasClass(\"luckysheet-mousedown-cancel\") || $(event.target).hasClass(\"formulaInputFocus\")) {\r\n            return;\r\n        }\r\n        \r\n        let $inputbox = $(\"#luckysheet-input-box\");\r\n        \r\n        if((altKey || event.metaKey) && kcode == keycode.ENTER && parseInt($inputbox.css(\"top\")) > 0){\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n            let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n            enterKeyControll(Store.flowdata[row_index][col_index]);\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.ENTER && parseInt($inputbox.css(\"top\")) > 0) {\r\n            if ($(\"#luckysheet-formula-search-c\").is(\":visible\") && formula.searchFunctionCell != null) {\r\n                formula.searchFunctionEnter($(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\"));\r\n            }\r\n            else {\r\n                formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                Store.luckysheet_select_save = [{ \r\n                    \"row\": [Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[0]], \r\n                    \"column\": [Store.luckysheetCellUpdate[1], Store.luckysheetCellUpdate[1]], \r\n                    \"row_focus\": Store.luckysheetCellUpdate[0], \r\n                    \"column_focus\": Store.luckysheetCellUpdate[1] \r\n                }];\r\n                luckysheetMoveHighlightCell(\"down\", 1, \"rangeOfSelect\");\r\n            }\r\n\r\n            //若有参数弹出框，隐藏\r\n            if($(\"#luckysheet-search-formula-parm\").is(\":visible\")){\r\n                $(\"#luckysheet-search-formula-parm\").hide();\r\n            }\r\n            //若有参数选取范围弹出框，隐藏\r\n            if($(\"#luckysheet-search-formula-parm-select\").is(\":visible\")){\r\n                $(\"#luckysheet-search-formula-parm-select\").hide();\r\n            }\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.TAB) {\r\n            if (parseInt($inputbox.css(\"top\")) > 0) {\r\n                return;\r\n            }\r\n\r\n            luckysheetMoveHighlightCell(\"right\", 1, \"rangeOfSelect\");\r\n            event.preventDefault();\r\n        }\r\n        else if(kcode == keycode.F2){\r\n            if (parseInt($inputbox.css(\"top\")) > 0) {\r\n                return;\r\n            }\r\n\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n            let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n\r\n            luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.F4 && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.setfreezonFuc(event);\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.ESC && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.dontupdate();\r\n            luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.ENTER) {\r\n            if($(event.target).hasClass(\"formulaInputFocus\") || $(\"#luckysheet-conditionformat-dialog\").is(\":visible\")){\r\n                return;\r\n            }\r\n            else if (String.fromCharCode(kcode) != null && $(\"#luckysheet-cell-selected\").is(\":visible\")) {\r\n                let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n                let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n\r\n                luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n                event.preventDefault();\r\n            }\r\n        }\r\n        else {\r\n            if (ctrlKey || event.metaKey) {\r\n                if (shiftKey) {\r\n                    if (!luckysheet_shiftkeydown) {\r\n                        Store.luckysheet_shiftpositon = $.extend(true, {}, Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]);\r\n                        Store.luckysheet_shiftkeydown = true;\r\n                    }\r\n\r\n                    //Ctrl + shift + 方向键  调整选区\r\n                    if (kcode == keycode.UP) {\r\n                        if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                            return;\r\n                        }\r\n\r\n                        luckysheetMoveHighlightRange2(\"up\", \"rangeOfSelect\");\r\n                    }\r\n                    else if (kcode == keycode.DOWN) {\r\n                        if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                            return;\r\n                        }\r\n\r\n                        luckysheetMoveHighlightRange2(\"down\", \"rangeOfSelect\");\r\n                    }\r\n                    else if (kcode == keycode.LEFT) {\r\n                        if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                            return;\r\n                        }\r\n\r\n                        luckysheetMoveHighlightRange2(\"left\", \"rangeOfSelect\");\r\n                    }\r\n                    else if (kcode == keycode.RIGHT) {\r\n                        if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                            return;\r\n                        }\r\n\r\n                        luckysheetMoveHighlightRange2(\"right\", \"rangeOfSelect\");\r\n                    }\r\n                    else if (kcode == 186 || kcode == 222) {\r\n                        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                        let row_index = last[\"row_focus\"], \r\n                            col_index = last[\"column_focus\"];\r\n                        luckysheetupdateCell(row_index, col_index, Store.flowdata, true);\r\n\r\n                        let value = getNowDateTime(2);\r\n                        $(\"#luckysheet-rich-text-editor\").html(value);\r\n                        luckysheetRangeLast($(\"#luckysheet-rich-text-editor\")[0]);\r\n                        formula.functionInputHanddler($(\"#luckysheet-functionbox-cell\"), $(\"#luckysheet-rich-text-editor\"), kcode);\r\n                    }\r\n                }\r\n                else if (kcode == 66) {//Ctrl + B  加粗\r\n                    $(\"#luckysheet-icon-bold\").click();\r\n                }\r\n                else if (kcode == 67) {//Ctrl + C  复制\r\n                    if(imageCtrl.currentImgId != null){\r\n                        imageCtrl.copyImgItem(event);\r\n                        return;\r\n                    }\r\n\r\n                    //复制时存在格式刷状态，取消格式刷\r\n                    if(menuButton.luckysheetPaintModelOn){\r\n                        menuButton.cancelPaintModel();\r\n                    }\r\n                    \r\n                    if(Store.luckysheet_select_save.length == 0){\r\n                        return;\r\n                    }\r\n\r\n                    //复制范围内包含部分合并单元格，提示\r\n                    if(Store.config[\"merge\"] != null){\r\n                        let has_PartMC = false;\r\n\r\n                        for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                            let r1 = Store.luckysheet_select_save[s].row[0], \r\n                                r2 = Store.luckysheet_select_save[s].row[1];\r\n                            let c1 = Store.luckysheet_select_save[s].column[0], \r\n                                c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                            has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                            if(has_PartMC){\r\n                                break;\r\n                            }\r\n                        }\r\n\r\n                        if(has_PartMC){\r\n                            if(isEditMode()){\r\n                                alert(locale_drag.noMerge);\r\n                            }\r\n                            else{\r\n                                tooltip.info(locale_drag.noMerge, \"\"); \r\n                            }\r\n                            return;    \r\n                        }\r\n                    }\r\n\r\n                    //多重选区 有条件格式时 提示\r\n                    let cdformat = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].luckysheet_conditionformat_save;\r\n                    if(Store.luckysheet_select_save.length > 1 && cdformat != null && cdformat.length > 0){\r\n                        let hasCF = false;\r\n\r\n                        let cf_compute = conditionformat.getComputeMap();\r\n\r\n                        label:\r\n                        for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                            if(hasCF){\r\n                                break;\r\n                            }\r\n                            \r\n                            let r1 = Store.luckysheet_select_save[s].row[0], \r\n                                r2 = Store.luckysheet_select_save[s].row[1];\r\n                            let c1 = Store.luckysheet_select_save[s].column[0], \r\n                                c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                            for(let r = r1; r <= r2; r++){\r\n                                for(let c = c1; c <= c2; c++){\r\n                                    if(conditionformat.checksCF(r, c, cf_compute) != null){\r\n                                        hasCF = true;\r\n                                        continue label;\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        if(hasCF){\r\n                            if(isEditMode()){\r\n                                alert(locale_drag.noMulti);\r\n                            }\r\n                            else{\r\n                                tooltip.info(locale_drag.noMulti, \"\");\r\n                            }\r\n                            return;\r\n                        }\r\n                    }\r\n\r\n                    //多重选区 行不一样且列不一样时 提示\r\n                    if(Store.luckysheet_select_save.length > 1){ \r\n                        let isSameRow = true, \r\n                            str_r = Store.luckysheet_select_save[0].row[0], \r\n                            end_r = Store.luckysheet_select_save[0].row[1];\r\n                        let isSameCol = true, \r\n                            str_c = Store.luckysheet_select_save[0].column[0], \r\n                            end_c = Store.luckysheet_select_save[0].column[1];\r\n                        \r\n                        for(let s = 1; s < Store.luckysheet_select_save.length; s++){\r\n                            if(Store.luckysheet_select_save[s].row[0] != str_r || Store.luckysheet_select_save[s].row[1] != end_r){\r\n                                isSameRow = false;\r\n                            }\r\n                            if(Store.luckysheet_select_save[s].column[0] != str_c || Store.luckysheet_select_save[s].column[1] != end_c){\r\n                                isSameCol = false;\r\n                            }\r\n                        }\r\n\r\n                        if((!isSameRow && !isSameCol) || selectIsOverlap()){\r\n                            if(isEditMode()){\r\n                                alert(locale_drag.noMulti);\r\n                            }\r\n                            else{\r\n                                tooltip.info(locale_drag.noMulti, \"\"); \r\n                            }\r\n                            return;\r\n                        }    \r\n                    }\r\n\r\n                    selection.copy(event);\r\n\r\n                    Store.luckysheet_paste_iscut = false;\r\n                    luckysheetactiveCell();\r\n\r\n                    event.stopPropagation();\r\n                    return;\r\n                }\r\n                else if (kcode == 70) {//Ctrl + F  查找\r\n                    searchReplace.createDialog(0);\r\n                    searchReplace.init();\r\n\r\n                    $(\"#luckysheet-search-replace #searchInput input\").focus();\r\n                }\r\n                else if (kcode == 72) {//Ctrl + H  替换\r\n                    searchReplace.createDialog(1);\r\n                    searchReplace.init();\r\n\r\n                    $(\"#luckysheet-search-replace #searchInput input\").focus();\r\n                }\r\n                else if (kcode == 73) {//Ctrl + I  斜体\r\n                    $(\"#luckysheet-icon-italic\").click();\r\n                }\r\n                else if (kcode == 86) {//Ctrl + V  粘贴\r\n                    if (isEditMode() || Store.allowEdit === false){//此模式下禁用粘贴\r\n                        return;\r\n                    }\r\n\r\n                    if($(event.target).hasClass(\"formulaInputFocus\")){\r\n                        return;\r\n                    }\r\n\r\n                    if(Store.luckysheet_select_save.length > 1){\r\n                        if(isEditMode()){\r\n                            alert(locale_drag.noPaste);\r\n                        }\r\n                        else{\r\n                            tooltip.info(locale_drag.noPaste, \"\");\r\n                        }\r\n                        return;\r\n                    }\r\n\r\n                    selection.isPasteAction = true;\r\n                    luckysheetactiveCell();\r\n\r\n                    event.stopPropagation();\r\n                    return;\r\n                }\r\n                else if (kcode == 88) {//Ctrl + X  剪切\r\n                    //复制时存在格式刷状态，取消格式刷\r\n                    if(menuButton.luckysheetPaintModelOn){\r\n                        menuButton.cancelPaintModel();\r\n                    }\r\n\r\n                    if(Store.luckysheet_select_save.length == 0){\r\n                        return;\r\n                    }\r\n\r\n                    //复制范围内包含部分合并单元格，提示\r\n                    if(Store.config[\"merge\"] != null){\r\n                        let has_PartMC = false;\r\n\r\n                        for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                            let r1 = Store.luckysheet_select_save[s].row[0], \r\n                                r2 = Store.luckysheet_select_save[s].row[1];\r\n                            let c1 = Store.luckysheet_select_save[s].column[0], \r\n                                c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                            has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                            if(has_PartMC){\r\n                                break;\r\n                            }\r\n                        }\r\n\r\n                        if(has_PartMC){\r\n                            if(luckysheetConfigsetting.editMode){\r\n                                alert(_locale_drag.noMerge);\r\n                            }\r\n                            else{\r\n                                tooltip.info(_locale_drag.noMerge, \"\"); \r\n                            }\r\n                            return;    \r\n                        }\r\n                    }\r\n\r\n                    //多重选区时 提示\r\n                    if(Store.luckysheet_select_save.length > 1){\r\n                        if(isEditMode()){\r\n                            alert(locale_drag.noMulti);\r\n                        }\r\n                        else{\r\n                            tooltip.info(locale_drag.noMulti, \"\"); \r\n                        }\r\n                        return;\r\n                    }\r\n\r\n                    selection.copy(event);\r\n\r\n                    Store.luckysheet_paste_iscut = true;\r\n                    luckysheetactiveCell();\r\n                    \r\n                    event.stopPropagation();\r\n                    return;\r\n                }\r\n                else if (kcode == 90) {//Ctrl + Z  撤销\r\n                    controlHistory.redo(event);\r\n                    luckysheetactiveCell();\r\n                    event.stopPropagation();\r\n                    return;\r\n                }\r\n                else if (kcode == 89) {//Ctrl + Y  重做\r\n                    controlHistory.undo(event);\r\n                    luckysheetactiveCell();\r\n                    event.stopPropagation();\r\n                    return;\r\n                }\r\n                else if (kcode == keycode.UP) {//Ctrl + up  调整单元格\r\n                    if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                        return;\r\n                    }\r\n\r\n                    luckysheetMoveHighlightCell2(\"up\", \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == keycode.DOWN) {//Ctrl + down  调整单元格\r\n                    if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                        return;\r\n                    }\r\n\r\n                    luckysheetMoveHighlightCell2(\"down\", \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == keycode.LEFT) {//Ctrl + top  调整单元格\r\n                    if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                        return;\r\n                    }\r\n\r\n                    luckysheetMoveHighlightCell2(\"left\", \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == keycode.RIGHT) {//Ctrl + right  调整单元格\r\n                    if (parseInt($inputbox.css(\"top\")) > 0 || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                        return;\r\n                    }\r\n\r\n                    luckysheetMoveHighlightCell2(\"right\", \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == 186) {//Ctrl + ; 填充系统日期\r\n                    let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                    let row_index = last[\"row_focus\"], \r\n                        col_index = last[\"column_focus\"];\r\n                    luckysheetupdateCell(row_index, col_index, Store.flowdata, true);\r\n\r\n                    let value = getNowDateTime(1);\r\n                    $(\"#luckysheet-rich-text-editor\").html(value);\r\n                    luckysheetRangeLast($(\"#luckysheet-rich-text-editor\")[0]);\r\n                    formula.functionInputHanddler($(\"#luckysheet-functionbox-cell\"), $(\"#luckysheet-rich-text-editor\"), kcode);\r\n                }\r\n                else if (kcode == 222) {//Ctrl + ' 填充系统时间\r\n                    let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                    let row_index = last[\"row_focus\"], \r\n                        col_index = last[\"column_focus\"];\r\n                    luckysheetupdateCell(row_index, col_index, Store.flowdata, true);\r\n\r\n                    let value = getNowDateTime(2);\r\n                    $(\"#luckysheet-rich-text-editor\").html(value);\r\n                    luckysheetRangeLast($(\"#luckysheet-rich-text-editor\")[0]);\r\n                    formula.functionInputHanddler($(\"#luckysheet-functionbox-cell\"), $(\"#luckysheet-rich-text-editor\"), kcode);\r\n                }\r\n                else if (String.fromCharCode(kcode).toLocaleUpperCase() == \"A\") {//Ctrl + A  全选\r\n                    // $(\"#luckysheet-left-top\").trigger(\"mousedown\");\r\n                    // $(document).trigger(\"mouseup\");\r\n                    $(\"#luckysheet-left-top\").click()\r\n                }\r\n\r\n                event.preventDefault();\r\n                return;\r\n            }\r\n            else if (shiftKey && (kcode == keycode.UP || kcode == keycode.DOWN || kcode == keycode.LEFT || kcode == keycode.RIGHT || (altKey && (kcode == 53 || kcode == 101)))) {\r\n                if (parseInt($inputbox.css(\"top\")) > 0 || $(event.target).hasClass(\"formulaInputFocus\")) {\r\n                    return;\r\n                }\r\n\r\n                if (!luckysheet_shiftkeydown) {\r\n                    Store.luckysheet_shiftpositon = $.extend(true, {}, Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]);\r\n                    Store.luckysheet_shiftkeydown = true;\r\n                }\r\n\r\n                //shift + 方向键 调整选区\r\n                if (kcode == keycode.UP) {\r\n                    if($(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")){\r\n                        return;\r\n                    } \r\n\r\n                    luckysheetMoveHighlightRange(\"down\", -1, \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == keycode.DOWN) {\r\n                    if($(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")){\r\n                        return;\r\n                    }\r\n\r\n                    luckysheetMoveHighlightRange(\"down\", 1, \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == keycode.LEFT) {\r\n                    if($(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")){\r\n                        return;\r\n                    }\r\n\r\n                    luckysheetMoveHighlightRange(\"right\", -1, \"rangeOfSelect\");\r\n                }\r\n                else if (kcode == keycode.RIGHT) {\r\n                    if($(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")){\r\n                        return;\r\n                    }\r\n                    \r\n                    luckysheetMoveHighlightRange(\"right\", 1, \"rangeOfSelect\");\r\n                }\r\n                else if (altKey && (kcode == 53 || kcode == 101)) {\r\n                    //Alt + Shift + 5（删除线）\r\n                    $(\"#luckysheet-icon-strikethrough\").click();\r\n                }\r\n                // else if (altKey && (kcode == 54 || kcode == 102)) {\r\n                //     //Alt + Shift + 6（删除线）\r\n                //     $(\"#luckysheet-icon-underline\").click();\r\n                // }\r\n\r\n                event.preventDefault();\r\n            }\r\n            else if (kcode == keycode.ESC) {\r\n                if(menuButton.luckysheetPaintModelOn){\r\n                    menuButton.cancelPaintModel();\r\n                }\r\n                else{\r\n                    cleargridelement(event);\r\n                    event.preventDefault(); \r\n                }\r\n\r\n                selectHightlightShow();\r\n            }\r\n            else if (kcode == keycode.DELETE || kcode == keycode.BACKSPACE) {\r\n                if(imageCtrl.currentImgId != null){\r\n                    imageCtrl.removeImgItem();\r\n                }\r\n                else{\r\n                    $(\"#luckysheet-delete-text\").click();\r\n                }\r\n\r\n                event.preventDefault();\r\n            }\r\n            else if(kcode == 8 && imageCtrl.currentImgId != null){\r\n                imageCtrl.removeImgItem();\r\n                event.preventDefault();\r\n            }\r\n            else if (kcode == keycode.UP) {\r\n                if (parseInt($inputbox.css(\"top\")) > 0 || Store.luckysheet_cell_selected_move || Store.luckysheet_cell_selected_extend || $(event.target).hasClass(\"formulaInputFocus\") || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                    return;\r\n                }\r\n\r\n                luckysheetMoveHighlightCell(\"down\", -1, \"rangeOfSelect\");\r\n                event.preventDefault();\r\n            }\r\n            else if (kcode == keycode.DOWN) {\r\n                if (parseInt($inputbox.css(\"top\")) > 0 || Store.luckysheet_cell_selected_move || Store.luckysheet_cell_selected_extend || $(event.target).hasClass(\"formulaInputFocus\") || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                    return;\r\n                }\r\n\r\n                luckysheetMoveHighlightCell(\"down\", 1, \"rangeOfSelect\");\r\n                event.preventDefault();\r\n            }\r\n            else if (kcode == keycode.LEFT) {\r\n                if (parseInt($inputbox.css(\"top\")) > 0 || Store.luckysheet_cell_selected_move || Store.luckysheet_cell_selected_extend || $(event.target).hasClass(\"formulaInputFocus\") || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                    return;\r\n                }\r\n\r\n                luckysheetMoveHighlightCell(\"right\", -1, \"rangeOfSelect\");\r\n                event.preventDefault();\r\n            }\r\n            else if (kcode == keycode.RIGHT) {\r\n                if (parseInt($inputbox.css(\"top\")) > 0 || Store.luckysheet_cell_selected_move || Store.luckysheet_cell_selected_extend || $(event.target).hasClass(\"formulaInputFocus\") || $(\"#luckysheet-singleRange-dialog\").is(\":visible\") || $(\"#luckysheet-multiRange-dialog\").is(\":visible\")) {\r\n                    return;\r\n                }\r\n\r\n                luckysheetMoveHighlightCell(\"right\", 1, \"rangeOfSelect\");\r\n                event.preventDefault();\r\n            }\r\n            else if (!((kcode >= 112 && kcode <= 123) || kcode <= 46 || kcode == 144 || kcode == 108 || event.ctrlKey || event.altKey || (event.shiftKey && (kcode == 37 || kcode == 38 || kcode == 39 || kcode == 40))) || kcode == 8 || kcode == 32 || kcode == 46 || kcode == 0 || (event.ctrlKey && kcode == 86)) {\r\n                if (String.fromCharCode(kcode) != null && $(\"#luckysheet-cell-selected\").is(\":visible\") && (kcode != keycode.CAPSLOCK && kcode != keycode.WIN && kcode != 18)) {\r\n                    let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n                    let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n\r\n                    luckysheetupdateCell(row_index, col_index, Store.flowdata, true);\r\n                    if(kcode == 8){\r\n                        $(\"#luckysheet-rich-text-editor\").html(\"<br/>\");\r\n                    }\r\n                    formula.functionInputHanddler($(\"#luckysheet-functionbox-cell\"), $(\"#luckysheet-rich-text-editor\"), kcode);\r\n                }\r\n            }\r\n        }\r\n        \r\n        luckysheetactiveCell();\r\n\r\n        event.stopPropagation();\r\n    });\r\n\r\n    //单元格编辑 keydown (公式 上下左右键移动)\r\n    $(\"#\" + Store.container).add(\"#luckysheet-input-box\").keydown(function (event) {\r\n        if ($(\"#luckysheet-modal-dialog-mask\").is(\":visible\") || $(event.target).hasClass(\"luckysheet-mousedown-cancel\") || $(event.target).hasClass(\"formulaInputFocus\")) {\r\n            return;\r\n        }\r\n\r\n        let ctrlKey = event.ctrlKey;\r\n        let altKey = event.altKey;\r\n        let shiftKey = event.shiftKey;\r\n        let kcode = event.keyCode;\r\n\r\n        let $inputbox = $(\"#luckysheet-input-box\");\r\n        if (kcode == keycode.ESC && parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0) {\r\n            formula.dontupdate();\r\n            luckysheetMoveHighlightCell(\"down\", 0, \"rangeOfSelect\");\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.ENTER && parseInt($inputbox.css(\"top\")) > 0) {\r\n            if ($(\"#luckysheet-formula-search-c\").is(\":visible\") && formula.searchFunctionCell != null) {\r\n                formula.searchFunctionEnter($(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\"));\r\n                event.preventDefault();\r\n            }\r\n        }\r\n        else if(kcode == keycode.TAB && parseInt($inputbox.css(\"top\")) > 0){\r\n            if ($(\"#luckysheet-formula-search-c\").is(\":visible\") && formula.searchFunctionCell != null) {\r\n                formula.searchFunctionEnter($(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\"));\r\n            }\r\n            else{\r\n                formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                luckysheetMoveHighlightCell(\"right\", 1, \"rangeOfSelect\");\r\n            }\r\n\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.F4 && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formula.setfreezonFuc(event);\r\n            event.preventDefault();\r\n        }\r\n        else if (kcode == keycode.UP && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formulaMoveEvent(\"up\", ctrlKey, shiftKey,event);\r\n        }\r\n        else if (kcode == keycode.DOWN && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formulaMoveEvent(\"down\", ctrlKey, shiftKey,event);\r\n        }\r\n        else if (kcode == keycode.LEFT && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formulaMoveEvent(\"left\", ctrlKey, shiftKey,event);\r\n        }\r\n        else if (kcode == keycode.RIGHT && parseInt($inputbox.css(\"top\")) > 0) {\r\n            formulaMoveEvent(\"right\", ctrlKey, shiftKey,event);\r\n        }\r\n        else if (!((kcode >= 112 && kcode <= 123) || kcode <= 46 || kcode == 144 || kcode == 108 || event.ctrlKey || event.altKey || (event.shiftKey && (kcode == 37 || kcode == 38 || kcode == 39 || kcode == 40 || kcode == keycode.WIN || kcode == keycode.WIN_R || kcode == keycode.MENU))) || kcode == 8 || kcode == 32 || kcode == 46 || (event.ctrlKey && kcode == 86)) {\r\n            // if(event.target.id!=\"luckysheet-input-box\" && event.target.id!=\"luckysheet-rich-text-editor\"){\r\n                formula.functionInputHanddler($(\"#luckysheet-functionbox-cell\"), $(\"#luckysheet-rich-text-editor\"), kcode);\r\n                setCenterInputPosition(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1], Store.flowdata);\r\n            // }\r\n            \r\n        }\r\n    }).keyup(function (e) {\r\n        let kcode = e.keyCode;\r\n        \r\n        if (!e.shiftKey && kcode == 16) {\r\n            Store.luckysheet_shiftkeydown = false;\r\n            Store.luckysheet_shiftpositon = null;\r\n        }\r\n\r\n        //输入框中文输入后 shift 和 空格 处理\r\n        if(parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0 && (kcode == 13 || kcode == 16 || kcode == 32)){\r\n            // if(event.target.id==\"luckysheet-input-box\" || event.target.id==\"luckysheet-rich-text-editor\"){\r\n            //     formula.functionInputHanddler($(\"#luckysheet-functionbox-cell\"), $(\"#luckysheet-rich-text-editor\"), kcode);\r\n            // }\r\n        }\r\n\r\n        e.preventDefault();\r\n    });\r\n\r\n    //top workBook rename\r\n    $(\"#luckysheet_info_detail_input\").val(server.title).css(\"width\", getByteLen(server.title) * 10).keydown(function(){\r\n        let ctrlKey = event.ctrlKey;\r\n        let altKey = event.altKey;\r\n        let shiftKey = event.shiftKey;\r\n        let kcode = event.keyCode;\r\n        let $t = $(this);\r\n        if(kcode == keycode.ENTER){\r\n            $t.blur().change();\r\n        }\r\n    }).bind('input propertychange', function() { \r\n        let $t = $(this);\r\n        let inputlen = getByteLen($t.val())*10;\r\n        let updatelen = $(\"#luckysheet_info_detail_update\").outerWidth();\r\n        let savelen = $(\"#luckysheet_info_detail_save\").outerWidth();\r\n        let userlen = $(\"#luckysheet_info_detail_user\").parent().outerWidth()+60;\r\n        let containerlen = $(\"#\" + Store.container).outerWidth();\r\n        let otherlen = 100;\r\n\r\n        let minuslen = containerlen- savelen - updatelen - userlen - otherlen;\r\n        if(inputlen > minuslen){\r\n            $(\"#luckysheet_info_detail_input\").css(\"width\", minuslen);\r\n        }\r\n        else{\r\n            $(\"#luckysheet_info_detail_input\").css(\"width\", inputlen);\r\n        }\r\n    }).change(function(){\r\n        server.saveParam(\"na\", null, $(this).val());\r\n    });\r\n\r\n\r\n    // 右击菜单的input输入框 敲击Enter一样生效\r\n    $(\"#\" + Store.container).add(\"input.luckysheet-mousedown-cancel\").keydown(function (event) {\r\n\r\n        const element =  event.target.closest('.luckysheet-cols-menuitem');\r\n        if (typeof(element) != 'undefined' && element != null && event.keyCode === 13){\r\n            $(element).trigger('click');\r\n        }\r\n\r\n    })\r\n}"
  },
  {
    "path": "src/controllers/listener.js",
    "content": "/**\r\n * Monitor special variables\r\n */\r\nimport {createProxy} from '../utils/util';\r\nimport Store from '../store/index';\r\nimport method from '../global/method';\r\nimport { getluckysheetfile } from '../methods/get'\r\nimport { toJson } from '../global/api';\r\n\r\nlet undoTimer,redoTimer;\r\nfunction undoAccessible(len) {\r\n    clearTimeout(undoTimer);\r\n    undoTimer = setTimeout(() => {\r\n        $('#luckysheet-icon-undo')[len ? 'removeClass' : 'addClass']('disabled');\r\n    }, 10);\r\n}\r\nfunction redoAccessible(len) {\r\n    clearTimeout(redoTimer);\r\n    redoTimer = setTimeout(() => {\r\n        $('#luckysheet-icon-redo')[len ? 'removeClass' : 'addClass']('disabled');\r\n    }, 10);\r\n}\r\n\r\nconst initListener = function(){\r\n    // createProxy(Store,['jfredo']);\r\n    createProxy(Store, 'jfredo',(target, property, val, receiver)=>{\r\n        if (property !== 'length') {\r\n            //  钩子函数\r\n            method.createHookFunction('updated',val)\r\n        }\r\n        undoAccessible(Store.jfredo.length);\r\n    } );\r\n    createProxy(Store, 'jfundo',(target, property, val, receiver)=>{\r\n        redoAccessible(Store.jfundo.length);\r\n    } );\r\n    \r\n\r\n\r\n    createProxy(Store, 'asyncLoad', (target, property, val, receiver)=>{\r\n        if(property === 'length' && val === 0){\r\n            method.createHookFunction('workbookCreateAfter', toJson())\r\n        }\r\n    })\r\n}\r\n\r\nexport {\r\n    initListener\r\n}"
  },
  {
    "path": "src/controllers/locationCell.js",
    "content": "import { replaceHtml } from '../utils/util';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { isRealNull } from '../global/validate';\r\nimport { isEditMode } from '../global/validate';\r\nimport tooltip from '../global/tooltip';\r\nimport { modelHTML } from './constant';\r\nimport { selectHightlightShow } from './select';\r\nimport conditionformat from './conditionformat';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n//定位\r\nconst luckysheetLocationCell = {\r\n    createDialog: function(){\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-locationCell-dialog\").remove();\r\n\r\n        const _locale = locale();\r\n        const locale_location = _locale.findAndReplace;\r\n        const locale_button = _locale.button;\r\n\r\n        let content = '<div class=\"listbox\">'+\r\n                        '<div class=\"listItem\">'+\r\n                            '<input type=\"radio\" name=\"locationType\" checked=\"checked\" id=\"locationConstant\">'+\r\n                            '<label for=\"locationConstant\">'+locale_location.locationConstant+'</label>'+\r\n                            '<div class=\"subbox\">'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"date\" id=\"locationConstantDate\">'+\r\n                                    '<label for=\"locationConstantDate\">'+locale_location.locationDate+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"number\" id=\"locationConstantNumber\">'+\r\n                                    '<label for=\"locationConstantNumber\">'+locale_location.locationDigital+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"string\" id=\"locationConstantString\">'+\r\n                                    '<label for=\"locationConstantString\">'+locale_location.locationString+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"boolean\" id=\"locationConstantBoolean\">'+\r\n                                    '<label for=\"locationConstantBoolean\">'+locale_location.locationBool+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"error\" id=\"locationConstantError\">'+\r\n                                    '<label for=\"locationConstantError\">'+locale_location.locationBool+'</label>'+\r\n                                '</div>'+\r\n                            '</div>'+\r\n                        '</div>'+\r\n                        '<div class=\"listItem\">'+\r\n                            '<input type=\"radio\" name=\"locationType\" id=\"locationFormula\">'+\r\n                            '<label for=\"locationFormula\">'+locale_location.locationFormula+'</label>'+\r\n                            '<div class=\"subbox\">'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"date\" id=\"locationFormulaDate\" disabled=\"true\">'+\r\n                                    '<label for=\"locationFormulaDate\" style=\"color: #666\">'+locale_location.locationDate+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"number\" id=\"locationFormulaNumber\" disabled=\"true\">'+\r\n                                    '<label for=\"locationFormulaNumber\" style=\"color: #666\">'+locale_location.locationDigital+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"string\" id=\"locationFormulaString\" disabled=\"true\">'+\r\n                                    '<label for=\"locationFormulaString\" style=\"color: #666\">'+locale_location.locationString+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"boolean\" id=\"locationFormulaBoolean\" disabled=\"true\">'+\r\n                                    '<label for=\"locationFormulaBoolean\" style=\"color: #666\">'+locale_location.locationBool+'</label>'+\r\n                                '</div>'+\r\n                                '<div class=\"subItem\">'+\r\n                                    '<input type=\"checkbox\" checked=\"checked\" class=\"error\" id=\"locationFormulaError\" disabled=\"true\">'+\r\n                                    '<label for=\"locationFormulaError\" style=\"color: #666\">'+locale_location.locationError+'</label>'+\r\n                                '</div>'+\r\n                            '</div>'+\r\n                        '</div>'+\r\n                        '<div class=\"listItem\">'+\r\n                            '<input type=\"radio\" name=\"locationType\" id=\"locationNull\">'+\r\n                            '<label for=\"locationNull\">'+locale_location.locationNull+'</label>'+\r\n                        '</div>'+\r\n                        '<div class=\"listItem\">'+\r\n                            '<input type=\"radio\" name=\"locationType\" id=\"locationCF\">'+\r\n                            '<label for=\"locationCF\">'+locale_location.locationCondition+'</label>'+\r\n                        '</div>'+\r\n                        '<div class=\"listItem\">'+\r\n                            '<input type=\"radio\" name=\"locationType\" id=\"locationStepRow\">'+\r\n                            '<label for=\"locationStepRow\">'+locale_location.locationRowSpan+'</label>'+\r\n                        '</div>'+\r\n                        '<div class=\"listItem\">'+\r\n                            '<input type=\"radio\" name=\"locationType\" id=\"locationStepColumn\">'+\r\n                            '<label for=\"locationStepColumn\">'+locale_location.locationColumnSpan+'</label>'+\r\n                        '</div>'+\r\n                      '</div>';\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-locationCell-dialog\", \r\n            \"addclass\": \"luckysheet-locationCell-dialog\", \r\n            \"title\": locale_location.location, \r\n            \"content\": content, \r\n            \"botton\": '<button id=\"luckysheet-locationCell-dialog-confirm\" class=\"btn btn-primary\">'+locale_button.confirm+'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+locale_button.cancel+'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-locationCell-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 400).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-locationCell-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n    },\r\n    init: function(){\r\n        let _this = this;\r\n\r\n        const locale_location = locale().findAndReplace;\r\n\r\n        $(document).on(\"click\", \"#luckysheet-locationCell-dialog .listItem input:radio\", function(e){\r\n            $(\"#luckysheet-locationCell-dialog .listItem input:checkbox\").prop(\"disabled\", true);\r\n            $(\"#luckysheet-locationCell-dialog .listItem .subbox label\").css(\"color\", \"#666\");\r\n\r\n            $(this).siblings(\".subbox\").find(\"input:checkbox\").removeAttr(\"disabled\");\r\n            $(this).siblings(\".subbox\").find(\"label\").css(\"color\", \"#000\");\r\n        });\r\n\r\n        $(document).off(\"click.locationCellConfirm\").on(\"click.locationCellConfirm\", \"#luckysheet-locationCell-dialog #luckysheet-locationCell-dialog-confirm\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-locationCell-dialog\").hide();\r\n\r\n            let $radio = $(\"#luckysheet-locationCell-dialog .listItem input:radio:checked\");\r\n            let id = $radio.attr(\"id\");\r\n\r\n            if(id == \"locationConstant\" || id == \"locationFormula\"){\r\n                let $checkbox = $radio.siblings(\".subbox\").find(\"input:checkbox:checked\");\r\n\r\n                let value;\r\n                if($checkbox.length == 0){\r\n                    return;\r\n                }\r\n                else if($checkbox.length == 5){\r\n                    value = \"all\";\r\n                }\r\n                else{\r\n                    let arr = [];\r\n                    \r\n                    for(let i = 0; i < $checkbox.length; i++){\r\n                        if($($checkbox[i]).hasClass(\"date\")){\r\n                            arr.push(\"d\");\r\n                        }\r\n                        else if($($checkbox[i]).hasClass(\"number\")){\r\n                            arr.push(\"n\");\r\n                        }\r\n                        else if($($checkbox[i]).hasClass(\"string\")){\r\n                            arr.push(\"s,g\");\r\n                        }\r\n                        else if($($checkbox[i]).hasClass(\"boolean\")){\r\n                            arr.push(\"b\");\r\n                        }\r\n                        else if($($checkbox[i]).hasClass(\"error\")){\r\n                            arr.push(\"e\");\r\n                        }\r\n                    }\r\n\r\n                    value = arr.join(\",\");\r\n                }\r\n\r\n                let range;\r\n                if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){\r\n                    //单个单元格\r\n                    range = [{\"row\": [0, Store.flowdata.length - 1], \"column\": [0, Store.flowdata[0].length - 1]}];\r\n                }\r\n                else{\r\n                    range = $.extend(true, [], Store.luckysheet_select_save);\r\n                }\r\n\r\n                _this.apply(range, id, value);\r\n            }\r\n            else if(id == \"locationStepRow\"){\r\n                if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1])){\r\n                    if(isEditMode()){\r\n                        alert(locale_location.locationTiplessTwoRow);\r\n                    }\r\n                    else{\r\n                        tooltip.info(\"\", locale_location.locationTiplessTwoRow); \r\n                    }\r\n                    return;                            \r\n                }\r\n\r\n                let range = $.extend(true, [], Store.luckysheet_select_save);\r\n\r\n                _this.apply(range, \"locationStepRow\");\r\n            }\r\n            else if(id == \"locationStepColumn\"){\r\n                if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){\r\n                    if(isEditMode()){\r\n                        alert(locale_location.locationTiplessTwoColumn);\r\n                    }\r\n                    else{\r\n                        tooltip.info(\"\", locale_location.locationTiplessTwoColumn);    \r\n                    }\r\n                    return;                            \r\n                }\r\n\r\n                let range = $.extend(true, [], Store.luckysheet_select_save);\r\n\r\n                _this.apply(range, \"locationStepColumn\");\r\n            }\r\n            else{\r\n                let range;\r\n                if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){\r\n                    //单个单元格\r\n                    range = [{\"row\": [0, Store.flowdata.length - 1], \"column\": [0, Store.flowdata[0].length - 1]}];\r\n                }\r\n                else{\r\n                    range = $.extend(true, [], Store.luckysheet_select_save);\r\n                }\r\n\r\n                _this.apply(range, id);\r\n            }\r\n        });\r\n    },\r\n    apply: function(range, type, value){\r\n        const locale_location = locale().findAndReplace; \r\n        let rangeArr = [];\r\n\r\n        if(type == \"locationFormula\" || type == \"locationConstant\" || type == \"locationNull\"){ //公式 常量 空值\r\n            let minR = null, maxR = null, minC = null, maxC = null, cellSave = {};\r\n\r\n            for(let s = 0; s < range.length; s++){\r\n                let st_r = range[s].row[0],\r\n                    ed_r = range[s].row[1],\r\n                    st_c = range[s].column[0],\r\n                    ed_c = range[s].column[1];\r\n\r\n                if(minR == null || minR < st_r){\r\n                    minR = st_r;\r\n                }\r\n                if(maxR == null || maxR > ed_r){\r\n                    maxR = ed_r;\r\n                }\r\n                if(minC == null || minC < st_c){\r\n                    minC = st_c;\r\n                }\r\n                if(maxC == null || maxC > ed_c){\r\n                    maxC = ed_c;\r\n                }\r\n\r\n                for(let r = st_r; r <= ed_r; r++){\r\n                    for(let c = st_c; c <= ed_c; c++){\r\n                        let cell = Store.flowdata[r][c];\r\n\r\n                        if(cell != null && cell.mc != null){\r\n                            cell = Store.flowdata[cell.mc.r][cell.mc.c];\r\n                        }\r\n\r\n                        if(type == 'locationFormula' && cell != null && !isRealNull(cell.v) && cell.f != null && (value == 'all' || (cell.ct != null && value.indexOf(cell.ct.t) > -1))){\r\n                            cellSave[r + '_' + c] = 0;\r\n                        }\r\n                        else if(type == 'locationConstant' && cell != null && !isRealNull(cell.v) && (value == 'all' || (cell.ct != null && value.indexOf(cell.ct.t) > -1))){\r\n                            cellSave[r + '_' + c] = 0;\r\n                        }\r\n                        else if(type == 'locationNull' && (cell == null || isRealNull(cell.v))){\r\n                            cellSave[r + '_' + c] = 0;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            rangeArr = this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr);\r\n        }\r\n        else if(type == \"locationCF\"){ //条件格式\r\n            let index = getSheetIndex(Store.currentSheetIndex);\r\n            let ruleArr = Store.luckysheetfile[index][\"luckysheet_conditionformat_save\"];\r\n            let data = Store.luckysheetfile[index][\"data\"];\r\n\r\n            if(ruleArr == null || ruleArr.length == 0){\r\n                if(isEditMode()){\r\n                    alert(locale_location.locationTipNotFindCell);\r\n                }\r\n                else{\r\n                    tooltip.info(\"\", locale_location.locationTipNotFindCell);\r\n                }\r\n\r\n                return;\r\n            }\r\n\r\n            computeMap = conditionformat.compute(ruleArr, data);\r\n\r\n            if(Object.keys(computeMap).length == 0){\r\n                if(isEditMode()){\r\n                    alert(locale_location.locationTipNotFindCell);\r\n                }\r\n                else{\r\n                    tooltip.info(\"\", locale_location.locationTipNotFindCell);\r\n                }\r\n\r\n                return;\r\n            }\r\n\r\n            let minR = null, maxR = null, minC = null, maxC = null, cellSave = {};\r\n\r\n            for(let s = 0; s < range.length; s++){\r\n                let st_r = range[s].row[0],\r\n                    ed_r = range[s].row[1],\r\n                    st_c = range[s].column[0],\r\n                    ed_c = range[s].column[1];\r\n\r\n                if(minR == null || minR < st_r){\r\n                    minR = st_r;\r\n                }\r\n                if(maxR == null || maxR > ed_r){\r\n                    maxR = ed_r;\r\n                }\r\n                if(minC == null || minC < st_c){\r\n                    minC = st_c;\r\n                }\r\n                if(maxC == null || maxC > ed_c){\r\n                    maxC = ed_c;\r\n                }\r\n\r\n                for(let r = st_r; r <= ed_r; r++){\r\n                    for(let c = st_c; c <= ed_c; c++){\r\n                        if((r + '_' + c) in computeMap){\r\n                            cellSave[r + '_' + c] = 0;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            rangeArr = this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr);\r\n        }\r\n        else if(type == \"locationStepRow\"){ //间隔行\r\n            for(let s = 0; s < range.length; s++){\r\n                if(range[s].row[0] == range[s].row[1]){\r\n                    continue;\r\n                }\r\n\r\n                let st_r = range[s].row[0], ed_r = range[s].row[1];\r\n                let st_c = range[s].column[0], ed_c = range[s].column[1];\r\n\r\n                for(let r = st_r; r <= ed_r; r++){\r\n                    if((r - st_r) % 2 == 0){\r\n                        rangeArr.push({\"row\": [r, r], \"column\": [st_c, ed_c]});\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if(type == \"locationStepColumn\"){ //间隔列\r\n            for(let s = 0; s < range.length; s++){\r\n                if(range[s].column[0] == range[s].column[1]){\r\n                    continue;\r\n                }\r\n\r\n                let st_r = range[s].row[0], ed_r = range[s].row[1];\r\n                let st_c = range[s].column[0], ed_c = range[s].column[1];\r\n\r\n                for(let c = st_c; c <= ed_c; c++){\r\n                    if((c - st_c) % 2 == 0){\r\n                        rangeArr.push({\"row\": [st_r, ed_r], \"column\": [c, c]});\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        if(rangeArr.length == 0){\r\n            if(isEditMode()){\r\n                alert(locale_location.locationTipNotFindCell);\r\n            }\r\n            else{\r\n                tooltip.info(\"\", locale_location.locationTipNotFindCell);  \r\n            }\r\n        }\r\n        else{\r\n            Store.luckysheet_select_save = rangeArr;\r\n            selectHightlightShow(); \r\n\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(), \r\n                scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let winH = $(\"#luckysheet-cell-main\").height(), \r\n                winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n            let r1 = Store.luckysheet_select_save[0][\"row\"][0],\r\n                r2 = Store.luckysheet_select_save[0][\"row\"][1],\r\n                c1 = Store.luckysheet_select_save[0][\"column\"][0],\r\n                c2 = Store.luckysheet_select_save[0][\"column\"][1];\r\n\r\n            let row = Store.visibledatarow[r2], \r\n                row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n            let col = Store.visibledatacolumn[c2], \r\n                col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n            if (col - scrollLeft - winW + 20 > 0) {\r\n                $(\"#luckysheet-scrollbar-x\").scrollLeft(col - winW + 20);\r\n            }\r\n            else if (col_pre - scrollLeft - 20 < 0) {\r\n                $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre - 20);\r\n            }\r\n\r\n            if (row - scrollTop - winH + 20 > 0) {\r\n                $(\"#luckysheet-scrollbar-y\").scrollTop(row - winH + 20);\r\n            }\r\n            else if (row_pre - scrollTop - 20 < 0) {\r\n                $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre - 20);\r\n            }\r\n        }\r\n    },\r\n    getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr){\r\n        if(Object.keys(cellSave).length == 0){\r\n            return rangeArr;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        let stack_str = null, \r\n            stack_edr = null, \r\n            stack_stc = null, \r\n            stack_edc = null;\r\n\r\n        for(let r = minR; r <= maxR; r++){\r\n            for(let c = minC; c <= maxC; c++){\r\n                let cell = Store.flowdata[r][c];\r\n                \r\n                if((r + '_' + c) in cellSave){\r\n                    if(cell != null && cell.mc != null){\r\n                        if(stack_stc == null){\r\n                            let range = {\r\n                                'row': [cell.mc.r, cell.mc.r + cell.mc.rs - 1],\r\n                                'column': [cell.mc.c, cell.mc.c + cell.mc.cs - 1]\r\n                            };\r\n                            rangeArr.push(range);\r\n                            cellSave = _this.deleteCellInSave(cellSave, range);\r\n                            return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr);\r\n                        }\r\n                        else if(c < stack_edc){\r\n                            let range = {\r\n                                'row': [stack_str, stack_edr],\r\n                                'column': [stack_stc, stack_edc]\r\n                            }\r\n                            rangeArr.push(range);\r\n                            cellSave = _this.deleteCellInSave(cellSave, range);\r\n                            return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr);\r\n                        }\r\n                        else{\r\n                            break;\r\n                        }\r\n                    }\r\n                    else if(stack_stc == null){\r\n                        stack_stc = c;\r\n                        stack_edc = c;\r\n\r\n                        stack_str = r;\r\n                        stack_edr = r;\r\n                    }\r\n                    else if(c > stack_edc){\r\n                        stack_edc = c;\r\n                    }\r\n                }\r\n                else if(stack_stc != null){\r\n                    if(cell != null && cell.mc != null){\r\n                        break;\r\n                    }\r\n                    else if(c < stack_stc){\r\n\r\n                    }\r\n                    else if(c <= stack_edc){\r\n                        let range = {\r\n                            'row': [stack_str, stack_edr],\r\n                            'column': [stack_stc, stack_edc]\r\n                        }\r\n                        rangeArr.push(range);\r\n                        cellSave = _this.deleteCellInSave(cellSave, range);\r\n                        return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr);\r\n                    }\r\n                    else{\r\n                        stack_edr = r;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        if(stack_stc != null){\r\n            let range = {\r\n                'row': [stack_str, stack_edr],\r\n                'column': [stack_stc, stack_edc]\r\n            }\r\n            rangeArr.push(range);\r\n            cellSave = _this.deleteCellInSave(cellSave, range);\r\n            return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr);\r\n        }\r\n    },\r\n    deleteCellInSave(cellSave, range){\r\n        for(let r = range.row[0]; r <= range.row[1]; r++){\r\n            for(let c = range.column[0]; c <= range.column[1]; c++){\r\n                delete cellSave[r + '_' + c];\r\n            }\r\n        }\r\n\r\n        return cellSave;\r\n    }\r\n}\r\n\r\nexport default luckysheetLocationCell;"
  },
  {
    "path": "src/controllers/luckysheetConfigsetting.js",
    "content": "const luckysheetConfigsetting = {\r\n    autoFormatw: false,\r\n    accuracy: undefined,\r\n    total: 0,\r\n\r\n    allowCopy: true,\r\n    showtoolbar: true,\r\n    showinfobar: true,\r\n    showsheetbar: true,\r\n    showstatisticBar: true,\r\n    pointEdit: false,\r\n    pointEditUpdate: null,\r\n    pointEditZoom: 1,\r\n\r\n    userInfo: false,\r\n    userMenuItem: [],\r\n    myFolderUrl: null,\r\n    functionButton: null,\r\n\r\n    showConfigWindowResize: true,\r\n    enableAddRow: true,\r\n    addRowCount: 100,\r\n    enableAddBackTop: true,\r\n    enablePage: true,\r\n    pageInfo: null,\r\n\r\n\r\n    editMode: false,\r\n    beforeCreateDom: null,\r\n    workbookCreateBefore: null,\r\n    workbookCreateAfter: null,\r\n    remoteFunction: null,\r\n    fireMousedown: null,\r\n    plugins:[],\r\n    forceCalculation:false,//强制刷新公式，公式较多会有性能问题，慎用\r\n\r\n    defaultColWidth:73,\r\n    defaultRowHeight:19,\r\n\r\n    defaultTextColor: '#000',\r\n    defaultCellColor: '#fff',\r\n}\r\n\r\nexport default luckysheetConfigsetting;\r\n"
  },
  {
    "path": "src/controllers/matrixOperation.js",
    "content": "import selection from './selection';\r\nimport { \r\n    getObjType,\r\n    chatatABC,\r\n    numFormat,\r\n    luckysheetContainerFocus,\r\n} from '../utils/util';\r\nimport { hasPartMC, isEditMode } from '../global/validate';\r\nimport { getdatabyselection, getcellvalue } from '../global/getdata';\r\nimport tooltip from '../global/tooltip';\r\nimport editor from '../global/editor';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\n\r\nexport function initialMatrixOperation(){\r\n    const locale_drag = locale().drag;\r\n\r\n    //右键功能键\r\n    //复制为json格式字符串，首行为标题\r\n    $(\"#luckysheet-copy-json-head\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");   \r\n            }\r\n            return;\r\n        }\r\n\r\n        //复制范围内包含部分合并单元格，提示\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        if (getdata.length == 1) {\r\n            let obj = {};\r\n            for (let i = 0; i < getdata[0].length; i++) {\r\n                obj[getcellvalue(0, i, getdata)] = \"\";\r\n            }\r\n            arr.push(obj);\r\n        }\r\n        else {\r\n            for (let r = 1; r < getdata.length; r++) {\r\n                let obj = {};\r\n                for (let c = 0; c < getdata[0].length; c++) {\r\n                    if(getcellvalue(0, c, getdata) == undefined){\r\n                        obj[\"\"] = getcellvalue(r, c, getdata);\r\n                    }else{\r\n                        obj[getcellvalue(0, c, getdata)] = getcellvalue(r, c, getdata);\r\n                    }\r\n                }\r\n                arr.push(obj);\r\n            }\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //复制为json格式字符串，无标题，采用ABCD作为标题\r\n    $(\"#luckysheet-copy-json-nohead\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //复制范围内包含部分合并单元格，提示\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n        let st = Store.luckysheet_select_save[0][\"column\"][0];\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let obj = {};\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                obj[chatatABC(c + st)] = getcellvalue(r, c, getdata);\r\n            }\r\n            arr.push(obj);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //复制为一维数组\r\n    $(\"#luckysheet-copy-array1\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //复制范围内包含部分合并单元格，提示\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                arr.push(getcellvalue(r, c, getdata));\r\n            }\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //复制为二维数组\r\n    $(\"#luckysheet-copy-array2\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //复制范围内包含部分合并单元格，提示\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let a = [];\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                a.push(getcellvalue(r, c, getdata));\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //复制为多维数组\r\n    $(\"#luckysheet-copy-arraymore-confirm\").click(function (event) {\r\n\r\n        // Click input element, don't comfirm \r\n        if(event.target.nodeName === 'INPUT'){\r\n            return;\r\n        }\r\n\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //复制范围内包含部分合并单元格，提示\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                arr.push(getdata[r][c]);\r\n            }\r\n        }\r\n\r\n        let row = $(\"#luckysheet-copy-arraymore-row\").val(), col = $(\"#luckysheet-copy-arraymore-col\").val();\r\n\r\n        if (row == \"\" && col == \"\") {\r\n            selection.copybyformat(event, JSON.stringify(arr));\r\n            $(\"body .luckysheet-cols-menu\").hide();\r\n            return;\r\n        }\r\n\r\n        if (row == \"\") {\r\n            row = 1;\r\n        }\r\n        else {\r\n            row = parseInt(row);\r\n            if (row == null) {\r\n                row = 1;\r\n            }\r\n        }\r\n\r\n        if (col == \"\") {\r\n            col = 1;\r\n        }\r\n        else {\r\n            col = parseInt(col);\r\n            if (col == null) {\r\n                col = 1;\r\n            }\r\n        }\r\n\r\n        if(row.toString() == \"NaN\" || col.toString() == \"NaN\"){\r\n            if(isEditMode()){\r\n                alert(locale_drag.inputCorrect);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.inputCorrect, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        if(row < 1 || col < 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.notLessOne);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.notLessOne, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let arrlen = arr.length, i = 0, ret = [];\r\n        for (let r = 0; r < row; r++) {\r\n            let a = [];\r\n            for (let c = 0; c < col; c++) {\r\n                a.push(arr[i++]);\r\n                if (i >= arrlen) {\r\n                    selection.copybyformat(event, JSON.stringify(ret));\r\n                    $(\"body .luckysheet-cols-menu\").hide();\r\n                    return;\r\n                }\r\n            }\r\n            ret.push(a);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(ret));\r\n    });\r\n\r\n    //复制为对角线\r\n    $(\"#luckysheet-copy-diagonal\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //复制范围内包含部分合并单元格，提示\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let clen = getdata[0].length;\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            if (r >= clen) {\r\n                break;\r\n            }\r\n            arr.push(getdata[r][r]);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //复制为反对角线\r\n    $(\"#luckysheet-copy-antidiagonal\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //复制范围内包含部分合并单元格，提示\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let clen = getdata[0].length;\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            if (r >= clen) {\r\n                break;\r\n            }\r\n            arr.push(getdata[r][clen - r - 1]);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //复制为对角偏移n列\r\n    $(\"#luckysheet-copy-diagonaloffset\").click(function (event) {\r\n\r\n        // Click input element, don't comfirm \r\n        if(event.target.nodeName === 'INPUT'){\r\n            return;\r\n        }\r\n        \r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //复制范围内包含部分合并单元格，提示\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let clen = getdata[0].length, \r\n            offset = parseInt($(\"#luckysheet-copy-diagonaloffset-value\").val());\r\n\r\n        if(offset.toString() == \"NaN\"){\r\n            if(isEditMode()){\r\n                alert(locale_drag.inputCorrect);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.inputCorrect, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        if(offset < 0){\r\n            if(isEditMode()){\r\n                alert(locale_drag.offsetColumnLessZero);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.offsetColumnLessZero, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        if (offset == null) {\r\n            offset = 1;\r\n        }\r\n\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            if (r + offset >= clen) {\r\n                break;\r\n            }\r\n            arr.push(getdata[r][r + offset]);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //复制为布尔值\r\n    $(\"#luckysheet-copy-boolvalue\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        //复制范围内包含部分合并单元格，提示\r\n        if(Store.config[\"merge\"] != null){\r\n            let has_PartMC = false;\r\n\r\n            for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n                let r1 = Store.luckysheet_select_save[s].row[0], \r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0], \r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                if(has_PartMC){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(has_PartMC){\r\n                if(isEditMode()){\r\n                    alert(locale_drag.noPartMerge);\r\n                }\r\n                else{\r\n                    tooltip.info(locale_drag.noPartMerge, \"\"); \r\n                }\r\n                return;    \r\n            }\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let a = [];\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                let bool = false;\r\n\r\n                let v;\r\n                if(getObjType(getdata[r][c]) == \"object\"){\r\n                    v = getdata[r][c].v;\r\n                }\r\n                else{\r\n                    v = getdata[r][c];\r\n                }\r\n\r\n                if (v == null || v == \"\") {\r\n                    bool = false;\r\n                }\r\n                else {\r\n                    v = parseInt(v);\r\n                    if (v == null || v > 0) {\r\n                        bool = true;\r\n                    }\r\n                    else {\r\n                        bool = false;\r\n                    }\r\n                }\r\n                a.push(bool);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        selection.copybyformat(event, JSON.stringify(arr));\r\n    });\r\n\r\n    //矩阵操作选区 翻转 上下\r\n    $(\"#luckysheet-matrix-turn-up\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        for (let r = getdata.length - 1; r >= 0; r--) {\r\n            let a = [];\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandler(arr);\r\n    });\r\n\r\n    //矩阵操作选区 翻转 左右\r\n    $(\"#luckysheet-matrix-turn-left\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let a = [];\r\n            for (let c = getdata[0].length - 1; c >= 0; c--) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandler(arr);\r\n    });\r\n\r\n    //矩阵操作选区 翻转 顺时针\r\n    $(\"#luckysheet-matrix-turn-cw\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        for (let c = 0; c < getdata[0].length; c++) {\r\n            let a = [];\r\n            for (let r = getdata.length - 1; r >= 0; r--) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandlerD(arr);\r\n    });\r\n\r\n    //矩阵操作选区 翻转 逆时针\r\n    $(\"#luckysheet-matrix-turn-anticw\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n        \r\n        let arr = [];\r\n        for (let c = getdata[0].length - 1; c >= 0; c--) {\r\n            let a = [];\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandlerD(arr);\r\n    });\r\n\r\n    //矩阵操作选区 转置\r\n    $(\"#luckysheet-matrix-turn-trans\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        for (let c = 0; c < getdata[0].length; c++) {\r\n            let a = [];\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandlerD(arr);\r\n    });\r\n\r\n    let jfnqrt = function (x, p) {\r\n        if (x == 0)\r\n            return 0;\r\n        let x0, x1;\r\n        x0 = x;\r\n        x1 = ((p - 1) * x0 / p) + (x / (Math.pow(x0, p - 1) * p));//利用迭代法求解\r\n        while (Math.abs(x1 - x0) > 0.000001) {\r\n            x0 = x1;\r\n            x1 = ((p - 1) * x0 / p) + (x / (Math.pow(x0, p - 1) * p));\r\n        }\r\n        return x1;\r\n    }\r\n\r\n    //矩阵操作选区 矩阵计算\r\n    $(\"#luckysheet-matrix-cal-confirm\").click(function (event) {\r\n\r\n        // Click input element, don't comfirm \r\n        if(event.target.nodeName === 'INPUT' || event.target.nodeName === 'SELECT'){\r\n            return;\r\n        }\r\n\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let caltype = $(\"#luckysheet-matrix-cal-type\").val(), \r\n            calvalue = parseInt($(\"#luckysheet-matrix-cal-value\").val());\r\n\r\n        if(calvalue.toString() == \"NaN\"){\r\n            if(isEditMode()){\r\n                alert(locale_drag.inputCorrect);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.inputCorrect, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        if (calvalue == null) {\r\n            calvalue = 2;\r\n        }\r\n\r\n        let arr = [];\r\n\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let a = [];\r\n\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                    if (parseInt(value) != null && getdata[r][c].ct != undefined && getdata[r][c].ct.t == \"n\") {\r\n                        if (caltype == \"minus\") {\r\n                            value.v = value.v - calvalue;\r\n                        }\r\n                        else if (caltype == \"multiply\") {\r\n                            value.v = value.v * calvalue;\r\n                        }\r\n                        else if (caltype == \"divided\") {\r\n                            value.v = numFormat(value.v / calvalue, 4);\r\n                        }\r\n                        else if (caltype == \"power\") {\r\n                            value.v = Math.pow(value.v, calvalue);\r\n                        }\r\n                        else if (caltype == \"root\") {\r\n                            if (calvalue == 2) {\r\n                                value.v = numFormat(Math.sqrt(value.v), 4);\r\n                            }\r\n                            else if (calvalue == 3 && Math.cbrt) {\r\n                                value.v = numFormat(Math.cbrt(value.v), 4);\r\n                            }\r\n                            else {\r\n                                value.v = numFormat(jfnqrt(value.v, calvalue), 4);\r\n                            }\r\n                        }\r\n                        else if (caltype == \"log\") {\r\n                            value.v = numFormat(Math.log(value.v) * 10000 / Math.log(Math.abs(calvalue)), 4);\r\n                        }\r\n                        else {\r\n                            value.v = value.v + calvalue;\r\n                        }\r\n\r\n                        if(value.v == null){\r\n                            value.m = \"\";\r\n                        }\r\n                        else{\r\n                            value.m = value.v.toString();\r\n                        }\r\n                    }\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandler(arr);\r\n    });\r\n\r\n    //矩阵操作选区 删除两端0值 按行\r\n    $(\"#luckysheet-matrix-delezero-row\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n        \r\n        let arr = [];\r\n        let getdatalen = getdata[0].length;\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let a = [], stdel = true, eddel = true;\r\n            for (let c = 0; c < getdatalen; c++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                    if ((value.v == \"0\" || value.v == 0) && stdel) {\r\n                        continue;\r\n                    }\r\n                    else {\r\n                        stdel = false;\r\n                    }\r\n                }\r\n                a.push(value);\r\n            }\r\n\r\n            let a1 = [];\r\n            if (a.length == getdatalen) {\r\n                a1 = a;\r\n            }\r\n            else {\r\n                for (let c = a.length - 1; c >= 0; c--) {\r\n                    let value = \"\";\r\n                    if (a[c] != null) {\r\n                        value = a[c];\r\n                        if ((value.v == \"0\" || value.v == 0) && eddel) {\r\n                            continue;\r\n                        }\r\n                        else {\r\n                            eddel = false;\r\n                        }\r\n                    }\r\n                    a1.unshift(value);\r\n                }\r\n\r\n                let l = getdatalen - a1.length;\r\n                for (let c1 = 0; c1 < l; c1++) {\r\n                    a1.push(\"\");\r\n                }\r\n            }\r\n            arr.push(a1);\r\n        }\r\n\r\n        editor.controlHandler(arr);\r\n    });\r\n\r\n    //矩阵操作选区 删除两端0值 按列\r\n    $(\"#luckysheet-matrix-delezero-column\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        let getdatalen = getdata.length, collen = getdata[0].length;\r\n        for (let c = 0; c < collen; c++) {\r\n            let a = [], stdel = true, eddel = true;\r\n            for (let r = 0; r < getdatalen; r++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n                    if ((value.v == \"0\" || value.v == 0) && stdel) {\r\n                        continue;\r\n                    }\r\n                    else {\r\n                        stdel = false;\r\n                    }\r\n                }\r\n                a.push(value);\r\n            }\r\n\r\n            let a1 = [];\r\n            if (a.length == getdatalen) {\r\n                a1 = a;\r\n            }\r\n            else {\r\n                for (let r = a.length - 1; r >= 0; r--) {\r\n                    let value = \"\";\r\n                    if (a[r] != null) {\r\n                        value = a[r];\r\n                        if ((value.v == \"0\" || value.v == 0) && eddel) {\r\n                            continue;\r\n                        }\r\n                        else {\r\n                            eddel = false;\r\n                        }\r\n                    }\r\n                    a1.unshift(value);\r\n                }\r\n\r\n                let l = getdatalen - a1.length;\r\n                for (let r1 = 0; r1 < l; r1++) {\r\n                    a1.push(\"\");\r\n                }\r\n            }\r\n            arr.push(a1);\r\n        }\r\n\r\n        let arr1 = [];\r\n        for (let c = 0; c < arr[0].length; c++) {\r\n            let a = [];\r\n            for (let r = 0; r < arr.length; r++) {\r\n                let value = \"\";\r\n                if (arr[r] != null && arr[r][c] != null) {\r\n                    value = arr[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr1.push(a);\r\n        }\r\n\r\n        editor.controlHandler(arr1);\r\n    });\r\n\r\n    //矩阵操作选区 删除重复值 按行\r\n    $(\"#luckysheet-matrix-delerpt-row\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        let getdatalen = getdata[0].length;\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let a = [], repeat = {};\r\n\r\n            for (let c = 0; c < getdatalen; c++) {\r\n                let value = null;\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n\r\n                    if(value.v in repeat){\r\n                        repeat[value.v].push(value);\r\n                    }\r\n                    else{\r\n                        repeat[value.v] = [];\r\n                        repeat[value.v].push(value);\r\n                    }\r\n                }\r\n            }\r\n\r\n            for (let c = 0; c < getdatalen; c++) {\r\n                let value = null;\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n\r\n                    if(repeat[value.v].length == 1){\r\n                        a.push(value);\r\n                    }\r\n                }\r\n            }\r\n\r\n            let l = getdatalen - a.length;\r\n            for (let c1 = 0; c1 < l; c1++) {\r\n                a.push(null);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        editor.controlHandler(arr);\r\n    });\r\n\r\n    //矩阵操作选区 删除重复值 按列\r\n    $(\"#luckysheet-matrix-delerpt-column\").click(function (event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_drag.noMulti);\r\n            }\r\n            else{\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let getdata = getdatabyselection(Store.luckysheet_select_save[0]);\r\n        if (getdata.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let arr = [];\r\n        let getdatalen = getdata.length, collen = getdata[0].length;\r\n        for (let c = 0; c < collen; c++) {\r\n            let a = [], repeat = {};\r\n\r\n            for (let r = 0; r < getdatalen; r++) {\r\n                let value = null;\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n\r\n                    if(value.v in repeat){\r\n                        repeat[value.v].push(value);\r\n                    }\r\n                    else{\r\n                        repeat[value.v] = [];\r\n                        repeat[value.v].push(value);\r\n                    }\r\n                }\r\n            }\r\n\r\n            for (let r = 0; r < getdatalen; r++) {\r\n                let value = null;\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    value = getdata[r][c];\r\n\r\n                    if(repeat[value.v].length == 1){\r\n                        a.push(value);\r\n                    }\r\n                }\r\n            }\r\n\r\n            a1 = a;\r\n            let l = getdatalen - a1.length;\r\n            for (let r1 = 0; r1 < l; r1++) {\r\n                a1.push(null);\r\n            }\r\n            arr.push(a1);\r\n        }\r\n\r\n        let arr1 = [];\r\n        for (let c = 0; c < arr[0].length; c++) {\r\n            let a = [];\r\n            for (let r = 0; r < arr.length; r++) {\r\n                let value = null;\r\n                if (arr[r] != null && arr[r][c] != null) {\r\n                    value = arr[r][c];\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr1.push(a);\r\n        }\r\n\r\n        editor.controlHandler(arr1);\r\n    });\r\n}"
  },
  {
    "path": "src/controllers/menuButton.js",
    "content": "import { selectionCopyShow, selectIsOverlap } from \"./select\";\r\nimport { luckyColor, iconfontObjects } from \"./constant\";\r\nimport luckysheetConfigsetting from \"./luckysheetConfigsetting\";\r\nimport luckysheetMoreFormat from \"./moreFormat\";\r\nimport alternateformat from \"./alternateformat\";\r\nimport conditionformat from \"./conditionformat\";\r\nimport server from \"./server\";\r\nimport { luckysheet_searcharray } from \"./sheetSearch\";\r\nimport luckysheetFreezen from \"./freezen\";\r\nimport luckysheetsizeauto from \"./resize\";\r\nimport { createFilter } from \"./filter\";\r\nimport luckysheetSearchReplace from \"./searchReplace\";\r\nimport luckysheetLocationCell from \"./locationCell\";\r\nimport ifFormulaGenerator from \"./ifFormulaGenerator\";\r\nimport { luckysheetupdateCell } from \"./updateCell\";\r\nimport insertFormula from \"./insertFormula\";\r\nimport sheetmanage from \"./sheetmanage\";\r\nimport luckysheetPostil from \"./postil\";\r\nimport { isRealNum, isRealNull, isEditMode, hasPartMC, checkIsAllowEdit } from \"../global/validate\";\r\nimport tooltip from \"../global/tooltip\";\r\nimport editor from \"../global/editor\";\r\nimport { genarate, update, is_date } from \"../global/format\";\r\nimport { jfrefreshgrid, luckysheetrefreshgrid } from \"../global/refresh\";\r\nimport { sortSelection } from \"../global/sort\";\r\nimport luckysheetformula from \"../global/formula\";\r\nimport { rowLocationByIndex, colLocationByIndex } from \"../global/location\";\r\nimport { isdatatypemulti } from \"../global/datecontroll\";\r\nimport { rowlenByRange, getCellTextSplitArr } from \"../global/getRowlen\";\r\nimport { setcellvalue } from \"../global/setdata\";\r\nimport { getFontStyleByCell, checkstatusByCell } from \"../global/getdata\";\r\nimport { countfunc } from \"../global/count\";\r\nimport { hideMenuByCancel } from \"../global/cursorPos\";\r\nimport { getSheetIndex, getRangetxt, getluckysheetfile } from \"../methods/get\";\r\nimport { setluckysheetfile } from \"../methods/set\";\r\nimport {\r\n    isInlineStringCell,\r\n    isInlineStringCT,\r\n    updateInlineStringFormat,\r\n    convertCssToStyleList,\r\n    inlineStyleAffectAttribute,\r\n    updateInlineStringFormatOutside,\r\n} from \"./inlineString\";\r\nimport {\r\n    replaceHtml,\r\n    getObjType,\r\n    rgbTohex,\r\n    mouseclickposition,\r\n    luckysheetfontformat,\r\n    luckysheetContainerFocus,\r\n} from \"../utils/util\";\r\nimport { openProtectionModal, checkProtectionFormatCells, checkProtectionNotEnable } from \"./protection\";\r\nimport Store from \"../store\";\r\nimport locale from \"../locale/locale\";\r\nimport { checkTheStatusOfTheSelectedCells, frozenFirstRow, frozenFirstColumn } from \"../global/api\";\r\n\r\nconst menuButton = {\r\n    menu:\r\n        '<div class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-menuButton ${subclass} luckysheet-mousedown-cancel\" id=\"luckysheet-icon-${id}-menuButton\">${item}</div>',\r\n    // \"item\": '<div itemvalue=\"${value}\" itemname=\"${name}\" class=\"luckysheet-cols-menuitem ${sub} luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 0px 3px 1px;\"><span style=\"margin-right:3px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span> ${name} <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel\" style=\"user-select: none;\">${example}</span></div></div>',\r\n    item:\r\n        '<div itemvalue=\"${value}\" itemname=\"${name}\" class=\"luckysheet-cols-menuitem ${sub} luckysheet-mousedown-cancel\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\" style=\"padding: 3px 0px 3px 1px;\"><span style=\"margin-right:3px;width:13px;display:inline-block;\" class=\"icon luckysheet-mousedown-cancel\"></span> ${name} <span class=\"luckysheet-submenu-arrow luckysheet-mousedown-cancel ${iconClass}\" style=\"user-select: none;\">${example}</span></div></div>',\r\n    split: '<div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div>',\r\n    color:\r\n        '<div class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel luckysheet-menuButton ${sub}\" id=\"${id}\"><div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel luckysheet-color-reset\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${resetColor}</div></div> <div class=\"luckysheet-mousedown-cancel\"> <div class=\"luckysheet-mousedown-cancel\"> <input type=\"text\" class=\"luckysheet-color-selected\" /> </div> </div> <div class=\"luckysheet-menuseparator luckysheet-mousedown-cancel\" role=\"separator\"></div> ${coloritem}</div>',\r\n    coloritem:\r\n        '<div class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel ${class}\"><div class=\"luckysheet-cols-menuitem-content luckysheet-mousedown-cancel\">${name}</div></div>',\r\n    subcolor:\r\n        '<div id=\"luckysheet-icon-${id}-menuButton\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-menuButton-sub luckysheet-mousedown-cancel\"> <div class=\"luckysheet-mousedown-cancel\"> <div class=\"luckysheet-mousedown-cancel\"> <input type=\"text\" class=\"luckysheet-color-selected\" /> </div> </div></div>',\r\n    rightclickmenu: null,\r\n    submenuhide: {},\r\n    focus: function($obj, value) {\r\n        if ($obj.attr(\"id\") == \"luckysheet-icon-font-family-menuButton\") {\r\n            if (isdatatypemulti(value)[\"num\"]) {\r\n                let _locale = locale();\r\n                const locale_fontarray = _locale.fontarray;\r\n                value = locale_fontarray[parseInt(value)];\r\n                if (value == null) {\r\n                    value = this.defualtFont[itemvalue];\r\n                }\r\n            }\r\n        }\r\n        $obj.find(\".luckysheet-cols-menuitem\")\r\n            .find(\"span.icon\")\r\n            .html(\"\");\r\n        if (value == null) {\r\n            $obj.find(\".luckysheet-cols-menuitem\")\r\n                .eq(0)\r\n                .find(\"span.icon\")\r\n                .html('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n        } else {\r\n            $obj.find(\".luckysheet-cols-menuitem[itemvalue='\" + value + \"']\")\r\n                .find(\"span.icon\")\r\n                .html('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n        }\r\n    },\r\n    createButtonMenu: function(itemdata) {\r\n        let itemset = \"\";\r\n        let _this = this;\r\n\r\n        for (let i = 0; i < itemdata.length; i++) {\r\n            let item = itemdata[i];\r\n\r\n            if (item.value == \"split\") {\r\n                itemset += _this.split;\r\n            } else {\r\n                if (item.example == \"more\") {\r\n                    // itemset += replaceHtml(_this.item, {\"value\": item.value, \"name\": item.text, \"example\": \"►\", \"sub\": \"luckysheet-cols-submenu\"});\r\n                    itemset += replaceHtml(_this.item, {\r\n                        value: item.value,\r\n                        name: item.text,\r\n                        example: \"\",\r\n                        sub: \"luckysheet-cols-submenu\",\r\n                        iconClass: \"iconfont-luckysheet luckysheet-iconfont-youjiantou\",\r\n                    });\r\n                } else {\r\n                    itemset += replaceHtml(_this.item, {\r\n                        value: item.value,\r\n                        name: item.text,\r\n                        example: item.example,\r\n                        sub: \"\",\r\n                        iconClass: \"\",\r\n                    });\r\n                }\r\n            }\r\n        }\r\n\r\n        return itemset;\r\n    },\r\n    cancelPaintModel: function() {\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-sheettable_0\").removeClass(\"luckysheetPaintCursor\");\r\n\r\n        if (Store.luckysheet_copy_save[\"dataSheetIndex\"] == Store.currentSheetIndex) {\r\n            Store.luckysheet_selection_range = [];\r\n            selectionCopyShow();\r\n        } else {\r\n            Store.luckysheetfile[\r\n                getSheetIndex(Store.luckysheet_copy_save[\"dataSheetIndex\"])\r\n            ].luckysheet_selection_range = [];\r\n        }\r\n\r\n        Store.luckysheet_copy_save = {};\r\n\r\n        _this.luckysheetPaintModelOn = false;\r\n        $(\"#luckysheetpopover\").fadeOut(200, function() {\r\n            $(\"#luckysheetpopover\").remove();\r\n        });\r\n    },\r\n    luckysheetPaintModelOn: false,\r\n    luckysheetPaintSingle: false,\r\n    initialMenuButton: function() {\r\n        let _this = this;\r\n\r\n        //格式刷\r\n        $(\"#luckysheet-icon-paintformat\").click(function(e) {\r\n            // *如果禁止前台编辑，则中止下一步操作\r\n            if (!checkIsAllowEdit()) {\r\n                tooltip.info(\"\", locale().pivotTable.errorNotAllowEdit);\r\n                return;\r\n            }\r\n            e.stopPropagation();\r\n            let _locale = locale();\r\n            let locale_paint = _locale.paint;\r\n\r\n            if (Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0) {\r\n                if (isEditMode()) {\r\n                    alert(locale_paint.tipSelectRange);\r\n                } else {\r\n                    tooltip.info(\"\", locale_paint.tipSelectRange);\r\n                }\r\n                return;\r\n            } else if (Store.luckysheet_select_save.length > 1) {\r\n                if (isEditMode()) {\r\n                    alert(locale_paint.tipNotMulti);\r\n                } else {\r\n                    tooltip.info(\"\", locale_paint.tipNotMulti);\r\n                }\r\n                return;\r\n            }\r\n\r\n            // *增加了对选区范围是否为部分合并单元格的校验，如果为部分合并单元格，就阻止格式刷的下一步\r\n            // TODO 这里也可以改为：判断到是合并单元格的一部分后，格式刷执行黏贴格式后删除范围单元格的 mc 值\r\n\r\n            let has_PartMC = false;\r\n\r\n            let r1 = Store.luckysheet_select_save[0].row[0],\r\n                r2 = Store.luckysheet_select_save[0].row[1];\r\n\r\n            let c1 = Store.luckysheet_select_save[0].column[0],\r\n                c2 = Store.luckysheet_select_save[0].column[1];\r\n\r\n            has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n            if (has_PartMC) {\r\n                // *提示后中止下一步\r\n                tooltip.info(_locale.merge.partiallyError, \"\");\r\n                return;\r\n            }\r\n\r\n            tooltip.popover(\r\n                \"<i class='fa fa-paint-brush'></i> \" + locale_paint.start + \"\",\r\n                \"topCenter\",\r\n                true,\r\n                null,\r\n                locale_paint.end,\r\n                function() {\r\n                    _this.cancelPaintModel();\r\n                },\r\n            );\r\n\r\n            $(\"#luckysheet-sheettable_0\").addClass(\"luckysheetPaintCursor\");\r\n\r\n            Store.luckysheet_selection_range = [\r\n                { row: Store.luckysheet_select_save[0].row, column: Store.luckysheet_select_save[0].column },\r\n            ];\r\n\r\n            selectionCopyShow();\r\n\r\n            let RowlChange = false,\r\n                HasMC = false;\r\n\r\n            for (let r = Store.luckysheet_select_save[0].row[0]; r <= Store.luckysheet_select_save[0].row[1]; r++) {\r\n                if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                    continue;\r\n                }\r\n\r\n                if (Store.config[\"rowlen\"] != null && r in Store.config[\"rowlen\"]) {\r\n                    RowlChange = true;\r\n                }\r\n\r\n                for (\r\n                    let c = Store.luckysheet_select_save[0].column[0];\r\n                    c <= Store.luckysheet_select_save[0].column[1];\r\n                    c++\r\n                ) {\r\n                    let cell = Store.flowdata[r][c];\r\n\r\n                    if (getObjType(cell) == \"object\" && \"mc\" in cell && cell.mc.rs != null) {\r\n                        HasMC = true;\r\n                    }\r\n                }\r\n            }\r\n            Store.luckysheet_copy_save = {\r\n                dataSheetIndex: Store.currentSheetIndex,\r\n                copyRange: [\r\n                    { row: Store.luckysheet_select_save[0].row, column: Store.luckysheet_select_save[0].column },\r\n                ],\r\n                RowlChange: RowlChange,\r\n                HasMC: HasMC,\r\n            };\r\n\r\n            _this.luckysheetPaintModelOn = true;\r\n            _this.luckysheetPaintSingle = true;\r\n        });\r\n        $(\"#luckysheet-icon-paintformat\").dblclick(function() {\r\n            // *如果禁止前台编辑，则中止下一步操作\r\n            if (!checkIsAllowEdit()) {\r\n                tooltip.info(\"\", locale().pivotTable.errorNotAllowEdit);\r\n                return;\r\n            }\r\n            let _locale = locale();\r\n            let locale_paint = _locale.paint;\r\n            if (Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0) {\r\n                if (isEditMode()) {\r\n                    alert(locale_paint.tipSelectRange);\r\n                } else {\r\n                    tooltip.info(\"\", locale_paint.tipSelectRange);\r\n                }\r\n                return;\r\n            } else if (Store.luckysheet_select_save.length > 1) {\r\n                if (isEditMode()) {\r\n                    alert(locale_paint.tipNotMulti);\r\n                } else {\r\n                    tooltip.info(\"\", locale_paint.tipNotMulti);\r\n                }\r\n                return;\r\n            }\r\n\r\n            tooltip.popover(\r\n                \"<i class='fa fa-paint-brush'></i> \" + locale_paint.start,\r\n                \"topCenter\",\r\n                true,\r\n                null,\r\n                locale_paint.end,\r\n                function() {\r\n                    _this.cancelPaintModel();\r\n                },\r\n            );\r\n            $(\"#luckysheet-sheettable_0\").addClass(\"luckysheetPaintCursor\");\r\n\r\n            Store.luckysheet_selection_range = [\r\n                { row: Store.luckysheet_select_save[0].row, column: Store.luckysheet_select_save[0].column },\r\n            ];\r\n            selectionCopyShow();\r\n\r\n            let RowlChange = false,\r\n                HasMC = false;\r\n            for (let r = Store.luckysheet_select_save[0].row[0]; r <= Store.luckysheet_select_save[0].row[1]; r++) {\r\n                if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                    continue;\r\n                }\r\n\r\n                if (Store.config[\"rowlen\"] != null && r in Store.config[\"rowlen\"]) {\r\n                    RowlChange = true;\r\n                }\r\n\r\n                for (\r\n                    let c = Store.luckysheet_select_save[0].column[0];\r\n                    c <= Store.luckysheet_select_save[0].column[1];\r\n                    c++\r\n                ) {\r\n                    let cell = Store.flowdata[r][c];\r\n\r\n                    if (getObjType(cell) == \"object\" && \"mc\" in cell && cell.mc.rs != null) {\r\n                        HasMC = true;\r\n                    }\r\n                }\r\n            }\r\n            Store.luckysheet_copy_save = {\r\n                dataSheetIndex: Store.currentSheetIndex,\r\n                copyRange: [\r\n                    { row: Store.luckysheet_select_save[0].row, column: Store.luckysheet_select_save[0].column },\r\n                ],\r\n                RowlChange: RowlChange,\r\n                HasMC: HasMC,\r\n            };\r\n\r\n            _this.luckysheetPaintModelOn = true;\r\n            _this.luckysheetPaintSingle = false;\r\n        });\r\n\r\n        //货币格式\r\n        $(\"#luckysheet-icon-currency\").click(function() {\r\n            let d = editor.deepCopyFlowData(Store.flowdata); //取数据\r\n\r\n            _this.updateFormat(d, \"ct\", \"¥ #.00\");\r\n        });\r\n\r\n        //百分比\r\n        $(\"#luckysheet-icon-percent\").click(function() {\r\n            let d = editor.deepCopyFlowData(Store.flowdata); //取数据\r\n\r\n            _this.updateFormat(d, \"ct\", \"0.00%\");\r\n        });\r\n\r\n        //减少小数位数\r\n        $(\"#luckysheet-icon-fmt-decimal-decrease\").click(function() {\r\n            let d = editor.deepCopyFlowData(Store.flowdata); //取数据\r\n            let row_index = Store.luckysheet_select_save[0][\"row_focus\"],\r\n                col_index = Store.luckysheet_select_save[0][\"column_focus\"];\r\n            let foucsStatus = _this.checkstatus(d, row_index, col_index, \"ct\");\r\n            let cell = d[row_index][col_index];\r\n\r\n            if (foucsStatus == null || foucsStatus.t != \"n\") {\r\n                return;\r\n            }\r\n\r\n            if (foucsStatus.fa == \"General\") {\r\n                let mask = genarate(cell.v);\r\n                foucsStatus = mask[1];\r\n            }\r\n\r\n            //万亿格式\r\n            let reg = /^(w|W)((0?)|(0\\.0+))$/;\r\n            if (reg.test(foucsStatus.fa)) {\r\n                if (foucsStatus.fa.indexOf(\".\") > -1) {\r\n                    if (foucsStatus.fa.substr(-2) == \".0\") {\r\n                        _this.updateFormat(d, \"ct\", foucsStatus.fa.split(\".\")[0]);\r\n                    } else {\r\n                        _this.updateFormat(d, \"ct\", foucsStatus.fa.substr(0, foucsStatus.fa.length - 1));\r\n                    }\r\n                } else {\r\n                    _this.updateFormat(d, \"ct\", foucsStatus.fa);\r\n                }\r\n\r\n                return;\r\n            }\r\n            //Uncaught ReferenceError: Cannot access 'fa' before initialization\r\n            let prefix = \"\",\r\n                main = \"\",\r\n                fa = [];\r\n            if (foucsStatus.fa.indexOf(\".\") > -1) {\r\n                fa = foucsStatus.fa.split(\".\");\r\n                prefix = fa[0];\r\n                main = fa[1];\r\n            } else {\r\n                return;\r\n            }\r\n\r\n            fa = main.split(\"\");\r\n            let tail = \"\";\r\n            for (let i = fa.length - 1; i >= 0; i--) {\r\n                let c = fa[i];\r\n                if (c != \"#\" && c != \"0\" && c != \",\" && isNaN(parseInt(c))) {\r\n                    tail = c + tail;\r\n                } else {\r\n                    break;\r\n                }\r\n            }\r\n\r\n            let fmt = \"\";\r\n            if (foucsStatus.fa.indexOf(\".\") > -1) {\r\n                let suffix = main;\r\n                if (tail.length > 0) {\r\n                    suffix = main.replace(tail, \"\");\r\n                }\r\n\r\n                let pos = suffix.replace(/#/g, \"0\");\r\n                pos = pos.substr(0, pos.length - 1);\r\n                if (pos == \"\") {\r\n                    fmt = prefix + tail;\r\n                } else {\r\n                    fmt = prefix + \".\" + pos + tail;\r\n                }\r\n            }\r\n\r\n            _this.updateFormat(d, \"ct\", fmt);\r\n        });\r\n\r\n        //增加小数位数\r\n        $(\"#luckysheet-icon-fmt-decimal-increase\").click(function() {\r\n            let d = editor.deepCopyFlowData(Store.flowdata); //取数据\r\n            let row_index = Store.luckysheet_select_save[0][\"row_focus\"],\r\n                col_index = Store.luckysheet_select_save[0][\"column_focus\"];\r\n            let foucsStatus = _this.checkstatus(d, row_index, col_index, \"ct\");\r\n            let cell = d[row_index][col_index];\r\n\r\n            if (foucsStatus == null || foucsStatus.t != \"n\") {\r\n                return;\r\n            }\r\n\r\n            if (foucsStatus.fa == \"General\") {\r\n                let mask = genarate(cell.v);\r\n                foucsStatus = mask[1];\r\n            }\r\n\r\n            if (foucsStatus.fa == \"General\") {\r\n                _this.updateFormat(d, \"ct\", \"#.0\");\r\n                return;\r\n            }\r\n\r\n            //万亿格式\r\n            let reg = /^(w|W)((0?)|(0\\.0+))$/;\r\n            if (reg.test(foucsStatus.fa)) {\r\n                if (foucsStatus.fa.indexOf(\".\") > -1) {\r\n                    _this.updateFormat(d, \"ct\", foucsStatus.fa + \"0\");\r\n                } else {\r\n                    if (foucsStatus.fa.substr(-1) == \"0\") {\r\n                        _this.updateFormat(d, \"ct\", foucsStatus.fa + \".0\");\r\n                    } else {\r\n                        _this.updateFormat(d, \"ct\", foucsStatus.fa + \"0.0\");\r\n                    }\r\n                }\r\n\r\n                return;\r\n            }\r\n\r\n            //Uncaught ReferenceError: Cannot access 'fa' before initialization\r\n            let prefix = \"\",\r\n                main = \"\",\r\n                fa = [];\r\n\r\n            if (foucsStatus.fa.indexOf(\".\") > -1) {\r\n                fa = foucsStatus.fa.split(\".\");\r\n                prefix = fa[0];\r\n                main = fa[1];\r\n            } else {\r\n                main = foucsStatus.fa;\r\n            }\r\n\r\n            fa = main.split(\"\");\r\n            let tail = \"\";\r\n            for (let i = fa.length - 1; i >= 0; i--) {\r\n                let c = fa[i];\r\n                if (c != \"#\" && c != \"0\" && c != \",\" && isNaN(parseInt(c))) {\r\n                    tail = c + tail;\r\n                } else {\r\n                    break;\r\n                }\r\n            }\r\n\r\n            let fmt = \"\";\r\n            if (foucsStatus.fa.indexOf(\".\") > -1) {\r\n                let suffix = main;\r\n                if (tail.length > 0) {\r\n                    suffix = main.replace(tail, \"\");\r\n                }\r\n\r\n                let pos = suffix.replace(/#/g, \"0\");\r\n                pos += \"0\";\r\n                fmt = prefix + \".\" + pos + tail;\r\n            } else {\r\n                if (tail.length > 0) {\r\n                    fmt = main.replace(tail, \"\") + \".0\" + tail;\r\n                } else {\r\n                    fmt = main + \".0\" + tail;\r\n                }\r\n            }\r\n\r\n            _this.updateFormat(d, \"ct\", fmt);\r\n        });\r\n\r\n        //更多格式\r\n        $(\"#luckysheet-icon-fmt-other\").click(function() {\r\n            const _locale = locale();\r\n            const locale_format = _locale.format;\r\n            const locale_defaultFmt = _locale.defaultFmt;\r\n\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            if ($menuButton.length == 0) {\r\n                let itemdata = locale_defaultFmt;\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                // luckysheet-menuButton-sub\r\n                let menu = replaceHtml(_this.menu, { id: \"fmt-other\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                let subitemdata = [\r\n                    { text: locale_format.moreCurrency + \"...\", value: \"morecurrency\", example: \"\" },\r\n                    { text: locale_format.moreDateTime + \"...\", value: \"moredatetime\", example: \"\" },\r\n                    { text: locale_format.moreNumber + \"...\", value: \"moredigit\", example: \"\" },\r\n                ];\r\n                let subitemset = _this.createButtonMenu(subitemdata);\r\n                let submenu = replaceHtml(_this.menu, {\r\n                    id: \"fmtOtherSelf\",\r\n                    item: subitemset,\r\n                    subclass: \"luckysheet-menuButton-sub\",\r\n                });\r\n\r\n                //luckysheet-icon-fmt-other-menuButton_sub\r\n                $(\"body\").append(menu + submenu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(250);\r\n                _this.focus($menuButton);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\"),\r\n                        itemname = $t.attr(\"itemname\");\r\n                    $(\"#luckysheet-icon-fmt-other\")\r\n                        .find(\".luckysheet-toolbar-menu-button-caption\")\r\n                        .html(\" \" + itemname + \" \");\r\n\r\n                    if (itemvalue == \"fmtOtherSelf\") {\r\n                        return;\r\n                    }\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata); //取数据\r\n                    _this.focus($menuButton, itemvalue);\r\n\r\n                    _this.updateFormat(d, \"ct\", itemvalue);\r\n                });\r\n\r\n                //更多格式\r\n                $(\"#luckysheet-icon-fmtOtherSelf-menuButton\")\r\n                    .find(\".luckysheet-cols-menuitem\")\r\n                    .click(function() {\r\n                        $menuButton.hide();\r\n                        $(\"#luckysheet-icon-fmtOtherSelf-menuButton\").hide();\r\n                        luckysheetContainerFocus();\r\n\r\n                        let itemvalue = $(this).attr(\"itemvalue\");\r\n\r\n                        luckysheetMoreFormat.createDialog(itemvalue);\r\n                        luckysheetMoreFormat.init();\r\n                    });\r\n            } else {\r\n                const text = $(this)\r\n                    .find(\".luckysheet-toolbar-menu-button-caption\")\r\n                    .text()\r\n                    .trim();\r\n                const format = locale_defaultFmt.find((f) => f.text === text);\r\n                if (format) {\r\n                    _this.focus($menuButton, format.value);\r\n                }\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //字体设置\r\n        $(\"#luckysheet-icon-font-family\")\r\n            .mousedown(function(e) {\r\n                hideMenuByCancel(e);\r\n                e.stopPropagation();\r\n            })\r\n            .click(function() {\r\n                let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n                let $menuButton = $(\"#\" + menuButtonId);\r\n                if ($menuButton.length == 0) {\r\n                    // const locale_fontarray = locale().fontarray;\r\n                    // let itemdata = [];\r\n\r\n                    // for(let a=0;a<locale_fontarray.length;a++){\r\n                    //     let fItem = locale_fontarray[a];\r\n                    //     let ret = {};\r\n                    //     ret.value = a;\r\n                    //     ret.text = \"<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:\"+fItem+\"'>\"+fItem+\"</span>\";\r\n                    //     ret.example = \"\";\r\n                    //     itemdata.push(ret);\r\n                    // }\r\n\r\n                    let itemset = _this.createButtonMenu(_this.fontSelectList);\r\n\r\n                    let menu = replaceHtml(_this.menu, { id: \"font-family\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                    $(\"body\").append(menu);\r\n                    $menuButton = $(\"#\" + menuButtonId).width(200);\r\n                    _this.focus($menuButton);\r\n\r\n                    $menuButton.on(\"click\", \".luckysheet-cols-menuitem\", function() {\r\n                        $menuButton.hide();\r\n                        luckysheetContainerFocus();\r\n\r\n                        let $t = $(this),\r\n                            itemvalue = $t.attr(\"itemvalue\"),\r\n                            itemname = $t.attr(\"itemname\");\r\n                        _this.focus($menuButton, itemvalue);\r\n                        $(\"#luckysheet-icon-font-family\")\r\n                            .find(\".luckysheet-toolbar-menu-button-caption\")\r\n                            .html(\" \" + itemname + \" \");\r\n\r\n                        let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n                        _this.updateFormat(d, \"ff\", itemvalue);\r\n                    });\r\n                }\r\n\r\n                let userlen = $(this).outerWidth();\r\n                let tlen = $menuButton.outerWidth();\r\n\r\n                let menuleft = $(this).offset().left;\r\n                if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                    menuleft = menuleft - tlen + userlen;\r\n                }\r\n                mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n            });\r\n\r\n        //字体颜色\r\n        $(\"#luckysheet-icon-text-color\")\r\n            .mousedown(function(e) {\r\n                hideMenuByCancel(e);\r\n                e.stopPropagation();\r\n            })\r\n            .click(function() {\r\n                let d = editor.deepCopyFlowData(Store.flowdata);\r\n                let color = $(this).attr(\"color\");\r\n                if (color == null) {\r\n                    color = \"#000000\";\r\n                }\r\n                _this.updateFormat(d, \"fc\", color);\r\n            });\r\n\r\n        $(\"#luckysheet-icon-text-color-menu\")\r\n            .mousedown(function(e) {\r\n                hideMenuByCancel(e);\r\n                e.stopPropagation();\r\n            })\r\n            .click(function() {\r\n                let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n                let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n                if ($menuButton.length == 0) {\r\n                    const _locale = locale();\r\n                    const locale_toolbar = _locale.toolbar;\r\n                    const locale_button = _locale.button;\r\n                    const locale_alternatingColors = _locale.alternatingColors;\r\n                    let itemdata = [\r\n                        {\r\n                            name: locale_toolbar.alternatingColors + \"...\",\r\n                            id: \"luckysheet-color-alternate\",\r\n                            example: \"\",\r\n                        },\r\n                    ];\r\n\r\n                    let itemset = _this.createButtonMenu(itemdata);\r\n                    let subid = \"text-color-self\";\r\n                    let coloritem = replaceHtml(_this.coloritem, {\r\n                        class: \"luckysheet-icon-alternateformat\",\r\n                        name: locale_toolbar.alternatingColors + \"...\",\r\n                    });\r\n                    let menu = replaceHtml(_this.color, {\r\n                        id: menuButtonId,\r\n                        coloritem: coloritem,\r\n                        colorself: subid,\r\n                        sub: \"\",\r\n                        resetColor: locale_toolbar.resetColor,\r\n                    });\r\n\r\n                    $(\"body\").append(menu);\r\n                    $menuButton = $(\"#\" + menuButtonId);\r\n\r\n                    $(\"#\" + menuButtonId)\r\n                        .find(\".luckysheet-color-selected\")\r\n                        .spectrum({\r\n                            showPalette: true,\r\n                            showPaletteOnly: true,\r\n                            preferredFormat: \"hex\",\r\n                            clickoutFiresChange: false,\r\n                            showInitial: true,\r\n                            showInput: true,\r\n                            flat: true,\r\n                            hideAfterPaletteSelect: true,\r\n                            showSelectionPalette: true,\r\n                            maxPaletteSize: 8,\r\n                            maxSelectionSize: 8,\r\n                            cancelText: locale_button.cancel,\r\n                            chooseText: locale_button.confirm,\r\n                            togglePaletteMoreText: locale_toolbar.customColor,\r\n                            togglePaletteLessText: locale_toolbar.collapse,\r\n                            togglePaletteOnly: true,\r\n                            clearText: locale_toolbar.clearText,\r\n                            color: luckysheetConfigsetting.defaultTextColor,\r\n                            noColorSelectedText: locale_toolbar.noColorSelectedText,\r\n                            localStorageKey: \"spectrum.textcolor\" + server.gridKey,\r\n                            palette: [\r\n                                [\"#000\", \"#444\", \"#666\", \"#999\", \"#ccc\", \"#eee\", \"#f3f3f3\", \"#fff\"],\r\n                                [\"#f00\", \"#f90\", \"#ff0\", \"#0f0\", \"#0ff\", \"#00f\", \"#90f\", \"#f0f\"],\r\n                                [\r\n                                    \"#f4cccc\",\r\n                                    \"#fce5cd\",\r\n                                    \"#fff2cc\",\r\n                                    \"#d9ead3\",\r\n                                    \"#d0e0e3\",\r\n                                    \"#cfe2f3\",\r\n                                    \"#d9d2e9\",\r\n                                    \"#ead1dc\",\r\n                                ],\r\n                                [\r\n                                    \"#ea9999\",\r\n                                    \"#f9cb9c\",\r\n                                    \"#ffe599\",\r\n                                    \"#b6d7a8\",\r\n                                    \"#a2c4c9\",\r\n                                    \"#9fc5e8\",\r\n                                    \"#b4a7d6\",\r\n                                    \"#d5a6bd\",\r\n                                ],\r\n                                [\r\n                                    \"#e06666\",\r\n                                    \"#f6b26b\",\r\n                                    \"#ffd966\",\r\n                                    \"#93c47d\",\r\n                                    \"#76a5af\",\r\n                                    \"#6fa8dc\",\r\n                                    \"#8e7cc3\",\r\n                                    \"#c27ba0\",\r\n                                ],\r\n                                [\"#c00\", \"#e69138\", \"#f1c232\", \"#6aa84f\", \"#45818e\", \"#3d85c6\", \"#674ea7\", \"#a64d79\"],\r\n                                [\"#900\", \"#b45f06\", \"#bf9000\", \"#38761d\", \"#134f5c\", \"#0b5394\", \"#351c75\", \"#741b47\"],\r\n                                [\"#600\", \"#783f04\", \"#7f6000\", \"#274e13\", \"#0c343d\", \"#073763\", \"#20124d\", \"#4c1130\"],\r\n                            ],\r\n                            change: function(color) {\r\n                                let $input = $(this);\r\n                                if (color != null) {\r\n                                    color = color.toHexString();\r\n                                } else {\r\n                                    color = \"#000\";\r\n                                }\r\n\r\n                                let oldcolor = null;\r\n                                // $(\"#luckysheet-icon-text-color .luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", color);\r\n                                // 下边框换成了一个DIV\r\n                                $(\"#luckysheet-icon-text-color .text-color-bar\").css(\"background-color\", color);\r\n                                $(\"#luckysheet-icon-text-color\").attr(\"color\", color);\r\n\r\n                                let d = editor.deepCopyFlowData(Store.flowdata);\r\n                                _this.updateFormat(d, \"fc\", color);\r\n\r\n                                $menuButton.hide();\r\n                                luckysheetContainerFocus();\r\n                            },\r\n                        });\r\n\r\n                    $menuButton.find(\".luckysheet-color-reset\").click(function() {\r\n                        $menuButton.hide();\r\n                        luckysheetContainerFocus();\r\n\r\n                        let $input = $(\"#\" + menuButtonId).find(\".luckysheet-color-selected\");\r\n                        $input.val(\"#000000\");\r\n                        $(\"#luckysheet-icon-text-color\").attr(\"color\", null);\r\n                        $input.spectrum(\"set\", \"#000000\");\r\n                        $(\"#luckysheet-icon-text-color .luckysheet-color-menu-button-indicator\").css(\r\n                            \"border-bottom-color\",\r\n                            \"#000000\",\r\n                        );\r\n\r\n                        let d = editor.deepCopyFlowData(Store.flowdata);\r\n                        _this.updateFormat(d, \"fc\", null);\r\n                    });\r\n\r\n                    //交替颜色\r\n                    $menuButton.find(\".luckysheet-icon-alternateformat\").click(function() {\r\n                        $menuButton.hide();\r\n                        luckysheetContainerFocus();\r\n\r\n                        if (Store.luckysheet_select_save.length > 1) {\r\n                            if (isEditMode()) {\r\n                                alert(locale_alternatingColors.errorInfo);\r\n                            } else {\r\n                                tooltip.info(locale_alternatingColors.errorInfo, \"\");\r\n                            }\r\n                            return;\r\n                        }\r\n\r\n                        let range = $.extend(true, {}, Store.luckysheet_select_save[0]);\r\n\r\n                        let isExists = alternateformat.rangeIsExists(range)[0];\r\n                        if (!isExists) {\r\n                            alternateformat.modelfocusIndex = 0;\r\n                            alternateformat.new(range);\r\n                        }\r\n\r\n                        alternateformat.init();\r\n                        alternateformat.perfect();\r\n                    });\r\n                }\r\n\r\n                let userlen = $(this).outerWidth();\r\n                let tlen = $menuButton.outerWidth();\r\n\r\n                let menuleft = $(this).offset().left;\r\n                if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                    menuleft = menuleft - tlen + userlen;\r\n                }\r\n\r\n                let offsetTop = $(this).offset().top + 26;\r\n                setTimeout(function() {\r\n                    let $input = $(\"#\" + menuButtonId).find(\".luckysheet-color-selected\");\r\n                    $input.spectrum(\"set\", $input.val());\r\n                    mouseclickposition($menuButton, menuleft - 28, offsetTop, \"lefttop\");\r\n                }, 1);\r\n            });\r\n\r\n        //背景颜色\r\n        $(\"#luckysheet-icon-cell-color\").click(function() {\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let color = $(this).attr(\"color\");\r\n            if (color == null) {\r\n                color = \"#ffffff\";\r\n            }\r\n            _this.updateFormat(d, \"bg\", color);\r\n        });\r\n\r\n        $(\"#luckysheet-icon-cell-color-menu\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            if ($menuButton.length == 0) {\r\n                let subid = \"cell-color-self\";\r\n\r\n                const _locale = locale();\r\n                const locale_toolbar = _locale.toolbar;\r\n                const locale_button = _locale.button;\r\n                const locale_alternatingColors = _locale.alternatingColors;\r\n\r\n                let coloritem = replaceHtml(_this.coloritem, {\r\n                    class: \"luckysheet-icon-alternateformat\",\r\n                    name: locale_toolbar.alternatingColors + \"...\",\r\n                });\r\n                let menu = replaceHtml(_this.color, {\r\n                    id: menuButtonId,\r\n                    coloritem: coloritem,\r\n                    colorself: subid,\r\n                    sub: \"\",\r\n                    resetColor: locale_toolbar.resetColor,\r\n                });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId);\r\n\r\n                $(\"#\" + menuButtonId)\r\n                    .find(\".luckysheet-color-selected\")\r\n                    .spectrum({\r\n                        showPalette: true,\r\n                        showPaletteOnly: true,\r\n                        preferredFormat: \"hex\",\r\n                        clickoutFiresChange: false,\r\n                        showInitial: true,\r\n                        showInput: true,\r\n                        flat: true,\r\n                        hideAfterPaletteSelect: true,\r\n                        showSelectionPalette: true,\r\n                        maxPaletteSize: 8,\r\n                        maxSelectionSize: 8,\r\n                        color: luckysheetConfigsetting.defaultCellColor,\r\n                        cancelText: locale_button.cancel,\r\n                        chooseText: locale_button.confirm,\r\n                        togglePaletteMoreText: locale_toolbar.customColor,\r\n                        togglePaletteLessText: locale_toolbar.collapse,\r\n                        togglePaletteOnly: true,\r\n                        clearText: locale_toolbar.clearText,\r\n                        noColorSelectedText: locale_toolbar.noColorSelectedText,\r\n                        localStorageKey: \"spectrum.bgcolor\" + server.gridKey,\r\n                        palette: [\r\n                            [\"#000\", \"#444\", \"#666\", \"#999\", \"#ccc\", \"#eee\", \"#f3f3f3\", \"#fff\"],\r\n                            [\"#f00\", \"#f90\", \"#ff0\", \"#0f0\", \"#0ff\", \"#00f\", \"#90f\", \"#f0f\"],\r\n                            [\"#f4cccc\", \"#fce5cd\", \"#fff2cc\", \"#d9ead3\", \"#d0e0e3\", \"#cfe2f3\", \"#d9d2e9\", \"#ead1dc\"],\r\n                            [\"#ea9999\", \"#f9cb9c\", \"#ffe599\", \"#b6d7a8\", \"#a2c4c9\", \"#9fc5e8\", \"#b4a7d6\", \"#d5a6bd\"],\r\n                            [\"#e06666\", \"#f6b26b\", \"#ffd966\", \"#93c47d\", \"#76a5af\", \"#6fa8dc\", \"#8e7cc3\", \"#c27ba0\"],\r\n                            [\"#c00\", \"#e69138\", \"#f1c232\", \"#6aa84f\", \"#45818e\", \"#3d85c6\", \"#674ea7\", \"#a64d79\"],\r\n                            [\"#900\", \"#b45f06\", \"#bf9000\", \"#38761d\", \"#134f5c\", \"#0b5394\", \"#351c75\", \"#741b47\"],\r\n                            [\"#600\", \"#783f04\", \"#7f6000\", \"#274e13\", \"#0c343d\", \"#073763\", \"#20124d\", \"#4c1130\"],\r\n                        ],\r\n                        change: function(color) {\r\n                            let $input = $(this);\r\n                            if (color != null) {\r\n                                color = color.toHexString();\r\n                            } else {\r\n                                color = \"#fff\";\r\n                            }\r\n\r\n                            let oldcolor = null;\r\n                            // $(\"#luckysheet-icon-cell-color .luckysheet-color-menu-button-indicator\").css(\"border-bottom-color\", color);\r\n                            // 下边框换成了一个DIV\r\n                            $(\"#luckysheet-icon-cell-color .text-color-bar\").css(\"background-color\", color);\r\n\r\n                            $(\"#luckysheet-icon-cell-color\").attr(\"color\", color);\r\n                            let d = editor.deepCopyFlowData(Store.flowdata);\r\n                            _this.updateFormat(d, \"bg\", color);\r\n\r\n                            $menuButton.hide();\r\n                            luckysheetContainerFocus();\r\n                        },\r\n                    });\r\n\r\n                $menuButton.find(\".luckysheet-color-reset\").click(function() {\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $input = $(\"#\" + menuButtonId).find(\".luckysheet-color-selected\");\r\n                    $input.val(\"#ffffff\");\r\n                    $(\"#luckysheet-icon-cell-color\").attr(\"color\", null);\r\n                    $input.spectrum(\"set\", \"#ffffff\");\r\n                    $(\"#luckysheet-icon-cell-color .luckysheet-color-menu-button-indicator\").css(\r\n                        \"border-bottom-color\",\r\n                        \"#ffffff\",\r\n                    );\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat(d, \"bg\", null);\r\n                });\r\n\r\n                //交替颜色\r\n                $menuButton.find(\".luckysheet-icon-alternateformat\").click(function() {\r\n                    // *如果禁止前台编辑，则中止下一步操作\r\n                    if (!checkIsAllowEdit()) {\r\n                        tooltip.info(\"\", locale().pivotTable.errorNotAllowEdit);\r\n                        return;\r\n                    }\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    if (Store.luckysheet_select_save.length > 1) {\r\n                        if (isEditMode()) {\r\n                            alert(locale_alternatingColors.errorInfo);\r\n                        } else {\r\n                            tooltip.info(locale_alternatingColors.errorInfo, \"\");\r\n                        }\r\n                        return;\r\n                    }\r\n\r\n                    let range = $.extend(true, {}, Store.luckysheet_select_save[0]);\r\n\r\n                    let isExists = alternateformat.rangeIsExists(range)[0];\r\n                    if (!isExists) {\r\n                        alternateformat.modelfocusIndex = 0;\r\n                        alternateformat.new(range);\r\n                    }\r\n\r\n                    alternateformat.init();\r\n                    alternateformat.perfect();\r\n                });\r\n\r\n                $(\"#\" + menuButtonId)\r\n                    .find(\".luckysheet-color-selected\")\r\n                    .val(\"#fff\");\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n\r\n            let offsetTop = $(this).offset().top + 26;\r\n            setTimeout(function() {\r\n                let $input = $(\"#\" + menuButtonId).find(\".luckysheet-color-selected\");\r\n                $input.spectrum(\"set\", $input.val());\r\n                mouseclickposition($menuButton, menuleft - 28, offsetTop, \"lefttop\");\r\n            }, 1);\r\n        });\r\n\r\n        //字体大小\r\n        let luckysheet_fs_setTimeout = null;\r\n        $(\"#luckysheet-icon-font-size\")\r\n            .mousedown(function(e) {\r\n                if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0) {\r\n                    let w = window.getSelection();\r\n                    if (w.type != \"None\") {\r\n                        let range = w.getRangeAt(0);\r\n                        if (!range.collapsed) {\r\n                            Store.inlineStringEditRange = range.cloneRange();\r\n                        }\r\n                    }\r\n                }\r\n                hideMenuByCancel(e);\r\n                e.stopPropagation();\r\n            })\r\n            .click(function() {\r\n                let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n                let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n                if ($menuButton.length == 0) {\r\n                    let itemdata = [\r\n                        { text: \"9\", value: \"9\", example: \"\" },\r\n                        { text: \"10\", value: \"10\", example: \"\" },\r\n                        { text: \"11\", value: \"11\", example: \"\" },\r\n                        { text: \"12\", value: \"12\", example: \"\" },\r\n                        { text: \"14\", value: \"14\", example: \"\" },\r\n                        { text: \"16\", value: \"16\", example: \"\" },\r\n                        { text: \"18\", value: \"18\", example: \"\" },\r\n                        { text: \"20\", value: \"20\", example: \"\" },\r\n                        { text: \"22\", value: \"22\", example: \"\" },\r\n                        { text: \"24\", value: \"24\", example: \"\" },\r\n                        { text: \"26\", value: \"26\", example: \"\" },\r\n                        { text: \"28\", value: \"28\", example: \"\" },\r\n                        { text: \"36\", value: \"36\", example: \"\" },\r\n                        { text: \"48\", value: \"48\", example: \"\" },\r\n                        { text: \"72\", value: \"72\", example: \"\" },\r\n                    ];\r\n\r\n                    let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                    let menu = replaceHtml(_this.menu, { id: \"font-size\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                    $(\"body\").append(menu);\r\n                    $menuButton = $(\"#\" + menuButtonId).width(150);\r\n                    _this.focus($menuButton, 10);\r\n\r\n                    $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                        $menuButton.hide();\r\n                        luckysheetContainerFocus();\r\n\r\n                        let $t = $(this),\r\n                            itemvalue = $t.attr(\"itemvalue\"),\r\n                            $input = $(\"#luckysheet-icon-font-size input\");\r\n                        $(\"#luckysheet-icon-font-size\").attr(\"itemvalue\", itemvalue);\r\n                        _this.focus($menuButton, itemvalue);\r\n                        $input.val(itemvalue);\r\n\r\n                        let d = editor.deepCopyFlowData(Store.flowdata);\r\n                        _this.updateFormat(d, \"fs\", itemvalue);\r\n\r\n                        clearTimeout(luckysheet_fs_setTimeout);\r\n                    });\r\n                }\r\n\r\n                let userlen = $(this).outerWidth();\r\n                let tlen = $menuButton.outerWidth();\r\n\r\n                let defualtvalue = $(\"#luckysheet-icon-font-size\").attr(\"itemvalue\");\r\n                if (defualtvalue == null) {\r\n                    defualtvalue = 10;\r\n                }\r\n                _this.focus($menuButton, defualtvalue);\r\n\r\n                let menuleft = $(this).offset().left;\r\n                if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                    menuleft = menuleft - tlen + userlen;\r\n                }\r\n                mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n            })\r\n            .find(\"input.luckysheet-toolbar-textinput\")\r\n            .keydown(function(e) {\r\n                hideMenuByCancel(e);\r\n                e.stopPropagation();\r\n            })\r\n            .keyup(function(e) {\r\n                if (e.keyCode != 13) {\r\n                    //Enter\r\n                    return;\r\n                }\r\n\r\n                let $this = $(this);\r\n\r\n                let itemvalue = parseInt($this.val());\r\n                let $menuButton = $(\"#luckysheet-icon-font-size-menuButton\");\r\n                _this.focus($menuButton, itemvalue);\r\n\r\n                let d = editor.deepCopyFlowData(Store.flowdata);\r\n                _this.updateFormat(d, \"fs\", itemvalue);\r\n\r\n                luckysheet_fs_setTimeout = setTimeout(function() {\r\n                    $menuButton.hide();\r\n                    $this.blur();\r\n                }, 200);\r\n            });\r\n\r\n        //边框设置\r\n        $(\"#luckysheet-icon-border-all\").click(function() {\r\n            // *如果禁止前台编辑，则中止下一步操作\r\n            if (!checkIsAllowEdit()) {\r\n                tooltip.info(\"\", locale().pivotTable.errorNotAllowEdit);\r\n                return;\r\n            }\r\n            if (!checkProtectionFormatCells(Store.currentSheetIndex)) {\r\n                return;\r\n            }\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n            let type = $(this).attr(\"type\");\r\n            if (type == null) {\r\n                type = \"border-all\";\r\n            }\r\n\r\n            let subcolormenuid = \"luckysheet-icon-borderColor-menuButton\";\r\n            let color = $(\"#\" + subcolormenuid)\r\n                .find(\".luckysheet-color-selected\")\r\n                .val();\r\n            let style = $(\"#luckysheetborderSizepreview\").attr(\"itemvalue\");\r\n\r\n            if (color == null || color == \"\") {\r\n                color = \"#000\";\r\n            }\r\n\r\n            if (style == null || style == \"\") {\r\n                style = \"1\";\r\n            }\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if (cfg[\"borderInfo\"] == null) {\r\n                cfg[\"borderInfo\"] = [];\r\n            }\r\n\r\n            let borderInfo = {\r\n                rangeType: \"range\",\r\n                borderType: type,\r\n                color: color,\r\n                style: style,\r\n                range: $.extend(true, [], Store.luckysheet_select_save),\r\n            };\r\n\r\n            cfg[\"borderInfo\"].push(borderInfo);\r\n\r\n            if (Store.clearjfundo) {\r\n                Store.jfundo.length = 0;\r\n\r\n                let redo = [];\r\n\r\n                redo[\"type\"] = \"borderChange\";\r\n\r\n                redo[\"config\"] = $.extend(true, {}, Store.config);\r\n                redo[\"curconfig\"] = $.extend(true, {}, cfg);\r\n\r\n                redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n                Store.jfredo.push(redo);\r\n            }\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"borderInfo\"], { k: \"borderInfo\" });\r\n\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            setTimeout(function() {\r\n                luckysheetrefreshgrid();\r\n            }, 1);\r\n        });\r\n\r\n        $(\"#luckysheet-icon-border-menu\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            if ($menuButton.length == 0) {\r\n                let canvasH = 10,\r\n                    canvasW = 120;\r\n                const _locale = locale();\r\n                const locale_border = _locale.border;\r\n                const locale_toolbar = _locale.toolbar;\r\n                const locale_button = _locale.button;\r\n                let itemdata = [\r\n                    {\r\n                        text: locale_border.borderTop,\r\n                        value: \"border-top\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-top iconfont-luckysheet luckysheet-iconfont-shangbiankuang\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_border.borderBottom,\r\n                        value: \"border-bottom\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-bottom iconfont-luckysheet luckysheet-iconfont-xiabiankuang\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_border.borderLeft,\r\n                        value: \"border-left\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-left iconfont-luckysheet luckysheet-iconfont-zuobiankuang\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_border.borderRight,\r\n                        value: \"border-right\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-right iconfont-luckysheet luckysheet-iconfont-youbiankuang\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    { text: \"\", value: \"split\", example: \"\" },\r\n                    {\r\n                        text: locale_border.borderNone,\r\n                        value: \"border-none\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-none iconfont-luckysheet luckysheet-iconfont-wubiankuang\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_border.borderAll,\r\n                        value: \"border-all\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-all iconfont-luckysheet luckysheet-iconfont-quanjiabiankuang\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_border.borderOutside,\r\n                        value: \"border-outside\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-outside iconfont-luckysheet luckysheet-iconfont-sizhoujiabiankuang\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    { text: \"\", value: \"split\", example: \"\" },\r\n                    {\r\n                        text: locale_border.borderInside,\r\n                        value: \"border-inside\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-inside iconfont-luckysheet luckysheet-iconfont-neikuangxian\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_border.borderHorizontal,\r\n                        value: \"border-horizontal\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-horizontal iconfont-luckysheet luckysheet-iconfont-neikuanghengxian\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_border.borderVertical,\r\n                        value: \"border-vertical\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block luckysheet-material-icon luckysheet-mousedown-cancel\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-vertical iconfont-luckysheet luckysheet-iconfont-neikuangshuxian\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    { text: \"\", value: \"split\", example: \"\" },\r\n                    {\r\n                        text:\r\n                            \"<span id='luckysheet-icon-borderColor-linecolor' class='luckysheet-mousedown-cancel' style='border-bottom:3px solid #000;'>\" +\r\n                            locale_border.borderColor +\r\n                            \"</span>\",\r\n                        value: \"borderColor\",\r\n                        example: \"more\",\r\n                    },\r\n                    {\r\n                        text:\r\n                            \"\" +\r\n                            locale_border.borderSize +\r\n                            \"<img id='luckysheetborderSizepreview' width=100 height=10 src='data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==' style='position:absolute;bottom:-5px;right:0px;width:100px;height:10px;'>\",\r\n                        value: \"borderSize\",\r\n                        example: \"more\",\r\n                    },\r\n                ];\r\n\r\n                // itemvalue to iconfont\r\n                const iconfontObject = iconfontObjects.border;\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { id: \"border-menu\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                let subitemdata = [\r\n                    { text: locale_border.borderNone, value: \"0\", example: \"\" },\r\n                    {\r\n                        text:\r\n                            \"<canvas type='Thin' class='border-Thin' width=\" +\r\n                            canvasW +\r\n                            \" height=\" +\r\n                            canvasH +\r\n                            \" style='width:\" +\r\n                            canvasW +\r\n                            \"px;height:\" +\r\n                            canvasH +\r\n                            \"px;position:static;'></canvas>\",\r\n                        value: \"1\",\r\n                        example: \"\",\r\n                    },\r\n                    {\r\n                        text:\r\n                            \"<canvas type='Hair' class='border-Hair' width=\" +\r\n                            canvasW +\r\n                            \" height=\" +\r\n                            canvasH +\r\n                            \" style='width:\" +\r\n                            canvasW +\r\n                            \"px;height:\" +\r\n                            canvasH +\r\n                            \"px;position:static;'></canvas>\",\r\n                        value: \"2\",\r\n                        example: \"\",\r\n                    },\r\n                    {\r\n                        text:\r\n                            \"<canvas type='Dotted' class='border-Dotted' width=\" +\r\n                            canvasW +\r\n                            \" height=\" +\r\n                            canvasH +\r\n                            \" style='width:\" +\r\n                            canvasW +\r\n                            \"px;height:\" +\r\n                            canvasH +\r\n                            \"px;position:static;'></canvas>\",\r\n                        value: \"3\",\r\n                        example: \"\",\r\n                    },\r\n                    {\r\n                        text:\r\n                            \"<canvas type='Dashed' class='border-Dashed' width=\" +\r\n                            canvasW +\r\n                            \" height=\" +\r\n                            canvasH +\r\n                            \" style='width:\" +\r\n                            canvasW +\r\n                            \"px;height:\" +\r\n                            canvasH +\r\n                            \"px;position:static;'></canvas>\",\r\n                        value: \"4\",\r\n                        example: \"\",\r\n                    },\r\n                    {\r\n                        text:\r\n                            \"<canvas type='DashDot' class='border-DashDot' width=\" +\r\n                            canvasW +\r\n                            \" height=\" +\r\n                            canvasH +\r\n                            \" style='width:\" +\r\n                            canvasW +\r\n                            \"px;height:\" +\r\n                            canvasH +\r\n                            \"px;position:static;'></canvas>\",\r\n                        value: \"5\",\r\n                        example: \"\",\r\n                    },\r\n                    {\r\n                        text:\r\n                            \"<canvas type='DashDotDot' class='border-DashDotDot' width=\" +\r\n                            canvasW +\r\n                            \" height=\" +\r\n                            canvasH +\r\n                            \" style='width:\" +\r\n                            canvasW +\r\n                            \"px;height:\" +\r\n                            canvasH +\r\n                            \"px;position:static;'></canvas>\",\r\n                        value: \"6\",\r\n                        example: \"\",\r\n                    },\r\n                    // {\"text\":\"<canvas type='Double' class='border-Double' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\":\"7\", \"example\":\"\"},\r\n                    {\r\n                        text:\r\n                            \"<canvas type='Medium' class='border-Medium' width=\" +\r\n                            canvasW +\r\n                            \" height=\" +\r\n                            canvasH +\r\n                            \" style='width:\" +\r\n                            canvasW +\r\n                            \"px;height:\" +\r\n                            canvasH +\r\n                            \"px;position:static;'></canvas>\",\r\n                        value: \"8\",\r\n                        example: \"\",\r\n                    },\r\n                    {\r\n                        text:\r\n                            \"<canvas type='MediumDashed' class='border-MediumDashed' width=\" +\r\n                            canvasW +\r\n                            \" height=\" +\r\n                            canvasH +\r\n                            \" style='width:\" +\r\n                            canvasW +\r\n                            \"px;height:\" +\r\n                            canvasH +\r\n                            \"px;position:static;'></canvas>\",\r\n                        value: \"9\",\r\n                        example: \"\",\r\n                    },\r\n                    {\r\n                        text:\r\n                            \"<canvas type='MediumDashDot' class='border-MediumDashDot' width=\" +\r\n                            canvasW +\r\n                            \" height=\" +\r\n                            canvasH +\r\n                            \" style='width:\" +\r\n                            canvasW +\r\n                            \"px;height:\" +\r\n                            canvasH +\r\n                            \"px;position:static;'></canvas>\",\r\n                        value: \"10\",\r\n                        example: \"\",\r\n                    },\r\n                    {\r\n                        text:\r\n                            \"<canvas type='MediumDashDotDot' class='border-MediumDashDotDot' width=\" +\r\n                            canvasW +\r\n                            \" height=\" +\r\n                            canvasH +\r\n                            \" style='width:\" +\r\n                            canvasW +\r\n                            \"px;height:\" +\r\n                            canvasH +\r\n                            \"px;position:static;'></canvas>\",\r\n                        value: \"11\",\r\n                        example: \"\",\r\n                    },\r\n                    // {\"text\":\"<canvas type='SlantedDashDot' class='border-SlantedDashDot' width=\"+ canvasW +\" height=\"+ canvasH +\" style='width:\"+ canvasW +\"px;height:\"+ canvasH +\"px;position:static;'></canvas>\", \"value\":\"12\", \"example\":\"\"},\r\n                    {\r\n                        text:\r\n                            \"<canvas type='Thick' class='border-Thick' width=\" +\r\n                            canvasW +\r\n                            \" height=\" +\r\n                            canvasH +\r\n                            \" style='width:\" +\r\n                            canvasW +\r\n                            \"px;height:\" +\r\n                            canvasH +\r\n                            \"px;position:static;'></canvas>\",\r\n                        value: \"13\",\r\n                        example: \"\",\r\n                    },\r\n                ];\r\n\r\n                let subitemset = _this.createButtonMenu(subitemdata);\r\n                let submenu = replaceHtml(_this.menu, {\r\n                    id: \"borderSize\",\r\n                    item: subitemset,\r\n                    subclass: \"luckysheet-menuButton-sub\",\r\n                });\r\n                let submenuid = \"luckysheet-icon-borderSize-menuButton\";\r\n                let subcolormenuid = \"luckysheet-icon-borderColor-menuButton\";\r\n                let colormenu = replaceHtml(_this.color, {\r\n                    id: subcolormenuid,\r\n                    coloritem: \"\",\r\n                    colorself: \"\",\r\n                    sub: \"luckysheet-menuButton-sub\",\r\n                    resetColor: locale_toolbar.resetColor,\r\n                });\r\n\r\n                $(\"body\").append(menu + colormenu + submenu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(170);\r\n                _this.focus($menuButton, \"border-all\");\r\n\r\n                $(\"#\" + submenuid + \" canvas\").each(function(i) {\r\n                    let type = $(this).attr(\"type\");\r\n                    let itemvalue = $(this)\r\n                        .closest(\".luckysheet-cols-menuitem\")\r\n                        .attr(\"itemvalue\");\r\n                    let canvasborder = $(this)\r\n                        .addClass(\"luckysheet-mousedown-cancel\")\r\n                        .get(0)\r\n                        .getContext(\"2d\");\r\n                    canvasborder.translate(0.5, 0.5);\r\n\r\n                    _this.setLineDash(canvasborder, itemvalue, \"h\", 0, 5, 100, 5);\r\n\r\n                    canvasborder.strokeStyle = \"#000000\";\r\n                    canvasborder.stroke();\r\n                    canvasborder.closePath();\r\n                });\r\n\r\n                $(\"#\" + submenuid + \" .luckysheet-cols-menuitem\").click(function() {\r\n                    $(\"#\" + submenuid).hide();\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if (itemvalue == 0) {\r\n                        $(\"#luckysheetborderSizepreview\")\r\n                            .attr(\r\n                                \"src\",\r\n                                \"data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==\",\r\n                            )\r\n                            .attr(\"itemvalue\", null);\r\n                    } else {\r\n                        let bg = $t\r\n                            .find(\"canvas\")\r\n                            .get(0)\r\n                            .toDataURL(\"image/png\");\r\n                        $(\"#luckysheetborderSizepreview\")\r\n                            .attr(\"src\", bg)\r\n                            .attr(\"itemvalue\", itemvalue);\r\n                    }\r\n\r\n                    _this.focus($(\"#\" + submenuid), itemvalue);\r\n                });\r\n\r\n                // border choose menu\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                    // *如果禁止前台编辑，则中止下一步操作\r\n                    if (!checkIsAllowEdit()) {\r\n                        tooltip.info(\"\", locale().pivotTable.errorNotAllowEdit);\r\n                        return;\r\n                    }\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n                    if (itemvalue == \"borderColor\" || itemvalue == \"borderSize\") {\r\n                        return;\r\n                    }\r\n\r\n                    if (!checkProtectionFormatCells(Store.currentSheetIndex)) {\r\n                        return;\r\n                    }\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n                    let color = $(\"#\" + subcolormenuid)\r\n                        .find(\".luckysheet-color-selected\")\r\n                        .val();\r\n                    let style = $(\"#luckysheetborderSizepreview\").attr(\"itemvalue\");\r\n\r\n                    if (color == null || color == \"\") {\r\n                        color = \"#000\";\r\n                    }\r\n\r\n                    if (style == null || style == \"\") {\r\n                        style = \"1\";\r\n                    }\r\n\r\n                    let cfg = $.extend(true, {}, Store.config);\r\n                    if (cfg[\"borderInfo\"] == null) {\r\n                        cfg[\"borderInfo\"] = [];\r\n                    }\r\n\r\n                    let borderInfo = {\r\n                        rangeType: \"range\",\r\n                        borderType: itemvalue,\r\n                        color: color,\r\n                        style: style,\r\n                        range: $.extend(true, [], Store.luckysheet_select_save),\r\n                    };\r\n\r\n                    cfg[\"borderInfo\"].push(borderInfo);\r\n\r\n                    if (Store.clearjfundo) {\r\n                        Store.jfundo.length = 0;\r\n\r\n                        let redo = [];\r\n\r\n                        redo[\"type\"] = \"borderChange\";\r\n\r\n                        redo[\"config\"] = $.extend(true, {}, Store.config);\r\n                        redo[\"curconfig\"] = $.extend(true, {}, cfg);\r\n\r\n                        redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n                        Store.jfredo.push(redo);\r\n                    }\r\n\r\n                    server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"borderInfo\"], { k: \"borderInfo\" });\r\n\r\n                    Store.config = cfg;\r\n                    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n                    setTimeout(function() {\r\n                        luckysheetrefreshgrid();\r\n                    }, 1);\r\n\r\n                    $(\"#luckysheet-icon-border-all\").attr(\"type\", itemvalue);\r\n\r\n                    let $icon = $(\"#luckysheet-icon-border-all\").find(\".luckysheet-icon-img-container\");\r\n\r\n                    // add iconfont\r\n                    $icon\r\n                        .removeAttr(\"class\")\r\n                        .addClass(\r\n                            \"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-\" +\r\n                                itemvalue +\r\n                                iconfontObject[itemvalue],\r\n                        );\r\n\r\n                    _this.focus($menuButton, itemvalue);\r\n                });\r\n\r\n                $(\"#\" + subcolormenuid)\r\n                    .find(\".luckysheet-color-selected\")\r\n                    .spectrum({\r\n                        showPalette: true,\r\n                        showPaletteOnly: true,\r\n                        preferredFormat: \"hex\",\r\n                        clickoutFiresChange: false,\r\n                        showInitial: true,\r\n                        showInput: true,\r\n                        flat: true,\r\n                        hideAfterPaletteSelect: true,\r\n                        showSelectionPalette: true,\r\n                        maxPaletteSize: 8,\r\n                        maxSelectionSize: 8,\r\n                        color: \"#000\",\r\n                        cancelText: locale_button.cancel,\r\n                        chooseText: locale_button.confirm,\r\n                        togglePaletteMoreText: locale_toolbar.customColor,\r\n                        togglePaletteLessText: locale_toolbar.collapse,\r\n                        togglePaletteOnly: true,\r\n                        clearText: locale_toolbar.clearText,\r\n                        noColorSelectedText: locale_toolbar.noColorSelectedText,\r\n                        localStorageKey: \"spectrum.bordercolor\" + server.gridKey,\r\n                        palette: [\r\n                            [\"#000\", \"#444\", \"#666\", \"#999\", \"#ccc\", \"#eee\", \"#f3f3f3\", \"#fff\"],\r\n                            [\"#f00\", \"#f90\", \"#ff0\", \"#0f0\", \"#0ff\", \"#00f\", \"#90f\", \"#f0f\"],\r\n                            [\"#f4cccc\", \"#fce5cd\", \"#fff2cc\", \"#d9ead3\", \"#d0e0e3\", \"#cfe2f3\", \"#d9d2e9\", \"#ead1dc\"],\r\n                            [\"#ea9999\", \"#f9cb9c\", \"#ffe599\", \"#b6d7a8\", \"#a2c4c9\", \"#9fc5e8\", \"#b4a7d6\", \"#d5a6bd\"],\r\n                            [\"#e06666\", \"#f6b26b\", \"#ffd966\", \"#93c47d\", \"#76a5af\", \"#6fa8dc\", \"#8e7cc3\", \"#c27ba0\"],\r\n                            [\"#c00\", \"#e69138\", \"#f1c232\", \"#6aa84f\", \"#45818e\", \"#3d85c6\", \"#674ea7\", \"#a64d79\"],\r\n                            [\"#900\", \"#b45f06\", \"#bf9000\", \"#38761d\", \"#134f5c\", \"#0b5394\", \"#351c75\", \"#741b47\"],\r\n                            [\"#600\", \"#783f04\", \"#7f6000\", \"#274e13\", \"#0c343d\", \"#073763\", \"#20124d\", \"#4c1130\"],\r\n                        ],\r\n                        change: function(color) {\r\n                            let $input = $(this);\r\n                            if (color != null) {\r\n                                color = color.toHexString();\r\n                            } else {\r\n                                color = \"#000\";\r\n                            }\r\n\r\n                            let oldcolor = null;\r\n                            $(\"#luckysheet-icon-borderColor-linecolor\").css(\"border-bottom-color\", color);\r\n                            $(\"#\" + subcolormenuid)\r\n                                .find(\".luckysheet-color-selected\")\r\n                                .val(color);\r\n                        },\r\n                    });\r\n\r\n                $(\"#\" + subcolormenuid)\r\n                    .find(\".luckysheet-color-reset\")\r\n                    .click(function() {\r\n                        let $input = $(\"#\" + subcolormenuid).find(\".luckysheet-color-selected\");\r\n                        $input.val(\"#000\");\r\n                        $(\"#luckysheet-icon-cell-color\").attr(\"color\", null);\r\n                        $input.spectrum(\"set\", \"#000\");\r\n                        $(\"#luckysheet-icon-borderColor-linecolor\").css(\"border-bottom-color\", \"#000\");\r\n                    });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 28, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //合并单元格\r\n        $(\"#luckysheet-icon-merge-button\").click(function() {\r\n            const _locale = locale();\r\n            const locale_merge = _locale.merge;\r\n\r\n            if (!checkProtectionNotEnable(Store.currentSheetIndex)) {\r\n                return;\r\n            }\r\n\r\n            if (selectIsOverlap()) {\r\n                if (isEditMode()) {\r\n                    alert(locale_merge.overlappingError);\r\n                } else {\r\n                    tooltip.info(locale_merge.overlappingError, \"\");\r\n                }\r\n                return;\r\n            }\r\n\r\n            if (Store.config[\"merge\"] != null) {\r\n                let has_PartMC = false;\r\n\r\n                for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                    let r1 = Store.luckysheet_select_save[s].row[0],\r\n                        r2 = Store.luckysheet_select_save[s].row[1];\r\n                    let c1 = Store.luckysheet_select_save[s].column[0],\r\n                        c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                    has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                    if (has_PartMC) {\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (has_PartMC) {\r\n                    if (isEditMode()) {\r\n                        alert(locale_merge.partiallyError);\r\n                    } else {\r\n                        tooltip.info(locale_merge.partiallyError, \"\");\r\n                    }\r\n                    return;\r\n                }\r\n            }\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            _this.updateFormat_mc(d, \"mergeAll\");\r\n        });\r\n\r\n        $(\"#luckysheet-icon-merge-menu\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            if ($menuButton.length == 0) {\r\n                const _locale = locale();\r\n                const locale_merge = _locale.merge;\r\n\r\n                let itemdata = [\r\n                    { text: locale_merge.mergeAll, value: \"mergeAll\", example: \"\" },\r\n                    { text: locale_merge.mergeV, value: \"mergeV\", example: \"\" },\r\n                    { text: locale_merge.mergeH, value: \"mergeH\", example: \"\" },\r\n                    { text: locale_merge.mergeCancel, value: \"mergeCancel\", example: \"\" },\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { id: \"merge-menu\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId);\r\n                _this.focus($menuButton);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    if (selectIsOverlap()) {\r\n                        if (isEditMode()) {\r\n                            alert(locale_merge.overlappingError);\r\n                        } else {\r\n                            tooltip.info(locale_merge.overlappingError, \"\");\r\n                        }\r\n                        return;\r\n                    }\r\n\r\n                    if (Store.config[\"merge\"] != null) {\r\n                        let has_PartMC = false;\r\n\r\n                        for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                            let r1 = Store.luckysheet_select_save[s].row[0],\r\n                                r2 = Store.luckysheet_select_save[s].row[1];\r\n                            let c1 = Store.luckysheet_select_save[s].column[0],\r\n                                c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                            has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2);\r\n\r\n                            if (has_PartMC) {\r\n                                break;\r\n                            }\r\n                        }\r\n\r\n                        if (has_PartMC) {\r\n                            if (isEditMode()) {\r\n                                alert(locale_merge.partiallyError);\r\n                            } else {\r\n                                tooltip.info(locale_merge.partiallyError, \"\");\r\n                            }\r\n                            return;\r\n                        }\r\n                    }\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n                    _this.focus($menuButton, itemvalue);\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat_mc(d, itemvalue);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 28, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //水平对齐\r\n        $(\"#luckysheet-icon-align\").click(function() {\r\n            let itemvalue = $(\"#luckysheet-icon-align\").attr(\"type\");\r\n            if (itemvalue == null) {\r\n                itemvalue = \"left\";\r\n            }\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            _this.updateFormat(d, \"ht\", itemvalue);\r\n        });\r\n\r\n        $(\"#luckysheet-icon-align-menu\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            if ($menuButton.length == 0) {\r\n                const _locale = locale();\r\n                const locale_align = _locale.align;\r\n                let itemdata = [\r\n                    {\r\n                        text: locale_align.left,\r\n                        value: \"left\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-left iconfont-luckysheet luckysheet-iconfont-wenbenzuoduiqi\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_align.center,\r\n                        value: \"center\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-center iconfont-luckysheet luckysheet-iconfont-wenbenjuzhongduiqi\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_align.right,\r\n                        value: \"right\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-right iconfont-luckysheet luckysheet-iconfont-wenbenyouduiqi\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                ];\r\n\r\n                // itemvalue to iconfont\r\n                const iconfontObject = iconfontObjects.align;\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { id: \"align-menu\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(120);\r\n                _this.focus($menuButton);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n                    _this.focus($menuButton, itemvalue);\r\n\r\n                    let $icon = $(\"#luckysheet-icon-align\")\r\n                        .attr(\"type\", itemvalue)\r\n                        .find(\".luckysheet-icon-img-container\");\r\n\r\n                    // add iconfont\r\n                    $icon\r\n                        .removeAttr(\"class\")\r\n                        .addClass(\r\n                            \"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-\" +\r\n                                itemvalue +\r\n                                iconfontObject[itemvalue],\r\n                        );\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat(d, \"ht\", itemvalue);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 28, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //垂直对齐\r\n        $(\"#luckysheet-icon-valign\").click(function() {\r\n            let itemvalue = $(\"#luckysheet-icon-valign\").attr(\"type\");\r\n            if (itemvalue == null) {\r\n                itemvalue = \"bottom\";\r\n            }\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            _this.updateFormat(d, \"vt\", itemvalue);\r\n        });\r\n\r\n        $(\"#luckysheet-icon-valign-menu\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            const _locale = locale();\r\n            const locale_align = _locale.align;\r\n            if ($menuButton.length == 0) {\r\n                let itemdata = [\r\n                    {\r\n                        text: locale_align.top,\r\n                        value: \"top\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-top iconfont-luckysheet luckysheet-iconfont-dingbuduiqi\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_align.middle,\r\n                        value: \"middle\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-middle iconfont-luckysheet luckysheet-iconfont-shuipingduiqi\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_align.bottom,\r\n                        value: \"bottom\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-bottom iconfont-luckysheet luckysheet-iconfont-dibuduiqi\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                ];\r\n\r\n                // itemvalue to iconfont\r\n                const iconfontObject = iconfontObjects.align;\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { id: \"valign-menu\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(120);\r\n                _this.focus($menuButton, \"bottom\");\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n                    _this.focus($menuButton, itemvalue);\r\n\r\n                    let $icon = $(\"#luckysheet-icon-valign\")\r\n                        .attr(\"type\", itemvalue)\r\n                        .find(\".luckysheet-icon-img-container\");\r\n\r\n                    // add iconfont\r\n                    $icon\r\n                        .removeAttr(\"class\")\r\n                        .addClass(\r\n                            \"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-\" +\r\n                                itemvalue +\r\n                                iconfontObject[itemvalue],\r\n                        );\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat(d, \"vt\", itemvalue);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 28, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //文本换行\r\n        $(\"#luckysheet-icon-textwrap-menu\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            if ($menuButton.length == 0) {\r\n                const _locale = locale();\r\n                const locale_textWrap = _locale.textWrap;\r\n                let itemdata = [\r\n                    {\r\n                        text: locale_textWrap.overflow,\r\n                        value: \"overflow\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-overflow iconfont-luckysheet luckysheet-iconfont-yichu1\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_textWrap.wrap,\r\n                        value: \"wrap\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-wrap iconfont-luckysheet luckysheet-iconfont-zidonghuanhang\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_textWrap.clip,\r\n                        value: \"clip\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-clip iconfont-luckysheet luckysheet-iconfont-jieduan\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                ];\r\n\r\n                // itemvalue to iconfont\r\n                const iconfontObject = iconfontObjects.textWrap;\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { id: \"textwrap-menu\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(120);\r\n                _this.focus($menuButton, \"clip\");\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n                    _this.focus($menuButton, itemvalue);\r\n\r\n                    let $icon = $(\"#luckysheet-icon-textwrap\")\r\n                        .attr(\"type\", itemvalue)\r\n                        .find(\".luckysheet-icon-img-container\");\r\n\r\n                    // add iconfont\r\n                    $icon\r\n                        .removeAttr(\"class\")\r\n                        .addClass(\r\n                            \"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-\" +\r\n                                itemvalue +\r\n                                iconfontObject[itemvalue],\r\n                        );\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat(d, \"tb\", itemvalue);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 28, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //文本旋转\r\n        $(\"#luckysheet-icon-rotation-menu\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            if ($menuButton.length == 0) {\r\n                const _locale = locale();\r\n                const locale_rotation = _locale.rotation;\r\n                let itemdata = [\r\n                    {\r\n                        text: locale_rotation.none,\r\n                        value: \"none\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont-luckysheet luckysheet-iconfont-wuxuanzhuang\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_rotation.angleup,\r\n                        value: \"angleup\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-angleup iconfont-luckysheet luckysheet-iconfont-xiangshangqingxie\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_rotation.angledown,\r\n                        value: \"angledown\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-angledown iconfont-luckysheet luckysheet-iconfont-xiangxiaqingxie\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_rotation.vertical,\r\n                        value: \"vertical\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-vertical iconfont-luckysheet luckysheet-iconfont-shupaiwenzi\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_rotation.rotationUp,\r\n                        value: \"rotation-up\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-rotation-up iconfont-luckysheet luckysheet-iconfont-wenbenxiangshang\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                    {\r\n                        text: locale_rotation.rotationDown,\r\n                        value: \"rotation-down\",\r\n                        example:\r\n                            '<div class=\"luckysheet-icon luckysheet-inline-block\" style=\"user-select: none;opacity:1;\"> <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-rotation-down iconfont-luckysheet luckysheet-iconfont-xiangxia90\" style=\"user-select: none;\"> </div> </div>',\r\n                    },\r\n                ];\r\n\r\n                // itemvalue to iconfont\r\n                const iconfontObject = iconfontObjects.rotation;\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { id: \"rotation-menu\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n\r\n                // 文字旋转总 Stack Vertically 太长了，拉宽到160\r\n                $menuButton = $(\"#\" + menuButtonId).width(160);\r\n                _this.focus($menuButton);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n                    _this.focus($menuButton, itemvalue);\r\n\r\n                    let $icon = $(\"#luckysheet-icon-rotation\")\r\n                        .attr(\"type\", itemvalue)\r\n                        .find(\".luckysheet-icon-img-container\");\r\n\r\n                    // add iconfont\r\n                    $icon\r\n                        .removeAttr(\"class\")\r\n                        .addClass(\r\n                            \"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-\" +\r\n                                itemvalue +\r\n                                iconfontObject[itemvalue],\r\n                        );\r\n\r\n                    let d = editor.deepCopyFlowData(Store.flowdata);\r\n                    _this.updateFormat(d, \"tr\", itemvalue);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 28, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //冻结行列\r\n        $(\"#luckysheet-icon-freezen-menu\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            if ($menuButton.length == 0) {\r\n                const _locale = locale();\r\n                const locale_freezen = _locale.freezen;\r\n                let itemdata = [\r\n                    { text: locale_freezen.freezenRow, value: \"freezenRow\", example: \"\" },\r\n                    { text: locale_freezen.freezenColumn, value: \"freezenColumn\", example: \"\" },\r\n                    { text: locale_freezen.freezenRC, value: \"freezenRC\", example: \"\" },\r\n                    { text: \"\", value: \"split\", example: \"\" },\r\n                    { text: locale_freezen.freezenRowRange, value: \"freezenRowRange\", example: \"\" },\r\n                    { text: locale_freezen.freezenColumnRange, value: \"freezenColumnRange\", example: \"\" },\r\n                    { text: locale_freezen.freezenRCRange, value: \"freezenRCRange\", example: \"\" },\r\n                    { text: \"\", value: \"split\", example: \"\" },\r\n                    { text: locale_freezen.freezenCancel, value: \"freezenCancel\", example: \"\" },\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { id: \"freezen-menu\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(170);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n                    _this.focus($menuButton, itemvalue);\r\n                    if (itemvalue === \"freezenCancel\") {\r\n                        $menuButton.find(\".fa.fa-check\").remove();\r\n                    }\r\n\r\n                    // store frozen\r\n                    luckysheetFreezen.saveFrozen(itemvalue);\r\n\r\n                    if (itemvalue == \"freezenRow\") {\r\n                        //首行冻结\r\n                        frozenFirstRow();\r\n                        // let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                        // let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n                        // if(row_st == -1){\r\n                        //     row_st = 0;\r\n                        // }\r\n                        // let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n                        // let freezenhorizontaldata = [Store.visibledatarow[row_st], row_st + 1, scrollTop, luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), top];\r\n                        // luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n                        // if (luckysheetFreezen.freezenverticaldata != null) {\r\n                        //     luckysheetFreezen.cancelFreezenVertical();\r\n                        //     luckysheetFreezen.createAssistCanvas();\r\n                        //     luckysheetrefreshgrid();\r\n                        // }\r\n\r\n                        // luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n                        // luckysheetFreezen.createAssistCanvas();\r\n                        // luckysheetrefreshgrid();\r\n                    } else if (itemvalue == \"freezenColumn\") {\r\n                        //首列冻结\r\n                        frozenFirstColumn();\r\n                        // let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                        // let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n                        // if(col_st == -1){\r\n                        //     col_st = 0;\r\n                        // }\r\n                        // let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n                        // let freezenverticaldata = [Store.visibledatacolumn[col_st], col_st + 1, scrollLeft, luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), left];\r\n                        // luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n                        // if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n                        //     luckysheetFreezen.cancelFreezenHorizontal();\r\n                        //     luckysheetFreezen.createAssistCanvas();\r\n                        //     luckysheetrefreshgrid();\r\n                        // }\r\n\r\n                        // luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n                        // luckysheetFreezen.createAssistCanvas();\r\n                        // luckysheetrefreshgrid();\r\n                    } else if (itemvalue == \"freezenRC\") {\r\n                        //首行列冻结\r\n                        if (luckysheetFreezen.freezenRealFirstRowColumn) {\r\n                            let row_st = 0;\r\n                            let top = Store.visibledatarow[row_st] - 2 + Store.columnHeaderHeight;\r\n                            let freezenhorizontaldata = [\r\n                                Store.visibledatarow[row_st],\r\n                                row_st + 1,\r\n                                0,\r\n                                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n                                top,\r\n                            ];\r\n                            luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n                            luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n\r\n                            let col_st = 0;\r\n                            let left = Store.visibledatacolumn[col_st] - 2 + Store.rowHeaderWidth;\r\n                            let freezenverticaldata = [\r\n                                Store.visibledatacolumn[col_st],\r\n                                col_st + 1,\r\n                                0,\r\n                                luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n                                left,\r\n                            ];\r\n                            luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n                            luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n                        } else {\r\n                            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n                            if (row_st == -1) {\r\n                                row_st = 0;\r\n                            }\r\n                            let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n                            let freezenhorizontaldata = [\r\n                                Store.visibledatarow[row_st],\r\n                                row_st + 1,\r\n                                scrollTop,\r\n                                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n                                top,\r\n                            ];\r\n                            luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n                            luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n\r\n                            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                            let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n                            if (col_st == -1) {\r\n                                col_st = 0;\r\n                            }\r\n                            let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n                            let freezenverticaldata = [\r\n                                Store.visibledatacolumn[col_st],\r\n                                col_st + 1,\r\n                                scrollLeft,\r\n                                luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n                                left,\r\n                            ];\r\n                            luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n                            luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n                        }\r\n                        luckysheetFreezen.createAssistCanvas();\r\n                        luckysheetrefreshgrid();\r\n                    } else if (itemvalue == \"freezenRowRange\") {\r\n                        //选区行冻结\r\n\r\n                        if (Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0) {\r\n                            if (isEditMode()) {\r\n                                alert(locale_freezen.noSeletionError);\r\n                            } else {\r\n                                tooltip.info(locale_freezen.noSeletionError, \"\");\r\n                            }\r\n\r\n                            return;\r\n                        }\r\n                        // 固定超出屏幕范围\r\n                        let rangeTop = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1].top;\r\n                        if (\r\n                            luckysheetFreezen.freezenRealFirstRowColumn &&\r\n                            rangeTop > $(\"#luckysheet-cell-main\").height()\r\n                        ) {\r\n                            return tooltip.info(locale_freezen.rangeRCOverErrorTitle, locale_freezen.rangeRCOverError);\r\n                        }\r\n                        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                        let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n\r\n                        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                        let row_focus = last[\"row_focus\"] == null ? last[\"row\"][0] : last[\"row_focus\"];\r\n                        row_st = Math.max(row_st - 1, row_focus - 1, 0);\r\n\r\n                        let top, freezenhorizontaldata;\r\n                        if (luckysheetFreezen.freezenRealFirstRowColumn) {\r\n                            top = Store.visibledatarow[row_st] - 2 + Store.columnHeaderHeight;\r\n                            freezenhorizontaldata = [\r\n                                Store.visibledatarow[row_st],\r\n                                row_st + 1,\r\n                                0,\r\n                                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n                                top,\r\n                            ];\r\n                        } else {\r\n                            top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n                            freezenhorizontaldata = [\r\n                                Store.visibledatarow[row_st],\r\n                                row_st + 1,\r\n                                scrollTop,\r\n                                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n                                top,\r\n                            ];\r\n                        }\r\n                        luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n                        if (luckysheetFreezen.freezenverticaldata != null) {\r\n                            luckysheetFreezen.cancelFreezenVertical();\r\n                            luckysheetFreezen.createAssistCanvas();\r\n                            luckysheetrefreshgrid();\r\n                        }\r\n\r\n                        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n                        luckysheetFreezen.createAssistCanvas();\r\n                        luckysheetrefreshgrid();\r\n                    } else if (itemvalue == \"freezenColumnRange\") {\r\n                        //选区列冻结\r\n                        if (Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0) {\r\n                            if (isEditMode()) {\r\n                                alert(locale_freezen.noSeletionError);\r\n                            } else {\r\n                                tooltip.info(locale_freezen.noSeletionError, \"\");\r\n                            }\r\n\r\n                            return;\r\n                        }\r\n                        // 固定超出屏幕范围\r\n                        let rangeLeft = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1].left;\r\n                        if (\r\n                            luckysheetFreezen.freezenRealFirstRowColumn &&\r\n                            rangeLeft > $(\"#luckysheet-cell-main\").width()\r\n                        ) {\r\n                            return tooltip.info(locale_freezen.rangeRCOverErrorTitle, locale_freezen.rangeRCOverError);\r\n                        }\r\n                        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                        let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n\r\n                        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                        let column_focus = last[\"column_focus\"] == null ? last[\"column\"][0] : last[\"column_focus\"];\r\n                        col_st = Math.max(col_st - 1, column_focus - 1, 0);\r\n\r\n                        let left, freezenverticaldata;\r\n                        if (luckysheetFreezen.freezenRealFirstRowColumn) {\r\n                            left = Store.visibledatacolumn[col_st] - 2 + Store.rowHeaderWidth;\r\n                            freezenverticaldata = [\r\n                                Store.visibledatacolumn[col_st],\r\n                                col_st + 1,\r\n                                0,\r\n                                luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n                                left,\r\n                            ];\r\n                        } else {\r\n                            left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n                            freezenverticaldata = [\r\n                                Store.visibledatacolumn[col_st],\r\n                                col_st + 1,\r\n                                scrollLeft,\r\n                                luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n                                left,\r\n                            ];\r\n                        }\r\n                        luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n                        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n                            luckysheetFreezen.cancelFreezenHorizontal();\r\n                            luckysheetFreezen.createAssistCanvas();\r\n                            luckysheetrefreshgrid();\r\n                        }\r\n\r\n                        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n                        luckysheetFreezen.createAssistCanvas();\r\n                        luckysheetrefreshgrid();\r\n                    } else if (itemvalue == \"freezenRCRange\") {\r\n                        //选区行列冻结\r\n                        if (Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0) {\r\n                            if (isEditMode()) {\r\n                                alert(locale_freezen.noSeletionError);\r\n                            } else {\r\n                                tooltip.info(locale_freezen.noSeletionError, \"\");\r\n                            }\r\n\r\n                            return;\r\n                        }\r\n\r\n                        // 固定超出屏幕范围\r\n                        let rangeTop = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1].top;\r\n                        let rangeLeft = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1].left;\r\n                        if (\r\n                            luckysheetFreezen.freezenRealFirstRowColumn &&\r\n                            (rangeTop > $(\"#luckysheet-cell-main\").height() ||\r\n                                rangeLeft > $(\"#luckysheet-cell-main\").width())\r\n                        ) {\r\n                            return tooltip.info(locale_freezen.rangeRCOverErrorTitle, locale_freezen.rangeRCOverError);\r\n                        }\r\n\r\n                        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                        let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n\r\n                        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                        let row_focus = last[\"row_focus\"] == null ? last[\"row\"][0] : last[\"row_focus\"];\r\n                        row_st = Math.max(row_st - 1, row_focus - 1, 0);\r\n\r\n                        let top, freezenhorizontaldata;\r\n                        if (luckysheetFreezen.freezenRealFirstRowColumn) {\r\n                            top = Store.visibledatarow[row_st] - 2 + Store.columnHeaderHeight;\r\n                            freezenhorizontaldata = [\r\n                                Store.visibledatarow[row_st],\r\n                                row_st + 1,\r\n                                0,\r\n                                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n                                top,\r\n                            ];\r\n                            luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n                        } else {\r\n                            top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n                            freezenhorizontaldata = [\r\n                                Store.visibledatarow[row_st],\r\n                                row_st + 1,\r\n                                scrollTop,\r\n                                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n                                top,\r\n                            ];\r\n                            luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n                        }\r\n\r\n                        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n\r\n                        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                        let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n\r\n                        let column_focus = last[\"column_focus\"] == null ? last[\"column\"][0] : last[\"column_focus\"];\r\n                        col_st = Math.max(col_st - 1, column_focus - 1, 0);\r\n\r\n                        let left, freezenverticaldata;\r\n                        if (luckysheetFreezen.freezenRealFirstRowColumn) {\r\n                            left = Store.visibledatacolumn[col_st] - 2 + Store.rowHeaderWidth;\r\n                            freezenverticaldata = [\r\n                                Store.visibledatacolumn[col_st],\r\n                                col_st + 1,\r\n                                0,\r\n                                luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n                                left,\r\n                            ];\r\n                        } else {\r\n                            left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n                            freezenverticaldata = [\r\n                                Store.visibledatacolumn[col_st],\r\n                                col_st + 1,\r\n                                scrollLeft,\r\n                                luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n                                left,\r\n                            ];\r\n                        }\r\n                        luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n                        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n\r\n                        luckysheetFreezen.createAssistCanvas();\r\n                        luckysheetrefreshgrid();\r\n                    } else if (itemvalue == \"freezenCancel\") {\r\n                        //Cancel freezen\r\n                        if (luckysheetFreezen.freezenverticaldata != null) {\r\n                            luckysheetFreezen.cancelFreezenVertical();\r\n                            luckysheetFreezen.createAssistCanvas();\r\n                            luckysheetrefreshgrid();\r\n                        }\r\n\r\n                        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n                            luckysheetFreezen.cancelFreezenHorizontal();\r\n                            luckysheetFreezen.createAssistCanvas();\r\n                            luckysheetrefreshgrid();\r\n                        }\r\n\r\n                        luckysheetFreezen.scrollAdapt();\r\n                    }\r\n\r\n                    setTimeout(function() {\r\n                        luckysheetsizeauto();\r\n                    }, 0);\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 68, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //过滤和排序\r\n        $(\"#luckysheet-icon-autofilter\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            if ($menuButton.length == 0) {\r\n                const _locale = locale();\r\n                const locale_sort = _locale.sort;\r\n                const locale_filter = _locale.filter;\r\n                let itemdata = [\r\n                    {\r\n                        text: locale_sort.asc,\r\n                        value: \"asc\",\r\n                        example: '<i class=\"iconfont-luckysheet luckysheet-iconfont-shengxu\" aria-hidden=\"true\"></i>',\r\n                    },\r\n                    {\r\n                        text: locale_sort.desc,\r\n                        value: \"desc\",\r\n                        example: '<i class=\"iconfont-luckysheet luckysheet-iconfont-jiangxu\" aria-hidden=\"true\"></i>',\r\n                    },\r\n                    {\r\n                        text: locale_sort.custom + \"...\",\r\n                        value: \"diysort\",\r\n                        example: '<i class=\"iconfont-luckysheet luckysheet-iconfont-zidingyipaixu\" aria-hidden=\"true\"></i>',\r\n                    },\r\n                    { text: \"\", value: \"split\", example: \"\" },\r\n                    {\r\n                        text: locale_filter.filter,\r\n                        value: \"filter\",\r\n                        example: '<i class=\"iconfont-luckysheet luckysheet-iconfont-shaixuan2\" aria-hidden=\"true\"></i>',\r\n                    },\r\n                    {\r\n                        text: locale_filter.clearFilter,\r\n                        value: \"clearfilter\",\r\n                        example: '<i class=\"iconfont-luckysheet luckysheet-iconfont-qingchushaixuan\" aria-hidden=\"true\"></i>',\r\n                    },\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { id: \"autofilter\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(150);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if (itemvalue == \"diysort\") {\r\n                        $(\"#luckysheetorderby\").click();\r\n                    } else if (itemvalue == \"asc\") {\r\n                        sortSelection(true);\r\n                    } else if (itemvalue == \"desc\") {\r\n                        sortSelection(false);\r\n                    } else if (itemvalue == \"filter\") {\r\n                        if ($(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex).length > 0) {\r\n                            $(\"#luckysheet-filter-initial\").click();\r\n                        } else {\r\n                            createFilter();\r\n                        }\r\n                    } else if (itemvalue == \"clearfilter\") {\r\n                        $(\"#luckysheet-filter-initial\").click();\r\n                    }\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //查找和替换\r\n        $(\"#luckysheet-icon-seachmore\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            const _locale = locale();\r\n            const locale_findAndReplace = _locale.findAndReplace;\r\n            if ($menuButton.length == 0) {\r\n                let itemdata = [\r\n                    {\r\n                        text: locale_findAndReplace.find + \" ...\",\r\n                        value: \"search\",\r\n                        example: '<i class=\"iconfont-luckysheet luckysheet-iconfont-sousuo\" aria-hidden=\"true\"></i>',\r\n                    },\r\n                    {\r\n                        text: locale_findAndReplace.replace + \" ...\",\r\n                        value: \"replace\",\r\n                        example: '<i class=\"iconfont-luckysheet luckysheet-iconfont-tihuan\" aria-hidden=\"true\"></i>',\r\n                    },\r\n                    // {\"text\": locale_findAndReplace.goto+\" ...\", \"value\": \"goto\", \"example\": '<i class=\"iconfont-luckysheet luckysheet-iconfont-zhuandao1\" aria-hidden=\"true\"></i>'},\r\n                    { text: \"\", value: \"split\", example: \"\" },\r\n                    {\r\n                        text: locale_findAndReplace.location + \" ...\",\r\n                        value: \"location\",\r\n                        example: '<i class=\"iconfont-luckysheet luckysheet-iconfont-dingwei\" aria-hidden=\"true\"></i>',\r\n                    },\r\n                    {\r\n                        text: locale_findAndReplace.formula,\r\n                        value: \"locationFormula\",\r\n                        example: locale_findAndReplace.locationExample,\r\n                    },\r\n                    {\r\n                        text: locale_findAndReplace.date,\r\n                        value: \"locationConstantDate\",\r\n                        example: locale_findAndReplace.locationExample,\r\n                    },\r\n                    {\r\n                        text: locale_findAndReplace.number,\r\n                        value: \"locationConstantNumber\",\r\n                        example: locale_findAndReplace.locationExample,\r\n                    },\r\n                    {\r\n                        text: locale_findAndReplace.string,\r\n                        value: \"locationConstantString\",\r\n                        example: locale_findAndReplace.locationExample,\r\n                    },\r\n                    {\r\n                        text: locale_findAndReplace.error,\r\n                        value: \"locationConstantError\",\r\n                        example: locale_findAndReplace.locationExample,\r\n                    },\r\n                    {\r\n                        text: locale_findAndReplace.condition,\r\n                        value: \"locationCF\",\r\n                        example: locale_findAndReplace.locationExample,\r\n                    },\r\n                    {\r\n                        text: locale_findAndReplace.rowSpan,\r\n                        value: \"locationStepRow\",\r\n                        example: locale_findAndReplace.locationExample,\r\n                    },\r\n                    {\r\n                        text: locale_findAndReplace.columnSpan,\r\n                        value: \"locationStepColumn\",\r\n                        example: locale_findAndReplace.locationExample,\r\n                    },\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { id: \"seachmore\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(180);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if (itemvalue == \"search\" || itemvalue == \"replace\") {\r\n                        //查找替换\r\n                        if (itemvalue == \"search\") {\r\n                            luckysheetSearchReplace.createDialog(0);\r\n                        } else if (itemvalue == \"replace\") {\r\n                            luckysheetSearchReplace.createDialog(1);\r\n                        }\r\n\r\n                        luckysheetSearchReplace.init();\r\n\r\n                        $(\"#luckysheet-search-replace #searchInput input\").focus();\r\n                    } else if (itemvalue == \"location\") {\r\n                        //定位条件\r\n                        luckysheetLocationCell.createDialog();\r\n                        luckysheetLocationCell.init();\r\n                    } else if (\r\n                        itemvalue == \"locationFormula\" ||\r\n                        itemvalue == \"locationConstantDate\" ||\r\n                        itemvalue == \"locationConstantNumber\" ||\r\n                        itemvalue == \"locationConstantString\" ||\r\n                        itemvalue == \"locationConstantError\" ||\r\n                        itemvalue == \"locationCF\"\r\n                    ) {\r\n                        let last = Store.luckysheet_select_save[0];\r\n\r\n                        let range;\r\n                        if (\r\n                            Store.luckysheet_select_save.length == 0 ||\r\n                            (Store.luckysheet_select_save.length == 1 &&\r\n                                last.row[0] == last.row[1] &&\r\n                                last.column[0] == last.column[1])\r\n                        ) {\r\n                            //单个单元格\r\n                            range = [\r\n                                { row: [0, Store.flowdata.length - 1], column: [0, Store.flowdata[0].length - 1] },\r\n                            ];\r\n                        } else {\r\n                            range = $.extend(true, [], Store.luckysheet_select_save);\r\n                        }\r\n\r\n                        if (itemvalue == \"locationFormula\") {\r\n                            //公式\r\n                            luckysheetLocationCell.apply(range, \"locationFormula\", \"all\");\r\n                        } else if (itemvalue == \"locationConstantDate\") {\r\n                            //日期\r\n                            luckysheetLocationCell.apply(range, \"locationConstant\", \"d\");\r\n                        } else if (itemvalue == \"locationConstantNumber\") {\r\n                            //数字\r\n                            luckysheetLocationCell.apply(range, \"locationConstant\", \"n\");\r\n                        } else if (itemvalue == \"locationConstantString\") {\r\n                            //字符\r\n                            luckysheetLocationCell.apply(range, \"locationConstant\", \"s,g\");\r\n                        } else if (itemvalue == \"locationConstantError\") {\r\n                            //错误\r\n                            luckysheetLocationCell.apply(range, \"locationConstant\", \"e\");\r\n                        } else if (itemvalue == \"locationCF\") {\r\n                            //条件格式\r\n                            luckysheetLocationCell.apply(range, \"locationCF\");\r\n                        }\r\n                    } else if (itemvalue == \"locationStepRow\") {\r\n                        //间隔行\r\n                        if (\r\n                            Store.luckysheet_select_save.length == 0 ||\r\n                            (Store.luckysheet_select_save.length == 1 &&\r\n                                Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1])\r\n                        ) {\r\n                            if (isEditMode()) {\r\n                                alert(locale_findAndReplace.lessTwoRowTip);\r\n                            } else {\r\n                                tooltip.info(\"\", locale_findAndReplace.lessTwoRowTip);\r\n                            }\r\n                            return;\r\n                        }\r\n\r\n                        let range = $.extend(true, [], Store.luckysheet_select_save);\r\n\r\n                        luckysheetLocationCell.apply(range, \"locationStepRow\");\r\n                    } else if (itemvalue == \"locationStepColumn\") {\r\n                        //间隔列\r\n                        if (\r\n                            Store.luckysheet_select_save.length == 0 ||\r\n                            (Store.luckysheet_select_save.length == 1 &&\r\n                                Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])\r\n                        ) {\r\n                            if (isEditMode()) {\r\n                                alert(locale_findAndReplace.lessTwoColumnTip);\r\n                            } else {\r\n                                tooltip.info(\"\", locale_findAndReplace.lessTwoColumnTip);\r\n                            }\r\n                            return;\r\n                        }\r\n\r\n                        let range = $.extend(true, [], Store.luckysheet_select_save);\r\n\r\n                        luckysheetLocationCell.apply(range, \"locationStepColumn\");\r\n                    }\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //公式\r\n        $(\"#luckysheet-icon-function\").click(function() {\r\n            _this.autoSelectionFormula(\"SUM\");\r\n        });\r\n\r\n        //公式菜单\r\n        $(\"#luckysheet-icon-function-menu\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            const _locale = locale();\r\n            const locale_formula = _locale.formula;\r\n\r\n            if ($menuButton.length == 0) {\r\n                let itemdata = [\r\n                    { text: locale_formula.sum, value: \"SUM\", example: \"SUM\" },\r\n                    { text: locale_formula.average, value: \"AVERAGE\", example: \"AVERAGE\" },\r\n                    { text: locale_formula.count, value: \"COUNT\", example: \"COUNT\" },\r\n                    { text: locale_formula.max, value: \"MAX\", example: \"MAX\" },\r\n                    { text: locale_formula.min, value: \"MIN\", example: \"MIN\" },\r\n                    { text: \"\", value: \"split\", example: \"\" },\r\n                    { text: locale_formula.ifGenerate, value: \"if\", example: \"IF\" },\r\n                    { text: locale_formula.find + \" ...\", value: \"formula\", example: \"\" },\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { id: \"function-menu\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(180);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if (itemvalue == \"if\") {\r\n                        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n                        let r = last[\"row_focus\"] == null ? last[\"row\"][0] : last[\"row_focus\"];\r\n                        let c = last[\"column_focus\"] == null ? last[\"column\"][0] : last[\"column_focus\"];\r\n\r\n                        if (!!Store.flowdata[r] && !!Store.flowdata[r][c] && !!Store.flowdata[r][c][\"f\"]) {\r\n                            let fp = Store.flowdata[r][c][\"f\"].toString();\r\n\r\n                            if (fp.indexOf(\"=if(\") != -1) {\r\n                                ifFormulaGenerator.ifFormulaDialog(fp);\r\n                            } else {\r\n                                if (isEditMode()) {\r\n                                    alert(locale_formula.tipNotBelongToIf);\r\n                                } else {\r\n                                    tooltip.info(locale_formula.tipNotBelongToIf, \"\");\r\n                                }\r\n                                return;\r\n                            }\r\n                        } else {\r\n                            ifFormulaGenerator.ifFormulaDialog();\r\n                        }\r\n\r\n                        ifFormulaGenerator.init();\r\n                    } else if (itemvalue == \"formula\") {\r\n                        //点击函数查找弹出框\r\n                        if (Store.luckysheet_select_save.length == 0) {\r\n                            if (isEditMode()) {\r\n                                alert(locale_formula.tipSelectCell);\r\n                            } else {\r\n                                tooltip.info(locale_formula.tipSelectCell, \"\");\r\n                            }\r\n\r\n                            return;\r\n                        }\r\n\r\n                        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n                        let row_index = last[\"row_focus\"],\r\n                            col_index = last[\"column_focus\"];\r\n\r\n                        luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n\r\n                        let cell = Store.flowdata[row_index][col_index];\r\n                        if (cell != null && cell.f != null) {\r\n                            //单元格有计算\r\n                            let functionStr = luckysheetformula.getfunctionParam(cell.f);\r\n                            if (functionStr.fn != null) {\r\n                                //有函数公式\r\n                                insertFormula.formulaParmDialog(functionStr.fn, functionStr.param);\r\n                            } else {\r\n                                //无函数公式\r\n                                insertFormula.formulaListDialog();\r\n                            }\r\n                        } else {\r\n                            //单元格无计算\r\n                            $(\"#luckysheet-rich-text-editor\").html(\r\n                                '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span>',\r\n                            );\r\n                            $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n                            insertFormula.formulaListDialog();\r\n                        }\r\n\r\n                        insertFormula.init();\r\n                    } else {\r\n                        _this.autoSelectionFormula(itemvalue);\r\n                    }\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft - 48, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //加粗\r\n        $(\"#luckysheet-icon-bold\")\r\n            .mousedown(function(e) {\r\n                hideMenuByCancel(e);\r\n                e.stopPropagation();\r\n            })\r\n            .click(function(e) {\r\n                let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n                let flag = checkTheStatusOfTheSelectedCells(\"bl\", 1);\r\n                let foucsStatus = flag ? 0 : 1;\r\n\r\n                _this.updateFormat(d, \"bl\", foucsStatus);\r\n            });\r\n\r\n        //斜体\r\n        $(\"#luckysheet-icon-italic\")\r\n            .mousedown(function(e) {\r\n                hideMenuByCancel(e);\r\n                e.stopPropagation();\r\n            })\r\n            .click(function() {\r\n                let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n                let flag = checkTheStatusOfTheSelectedCells(\"it\", 1);\r\n                let foucsStatus = flag ? 0 : 1;\r\n\r\n                _this.updateFormat(d, \"it\", foucsStatus);\r\n            });\r\n\r\n        //删除线\r\n        $(\"#luckysheet-icon-strikethrough\")\r\n            .mousedown(function(e) {\r\n                hideMenuByCancel(e);\r\n                e.stopPropagation();\r\n            })\r\n            .click(function() {\r\n                let d = editor.deepCopyFlowData(Store.flowdata);\r\n                let flag = checkTheStatusOfTheSelectedCells(\"cl\", 1);\r\n                let foucsStatus = flag ? 0 : 1;\r\n\r\n                _this.updateFormat(d, \"cl\", foucsStatus);\r\n            });\r\n\r\n        //下划线\r\n        $(\"#luckysheet-icon-underline\")\r\n            .mousedown(function(e) {\r\n                hideMenuByCancel(e);\r\n                e.stopPropagation();\r\n            })\r\n            .click(function() {\r\n                let d = editor.deepCopyFlowData(Store.flowdata);\r\n                let flag = checkTheStatusOfTheSelectedCells(\"un\", 1);\r\n                let foucsStatus = flag ? 0 : 1;\r\n\r\n                _this.updateFormat(d, \"un\", foucsStatus);\r\n            });\r\n\r\n        //条件格式\r\n        $(\"#luckysheet-icon-conditionformat\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            const conditionformat_text = locale().conditionformat;\r\n\r\n            if ($menuButton.length == 0) {\r\n                let itemdata = [\r\n                    { text: conditionformat_text.highlightCellRules, value: \"highlightCellRule\", example: \"more\" },\r\n                    { text: conditionformat_text.itemSelectionRules, value: \"projectSelectRule\", example: \"more\" },\r\n                    { text: conditionformat_text.dataBar, value: \"dataBar\", example: \"more\" },\r\n                    { text: conditionformat_text.colorGradation, value: \"colorGradation\", example: \"more\" },\r\n                    { text: conditionformat_text.icons, value: \"icons\", example: \"\" },\r\n                    { text: \"\", value: \"split\", example: \"\" },\r\n                    { text: conditionformat_text.newRule, value: \"newRule\", example: \"\" },\r\n                    { text: conditionformat_text.deleteRule, value: \"deleteRule\", example: \"more\" },\r\n                    { text: conditionformat_text.manageRules, value: \"administerRule\", example: \"\" },\r\n                ];\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n                let menu = replaceHtml(_this.menu, { id: \"conditionformat\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                //突出显示单元格规则子菜单\r\n                let subitemdata = [\r\n                    { text: conditionformat_text.greaterThan, value: \"greaterThan\", example: \">\" },\r\n                    { text: conditionformat_text.lessThan, value: \"lessThan\", example: \"<\" },\r\n                    { text: conditionformat_text.between, value: \"betweenness\", example: \"[]\" },\r\n                    { text: conditionformat_text.equal, value: \"equal\", example: \"=\" },\r\n                    { text: conditionformat_text.textContains, value: \"textContains\", example: \"()\" },\r\n                    {\r\n                        text: conditionformat_text.occurrence,\r\n                        value: \"occurrenceDate\",\r\n                        example: conditionformat_text.yesterday,\r\n                    },\r\n                    { text: conditionformat_text.duplicateValue, value: \"duplicateValue\", example: \"##\" },\r\n                ];\r\n                let subitemset = _this.createButtonMenu(subitemdata);\r\n                let submenu = replaceHtml(_this.menu, {\r\n                    id: \"highlightCellRule\",\r\n                    item: subitemset,\r\n                    subclass: \"luckysheet-menuButton-sub\",\r\n                });\r\n\r\n                //项目选取规则子菜单\r\n                let subitemdata2 = [\r\n                    { text: conditionformat_text.top10, value: \"top10\", example: conditionformat_text.top10 },\r\n                    {\r\n                        text: conditionformat_text.top10_percent,\r\n                        value: \"top10%\",\r\n                        example: conditionformat_text.top10_percent,\r\n                    },\r\n                    { text: conditionformat_text.last10, value: \"last10\", example: conditionformat_text.last10 },\r\n                    {\r\n                        text: conditionformat_text.last10_percent,\r\n                        value: \"last10%\",\r\n                        example: conditionformat_text.last10_percent,\r\n                    },\r\n                    {\r\n                        text: conditionformat_text.aboveAverage,\r\n                        value: \"AboveAverage\",\r\n                        example: conditionformat_text.above,\r\n                    },\r\n                    {\r\n                        text: conditionformat_text.belowAverage,\r\n                        value: \"SubAverage\",\r\n                        example: conditionformat_text.below,\r\n                    },\r\n                ];\r\n                let subitemset2 = _this.createButtonMenu(subitemdata2);\r\n                let submenu2 = replaceHtml(_this.menu, {\r\n                    id: \"projectSelectRule\",\r\n                    item: subitemset2,\r\n                    subclass: \"luckysheet-menuButton-sub\",\r\n                });\r\n\r\n                //数据条子菜单\r\n                let submenu3 = `<div id=\"luckysheet-icon-dataBar-menuButton\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-menuButton luckysheet-menuButton-sub luckysheet-mousedown-cancel\" style=\"width: 126px;padding: 5px;top: 118.5px;left: 1321.48px;display: none;\">\r\n                                    <div itemvalue=\"0\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 0;\" title=\"${conditionformat_text.gradientDataBar_1}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"1\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px 0;\" title=\"${conditionformat_text.gradientDataBar_2}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"2\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px 0;\" title=\"${conditionformat_text.gradientDataBar_3}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"3\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 -36px;\" title=\"${conditionformat_text.gradientDataBar_4}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"4\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px -36px;\" title=\"${conditionformat_text.gradientDataBar_5}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"5\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px -36px;\" title=\"${conditionformat_text.gradientDataBar_6}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"6\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 -72px;\" title=\"${conditionformat_text.solidColorDataBar_1}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"7\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px -72px;\" title=\"${conditionformat_text.solidColorDataBar_2}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"8\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px -72px;\" title=\"${conditionformat_text.solidColorDataBar_3}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"9\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 -108px;\" title=\"${conditionformat_text.solidColorDataBar_4}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"10\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px -108px;\" title=\"${conditionformat_text.solidColorDataBar_5}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"11\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px -108px;\" title=\"${conditionformat_text.solidColorDataBar_6}\"></div>\r\n                                    </div>\r\n                                </div>`;\r\n\r\n                //色阶\r\n                let submenu4 = `<div id=\"luckysheet-icon-colorGradation-menuButton\" class=\"luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-menuButton luckysheet-menuButton-sub luckysheet-mousedown-cancel\" style=\"width: 126px;padding: 5px;top: 143.5px;left: 1321.48px;display: none;\">\r\n                                    <div itemvalue=\"0\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 0;\" title=\"${conditionformat_text.colorGradation_1}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"1\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px 0;\" title=\"${conditionformat_text.colorGradation_2}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"2\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px 0;\" title=\"${conditionformat_text.colorGradation_3}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"3\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -114px 0;\" title=\"${conditionformat_text.colorGradation_4}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"4\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 -36px;\" title=\"${conditionformat_text.colorGradation_5}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"5\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px -36px;\" title=\"${conditionformat_text.colorGradation_6}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"6\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px -36px;\" title=\"${conditionformat_text.colorGradation_7}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"7\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -114px -36px;\" title=\"${conditionformat_text.colorGradation_8}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"8\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: 0 -72px;\" title=\"${conditionformat_text.colorGradation_9}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"9\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -38px -72px;\" title=\"${conditionformat_text.colorGradation_10}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"10\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -76px -72px;\" title=\"${conditionformat_text.colorGradation_11}\"></div>\r\n                                    </div>\r\n                                    <div itemvalue=\"11\" class=\"luckysheet-cols-menuitem luckysheet-mousedown-cancel\" style=\"width: 28px; height: 26px;padding: 5px;float: left;\">\r\n                                        <div class=\"luckysheet-mousedown-cancel bgImgBox\" style=\"background-position: -114px -72px;\" title=\"${conditionformat_text.colorGradation_12}\"></div>\r\n                                    </div>\r\n                                </div>`;\r\n\r\n                //清除规则子菜单\r\n                let subitemdata6 = [{ text: conditionformat_text.deleteSheetRule, value: \"delSheet\", example: \"\" }];\r\n                let subitemset6 = _this.createButtonMenu(subitemdata6);\r\n                let submenu6 = replaceHtml(_this.menu, {\r\n                    id: \"deleteRule\",\r\n                    item: subitemset6,\r\n                    subclass: \"luckysheet-menuButton-sub\",\r\n                });\r\n\r\n                $(\"body\").append(menu + submenu + submenu2 + submenu3 + submenu4 + submenu6);\r\n                $menuButton = $(\"#\" + menuButtonId).width(190);\r\n                $(\"#luckysheet-icon-highlightCellRule-menuButton\").width(160);\r\n                $(\"#luckysheet-icon-projectSelectRule-menuButton\").width(180);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if (itemvalue == \"icons\") {\r\n                        if (Store.luckysheet_select_save.length == 0) {\r\n                            if (isEditMode()) {\r\n                                alert(conditionformat_text.pleaseSelectRange);\r\n                            } else {\r\n                                tooltip.info(conditionformat_text.pleaseSelectRange, \"\");\r\n                            }\r\n                            return;\r\n                        }\r\n\r\n                        conditionformat.CFiconsDialog();\r\n                        conditionformat.init();\r\n                    } else if (itemvalue == \"newRule\") {\r\n                        if (Store.luckysheet_select_save.length == 0) {\r\n                            if (isEditMode()) {\r\n                                alert(conditionformat_text.pleaseSelectRange);\r\n                            } else {\r\n                                tooltip.info(conditionformat_text.pleaseSelectRange, \"\");\r\n                            }\r\n                            return;\r\n                        }\r\n\r\n                        conditionformat.newConditionRuleDialog(0);\r\n                        conditionformat.init();\r\n                    } else if (itemvalue == \"administerRule\") {\r\n                        let loadSheetUrl = server.loadSheetUrl;\r\n                        let file = getluckysheetfile();\r\n\r\n                        if (loadSheetUrl != \"\" && loadSheetUrl != null) {\r\n                            let sheetindex = [];\r\n                            for (let i = 0; i < file.length; i++) {\r\n                                sheetindex.push(file[i].index);\r\n                            }\r\n\r\n                            $.post(loadSheetUrl, { gridKey: server.gridKey, index: sheetindex.join(\",\") }, function(d) {\r\n                                let dataset = new Function(\"return \" + d)();\r\n\r\n                                setTimeout(function() {\r\n                                    Store.loadingObj.close();\r\n                                }, 500);\r\n\r\n                                for (let item in dataset) {\r\n                                    if (item == Store.currentSheetIndex) {\r\n                                        continue;\r\n                                    }\r\n\r\n                                    let otherfile = file[getSheetIndex(item)];\r\n\r\n                                    otherfile.celldata = dataset[item.toString()];\r\n                                    otherfile[\"data\"] = sheetmanage.buildGridData(otherfile);\r\n                                }\r\n\r\n                                setluckysheetfile(file);\r\n\r\n                                conditionformat.fileClone = $.extend(true, [], file);\r\n                                conditionformat.administerRuleDialog();\r\n                                conditionformat.init();\r\n                            });\r\n                        } else {\r\n                            conditionformat.fileClone = $.extend(true, [], file);\r\n                            conditionformat.administerRuleDialog();\r\n                            conditionformat.init();\r\n                        }\r\n                    }\r\n                });\r\n\r\n                //突出显示单元格规则子菜单点击事件\r\n                $(document)\r\n                    .off(\"click.CFhighlightCellRule\")\r\n                    .on(\r\n                        \"click.CFhighlightCellRule\",\r\n                        \"#luckysheet-icon-highlightCellRule-menuButton .luckysheet-cols-menuitem\",\r\n                        function() {\r\n                            $menuButton.hide();\r\n                            $(\"#luckysheet-icon-highlightCellRule-menuButton\").hide();\r\n                            luckysheetContainerFocus();\r\n\r\n                            let $t = $(this),\r\n                                itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                            if (Store.luckysheet_select_save.length == 0) {\r\n                                if (isEditMode()) {\r\n                                    alert(conditionformat_text.pleaseSelectRange);\r\n                                } else {\r\n                                    tooltip.info(conditionformat_text.pleaseSelectRange, \"\");\r\n                                }\r\n                                return;\r\n                            } else {\r\n                                let textCellColorHtml = conditionformat.textCellColorHtml();\r\n\r\n                                let title, content;\r\n                                switch (itemvalue) {\r\n                                    case \"greaterThan\":\r\n                                        title = conditionformat_text.conditionformat_greaterThan;\r\n                                        content = `<div class=\"box\" data-itemvalue=\"greaterThan\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_greaterThan_title}：</div>\r\n                                                <div class=\"inpbox range\">\r\n                                                    <input id=\"conditionVal\" class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_text.selectCell}\"></i>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}：</div> \r\n                                                ${textCellColorHtml} \r\n                                            </div>`;\r\n                                        break;\r\n                                    case \"lessThan\":\r\n                                        title = conditionformat_text.conditionformat_lessThan;\r\n                                        content = `<div class=\"box\" data-itemvalue=\"lessThan\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_lessThan_title}：</div>\r\n                                                <div class=\"inpbox range\">\r\n                                                    <input id=\"conditionVal\" class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_text.selectCell}\"></i>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}：</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                        break;\r\n                                    case \"betweenness\":\r\n                                        title = conditionformat_text.conditionformat_betweenness;\r\n                                        content = `<div class=\"box\" data-itemvalue=\"betweenness\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_betweenness_title}：</div>\r\n                                                <div style=\"height: 30px;line-height: 30px;\">\r\n                                                    <div class=\"inpbox2 range\">\r\n                                                        <input id=\"conditionVal\" class=\"formulaInputFocus\"/>\r\n                                                        <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_text.selectCell}\"></i>\r\n                                                    </div>\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.to}</div>\r\n                                                    <div class=\"inpbox2 range\">\r\n                                                        <input id=\"conditionVal2\" class=\"formulaInputFocus\"/>\r\n                                                        <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_text.selectCell}\"></i>\r\n                                                    </div>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}：</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                        break;\r\n                                    case \"equal\":\r\n                                        title = conditionformat_text.conditionformat_equal;\r\n                                        content = `<div class=\"box\" data-itemvalue=\"equal\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_equal_title}：</div>\r\n                                                <div class=\"inpbox range\">\r\n                                                    <input id=\"conditionVal\" class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_text.selectCell}\"></i>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}：</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                        break;\r\n                                    case \"textContains\":\r\n                                        title = conditionformat_text.conditionformat_textContains;\r\n                                        content = `<div class=\"box\" data-itemvalue=\"textContains\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_textContains_title}：</div>\r\n                                                <div class=\"inpbox range\">\r\n                                                    <input id=\"conditionVal\" class=\"formulaInputFocus\"/>\r\n                                                    <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${conditionformat_text.selectCell}\"></i>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}：</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                        break;\r\n                                    case \"occurrenceDate\":\r\n                                        title = conditionformat_text.conditionformat_occurrenceDate;\r\n                                        content = `<div class=\"box\" data-itemvalue=\"occurrenceDate\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_occurrenceDate_title}：</div>\r\n                                                <div class=\"inpbox\">\r\n                                                    <input id=\"daterange-btn\" class=\"formulaInputFocus\" readonly=\"readonly\" placeholder=\"${conditionformat_text.pleaseSelectADate}\"/>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}：</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                        break;\r\n                                    case \"duplicateValue\":\r\n                                        title = conditionformat_text.conditionformat_duplicateValue;\r\n                                        content = `<div class=\"box\" data-itemvalue=\"duplicateValue\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_duplicateValue_title}：</div>\r\n                                                <select id=\"conditionVal\" class=\"selectbox\">\r\n                                                    <option value=\"0\">${conditionformat_text.duplicateValue}</option>\r\n                                                    <option value=\"1\">${conditionformat_text.uniqueValue}</option>\r\n                                                </select>\r\n                                                <div style=\"margin:5px 0;\">${conditionformat_text.setAs}：</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                        break;\r\n                                }\r\n\r\n                                conditionformat.conditionformatDialog(title, content);\r\n                            }\r\n                        },\r\n                    );\r\n\r\n                //项目选取规则子菜单点击事件\r\n                $(document)\r\n                    .off(\"click.CFprojectSelectRule\")\r\n                    .on(\r\n                        \"click.CFprojectSelectRule\",\r\n                        \"#luckysheet-icon-projectSelectRule-menuButton .luckysheet-cols-menuitem\",\r\n                        function() {\r\n                            $menuButton.hide();\r\n                            $(\"#luckysheet-icon-projectSelectRule-menuButton\").hide();\r\n                            luckysheetContainerFocus();\r\n\r\n                            let $t = $(this),\r\n                                itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                            if (Store.luckysheet_select_save.length == 0) {\r\n                                if (isEditMode()) {\r\n                                    alert(conditionformat_text.pleaseSelectRange);\r\n                                } else {\r\n                                    tooltip.info(conditionformat_text.pleaseSelectRange, \"\");\r\n                                }\r\n                                return;\r\n                            } else {\r\n                                let textCellColorHtml = conditionformat.textCellColorHtml();\r\n\r\n                                let title, content;\r\n                                switch (itemvalue) {\r\n                                    case \"top10\":\r\n                                        title = conditionformat_text.conditionformat_top10;\r\n                                        content = `<div class=\"box\" data-itemvalue=\"top10\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_top10_title}：</div>\r\n                                                <div style=\"height: 30px;line-height: 30px;\">\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.top}</div>\r\n                                                    <div class=\"inpbox2\">\r\n                                                        <input id=\"conditionVal\" class=\"formulaInputFocus\" type=\"number\" value=\"10\"/>\r\n                                                    </div>\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.oneself}</div>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}：</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                        break;\r\n                                    case \"top10%\":\r\n                                        title = conditionformat_text.conditionformat_top10_percent;\r\n                                        content = `<div class=\"box\" data-itemvalue=\"top10%\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_top10_title}：</div>\r\n                                                <div style=\"height: 30px;line-height: 30px;\">\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.top}</div>\r\n                                                    <div class=\"inpbox2\">\r\n                                                        <input id=\"conditionVal\" class=\"formulaInputFocus\" type=\"number\" value=\"10\"/>\r\n                                                    </div>\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">%</div>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}：</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                        break;\r\n                                    case \"last10\":\r\n                                        title = conditionformat_text.conditionformat_last10;\r\n                                        content = `<div class=\"box\" data-itemvalue=\"last10\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_last10_title}：</div>\r\n                                                <div style=\"height: 30px;line-height: 30px;\">\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.last}</div>\r\n                                                    <div class=\"inpbox2\">\r\n                                                        <input id=\"conditionVal\" class=\"formulaInputFocus\" type=\"number\" value=\"10\"/>\r\n                                                    </div>\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.oneself}</div>\r\n                                                </div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAs}：</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                        break;\r\n                                    case \"last10%\":\r\n                                        title = conditionformat_text.conditionformat_last10_percent;\r\n                                        content = `<div class=\"box\" data-itemvalue=\"last10%\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_last10_title}：</div>\r\n                                                <div style=\"height: 30px;line-height: 30px;\">\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">${conditionformat_text.last}</div>\r\n                                                    <div class=\"inpbox2\">\r\n                                                        <input id=\"conditionVal\" class=\"formulaInputFocus\" type=\"number\" value=\"10\"/>\r\n                                                    </div>\r\n                                                    <div style=\"float: left;height: 30px;line-height: 30px;margin: 0 5px;\">%</div>\r\n                                                </div>\r\n                                                <div style=\"margin:5px 0;\">设置为：</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                        break;\r\n                                    case \"AboveAverage\":\r\n                                        title = conditionformat_text.conditionformat_AboveAverage;\r\n                                        content = `<div class=\"box\" data-itemvalue=\"AboveAverage\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_AboveAverage_title}：</div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAsByArea}：</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                        break;\r\n                                    case \"SubAverage\":\r\n                                        title = conditionformat_text.conditionformat_SubAverage;\r\n                                        content = `<div class=\"box\" data-itemvalue=\"SubAverage\">\r\n                                                <div class=\"boxTitleOne\">${conditionformat_text.conditionformat_SubAverage_title}：</div>\r\n                                                <div style=\"margin: 5px 0;\">${conditionformat_text.setAsByArea}：</div>\r\n                                                ${textCellColorHtml}\r\n                                            </div>`;\r\n                                        break;\r\n                                }\r\n\r\n                                conditionformat.conditionformatDialog(title, content);\r\n                            }\r\n                        },\r\n                    );\r\n\r\n                //数据条子菜单点击事件\r\n                $(document)\r\n                    .off(\"click.CFdataBar\")\r\n                    .on(\"click.CFdataBar\", \"#luckysheet-icon-dataBar-menuButton .luckysheet-cols-menuitem\", function() {\r\n                        $menuButton.hide();\r\n                        $(\"#luckysheet-icon-dataBar-menuButton\").hide();\r\n                        luckysheetContainerFocus();\r\n\r\n                        let $t = $(this),\r\n                            itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                        if (Store.luckysheet_select_save.length > 0) {\r\n                            let cellrange = $.extend(true, [], Store.luckysheet_select_save);\r\n                            let format = conditionformat.dataBarList[itemvalue][\"format\"];\r\n\r\n                            conditionformat.updateItem(\"dataBar\", cellrange, format);\r\n                        }\r\n                    });\r\n\r\n                //色阶子菜单点击事件\r\n                $(document)\r\n                    .off(\"click.CFcolorGradation\")\r\n                    .on(\r\n                        \"click.CFcolorGradation\",\r\n                        \"#luckysheet-icon-colorGradation-menuButton .luckysheet-cols-menuitem\",\r\n                        function() {\r\n                            $menuButton.hide();\r\n                            $(\"#luckysheet-icon-colorGradation-menuButton\").hide();\r\n                            luckysheetContainerFocus();\r\n\r\n                            let $t = $(this),\r\n                                itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                            if (Store.luckysheet_select_save.length > 0) {\r\n                                let cellrange = $.extend(true, [], Store.luckysheet_select_save);\r\n                                let format = conditionformat.colorGradationList[itemvalue][\"format\"];\r\n\r\n                                conditionformat.updateItem(\"colorGradation\", cellrange, format);\r\n                            }\r\n                        },\r\n                    );\r\n\r\n                //清除规则子菜单点击事件\r\n                $(document)\r\n                    .off(\"click.CFdeleteRule\")\r\n                    .on(\r\n                        \"click.CFdeleteRule\",\r\n                        \"#luckysheet-icon-deleteRule-menuButton .luckysheet-cols-menuitem\",\r\n                        function() {\r\n                            $menuButton.hide();\r\n                            $(\"#luckysheet-icon-deleteRule-menuButton\").hide();\r\n                            luckysheetContainerFocus();\r\n\r\n                            let $t = $(this),\r\n                                itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                            if (itemvalue == \"delSheet\") {\r\n                                conditionformat.updateItem(\"delSheet\");\r\n                            }\r\n                        },\r\n                    );\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //批注\r\n        $(\"#luckysheet-icon-postil\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n\r\n            const locale_comment = locale().comment;\r\n\r\n            $menuButton.remove();\r\n\r\n            // if($menuButton.length == 0){\r\n            luckysheetPostil.removeActivePs();\r\n\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n            let row_index = last[\"row_focus\"];\r\n            if (row_index == null) {\r\n                row_index = last[\"row\"][0];\r\n            }\r\n\r\n            let col_index = last[\"column_focus\"];\r\n            if (col_index == null) {\r\n                col_index = last[\"column\"][0];\r\n            }\r\n\r\n            let itemdata;\r\n            if (Store.flowdata[row_index][col_index] != null && Store.flowdata[row_index][col_index].ps != null) {\r\n                itemdata = [\r\n                    { text: locale_comment.edit, value: \"editPs\", example: \"\" },\r\n                    { text: locale_comment.delete, value: \"delPs\", example: \"\" },\r\n                    { text: \"\", value: \"split\", example: \"\" },\r\n                    { text: locale_comment.showOne, value: \"showHidePs\", example: \"\" },\r\n                    { text: locale_comment.showAll, value: \"showHideAllPs\", example: \"\" },\r\n                ];\r\n            } else {\r\n                itemdata = [\r\n                    { text: locale_comment.insert, value: \"newPs\", example: \"\" },\r\n                    { text: \"\", value: \"split\", example: \"\" },\r\n                    { text: locale_comment.showAll, value: \"showHideAllPs\", example: \"\" },\r\n                ];\r\n            }\r\n\r\n            let itemset = _this.createButtonMenu(itemdata);\r\n            let menu = replaceHtml(_this.menu, { id: \"postil\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n            $(\"body\").append(menu);\r\n            $menuButton = $(\"#\" + menuButtonId).width(150);\r\n\r\n            $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                $menuButton.hide();\r\n                luckysheetContainerFocus();\r\n\r\n                let $t = $(this),\r\n                    itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                if (itemvalue == \"newPs\") {\r\n                    luckysheetPostil.newPs(row_index, col_index);\r\n                } else if (itemvalue == \"editPs\") {\r\n                    luckysheetPostil.editPs(row_index, col_index);\r\n                } else if (itemvalue == \"delPs\") {\r\n                    luckysheetPostil.delPs(row_index, col_index);\r\n                } else if (itemvalue == \"showHidePs\") {\r\n                    luckysheetPostil.showHidePs(row_index, col_index);\r\n                } else if (itemvalue == \"showHideAllPs\") {\r\n                    luckysheetPostil.showHideAllPs();\r\n                }\r\n            });\r\n            // }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        //sheet protection\r\n        $(\"#luckysheet-icon-protection\").click(function() {\r\n            let sheetFile = sheetmanage.getSheetByIndex();\r\n            openProtectionModal(sheetFile);\r\n        });\r\n\r\n        //print\r\n        $(\"#luckysheet-icon-print\").click(function() {\r\n            let menuButtonId = $(this).attr(\"id\") + \"-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            const _locale = locale();\r\n            const locale_print = _locale.print;\r\n            if ($menuButton.length == 0) {\r\n                let itemdata = [\r\n                    {\r\n                        text: locale_print.menuItemPrint,\r\n                        value: \"print\",\r\n                        example: '<i class=\"iconfont-luckysheet luckysheet-iconfont-dayin\" aria-hidden=\"true\"></i>',\r\n                    },\r\n                    { text: \"\", value: \"split\", example: \"\" },\r\n                    {\r\n                        text: locale_print.menuItemAreas,\r\n                        value: \"areas\",\r\n                        example: '<i class=\"iconfont-luckysheet luckysheet-iconfont-tihuan\" aria-hidden=\"true\"></i>',\r\n                    },\r\n                    {\r\n                        text: locale_print.menuItemRows,\r\n                        value: \"rows\",\r\n                        example: '<i class=\"iconfont-luckysheet luckysheet-iconfont-zhuandao1\" aria-hidden=\"true\"></i>',\r\n                    },\r\n                    {\r\n                        text: locale_print.menuItemColumns,\r\n                        value: \"columns\",\r\n                        example: '<i class=\"iconfont-luckysheet luckysheet-iconfont-dingwei\" aria-hidden=\"true\"></i>',\r\n                    },\r\n                ];\r\n\r\n                let itemset = _this.createButtonMenu(itemdata);\r\n\r\n                let menu = replaceHtml(_this.menu, { id: \"print\", item: itemset, subclass: \"\", sub: \"\" });\r\n\r\n                $(\"body\").append(menu);\r\n                $menuButton = $(\"#\" + menuButtonId).width(180);\r\n\r\n                $menuButton.find(\".luckysheet-cols-menuitem\").click(function() {\r\n                    $menuButton.hide();\r\n                    luckysheetContainerFocus();\r\n\r\n                    let $t = $(this),\r\n                        itemvalue = $t.attr(\"itemvalue\");\r\n\r\n                    if (itemvalue == \"print\") {\r\n                        //Print config\r\n                        if (Store.luckysheetPrint) {\r\n                            luckysheetPrint = Store.luckysheetPrint;\r\n                            const plugin = Store.plugins.find((item) => item.name === \"print\");\r\n                            if (plugin && plugin.config) {\r\n                                luckysheetPrint.createDialog();\r\n                                luckysheetPrint.init(plugin.config.license);\r\n                            }\r\n                        }\r\n                    } else if (itemvalue == \"areas\" || itemvalue == \"rows\" || itemvalue == \"columns\") {\r\n                        //range\r\n                        alert(\"areas\");\r\n                    }\r\n                });\r\n            }\r\n\r\n            let userlen = $(this).outerWidth();\r\n            let tlen = $menuButton.outerWidth();\r\n\r\n            let menuleft = $(this).offset().left;\r\n            if (tlen > userlen && tlen + menuleft > $(\"#\" + Store.container).width()) {\r\n                menuleft = menuleft - tlen + userlen;\r\n            }\r\n            mouseclickposition($menuButton, menuleft, $(this).offset().top + 25, \"lefttop\");\r\n        });\r\n\r\n        $(\"body\")\r\n            .on(\"mouseover mouseleave\", \".luckysheet-menuButton .luckysheet-cols-submenu\", function(e) {\r\n                let $t = $(this),\r\n                    attrid = $t.attr(\"itemvalue\"),\r\n                    $attr = $(\"#luckysheet-icon-\" + attrid + \"-menuButton\");\r\n\r\n                if (e.type === \"mouseover\") {\r\n                    let $con = $t.parent();\r\n                    let winW = $(window).width(),\r\n                        winH = $(window).height();\r\n                    let menuW = $con.width(),\r\n                        attrH = $attr.height() + 25,\r\n                        attrW = $attr.width() + 5;\r\n                    let offset = $t.offset();\r\n                    let top = offset.top,\r\n                        left = offset.left + menuW;\r\n\r\n                    if (left + attrW > winW) {\r\n                        left = offset.left - attrW;\r\n                    }\r\n\r\n                    if (top + attrH > winH) {\r\n                        top = winH - attrH;\r\n                    }\r\n\r\n                    $attr.css({ top: top, left: left }).show();\r\n                    _this.rightclickmenu = $t;\r\n                } else {\r\n                    clearTimeout(_this.submenuhide[$attr.attr(\"id\")]);\r\n                    _this.submenuhide[$attr.attr(\"id\")] = setTimeout(function() {\r\n                        $attr.hide();\r\n                    }, 200);\r\n                }\r\n            })\r\n            .on(\"mouseover mouseleave\", \".luckysheet-menuButton-sub\", function(e) {\r\n                if (e.type === \"mouseover\") {\r\n                    _this.rightclickmenu.addClass(\"luckysheet-cols-menuitem-hover\");\r\n                    clearTimeout(_this.submenuhide[$(this).attr(\"id\")]);\r\n                } else {\r\n                    _this.rightclickmenu.removeClass(\"luckysheet-cols-menuitem-hover\");\r\n                    $(this).hide();\r\n                }\r\n            });\r\n    },\r\n    getQKBorder: function(width, type, color) {\r\n        let bordertype = \"\";\r\n\r\n        if (width.indexOf(\"pt\") > -1) {\r\n            width = parseFloat(width);\r\n\r\n            if (width < 1) {\r\n            } else if (width < 1.5) {\r\n                bordertype = \"Medium\";\r\n            } else {\r\n                bordertype = \"Thick\";\r\n            }\r\n        } else {\r\n            width = parseFloat(width);\r\n\r\n            if (width < 2) {\r\n            } else if (width < 3) {\r\n                bordertype = \"Medium\";\r\n            } else {\r\n                bordertype = \"Thick\";\r\n            }\r\n        }\r\n\r\n        let style = 0;\r\n        type = type.toLowerCase();\r\n\r\n        if (type == \"double\") {\r\n            style = 2;\r\n        } else if (type == \"dotted\") {\r\n            if (bordertype == \"Medium\" || bordertype == \"Thick\") {\r\n                style = 3;\r\n            } else {\r\n                style = 10;\r\n            }\r\n        } else if (type == \"dashed\") {\r\n            if (bordertype == \"Medium\" || bordertype == \"Thick\") {\r\n                style = 4;\r\n            } else {\r\n                style = 9;\r\n            }\r\n        } else if (type == \"solid\") {\r\n            if (bordertype == \"Medium\") {\r\n                style = 8;\r\n            } else if (bordertype == \"Thick\") {\r\n                style = 13;\r\n            } else {\r\n                style = 1;\r\n            }\r\n        }\r\n\r\n        return [style, color];\r\n    },\r\n    updateFormatCell: function(d, attr, foucsStatus, row_st, row_ed, col_st, col_ed) {\r\n        if (d == null || attr == null) {\r\n            return;\r\n        }\r\n        if (attr == \"ct\") {\r\n            for (let r = row_st; r <= row_ed; r++) {\r\n                if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                    continue;\r\n                }\r\n\r\n                for (let c = col_st; c <= col_ed; c++) {\r\n                    let cell = d[r][c],\r\n                        value = null;\r\n\r\n                    if (getObjType(cell) == \"object\") {\r\n                        value = d[r][c][\"v\"];\r\n                    } else {\r\n                        value = d[r][c];\r\n                    }\r\n\r\n                    if (foucsStatus != \"@\" && isRealNum(value)) {\r\n                        value = parseFloat(value);\r\n                    }\r\n\r\n                    let mask = update(foucsStatus, value);\r\n                    let type = \"n\";\r\n\r\n                    if (\r\n                        is_date(foucsStatus) ||\r\n                        foucsStatus === 14 ||\r\n                        foucsStatus === 15 ||\r\n                        foucsStatus === 16 ||\r\n                        foucsStatus === 17 ||\r\n                        foucsStatus === 18 ||\r\n                        foucsStatus === 19 ||\r\n                        foucsStatus === 20 ||\r\n                        foucsStatus === 21 ||\r\n                        foucsStatus === 22 ||\r\n                        foucsStatus === 45 ||\r\n                        foucsStatus === 46 ||\r\n                        foucsStatus === 47\r\n                    ) {\r\n                        type = \"d\";\r\n                    } else if (foucsStatus == \"@\" || foucsStatus === 49) {\r\n                        type = \"s\";\r\n                    } else if (foucsStatus == \"General\" || foucsStatus === 0) {\r\n                        // type = \"g\";\r\n                        type = isRealNum(value) ? \"n\" : \"g\";\r\n                    }\r\n\r\n                    if (getObjType(cell) == \"object\") {\r\n                        d[r][c][\"m\"] = mask;\r\n                        if (d[r][c][\"ct\"] == null) {\r\n                            d[r][c][\"ct\"] = {};\r\n                        }\r\n                        d[r][c][\"ct\"][\"fa\"] = foucsStatus;\r\n                        d[r][c][\"ct\"][\"t\"] = type;\r\n                    } else {\r\n                        d[r][c] = { ct: { fa: foucsStatus, t: type }, v: value, m: mask };\r\n                    }\r\n                }\r\n            }\r\n        } else {\r\n            if (attr == \"ht\") {\r\n                if (foucsStatus == \"left\") {\r\n                    foucsStatus = \"1\";\r\n                } else if (foucsStatus == \"center\") {\r\n                    foucsStatus = \"0\";\r\n                } else if (foucsStatus == \"right\") {\r\n                    foucsStatus = \"2\";\r\n                }\r\n            } else if (attr == \"vt\") {\r\n                if (foucsStatus == \"top\") {\r\n                    foucsStatus = \"1\";\r\n                } else if (foucsStatus == \"middle\") {\r\n                    foucsStatus = \"0\";\r\n                } else if (foucsStatus == \"bottom\") {\r\n                    foucsStatus = \"2\";\r\n                }\r\n            } else if (attr == \"tb\") {\r\n                if (foucsStatus == \"overflow\") {\r\n                    foucsStatus = \"1\";\r\n                } else if (foucsStatus == \"clip\") {\r\n                    foucsStatus = \"0\";\r\n                } else if (foucsStatus == \"wrap\") {\r\n                    foucsStatus = \"2\";\r\n                }\r\n            } else if (attr == \"tr\") {\r\n                if (foucsStatus == \"none\") {\r\n                    foucsStatus = \"0\";\r\n                } else if (foucsStatus == \"angleup\") {\r\n                    foucsStatus = \"1\";\r\n                } else if (foucsStatus == \"angledown\") {\r\n                    foucsStatus = \"2\";\r\n                } else if (foucsStatus == \"vertical\") {\r\n                    foucsStatus = \"3\";\r\n                } else if (foucsStatus == \"rotation-up\") {\r\n                    foucsStatus = \"4\";\r\n                } else if (foucsStatus == \"rotation-down\") {\r\n                    foucsStatus = \"5\";\r\n                }\r\n            }\r\n\r\n            for (let r = row_st; r <= row_ed; r++) {\r\n                if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                    continue;\r\n                }\r\n\r\n                for (let c = col_st; c <= col_ed; c++) {\r\n                    let value = d[r][c];\r\n\r\n                    if (getObjType(value) == \"object\") {\r\n                        // if(attr in inlineStyleAffectAttribute && isInlineStringCell(value)){\r\n                        updateInlineStringFormatOutside(value, attr, foucsStatus);\r\n                        // }\r\n                        // else{\r\n                        d[r][c][attr] = foucsStatus;\r\n                        // }\r\n                    } else {\r\n                        d[r][c] = { v: value };\r\n                        d[r][c][attr] = foucsStatus;\r\n                    }\r\n\r\n                    // if(attr == \"tr\" && d[r][c].tb != null){\r\n                    //     d[r][c].tb = \"0\";\r\n                    // }\r\n                }\r\n            }\r\n        }\r\n    },\r\n    updateFormat: function(d, attr, foucsStatus) {\r\n        let _this = this;\r\n\r\n        if (!checkProtectionFormatCells(Store.currentSheetIndex)) {\r\n            return;\r\n        }\r\n\r\n        // *如果禁止前台编辑，则中止下一步操作\r\n        if (!checkIsAllowEdit()) {\r\n            tooltip.info(\"\", locale().pivotTable.errorNotAllowEdit);\r\n            return;\r\n        }\r\n\r\n        let canvasElement = document.createElement(\"canvas\");\r\n        let canvas = canvasElement.getContext(\"2d\");\r\n\r\n        if (attr in inlineStyleAffectAttribute) {\r\n            if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0) {\r\n                let value = $(\"#luckysheet-input-box\").text();\r\n                if (value.substr(0, 1) != \"=\") {\r\n                    let cell = d[Store.luckysheetCellUpdate[0]][Store.luckysheetCellUpdate[1]];\r\n                    updateInlineStringFormat(cell, attr, foucsStatus, luckysheetformula.rangeResizeTo);\r\n                    // return;\r\n                }\r\n            }\r\n        }\r\n\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        if (cfg[\"rowlen\"] == null) {\r\n            cfg[\"rowlen\"] = {};\r\n        }\r\n\r\n        for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n            let row_st = Store.luckysheet_select_save[s][\"row\"][0],\r\n                row_ed = Store.luckysheet_select_save[s][\"row\"][1];\r\n            let col_st = Store.luckysheet_select_save[s][\"column\"][0],\r\n                col_ed = Store.luckysheet_select_save[s][\"column\"][1];\r\n\r\n            this.updateFormatCell(d, attr, foucsStatus, row_st, row_ed, col_st, col_ed);\r\n\r\n            if (attr == \"tb\" || attr == \"tr\" || attr == \"fs\") {\r\n                cfg = rowlenByRange(d, row_st, row_ed, cfg);\r\n            }\r\n        }\r\n\r\n        let allParam = {};\r\n        if (attr == \"tb\" || attr == \"tr\" || attr == \"fs\") {\r\n            allParam = {\r\n                cfg: cfg,\r\n                RowlChange: true,\r\n            };\r\n        }\r\n\r\n        jfrefreshgrid(d, Store.luckysheet_select_save, allParam, false);\r\n    },\r\n    updateFormat_mc: function(d, foucsStatus) {\r\n        // *如果禁止前台编辑，则中止下一步操作\r\n        if (!checkIsAllowEdit()) {\r\n            tooltip.info(\"\", locale().pivotTable.errorNotAllowEdit);\r\n            return;\r\n        }\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        if (cfg[\"merge\"] == null) {\r\n            cfg[\"merge\"] = {};\r\n        }\r\n\r\n        if (!checkProtectionNotEnable(Store.currentSheetIndex)) {\r\n            return;\r\n        }\r\n\r\n        if (foucsStatus == \"mergeCancel\") {\r\n            for (let i = 0; i < Store.luckysheet_select_save.length; i++) {\r\n                let range = Store.luckysheet_select_save[i];\r\n                let r1 = range[\"row\"][0],\r\n                    r2 = range[\"row\"][1];\r\n                let c1 = range[\"column\"][0],\r\n                    c2 = range[\"column\"][1];\r\n\r\n                if (r1 == r2 && c1 == c2) {\r\n                    continue;\r\n                }\r\n\r\n                let fv = {};\r\n\r\n                for (let r = r1; r <= r2; r++) {\r\n                    for (let c = c1; c <= c2; c++) {\r\n                        let cell = d[r][c];\r\n\r\n                        if (cell != null && cell.mc != null) {\r\n                            let mc_r = cell.mc.r,\r\n                                mc_c = cell.mc.c;\r\n\r\n                            if (\"rs\" in cell.mc) {\r\n                                delete cell.mc;\r\n                                delete cfg[\"merge\"][mc_r + \"_\" + mc_c];\r\n\r\n                                fv[mc_r + \"_\" + mc_c] = $.extend(true, {}, cell);\r\n                            } else {\r\n                                // let cell_clone = fv[mc_r + \"_\" + mc_c];\r\n                                let cell_clone = JSON.parse(JSON.stringify(fv[mc_r + \"_\" + mc_c]));\r\n\r\n                                delete cell_clone.v;\r\n                                delete cell_clone.m;\r\n                                delete cell_clone.ct;\r\n                                delete cell_clone.f;\r\n                                delete cell_clone.spl;\r\n\r\n                                d[r][c] = cell_clone;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        } else {\r\n            let isHasMc = false; //选区是否含有 合并的单元格\r\n\r\n            for (let i = 0; i < Store.luckysheet_select_save.length; i++) {\r\n                let range = Store.luckysheet_select_save[i];\r\n                let r1 = range[\"row\"][0],\r\n                    r2 = range[\"row\"][1];\r\n                let c1 = range[\"column\"][0],\r\n                    c2 = range[\"column\"][1];\r\n\r\n                for (let r = r1; r <= r2; r++) {\r\n                    for (let c = c1; c <= c2; c++) {\r\n                        let cell = d[r][c];\r\n\r\n                        if (getObjType(cell) == \"object\" && \"mc\" in cell) {\r\n                            isHasMc = true;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (isHasMc) {\r\n                //选区有合并单元格（选区都执行 取消合并）\r\n                for (let i = 0; i < Store.luckysheet_select_save.length; i++) {\r\n                    let range = Store.luckysheet_select_save[i];\r\n                    let r1 = range[\"row\"][0],\r\n                        r2 = range[\"row\"][1];\r\n                    let c1 = range[\"column\"][0],\r\n                        c2 = range[\"column\"][1];\r\n\r\n                    if (r1 == r2 && c1 == c2) {\r\n                        continue;\r\n                    }\r\n\r\n                    let fv = {};\r\n\r\n                    for (let r = r1; r <= r2; r++) {\r\n                        for (let c = c1; c <= c2; c++) {\r\n                            let cell = d[r][c];\r\n\r\n                            if (cell != null && cell.mc != null) {\r\n                                let mc_r = cell.mc.r,\r\n                                    mc_c = cell.mc.c;\r\n\r\n                                if (\"rs\" in cell.mc) {\r\n                                    delete cell.mc;\r\n                                    delete cfg[\"merge\"][mc_r + \"_\" + mc_c];\r\n\r\n                                    fv[mc_r + \"_\" + mc_c] = $.extend(true, {}, cell);\r\n                                } else {\r\n                                    // let cell_clone = fv[mc_r + \"_\" + mc_c];\r\n                                    let cell_clone = JSON.parse(JSON.stringify(fv[mc_r + \"_\" + mc_c]));\r\n\r\n                                    delete cell_clone.v;\r\n                                    delete cell_clone.m;\r\n                                    delete cell_clone.ct;\r\n                                    delete cell_clone.f;\r\n                                    delete cell_clone.spl;\r\n\r\n                                    d[r][c] = cell_clone;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            } else {\r\n                for (let i = 0; i < Store.luckysheet_select_save.length; i++) {\r\n                    let range = Store.luckysheet_select_save[i];\r\n                    let r1 = range[\"row\"][0],\r\n                        r2 = range[\"row\"][1];\r\n                    let c1 = range[\"column\"][0],\r\n                        c2 = range[\"column\"][1];\r\n\r\n                    if (r1 == r2 && c1 == c2) {\r\n                        continue;\r\n                    }\r\n\r\n                    if (foucsStatus == \"mergeAll\") {\r\n                        let fv = {},\r\n                            isfirst = false;\r\n\r\n                        for (let r = r1; r <= r2; r++) {\r\n                            for (let c = c1; c <= c2; c++) {\r\n                                let cell = d[r][c];\r\n\r\n                                if (\r\n                                    cell != null &&\r\n                                    (isInlineStringCT(cell.ct) || !isRealNull(cell.v) || cell.f != null) &&\r\n                                    !isfirst\r\n                                ) {\r\n                                    fv = $.extend(true, {}, cell);\r\n                                    isfirst = true;\r\n                                }\r\n\r\n                                d[r][c] = { mc: { r: r1, c: c1 } };\r\n                            }\r\n                        }\r\n\r\n                        d[r1][c1] = fv;\r\n                        d[r1][c1].mc = { r: r1, c: c1, rs: r2 - r1 + 1, cs: c2 - c1 + 1 };\r\n\r\n                        cfg[\"merge\"][r1 + \"_\" + c1] = { r: r1, c: c1, rs: r2 - r1 + 1, cs: c2 - c1 + 1 };\r\n                    } else if (foucsStatus == \"mergeV\") {\r\n                        for (let c = c1; c <= c2; c++) {\r\n                            let fv = {},\r\n                                isfirst = false;\r\n\r\n                            for (let r = r1; r <= r2; r++) {\r\n                                let cell = d[r][c];\r\n\r\n                                if (cell != null && (!isRealNull(cell.v) || cell.f != null) && !isfirst) {\r\n                                    fv = $.extend(true, {}, cell);\r\n                                    isfirst = true;\r\n                                }\r\n\r\n                                d[r][c] = { mc: { r: r1, c: c } };\r\n                            }\r\n\r\n                            d[r1][c] = fv;\r\n                            d[r1][c].mc = { r: r1, c: c, rs: r2 - r1 + 1, cs: 1 };\r\n\r\n                            cfg[\"merge\"][r1 + \"_\" + c] = { r: r1, c: c, rs: r2 - r1 + 1, cs: 1 };\r\n                        }\r\n                    } else if (foucsStatus == \"mergeH\") {\r\n                        for (let r = r1; r <= r2; r++) {\r\n                            let fv = {},\r\n                                isfirst = false;\r\n\r\n                            for (let c = c1; c <= c2; c++) {\r\n                                let cell = d[r][c];\r\n\r\n                                if (cell != null && (!isRealNull(cell.v) || cell.f != null) && !isfirst) {\r\n                                    fv = $.extend(true, {}, cell);\r\n                                    isfirst = true;\r\n                                }\r\n\r\n                                d[r][c] = { mc: { r: r, c: c1 } };\r\n                            }\r\n\r\n                            d[r][c1] = fv;\r\n                            d[r][c1].mc = { r: r, c: c1, rs: 1, cs: c2 - c1 + 1 };\r\n\r\n                            cfg[\"merge\"][r + \"_\" + c1] = { r: r, c: c1, rs: 1, cs: c2 - c1 + 1 };\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        const file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        const calc = file.calcChain?.filter(({ r, c }) => d[r][c]?.f);\r\n        const hyperlink =\r\n            file.hyperlink &&\r\n            Object.fromEntries(\r\n                Object.entries(file.hyperlink).filter(([r_c]) => {\r\n                    const [r, c] = r_c.split(\"_\");\r\n                    return d[r][c]?.v;\r\n                }),\r\n            );\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length = 0;\r\n            Store.jfredo.push({\r\n                type: \"mergeChange\",\r\n                sheetIndex: Store.currentSheetIndex,\r\n                data: Store.flowdata,\r\n                curData: d,\r\n                range: $.extend(true, [], Store.luckysheet_select_save),\r\n                config: $.extend(true, {}, Store.config),\r\n                curConfig: cfg,\r\n                calc: file.calcChain,\r\n                curCalc: calc,\r\n                hyperlink: file.hyperlink,\r\n                curHyperlink: hyperlink,\r\n            });\r\n        }\r\n\r\n        Store.clearjfundo = false;\r\n        jfrefreshgrid(d, Store.luckysheet_select_save, { cfg, calc, hyperlink });\r\n        Store.clearjfundo = true;\r\n    },\r\n    borderfix: function(d, r, c) {\r\n        // return [-1, -1, 2, 2];\r\n\r\n        let cell = d[r][c];\r\n        let bg = null;\r\n\r\n        if (cell == null) {\r\n            return [-1, 0, 0, -1];\r\n        } else if (d[r][c].bg == null || d[r][c].bg == \"\") {\r\n            return [-1, 0, 0, -1];\r\n        } else {\r\n            return [-2, -1, 1, 0];\r\n            //return [-2, -2, 1, 0];\r\n        }\r\n    },\r\n    changeMenuButtonDom: function(attr, foucsStatus, _locale) {\r\n        let _this = this;\r\n        if (_locale == null) {\r\n            _locale = locale();\r\n        }\r\n        const locale_fontarray = _locale.fontarray;\r\n        const locale_fontjson = _locale.fontjson;\r\n\r\n        if (attr == \"bl\") {\r\n            if (foucsStatus != \"0\") {\r\n                $(\"#luckysheet-icon-bold\").addClass(\"luckysheet-toolbar-button-hover\");\r\n            } else {\r\n                $(\"#luckysheet-icon-bold\").removeClass(\"luckysheet-toolbar-button-hover\");\r\n            }\r\n        } else if (attr == \"it\") {\r\n            if (foucsStatus != \"0\") {\r\n                $(\"#luckysheet-icon-italic\").addClass(\"luckysheet-toolbar-button-hover\");\r\n            } else {\r\n                $(\"#luckysheet-icon-italic\").removeClass(\"luckysheet-toolbar-button-hover\");\r\n            }\r\n        } else if (attr == \"cl\") {\r\n            if (foucsStatus != \"0\") {\r\n                $(\"#luckysheet-icon-strikethrough\").addClass(\"luckysheet-toolbar-button-hover\");\r\n            } else {\r\n                $(\"#luckysheet-icon-strikethrough\").removeClass(\"luckysheet-toolbar-button-hover\");\r\n            }\r\n        } else if (attr == \"un\") {\r\n            if (foucsStatus != \"0\") {\r\n                $(\"#luckysheet-icon-underline\").addClass(\"luckysheet-toolbar-button-hover\");\r\n            } else {\r\n                $(\"#luckysheet-icon-underline\").removeClass(\"luckysheet-toolbar-button-hover\");\r\n            }\r\n        } else if (attr == \"ff\") {\r\n            let menuButtonId = \"luckysheet-icon-font-family-menuButton\";\r\n            let $menuButton = $(\"#\" + menuButtonId);\r\n            // const locale_fontarray = locale().fontarray;\r\n            let itemname = locale_fontarray[0],\r\n                itemvalue = 0;\r\n            if (foucsStatus != null) {\r\n                if (isdatatypemulti(foucsStatus)[\"num\"]) {\r\n                    itemvalue = parseInt(foucsStatus);\r\n                    itemname = locale_fontarray[itemvalue];\r\n\r\n                    if (itemname == null) {\r\n                        itemvalue = _this.defualtFont[itemvalue];\r\n                        itemname = itemvalue;\r\n                        if (itemvalue != null) {\r\n                            _this.addFontTolist(itemvalue);\r\n                        }\r\n                    }\r\n                } else {\r\n                    foucsStatus = foucsStatus.replace(/\"/g, \"\").replace(/'/g, \"\");\r\n                    itemvalue = foucsStatus;\r\n                    itemname = foucsStatus;\r\n\r\n                    _this.addFontTolist(itemvalue);\r\n                }\r\n            }\r\n\r\n            _this.focus($menuButton, itemvalue);\r\n            $(\"#luckysheet-icon-font-family\")\r\n                .find(\".luckysheet-toolbar-menu-button-caption\")\r\n                .html(\" \" + itemname + \" \");\r\n        } else if (attr == \"fs\") {\r\n            let $menuButton = $(\"#luckysheet-icon-font-size-menuButton\");\r\n            let itemvalue = foucsStatus,\r\n                $input = $(\"#luckysheet-icon-font-size input\");\r\n            _this.focus($menuButton, itemvalue);\r\n            $(\"#luckysheet-icon-font-size\").attr(\"itemvalue\", itemvalue);\r\n            $input.val(itemvalue);\r\n        } else if (attr == \"ht\") {\r\n            let $menuButton = $(\"#luckysheet-icon-align-menu-menuButton\");\r\n            let $t = $(\"luckysheet-icon-align\"),\r\n                itemvalue = \"left\";\r\n\r\n            if (foucsStatus == \"0\") {\r\n                itemvalue = \"center\";\r\n            } else if (foucsStatus == \"2\") {\r\n                itemvalue = \"right\";\r\n            }\r\n\r\n            _this.focus($menuButton, itemvalue);\r\n\r\n            // add iconfont\r\n            const iconfontObject = iconfontObjects.align;\r\n\r\n            let $icon = $(\"#luckysheet-icon-align\")\r\n                .attr(\"type\", itemvalue)\r\n                .find(\".luckysheet-icon-img-container\");\r\n            $icon\r\n                .removeAttr(\"class\")\r\n                .addClass(\r\n                    \"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-\" +\r\n                        itemvalue +\r\n                        iconfontObject[itemvalue],\r\n                );\r\n            $menuButton.hide();\r\n        } else if (attr == \"vt\") {\r\n            let $menuButton = $(\"#luckysheet-icon-valign-menu-menuButton\");\r\n            let $t = $(\"luckysheet-icon-valign\"),\r\n                itemvalue = \"bottom\";\r\n\r\n            if (foucsStatus == \"1\") {\r\n                itemvalue = \"top\";\r\n            } else if (foucsStatus == \"0\") {\r\n                itemvalue = \"middle\";\r\n            }\r\n\r\n            _this.focus($menuButton, itemvalue);\r\n\r\n            // add iconfont\r\n            const iconfontObject = iconfontObjects.align;\r\n\r\n            let $icon = $(\"#luckysheet-icon-valign\")\r\n                .attr(\"type\", itemvalue)\r\n                .find(\".luckysheet-icon-img-container\");\r\n            $icon\r\n                .removeAttr(\"class\")\r\n                .addClass(\r\n                    \"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-\" +\r\n                        itemvalue +\r\n                        iconfontObject[itemvalue],\r\n                );\r\n            $menuButton.hide();\r\n        } else if (attr == \"tb\") {\r\n            let $menuButton = $(\"#luckysheet-icon-textwrap-menu-menuButton\");\r\n            let $t = $(\"luckysheet-icon-textwrap\"),\r\n                itemvalue = \"clip\";\r\n\r\n            if (foucsStatus == \"1\") {\r\n                itemvalue = \"overflow\";\r\n            } else if (foucsStatus == \"2\") {\r\n                itemvalue = \"wrap\";\r\n            }\r\n\r\n            _this.focus($menuButton, itemvalue);\r\n\r\n            // add iconfont\r\n            const iconfontObject = iconfontObjects.textWrap;\r\n\r\n            let $icon = $(\"#luckysheet-icon-textwrap\")\r\n                .attr(\"type\", itemvalue)\r\n                .find(\".luckysheet-icon-img-container\");\r\n            $icon\r\n                .removeAttr(\"class\")\r\n                .addClass(\r\n                    \"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-\" +\r\n                        itemvalue +\r\n                        iconfontObject[itemvalue],\r\n                );\r\n            $menuButton.hide();\r\n        } else if (attr == \"tr\") {\r\n            let $menuButton = $(\"#luckysheet-icon-rotation-menu-menuButton\");\r\n            let $t = $(\"luckysheet-icon-rotation\"),\r\n                itemvalue = \"none\";\r\n\r\n            if (foucsStatus == \"1\") {\r\n                itemvalue = \"angleup\";\r\n            } else if (foucsStatus == \"2\") {\r\n                itemvalue = \"angledown\";\r\n            } else if (foucsStatus == \"3\") {\r\n                itemvalue = \"vertical\";\r\n            } else if (foucsStatus == \"4\") {\r\n                itemvalue = \"rotation-up\";\r\n            } else if (foucsStatus == \"5\") {\r\n                itemvalue = \"rotation-down\";\r\n            }\r\n\r\n            _this.focus($menuButton, itemvalue);\r\n\r\n            // add iconfont\r\n            const iconfontObject = iconfontObjects.rotation;\r\n\r\n            let $icon = $(\"#luckysheet-icon-rotation\")\r\n                .attr(\"type\", itemvalue)\r\n                .find(\".luckysheet-icon-img-container\");\r\n            $icon\r\n                .removeAttr(\"class\")\r\n                .addClass(\r\n                    \"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-\" +\r\n                        itemvalue +\r\n                        iconfontObject[itemvalue],\r\n                );\r\n            $menuButton.hide();\r\n        } else if (attr == \"ct\") {\r\n            let $menuButton = $(\"#luckysheet-icon-fmt-other\");\r\n            const _locale = locale();\r\n            const locale_defaultFmt = _locale.defaultFmt;\r\n            if (!foucsStatus) {\r\n                $menuButton.find(\".luckysheet-toolbar-menu-button-caption\").html(\" \" + locale_defaultFmt[0].text + \" \");\r\n                return;\r\n            }\r\n            const { fa } = foucsStatus;\r\n            const format = locale_defaultFmt.find((f) => f.value === fa);\r\n            if (format) {\r\n                $menuButton.find(\".luckysheet-toolbar-menu-button-caption\").html(\" \" + format.text + \" \");\r\n            } else {\r\n                const otherFormat = locale_defaultFmt.find((f) => f.value === \"fmtOtherSelf\");\r\n                $menuButton.find(\".luckysheet-toolbar-menu-button-caption\").html(\" \" + otherFormat.text + \" \");\r\n            }\r\n        }\r\n    },\r\n    inputMenuButtonFocus: function(focusTarget) {\r\n        var w = window.getSelection();\r\n        var range = w.getRangeAt(0);\r\n        let startContainer = range.startContainer;\r\n        Store.inlineStringEditRange = null;\r\n        const _locale = locale();\r\n        if (startContainer.parentNode.tagName == \"SPAN\") {\r\n            let cssText = startContainer.parentNode.style.cssText;\r\n            let stylelist = convertCssToStyleList(cssText);\r\n            for (let key in stylelist) {\r\n                this.changeMenuButtonDom(key, stylelist[key], _locale);\r\n            }\r\n        }\r\n    },\r\n    menuButtonFocus: function(d, r, c) {\r\n        let _this = this;\r\n        let foucsList = [\"bl\", \"it\", \"cl\", \"ff\", \"ht\", \"vt\", \"fs\", \"tb\", \"tr\", \"ct\", \"un\"];\r\n        const _locale = locale();\r\n        for (let i = 0; i < foucsList.length; i++) {\r\n            let attr = foucsList[i];\r\n            let foucsStatus = _this.checkstatus(d, r, c, attr);\r\n\r\n            this.changeMenuButtonDom(attr, foucsStatus, _locale);\r\n        }\r\n    },\r\n    checkstatus: function(d, r, c, a) {\r\n        if (d == null || d[r] == null) {\r\n            console.warn(\"It's incorrect data\", r, c);\r\n            return null;\r\n        }\r\n        let foucsStatus = d[r][c];\r\n        return checkstatusByCell(foucsStatus, a);\r\n    },\r\n    setLineDash: function(canvasborder, type, hv, m_st, m_ed, line_st, line_ed) {\r\n        let borderType = {\r\n            \"0\": \"none\",\r\n            \"1\": \"Thin\",\r\n            \"2\": \"Hair\",\r\n            \"3\": \"Dotted\",\r\n            \"4\": \"Dashed\",\r\n            \"5\": \"DashDot\",\r\n            \"6\": \"DashDotDot\",\r\n            \"7\": \"Double\",\r\n            \"8\": \"Medium\",\r\n            \"9\": \"MediumDashed\",\r\n            \"10\": \"MediumDashDot\",\r\n            \"11\": \"MediumDashDotDot\",\r\n            \"12\": \"SlantedDashDot\",\r\n            \"13\": \"Thick\",\r\n        };\r\n\r\n        type = borderType[type.toString()];\r\n\r\n        try {\r\n            if (type == \"Hair\") {\r\n                canvasborder.setLineDash([1, 2]);\r\n            } else if (type.indexOf(\"DashDotDot\") > -1) {\r\n                canvasborder.setLineDash([2, 2, 5, 2, 2]);\r\n            } else if (type.indexOf(\"DashDot\") > -1) {\r\n                canvasborder.setLineDash([2, 5, 2]);\r\n            } else if (type.indexOf(\"Dotted\") > -1) {\r\n                canvasborder.setLineDash([2]);\r\n            } else if (type.indexOf(\"Dashed\") > -1) {\r\n                canvasborder.setLineDash([3]);\r\n            } else {\r\n                canvasborder.setLineDash([0]);\r\n            }\r\n        } catch (e) {\r\n            console.log(e);\r\n        }\r\n\r\n        canvasborder.beginPath();\r\n\r\n        if (type.indexOf(\"Medium\") > -1) {\r\n            if (hv == \"h\") {\r\n                canvasborder.moveTo(m_st, m_ed - 0.5);\r\n                canvasborder.lineTo(line_st, line_ed - 0.5);\r\n            } else {\r\n                canvasborder.moveTo(m_st - 0.5, m_ed);\r\n                canvasborder.lineTo(line_st - 0.5, line_ed);\r\n            }\r\n\r\n            canvasborder.lineWidth = 2;\r\n        } else if (type == \"Thick\") {\r\n            canvasborder.moveTo(m_st, m_ed);\r\n            canvasborder.lineTo(line_st, line_ed);\r\n            canvasborder.lineWidth = 3;\r\n        } else {\r\n            canvasborder.moveTo(m_st, m_ed);\r\n            canvasborder.lineTo(line_st, line_ed);\r\n            canvasborder.lineWidth = 1;\r\n        }\r\n    },\r\n    moveMergeData: function(d, offset_r, offset_c) {\r\n        if (isRealNull(d)) {\r\n            return d;\r\n        }\r\n\r\n        let deleMC = [],\r\n            insertMC = [],\r\n            hasMC = false;\r\n\r\n        for (let r = 0; r < d.length; r++) {\r\n            for (let c = 0; c < d[0].length; c++) {\r\n                let cell = d[r][c];\r\n\r\n                if (getObjType(cell) == \"object\" && \"mc\" in cell) {\r\n                    if (cell.mc.rs != null) {\r\n                        deleMC.push({\r\n                            rs: cell.mc.rs,\r\n                            cs: cell.mc.cs,\r\n                            r: cell.mc.r,\r\n                            c: cell.mc.c,\r\n                        });\r\n                        insertMC.push({\r\n                            rs: cell.mc.rs,\r\n                            cs: cell.mc.cs,\r\n                            r: cell.mc.r + offset_r,\r\n                            c: cell.mc.c + offset_c,\r\n                        });\r\n\r\n                        hasMC = true;\r\n                    }\r\n\r\n                    d[r][c].mc.r += offset_r;\r\n                    d[r][c].mc.c += offset_c;\r\n                }\r\n            }\r\n        }\r\n\r\n        return { deleMC: deleMC, insertMC: insertMC, hasMC: hasMC };\r\n    },\r\n    getRangeInMerge: function(st_r, rlen, st_c, clen, sheetIndex) {\r\n        let _this = this;\r\n\r\n        let mergelist = [];\r\n        let cfg = null;\r\n        if (sheetIndex != null) {\r\n            cfg = $.extend(true, {}, _this.getSheetConfig());\r\n        } else {\r\n            cfg = $.extend(true, {}, Store.config);\r\n        }\r\n\r\n        if (cfg != null && cfg[\"merge\"] != null) {\r\n            for (let key in cfg[\"merge\"]) {\r\n                let mc = cfg[\"merge\"][key];\r\n                if (\r\n                    !(st_r + rlen - 1 < mc.r || st_r > mc.r + mc.rs - 1) &&\r\n                    !(st_c + clen - 1 < mc.c || st_c > mc.c + mc.cs - 1)\r\n                ) {\r\n                    mergelist.push(mc);\r\n                }\r\n            }\r\n        }\r\n\r\n        return mergelist;\r\n    },\r\n    mergeborer: function(d, row_index, col_index) {\r\n        if (d == null || d[row_index] == null) {\r\n            console.warn(\"Merge info is null\", row_index, col_index);\r\n            return null;\r\n        }\r\n        let value = d[row_index][col_index];\r\n\r\n        if (getObjType(value) == \"object\" && \"mc\" in value) {\r\n            let margeMaindata = value[\"mc\"];\r\n            if (margeMaindata == null) {\r\n                console.warn(\"Merge info is null\", row_index, col_index);\r\n                return null;\r\n            }\r\n            col_index = margeMaindata.c;\r\n            row_index = margeMaindata.r;\r\n\r\n            if (d[row_index][col_index] == null) {\r\n                console.warn(\"Main merge Cell info is null\", row_index, col_index);\r\n                return null;\r\n            }\r\n            let col_rs = d[row_index][col_index].mc.cs;\r\n            let row_rs = d[row_index][col_index].mc.rs;\r\n\r\n            let margeMain = d[row_index][col_index].mc;\r\n\r\n            let start_r, end_r, row, row_pre;\r\n            for (let r = row_index; r < margeMain.rs + row_index; r++) {\r\n                if (r == 0) {\r\n                    start_r = -1;\r\n                } else {\r\n                    start_r = Store.visibledatarow[r - 1] - 1;\r\n                }\r\n\r\n                end_r = Store.visibledatarow[r];\r\n\r\n                if (row_pre == null) {\r\n                    row_pre = start_r;\r\n                    row = end_r;\r\n                } else {\r\n                    row += end_r - start_r - 1;\r\n                }\r\n            }\r\n\r\n            let start_c, end_c, col, col_pre;\r\n            for (let c = col_index; c < margeMain.cs + col_index; c++) {\r\n                if (c == 0) {\r\n                    start_c = 0;\r\n                } else {\r\n                    start_c = Store.visibledatacolumn[c - 1];\r\n                }\r\n\r\n                end_c = Store.visibledatacolumn[c];\r\n\r\n                if (col_pre == null) {\r\n                    col_pre = start_c;\r\n                    col = end_c;\r\n                } else {\r\n                    col += end_c - start_c;\r\n                }\r\n            }\r\n\r\n            return {\r\n                row: [row_pre, row, row_index, row_index + row_rs - 1],\r\n                column: [col_pre, col, col_index, col_index + col_rs - 1],\r\n            };\r\n        } else {\r\n            return null;\r\n        }\r\n    },\r\n    mergeMoveData: {},\r\n    mergeMoveMain: function(columnseleted, rowseleted, s, top, height, left, width) {\r\n        let _this = this;\r\n        let mergesetting = sheetmanage.getSheetMerge();\r\n\r\n        if (mergesetting == null) {\r\n            return;\r\n        }\r\n\r\n        let mcset = [];\r\n        for (let key in mergesetting) {\r\n            mcset.push(key);\r\n        }\r\n\r\n        if (rowseleted[0] > rowseleted[1]) {\r\n            rowseleted[1] = rowseleted[0];\r\n        }\r\n\r\n        if (columnseleted[0] > columnseleted[1]) {\r\n            columnseleted[1] = columnseleted[0];\r\n        }\r\n\r\n        let offloop = true;\r\n        _this.mergeMoveData = {};\r\n\r\n        while (offloop) {\r\n            offloop = false;\r\n\r\n            for (let i = 0; i < mcset.length; i++) {\r\n                let key = mcset[i];\r\n                let mc = mergesetting[key];\r\n\r\n                if (key in _this.mergeMoveData) {\r\n                    continue;\r\n                }\r\n\r\n                let changeparam = _this.mergeMove(mc, columnseleted, rowseleted, s, top, height, left, width);\r\n\r\n                if (changeparam != null) {\r\n                    _this.mergeMoveData[key] = mc;\r\n\r\n                    columnseleted = changeparam[0];\r\n                    rowseleted = changeparam[1];\r\n                    top = changeparam[2];\r\n                    height = changeparam[3];\r\n                    left = changeparam[4];\r\n                    width = changeparam[5];\r\n\r\n                    offloop = true;\r\n                } else {\r\n                    delete _this.mergeMoveData[key];\r\n                }\r\n            }\r\n        }\r\n\r\n        return [columnseleted, rowseleted, top, height, left, width];\r\n    },\r\n    mergeMove: function(mc, columnseleted, rowseleted, s, top, height, left, width) {\r\n        let _this = this;\r\n\r\n        let row_st = mc.r,\r\n            row_ed = mc.r + mc.rs - 1;\r\n        let col_st = mc.c,\r\n            col_ed = mc.c + mc.cs - 1;\r\n        let ismatch = false;\r\n\r\n        if (columnseleted[1] < columnseleted[0]) {\r\n            columnseleted[0] = columnseleted[1];\r\n        }\r\n\r\n        if (rowseleted[1] < rowseleted[0]) {\r\n            rowseleted[0] = rowseleted[1];\r\n        }\r\n\r\n        if (\r\n            (columnseleted[0] <= col_st &&\r\n                columnseleted[1] >= col_ed &&\r\n                rowseleted[0] <= row_st &&\r\n                rowseleted[1] >= row_ed) ||\r\n            (!(columnseleted[1] < col_st || columnseleted[0] > col_ed) &&\r\n                !(rowseleted[1] < row_st || rowseleted[0] > row_ed))\r\n        ) {\r\n            let margeset = _this.mergeborer(Store.flowdata, mc.r, mc.c);\r\n            if (!!margeset) {\r\n                let row = margeset.row[1],\r\n                    row_pre = margeset.row[0],\r\n                    row_index = margeset.row[2],\r\n                    col = margeset.column[1],\r\n                    col_pre = margeset.column[0],\r\n                    col_index = margeset.column[2];\r\n\r\n                if (!(columnseleted[1] < col_st || columnseleted[0] > col_ed)) {\r\n                    //向上滑动\r\n                    if (rowseleted[0] <= row_ed && rowseleted[0] >= row_st) {\r\n                        height += top - row_pre;\r\n                        top = row_pre;\r\n                        rowseleted[0] = row_st;\r\n                    }\r\n\r\n                    //向下滑动或者居中时往上滑动的向下补齐\r\n                    if (rowseleted[1] >= row_st && rowseleted[1] <= row_ed) {\r\n                        if (s.row_focus >= row_st && s.row_focus <= row_ed) {\r\n                            height = row - top;\r\n                        } else {\r\n                            height = row - top;\r\n                        }\r\n\r\n                        rowseleted[1] = row_ed;\r\n                    }\r\n                }\r\n\r\n                if (!(rowseleted[1] < row_st || rowseleted[0] > row_ed)) {\r\n                    if (columnseleted[0] <= col_ed && columnseleted[0] >= col_st) {\r\n                        width += left - col_pre;\r\n                        left = col_pre;\r\n                        columnseleted[0] = col_st;\r\n                    }\r\n\r\n                    //向右滑动或者居中时往左滑动的向下补齐\r\n                    if (columnseleted[1] >= col_st && columnseleted[1] <= col_ed) {\r\n                        if (s.column_focus >= col_st && s.column_focus <= col_ed) {\r\n                            width = col - left;\r\n                        } else {\r\n                            width = col - left;\r\n                        }\r\n\r\n                        columnseleted[1] = col_ed;\r\n                    }\r\n                }\r\n\r\n                ismatch = true;\r\n            }\r\n        }\r\n\r\n        if (ismatch) {\r\n            return [columnseleted, rowseleted, top, height, left, width];\r\n        } else {\r\n            return null;\r\n        }\r\n    },\r\n    getCellRealSize: function(d, cell_r, cell_c) {\r\n        let _this = this;\r\n\r\n        let width = Store.defaultcollen;\r\n        let height = Store.defaultrowlen;\r\n        let celldata = d[cell_r][cell_c];\r\n\r\n        if (!!celldata && celldata[\"mc\"] != null) {\r\n            let mc = celldata[\"mc\"];\r\n            let margeset = _this.mergeborer(d, mc.r, mc.c);\r\n\r\n            if (!!margeset) {\r\n                let row = margeset.row[1];\r\n                let row_pre = margeset.row[0];\r\n                let row_index = margeset.row[2];\r\n                let row_index_ed = margeset.row[3];\r\n\r\n                let col = margeset.column[1];\r\n                let col_pre = margeset.column[0];\r\n                let col_index = margeset.column[2];\r\n                let col_index_ed = margeset.column[3];\r\n\r\n                width = col - col_pre - 1;\r\n                height = row - row_pre - 1;\r\n            }\r\n        } else {\r\n            let config = getluckysheetfile()[getSheetIndex(Store.currentSheetIndex)][\"config\"];\r\n\r\n            if (config[\"columnlen\"] != null && config[\"columnlen\"][cell_c] != null) {\r\n                width = config[\"columnlen\"][cell_c];\r\n            }\r\n\r\n            if (config[\"rowlen\"] != null && config[\"rowlen\"][cell_r] != null) {\r\n                height = config[\"rowlen\"][cell_r];\r\n            }\r\n        }\r\n\r\n        return [width, height];\r\n    },\r\n    getTextHeightCache: {},\r\n    getTextSize: function(text, font) {\r\n        let fontarray = locale().fontarray;\r\n        let f = font || \"10pt \" + fontarray[0];\r\n\r\n        let _this = this;\r\n\r\n        if (f in _this.getTextHeightCache) {\r\n            return _this.getTextHeightCache[f];\r\n        }\r\n\r\n        if ($(\"#luckysheetTextSizeTest\").length == 0) {\r\n            $(\r\n                '<span id=\"luckysheetTextSizeTest\" style=\"float:left;white-space:nowrap;visibility:hidden;margin:0;padding:0;\">' +\r\n                    text +\r\n                    \"</span>\",\r\n            ).appendTo($(\"body\"));\r\n        }\r\n\r\n        let o = $(\"#luckysheetTextSizeTest\")\r\n                .text(text)\r\n                .css({ font: f }),\r\n            w = o.innerWidth(),\r\n            h = o.innerHeight();\r\n\r\n        _this.getTextHeightCache[f] = [w, h];\r\n\r\n        return [w, h];\r\n    },\r\n    activeFormulaInput: function(row_index, col_index, rowh, columnh, formula, isnull) {\r\n        let _this = this;\r\n\r\n        if (isnull == null) {\r\n            isnull = false;\r\n        }\r\n\r\n        luckysheetupdateCell(row_index, col_index, Store.flowdata, true);\r\n\r\n        if (isnull) {\r\n            let formulaTxt =\r\n                '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">' +\r\n                formula.toUpperCase() +\r\n                '</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">(</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">)</span>';\r\n\r\n            $(\"#luckysheet-rich-text-editor\").html(formulaTxt);\r\n\r\n            let currSelection = window.getSelection();\r\n            let $span = $(\"#luckysheet-rich-text-editor\").find(\"span\");\r\n            luckysheetformula.setCaretPosition($span.get($span.length - 2), 0, 1);\r\n\r\n            return;\r\n        }\r\n\r\n        let row_pre = rowLocationByIndex(rowh[0])[0],\r\n            row = rowLocationByIndex(rowh[1])[1],\r\n            col_pre = colLocationByIndex(columnh[0])[0],\r\n            col = colLocationByIndex(columnh[1])[1];\r\n\r\n        let formulaTxt =\r\n            '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">' +\r\n            formula.toUpperCase() +\r\n            '</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">(</span><span class=\"luckysheet-formula-functionrange-cell\" rangeindex=\"0\" dir=\"auto\" style=\"color:' +\r\n            luckyColor[0] +\r\n            ';\">' +\r\n            getRangetxt(Store.currentSheetIndex, { row: rowh, column: columnh }, Store.currentSheetIndex) +\r\n            '</span><span dir=\"auto\" class=\"luckysheet-formula-text-color\">)</span>';\r\n        $(\"#luckysheet-rich-text-editor\").html(formulaTxt);\r\n\r\n        luckysheetformula.israngeseleciton();\r\n        luckysheetformula.rangestart = true;\r\n        luckysheetformula.rangedrag_column_start = false;\r\n        luckysheetformula.rangedrag_row_start = false;\r\n        luckysheetformula.rangechangeindex = 0;\r\n        luckysheetformula.rangeSetValue({ row: rowh, column: columnh });\r\n        luckysheetformula.func_selectedrange = {\r\n            left: col_pre,\r\n            width: col - col_pre - 1,\r\n            top: row_pre,\r\n            height: row - row_pre - 1,\r\n            left_move: col_pre,\r\n            width_move: col - col_pre - 1,\r\n            top_move: row_pre,\r\n            height_move: row - row_pre - 1,\r\n            row: [row_index, row_index],\r\n            column: [col_index, col_index],\r\n        };\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\")\r\n            .css({ left: col_pre, width: col - col_pre - 1, top: row_pre, height: row - row_pre - 1 })\r\n            .show();\r\n\r\n        $(\"#luckysheet-formula-help-c\").hide();\r\n    },\r\n    backFormulaInput: function(d, r, c, rowh, columnh, formula) {\r\n        let _this = this;\r\n\r\n        let f =\r\n            \"=\" +\r\n            formula.toUpperCase() +\r\n            \"(\" +\r\n            getRangetxt(Store.currentSheetIndex, { row: rowh, column: columnh }, Store.currentSheetIndex) +\r\n            \")\";\r\n        let v = luckysheetformula.execfunction(f, r, c);\r\n        let value = { v: v[1], f: v[2] };\r\n        setcellvalue(r, c, d, value);\r\n        luckysheetformula.execFunctionExist.push({ r: r, c: c, i: Store.currentSheetIndex });\r\n\r\n        //刷新生成公式所在的单元格，刷新calcChain\r\n        Store.luckysheet_select_save.push({\"row\": [r, r], \"column\": [c, c]});\r\n        server.historyParam(d, Store.currentSheetIndex, { row: [r, r], column: [c, c] });\r\n    },\r\n    checkNoNullValue: function(cell) {\r\n        let v = cell;\r\n        if (getObjType(v) == \"object\") {\r\n            v = v.v;\r\n        }\r\n\r\n        if (\r\n            !isRealNull(v) &&\r\n            isdatatypemulti(v).num &&\r\n            (cell.ct == null || cell.ct.t == null || cell.ct.t == \"n\" || cell.ct.t == \"g\")\r\n        ) {\r\n            return true;\r\n        } else {\r\n            return false;\r\n        }\r\n    },\r\n    checkNoNullValueAll: function(cell) {\r\n        let v = cell;\r\n        if (getObjType(v) == \"object\") {\r\n            v = v.v;\r\n        }\r\n\r\n        if (!isRealNull(v)) {\r\n            return true;\r\n        } else {\r\n            return false;\r\n        }\r\n    },\r\n    getNoNullValue: function(d, st_x, ed, type) {\r\n        let _this = this;\r\n        let hasValueSum = 0,\r\n            hasValueStart = null;\r\n        let nullNum = 0,\r\n            nullTime = 0;\r\n\r\n        for (let r = ed - 1; r >= 0; r--) {\r\n            let cell;\r\n            if (type == \"c\") {\r\n                cell = d[st_x][r];\r\n            } else {\r\n                cell = d[r][st_x];\r\n            }\r\n\r\n            if (_this.checkNoNullValue(cell)) {\r\n                hasValueSum++;\r\n                hasValueStart = r;\r\n            } else if (cell == null || cell.v == null || cell.v == \"\") {\r\n                nullNum++;\r\n\r\n                if (nullNum >= 40) {\r\n                    if (nullTime <= 0) {\r\n                        nullTime = 1;\r\n                    } else {\r\n                        break;\r\n                    }\r\n                }\r\n            } else {\r\n                break;\r\n            }\r\n        }\r\n\r\n        return hasValueStart;\r\n    },\r\n    singleFormulaInput: function(d, _index, fix, st_m, ed_m, formula, type, noNum, noNull) {\r\n        let _this = this;\r\n\r\n        if (type == null) {\r\n            type = \"r\";\r\n        }\r\n\r\n        if (noNum == null) {\r\n            noNum = true;\r\n        }\r\n\r\n        if (noNull == null) {\r\n            noNull = true;\r\n        }\r\n\r\n        let isNull = true,\r\n            isNum = false;\r\n\r\n        for (let c = st_m; c <= ed_m; c++) {\r\n            let cell = null;\r\n\r\n            if (type == \"c\") {\r\n                cell = d[c][fix];\r\n            } else {\r\n                cell = d[fix][c];\r\n            }\r\n\r\n            if (_this.checkNoNullValue(cell)) {\r\n                isNull = false;\r\n                isNum = true;\r\n            } else if (_this.checkNoNullValueAll(cell)) {\r\n                isNull = false;\r\n            }\r\n        }\r\n\r\n        if (isNull && noNull) {\r\n            let st_r_r = _this.getNoNullValue(d, _index, fix, type);\r\n\r\n            if (st_r_r == null) {\r\n                if (type == \"c\") {\r\n                    _this.activeFormulaInput(_index, fix, null, null, formula, true);\r\n                } else {\r\n                    _this.activeFormulaInput(fix, _index, null, null, formula, true);\r\n                }\r\n            } else {\r\n                if (_index == st_m) {\r\n                    for (let c = st_m; c <= ed_m; c++) {\r\n                        let st_r_r = _this.getNoNullValue(d, c, fix, type);\r\n\r\n                        if (st_r_r == null) {\r\n                            break;\r\n                        }\r\n\r\n                        if (type == \"c\") {\r\n                            _this.backFormulaInput(d, c, fix, [c, c], [st_r_r, fix - 1], formula);\r\n                        } else {\r\n                            _this.backFormulaInput(d, fix, c, [st_r_r, fix - 1], [c, c], formula);\r\n                        }\r\n                    }\r\n                } else {\r\n                    for (let c = ed_m; c >= st_m; c--) {\r\n                        let st_r_r = _this.getNoNullValue(d, c, fix, type);\r\n\r\n                        if (st_r_r == null) {\r\n                            break;\r\n                        }\r\n\r\n                        if (type == \"c\") {\r\n                            _this.backFormulaInput(d, c, fix, [c, c], [st_r_r, fix - 1], formula);\r\n                        } else {\r\n                            _this.backFormulaInput(d, fix, c, [st_r_r, fix - 1], [c, c], formula);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        } else if (isNum && noNum) {\r\n            let cell = null;\r\n\r\n            if (type == \"c\") {\r\n                cell = d[ed_m + 1][fix];\r\n            } else {\r\n                cell = d[fix][ed_m + 1];\r\n            }\r\n\r\n            /* 备注：在搜寻的时候排除自己以解决单元格函数引用自己的问题 */\r\n            if (cell != null && cell.v != null && cell.v.toString().length > 0) {\r\n                let c = ed_m + 1;\r\n\r\n                if (type == \"c\") {\r\n                    cell = d[ed_m + 1][fix];\r\n                } else {\r\n                    cell = d[fix][ed_m + 1];\r\n                }\r\n\r\n                while (cell != null && cell.v != null && cell.v.toString().length > 0) {\r\n                    c++;\r\n                    let len = null;\r\n\r\n                    if (type == \"c\") {\r\n                        len = d.length;\r\n                    } else {\r\n                        len = d[0].length;\r\n                    }\r\n\r\n                    if (c >= len) {\r\n                        return;\r\n                    }\r\n\r\n                    if (type == \"c\") {\r\n                        cell = d[c][fix];\r\n                    } else {\r\n                        cell = d[fix][c];\r\n                    }\r\n                }\r\n\r\n                if (type == \"c\") {\r\n                    _this.backFormulaInput(d, c, fix, [st_m, ed_m], [fix, fix], formula);\r\n                } else {\r\n                    _this.backFormulaInput(d, fix, c, [fix, fix], [st_m, ed_m], formula);\r\n                }\r\n            } else {\r\n                if (type == \"c\") {\r\n                    _this.backFormulaInput(d, ed_m + 1, fix, [st_m, ed_m], [fix, fix], formula);\r\n                } else {\r\n                    _this.backFormulaInput(d, fix, ed_m + 1, [fix, fix], [st_m, ed_m], formula);\r\n                }\r\n            }\r\n        } else {\r\n            return true;\r\n        }\r\n    },\r\n    autoSelectionFormula: function(formula) {\r\n        let _this = this;\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let nullfindnum = 40;\r\n        let isfalse = true;\r\n        let select_save_len=Store.luckysheet_select_save.length;\r\n        luckysheetformula.execFunctionExist = [];\r\n\r\n        let execFormulaInput_c = function(d, st_r, ed_r, st_c, ed_c, formula) {\r\n            let st_c_c = _this.getNoNullValue(d, st_r, ed_c, \"c\");\r\n\r\n            if (st_c_c == null) {\r\n                _this.activeFormulaInput(st_r, st_c, null, null, formula, true);\r\n            } else {\r\n                _this.activeFormulaInput(st_r, st_c, [st_r, ed_r], [st_c_c, ed_c - 1], formula);\r\n            }\r\n        };\r\n\r\n        let execFormulaInput = function(d, st_r, ed_r, st_c, ed_c, formula) {\r\n            let st_r_c = _this.getNoNullValue(d, st_c, ed_r, \"r\");\r\n\r\n            if (st_r_c == null) {\r\n                execFormulaInput_c(d, st_r, ed_r, st_c, ed_c, formula);\r\n            } else {\r\n                _this.activeFormulaInput(st_r, st_c, [st_r_c, ed_r - 1], [st_c, ed_c], formula);\r\n            }\r\n        };\r\n\r\n        for(let s = 0; s < select_save_len; s++){\r\n            let st_r = Store.luckysheet_select_save[s].row[0],\r\n                ed_r = Store.luckysheet_select_save[s].row[1];\r\n            let st_c = Store.luckysheet_select_save[s].column[0],\r\n                ed_c = Store.luckysheet_select_save[s].column[1];\r\n            let row_index = Store.luckysheet_select_save[s].row_focus,\r\n                col_index = Store.luckysheet_select_save[s].column_focus;\r\n\r\n            if (st_r == ed_r && st_c == ed_c) {\r\n                if (ed_r - 1 < 0 && ed_c - 1 < 0) {\r\n                    _this.activeFormulaInput(st_r, st_c, null, null, formula, true);\r\n                    return;\r\n                }\r\n\r\n                if (ed_r - 1 >= 0 && _this.checkNoNullValue(d[ed_r - 1][st_c])) {\r\n                    execFormulaInput(d, st_r, ed_r, st_c, ed_c, formula);\r\n                } else if (ed_c - 1 >= 0 && _this.checkNoNullValue(d[st_r][ed_c - 1])) {\r\n                    execFormulaInput_c(d, st_r, ed_r, st_c, ed_c, formula);\r\n                } else {\r\n                    execFormulaInput(d, st_r, ed_r, st_c, ed_c, formula);\r\n                }\r\n            } else if (st_r == ed_r) {\r\n                isfalse = _this.singleFormulaInput(d, col_index, st_r, st_c, ed_c, formula, \"r\");\r\n            } else if (st_c == ed_c) {\r\n                isfalse = _this.singleFormulaInput(d, row_index, st_c, st_r, ed_r, formula, \"c\");\r\n            } else {\r\n                let r_false = true;\r\n                for (let r = st_r; r <= ed_r; r++) {\r\n                    r_false =\r\n                        _this.singleFormulaInput(d, col_index, r, st_c, ed_c, formula, \"r\", true, false) && r_false;\r\n                }\r\n\r\n                let c_false = true;\r\n                for (let c = st_c; c <= ed_c; c++) {\r\n                    c_false =\r\n                        _this.singleFormulaInput(d, row_index, c, st_r, ed_r, formula, \"c\", true, false) && c_false;\r\n                }\r\n\r\n                isfalse = !!r_false && !!c_false;\r\n            }\r\n\r\n            isfalse = isfalse && isfalse;\r\n        }\r\n\r\n        if (!isfalse) {\r\n            luckysheetformula.execFunctionExist.reverse();\r\n            luckysheetformula.execFunctionGroup(null, null, null, null, d);\r\n            jfrefreshgrid(d, Store.luckysheet_select_save);\r\n\r\n            clearTimeout(Store.jfcountfuncTimeout);\r\n            Store.jfcountfuncTimeout = setTimeout(function() {\r\n                countfunc();\r\n            }, 500);\r\n        }\r\n    },\r\n    getStyleByCell: function(d, r, c) {\r\n        let _this = this;\r\n        let style = \"\";\r\n\r\n        //交替颜色\r\n        let af_compute = alternateformat.getComputeMap();\r\n        let checksAF = alternateformat.checksAF(r, c, af_compute);\r\n\r\n        //条件格式\r\n        let cf_compute = conditionformat.getComputeMap();\r\n        let checksCF = conditionformat.checksCF(r, c, cf_compute);\r\n\r\n        const locale_fontarray = locale().fontarray;\r\n\r\n        let cell = d[r][c];\r\n        let ct = cell.ct,\r\n            isInline = false;\r\n        if (isInlineStringCell(cell)) {\r\n            isInline = true;\r\n        }\r\n        for (let key in cell) {\r\n            let value = _this.checkstatus(d, r, c, key);\r\n\r\n            if (checksAF != null || (checksCF != null && checksCF[\"cellColor\"] != null)) {\r\n                if (checksCF != null && checksCF[\"cellColor\"] != null) {\r\n                    style += \"background: \" + checksCF[\"cellColor\"] + \";\";\r\n                } else if (checksAF != null) {\r\n                    style += \"background: \" + checksAF[1] + \";\";\r\n                }\r\n            }\r\n\r\n            if (getObjType(value) == \"object\") {\r\n                continue;\r\n            }\r\n\r\n            if (key == \"bg\" || checksAF != null || (checksCF != null && checksCF[\"cellColor\"] != null)) {\r\n                if (checksCF != null && checksCF[\"cellColor\"] != null) {\r\n                    style += \"background: \" + checksCF[\"cellColor\"] + \";\";\r\n                } else if (checksAF != null) {\r\n                    style += \"background: \" + checksAF[1] + \";\";\r\n                } else {\r\n                    style += \"background: \" + value + \";\";\r\n                }\r\n            }\r\n\r\n            // if(!isInline){\r\n            //     if(key == \"bl\" && value != \"0\"){\r\n            //         style += \"font-weight: bold;\";\r\n            //     }\r\n\r\n            //     if(key == \"it\" && value != \"0\"){\r\n            //         style += \"font-style:italic;\";\r\n            //     }\r\n\r\n            //     if(key == \"ff\" && value != \"0\"){\r\n            //         let f = value;\r\n            //         if(!isNaN(parseInt(value))){\r\n            //             f = locale_fontarray[parseInt(value)];\r\n            //         }\r\n            //         style += \"font-family: \" + f + \";\";\r\n            //     }\r\n\r\n            //     if(key == \"fs\" && value != \"10\"){\r\n            //         style += \"font-size: \"+ value + \"pt;\";\r\n            //     }\r\n\r\n            //     if((key == \"fc\" && value != \"#000000\") || checksAF != null || (checksCF != null && checksCF[\"textColor\"] != null)){\r\n            //         if(checksCF != null && checksCF[\"textColor\"] != null){\r\n            //             style += \"color: \" + checksCF[\"textColor\"] + \";\";\r\n            //         }\r\n            //         else if(checksAF != null){\r\n            //             style += \"color: \" + checksAF[0] + \";\";\r\n            //         }\r\n            //         else{\r\n            //             style += \"color: \" + value + \";\";\r\n            //         }\r\n            //     }\r\n            // }\r\n\r\n            if (key == \"ht\" && value != \"1\") {\r\n                if (value == \"0\") {\r\n                    style += \"text-align: center;\";\r\n                } else if (value == \"2\") {\r\n                    style += \"text-align: right;\";\r\n                }\r\n            }\r\n\r\n            if (key == \"vt\") {\r\n                if (value == \"0\") {\r\n                    style += \"vertical-align: middle;\";\r\n                } else if (value == \"1\") {\r\n                    style += \"vertical-align: top;\";\r\n                } else if (value == \"2\") {\r\n                    style += \"vertical-align: bottom;\";\r\n                }\r\n            }\r\n\r\n            if (key == \"un\" && value) {\r\n                style += \"text-decoration:underline;\";\r\n            }\r\n        }\r\n\r\n        if (!isInline) {\r\n            style += getFontStyleByCell(cell, checksAF, checksCF);\r\n        }\r\n\r\n        return style;\r\n    },\r\n    fontSelectList: [],\r\n    defualtFont: [\r\n        \"Times New Roman\",\r\n        \"Arial\",\r\n        \"Tahoma\",\r\n        \"Verdana\",\r\n        \"微软雅黑\",\r\n        \"宋体\",\r\n        \"黑体\",\r\n        \"楷体\",\r\n        \"仿宋\",\r\n        \"新宋体\",\r\n        \"华文新魏\",\r\n        \"华文行楷\",\r\n        \"华文隶书\",\r\n    ],\r\n    addFontTolist: function(fontName) {\r\n        fontName = fontName.replace(/\"/g, \"\").replace(/'/g, \"\");\r\n        let isNone = true;\r\n        for (let a = 0; a < this.fontSelectList.length; a++) {\r\n            let fItem = this.fontSelectList[a];\r\n            if (fItem.value == fontName) {\r\n                isNone = false;\r\n                break;\r\n            }\r\n        }\r\n\r\n        let _locale = locale();\r\n        const locale_fontjson = _locale.fontjson;\r\n        if (fontName in locale_fontjson) {\r\n            isNone = false;\r\n        }\r\n\r\n        if (isNone) {\r\n            let ret = {};\r\n            ret.value = fontName;\r\n            ret.index = this.fontSelectList.length;\r\n            ret.type = \"userDefined\";\r\n            ret.text =\r\n                \"<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:\" +\r\n                fontName +\r\n                \"'>\" +\r\n                fontName +\r\n                \"</span>\";\r\n            ret.example = \"\";\r\n            this.fontSelectList.push(ret);\r\n\r\n            let $menuButton = $(\"#luckysheet-icon-font-family-menuButton\");\r\n            let itemset = this.createButtonMenu(this.fontSelectList);\r\n            $menuButton.html(itemset);\r\n        }\r\n    },\r\n    fontInitial: function(fontList) {\r\n        let itemdata = [];\r\n        const locale_fontarray = locale().fontarray;\r\n        for (let a = 0; a < locale_fontarray.length; a++) {\r\n            let fItem = locale_fontarray[a];\r\n            let ret = {};\r\n            ret.value = fItem;\r\n            ret.index = a;\r\n            ret.type = \"inner\";\r\n            ret.text =\r\n                \"<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:\" +\r\n                fItem +\r\n                \"'>\" +\r\n                fItem +\r\n                \"</span>\";\r\n            ret.example = \"\";\r\n            itemdata.push(ret);\r\n        }\r\n\r\n        if (fontList != null) {\r\n            for (let a = 0; a < fontList.length; a++) {\r\n                let fItem = fontList[a];\r\n                let ret = {};\r\n                ret.value = fItem.fontName;\r\n                ret.index = a;\r\n                ret.type = \"userDefined\";\r\n                ret.text =\r\n                    \"<span class='luckysheet-mousedown-cancel' style='font-size:11px;font-family:\" +\r\n                    fItem.fontName +\r\n                    \"'>\" +\r\n                    fItem.fontName +\r\n                    \"</span>\";\r\n                ret.example = \"\";\r\n                itemdata.push(ret);\r\n\r\n                if (document.fonts && !document.fonts.check(\"12px \" + fItem.fontName)) {\r\n                    if (fItem.url) {\r\n                        const fontface = new FontFace(fItem.fontName, `url(${fItem.url})`);\r\n                        document.fonts.add(fontface);\r\n                        fontface.load();\r\n                    }\r\n                }\r\n            }\r\n\r\n            document.fonts &&\r\n                document.fonts.ready.then(function() {\r\n                    // Any operation that needs to be done only after all the fonts\r\n                    // have finished loading can go here.\r\n                    // console.log(\"font ready\");\r\n                });\r\n        }\r\n\r\n        this.fontSelectList = itemdata;\r\n    },\r\n};\r\n\r\nexport default menuButton;\r\n"
  },
  {
    "path": "src/controllers/mobile.js",
    "content": "import { rowLocation, colLocation, mouseposition } from '../global/location';\r\nimport { selectHightlightShow } from './select';\r\nimport menuButton from './menuButton';\r\nimport luckysheetFreezen from './freezen';\r\nimport Store from '../store';\r\n\r\n//设备是移动端\r\nexport default function mobileinit(){\r\n    //去除滚动条\r\n    Store.cellMainSrollBarSize = 0;\r\n\r\n    //滑动滚动表格\r\n    let luckysheet_touchmove_status = false,\r\n        luckysheet_touchmove_startPos = {},\r\n        luckysheet_touchhandle_status = false,\r\n        _scrollTimer = null;\r\n    $(document).on(\"touchstart\", \"#luckysheet-grid-window-1\", function(event){\r\n        clearInterval(_scrollTimer);//clear timer\r\n        luckysheet_touchmove_status = true;\r\n\r\n        let touch = event.originalEvent.targetTouches[0];\r\n        luckysheet_touchmove_startPos = {\r\n            x: touch.pageX,\r\n            y: touch.pageY,\r\n            vy:0, //vy可以理解为滑动的力度\r\n            moveType:\"y\",\r\n        }\r\n    })\r\n    $(document).on(\"touchmove\", \"#luckysheet-grid-window-1\", function(event){\r\n        if(event.originalEvent.targetTouches.length > 1 || (event.scale && event.scale !== 1)){\r\n            return;\r\n        }\r\n\r\n        let touch = event.originalEvent.targetTouches[0];\r\n\r\n        if(luckysheet_touchmove_status){//滚动\r\n            let slideX = touch.pageX - luckysheet_touchmove_startPos.x;\r\n            let slideY = touch.pageY - luckysheet_touchmove_startPos.y;\r\n\r\n            luckysheet_touchmove_startPos.x = touch.pageX;\r\n            luckysheet_touchmove_startPos.y = touch.pageY;\r\n\r\n            let scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft();\r\n            let scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n\r\n            // console.log(\"start\",scrollTop, slideY,touch.pageY);\r\n\r\n            scrollLeft -= slideX;\r\n            scrollTop -= slideY;\r\n\r\n            // console.log(touch,touch.pageY, luckysheet_touchmove_startPos.y, slideY);\r\n\r\n            if(scrollLeft < 0){\r\n                scrollLeft = 0;\r\n            }\r\n\r\n            if(scrollTop < 0){\r\n                scrollTop = 0;\r\n            }\r\n            \r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(scrollTop);\r\n\r\n            luckysheet_touchmove_startPos.vy_y = slideY;\r\n            luckysheet_touchmove_startPos.scrollTop = scrollTop;\r\n\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(scrollLeft);\r\n\r\n            luckysheet_touchmove_startPos.vy_x = slideX;\r\n\r\n            luckysheet_touchmove_startPos.scrollLeft = scrollLeft;\r\n   \r\n\r\n        }\r\n        else if(luckysheet_touchhandle_status){//选区\r\n            let mouse = mouseposition(touch.pageX, touch.pageY);\r\n            let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let row_location = rowLocation(y), \r\n                row = row_location[1], \r\n                row_pre = row_location[0], \r\n                row_index = row_location[2];\r\n            let col_location = colLocation(x), \r\n                col = col_location[1], \r\n                col_pre = col_location[0], \r\n                col_index = col_location[2];\r\n\r\n            let last = $.extend(true, {}, Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]);\r\n\r\n            let top = 0, height = 0, rowseleted = [];\r\n            if (last.top > row_pre) {\r\n                top = row_pre;\r\n                height = last.top + last.height - row_pre;\r\n\r\n                if(last.row[1] > last.row_focus){\r\n                    last.row[1] = last.row_focus;\r\n                }\r\n\r\n                rowseleted = [row_index, last.row[1]];\r\n            }\r\n            else if (last.top == row_pre) {\r\n                top = row_pre;\r\n                height = last.top + last.height - row_pre;\r\n                rowseleted = [row_index, last.row[0]];\r\n            }\r\n            else {\r\n                top = last.top;\r\n                height = row - last.top - 1;\r\n\r\n                if(last.row[0] < last.row_focus){\r\n                    last.row[0] = last.row_focus;\r\n                }\r\n\r\n                rowseleted = [last.row[0], row_index];\r\n            }\r\n\r\n            let left = 0, width = 0, columnseleted = [];\r\n            if (last.left > col_pre) {\r\n                left = col_pre;\r\n                width = last.left + last.width - col_pre;\r\n\r\n                if(last.column[1] > last.column_focus){\r\n                    last.column[1] = last.column_focus;\r\n                }\r\n\r\n                columnseleted = [col_index, last.column[1]];\r\n            }\r\n            else if (last.left == col_pre) {\r\n                left = col_pre;\r\n                width = last.left + last.width - col_pre;\r\n                columnseleted = [col_index, last.column[0]];\r\n            }\r\n            else {\r\n                left = last.left;\r\n                width = col - last.left - 1;\r\n\r\n                if(last.column[0] < last.column_focus){\r\n                    last.column[0] = last.column_focus;\r\n                }\r\n\r\n                columnseleted = [last.column[0], col_index];\r\n            }\r\n\r\n            let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n            if(changeparam != null){\r\n                columnseleted = changeparam[0];\r\n                rowseleted= changeparam[1];\r\n                top = changeparam[2];\r\n                height = changeparam[3];\r\n                left = changeparam[4];\r\n                width = changeparam[5];\r\n            }\r\n\r\n            last[\"row\"] = rowseleted;\r\n            last[\"column\"] = columnseleted;\r\n\r\n            last[\"left_move\"] = left;\r\n            last[\"width_move\"] = width;\r\n            last[\"top_move\"] = top;\r\n            last[\"height_move\"] = height;\r\n\r\n            Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n\r\n            selectHightlightShow();\r\n            \r\n            luckysheetFreezen.scrollFreezen();\r\n        }\r\n\r\n        event.stopPropagation();\r\n    })\r\n    $(document).on(\"touchend\", function(event){\r\n        if(luckysheet_touchmove_status){\r\n            let vy_x = Math.abs(luckysheet_touchmove_startPos.vy_x), friction_x = ((vy_x >> 31) * 2 + 1) * 0.25;\r\n\r\n            let vy_y = Math.abs(luckysheet_touchmove_startPos.vy_y), friction_y = ((vy_y >> 31) * 2 + 1) * 0.25;\r\n            if(vy_x>0 || vy_y>0){\r\n                _scrollTimer = setInterval(function () {//\r\n                    vy_x -= friction_x;//力度按 惯性的大小递减\r\n                    vy_y -= friction_y;//力度按 惯性的大小递减\r\n\r\n                    if(vy_x<=0){\r\n                        vy_x = 0;\r\n                    }\r\n                    if(vy_y<=0){\r\n                        vy_y = 0;\r\n                    }\r\n         \r\n                    if(luckysheet_touchmove_startPos.vy_y>0){\r\n                        luckysheet_touchmove_startPos.scrollTop -= vy_y;\r\n                    }\r\n                    else{\r\n                        luckysheet_touchmove_startPos.scrollTop += vy_y;\r\n                    }\r\n            \r\n                    $(\"#luckysheet-scrollbar-y\").scrollTop(luckysheet_touchmove_startPos.scrollTop);\r\n            \r\n                    if(luckysheet_touchmove_startPos.vy_x>0){\r\n                        luckysheet_touchmove_startPos.scrollLeft -= vy_x;\r\n                    }\r\n                    else{\r\n                        luckysheet_touchmove_startPos.scrollLeft += vy_x;\r\n                    }\r\n            \r\n                    $(\"#luckysheet-scrollbar-x\").scrollLeft(luckysheet_touchmove_startPos.scrollLeft);\r\n         \r\n                    if(vy_x<=0 && vy_y<=0){\r\n                        clearInterval(_scrollTimer);\r\n                    }\r\n                }, 20); \r\n            }\r\n\r\n        }\r\n        luckysheet_touchmove_status = false;\r\n        // luckysheet_touchmove_startPos = {};\r\n\r\n        luckysheet_touchhandle_status = false;\r\n    })\r\n\r\n    //滑动选择选区\r\n    $(document).on(\"touchstart\", \".luckysheet-cs-touchhandle\", function(event){\r\n        luckysheet_touchhandle_status = true;\r\n        luckysheet_touchmove_status = false;\r\n        // console.log(1111111111);\r\n        event.stopPropagation();\r\n    })  \r\n\r\n    //禁止微信下拉拖出微信背景\r\n    document.addEventListener(\"touchmove\", function(event){\r\n        event.preventDefault();\r\n    }, {\r\n        passive: false\r\n    })\r\n}"
  },
  {
    "path": "src/controllers/moreFormat.js",
    "content": "import { replaceHtml } from '../utils/util';\r\nimport { modelHTML } from './constant';\r\nimport menuButton from './menuButton';\r\nimport editor from '../global/editor';\r\nimport tooltip from '../global/tooltip';\r\nimport { isEditMode } from '../global/validate';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n//更多格式\r\nconst luckysheetMoreFormat = {\r\n    moneyFmtList: [\r\n        {\r\n            \"name\": \"人民币\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"¥\"\r\n        }, {\r\n            \"name\": \"美元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"欧元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"€\"\r\n        }, {\r\n            \"name\": \"英镑\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"￡\"\r\n        }, {\r\n            \"name\": \"港元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"日元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"￥\"\r\n        }, {\r\n            \"name\": \"阿尔巴尼亚列克\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Lek\"\r\n        }, {\r\n            \"name\": \"阿尔及利亚第纳尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"阿富汗尼\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"Af\"\r\n        }, {\r\n            \"name\": \"阿根廷比索\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"阿拉伯联合酋长国迪拉姆\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"dh\"\r\n        }, {\r\n            \"name\": \"阿鲁巴弗罗林\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Afl\"\r\n        }, {\r\n            \"name\": \"阿曼里亚尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rial\"\r\n        }, {\r\n            \"name\": \"阿塞拜疆马纳特\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"埃及镑\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"￡\"\r\n        }, {\r\n            \"name\": \"埃塞俄比亚比尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Birr\"\r\n        }, {\r\n            \"name\": \"安哥拉宽扎\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Kz\"\r\n        }, {\r\n            \"name\": \"澳大利亚元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"澳门元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"MOP\"\r\n        }, {\r\n            \"name\": \"巴巴多斯元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"巴布亚新几内亚基那\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"PGK\"\r\n        }, {\r\n            \"name\": \"巴哈马元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"巴基斯坦卢比\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rs\"\r\n        }, {\r\n            \"name\": \"巴拉圭瓜拉尼\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"Gs\"\r\n        }, {\r\n            \"name\": \"巴林第纳尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"巴拿马巴波亚\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"B/\"\r\n        }, {\r\n            \"name\": \"巴西里亚伊\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"R$\"\r\n        }, {\r\n            \"name\": \"白俄罗斯卢布\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"р\"\r\n        }, {\r\n            \"name\": \"百慕大元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"保加利亚列弗\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"lev\"\r\n        }, {\r\n            \"name\": \"冰岛克朗\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"kr\"\r\n        }, {\r\n            \"name\": \"波黑可兑换马克\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"KM\"\r\n        }, {\r\n            \"name\": \"波兰兹罗提\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"z?\"\r\n        }, {\r\n            \"name\": \"玻利维亚诺\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Bs\"\r\n        }, {\r\n            \"name\": \"伯利兹元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"博茨瓦纳普拉\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"P\"\r\n        }, {\r\n            \"name\": \"不丹努扎姆\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Nu\"\r\n        }, {\r\n            \"name\": \"布隆迪法郎\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"FBu\"\r\n        }, {\r\n            \"name\": \"朝鲜圆\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?KP\"\r\n        }, {\r\n            \"name\": \"丹麦克朗\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"kr\"\r\n        }, {\r\n            \"name\": \"东加勒比元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"多米尼加比索\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"RD$\"\r\n        }, {\r\n            \"name\": \"俄国卢布\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"厄立特里亚纳克法\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Nfk\"\r\n        }, {\r\n            \"name\": \"非洲金融共同体法郎\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"CFA\"\r\n        }, {\r\n            \"name\": \"菲律宾比索\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"斐济元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"佛得角埃斯库多\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"CVE\"\r\n        }, {\r\n            \"name\": \"福克兰群岛镑\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"￡\"\r\n        }, {\r\n            \"name\": \"冈比亚达拉西\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"GMD\"\r\n        }, {\r\n            \"name\": \"刚果法郎\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"FrCD\"\r\n        }, {\r\n            \"name\": \"哥伦比亚比索\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"哥斯达黎加科朗\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"古巴比索\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"古巴可兑换比索\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"圭亚那元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"哈萨克斯坦坚戈\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"海地古德\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"HTG\"\r\n        }, {\r\n            \"name\": \"韩元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"荷属安的列斯盾\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"NAf.\"\r\n        }, {\r\n            \"name\": \"洪都拉斯拉伦皮拉\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"L\"\r\n        }, {\r\n            \"name\": \"吉布提法郎\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Fdj\"\r\n        }, {\r\n            \"name\": \"吉尔吉斯斯坦索姆\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"KGS\"\r\n        }, {\r\n            \"name\": \"几内亚法郎\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"FG\"\r\n        }, {\r\n            \"name\": \"加拿大元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"加纳塞地\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"GHS\"\r\n        }, {\r\n            \"name\": \"柬埔寨瑞尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Riel\"\r\n        }, {\r\n            \"name\": \"捷克克朗\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"K?\"\r\n        }, {\r\n            \"name\": \"津巴布韦元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"卡塔尔里亚尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rial\"\r\n        }, {\r\n            \"name\": \"开曼群岛元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"科摩罗法郎\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"CF\"\r\n        }, {\r\n            \"name\": \"科威特第纳尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"克罗地亚库纳\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"kn\"\r\n        }, {\r\n            \"name\": \"肯尼亚先令\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Ksh\"\r\n        }, {\r\n            \"name\": \"莱索托洛蒂\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"LSL\"\r\n        }, {\r\n            \"name\": \"老挝基普\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"黎巴嫩镑\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"L￡\"\r\n        }, {\r\n            \"name\": \"立陶宛立特\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Lt\"\r\n        }, {\r\n            \"name\": \"利比亚第纳尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"利比亚元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"卢旺达法郎\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"RF\"\r\n        }, {\r\n            \"name\": \"罗马尼亚列伊\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"RON\"\r\n        }, {\r\n            \"name\": \"马达加斯加阿里亚里\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Ar\"\r\n        }, {\r\n            \"name\": \"马尔代夫拉菲亚\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rf\"\r\n        }, {\r\n            \"name\": \"马拉维克瓦查\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"MWK\"\r\n        }, {\r\n            \"name\": \"马来西亚林吉特\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"RM\"\r\n        }, {\r\n            \"name\": \"马其顿戴第纳尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"毛里求斯卢比\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"MURs\"\r\n        }, {\r\n            \"name\": \"毛里塔尼亚乌吉亚\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"MRO\"\r\n        }, {\r\n            \"name\": \"蒙古图格里克\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"孟加拉塔卡\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"秘鲁新索尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"S/\"\r\n        }, {\r\n            \"name\": \"缅甸开亚特\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"K\"\r\n        }, {\r\n            \"name\": \"摩尔多瓦列伊\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"MDL\"\r\n        }, {\r\n            \"name\": \"摩洛哥迪拉姆\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"dh\"\r\n        }, {\r\n            \"name\": \"莫桑比克梅蒂卡尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"MTn\"\r\n        }, {\r\n            \"name\": \"墨西哥比索\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"纳米比亚元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"南非兰特\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"R\"\r\n        }, {\r\n            \"name\": \"南苏丹镑\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"￡\"\r\n        }, {\r\n            \"name\": \"尼加拉瓜科多巴\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"C$\"\r\n        }, {\r\n            \"name\": \"尼泊尔卢比\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rs\"\r\n        }, {\r\n            \"name\": \"尼日利亚奈拉\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"挪威克朗\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"kr\"\r\n        }, {\r\n            \"name\": \"乔治亚拉瑞\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"GEL\"\r\n        }, {\r\n            \"name\": \"人民币（离岸）\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"￥\"\r\n        }, {\r\n            \"name\": \"瑞典克朗\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"kr\"\r\n        }, {\r\n            \"name\": \"瑞士法郎\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"CHF\"\r\n        }, {\r\n            \"name\": \"塞尔维亚第纳尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"塞拉利昂利昂\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"SLL\"\r\n        }, {\r\n            \"name\": \"塞舌尔卢比\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"SCR\"\r\n        }, {\r\n            \"name\": \"沙特里亚尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rial\"\r\n        }, {\r\n            \"name\": \"圣多美多布拉\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Db\"\r\n        }, {\r\n            \"name\": \"圣赫勒拿群岛磅\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"￡\"\r\n        }, {\r\n            \"name\": \"斯里兰卡卢比\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rs\"\r\n        }, {\r\n            \"name\": \"斯威士兰里兰吉尼\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"SZL\"\r\n        }, {\r\n            \"name\": \"苏丹镑\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"SDG\"\r\n        }, {\r\n            \"name\": \"苏里南元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"所罗门群岛元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"索马里先令\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"SOS\"\r\n        }, {\r\n            \"name\": \"塔吉克斯坦索莫尼\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Som\"\r\n        }, {\r\n            \"name\": \"太平洋法郎\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"FCFP\"\r\n        }, {\r\n            \"name\": \"泰国铢\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"坦桑尼亚先令\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"TSh\"\r\n        }, {\r\n            \"name\": \"汤加潘加\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"T$\"\r\n        }, {\r\n            \"name\": \"特立尼达和多巴哥元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"突尼斯第纳尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"土耳其里拉\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"瓦努阿图瓦图\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"VUV\"\r\n        }, {\r\n            \"name\": \"危地马拉格查尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Q\"\r\n        }, {\r\n            \"name\": \"委内瑞拉博利瓦\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Bs\"\r\n        }, {\r\n            \"name\": \"文莱元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"乌干达先令\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"UGX\"\r\n        }, {\r\n            \"name\": \"乌克兰格里夫尼亚\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"грн.\"\r\n        }, {\r\n            \"name\": \"乌拉圭比索\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"乌兹别克斯坦苏姆\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"so?m\"\r\n        }, {\r\n            \"name\": \"西萨摩亚塔拉\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"WST\"\r\n        }, {\r\n            \"name\": \"新加坡元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"新台币\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"NT$\"\r\n        }, {\r\n            \"name\": \"新西兰元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"匈牙利福林\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Ft\"\r\n        }, {\r\n            \"name\": \"叙利亚镑\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"￡\"\r\n        }, {\r\n            \"name\": \"牙买加元\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"亚美尼亚德拉姆\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Dram\"\r\n        }, {\r\n            \"name\": \"也门里亚尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rial\"\r\n        }, {\r\n            \"name\": \"伊拉克第纳尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"伊朗里亚尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rial\"\r\n        }, {\r\n            \"name\": \"以色列新谢克尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"印度卢比\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"印度尼西亚卢比\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"Rp\"\r\n        }, {\r\n            \"name\": \"约旦第纳尔\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"din\"\r\n        }, {\r\n            \"name\": \"越南盾\",\r\n            \"pos\": \"after\",\r\n            \"value\": \"?\"\r\n        }, {\r\n            \"name\": \"赞比亚克瓦查\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"ZMW\"\r\n        }, {\r\n            \"name\": \"直布罗陀镑\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"￡\"\r\n        }, {\r\n            \"name\": \"智利比索\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"$\"\r\n        }, {\r\n            \"name\": \"中非金融合作法郎\",\r\n            \"pos\": \"before\",\r\n            \"value\": \"FCFA\"\r\n        }\r\n    ],\r\n    dateFmtList: [\r\n        {\r\n            \"name\": \"1930-08-05\",\r\n            \"value\": \"yyyy-MM-dd\"\r\n        },\r\n        {\r\n            \"name\": \"1930/8/5\",\r\n            \"value\": \"yyyy/MM/dd\"\r\n        },\r\n        {\r\n            \"name\": \"1930年8月5日\",\r\n            \"value\": 'yyyy\"年\"M\"月\"d\"日\"'\r\n        },\r\n        {\r\n            \"name\": \"08-05\",\r\n            \"value\": \"MM-dd\"\r\n        },\r\n        {\r\n            \"name\": \"8-5\",\r\n            \"value\": \"M-d\"\r\n        },\r\n        {\r\n            \"name\": \"8月5日\",\r\n            \"value\": 'M\"月\"d\"日\"'\r\n        },\r\n        {\r\n            \"name\": \"13:30:30\",\r\n            \"value\": \"h:mm:ss\"\r\n        },\r\n        {\r\n            \"name\": \"13:30\",\r\n            \"value\": \"h:mm\"\r\n        },\r\n        {\r\n            \"name\": \"下午01:30\",\r\n            \"value\": '上午/下午 hh:mm'\r\n        },\r\n        {\r\n            \"name\": \"下午1:30\",\r\n            \"value\": '上午/下午 h:mm'\r\n        },\r\n        {\r\n            \"name\": \"下午1:30:30\",\r\n            \"value\": '上午/下午 h:mm:ss'\r\n        },\r\n        {\r\n            \"name\": \"08-05 下午01:30\",\r\n            \"value\": \"MM-dd 上午/下午 hh:mm\"\r\n        },\r\n        // {\r\n        //     \"name\": \"1930年8月5日星期二\",\r\n        //     \"value\": ''\r\n        // },\r\n        // {\r\n        //     \"name\": \"1930年8月5日星期二 下午1:30:30\",\r\n        //     \"value\": ''\r\n        // },\r\n    ],\r\n    numFmtList: [\r\n        {\r\n            \"name\": \"1235\",\r\n            \"value\": \"0\"\r\n        },\r\n        {\r\n            \"name\": \"1234.56\",\r\n            \"value\": \"0.00\"\r\n        },\r\n        {\r\n            \"name\": \"1,235\",\r\n            \"value\": \"#,##0\"\r\n        },\r\n        {\r\n            \"name\": \"1,234.56\",\r\n            \"value\": \"#,##0.00\"\r\n        },\r\n        {\r\n            \"name\": \"1,235\",\r\n            \"value\": \"#,##0_);(#,##0)\"\r\n        },\r\n        {\r\n            \"name\": \"1,235\",\r\n            \"value\": \"#,##0_);[Red](#,##0)\"\r\n        },\r\n        {\r\n            \"name\": \"1,234.56\",\r\n            \"value\": \"#,##0.00_);(#,##0.00)\"\r\n        },\r\n        {\r\n            \"name\": \"1,234.56\",\r\n            \"value\": \"#,##0.00_);[Red](#,##0.00)\"\r\n        },\r\n        {\r\n            \"name\": \"$1,235\",\r\n            \"value\": \"$#,##0_);($#,##0)\"\r\n        },\r\n        {\r\n            \"name\": \"$1,235\",\r\n            \"value\": \"$#,##0_);[Red]($#,##0)\"\r\n        },\r\n        {\r\n            \"name\": \"$1,234.56\",\r\n            \"value\": \"$#,##0.00_);($#,##0.00)\"\r\n        },\r\n        {\r\n            \"name\": \"$1,234.56\",\r\n            \"value\": \"$#,##0.00_);[Red]($#,##0.00)\"\r\n        },\r\n        {\r\n            \"name\": \"1234.56\",\r\n            \"value\": \"@\"\r\n        },\r\n        {\r\n            \"name\": \"123456%\",\r\n            \"value\": \"0%\"\r\n        },\r\n        {\r\n            \"name\": \"123456.00%\",\r\n            \"value\": \"0.00%\"\r\n        },\r\n        {\r\n            \"name\": \"1.23E+03\",\r\n            \"value\": \"0.00E+00\"\r\n        },\r\n        {\r\n            \"name\": \"1.2E+3\",\r\n            \"value\": \"##0.0E+0\"\r\n        },\r\n        {\r\n            \"name\": \"1234 5/9\",\r\n            \"value\": \"# ?/?\"\r\n        },\r\n        {\r\n            \"name\": \"1234 14/25\",\r\n            \"value\": \"# ??/??\"\r\n        },\r\n        {\r\n            \"name\": \"$ 1,235\",\r\n            \"value\": '_($* #,##0_);_(...($* \"-\"_);_(@_)'\r\n        },\r\n        {\r\n            \"name\": \"1,235\",\r\n            \"value\": '_(* #,##0_);_(*..._(* \"-\"_);_(@_)'\r\n        },\r\n        {\r\n            \"name\": \"$ 1,234.56\",\r\n            // \"value\": '_($* #,##0.00_)...* \"-\"??_);_(@_)'\r\n            \"value\": '_($* #,##0.00_);_(...($* \"-\"_);_(@_)'\r\n        },\r\n        {\r\n            \"name\": \"1,234.56\",\r\n            \"value\": '_(* #,##0.00_);...* \"-\"??_);_(@_)'\r\n        },\r\n    ],\r\n    createDialog: function(type){\r\n        let _this = this;\r\n\r\n        const currencyDetail = locale().currencyDetail;\r\n        const locale_format = locale().format;\r\n        const locale_button = locale().button;\r\n\r\n        this.moneyFmtList = [\r\n            {'name': currencyDetail.RMB,'pos': 'before','value': '¥'},\r\n            {'name': currencyDetail.USdollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.EUR,'pos': 'before','value': '€'},\r\n            {'name': currencyDetail.GBP,'pos': 'before','value': '￡'},\r\n            {'name': currencyDetail.HK,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.JPY,'pos': 'before','value': '￥'},\r\n            {'name': currencyDetail.AlbanianLek,'pos': 'before','value': 'Lek'},\r\n            {'name': currencyDetail.AlgerianDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.Afghani,'pos': 'after','value': 'Af'},\r\n            {'name': currencyDetail.ArgentinePeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.UnitedArabEmiratesDirham,'pos': 'before','value': 'dh'},\r\n            {'name': currencyDetail.ArubanFlorin,'pos': 'before','value': 'Afl'},\r\n            {'name': currencyDetail.OmaniRial,'pos': 'before','value': 'Rial'},\r\n            {'name': currencyDetail.Azerbaijanimanat,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.EgyptianPound,'pos': 'before','value': '￡'},\r\n            {'name': currencyDetail.EthiopianBirr,'pos': 'before','value': 'Birr'},\r\n            {'name': currencyDetail.AngolaKwanza,'pos': 'before','value': 'Kz'},\r\n            {'name': currencyDetail.AustralianDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.Patacas,'pos': 'before','value': 'MOP'},\r\n            {'name': currencyDetail.BarbadosDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.PapuaNewGuineaKina,'pos': 'before','value': 'PGK'},\r\n            {'name': currencyDetail.BahamianDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.PakistanRupee,'pos': 'before','value': 'Rs'},\r\n            {'name': currencyDetail.ParaguayanGuarani,'pos': 'after','value': 'Gs'},\r\n            {'name': currencyDetail.BahrainiDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.PanamanianBalboa,'pos': 'before','value': 'B/'},\r\n            {'name': currencyDetail.Brazilianreal,'pos': 'before','value': 'R$'},\r\n            {'name': currencyDetail.Belarusianruble,'pos': 'after','value': 'р'},\r\n            {'name': currencyDetail.BermudianDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.BulgarianLev,'pos': 'before','value': 'lev'},\r\n            {'name': currencyDetail.IcelandKrona,'pos': 'before','value': 'kr'},\r\n            {'name': currencyDetail.BosniaHerzegovinaConvertibleMark,'pos': 'before','value': 'KM'},\r\n            {'name': currencyDetail.PolishZloty,'pos': 'after','value': 'z?'},\r\n            {'name': currencyDetail.Boliviano,'pos': 'before','value': 'Bs'},\r\n            {'name': currencyDetail.BelizeDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.BotswanaPula,'pos': 'before','value': 'P'},\r\n            {'name': currencyDetail.NotDannuzhamu,'pos': 'before','value': 'Nu'},\r\n            {'name': currencyDetail.BurundiFranc,'pos': 'before','value': 'FBu'},\r\n            {'name': currencyDetail.NorthKoreanWon,'pos': 'before','value': '?KP'},\r\n            {'name': currencyDetail.DanishKrone,'pos': 'after','value': 'kr'},\r\n            {'name': currencyDetail.EastCaribbeanDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.DominicaPeso,'pos': 'before','value': 'RD$'},\r\n            {'name': currencyDetail.RussianRuble,'pos': 'after','value': '?'},\r\n            {'name': currencyDetail.EritreanNakfa,'pos': 'before','value': 'Nfk'},\r\n            {'name': currencyDetail.CFAfranc,'pos': 'before','value': 'CFA'},\r\n            {'name': currencyDetail.PhilippinePeso,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.FijiDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.CapeVerdeEscudo,'pos': 'before','value': 'CVE'},\r\n            {'name': currencyDetail.FalklandIslandsPound,'pos': 'before','value': '￡'},\r\n            {'name': currencyDetail.GambianDalasi,'pos': 'before','value': 'GMD'},\r\n            {'name': currencyDetail.Congolesefranc,'pos': 'before','value': 'FrCD'},\r\n            {'name': currencyDetail.ColombianPeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.CostaRicanColon,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.CubanPeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.Cubanconvertiblepeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.GuyanaDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.KazakhstanTenge,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.Haitiangourde,'pos': 'before','value': 'HTG'},\r\n            {'name': currencyDetail.won,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.NetherlandsAntillesGuilder,'pos': 'before','value': 'NAf.'},\r\n            {'name': currencyDetail.Honduraslempiras,'pos': 'before','value': 'L'},\r\n            {'name': currencyDetail.DjiboutiFranc,'pos': 'before','value': 'Fdj'},\r\n            {'name': currencyDetail.KyrgyzstanSom,'pos': 'before','value': 'KGS'},\r\n            {'name': currencyDetail.GuineaFranc,'pos': 'before','value': 'FG'},\r\n            {'name': currencyDetail.CanadianDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.GhanaianCedi,'pos': 'before','value': 'GHS'},\r\n            {'name': currencyDetail.Cambodianriel,'pos': 'before','value': 'Riel'},\r\n            {'name': currencyDetail.CzechKoruna,'pos': 'after','value': 'K?'},\r\n            {'name': currencyDetail.ZimbabweDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.QatariRiyal,'pos': 'before','value': 'Rial'},\r\n            {'name': currencyDetail.CaymanIslandsDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.Comorianfranc,'pos': 'before','value': 'CF'},\r\n            {'name': currencyDetail.KuwaitiDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.CroatianKuna,'pos': 'before','value': 'kn'},\r\n            {'name': currencyDetail.KenyanShilling,'pos': 'before','value': 'Ksh'},\r\n            {'name': currencyDetail.LesothoLoti,'pos': 'before','value': 'LSL'},\r\n            {'name': currencyDetail.LaoKip,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.LebanesePound,'pos': 'before','value': 'L￡'},\r\n            {'name': currencyDetail.Lithuanianlitas,'pos': 'before','value': 'Lt'},\r\n            {'name': currencyDetail.LibyanDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.LiberianDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.RwandaFranc,'pos': 'before','value': 'RF'},\r\n            {'name': currencyDetail.RomanianLeu,'pos': 'before','value': 'RON'},\r\n            {'name': currencyDetail.MalagasyAriary,'pos': 'before','value': 'Ar'},\r\n            {'name': currencyDetail.MaldivianRufiyaa,'pos': 'before','value': 'Rf'},\r\n            {'name': currencyDetail.MalawiKwacha,'pos': 'before','value': 'MWK'},\r\n            {'name': currencyDetail.MalaysianRinggit,'pos': 'before','value': 'RM'},\r\n            {'name': currencyDetail.MacedoniawearingDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.MauritiusRupee,'pos': 'before','value': 'MURs'},\r\n            {'name': currencyDetail.MauritanianOuguiya,'pos': 'before','value': 'MRO'},\r\n            {'name': currencyDetail.MongolianTugrik,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.BangladeshiTaka,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.PeruvianNuevoSol,'pos': 'before','value': 'S/'},\r\n            {'name': currencyDetail.MyanmarKyat,'pos': 'before','value': 'K'},\r\n            {'name': currencyDetail.MoldovanLeu,'pos': 'before','value': 'MDL'},\r\n            {'name': currencyDetail.MoroccanDirham,'pos': 'before','value': 'dh'},\r\n            {'name': currencyDetail.MozambiqueMetical,'pos': 'before','value': 'MTn'},\r\n            {'name': currencyDetail.MexicanPeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.NamibianDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.SouthAfricanRand,'pos': 'before','value': 'R'},\r\n            {'name': currencyDetail.SouthSudanesePound,'pos': 'before','value': '￡'},\r\n            {'name': currencyDetail.NicaraguaCordoba,'pos': 'before','value': 'C$'},\r\n            {'name': currencyDetail.NepaleseRupee,'pos': 'before','value': 'Rs'},\r\n            {'name': currencyDetail.NigerianNaira,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.NorwegianKrone,'pos': 'after','value': 'kr'},\r\n            {'name': currencyDetail.GeorgianLari,'pos': 'before','value': 'GEL'},\r\n            {'name': currencyDetail.RenminbiOffshore,'pos': 'before','value': '￥'},\r\n            {'name': currencyDetail.SwedishKrona,'pos': 'after','value': 'kr'},\r\n            {'name': currencyDetail.SwissFranc,'pos': 'before','value': 'CHF'},\r\n            {'name': currencyDetail.SerbianDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.SierraLeone,'pos': 'before','value': 'SLL'},\r\n            {'name': currencyDetail.SeychellesRupee,'pos': 'before','value': 'SCR'},\r\n            {'name': currencyDetail.SaudiRiyal,'pos': 'before','value': 'Rial'},\r\n            {'name': currencyDetail.SaoTomeDobra,'pos': 'before','value': 'Db'},\r\n            {'name': currencyDetail.SaintHelenapound,'pos': 'before','value': '￡'},\r\n            {'name': currencyDetail.SriLankaRupee,'pos': 'before','value': 'Rs'},\r\n            {'name': currencyDetail.SwazilandLilangeni,'pos': 'before','value': 'SZL'},\r\n            {'name': currencyDetail.SudanesePound,'pos': 'before','value': 'SDG'},\r\n            {'name': currencyDetail.Surinamesedollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.SolomonIslandsDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.SomaliShilling,'pos': 'before','value': 'SOS'},\r\n            {'name': currencyDetail.TajikistanSomoni,'pos': 'before','value': 'Som'},\r\n            {'name': currencyDetail.PacificFranc,'pos': 'after','value': 'FCFP'},\r\n            {'name': currencyDetail.ThaiBaht,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.TanzanianShilling,'pos': 'before','value': 'TSh'},\r\n            {'name': currencyDetail.TonganPaanga,'pos': 'before','value': 'T$'},\r\n            {'name': currencyDetail.TrinidadandTobagoDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.TunisianDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.TurkishLira,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.VanuatuVatu,'pos': 'before','value': 'VUV'},\r\n            {'name': currencyDetail.GuatemalanQuetzal,'pos': 'before','value': 'Q'},\r\n            {'name': currencyDetail.CommissionBolivar,'pos': 'before','value': 'Bs'},\r\n            {'name': currencyDetail.BruneiDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.UgandanShilling,'pos': 'before','value': 'UGX'},\r\n            {'name': currencyDetail.UkrainianHryvnia,'pos': 'before','value': 'грн.'},\r\n            {'name': currencyDetail.UruguayanPeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.Uzbekistansom,'pos': 'before','value': 'so?m'},\r\n            {'name': currencyDetail.WesternSamoaTala,'pos': 'before','value': 'WST'},\r\n            {'name': currencyDetail.SingaporeDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.NT,'pos': 'before','value': 'NT$'},\r\n            {'name': currencyDetail.NewZealandDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.HungarianForint,'pos': 'before','value': 'Ft'},\r\n            {'name': currencyDetail.SyrianPound,'pos': 'before','value': '￡'},\r\n            {'name': currencyDetail.JamaicanDollar,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.ArmenianDram,'pos': 'before','value': 'Dram'},\r\n            {'name': currencyDetail.YemeniRial,'pos': 'before','value': 'Rial'},\r\n            {'name': currencyDetail.IraqiDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.IranianRial,'pos': 'before','value': 'Rial'},\r\n            {'name': currencyDetail.NewIsraeliShekel,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.IndianRupee,'pos': 'before','value': '?'},\r\n            {'name': currencyDetail.IndonesianRupiah,'pos': 'before','value': 'Rp'},\r\n            {'name': currencyDetail.JordanianDinar,'pos': 'before','value': 'din'},\r\n            {'name': currencyDetail.VND,'pos': 'after','value': '?'},\r\n            {'name': currencyDetail.ZambianKwacha,'pos': 'before','value': 'ZMW'},\r\n            {'name': currencyDetail.GibraltarPound,'pos': 'before','value': '￡'},\r\n            {'name': currencyDetail.ChileanPeso,'pos': 'before','value': '$'},\r\n            {'name': currencyDetail.CFAFrancBEAC,'pos': 'before','value': 'FCFA'}\r\n        ];\r\n\r\n        this.dateFmtList = locale().dateFmtList;\r\n\r\n        this.numFmtList = [\r\n            {\r\n                \"name\": \"1235\",\r\n                \"value\": \"0\"\r\n            },\r\n            {\r\n                \"name\": \"1234.56\",\r\n                \"value\": \"0.00\"\r\n            },\r\n            {\r\n                \"name\": \"1,235\",\r\n                \"value\": \"#,##0\"\r\n            },\r\n            {\r\n                \"name\": \"1,234.56\",\r\n                \"value\": \"#,##0.00\"\r\n            },\r\n            {\r\n                \"name\": \"1,235\",\r\n                \"value\": \"#,##0_);(#,##0)\"\r\n            },\r\n            {\r\n                \"name\": \"1,235\",\r\n                \"value\": \"#,##0_);[Red](#,##0)\"\r\n            },\r\n            {\r\n                \"name\": \"1,234.56\",\r\n                \"value\": \"#,##0.00_);(#,##0.00)\"\r\n            },\r\n            {\r\n                \"name\": \"1,234.56\",\r\n                \"value\": \"#,##0.00_);[Red](#,##0.00)\"\r\n            },\r\n            {\r\n                \"name\": \"$1,235\",\r\n                \"value\": \"$#,##0_);($#,##0)\"\r\n            },\r\n            {\r\n                \"name\": \"$1,235\",\r\n                \"value\": \"$#,##0_);[Red]($#,##0)\"\r\n            },\r\n            {\r\n                \"name\": \"$1,234.56\",\r\n                \"value\": \"$#,##0.00_);($#,##0.00)\"\r\n            },\r\n            {\r\n                \"name\": \"$1,234.56\",\r\n                \"value\": \"$#,##0.00_);[Red]($#,##0.00)\"\r\n            },\r\n            {\r\n                \"name\": \"1234.56\",\r\n                \"value\": \"@\"\r\n            },\r\n            {\r\n                \"name\": \"123456%\",\r\n                \"value\": \"0%\"\r\n            },\r\n            {\r\n                \"name\": \"123456.00%\",\r\n                \"value\": \"0.00%\"\r\n            },\r\n            {\r\n                \"name\": \"1.23E+03\",\r\n                \"value\": \"0.00E+00\"\r\n            },\r\n            {\r\n                \"name\": \"1.2E+3\",\r\n                \"value\": \"##0.0E+0\"\r\n            },\r\n            {\r\n                \"name\": \"1234 5/9\",\r\n                \"value\": \"# ?/?\"\r\n            },\r\n            {\r\n                \"name\": \"1234 14/25\",\r\n                \"value\": \"# ??/??\"\r\n            },\r\n            {\r\n                \"name\": \"$ 1,235\",\r\n                \"value\": '_($* #,##0_);_(...($* \"-\"_);_(@_)'\r\n            },\r\n            {\r\n                \"name\": \"1,235\",\r\n                \"value\": '_(* #,##0_);_(*..._(* \"-\"_);_(@_)'\r\n            },\r\n            {\r\n                \"name\": \"$ 1,234.56\",\r\n                // \"value\": '_($* #,##0.00_)...* \"-\"??_);_(@_)'\r\n                \"value\": '_($* #,##0.00_);_(...($* \"-\"_);_(@_)'\r\n            },\r\n            {\r\n                \"name\": \"1,234.56\",\r\n                \"value\": '_(* #,##0.00_);...* \"-\"??_);_(@_)'\r\n            },\r\n        ]    \r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-moreFormat-dialog\").remove();\r\n\r\n        let title = \"\", content = '';\r\n\r\n        if(type == \"morecurrency\"){ //货币\r\n            title = locale_format.titleCurrency;\r\n\r\n            let listHtml = '';\r\n\r\n            for(let i = 0; i < _this.moneyFmtList.length; i++){\r\n                let name = _this.moneyFmtList[i][\"name\"];\r\n                let pos = _this.moneyFmtList[i][\"pos\"];\r\n                let value = _this.moneyFmtList[i][\"value\"];\r\n\r\n                listHtml += '<div class=\"listItem\">'+\r\n                                '<div class=\"name\">'+ name +'</div>'+\r\n                                '<div class=\"value\">'+ value +'</div>'+\r\n                                '<input type=\"hidden\" value=\"'+ pos +'\"/>'+\r\n                            '</div>';\r\n            }\r\n\r\n            content = '<div class=\"box\" id=\"morecurrency\">'+\r\n                        '<div class=\"decimal\">'+\r\n                            '<label>'+ locale_format.decimalPlaces +'：</label>'+\r\n                            '<input type=\"number\" class=\"formulaInputFocus\" value=\"2\" min=\"0\" max=\"9\"/>'+\r\n                        '</div>'+\r\n                        '<div class=\"listbox\">'+ listHtml +'</div>'+\r\n                      '</div>';\r\n        }\r\n        else if(type == \"moredatetime\"){ //日期时间\r\n            title = locale_format.titleDateTime;\r\n\r\n            let listHtml = '';\r\n\r\n            for(let i = 0; i < _this.dateFmtList.length; i++){\r\n                let name = _this.dateFmtList[i][\"name\"];\r\n                let value = _this.dateFmtList[i][\"value\"];\r\n\r\n                listHtml += '<div class=\"listItem\">'+\r\n                                '<div class=\"name\">'+ name +'</div>'+\r\n                                '<div class=\"value\">'+ value +'</div>'+\r\n                            '</div>';\r\n            }\r\n\r\n            content = '<div class=\"box\" id=\"moredatetime\">'+\r\n                        '<div class=\"listbox\">'+ listHtml +'</div>'+\r\n                      '</div>';\r\n        }\r\n        else if(type == \"moredigit\"){ //数字\r\n            title = locale_format.titleNumber;\r\n\r\n            let listHtml = '';\r\n\r\n            for(let i = 0; i < _this.numFmtList.length; i++){\r\n                let name = _this.numFmtList[i][\"name\"];\r\n                let value = _this.numFmtList[i][\"value\"];\r\n\r\n                listHtml += '<div class=\"listItem\">'+\r\n                                '<div class=\"name\">'+ name +'</div>'+\r\n                                '<div class=\"value\">'+ value +'</div>'+\r\n                            '</div>';\r\n            }\r\n\r\n            content = '<div class=\"box\" id=\"moredigit\">'+\r\n                        '<div class=\"listbox\">'+ listHtml +'</div>'+\r\n                      '</div>';\r\n        }\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-moreFormat-dialog\", \r\n            \"addclass\": \"luckysheet-moreFormat-dialog\", \r\n            \"title\": title, \r\n            \"content\": content, \r\n            \"botton\": '<button id=\"luckysheet-moreFormat-dialog-confirm\" class=\"btn btn-primary\">'+ locale_button.confirm +'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+ locale_button.cancel +'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-moreFormat-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 400).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-moreFormat-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n        \r\n        $(\"#luckysheet-moreFormat-dialog .listbox .listItem\").eq(0).addClass(\"on\");\r\n    },\r\n    init: function(){\r\n        let _this = this;\r\n\r\n        //选择格式\r\n        $(document).on(\"click\", \"#luckysheet-moreFormat-dialog .listbox .listItem\", function(){\r\n            $(this).addClass(\"on\").siblings().removeClass(\"on\");\r\n        });\r\n\r\n        //确定\r\n        $(document).off(\"click.moreFormatConfirm\").on(\"click.moreFormatConfirm\", \"#luckysheet-moreFormat-dialog #luckysheet-moreFormat-dialog-confirm\", function(){\r\n            $(\"#luckysheet-moreFormat-dialog\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n            let value = $(\"#luckysheet-moreFormat-dialog .listbox .listItem.on .value\").text();\r\n            let id = $(this).parents(\"#luckysheet-moreFormat-dialog\").find(\".box\").attr(\"id\");\r\n\r\n            if(id == \"morecurrency\"){ //货币\r\n                if(value.indexOf(\"?\") != -1){\r\n                    return;\r\n                }\r\n\r\n                let decimal = parseInt($(\"#luckysheet-moreFormat-dialog .decimal input\").val().trim());\r\n\r\n                if(decimal.toString() == \"NaN\" || decimal < 0 || decimal > 9){\r\n                    if(isEditMode()){\r\n                        alert(\"小数位数必须在0-9之间！\");\r\n                    }   \r\n                    else{\r\n                        tooltip.info(\"小数位数必须在0-9之间！\", \"\");\r\n                    }\r\n\r\n                    return;\r\n                }\r\n\r\n                let str = \"\";\r\n\r\n                if(decimal > 0){\r\n                    for(let i = 1; i <= decimal; i++){\r\n                        str += \"0\";\r\n                    }\r\n\r\n                    str = \"0.\" + str;\r\n                }\r\n                else{\r\n                    str = \"#\";\r\n                }\r\n\r\n                let pos = $(\"#luckysheet-moreFormat-dialog .listbox .listItem.on input:hidden\").val();\r\n\r\n                if(pos == \"before\"){\r\n                    str = '\"' + value + '\" ' + str;\r\n                }\r\n                else if(pos == \"after\"){\r\n                    str = str + ' \"' + value + '\"';\r\n                }\r\n\r\n                menuButton.updateFormat(d, \"ct\", str);\r\n            }\r\n            else if(id == \"moredatetime\"){ //日期时间\r\n                menuButton.updateFormat(d, \"ct\", value);\r\n            }\r\n            else if(id == \"moredigit\"){ //数字\r\n                menuButton.updateFormat(d, \"ct\", value);\r\n            }\r\n        })\r\n    }\r\n}\r\n\r\nexport default luckysheetMoreFormat;"
  },
  {
    "path": "src/controllers/orderBy.js",
    "content": "\r\nimport { modelHTML } from './constant';\r\n\r\nimport { selectHightlightShow } from './select';\r\nimport {checkProtectionAuthorityNormal} from './protection';\r\nimport { \r\n    replaceHtml,\r\n    chatatABC, \r\n} from '../utils/util';\r\nimport { rowlenByRange } from '../global/getRowlen';\r\nimport {  isEditMode } from '../global/validate';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport { \r\n    jfrefreshgrid, \r\n} from '../global/refresh';\r\nimport { getcellvalue } from '../global/getdata';\r\nimport { orderbydata,  sortColumnSeletion } from '../global/sort';\r\nimport tooltip from '../global/tooltip';\r\nimport editor from '../global/editor';\r\nimport { isdatatype } from '../global/datecontroll';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n\r\nexport function orderByInitial(){\r\n    const _locale = locale();\r\n    //菜单栏 排序按钮\r\n    $(\"#luckysheetorderbyasc, #luckysheetorderbyasc_t\").mousedown(function (event) {\r\n        cleargridelement(event);\r\n        sortColumnSeletion(Store.orderbyindex, true);\r\n        selectHightlightShow();\r\n    });\r\n\r\n    $(\"#luckysheetorderbydesc, #luckysheetorderbydesc_t\").click(function (event) {\r\n        cleargridelement(event);\r\n        sortColumnSeletion(Store.orderbyindex, false);\r\n        selectHightlightShow();\r\n    }); \r\n\r\n    //排序事件\r\n    let luckysheet_sort_initial = true;\r\n    $(\"#luckysheetorderby\").click(function () {\r\n\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"sort\")){\r\n            return;\r\n        }\r\n\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        const locale_sort = _locale.sort;\r\n        if(Store.luckysheet_select_save.length > 1){\r\n            if(isEditMode()){\r\n                alert(locale_sort.noRangeError);\r\n            }\r\n            else{\r\n                tooltip.info(locale_sort.noRangeError, \"\"); \r\n            }\r\n            return;\r\n        }\r\n\r\n        let last = Store.luckysheet_select_save[0];\r\n        let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n        let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n\r\n        if (luckysheet_sort_initial) {\r\n            luckysheet_sort_initial = false;\r\n            \r\n            let content = `<div style=\"overflow: hidden;\" class=\"luckysheet-sort-modal\"><div><label><input type=\"checkbox\" id=\"luckysheet-sort-haveheader\"/><span>${locale_sort.hasTitle}</span></label></div><div style=\"overflow-y:auto;\" id=\"luckysheet-sort-dialog-tablec\"><table data-itemcount=\"0\" cellspacing=\"0\"> <tr><td>${locale_sort.hasTitle} <select name=\"sort_0\"> <option value=\"1\">1</option> <option value=\"2\">2</option> <option value=\"3\">3</option> <option value=\"4\">4</option> </select> </td> <td> <div><label><input value=\"asc\" type=\"radio\" checked=\"checked\" name=\"sort_0\"><span>${locale_sort.asc}A-Z</span></label></div> <div><label><input value=\"desc\" type=\"radio\" name=\"sort_0\"><span>${locale_sort.desc}Z-A</span></label></div></td></tr></table></div><div style=\"background: #e5e5e5;border-top: 1px solid #f5f5f5; height: 1px; width: 100%;margin:2px 0px;margin-bottom:10px;\"></div> <div> <span style=\"font-weight: bold; text-decoration: underline;text-align:center;color: blue;cursor: pointer;\" class=\"luckysheet-sort-dialog-additem\">+ ${locale_sort.addOthers}</span> </div> </div>`;\r\n\r\n            $(\"body\").append(replaceHtml(modelHTML, { \"id\": \"luckysheet-sort-dialog\", \"addclass\": \"\", \"title\": _locale.sort.sortTitle, \"content\": content, \"botton\": `<button id=\"luckysheet-sort-modal-confirm\" class=\"btn btn-primary\">${locale_sort.confirm}</button><button class=\"btn btn-default luckysheet-model-close-btn\">${locale_sort.close}</button>`}));\r\n\r\n            $(\"#luckysheet-sort-dialog .luckysheet-sort-dialog-additem\").click(function () {\r\n                let last = Store.luckysheet_select_save[0];\r\n                let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n                let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n\r\n                let option = \"\", i = $(\"#luckysheet-sort-dialog table\").data(\"itemcount\") + 1;\r\n                let t = $(\"#luckysheet-sort-haveheader\").is(':checked');\r\n\r\n                for (let c = c1; c <= c2; c++) {\r\n                    if (t) {\r\n                        let v = getcellvalue(r1, c, Store.flowdata, \"m\");\r\n\r\n                        if(v == null){\r\n                            v = locale_sort.columnOperation + (c - c1 + 1); \r\n                        }\r\n\r\n                        option += '<option value=\"' + c + '\">' + v + '</option>';\r\n                    }\r\n                    else {\r\n                        option += '<option value=\"' + c + '\">' + chatatABC(c) + '</option>';\r\n                    }\r\n                }\r\n\r\n                $(\"#luckysheet-sort-dialog table\").append(`\r\n                    <tr class=\"luckysheet-sort-dialog-tr\">\r\n                        <td><span class=\"luckysheet-sort-item-close\" onclick=\"$(this).parent().parent().remove();\"><i class=\"fa fa-times\"\r\n                                    aria-hidden=\"true\"></i></span>${locale_sort.secondaryTitle} <select\r\n                                name=\"sort_${i}\">${option}</select> </td>\r\n                        <td>\r\n                            <div><label><input value=\"asc\" type=\"radio\" checked=\"checked\"\r\n                                        name=\"sort_${i}\"><span>${locale_sort.asc}A-Z</span></label></div>\r\n                            <div><label><input value=\"desc\" type=\"radio\" name=\"sort_${i}\"><span>${locale_sort.desc}Z-A</span></label>\r\n                            </div>\r\n                        </td>\r\n                    </tr>\r\n                `);\r\n                $(\"#luckysheet-sort-dialog table\").data(\"itemcount\", i);\r\n            });\r\n\r\n            $(\"#luckysheet-sort-haveheader\").change(function () {\r\n                let last = Store.luckysheet_select_save[0];\r\n                let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n                let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n\r\n                let t = $(this).is(':checked');\r\n                let option = \"\";\r\n\r\n                for (let c = c1; c <= c2; c++) {\r\n                    if (t) {\r\n                        let v = getcellvalue(r1, c, Store.flowdata, \"m\");\r\n                        \r\n                        if(v == null){\r\n                            v = locale_sort.columnOperation + (c - c1 + 1); \r\n                        }\r\n\r\n                        option += '<option value=\"' + c + '\">' + v + '</option>';\r\n                    }\r\n                    else {\r\n                        option += '<option value=\"' + c + '\">' + chatatABC(c) + '</option>';\r\n                    }\r\n                }\r\n\r\n                $(\"#luckysheet-sort-dialog tr select\").each(function () {\r\n                    $(this).html(option);\r\n                });\r\n            });\r\n\r\n            //Custom sort\r\n            $(\"#luckysheet-sort-modal-confirm\").click(function () {\r\n                if(Store.luckysheet_select_save.length > 1){\r\n                    if(isEditMode()){\r\n                        alert(locale_sort.noRangeError);\r\n                    }\r\n                    else{\r\n                        tooltip.info(locale_sort.noRangeError, \"\");\r\n                    }\r\n\r\n                    return;\r\n                }\r\n\r\n                let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n                let last = Store.luckysheet_select_save[0];\r\n                let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n                let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n\r\n                //Data has header row\r\n                let t = $(\"#luckysheet-sort-haveheader\").is(':checked');\r\n\r\n                let str;\r\n                if(t){\r\n                    str = r1 + 1;\r\n                }\r\n                else{\r\n                    str = r1;\r\n                }\r\n\r\n                let hasMc = false; //Whether the sort selection has merged cells\r\n\r\n                let data = [];\r\n\r\n                for(let r = str; r <= r2; r++){\r\n                    let data_row = [];\r\n\r\n                    for(let c = c1; c <= c2; c++){\r\n                        if(d[r][c] != null && d[r][c].mc != null){\r\n                            hasMc = true;\r\n                            break;\r\n                        }\r\n\r\n                        data_row.push(d[r][c]);\r\n                    }\r\n\r\n                    data.push(data_row);\r\n                }\r\n\r\n                if(hasMc){\r\n                    if(isEditMode()){\r\n                        alert(locale_sort.mergeError);\r\n                    }\r\n                    else{\r\n                        tooltip.info(locale_sort.mergeError, \"\");\r\n                    }\r\n\r\n                    return;\r\n                }\r\n                \r\n                $($(\"#luckysheet-sort-dialog table tr\").toArray().reverse()).each(function () {\r\n                    let i = $(this).find(\"select\").val(), \r\n                        asc = $(this).find('input:radio:checked').val();\r\n                    \r\n                    i -= c1;\r\n                    \r\n                    if (asc == \"asc\") {\r\n                        asc = true;\r\n                    }\r\n                    else {\r\n                        asc = false;\r\n                    }\r\n\r\n                    data = orderbydata([].concat(data), i, asc);\r\n                });\r\n\r\n                for(let r = str; r <= r2; r++){\r\n                    for(let c = c1; c <= c2; c++){\r\n                        d[r][c] = data[r - str][c - c1];\r\n                    }\r\n                }\r\n\r\n                let allParam = {};\r\n                if(Store.config[\"rowlen\"] != null){\r\n                    let cfg = $.extend(true, {}, Store.config);\r\n                    cfg = rowlenByRange(d, str, r2, cfg);\r\n\r\n                    allParam = {\r\n                        \"cfg\": cfg,\r\n                        \"RowlChange\": true\r\n                    }\r\n                }\r\n\r\n                jfrefreshgrid(d, [{ \"row\": [str, r2], \"column\": [c1, c2] }], allParam);\r\n\r\n                $(\"#luckysheet-sort-dialog\").hide();\r\n                $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            });\r\n        }\r\n\r\n        let option = \"\";\r\n        for (let c = c1; c <= c2; c++) {\r\n            option += '<option value=\"' + c + '\">' + chatatABC(c) + '</option>';\r\n        }\r\n\r\n        $(\"#luckysheet-sort-dialog select\").html(option);\r\n\r\n        $(\"#luckysheet-sort-dialog .luckysheet-sort-dialog-tr\").remove();\r\n\r\n        $(\"#luckysheet-sort-haveheader\").prop(\"checked\", false);\r\n        $(\"#luckysheet-sort-dialog input:radio:first\").prop(\"checked\", \"checked\");\r\n\r\n        $(\"#luckysheet-sort-dialog .luckysheet-modal-dialog-title-text\").html(locale_sort.sortRangeTitle+\"<span>\" + chatatABC(c1) + (r1 + 1) + \"</span>\"+ locale_sort.sortRangeTitleTo +\"<span>\" + chatatABC(c2) + (r2 + 1) + \"</span>\");\r\n\r\n        let $t = $(\"#luckysheet-sort-dialog\"), myh = $t.outerHeight(), myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n\r\n        $(\"#luckysheet-sort-dialog-tablec\").css(\"max-height\", (winh - myh) / 2);\r\n        $(\"#luckysheet-sort-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 2 }).show();\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n\r\n        if (r1 < r2) {\r\n            setTimeout(function () {\r\n                let flowrowdata1 = Store.flowdata[r1], \r\n                    flowrowdata2 = Store.flowdata[r1 + 1], \r\n                    hastitle = false;\r\n                \r\n                for (let i = c1; i <= c2; i++) {\r\n                    let isdatatype_r1 = isdatatype(flowrowdata1[i]), \r\n                        isdatatype_r2 = isdatatype(flowrowdata2[i]);\r\n                    \r\n                    if (isdatatype_r1 != isdatatype_r2) {\r\n                        hastitle = true;\r\n                    }\r\n                }\r\n\r\n                if (hastitle) {\r\n                    $(\"#luckysheet-sort-haveheader\").prop(\"checked\", true).change();\r\n                }\r\n            }, 10);\r\n        }\r\n    });\r\n}"
  },
  {
    "path": "src/controllers/pivotTable.js",
    "content": "import { getSheetIndex, getRangetxt } from \"../methods/get\";\r\nimport {\r\n    replaceHtml,\r\n    getObjType,\r\n    ABCatNum,\r\n    numFormat,\r\n    numfloatlen,\r\n    showrightclickmenu,\r\n    mouseclickposition,\r\n} from \"../utils/util\";\r\nimport { getdatabyselectionD, getcellvalue, datagridgrowth } from \"../global/getdata\";\r\nimport { isdatetime, diff, isdatatypemulti, isdatatype } from \"../global/datecontroll\";\r\nimport { genarate, update } from \"../global/format\";\r\nimport { isRealNull, isEditMode } from \"../global/validate\";\r\nimport { orderbydata1D } from \"../global/sort\";\r\nimport { jfrefreshgrid, jfrefreshgridall } from \"../global/refresh\";\r\nimport tooltip from \"../global/tooltip\";\r\nimport editor from \"../global/editor\";\r\nimport cleargridelement from \"../global/cleargridelement\";\r\nimport luckysheetArray from \"../global/array\";\r\nimport analysis from \"../global/analysis\";\r\nimport { selectHightlightShow } from \"./select\";\r\nimport { luckysheet_searcharray } from \"./sheetSearch\";\r\nimport {\r\n    modelHTML,\r\n    filtermenuHTML,\r\n    filtersubmenuHTML,\r\n    pivottableconfigHTML,\r\n    pivottablesumHTML,\r\n    luckysheetPivotTableHTML,\r\n} from \"./constant\";\r\nimport sheetmanage from \"./sheetmanage\";\r\nimport luckysheetsizeauto from \"./resize\";\r\nimport server from \"./server\";\r\nimport { checkProtectionAuthorityNormal } from \"./protection\";\r\nimport Store from \"../store\";\r\nimport locale from \"../locale/locale\";\r\nimport numeral from \"numeral\";\r\nimport { luckysheetlodingHTML } from \"../controllers/constant\";\r\n\r\nconst pivotTable = {\r\n    pivotDatas: null,\r\n    pivotSheetIndex: 0,\r\n    pivotDataSheetIndex: 0,\r\n    celldata: null,\r\n    origindata: null,\r\n    getCellData: function(cursheetindex, datasheetindex, data_select_save) {\r\n        let _this = this;\r\n\r\n        let sheetIndex;\r\n        if (cursheetindex != null) {\r\n            sheetIndex = cursheetindex;\r\n        } else {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        let realIndex = getSheetIndex(sheetIndex);\r\n\r\n        if (getObjType(Store.luckysheetfile[realIndex].pivotTable) != \"object\") {\r\n            Store.luckysheetfile[realIndex].pivotTable = new Function(\r\n                \"return \" + Store.luckysheetfile[realIndex].pivotTable,\r\n            )();\r\n        }\r\n\r\n        if (Store.luckysheetfile[realIndex].pivotTable != null) {\r\n            _this.column = Store.luckysheetfile[realIndex].pivotTable.column;\r\n            _this.row = Store.luckysheetfile[realIndex].pivotTable.row;\r\n            _this.values = Store.luckysheetfile[realIndex].pivotTable.values;\r\n            _this.filter = Store.luckysheetfile[realIndex].pivotTable.filter;\r\n            _this.showType = Store.luckysheetfile[realIndex].pivotTable.showType;\r\n\r\n            _this.filterparm = Store.luckysheetfile[realIndex].pivotTable.filterparm;\r\n\r\n            if (Store.luckysheetfile[realIndex].pivotTable.drawPivotTable != null) {\r\n                _this.drawPivotTable = Store.luckysheetfile[realIndex].pivotTable.drawPivotTable;\r\n            } else {\r\n                _this.drawPivotTable = true;\r\n            }\r\n\r\n            if (Store.luckysheetfile[realIndex].pivotTable.pivotTableBoundary != null) {\r\n                _this.pivotTableBoundary = Store.luckysheetfile[realIndex].pivotTable.pivotTableBoundary;\r\n            } else {\r\n                _this.pivotTableBoundary = [12, 6];\r\n            }\r\n\r\n            if (data_select_save != null) {\r\n                _this.pivot_select_save = data_select_save;\r\n            } else {\r\n                _this.pivot_select_save = Store.luckysheetfile[realIndex].pivotTable.pivot_select_save;\r\n            }\r\n\r\n            if (datasheetindex != null) {\r\n                _this.pivotDataSheetIndex = datasheetindex;\r\n            } else {\r\n                _this.pivotDataSheetIndex = Store.luckysheetfile[realIndex].pivotTable.pivotDataSheetIndex;\r\n            }\r\n        } else {\r\n            _this.column = null;\r\n            _this.row = null;\r\n            _this.values = null;\r\n            _this.filter = null;\r\n            _this.showType = null;\r\n\r\n            _this.filterparm = null;\r\n\r\n            _this.drawPivotTable = true;\r\n            _this.pivotTableBoundary = [12, 6];\r\n\r\n            if (data_select_save != null) {\r\n                _this.pivot_select_save = data_select_save;\r\n            } else {\r\n                _this.pivot_select_save = Store.luckysheet_select_save;\r\n            }\r\n\r\n            if (datasheetindex != null) {\r\n                _this.pivotDataSheetIndex = datasheetindex;\r\n            } else {\r\n                _this.pivotDataSheetIndex = sheetIndex;\r\n            }\r\n        }\r\n\r\n        let pivotrealIndex = getSheetIndex(_this.pivotDataSheetIndex);\r\n\r\n        let otherfile = Store.luckysheetfile[pivotrealIndex];\r\n        if (otherfile[\"data\"] == null) {\r\n            otherfile[\"data\"] = sheetmanage.buildGridData(otherfile);\r\n        }\r\n        _this.origindata = getdatabyselectionD(otherfile.data, _this.pivot_select_save);\r\n\r\n        let rowhidden = {};\r\n        if (_this.filterparm != null) {\r\n            for (let f in _this.filterparm) {\r\n                // 目的是取出rowhidden\r\n                for (let h in _this.filterparm[f]) {\r\n                    if (h === \"rowhidden\" && _this.filterparm[f][h] != null) {\r\n                        rowhidden = $.extend(true, rowhidden, _this.filterparm[f][h]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        _this.rowhidden = rowhidden;\r\n\r\n        _this.pivotSheetIndex = sheetIndex;\r\n\r\n        let newdata = [];\r\n        for (let i = 0; i < _this.origindata.length; i++) {\r\n            if (_this.rowhidden != null && _this.rowhidden[i] != null) {\r\n                continue;\r\n            }\r\n            newdata.push([].concat(_this.origindata[i]));\r\n        }\r\n        _this.celldata = newdata;\r\n\r\n        _this.pivot_data_type = {};\r\n        for (let c = 0; c < _this.celldata[1].length; c++) {\r\n            let type = isdatatype(_this.celldata[1][c]);\r\n            _this.pivot_data_type[c.toString()] = type;\r\n        }\r\n    },\r\n    pivot_data_type: {},\r\n    pivot_select_save: null,\r\n    column: null,\r\n    row: null,\r\n    values: null,\r\n    filter: null,\r\n    showType: null,\r\n    rowhidden: null,\r\n    selected: null,\r\n    caljs: null,\r\n    initial: true,\r\n    filterparm: null,\r\n    luckysheet_pivotTable_select_state: false,\r\n    jgridCurrentPivotInput: null,\r\n    movestate: false,\r\n    moveitemposition: [],\r\n    movesave: {},\r\n    showvaluecolrow: function() {\r\n        let _this = this;\r\n\r\n        if ($(\"#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item\").length >= 2) {\r\n            $(\"#luckysheetpivottablevaluecolrowshow\").show();\r\n\r\n            if (_this.showType == \"column\") {\r\n                $(\"#luckysheetpivottablevaluecolrow\").prop(\"checked\", true);\r\n                $(\"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']\").addClass(\r\n                    \"ui-state-active\",\r\n                );\r\n\r\n                $(\"#luckysheetpivottablevaluecolrow1\").prop(\"checked\", false);\r\n                $(\"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']\").removeClass(\r\n                    \"ui-state-active\",\r\n                );\r\n            } else {\r\n                $(\"#luckysheetpivottablevaluecolrow1\").prop(\"checked\", true);\r\n                $(\"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']\").addClass(\r\n                    \"ui-state-active\",\r\n                );\r\n\r\n                $(\"#luckysheetpivottablevaluecolrow\").prop(\"checked\", false);\r\n                $(\"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']\").removeClass(\r\n                    \"ui-state-active\",\r\n                );\r\n            }\r\n        } else {\r\n            $(\"#luckysheetpivottablevaluecolrowshow\").hide();\r\n        }\r\n    },\r\n    resetOrderby: function(obj) {\r\n        let orderby = $(\"#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item\").index(obj);\r\n        $(\"#luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column\")\r\n            .find(\".luckysheet-modal-dialog-slider-config-item\")\r\n            .each(function() {\r\n                if ($(this).data(\"orderby\") == orderby) {\r\n                    $(this).data(\"orderby\", \"self\");\r\n                }\r\n            });\r\n    },\r\n    luckysheetsliderlistclearfilter: function($filter) {\r\n        let _this = this;\r\n\r\n        let $t = $filter.parent();\r\n        let cindex = $t.data(\"index\");\r\n\r\n        let rowhidden = {},\r\n            selected = {},\r\n            d = _this.origindata,\r\n            filterdata = {};\r\n\r\n        $t.data(\"rowhidden\", \"\")\r\n            .find(\".luckysheet-slider-list-item-filtered\")\r\n            .hide();\r\n        _this.setDatatojsfile(\"selected\", {}, cindex);\r\n        _this.setDatatojsfile(\"rowhidden\", null, cindex);\r\n\r\n        let newdata = [];\r\n        for (let i = 0; i < d.length; i++) {\r\n            if (rowhidden[i] != null) {\r\n                continue;\r\n            }\r\n            newdata.push([].concat(d[i]));\r\n        }\r\n\r\n        _this.celldata = newdata;\r\n        _this.refreshPivotTable();\r\n        $(\"#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu\").hide();\r\n    },\r\n    luckysheetsliderlistitemfilter: function($filter) {\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_filter = _locale.filter;\r\n\r\n        let $t = $filter.parent(),\r\n            toffset = $t.offset(),\r\n            $menu = $(\"#luckysheet-pivotTableFilter-menu\"),\r\n            winH = $(window).height(),\r\n            winW = $(window).width();\r\n\r\n        let cindex = $t.data(\"index\");\r\n\r\n        let rowhidden = $t.data(\"rowhidden\");\r\n        if (rowhidden == null || rowhidden == \"\") {\r\n            rowhidden = {};\r\n        } else if (getObjType(rowhidden) == \"string\") {\r\n            rowhidden = JSON.parse(rowhidden);\r\n        }\r\n\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        $(\"#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu\").hide();\r\n        $(\"#luckysheet-pivotTableFilter-byvalue-input\").val(\"\");\r\n        $(\"#luckysheet-pivotTableFilter-bycondition\")\r\n            .next()\r\n            .hide();\r\n        $(\"#luckysheet-pivotTableFilter-byvalue\")\r\n            .next()\r\n            .show();\r\n\r\n        $menu.data(\"index\", cindex);\r\n\r\n        $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input\")\r\n            .hide()\r\n            .find(\"input\")\r\n            .val();\r\n        $(\"#luckysheet-pivotTableFilter-selected span\")\r\n            .data(\"type\", \"0\")\r\n            .data(\"type\", null)\r\n            .text(locale_filter.filiterInputNone);\r\n\r\n        let byconditiontype = $t.data(\"byconditiontype\");\r\n        $(\"#luckysheet-pivotTableFilter-selected span\")\r\n            .data(\"value\", $t.data(\"byconditionvalue\"))\r\n            .data(\"type\", byconditiontype)\r\n            .text($t.data(\"byconditiontext\"));\r\n\r\n        if (byconditiontype == \"2\") {\r\n            let $input = $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input2\")\r\n                .show()\r\n                .find(\"input\");\r\n            $input.eq(0).val($t.data(\"byconditionvalue1\"));\r\n            $input.eq(1).val($t.data(\"byconditionvalue2\"));\r\n        } else if (byconditiontype == \"1\") {\r\n            $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input\")\r\n                .eq(0)\r\n                .show()\r\n                .find(\"input\")\r\n                .val($t.data(\"byconditionvalue1\"));\r\n        }\r\n        const loadingObj = luckysheetlodingHTML(\"#luckysheet-pivotTableFilter-byvalue-select\", {\r\n            text: locale_filter.filiterMoreDataTip,\r\n        });\r\n        $(\"#luckysheet-pivotTableFilter-byvalue-select\")\r\n            .empty()\r\n            .append(loadingObj.el);\r\n\r\n        let rowhiddenother = {}; //其它筛选列的隐藏行\r\n        $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\")\r\n            .not($t.get(0))\r\n            .each(function() {\r\n                let $t = $(this),\r\n                    rh = $t.data(\"rowhidden\");\r\n\r\n                if (rh == null || rh == \"\") {\r\n                    return true;\r\n                }\r\n\r\n                if (getObjType(rh) == \"string\") {\r\n                    rh = JSON.parse(rh);\r\n                }\r\n\r\n                for (let r in rh) {\r\n                    rowhiddenother[r] = 0;\r\n                }\r\n            });\r\n\r\n        let data = _this.origindata;\r\n\r\n        setTimeout(function() {\r\n            //日期值\r\n            let dvmap = {};\r\n            let dvmap_uncheck = {};\r\n\r\n            //除日期以外的值\r\n            let vmap = {};\r\n            let vmap_uncheck = {};\r\n\r\n            for (let r = 1; r < data.length; r++) {\r\n                if (r in rowhiddenother) {\r\n                    continue;\r\n                }\r\n\r\n                if (data[r] == null) {\r\n                    continue;\r\n                }\r\n\r\n                let cell = data[r][cindex];\r\n\r\n                if (cell != null && cell.ct != null && cell.ct.t == \"d\") {\r\n                    //单元格是日期\r\n                    let v = update(\"YYYY-MM-DD\", cell.v);\r\n\r\n                    let y = v.split(\"-\")[0];\r\n                    let m = v.split(\"-\")[1];\r\n                    let d = v.split(\"-\")[2];\r\n\r\n                    if (!(y in dvmap)) {\r\n                        dvmap[y] = {};\r\n                    }\r\n\r\n                    if (!(m in dvmap[y])) {\r\n                        dvmap[y][m] = {};\r\n                    }\r\n\r\n                    if (!(d in dvmap[y][m])) {\r\n                        dvmap[y][m][d] = 0;\r\n                    }\r\n\r\n                    dvmap[y][m][d]++;\r\n\r\n                    if (r in rowhidden) {\r\n                        dvmap_uncheck[y] = 0;\r\n                        dvmap_uncheck[m] = 0;\r\n                        dvmap_uncheck[d] = 0;\r\n                    }\r\n                } else {\r\n                    let v, m;\r\n                    if (cell == null || isRealNull(cell.v)) {\r\n                        v = null;\r\n                        m = null;\r\n                    } else {\r\n                        v = cell.v;\r\n                        m = cell.m;\r\n                    }\r\n\r\n                    if (!(v in vmap)) {\r\n                        vmap[v] = {};\r\n                    }\r\n\r\n                    if (!(m in vmap[v])) {\r\n                        vmap[v][m] = 0;\r\n                    }\r\n\r\n                    vmap[v][m]++;\r\n\r\n                    if (r in rowhidden) {\r\n                        vmap_uncheck[v + \"#$$$#\" + m] = 0;\r\n                    }\r\n                }\r\n            }\r\n\r\n            //遍历数据加到页面\r\n            let item = [];\r\n\r\n            if (JSON.stringify(dvmap).length > 2) {\r\n                for (let y in dvmap) {\r\n                    let ysum = 0;\r\n                    let monthHtml = \"\";\r\n\r\n                    for (let m in dvmap[y]) {\r\n                        let msum = 0;\r\n                        let dayHtml = \"\";\r\n\r\n                        for (let d in dvmap[y][m]) {\r\n                            let dayL = dvmap[y][m][d];\r\n                            msum += dayL;\r\n\r\n                            //月 小于 10\r\n                            let mT;\r\n                            if (Number(m) < 10) {\r\n                                mT = \"0\" + Number(m);\r\n                            } else {\r\n                                mT = m;\r\n                            }\r\n\r\n                            //日 小于 10\r\n                            let dT;\r\n                            if (Number(d) < 10) {\r\n                                dT = \"0\" + Number(d);\r\n                            } else {\r\n                                dT = d;\r\n                            }\r\n\r\n                            //日是否选中状态\r\n                            if (y in dvmap_uncheck && m in dvmap_uncheck && d in dvmap_uncheck) {\r\n                                dayHtml +=\r\n                                    '<div class=\"day luckysheet-mousedown-cancel cf\" data-check=\"false\" title=\"' +\r\n                                    y +\r\n                                    \"-\" +\r\n                                    mT +\r\n                                    \"-\" +\r\n                                    dT +\r\n                                    '\">' +\r\n                                    '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                    '<label class=\"luckysheet-mousedown-cancel\">' +\r\n                                    d +\r\n                                    \"</label>\" +\r\n                                    '<span class=\"count luckysheet-mousedown-cancel\">( ' +\r\n                                    dayL +\r\n                                    \" )</span>\" +\r\n                                    \"</div>\";\r\n                            } else {\r\n                                dayHtml +=\r\n                                    '<div class=\"day luckysheet-mousedown-cancel cf\" data-check=\"true\" title=\"' +\r\n                                    y +\r\n                                    \"-\" +\r\n                                    mT +\r\n                                    \"-\" +\r\n                                    dT +\r\n                                    '\">' +\r\n                                    '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                    '<label class=\"luckysheet-mousedown-cancel\">' +\r\n                                    d +\r\n                                    \"</label>\" +\r\n                                    '<span class=\"count luckysheet-mousedown-cancel\">( ' +\r\n                                    dayL +\r\n                                    \" )</span>\" +\r\n                                    \"</div>\";\r\n                            }\r\n                        }\r\n\r\n                        ysum += msum;\r\n\r\n                        //月 小于 10\r\n                        let mT2;\r\n                        if (Number(m) < 10) {\r\n                            mT2 = \"0\" + Number(m);\r\n                        } else {\r\n                            mT2 = m;\r\n                        }\r\n\r\n                        //月是否选中状态\r\n                        if (y in dvmap_uncheck && m in dvmap_uncheck) {\r\n                            monthHtml +=\r\n                                '<div class=\"monthBox luckysheet-mousedown-cancel\">' +\r\n                                '<div class=\"month luckysheet-mousedown-cancel cf\" data-check=\"false\" title=\"' +\r\n                                y +\r\n                                \"-\" +\r\n                                mT2 +\r\n                                '\">' +\r\n                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                '<label class=\"luckysheet-mousedown-cancel\">' +\r\n                                m +\r\n                                \"\" +\r\n                                locale_filter.filiterMonthText +\r\n                                \"</label>\" +\r\n                                '<span class=\"count luckysheet-mousedown-cancel\">( ' +\r\n                                msum +\r\n                                \" )</span>\" +\r\n                                \"</div>\" +\r\n                                '<div class=\"dayList luckysheet-mousedown-cancel\">' +\r\n                                dayHtml +\r\n                                \"</div>\" +\r\n                                \"</div>\";\r\n                        } else {\r\n                            monthHtml +=\r\n                                '<div class=\"monthBox luckysheet-mousedown-cancel\">' +\r\n                                '<div class=\"month luckysheet-mousedown-cancel cf\" data-check=\"true\" title=\"' +\r\n                                y +\r\n                                \"-\" +\r\n                                mT2 +\r\n                                '\">' +\r\n                                '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                '<label class=\"luckysheet-mousedown-cancel\">' +\r\n                                m +\r\n                                \"\" +\r\n                                locale_filter.filiterMonthText +\r\n                                \"</label>\" +\r\n                                '<span class=\"count luckysheet-mousedown-cancel\">( ' +\r\n                                msum +\r\n                                \" )</span>\" +\r\n                                \"</div>\" +\r\n                                '<div class=\"dayList luckysheet-mousedown-cancel\">' +\r\n                                dayHtml +\r\n                                \"</div>\" +\r\n                                \"</div>\";\r\n                        }\r\n                    }\r\n\r\n                    //年是否选中状态\r\n                    let yearHtml;\r\n                    if (y in dvmap_uncheck) {\r\n                        yearHtml =\r\n                            '<div class=\"yearBox luckysheet-mousedown-cancel\">' +\r\n                            '<div class=\"year luckysheet-mousedown-cancel cf\" data-check=\"false\" title=\"' +\r\n                            y +\r\n                            '\">' +\r\n                            '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                            '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                            '<label class=\"luckysheet-mousedown-cancel\">' +\r\n                            y +\r\n                            \"\" +\r\n                            locale_filter.filiterYearText +\r\n                            \"</label>\" +\r\n                            '<span class=\"count luckysheet-mousedown-cancel\">( ' +\r\n                            ysum +\r\n                            \" )</span>\" +\r\n                            \"</div>\" +\r\n                            '<div class=\"monthList luckysheet-mousedown-cancel\">' +\r\n                            monthHtml +\r\n                            \"</div>\" +\r\n                            \"</div>\";\r\n                    } else {\r\n                        yearHtml =\r\n                            '<div class=\"yearBox luckysheet-mousedown-cancel\">' +\r\n                            '<div class=\"year luckysheet-mousedown-cancel cf\" data-check=\"true\" title=\"' +\r\n                            y +\r\n                            '\">' +\r\n                            '<i class=\"fa fa-caret-right luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i>' +\r\n                            '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                            '<label class=\"luckysheet-mousedown-cancel\">' +\r\n                            y +\r\n                            \"\" +\r\n                            locale_filter.filiterYearText +\r\n                            \"</label>\" +\r\n                            '<span class=\"count luckysheet-mousedown-cancel\">( ' +\r\n                            ysum +\r\n                            \" )</span>\" +\r\n                            \"</div>\" +\r\n                            '<div class=\"monthList luckysheet-mousedown-cancel\">' +\r\n                            monthHtml +\r\n                            \"</div>\" +\r\n                            \"</div>\";\r\n                    }\r\n\r\n                    item.unshift(yearHtml);\r\n                }\r\n            }\r\n\r\n            if (JSON.stringify(vmap).length > 2) {\r\n                let vmapKeys = Object.keys(vmap);\r\n                vmapKeys = orderbydata1D(vmapKeys, true);\r\n\r\n                for (let i = 0; i < vmapKeys.length; i++) {\r\n                    let v = vmapKeys[i];\r\n\r\n                    for (let x in vmap[v]) {\r\n                        let text;\r\n                        if (v + \"#$$$#\" + x == \"null#$$$#null\") {\r\n                            text = locale_filter.valueBlank;\r\n                        } else {\r\n                            text = x;\r\n                        }\r\n\r\n                        //是否选中状态\r\n                        let dataHtml;\r\n                        if (v + \"#$$$#\" + x in vmap_uncheck) {\r\n                            dataHtml =\r\n                                '<div class=\"textBox luckysheet-mousedown-cancel cf\" data-check=\"false\" data-filter=\"' +\r\n                                (v + \"#$$$#\" + x) +\r\n                                '\" title=\"' +\r\n                                x +\r\n                                '\">' +\r\n                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\"/>' +\r\n                                '<label class=\"luckysheet-mousedown-cancel\">' +\r\n                                text +\r\n                                \"</label>\" +\r\n                                '<span class=\"luckysheet-mousedown-cancel count\">( ' +\r\n                                vmap[v][x] +\r\n                                \" )</span>\" +\r\n                                \"</div>\";\r\n                        } else {\r\n                            dataHtml =\r\n                                '<div class=\"textBox luckysheet-mousedown-cancel cf\" data-check=\"true\" data-filter=\"' +\r\n                                (v + \"#$$$#\" + x) +\r\n                                '\" title=\"' +\r\n                                x +\r\n                                '\">' +\r\n                                '<input class=\"luckysheet-mousedown-cancel\" type=\"checkbox\" checked=\"checked\"/>' +\r\n                                '<label class=\"luckysheet-mousedown-cancel\">' +\r\n                                text +\r\n                                \"</label>\" +\r\n                                '<span class=\"luckysheet-mousedown-cancel count\">( ' +\r\n                                vmap[v][x] +\r\n                                \" )</span>\" +\r\n                                \"</div>\";\r\n                        }\r\n\r\n                        item.push(dataHtml);\r\n                    }\r\n                }\r\n            }\r\n\r\n            // 适配小屏设备\r\n            let containerH = winH - toffset.top - 350;\r\n            if (containerH < 0) containerH = 100;\r\n            //$(\"#luckysheet-pivotTableFilter-byvalue-select\").html(\"<div class='ListBox luckysheet-mousedown-cancel' style='max-height:\" + containerH + \"px;overflow-y:auto;overflow-x:hidden;'>\" + item.join(\"\") + \"</div>\");\r\n\r\n            $(\"#luckysheet-pivotTableFilter-byvalue-select\").append(\r\n                \"<div class='ListBox luckysheet-mousedown-cancel' style='max-height:\" +\r\n                    containerH +\r\n                    \"px;overflow-y:auto;overflow-x:hidden;'>\" +\r\n                    item.join(\"\") +\r\n                    \"</div>\",\r\n            );\r\n            loadingObj.close();\r\n        }, 1);\r\n\r\n        showrightclickmenu($menu, toffset.left - 250, toffset.top);\r\n    },\r\n    getSumTypeName: function(type) {\r\n        let name = \"\";\r\n\r\n        const _locale = locale();\r\n        const locale_pivotTable = _locale.pivotTable;\r\n\r\n        if (type == \"SUM\") {\r\n            name = locale_pivotTable.valueStatisticsSUM;\r\n        } else if (type == \"COUNT\") {\r\n            name = locale_pivotTable.valueStatisticsCOUNT;\r\n        } else if (type == \"COUNTA\") {\r\n            name = locale_pivotTable.valueStatisticsCOUNTA;\r\n        } else if (type == \"COUNTUNIQUE\") {\r\n            name = locale_pivotTable.valueStatisticsCOUNTUNIQUE;\r\n        } else if (type == \"AVERAGE\") {\r\n            name = locale_pivotTable.valueStatisticsAVERAGE;\r\n        } else if (type == \"MAX\") {\r\n            name = locale_pivotTable.valueStatisticsMAX;\r\n        } else if (type == \"MIN\") {\r\n            name = locale_pivotTable.valueStatisticsMIN;\r\n        } else if (type == \"MEDIAN\") {\r\n            name = locale_pivotTable.valueStatisticsMEDIAN;\r\n        } else if (type == \"PRODUCT\") {\r\n            name = locale_pivotTable.valueStatisticsPRODUCT;\r\n        } else if (type == \"STDEV\") {\r\n            name = locale_pivotTable.valueStatisticsSTDEV;\r\n        } else if (type == \"STDEVP\") {\r\n            name = locale_pivotTable.valueStatisticsSTDEVP;\r\n        } else if (type == \"let\") {\r\n            name = locale_pivotTable.valueStatisticslet;\r\n        } else if (type == \"VARP\") {\r\n            name = locale_pivotTable.valueStatisticsVARP;\r\n        }\r\n\r\n        return name;\r\n    },\r\n    setDatatojsfile: function(attr, value, cindex) {\r\n        let _this = this;\r\n\r\n        let index = getSheetIndex(_this.pivotSheetIndex);\r\n        if (Store.luckysheetfile[index][\"pivotTable\"] == null) {\r\n            Store.luckysheetfile[index][\"pivotTable\"] = {};\r\n        }\r\n\r\n        if (cindex == null) {\r\n            Store.luckysheetfile[index][\"pivotTable\"][attr] = value;\r\n            _this[attr] = value;\r\n        } else {\r\n            if (Store.luckysheetfile[index][\"pivotTable\"][\"filterparm\"] == null) {\r\n                Store.luckysheetfile[index][\"pivotTable\"][\"filterparm\"] = {};\r\n            }\r\n\r\n            if (Store.luckysheetfile[index][\"pivotTable\"][\"filterparm\"][cindex.toString()] == null) {\r\n                Store.luckysheetfile[index][\"pivotTable\"][\"filterparm\"][cindex.toString()] = {};\r\n            }\r\n            Store.luckysheetfile[index][\"pivotTable\"][\"filterparm\"][cindex.toString()][attr] = value;\r\n\r\n            if (_this[\"filterparm\"] == null) {\r\n                _this[\"filterparm\"] = {};\r\n            }\r\n\r\n            if (_this[\"filterparm\"][cindex.toString()] == null) {\r\n                _this[\"filterparm\"][cindex.toString()] = {};\r\n            }\r\n\r\n            _this[\"filterparm\"][cindex.toString()][attr] = value;\r\n        }\r\n    },\r\n    createPivotTable: function(e) {\r\n        if (isEditMode() || Store.allowEdit === false) {\r\n            return;\r\n        }\r\n        let _this = this;\r\n\r\n        let datasheetindex = Store.currentSheetIndex;\r\n\r\n        const _locale = locale();\r\n        const locale_pivotTable = _locale.pivotTable;\r\n\r\n        if (isEditMode()) {\r\n            alert(locale_pivotTable.errorNotAllowEdit);\r\n            return;\r\n        }\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            tooltip.info(\"\", locale_pivotTable.errorNotAllowMulti);\r\n            return;\r\n        }\r\n\r\n        if (\r\n            Store.luckysheet_select_save.length == 0 ||\r\n            Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] ||\r\n            Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1]\r\n        ) {\r\n            tooltip.info(\"\", locale_pivotTable.errorSelectRange);\r\n            return;\r\n        }\r\n\r\n        let select_save = $.extend(true, {}, Store.luckysheet_select_save[0]);\r\n        sheetmanage.addNewSheet(e, true);\r\n\r\n        _this.getCellData(Store.currentSheetIndex, datasheetindex, select_save);\r\n\r\n        _this.setDatatojsfile(\"pivot_select_save\", select_save);\r\n        _this.setDatatojsfile(\"pivotDataSheetIndex\", datasheetindex);\r\n\r\n        _this.initialPivotManage();\r\n    },\r\n    changePivotTable: function(index) {\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_pivotTable = _locale.pivotTable;\r\n\r\n        let pivotDataSheetIndex = Store.luckysheetfile[getSheetIndex(index)].pivotTable.pivotDataSheetIndex;\r\n        let real_pivotDataSheetIndex = getSheetIndex(pivotDataSheetIndex);\r\n\r\n        if (real_pivotDataSheetIndex == null) {\r\n            tooltip.info(locale_pivotTable.errorIsDamage, \"\");\r\n            return;\r\n        }\r\n\r\n        _this.getCellData(index);\r\n        _this.initialPivotManage(true);\r\n        _this.refreshPivotTable(); //初始化在一个普通sheet页，从此普通sheet页切换到数据透视表页时，需要刷新下数据，否则还是旧数据\r\n    },\r\n    refreshPivotTable: function(isRefreshCanvas = true) {\r\n        let _this = this;\r\n\r\n        let redo = {};\r\n        redo[\"pivotTable\"] = pivotTable;\r\n        redo[\"data\"] = editor.deepCopyFlowData(Store.flowdata); //取数据\r\n\r\n        _this.storePivotTableParam();\r\n        let ret = _this.dataHandler(_this.column, _this.row, _this.values, _this.showType, _this.celldata);\r\n        _this.setDatatojsfile(\"pivotDatas\", ret);\r\n\r\n        let d = $.extend(true, [], sheetmanage.nulldata);\r\n        let data = d;\r\n\r\n        let addr = 0,\r\n            addc = 0;\r\n\r\n        if (ret.length == 0) {\r\n            _this.setDatatojsfile(\"drawPivotTable\", true);\r\n            _this.setDatatojsfile(\"pivotTableBoundary\", [12, 6]);\r\n        } else {\r\n            _this.setDatatojsfile(\"drawPivotTable\", false);\r\n            _this.setDatatojsfile(\"pivotTableBoundary\", [ret.length, ret[0].length]);\r\n\r\n            let rlen = ret.length,\r\n                clen = ret[0].length;\r\n\r\n            addr = rlen - d.length;\r\n            addc = clen - d[0].length;\r\n\r\n            data = datagridgrowth(d, addr + 20, addc + 10, true);\r\n\r\n            for (let r = 0; r < rlen; r++) {\r\n                let x = [].concat(data[r]);\r\n                for (let c = 0; c < clen; c++) {\r\n                    let value = \"\";\r\n                    if (ret[r] != null && ret[r][c] != null) {\r\n                        value = getcellvalue(r, c, ret);\r\n                    }\r\n                    x[c] = value;\r\n                }\r\n                data[r] = x;\r\n            }\r\n        }\r\n\r\n        redo[\"type\"] = \"pivotTable_change\";\r\n        redo[\"curdata\"] = $.extend(true, [], data);\r\n        redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n        redo[\"pivotTablecur\"] = _this.getPivotTableData();\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length = 0;\r\n            Store.jfredo.push(redo);\r\n        }\r\n\r\n        cleargridelement();\r\n        Store.clearjfundo = false;\r\n\r\n        if (addr > 0 || addc > 0) {\r\n            jfrefreshgridall(\r\n                data[0].length,\r\n                data.length,\r\n                data,\r\n                null,\r\n                Store.luckysheet_select_save,\r\n                \"datachangeAll\",\r\n                undefined,\r\n                undefined,\r\n                isRefreshCanvas,\r\n            );\r\n        } else {\r\n            jfrefreshgrid(data, Store.luckysheet_select_save, {}, null, isRefreshCanvas);\r\n            selectHightlightShow();\r\n        }\r\n\r\n        Store.clearjfundo = true;\r\n    },\r\n    drawPivotTable: true,\r\n    pivotTableBoundary: [12, 6],\r\n    pivotclick: function(row_index, col_index, index) {\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        let file = Store.luckysheetfile[getSheetIndex(index)];\r\n\r\n        if (!file.isPivotTable) {\r\n            return;\r\n        }\r\n\r\n        let pivotDataSheetIndex = file.pivotTable.pivotDataSheetIndex;\r\n        let real_pivotDataSheetIndex = getSheetIndex(pivotDataSheetIndex);\r\n\r\n        if (real_pivotDataSheetIndex == null) {\r\n            return;\r\n        }\r\n\r\n        let slider = $(\"#luckysheet-modal-dialog-slider-pivot\");\r\n\r\n        let isRangeClick = this.isPivotRange(row_index, col_index);\r\n        if (isRangeClick && slider.is(\":hidden\")) {\r\n            if (!checkProtectionAuthorityNormal(index, \"usePivotTablereports\", false)) {\r\n                // Store.luckysheet_select_status = false;\r\n                return;\r\n            }\r\n            slider.show();\r\n            luckysheetsizeauto();\r\n            $(\"#luckysheet-sta-content\").css(\"padding-right\", 260);\r\n        } else if (!isRangeClick && slider.is(\":visible\")) {\r\n            slider.hide();\r\n            luckysheetsizeauto();\r\n            $(\"#luckysheet-sta-content\").css(\"padding-right\", 10);\r\n        }\r\n    },\r\n    isPivotRange: function(row_index, col_index) {\r\n        let _this = this;\r\n\r\n        if (!!Store.luckysheetcurrentisPivotTable) {\r\n            if (row_index < _this.pivotTableBoundary[0] && col_index < _this.pivotTableBoundary[1]) {\r\n                return true;\r\n            } else {\r\n                return false;\r\n            }\r\n        }\r\n    },\r\n    storePivotTableParam: function() {\r\n        let _this = this;\r\n        let columnarr = [],\r\n            rowarr = [],\r\n            filterarr = [],\r\n            valuesarr = [];\r\n\r\n        $(\"#luckysheet-modal-dialog-config-filter .luckysheet-modal-dialog-slider-config-item\").each(function() {\r\n            let item = {};\r\n            item[\"index\"] = $(this).data(\"index\");\r\n            item[\"name\"] = $(this).data(\"name\");\r\n            item[\"fullname\"] = $(this)\r\n                .find(\".luckysheet-modal-dialog-slider-config-item-txt\")\r\n                .text();\r\n            filterarr.push(item);\r\n        });\r\n\r\n        $(\"#luckysheet-modal-dialog-config-row .luckysheet-modal-dialog-slider-config-item\").each(function() {\r\n            let item = {};\r\n            item[\"index\"] = $(this).data(\"index\");\r\n            item[\"name\"] = $(this).data(\"name\");\r\n            item[\"fullname\"] = $(this)\r\n                .find(\".luckysheet-modal-dialog-slider-config-item-txt\")\r\n                .text();\r\n            item[\"order\"] = $(this).data(\"order\");\r\n            item[\"orderby\"] = $(this).data(\"orderby\");\r\n            item[\"stastic\"] = $(this).data(\"stastic\");\r\n            rowarr.push(item);\r\n        });\r\n\r\n        $(\"#luckysheet-modal-dialog-config-column .luckysheet-modal-dialog-slider-config-item\").each(function() {\r\n            let item = {};\r\n            item[\"index\"] = $(this).data(\"index\");\r\n            item[\"name\"] = $(this).data(\"name\");\r\n            item[\"fullname\"] = $(this)\r\n                .find(\".luckysheet-modal-dialog-slider-config-item-txt\")\r\n                .text();\r\n            item[\"order\"] = $(this).data(\"order\");\r\n            item[\"orderby\"] = $(this).data(\"orderby\");\r\n            item[\"stastic\"] = $(this).data(\"stastic\");\r\n            columnarr.push(item);\r\n        });\r\n\r\n        $(\"#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item\").each(function() {\r\n            let item = {};\r\n            item[\"index\"] = $(this).data(\"index\");\r\n            item[\"name\"] = $(this).data(\"name\");\r\n            item[\"fullname\"] = $(this)\r\n                .find(\".luckysheet-modal-dialog-slider-config-item-txt\")\r\n                .text();\r\n            item[\"sumtype\"] = $(this).data(\"sumtype\");\r\n            item[\"nameindex\"] = $(this).data(\"nameindex\");\r\n            valuesarr.push(item);\r\n        });\r\n\r\n        _this.setDatatojsfile(\"column\", columnarr);\r\n        _this.setDatatojsfile(\"row\", rowarr);\r\n        _this.setDatatojsfile(\"filter\", filterarr);\r\n        _this.setDatatojsfile(\"values\", valuesarr);\r\n        let showtype = $(\"#luckysheetpivottablevaluecolrow:checked, #luckysheetpivottablevaluecolrow1:checked\").val();\r\n        _this.setDatatojsfile(\"showType\", showtype == \"0\" ? \"row\" : \"column\");\r\n\r\n        let pivotTable = _this.getPivotTableData();\r\n        delete pivotTable.pivotDatas;\r\n        server.saveParam(\"all\", _this.pivotSheetIndex, pivotTable, { k: \"pivotTable\" });\r\n    },\r\n    getPivotTableData: function(dataindex) {\r\n        if (dataindex == null) {\r\n            dataindex = this.pivotSheetIndex;\r\n        }\r\n\r\n        let index = getSheetIndex(dataindex);\r\n        let pivotTable = Store.luckysheetfile[index][\"pivotTable\"];\r\n\r\n        if (getObjType(pivotTable) == \"object\") {\r\n            pivotTable = $.extend(true, {}, Store.luckysheetfile[index][\"pivotTable\"]);\r\n        } else {\r\n            pivotTable = new Function(\"return \" + pivotTable)();\r\n        }\r\n\r\n        return pivotTable;\r\n    },\r\n    addValuesToTitle: function(titles, values) {\r\n        let rowLen = titles.length * values.length,\r\n            colLen = titles[0].length + 1;\r\n\r\n        let retdata = [];\r\n        if (titles.length == 0 && values.length > 0) {\r\n            for (let v = 0; v < values.length; v++) {\r\n                retdata.push(values[v].fullname);\r\n            }\r\n\r\n            return retdata;\r\n        }\r\n\r\n        if (values.length == 0 && titles.length > 0) {\r\n            return titles;\r\n        }\r\n\r\n        for (let r = 0; r < rowLen; r++) {\r\n            retdata[r] = new Array(colLen);\r\n\r\n            for (let c = 0; c < colLen - 1; c++) {\r\n                retdata[r][c] = titles[Math.floor(r / values.length)][c];\r\n            }\r\n\r\n            retdata[r][colLen - 1] = values[r % values.length].fullname;\r\n        }\r\n\r\n        return retdata;\r\n    },\r\n    initialPivotManage: function(restore) {\r\n        let _this = this;\r\n        const _locale = locale();\r\n        const locale_pivotTable = _locale.pivotTable;\r\n        const locale_button = _locale.button;\r\n        const locale_filter = _locale.filter;\r\n\r\n        if (_this.initial) {\r\n            _this.initial = false;\r\n\r\n            $(\"body\").append(luckysheetPivotTableHTML());\r\n            $(\"#luckysheet-modal-dialog-slider-close\").click(function() {\r\n                $(\"#luckysheet-modal-dialog-slider-pivot\").hide();\r\n                luckysheetsizeauto();\r\n            });\r\n\r\n            $(\"body\").append(\r\n                replaceHtml(modelHTML, {\r\n                    id: \"luckysheet-data-pivotTable-selection\",\r\n                    addclass: \"luckysheet-data-pivotTable-selection\",\r\n                    title: locale_pivotTable.titleSelectionDataRange,\r\n                    content:\r\n                        '<input id=\"luckysheet-pivotTable-range-selection-input\" class=\"luckysheet-datavisual-range-container\" style=\"font-size: 14px;padding:5px;max-width:none;\" spellcheck=\"false\" aria-label=\"' +\r\n                        locale_pivotTable.titleDataRange +\r\n                        '\" placeholder=\"' +\r\n                        locale_pivotTable.titleDataRange +\r\n                        '\">',\r\n                    botton:\r\n                        '<button id=\"luckysheet-pivotTable-selection-confirm\" class=\"btn btn-primary\">' +\r\n                        locale_button.confirm +\r\n                        '</button><button class=\"btn btn-default luckysheet-model-close-btn\">' +\r\n                        locale_button.cancel +\r\n                        \"</button>\",\r\n                }),\r\n            );\r\n\r\n            $(\"body\").append(replaceHtml(filtermenuHTML(), { menuid: \"pivotTableFilter\" }));\r\n            $(\"body\").append(replaceHtml(filtersubmenuHTML(), { menuid: \"pivotTableFilter\" }));\r\n            $(\"body\").append(pivottableconfigHTML());\r\n            $(\"body\").append(pivottablesumHTML());\r\n\r\n            $(\"#luckysheet-pivotTableFilter-orderby-asc\").remove();\r\n            $(\"#luckysheet-pivotTableFilter-orderby-desc\")\r\n                .next()\r\n                .remove();\r\n            $(\"#luckysheet-pivotTableFilter-orderby-desc\").remove();\r\n            $(\"#luckysheet-pivotTableFilter-orderby-color\")\r\n                .next()\r\n                .remove();\r\n            $(\"#luckysheet-pivotTableFilter-orderby-color\").remove();\r\n\r\n            $(\"#luckysheetpivottablevaluecolrow, #luckysheetpivottablevaluecolrow1\")\r\n                .checkboxradio({\r\n                    icon: false,\r\n                })\r\n                .change(function() {\r\n                    _this.refreshPivotTable();\r\n                });\r\n\r\n            let hidefilersubmenu = null;\r\n            $(\"#luckysheet-pivotTableFilter-menu\").mouseover(function() {\r\n                clearTimeout(hidefilersubmenu);\r\n                hidefilersubmenu = setTimeout(function() {\r\n                    $(\"#luckysheet-pivotTableFilter-submenu\").hide();\r\n                }, 500);\r\n            });\r\n\r\n            //点击复选框\r\n            $(document)\r\n                .off(\"click.ptFilterCheckbox1\")\r\n                .on(\"click.ptFilterCheckbox1\", \"#luckysheet-pivotTableFilter-byvalue-select .textBox\", function() {\r\n                    if ($(this).attr(\"data-check\") == \"true\") {\r\n                        $(this).attr(\"data-check\", \"false\");\r\n                        $(this)\r\n                            .find(\"input[type='checkbox']\")\r\n                            .removeAttr(\"checked\");\r\n                    } else {\r\n                        $(this).attr(\"data-check\", \"true\");\r\n                        $(this)\r\n                            .find(\"input[type='checkbox']\")\r\n                            .prop(\"checked\", true);\r\n                    }\r\n                });\r\n            $(document)\r\n                .off(\"click.ptFilterCheckbox2\")\r\n                .on(\"click.ptFilterCheckbox2\", \"#luckysheet-pivotTableFilter-byvalue-select .year\", function() {\r\n                    if ($(this).attr(\"data-check\") == \"true\") {\r\n                        $(this).attr(\"data-check\", \"false\");\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\".month\")\r\n                            .attr(\"data-check\", \"false\");\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\".day\")\r\n                            .attr(\"data-check\", \"false\");\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\"input[type='checkbox']\")\r\n                            .removeAttr(\"checked\");\r\n                    } else {\r\n                        $(this).attr(\"data-check\", \"true\");\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\".month\")\r\n                            .attr(\"data-check\", \"true\");\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\".day\")\r\n                            .attr(\"data-check\", \"true\");\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\"input[type='checkbox']\")\r\n                            .prop(\"checked\", true);\r\n                    }\r\n                });\r\n            $(document)\r\n                .off(\"click.ptFilterCheckbox3\")\r\n                .on(\"click.ptFilterCheckbox3\", \"#luckysheet-pivotTableFilter-byvalue-select .month\", function() {\r\n                    //月份 对应的 天\r\n                    if ($(this).attr(\"data-check\") == \"true\") {\r\n                        $(this).attr(\"data-check\", \"false\");\r\n                        $(this)\r\n                            .parents(\".monthBox\")\r\n                            .find(\".day\")\r\n                            .attr(\"data-check\", \"false\");\r\n                        $(this)\r\n                            .parents(\".monthBox\")\r\n                            .find(\"input[type='checkbox']\")\r\n                            .removeAttr(\"checked\");\r\n                    } else {\r\n                        $(this).attr(\"data-check\", \"true\");\r\n                        $(this)\r\n                            .parents(\".monthBox\")\r\n                            .find(\".day\")\r\n                            .attr(\"data-check\", \"true\");\r\n                        $(this)\r\n                            .parents(\".monthBox\")\r\n                            .find(\"input[type='checkbox']\")\r\n                            .prop(\"checked\", true);\r\n                    }\r\n                    //月份 对应的 年份\r\n                    let yearDayAllCheck = true;\r\n                    let $yearDay = $(this)\r\n                        .parents(\".yearBox\")\r\n                        .find(\".day\");\r\n                    $yearDay.each(function(i, e) {\r\n                        if ($(e).attr(\"data-check\") == \"true\") {\r\n                        } else {\r\n                            yearDayAllCheck = false;\r\n                        }\r\n                    });\r\n                    if (yearDayAllCheck) {\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\".year\")\r\n                            .attr(\"data-check\", \"true\");\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\".year input[type='checkbox']\")\r\n                            .prop(\"checked\", true);\r\n                    } else {\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\".year\")\r\n                            .attr(\"data-check\", \"false\");\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\".year input[type='checkbox']\")\r\n                            .removeAttr(\"checked\");\r\n                    }\r\n                });\r\n            $(document)\r\n                .off(\"click.ptFilterCheckbox4\")\r\n                .on(\"click.ptFilterCheckbox4\", \"#luckysheet-pivotTableFilter-byvalue-select .day\", function() {\r\n                    if ($(this).attr(\"data-check\") == \"true\") {\r\n                        $(this).attr(\"data-check\", \"false\");\r\n                        $(this)\r\n                            .find(\"input[type='checkbox']\")\r\n                            .removeAttr(\"checked\");\r\n                    } else {\r\n                        $(this).attr(\"data-check\", \"true\");\r\n                        $(this)\r\n                            .find(\"input[type='checkbox']\")\r\n                            .prop(\"checked\", true);\r\n                    }\r\n                    //天 对应的 月份\r\n                    let monthDayAllCheck = true;\r\n                    let $monthDay = $(this)\r\n                        .parents(\".monthBox\")\r\n                        .find(\".day\");\r\n                    $monthDay.each(function(i, e) {\r\n                        if ($(e).attr(\"data-check\") == \"true\") {\r\n                        } else {\r\n                            monthDayAllCheck = false;\r\n                        }\r\n                    });\r\n                    if (monthDayAllCheck) {\r\n                        $(this)\r\n                            .parents(\".monthBox\")\r\n                            .find(\".month\")\r\n                            .attr(\"data-check\", \"true\");\r\n                        $(this)\r\n                            .parents(\".monthBox\")\r\n                            .find(\".month input[type='checkbox']\")\r\n                            .prop(\"checked\", true);\r\n                    } else {\r\n                        $(this)\r\n                            .parents(\".monthBox\")\r\n                            .find(\".month\")\r\n                            .attr(\"data-check\", \"false\");\r\n                        $(this)\r\n                            .parents(\".monthBox\")\r\n                            .find(\".month input[type='checkbox']\")\r\n                            .removeAttr(\"checked\");\r\n                    }\r\n                    //天 对应的 年份\r\n                    let yearDayAllCheck = true;\r\n                    let $yearDay = $(this)\r\n                        .parents(\".yearBox\")\r\n                        .find(\".day\");\r\n                    $yearDay.each(function(i, e) {\r\n                        if ($(e).attr(\"data-check\") == \"true\") {\r\n                        } else {\r\n                            yearDayAllCheck = false;\r\n                        }\r\n                    });\r\n                    if (yearDayAllCheck) {\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\".year\")\r\n                            .attr(\"data-check\", \"true\");\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\".year input[type='checkbox']\")\r\n                            .prop(\"checked\", true);\r\n                    } else {\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\".year\")\r\n                            .attr(\"data-check\", \"false\");\r\n                        $(this)\r\n                            .parents(\".yearBox\")\r\n                            .find(\".year input[type='checkbox']\")\r\n                            .removeAttr(\"checked\");\r\n                    }\r\n                });\r\n\r\n            //日期 三级下拉显示\r\n            $(document)\r\n                .off(\"click.ptFilterYearDropdown\")\r\n                .on(\r\n                    \"click.ptFilterYearDropdown\",\r\n                    \"#luckysheet-pivotTableFilter-byvalue-select .yearBox .fa-caret-right\",\r\n                    function() {\r\n                        let $p = $(this).parents(\".luckysheet-mousedown-cancel\");\r\n                        if ($p.hasClass(\"year\")) {\r\n                            $(this)\r\n                                .parents(\".yearBox\")\r\n                                .find(\".monthList\")\r\n                                .slideToggle();\r\n                        }\r\n                        if ($p.hasClass(\"month\")) {\r\n                            $(this)\r\n                                .parents(\".monthBox\")\r\n                                .find(\".dayList\")\r\n                                .slideToggle();\r\n                        }\r\n                    },\r\n                );\r\n\r\n            //全选\r\n            $(\"#luckysheet-pivotTableFilter-byvalue-btn-all\").click(function() {\r\n                $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\").prop(\"checked\", true);\r\n                $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\")\r\n                    .parents(\".luckysheet-mousedown-cancel\")\r\n                    .attr(\"data-check\", \"true\");\r\n            });\r\n\r\n            //反选\r\n            $(\"#luckysheet-pivotTableFilter-byvalue-btn-contra\").click(function() {\r\n                let $input = $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\");\r\n                $input.each(function(i, e) {\r\n                    if ($(e).is(\":checked\")) {\r\n                        $(e).removeAttr(\"checked\");\r\n                        $(e)\r\n                            .parents(\".luckysheet-mousedown-cancel\")\r\n                            .attr(\"data-check\", \"false\");\r\n                    } else {\r\n                        $(e).prop(\"checked\", true);\r\n                        $(e)\r\n                            .parents(\".luckysheet-mousedown-cancel\")\r\n                            .attr(\"data-check\", \"true\");\r\n                    }\r\n                });\r\n                //天 对应的 月份\r\n                let $month = $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox .monthBox\");\r\n                $month.each(function(index, event) {\r\n                    let monthDayAllCheck = true;\r\n                    let $monthDay = $(event).find(\".day input[type='checkbox']\");\r\n                    $monthDay.each(function(i, e) {\r\n                        if ($(e).is(\":checked\")) {\r\n                        } else {\r\n                            monthDayAllCheck = false;\r\n                        }\r\n                    });\r\n                    if (monthDayAllCheck) {\r\n                        $(event)\r\n                            .find(\".month input[type='checkbox']\")\r\n                            .prop(\"checked\", true);\r\n                        $(event).attr(\"data-check\", \"true\");\r\n                    } else {\r\n                        $(event)\r\n                            .find(\".month input[type='checkbox']\")\r\n                            .removeAttr(\"checked\");\r\n                        $(event).attr(\"data-check\", \"false\");\r\n                    }\r\n                });\r\n                //天 对应的 年份\r\n                let $year = $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox .yearBox\");\r\n                $year.each(function(index, event) {\r\n                    let yearDayAllCheck = true;\r\n                    let $yearDay = $(event).find(\".day input[type='checkbox']\");\r\n                    $yearDay.each(function(i, e) {\r\n                        if ($(e).is(\":checked\")) {\r\n                        } else {\r\n                            yearDayAllCheck = false;\r\n                        }\r\n                    });\r\n                    if (yearDayAllCheck) {\r\n                        $(event)\r\n                            .find(\".year input[type='checkbox']\")\r\n                            .prop(\"checked\", true);\r\n                        $(event).attr(\"data-check\", \"true\");\r\n                    } else {\r\n                        $(event)\r\n                            .find(\".year input[type='checkbox']\")\r\n                            .removeAttr(\"checked\");\r\n                        $(event).attr(\"data-check\", \"false\");\r\n                    }\r\n                });\r\n            });\r\n\r\n            //清除\r\n            $(\"#luckysheet-pivotTableFilter-byvalue-btn-clear\").click(function() {\r\n                $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\").removeAttr(\"checked\");\r\n                $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\")\r\n                    .parents(\".luckysheet-mousedown-cancel\")\r\n                    .attr(\"data-check\", \"false\");\r\n            });\r\n\r\n            //按照值进行筛选\r\n            $(\"#luckysheet-pivotTableFilter-byvalue-input\").on(\"input propertychange\", function() {\r\n                let v = $(this)\r\n                    .val()\r\n                    .toString();\r\n                $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox .luckysheet-mousedown-cancel\").show();\r\n                if (v != \"\") {\r\n                    let $check = $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\");\r\n                    $check.each(function(i, e) {\r\n                        let $p = $(e).parents(\".luckysheet-mousedown-cancel\");\r\n                        if ($p.hasClass(\"day\")) {\r\n                            //日期\r\n                            let day = $(e)\r\n                                .siblings(\"label\")\r\n                                .text()\r\n                                .toString();\r\n                            let month = $(e)\r\n                                .parents(\".monthBox\")\r\n                                .find(\".month label\")\r\n                                .text()\r\n                                .toString();\r\n                            let year = $(e)\r\n                                .parents(\".yearBox\")\r\n                                .find(\".year label\")\r\n                                .text()\r\n                                .toString();\r\n                            let itemV = year + \"-\" + month + \"-\" + day;\r\n\r\n                            if (itemV.indexOf(v) == -1) {\r\n                                $(e)\r\n                                    .parents(\".day\")\r\n                                    .hide();\r\n                                //天 对应的 月份\r\n                                let $monthDay = $(e)\r\n                                    .parents(\".dayList\")\r\n                                    .find(\".day:visible\");\r\n                                if ($monthDay.length == 0) {\r\n                                    $(e)\r\n                                        .parents(\".monthBox\")\r\n                                        .find(\".month\")\r\n                                        .hide();\r\n                                }\r\n                                //天 对应的 年份\r\n                                let $yearDay = $(e)\r\n                                    .parents(\".monthList\")\r\n                                    .find(\".day:visible\");\r\n                                if ($yearDay.length == 0) {\r\n                                    $(e)\r\n                                        .parents(\".yearBox\")\r\n                                        .find(\".year\")\r\n                                        .hide();\r\n                                }\r\n                            }\r\n                        }\r\n                        if ($p.hasClass(\"textBox\")) {\r\n                            //其它\r\n                            let itemV = $(e)\r\n                                .siblings(\"label\")\r\n                                .text()\r\n                                .toString();\r\n\r\n                            if (itemV.indexOf(v) == -1) {\r\n                                $(e)\r\n                                    .parents(\".textBox\")\r\n                                    .hide();\r\n                            }\r\n                        }\r\n                    });\r\n                }\r\n            });\r\n\r\n            $(\"#luckysheet-pivotTableFilter-bycondition, #luckysheet-pivotTableFilter-byvalue\").click(function() {\r\n                let $t = $(this);\r\n                $t.next().slideToggle(200);\r\n                setTimeout(function() {\r\n                    if (\r\n                        $t.attr(\"id\") == \"luckysheet-pivotTableFilter-bycondition\" &&\r\n                        $(\"#luckysheet-pivotTableFilter-bycondition\")\r\n                            .next()\r\n                            .is(\":visible\")\r\n                    ) {\r\n                        if ($(\"#luckysheet-pivotTableFilter-selected span\").text() != locale_filter.filiterInputNone) {\r\n                            $(\"#luckysheet-pivotTableFilter-byvalue\")\r\n                                .next()\r\n                                .slideUp(200);\r\n                        }\r\n                    }\r\n\r\n                    if ($t.is($(\"#luckysheet-pivotTableFilter-bycondition\"))) {\r\n                        if (\r\n                            $(\"#luckysheet-pivotTableFilter-bycondition\")\r\n                                .next()\r\n                                .is(\":hidden\") &&\r\n                            $(\"#luckysheet-pivotTableFilter-byvalue\")\r\n                                .next()\r\n                                .is(\":hidden\")\r\n                        ) {\r\n                            $(\"#luckysheet-pivotTableFilter-byvalue\")\r\n                                .next()\r\n                                .slideDown(200);\r\n                        }\r\n                    }\r\n                }, 300);\r\n            });\r\n\r\n            //取消按钮\r\n            $(\"#luckysheet-pivotTableFilter-cancel\").click(function() {\r\n                $(\"#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu\").hide();\r\n            });\r\n\r\n            $(\"#luckysheet-pivotTableFilter-selected\").click(function() {\r\n                let $t = $(this),\r\n                    toffset = $t.offset(),\r\n                    $menu = $(\"#luckysheet-pivotTableFilter-submenu\");\r\n                $menu.hide();\r\n                let winH = $(window).height(),\r\n                    winW = $(window).width();\r\n                let menuW = $menu.width(),\r\n                    menuH = $menu.height();\r\n                let top = toffset.top,\r\n                    left = toffset.left,\r\n                    mheight = winH - toffset.top - 20;\r\n                if (toffset.left + menuW > winW) {\r\n                    left = toffset.left - menuW;\r\n                }\r\n\r\n                if (toffset.top > winH / 2) {\r\n                    top = winH - toffset.top;\r\n                    if (top < 0) {\r\n                        top = 0;\r\n                    }\r\n\r\n                    mheight = toffset.top - 20;\r\n                }\r\n\r\n                $menu.css({ top: top, left: left, height: mheight }).show();\r\n                clearTimeout(hidefilersubmenu);\r\n            });\r\n\r\n            //按条件过滤\r\n            $(\"#luckysheet-pivotTableFilter-submenu\")\r\n                .mouseover(function() {\r\n                    clearTimeout(hidefilersubmenu);\r\n                })\r\n                .find(\".luckysheet-cols-menuitem\")\r\n                .click(function(e) {\r\n                    $(\"#luckysheet-pivotTableFilter-selected span\")\r\n                        .html(\r\n                            $(this)\r\n                                .find(\".luckysheet-cols-menuitem-content\")\r\n                                .text(),\r\n                        )\r\n                        .data(\"value\", $(this).data(\"value\"));\r\n                    $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input\").hide();\r\n                    if ($(this).data(\"type\") == \"2\") {\r\n                        $(\"#luckysheet-pivotTableFilter-selected span\").data(\"type\", \"2\");\r\n                        $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input2\").show();\r\n                    } else if ($(this).data(\"type\") == \"0\") {\r\n                        $(\"#luckysheet-pivotTableFilter-selected span\").data(\"type\", \"0\");\r\n                    } else {\r\n                        $(\"#luckysheet-pivotTableFilter-selected span\").data(\"type\", \"1\");\r\n                        $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input\")\r\n                            .eq(0)\r\n                            .show();\r\n                        //若是日期 改变input type类型为date\r\n                        if (\r\n                            $(this).attr(\"data-value\") == \"dateequal\" ||\r\n                            $(this).attr(\"data-value\") == \"datelessthan\" ||\r\n                            $(this).attr(\"data-value\") == \"datemorethan\"\r\n                        ) {\r\n                            $(\r\n                                \"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input input\",\r\n                            ).prop(\"type\", \"date\");\r\n                        } else {\r\n                            $(\r\n                                \"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input input\",\r\n                            ).prop(\"type\", \"text\");\r\n                        }\r\n                    }\r\n                    $(\"#luckysheet-pivotTableFilter-byvalue\")\r\n                        .next()\r\n                        .slideUp();\r\n                    $(\"#luckysheet-pivotTableFilter-submenu\").hide();\r\n                });\r\n\r\n            $(\"#luckysheet-modal-dialog-pivotTable-list\").on(\"click\", \" .luckysheet-slider-list-item-filter\", function(\r\n                e,\r\n            ) {\r\n                _this.luckysheetsliderlistitemfilter($(this));\r\n                e.stopPropagation();\r\n                return false;\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-pivotTable-list\").on(\r\n                \"click\",\r\n                \" .luckysheet-slider-list-item-filtered\",\r\n                function(e) {\r\n                    _this.luckysheetsliderlistclearfilter($(this).next());\r\n                    e.stopPropagation();\r\n                    return false;\r\n                },\r\n            );\r\n\r\n            $(\"#luckysheet-dialog-pivotTable-range-seleted\").click(function() {\r\n                $(\"#luckysheet-modal-dialog-slider-pivot\").hide();\r\n                luckysheetsizeauto();\r\n                let $t = $(\"#luckysheet-data-pivotTable-selection\"),\r\n                    myh = $t.outerHeight(),\r\n                    myw = $t.outerWidth();\r\n                let winw = $(window).width(),\r\n                    winh = $(window).height();\r\n                let scrollLeft = $(document).scrollLeft(),\r\n                    scrollTop = $(document).scrollTop();\r\n\r\n                $(\"#luckysheet-data-pivotTable-selection\")\r\n                    .css({ left: (winw + scrollLeft - myw) / 2, top: (winh + scrollTop - myh) / 4 })\r\n                    .show();\r\n\r\n                _this.jgridCurrentPivotInput = $(\"#luckysheet-dialog-pivotTable-range\").html();\r\n                $(\"#luckysheet-pivotTable-range-selection-input\").val(_this.jgridCurrentPivotInput);\r\n                _this.luckysheet_pivotTable_select_state = true;\r\n            });\r\n\r\n            //清除筛选按钮\r\n            $(\"#luckysheet-pivotTableFilter-initial\").click(function() {\r\n                $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-slider-list-item-filtered\").hide();\r\n                $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\").data(\r\n                    \"rowhidden\",\r\n                    \"\",\r\n                );\r\n                $(\"#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu\").hide();\r\n                $(\"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input\")\r\n                    .hide()\r\n                    .find(\"input\")\r\n                    .val();\r\n                $(\"#luckysheet-pivotTableFilter-selected span\")\r\n                    .data(\"type\", \"0\")\r\n                    .data(\"type\", null)\r\n                    .text(locale_filter.filiterInputNone);\r\n\r\n                _this.setDatatojsfile(\"filterparm\", null);\r\n                _this.celldata = _this.origindata;\r\n\r\n                _this.refreshPivotTable();\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column\").on(\r\n                \"click\",\r\n                \".luckysheet-modal-dialog-slider-config-item-icon\",\r\n                function(e) {\r\n                    let $t = $(e.target),\r\n                        $item = $t.closest(\".luckysheet-modal-dialog-slider-config-item\"),\r\n                        cindex = $item.data(\"index\"),\r\n                        toffset = $item.offset();\r\n                    let order = $item.data(\"order\"),\r\n                        orderby = $item.data(\"orderby\"),\r\n                        stastic = $item.data(\"stastic\");\r\n\r\n                    if (order == null) {\r\n                        order = \"default\";\r\n                    }\r\n\r\n                    let option =\r\n                        '<option value=\"self\">' +\r\n                        $item.find(\".luckysheet-modal-dialog-slider-config-item-txt\").data(\"name\") +\r\n                        \"</option>\";\r\n\r\n                    $(\"#luckysheet-modal-dialog-config-value .luckysheet-modal-dialog-slider-config-item\").each(\r\n                        function(i) {\r\n                            option +=\r\n                                '<option value=\"' +\r\n                                i +\r\n                                '\">' +\r\n                                $(this)\r\n                                    .find(\".luckysheet-modal-dialog-slider-config-item-txt\")\r\n                                    .text() +\r\n                                \"</option>\";\r\n                        },\r\n                    );\r\n                    $(\"#luckysheet-pivotTable-config-option-orderby\")\r\n                        .empty()\r\n                        .html(option);\r\n\r\n                    if (orderby == null) {\r\n                        orderby = \"self\";\r\n                    }\r\n\r\n                    if (stastic == null) {\r\n                        stastic = \"1\";\r\n                    }\r\n\r\n                    $(\"#luckysheet-pivotTable-config-option-order\")\r\n                        .val(order)\r\n                        .data(\"index\", cindex);\r\n                    $(\"#luckysheet-pivotTable-config-option-orderby\")\r\n                        .val(orderby)\r\n                        .data(\"index\", cindex);\r\n                    $(\"#luckysheet-pivotTable-config-option-stastic\")\r\n                        .val(stastic)\r\n                        .data(\"index\", cindex);\r\n\r\n                    mouseclickposition(\r\n                        $(\"#luckysheet-pivotTable-config-option\"),\r\n                        toffset.left + $item.outerWidth(),\r\n                        toffset.top - 13,\r\n                        \"rightbottom\",\r\n                    );\r\n                    e.stopPropagation();\r\n                    return false;\r\n                },\r\n            );\r\n\r\n            $(\r\n                \"#luckysheet-pivotTable-config-option-order,#luckysheet-pivotTable-config-option-orderby,#luckysheet-pivotTable-config-option-stastic\",\r\n            ).change(function() {\r\n                let $t = $(this),\r\n                    cindex = $t.data(\"index\");\r\n\r\n                $(\"#luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column\")\r\n                    .find(\".luckysheet-modal-dialog-slider-config-item\")\r\n                    .each(function() {\r\n                        if ($(this).data(\"index\") == cindex) {\r\n                            $(this).data($t.attr(\"id\").replace(\"luckysheet-pivotTable-config-option-\", \"\"), $t.val());\r\n                        }\r\n                    });\r\n\r\n                _this.refreshPivotTable();\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-config-value\").on(\r\n                \"click\",\r\n                \".luckysheet-modal-dialog-slider-config-item-icon\",\r\n                function(e) {\r\n                    let $t = $(e.target),\r\n                        $item = $t.closest(\".luckysheet-modal-dialog-slider-config-item\"),\r\n                        cindex = $item.data(\"index\"),\r\n                        toffset = $item.offset(),\r\n                        sumtype = $item.data(\"sumtype\");\r\n\r\n                    let type = _this.pivot_data_type[cindex.toString()];\r\n                    if (sumtype == null) {\r\n                        if (type == \"num\") {\r\n                            sumtype = \"SUM\";\r\n                        } else {\r\n                            sumtype = \"COUNTA\";\r\n                        }\r\n                    }\r\n\r\n                    let $menu = $(\"#luckysheet-pivotTable-config-option-sumtype\");\r\n                    $menu.find(\".luckysheet-submenu-arrow\").hide();\r\n                    $menu\r\n                        .find(\".luckysheet-cols-menuitem[sumtype='\" + sumtype + \"'] .luckysheet-submenu-arrow\")\r\n                        .css(\"display\", \"inline\");\r\n                    $menu.data(\"item\", $item);\r\n\r\n                    mouseclickposition($menu, toffset.left + $item.outerWidth(), toffset.top - 13, \"rightbottom\");\r\n                    e.stopPropagation();\r\n                    return false;\r\n                },\r\n            );\r\n\r\n            $(\"#luckysheet-pivotTable-config-option-sumtype .luckysheet-cols-menuitem\").click(function() {\r\n                let $item = $(\"#luckysheet-pivotTable-config-option-sumtype\").data(\"item\");\r\n                let sumtype = $(this).attr(\"sumtype\");\r\n                $item.data(\"sumtype\", $(this).attr(\"sumtype\"));\r\n                let name = _this.getSumTypeName(sumtype) + \":\" + $item.data(\"name\");\r\n                $item\r\n                    .attr(\"title\", name)\r\n                    .find(\".luckysheet-modal-dialog-slider-config-item-txt\")\r\n                    .html(name);\r\n                $(\"#luckysheet-pivotTable-config-option-sumtype\").hide();\r\n                _this.refreshPivotTable();\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-config-filter\").on(\r\n                \"click\",\r\n                \".luckysheet-modal-dialog-slider-config-item-icon\",\r\n                function(e) {\r\n                    let $t = $(e.target),\r\n                        cindex = $t.closest(\".luckysheet-modal-dialog-slider-config-item\").data(\"index\");\r\n                    _this.luckysheetsliderlistitemfilter(\r\n                        $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\")\r\n                            .eq(cindex)\r\n                            .find(\".luckysheet-slider-list-item-filter\"),\r\n                    );\r\n                    e.stopPropagation();\r\n                    return false;\r\n                },\r\n            );\r\n\r\n            //确认按钮\r\n            $(\"#luckysheet-pivotTableFilter-confirm\").click(function() {\r\n                let $menu = $(\"#luckysheet-pivotTableFilter-menu\");\r\n                let cindex = $menu.data(\"index\");\r\n\r\n                let rowhiddenother = {}; //其它筛选列的隐藏行\r\n                $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\").each(\r\n                    function() {\r\n                        let $t = $(this),\r\n                            rh = $t.data(\"rowhidden\");\r\n\r\n                        if ($t.data(\"index\") != cindex) {\r\n                            if (rh == null || rh == \"\") {\r\n                                return true;\r\n                            }\r\n\r\n                            if (getObjType(rh) == \"string\") {\r\n                                rh = JSON.parse(rh);\r\n                            }\r\n\r\n                            for (let r in rh) {\r\n                                rowhiddenother[r] = 0;\r\n                            }\r\n                        }\r\n                    },\r\n                );\r\n\r\n                let d = _this.origindata;\r\n\r\n                let filterdata = {};\r\n                let rowhidden = {};\r\n                let caljs = {};\r\n\r\n                if (\r\n                    $(\"#luckysheet-pivotTableFilter-bycondition\")\r\n                        .next()\r\n                        .is(\":visible\") &&\r\n                    $(\"#luckysheet-pivotTableFilter-byvalue\")\r\n                        .next()\r\n                        .is(\":hidden\") &&\r\n                    $(\"#luckysheet-pivotTableFilter-selected span\").data(\"value\") != \"null\"\r\n                ) {\r\n                    let $t = $(\"#luckysheet-pivotTableFilter-selected span\");\r\n                    let type = $t.data(\"type\"),\r\n                        value = $t.data(\"value\");\r\n\r\n                    caljs[\"value\"] = value;\r\n                    caljs[\"text\"] = $t.text();\r\n\r\n                    if (type == \"0\") {\r\n                        caljs[\"type\"] = \"0\";\r\n                    } else if (type == \"2\") {\r\n                        let $input = $(\r\n                            \"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input2 input\",\r\n                        );\r\n                        caljs[\"type\"] = \"2\";\r\n                        caljs[\"value1\"] = $input.eq(0).val();\r\n                        caljs[\"value2\"] = $input.eq(1).val();\r\n                    } else {\r\n                        caljs[\"type\"] = \"1\";\r\n                        caljs[\"value1\"] = $(\r\n                            \"#luckysheet-pivotTableFilter-menu .luckysheet-pivotTableFilter-selected-input\",\r\n                        )\r\n                            .eq(0)\r\n                            .find(\"input\")\r\n                            .val();\r\n                    }\r\n\r\n                    for (let r = 1; r < d.length; r++) {\r\n                        if (r in rowhiddenother) {\r\n                            continue;\r\n                        }\r\n\r\n                        if (d[r] == null) {\r\n                            continue;\r\n                        }\r\n\r\n                        let cell = d[r][cindex];\r\n\r\n                        if (value == \"cellnull\") {\r\n                            //单元格为空\r\n                            if (cell != null && !isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        } else if (value == \"cellnonull\") {\r\n                            //单元格有数据\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        } else if (value == \"textinclude\") {\r\n                            //文本包含\r\n                            let value1 = caljs[\"value1\"];\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else {\r\n                                if (cell.m.indexOf(value1) == -1) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                        } else if (value == \"textnotinclude\") {\r\n                            //文本不包含\r\n                            let value1 = caljs[\"value1\"];\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                            } else {\r\n                                if (cell.m.indexOf(value1) > -1) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                        } else if (value == \"textstart\") {\r\n                            //文本开头为\r\n                            let value1 = caljs[\"value1\"],\r\n                                valuelen = value1.length;\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else {\r\n                                if (cell.m.substr(0, valuelen) != value1) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                        } else if (value == \"textend\") {\r\n                            //文本结尾为\r\n                            let value1 = caljs[\"value1\"],\r\n                                valuelen = value1.length;\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else {\r\n                                if (\r\n                                    valuelen > cell.m.length ||\r\n                                    cell.m.substr(cell.m.length - valuelen, valuelen) != value1\r\n                                ) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                        } else if (value == \"textequal\") {\r\n                            //文本等于\r\n                            let value1 = caljs[\"value1\"];\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else {\r\n                                if (cell.m != value1) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            }\r\n                        } else if (value == \"dateequal\") {\r\n                            //日期等于\r\n                            let value1 = genarate(caljs[\"value1\"])[2];\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else if (cell.ct != null && cell.ct.t == \"d\") {\r\n                                if (parseInt(cell.v) != value1) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            } else {\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        } else if (value == \"datelessthan\") {\r\n                            //日期早于\r\n                            let value1 = genarate(caljs[\"value1\"])[2];\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else if (cell.ct != null && cell.ct.t == \"d\") {\r\n                                if (parseInt(cell.v) >= value1) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            } else {\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        } else if (value == \"datemorethan\") {\r\n                            //日期晚于\r\n                            let value1 = genarate(caljs[\"value1\"])[2];\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else if (cell.ct != null && cell.ct.t == \"d\") {\r\n                                if (parseInt(cell.v) <= value1) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            } else {\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        } else if (value == \"morethan\") {\r\n                            //大于\r\n                            let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else if (cell.ct != null && cell.ct.t == \"n\") {\r\n                                if (cell.v <= value1) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            } else {\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        } else if (value == \"moreequalthan\") {\r\n                            //大于等于\r\n                            let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else if (cell.ct != null && cell.ct.t == \"n\") {\r\n                                if (cell.v < value1) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            } else {\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        } else if (value == \"lessthan\") {\r\n                            //小于\r\n                            let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else if (cell.ct != null && cell.ct.t == \"n\") {\r\n                                if (cell.v >= value1) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            } else {\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        } else if (value == \"lessequalthan\") {\r\n                            //小于等于\r\n                            let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else if (cell.ct != null && cell.ct.t == \"n\") {\r\n                                if (cell.v > value1) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            } else {\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        } else if (value == \"equal\") {\r\n                            //等于\r\n                            let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else if (cell.ct != null && cell.ct.t == \"n\") {\r\n                                if (cell.v != value1) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            } else {\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        } else if (value == \"noequal\") {\r\n                            //不等于\r\n                            let value1 = parseFloat(caljs[\"value1\"]);\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else if (cell.ct != null && cell.ct.t == \"n\") {\r\n                                if (cell.v == value1) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            } else {\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        } else if (value == \"include\") {\r\n                            //介于\r\n                            let value1 = parseFloat(caljs[\"value1\"]),\r\n                                value2 = parseFloat(caljs[\"value2\"]);\r\n\r\n                            let min, max;\r\n                            if (value1 < value2) {\r\n                                min = value1;\r\n                                max = value2;\r\n                            } else {\r\n                                max = value1;\r\n                                min = value2;\r\n                            }\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else if (cell.ct != null && cell.ct.t == \"n\") {\r\n                                if (cell.v < min || cell.v > max) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            } else {\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        } else if (value == \"noinclude\") {\r\n                            //不在其中\r\n                            let value1 = parseFloat(caljs[\"value1\"]),\r\n                                value2 = parseFloat(caljs[\"value2\"]);\r\n\r\n                            let min, max;\r\n                            if (value1 < value2) {\r\n                                min = value1;\r\n                                max = value2;\r\n                            } else {\r\n                                max = value1;\r\n                                min = value2;\r\n                            }\r\n\r\n                            if (cell == null || isRealNull(cell.v)) {\r\n                                rowhidden[r] = 0;\r\n                            } else if (cell.ct != null && cell.ct.t == \"n\") {\r\n                                if (cell.v >= min && cell.v <= max) {\r\n                                    rowhidden[r] = 0;\r\n                                }\r\n                            } else {\r\n                                rowhidden[r] = 0;\r\n                            }\r\n                        }\r\n                    }\r\n                } else {\r\n                    $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']\").each(function(\r\n                        i,\r\n                        e,\r\n                    ) {\r\n                        if ($(e).is(\":visible\") && $(e).is(\":checked\")) {\r\n                            return true;\r\n                        }\r\n\r\n                        if ($(e).closest(\".day\").length > 0) {\r\n                            let day = $(e)\r\n                                .siblings(\"label\")\r\n                                .text();\r\n                            if (Number(day) < 10) {\r\n                                day = \"0\" + day;\r\n                            }\r\n\r\n                            let month = $(e)\r\n                                .closest(\".monthBox\")\r\n                                .find(\".month label\")\r\n                                .text()\r\n                                .replace(locale_filter.filiterMonthText, \"\");\r\n                            if (Number(month) < 10) {\r\n                                month = \"0\" + month;\r\n                            }\r\n\r\n                            let year = $(e)\r\n                                .closest(\".yearBox\")\r\n                                .find(\".year label\")\r\n                                .text()\r\n                                .replace(locale_filter.filiterYearText, \"\");\r\n\r\n                            let itemV = locale_filter.filterDateFormatTip + \"#$$$#\" + year + \"-\" + month + \"-\" + day;\r\n\r\n                            filterdata[itemV] = \"1\";\r\n                        }\r\n\r\n                        if ($(e).closest(\".textBox\").length > 0) {\r\n                            let itemV = $(e)\r\n                                .closest(\".textBox\")\r\n                                .data(\"filter\");\r\n\r\n                            filterdata[itemV] = \"1\";\r\n                        }\r\n                    });\r\n\r\n                    for (let r = 1; r < d.length; r++) {\r\n                        if (r in rowhiddenother) {\r\n                            continue;\r\n                        }\r\n\r\n                        if (d[r] == null) {\r\n                            continue;\r\n                        }\r\n\r\n                        let cell = d[r][cindex];\r\n\r\n                        let value;\r\n                        if (cell == null || isRealNull(cell.v)) {\r\n                            value = \"null#$$$#null\";\r\n                        } else if (cell.ct != null && cell.ct.t == \"d\") {\r\n                            let fmt = update(\"YYYY-MM-DD\", cell.v);\r\n                            value = locale_filter.filterDateFormatTip + \"#$$$#\" + fmt;\r\n                        } else {\r\n                            value = cell.v + \"#$$$#\" + cell.m;\r\n                        }\r\n\r\n                        if (value in filterdata) {\r\n                            rowhidden[r] = 0;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                let $top = $(\"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\").eq(\r\n                    cindex,\r\n                );\r\n                if (\r\n                    $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']:visible:checked\")\r\n                        .length <\r\n                        $(\"#luckysheet-pivotTableFilter-byvalue-select .ListBox input[type='checkbox']:visible\")\r\n                            .length ||\r\n                    $(\"#luckysheet-pivotTableFilter-byvalue-input\").val().length > 0 ||\r\n                    ($(\"#luckysheet-pivotTableFilter-bycondition\")\r\n                        .next()\r\n                        .is(\":visible\") &&\r\n                        $(\"#luckysheet-pivotTableFilter-byvalue\")\r\n                            .next()\r\n                            .is(\":hidden\") &&\r\n                        $(\"#luckysheet-pivotTableFilter-selected span\").data(\"value\") != \"null\")\r\n                ) {\r\n                    $top.data(\"rowhidden\", JSON.stringify(rowhidden))\r\n                        .find(\".luckysheet-slider-list-item-filtered\")\r\n                        .show();\r\n                    _this.setDatatojsfile(\"rowhidden\", rowhidden, cindex);\r\n\r\n                    if (caljs != null) {\r\n                        $top.data(\"byconditionvalue\", caljs[\"value\"])\r\n                            .data(\"byconditiontype\", caljs[\"type\"])\r\n                            .data(\"byconditiontext\", caljs[\"text\"]);\r\n\r\n                        if (caljs[\"value1\"] != null) {\r\n                            $top.data(\"byconditionvalue1\", caljs[\"value1\"]);\r\n                        }\r\n\r\n                        if (caljs[\"value2\"] != null) {\r\n                            $top.data(\"byconditionvalue2\", caljs[\"value2\"]);\r\n                        }\r\n\r\n                        _this.setDatatojsfile(\"caljs\", caljs, cindex);\r\n                    }\r\n                } else {\r\n                    $top.data(\"rowhidden\", \"\")\r\n                        .find(\".luckysheet-slider-list-item-filtered\")\r\n                        .hide();\r\n                    _this.setDatatojsfile(\"rowhidden\", null, cindex);\r\n                }\r\n\r\n                let newdata = [];\r\n                for (let i = 0; i < d.length; i++) {\r\n                    if (i in rowhidden || i in rowhiddenother) {\r\n                        continue;\r\n                    }\r\n\r\n                    newdata.push([].concat(d[i]));\r\n                }\r\n\r\n                _this.celldata = newdata;\r\n                _this.refreshPivotTable();\r\n                $(\"#luckysheet-pivotTableFilter-menu, #luckysheet-pivotTableFilter-submenu\").hide();\r\n\r\n                cleargridelement();\r\n            });\r\n\r\n            $(\r\n                \"#luckysheet-data-pivotTable-selection .luckysheet-model-close-btn, #luckysheet-data-pivotTable-selection .luckysheet-modal-dialog-title-close\",\r\n            ).click(function() {\r\n                $(\"#luckysheet-modal-dialog-slider-pivot\").show();\r\n                luckysheetsizeauto();\r\n                $(\"#luckysheet-cell-main .luckysheet-pivotTable-selection-set div\").show();\r\n\r\n                $(\"#luckysheet-data-pivotTable-selection\").hide();\r\n\r\n                sheetmanage.changeSheetExec(_this.pivotSheetIndex);\r\n\r\n                _this.luckysheet_pivotTable_select_state = false;\r\n\r\n                cleargridelement();\r\n            });\r\n\r\n            $(\"#luckysheet-pivotTable-selection-confirm\").click(function() {\r\n                let $input = $(\"#luckysheet-pivotTable-range-selection-input\"),\r\n                    val = $input.val();\r\n\r\n                if (\r\n                    $.trim(val).length == 0 ||\r\n                    $.trim(val).toUpperCase() == _this.jgridCurrentPivotInput.toUpperCase()\r\n                ) {\r\n                    $input.val(_this.jgridCurrentPivotInput);\r\n                    $(\"#luckysheet-data-pivotTable-selection .luckysheet-model-close-btn\").click();\r\n                    return;\r\n                } else {\r\n                    let val1 = val.split(\"!\");\r\n                    let sheettxt = \"\",\r\n                        rangetxt = \"\",\r\n                        sheetIndex = -1;\r\n\r\n                    if (val1.length > 1) {\r\n                        sheettxt = val1[0];\r\n                        rangetxt = val1[1];\r\n\r\n                        for (let i in Store.luckysheetfile) {\r\n                            if (sheettxt == Store.luckysheetfile[i].name) {\r\n                                sheetIndex = Store.luckysheetfile[i].index;\r\n                                break;\r\n                            }\r\n                        }\r\n\r\n                        if (sheetIndex == -1) {\r\n                            sheetIndex = 0;\r\n                        }\r\n                    } else {\r\n                        let index = getSheetIndex(Store.currentSheetIndex);\r\n                        sheettxt = Store.luckysheetfile[index].name;\r\n                        sheetIndex = Store.luckysheetfile[index].index;\r\n                        rangetxt = val1[0];\r\n                    }\r\n\r\n                    if (Store.luckysheetfile[getSheetIndex(sheetIndex)].isPivotTable) {\r\n                        if (isEditMode()) {\r\n                            alert(locale_pivotTable.errorNotAllowPivotData);\r\n                        } else {\r\n                            tooltip.info(\"\", locale_pivotTable.errorNotAllowPivotData);\r\n                        }\r\n                        $input.val(_this.jgridCurrentPivotInput);\r\n                        return;\r\n                    }\r\n\r\n                    if (rangetxt.indexOf(\":\") == -1) {\r\n                        if (isEditMode()) {\r\n                            alert(locale_pivotTable.errorSelectionRange);\r\n                        } else {\r\n                            tooltip.info(\"\", locale_pivotTable.errorSelectionRange);\r\n                        }\r\n                        $input.val(_this.jgridCurrentPivotInput);\r\n                        return;\r\n                    }\r\n\r\n                    rangetxt = rangetxt.split(\":\");\r\n                    let row = [],\r\n                        col = [];\r\n\r\n                    row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, \"\")) - 1;\r\n                    row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, \"\")) - 1;\r\n\r\n                    if (row[0] > row[1]) {\r\n                        if (isEditMode()) {\r\n                            alert(locale_pivotTable.errorSelectionRange);\r\n                        } else {\r\n                            tooltip.info(\"\", locale_pivotTable.errorSelectionRange);\r\n                        }\r\n                        $input.val(_this.jgridCurrentPivotInput);\r\n                        return;\r\n                    }\r\n\r\n                    col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, \"\"));\r\n                    col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, \"\"));\r\n\r\n                    if (col[0] > col[1]) {\r\n                        if (isEditMode()) {\r\n                            alert(locale_pivotTable.errorSelectionRange);\r\n                        } else {\r\n                            tooltip.info(locale_pivotTable.errorSelectionRange);\r\n                        }\r\n                        $input.val(_this.jgridCurrentPivotInput);\r\n                        return;\r\n                    }\r\n                    sheetmanage.changeSheetExec(_this.pivotSheetIndex);\r\n\r\n                    _this.setDatatojsfile(\"pivot_select_save\", { row: row, column: col });\r\n                    _this.setDatatojsfile(\"pivotDataSheetIndex\", sheetIndex);\r\n\r\n                    _this.getCellData(_this.pivotSheetIndex, sheetIndex, { row: row, column: col });\r\n\r\n                    _this.initialPivotManage();\r\n\r\n                    $(\"#luckysheet-dialog-pivotTable-range\").html(val);\r\n\r\n                    $(\"#luckysheet-modal-dialog-slider-pivot\").show();\r\n\r\n                    $(\"#luckysheet-data-pivotTable-selection\").hide();\r\n\r\n                    _this.luckysheet_pivotTable_select_state = false;\r\n\r\n                    _this.refreshPivotTable();\r\n\r\n                    luckysheetsizeauto();\r\n\r\n                    cleargridelement();\r\n                }\r\n            });\r\n\r\n            $(\"#luckysheet-modal-dialog-slider-pivot\").on(\r\n                \"mousedown\",\r\n                \".luckysheet-slider-list-item-name, .luckysheet-modal-dialog-slider-config-item-txt\",\r\n                function(e) {\r\n                    let $cur = $(e.target);\r\n                    _this.movestate = true;\r\n                    _this.movesave.obj = $cur.parent();\r\n                    _this.movesave.name = $cur.data(\"name\");\r\n                    _this.movesave.containerid = $cur\r\n                        .parent()\r\n                        .parent()\r\n                        .attr(\"id\");\r\n                    _this.movesave.index = $cur.data(\"index\");\r\n\r\n                    if ($(\"#luckysheet-modal-dialog-slider-pivot-move\").length == 0) {\r\n                        $(\"body\").append(\r\n                            '<div id=\"luckysheet-modal-dialog-slider-pivot-move\">' + _this.movesave.name + \"</div>\",\r\n                        );\r\n                    }\r\n\r\n                    _this.movesave.width = $(\"#luckysheet-modal-dialog-slider-pivot-move\").outerWidth();\r\n                    _this.movesave.height = $(\"#luckysheet-modal-dialog-slider-pivot-move\").outerHeight();\r\n\r\n                    $(\r\n                        \"#luckysheet-modal-dialog-pivotTable-list, #luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\",\r\n                    ).css(\"cursor\", \"default\");\r\n                },\r\n            );\r\n\r\n            $(\r\n                \"#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\",\r\n            )\r\n                .mousemove(function(e) {\r\n                    if (_this.movestate) {\r\n                        if (_this.moveitemposition.length == 0) {\r\n                            _this.moveitemposition = [0];\r\n\r\n                            $(this)\r\n                                .find(\".luckysheet-modal-dialog-slider-config-item\")\r\n                                .each(function(i) {\r\n                                    let $t = $(this),\r\n                                        h = $t.outerHeight();\r\n                                    _this.moveitemposition.push(_this.moveitemposition[i] + h + 2);\r\n                                });\r\n                            $(this).append(\r\n                                '<div id=\"luckysheet-modal-dialog-config-order-help\" style=\"position:absolute;height:3px;width:100%;background:#007ACC;z-index:1;pointer-events: none;user-select:none;\"></div>',\r\n                            );\r\n                        }\r\n\r\n                        $(\"#luckysheet-modal-dialog-slider-pivot-move\").css({\r\n                            background: \"#FD8585\",\r\n                            color: \"#fff\",\r\n                            border: \"1px solid #FD7070\",\r\n                        });\r\n                        let x = event.pageX,\r\n                            y = event.pageY,\r\n                            $container = $(this);\r\n                        let curtop = y - $container.offset().top + $container.scrollTop();\r\n                        let position = _this.moveitemposition;\r\n                        let row_index = luckysheet_searcharray(position, curtop);\r\n\r\n                        if (row_index == -1) {\r\n                            $(\"#luckysheet-modal-dialog-config-order-help\").css({ top: position[position.length - 1] });\r\n                        } else if (\r\n                            curtop - position[row_index - 1] >\r\n                            (position[row_index] - position[row_index - 1]) / 2\r\n                        ) {\r\n                            $(\"#luckysheet-modal-dialog-config-order-help\").css({ top: position[row_index] });\r\n                        } else {\r\n                            $(\"#luckysheet-modal-dialog-config-order-help\").css({ top: position[row_index - 1] });\r\n                        }\r\n                    }\r\n                })\r\n                .mouseleave(function() {\r\n                    if (_this.movestate) {\r\n                        $(\"#luckysheet-modal-dialog-slider-pivot-move\").css({\r\n                            background: \"#fff\",\r\n                            color: \"#000\",\r\n                            border: \"1px dotted #000\",\r\n                        });\r\n                        _this.moveitemposition = [];\r\n                        $(\"#luckysheet-modal-dialog-config-order-help\").remove();\r\n                    }\r\n                })\r\n                .mouseup(function(e) {\r\n                    if (_this.movestate) {\r\n                        let $t = $(this);\r\n                        let itemHTML;\r\n\r\n                        if (_this.movesave.containerid == $t.attr(\"id\")) {\r\n                            itemHTML = _this.movesave.obj.clone();\r\n                        } else {\r\n                            let name = _this.movesave.name,\r\n                                sumtype = \"\",\r\n                                nameindex = \"\";\r\n\r\n                            if ($t.attr(\"id\") == \"luckysheet-modal-dialog-config-value\") {\r\n                                let type = _this.pivot_data_type[_this.movesave.index.toString()];\r\n\r\n                                if (type == \"num\") {\r\n                                    name = locale_pivotTable.valueStatisticsSUM + \":\" + name;\r\n                                    sumtype = \"data-sumtype='SUM'\";\r\n                                    nameindex = \"data-nameindex='0'\";\r\n                                } else {\r\n                                    name = locale_pivotTable.valueStatisticsCOUNTA + \":\" + name;\r\n                                    sumtype = \"data-sumtype='COUNTA'\";\r\n                                    nameindex = \"data-nameindex='0'\";\r\n                                }\r\n\r\n                                $(\"#luckysheet-modal-dialog-config-value\")\r\n                                    .find(\".luckysheet-modal-dialog-slider-config-item\")\r\n                                    .each(function() {\r\n                                        if (\r\n                                            $(this)\r\n                                                .find(\".luckysheet-modal-dialog-slider-config-item-txt\")\r\n                                                .text() == name\r\n                                        ) {\r\n                                            let ni = parseFloat($(this).data(\"nameindex\")) + 1;\r\n                                            name = name + ni.toString();\r\n                                            $(this).data(\"nameindex\", ni);\r\n                                            return false;\r\n                                        }\r\n                                    });\r\n                            }\r\n\r\n                            itemHTML =\r\n                                '<div title=\"' +\r\n                                name +\r\n                                '\" class=\"luckysheet-modal-dialog-slider-config-item\" ' +\r\n                                nameindex +\r\n                                \" \" +\r\n                                sumtype +\r\n                                ' data-index=\"' +\r\n                                _this.movesave.index +\r\n                                '\" data-name=\"' +\r\n                                _this.movesave.name +\r\n                                '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" ' +\r\n                                nameindex +\r\n                                \" \" +\r\n                                sumtype +\r\n                                ' data-index=\"' +\r\n                                _this.movesave.index +\r\n                                '\" data-name=\"' +\r\n                                _this.movesave.name +\r\n                                '\">' +\r\n                                name +\r\n                                '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n                        }\r\n\r\n                        let x = event.pageX,\r\n                            y = event.pageY,\r\n                            $container = $(this);\r\n                        let curtop = y - $container.offset().top + $container.scrollTop();\r\n                        let position = _this.moveitemposition;\r\n                        let row_index = luckysheet_searcharray(position, curtop);\r\n\r\n                        if (\r\n                            _this.movesave.containerid == \"luckysheet-modal-dialog-pivotTable-list\" ||\r\n                            (_this.movesave.containerid == \"luckysheet-modal-dialog-config-value\" &&\r\n                                _this.movesave.containerid != $t.attr(\"id\"))\r\n                        ) {\r\n                            $(\r\n                                \"#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column\",\r\n                            )\r\n                                .find(\".luckysheet-modal-dialog-slider-config-item\")\r\n                                .each(function() {\r\n                                    if ($(this).data(\"index\") == _this.movesave.index) {\r\n                                        $(this).remove();\r\n                                    }\r\n                                });\r\n                        }\r\n\r\n                        if (row_index == -1) {\r\n                            if ($t.find(\".luckysheet-modal-dialog-slider-config-item\").length == 0) {\r\n                                $t.append(itemHTML);\r\n                            } else {\r\n                                $t.find(\".luckysheet-modal-dialog-slider-config-item\")\r\n                                    .last()\r\n                                    .after(itemHTML);\r\n                            }\r\n                        } else if (\r\n                            curtop - position[row_index - 1] >\r\n                            (position[row_index] - position[row_index - 1]) / 2\r\n                        ) {\r\n                            $t.find(\".luckysheet-modal-dialog-slider-config-item\")\r\n                                .eq(row_index - 1)\r\n                                .after(itemHTML);\r\n                        } else {\r\n                            $t.find(\".luckysheet-modal-dialog-slider-config-item\")\r\n                                .eq(row_index - 1)\r\n                                .before(itemHTML);\r\n                        }\r\n\r\n                        if (_this.movesave.containerid == \"luckysheet-modal-dialog-pivotTable-list\") {\r\n                        } else if (\r\n                            _this.movesave.containerid == \"luckysheet-modal-dialog-config-value\" &&\r\n                            _this.movesave.containerid != $t.attr(\"id\")\r\n                        ) {\r\n                        } else {\r\n                            _this.movesave.obj.remove();\r\n                        }\r\n\r\n                        $(\"#luckysheet-modal-dialog-pivotTable-list\")\r\n                            .find(\".luckysheet-modal-dialog-slider-list-item\")\r\n                            .each(function() {\r\n                                let $seleted = $(this).find(\".luckysheet-slider-list-item-selected\");\r\n                                if ($(this).data(\"index\") == _this.movesave.index && $seleted.find(\"i\").length == 0) {\r\n                                    $seleted.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n                                }\r\n                            });\r\n\r\n                        _this.refreshPivotTable();\r\n\r\n                        $(\"#luckysheet-modal-dialog-slider-pivot-move\").remove();\r\n                        _this.movestate = false;\r\n                        $(\r\n                            \"#luckysheet-modal-dialog-pivotTable-list, #luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\",\r\n                        ).css(\"cursor\", \"default\");\r\n                        _this.moveitemposition = [];\r\n                        $(\"#luckysheet-modal-dialog-config-order-help\").remove();\r\n                        _this.showvaluecolrow();\r\n                        e.stopPropagation();\r\n                    }\r\n                });\r\n\r\n            $(\"#luckysheet-modal-dialog-pivotTable-list\").on(\r\n                \"click\",\r\n                \".luckysheet-slider-list-item-selected\",\r\n                function() {\r\n                    let $t = $(this),\r\n                        $item = $t.parent(),\r\n                        index = $item.data(\"index\"),\r\n                        name = $item.data(\"name\");\r\n\r\n                    if ($t.find(\"i\").length == 0) {\r\n                        $t.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n\r\n                        let type = _this.pivot_data_type[index.toString()],\r\n                            itemHTML;\r\n\r\n                        if (type == \"num\") {\r\n                            itemHTML =\r\n                                '<div title=\"' +\r\n                                name +\r\n                                '\" class=\"luckysheet-modal-dialog-slider-config-item\" data-nameindex=\"0\" data-sumtype=\"SUM\" data-index=\"' +\r\n                                index +\r\n                                '\" data-name=\"' +\r\n                                name +\r\n                                '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" data-nameindex=\"0\" data-sumtype=\"SUM\" data-index=\"' +\r\n                                index +\r\n                                '\" data-name=\"' +\r\n                                name +\r\n                                '\">求和:' +\r\n                                name +\r\n                                '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n                            $(\"#luckysheet-modal-dialog-config-value\").append(itemHTML);\r\n                        } else {\r\n                            itemHTML =\r\n                                '<div title=\"' +\r\n                                name +\r\n                                '\" class=\"luckysheet-modal-dialog-slider-config-item\" data-index=\"' +\r\n                                index +\r\n                                '\" data-name=\"' +\r\n                                name +\r\n                                '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" data-index=\"' +\r\n                                index +\r\n                                '\" data-name=\"' +\r\n                                name +\r\n                                '\">' +\r\n                                name +\r\n                                '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n\r\n                            let $column = $(\"#luckysheet-modal-dialog-config-column\"),\r\n                                $row = $(\"#luckysheet-modal-dialog-config-row\");\r\n                            let columnitem = $column.find(\".luckysheet-modal-dialog-slider-config-item\"),\r\n                                rowitem = $row.find(\".luckysheet-modal-dialog-slider-config-item\");\r\n\r\n                            if (columnitem.length < 2) {\r\n                                $column.append(itemHTML);\r\n                            } else if (rowitem.length < 2) {\r\n                                $row.append(itemHTML);\r\n                            } else {\r\n                                $column.append(itemHTML);\r\n                            }\r\n                        }\r\n                    } else {\r\n                        $t.find(\"i\").remove();\r\n                        $(\r\n                            \"#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\",\r\n                        )\r\n                            .find(\".luckysheet-modal-dialog-slider-config-item\")\r\n                            .each(function() {\r\n                                if ($(this).data(\"index\") == index) {\r\n                                    if (\r\n                                        $(this)\r\n                                            .parent()\r\n                                            .attr(\"id\") == \"luckysheet-modal-dialog-config-value\"\r\n                                    ) {\r\n                                        _this.resetOrderby($(this));\r\n                                    }\r\n                                    $(this).remove();\r\n                                }\r\n                            });\r\n                    }\r\n\r\n                    _this.refreshPivotTable();\r\n                    _this.showvaluecolrow();\r\n                },\r\n            );\r\n\r\n            $(\"#luckysheet-dialog-pivotTable-clearitem\").click(function() {\r\n                $(\r\n                    \"#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\",\r\n                )\r\n                    .find(\".luckysheet-modal-dialog-slider-config-item\")\r\n                    .each(function() {\r\n                        $(this).remove();\r\n                    });\r\n\r\n                $(\"#luckysheet-modal-dialog-pivotTable-list\")\r\n                    .find(\".luckysheet-modal-dialog-slider-list-item\")\r\n                    .each(function() {\r\n                        $(this)\r\n                            .find(\".luckysheet-slider-list-item-selected\")\r\n                            .find(\"i\")\r\n                            .remove();\r\n                    });\r\n\r\n                _this.refreshPivotTable();\r\n                _this.showvaluecolrow();\r\n            });\r\n        }\r\n\r\n        if (restore == null) {\r\n            restore = false;\r\n        }\r\n\r\n        if (_this.celldata.length <= 1 && _this.celldata[0].length <= 1) {\r\n            if (isEditMode()) {\r\n                alert(locale_pivotTable.errorIncreaseRange);\r\n            } else {\r\n                tooltip.info(\"\", locale_pivotTable.errorIncreaseRange);\r\n            }\r\n        }\r\n\r\n        let selecteditem = \"\",\r\n            selecteditemIndex = 1,\r\n            selecteditemtest = {},\r\n            selecteditemNullIndex = 1;\r\n\r\n        for (let i = 0; i < _this.celldata[0].length; i++) {\r\n            let name;\r\n            if (!!_this.celldata[0][i] && !!_this.celldata[0][i][\"m\"]) {\r\n                name = _this.celldata[0][i][\"m\"];\r\n            } else {\r\n                name = getcellvalue(0, i, _this.celldata);\r\n            }\r\n\r\n            if (name != null) {\r\n                name = name.toString();\r\n            }\r\n\r\n            if (name == null || $.trim(name.toString()).length == 0) {\r\n                name = locale_pivotTable.titleColumn + \" \" + selecteditemNullIndex;\r\n            }\r\n            selecteditemNullIndex++;\r\n\r\n            if (name in selecteditemtest) {\r\n                name = name + selecteditemIndex++;\r\n                if (name in selecteditemtest) {\r\n                    name = name + selecteditemIndex++;\r\n                    if (name in selecteditemtest) {\r\n                        name = name + selecteditemIndex++;\r\n                    }\r\n                }\r\n            }\r\n            selecteditemtest[name] = 1;\r\n\r\n            let dataother = \"\",\r\n                style = \"\";\r\n\r\n            if (restore && _this.filterparm != null) {\r\n                if (_this.filterparm[i.toString()] != null) {\r\n                    let itemset = _this.filterparm[i.toString()];\r\n                    if (itemset.rowhidden != null) {\r\n                        dataother += \"data-rowhidden='\" + JSON.stringify(itemset.rowhidden) + \"'\";\r\n                    }\r\n\r\n                    if (itemset.selected != null) {\r\n                        dataother += \"data-selected='\" + JSON.stringify(itemset.selected) + \"'\";\r\n                    }\r\n\r\n                    if (itemset.caljs != null) {\r\n                        let caljsset = itemset.caljs;\r\n                        if (caljsset.value != null) {\r\n                            dataother += \"data-byconditionvalue='\" + caljsset.value + \"'\";\r\n                        }\r\n\r\n                        if (caljsset.type != null) {\r\n                            dataother += \"data-byconditiontype='\" + caljsset.type + \"'\";\r\n                        }\r\n\r\n                        if (caljsset.text != null) {\r\n                            dataother += \"data-byconditiontext='\" + caljsset.text + \"'\";\r\n                        }\r\n\r\n                        if (caljsset.value1 != null) {\r\n                            dataother += \"data-byconditionvalue1='\" + caljsset.value1 + \"'\";\r\n                        }\r\n\r\n                        if (caljsset.value2 != null) {\r\n                            dataother += \"data-byconditionvalue2='\" + caljsset.value2 + \"'\";\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (dataother.length > 0) {\r\n                style = \"display:block;\";\r\n            }\r\n\r\n            selecteditem +=\r\n                '<div class=\"luckysheet-modal-dialog-slider-list-item\" ' +\r\n                dataother +\r\n                ' data-index=\"' +\r\n                i +\r\n                '\" data-name=\"' +\r\n                name +\r\n                '\"><div title=\"' +\r\n                locale_pivotTable.titleAddColumn +\r\n                '\" class=\"luckysheet-slider-list-item-selected\"><div></div></div><div title=\"' +\r\n                locale_pivotTable.titleMoveColumn +\r\n                '\" class=\"luckysheet-slider-list-item-name\" ' +\r\n                dataother +\r\n                ' data-index=\"' +\r\n                i +\r\n                '\" data-name=\"' +\r\n                name +\r\n                '\">' +\r\n                name +\r\n                '</div><div title=\"' +\r\n                locale_pivotTable.titleClearColumnFilter +\r\n                '\" class=\"luckysheet-slider-list-item-filtered\" style=\"' +\r\n                style +\r\n                '\"><i class=\"fa fa-filter luckysheet-mousedown-cancel\" aria-hidden=\"true\"></i><i class=\"fa fa-times\" aria-hidden=\"true\"></i></div><div title=\"' +\r\n                locale_pivotTable.titleFilterColumn +\r\n                '\" class=\"luckysheet-slider-list-item-filter\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n        }\r\n        $(\"#luckysheet-modal-dialog-pivotTable-list\").html(selecteditem);\r\n\r\n        $(\"#luckysheetpivottablevaluecolrowshow\").hide();\r\n        $(\"#luckysheetpivottablevaluecolrow\").prop(\"checked\", true);\r\n        $(\"#luckysheetpivottablevaluecolrow1\").prop(\"checked\", false);\r\n\r\n        $(\r\n            \"#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value\",\r\n        ).empty();\r\n\r\n        if (restore) {\r\n            if (_this.filter != null && _this.filter.length > 0) {\r\n                for (let i = 0; i < _this.filter.length; i++) {\r\n                    let item = _this.filter[i];\r\n\r\n                    let itemHTML =\r\n                        '<div title=\"' +\r\n                        name +\r\n                        '\" class=\"luckysheet-modal-dialog-slider-config-item\" data-index=\"' +\r\n                        item.index +\r\n                        '\" data-name=\"' +\r\n                        item.name +\r\n                        '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" data-index=\"' +\r\n                        item.index +\r\n                        '\" data-name=\"' +\r\n                        item.name +\r\n                        '\">' +\r\n                        item.name +\r\n                        '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n\r\n                    $(\"#luckysheet-modal-dialog-config-filter\").append(itemHTML);\r\n\r\n                    let $seleted = $(\r\n                        \"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\",\r\n                    )\r\n                        .eq(item.index)\r\n                        .find(\".luckysheet-slider-list-item-selected\");\r\n                    if ($seleted.find(\"i\").length == 0) {\r\n                        $seleted.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (_this.row != null && _this.row.length > 0) {\r\n                for (let i = 0; i < _this.row.length; i++) {\r\n                    let item = _this.row[i];\r\n                    let otherset = \"\";\r\n\r\n                    if (item.order != null) {\r\n                        otherset += \"data-order = '\" + item.order + \"'\";\r\n                    }\r\n\r\n                    if (item.orderby != null) {\r\n                        otherset += \"data-orderby = '\" + item.orderby + \"'\";\r\n                    }\r\n\r\n                    if (item.order != null) {\r\n                        otherset += \"data-stastic = '\" + item.stastic + \"'\";\r\n                    }\r\n\r\n                    let itemHTML =\r\n                        '<div title=\"' +\r\n                        name +\r\n                        '\" class=\"luckysheet-modal-dialog-slider-config-item\" ' +\r\n                        otherset +\r\n                        ' data-index=\"' +\r\n                        item.index +\r\n                        '\" data-name=\"' +\r\n                        item.name +\r\n                        '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" ' +\r\n                        otherset +\r\n                        ' data-index=\"' +\r\n                        item.index +\r\n                        '\" data-name=\"' +\r\n                        item.name +\r\n                        '\">' +\r\n                        item.name +\r\n                        '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n\r\n                    $(\"#luckysheet-modal-dialog-config-row\").append(itemHTML);\r\n\r\n                    let $seleted = $(\r\n                        \"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\",\r\n                    )\r\n                        .eq(item.index)\r\n                        .find(\".luckysheet-slider-list-item-selected\");\r\n                    if ($seleted.find(\"i\").length == 0) {\r\n                        $seleted.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (_this.column != null && _this.column.length > 0) {\r\n                for (let i = 0; i < _this.column.length; i++) {\r\n                    let item = _this.column[i];\r\n                    let otherset = \"\";\r\n\r\n                    if (item.order != null) {\r\n                        otherset += \"data-order = '\" + item.order + \"'\";\r\n                    }\r\n\r\n                    if (item.orderby != null) {\r\n                        otherset += \"data-orderby = '\" + item.orderby + \"'\";\r\n                    }\r\n\r\n                    if (item.order != null) {\r\n                        otherset += \"data-stastic = '\" + item.stastic + \"'\";\r\n                    }\r\n\r\n                    let itemHTML =\r\n                        '<div title=\"' +\r\n                        name +\r\n                        '\" class=\"luckysheet-modal-dialog-slider-config-item\" ' +\r\n                        otherset +\r\n                        ' data-index=\"' +\r\n                        item.index +\r\n                        '\" data-name=\"' +\r\n                        item.name +\r\n                        '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" ' +\r\n                        otherset +\r\n                        ' data-index=\"' +\r\n                        item.index +\r\n                        '\" data-name=\"' +\r\n                        item.name +\r\n                        '\">' +\r\n                        item.name +\r\n                        '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n\r\n                    $(\"#luckysheet-modal-dialog-config-column\").append(itemHTML);\r\n\r\n                    let $seleted = $(\r\n                        \"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\",\r\n                    )\r\n                        .eq(item.index)\r\n                        .find(\".luckysheet-slider-list-item-selected\");\r\n                    if ($seleted.find(\"i\").length == 0) {\r\n                        $seleted.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (_this.values != null && _this.values.length > 0) {\r\n                for (let i = 0; i < _this.values.length; i++) {\r\n                    let item = _this.values[i];\r\n                    let otherset = \"\";\r\n\r\n                    if (item.sumtype != null) {\r\n                        otherset += \"data-sumtype = '\" + item.sumtype + \"'\";\r\n                    }\r\n\r\n                    if (item.nameindex != null) {\r\n                        otherset += \"data-nameindex = '\" + item.nameindex + \"'\";\r\n                    }\r\n\r\n                    let itemHTML =\r\n                        '<div title=\"' +\r\n                        name +\r\n                        '\" class=\"luckysheet-modal-dialog-slider-config-item\" ' +\r\n                        otherset +\r\n                        ' data-index=\"' +\r\n                        item.index +\r\n                        '\" data-name=\"' +\r\n                        item.name +\r\n                        '\"><div class=\"luckysheet-modal-dialog-slider-config-item-txt\" ' +\r\n                        otherset +\r\n                        ' data-index=\"' +\r\n                        item.index +\r\n                        '\" data-name=\"' +\r\n                        item.name +\r\n                        '\">' +\r\n                        _this.getSumTypeName(item.sumtype) +\r\n                        \":\" +\r\n                        item.name +\r\n                        '</div><div class=\"luckysheet-modal-dialog-slider-config-item-icon\"><i class=\"fa fa-sort-desc\" aria-hidden=\"true\"></i></div></div>';\r\n\r\n                    $(\"#luckysheet-modal-dialog-config-value\").append(itemHTML);\r\n\r\n                    let $seleted = $(\r\n                        \"#luckysheet-modal-dialog-pivotTable-list .luckysheet-modal-dialog-slider-list-item\",\r\n                    )\r\n                        .eq(item.index)\r\n                        .find(\".luckysheet-slider-list-item-selected\");\r\n                    if ($seleted.find(\"i\").length == 0) {\r\n                        $seleted.append('<i class=\"fa fa-check luckysheet-mousedown-cancel\"></i>');\r\n                    }\r\n                }\r\n\r\n                if (_this.values.length >= 2) {\r\n                    $(\"#luckysheetpivottablevaluecolrowshow\").show();\r\n                    if (_this.showType == \"column\") {\r\n                        $(\"#luckysheetpivottablevaluecolrow\").prop(\"checked\", true);\r\n                        $(\"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']\").addClass(\r\n                            \"ui-state-active\",\r\n                        );\r\n\r\n                        $(\"#luckysheetpivottablevaluecolrow1\").prop(\"checked\", false);\r\n                        $(\r\n                            \"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']\",\r\n                        ).removeClass(\"ui-state-active\");\r\n                    } else {\r\n                        $(\"#luckysheetpivottablevaluecolrow1\").prop(\"checked\", true);\r\n                        $(\r\n                            \"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow1']\",\r\n                        ).addClass(\"ui-state-active\");\r\n\r\n                        $(\"#luckysheetpivottablevaluecolrow\").prop(\"checked\", false);\r\n                        $(\r\n                            \"#luckysheetpivottablevaluecolrowshow label[for='luckysheetpivottablevaluecolrow']\",\r\n                        ).removeClass(\"ui-state-active\");\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        $(\"#luckysheet-dialog-pivotTable-range\").html(getRangetxt(_this.pivotDataSheetIndex, _this.pivot_select_save));\r\n        $(\"#luckysheet-modal-dialog-slider-pivot\").show();\r\n\r\n        luckysheetsizeauto(false);\r\n    },\r\n    getComposeArray: function(data) {\r\n        if (data.length == 0) {\r\n            return [];\r\n        }\r\n\r\n        let ret = [];\r\n        for (let i = 0; i < data.length; i++) {\r\n            let name = \"\";\r\n            for (let x = 0; x <= i; x++) {\r\n                if (!!data[x] && !!data[x][\"m\"]) {\r\n                    name += data[x][\"m\"];\r\n                } else {\r\n                    name += getcellvalue(x, null, data);\r\n                }\r\n            }\r\n\r\n            ret.push(name);\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    getnameArray: function(data, field) {\r\n        if (data.length == 0) {\r\n            return [];\r\n        }\r\n\r\n        if (field.length == 0) {\r\n            return [];\r\n        }\r\n\r\n        let ret = [];\r\n        for (let i = 0; i < field.length; i++) {\r\n            let c_value;\r\n            if (!!data[field[i].index] && !!data[field[i].index][\"m\"]) {\r\n                c_value = data[field[i].index][\"m\"];\r\n            } else {\r\n                c_value = getcellvalue(field[i].index, null, data);\r\n            }\r\n\r\n            ret.push(c_value);\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    getTitleFromGroup: function(group, config, dataposition) {\r\n        let _this = this;\r\n        let orderbygroup = _this.orderbygroup(group, config, dataposition);\r\n\r\n        return _this.generategrouparraymain(orderbygroup, config);\r\n    },\r\n    orderbygroup: function(group, config, dataposition) {\r\n        let _this = this;\r\n\r\n        let stackset = [];\r\n        if (group.length == 0) {\r\n            return [];\r\n        }\r\n        stackset = group;\r\n\r\n        let d = null,\r\n            alllength = stackset.length,\r\n            alllengthInital = stackset.length,\r\n            a = 0;\r\n\r\n        while (alllength != 0) {\r\n            d = stackset[a++];\r\n            alllength--;\r\n\r\n            if (d.children != null && d.children.length > 0) {\r\n                d.children = _this.orderbygroupchildren(\r\n                    d.children,\r\n                    config[d.index].orderby,\r\n                    config[d.index].order,\r\n                    dataposition,\r\n                );\r\n\r\n                for (let i = 0; i < d.children.length; i++) {\r\n                    stackset.push(d.children[i]);\r\n                    alllength++;\r\n                }\r\n            }\r\n        }\r\n\r\n        return group.splice(0, alllengthInital);\r\n    },\r\n    orderbygroupchildren: function(childrens, orderby, order, dataposition) {\r\n        if (childrens.length == 0) {\r\n            return [];\r\n        }\r\n\r\n        let isAsc = false;\r\n        if (order == null || order == \"asc\") {\r\n            isAsc = true;\r\n        }\r\n\r\n        const _locale = locale();\r\n        const locale_filter = _locale.filter;\r\n\r\n        let a = function(x, y) {\r\n            let f = null,\r\n                s = null;\r\n\r\n            if (orderby == \"self\" || orderby == null) {\r\n                if (x.name == null) {\r\n                    f = locale_filter.valueBlank;\r\n                } else {\r\n                    f = x.name.toString();\r\n                }\r\n\r\n                if (y.name == null) {\r\n                    s = locale_filter.valueBlank;\r\n                } else {\r\n                    s = y.name.toString();\r\n                }\r\n\r\n                if (isdatetime(f) && isdatetime(s)) {\r\n                    return diff(f, s);\r\n                }\r\n            } else {\r\n                f = parseFloat(dataposition[x.orderby].result);\r\n                s = parseFloat(dataposition[y.orderby].result);\r\n            }\r\n\r\n            if (!isNaN(f) && !isNaN(s)) {\r\n                return numeral(f).value() - numeral(s).value();\r\n            } else if (isNaN(f) && isNaN(s)) {\r\n                return f.localeCompare(s);\r\n            } else if (isNaN(f)) {\r\n                return 1;\r\n            } else if (isNaN(s)) {\r\n                return -1;\r\n            }\r\n        };\r\n\r\n        let d = function(x, y) {\r\n            let f = null,\r\n                s = null;\r\n\r\n            if (orderby == \"self\" || orderby == null) {\r\n                if (x.name == null) {\r\n                    f = locale_filter.valueBlank;\r\n                } else {\r\n                    f = x.name.toString();\r\n                }\r\n\r\n                if (y.name == null) {\r\n                    s = locale_filter.valueBlank;\r\n                } else {\r\n                    s = y.name.toString();\r\n                }\r\n\r\n                if (isdatetime(f) && isdatetime(s)) {\r\n                    return diff(f, s);\r\n                }\r\n            } else {\r\n                f = parseFloat(dataposition[x.orderby].result);\r\n                s = parseFloat(dataposition[y.orderby].result);\r\n            }\r\n\r\n            if (!isNaN(f) && !isNaN(s)) {\r\n                return numeral(s).value() - numeral(f).value();\r\n            } else if (isNaN(f) && isNaN(s)) {\r\n                return s.localeCompare(f);\r\n            } else if (isNaN(f)) {\r\n                return -1;\r\n            } else if (isNaN(s)) {\r\n                return 1;\r\n            }\r\n        };\r\n\r\n        if (isAsc) {\r\n            return childrens.sort(a);\r\n        } else {\r\n            return childrens.sort(d);\r\n        }\r\n    },\r\n    generategroupaddstatic: function(arr, name) {\r\n        let stasticarr = [];\r\n        const _locale = locale();\r\n        const locale_pivotTable = _locale.pivotTable;\r\n        for (let a = 0; a < arr[0].length; a++) {\r\n            if (a == 0) {\r\n                if (name == locale_pivotTable.valueSum) {\r\n                    stasticarr.push(name);\r\n                } else {\r\n                    stasticarr.push({ name: name, issum: true });\r\n                }\r\n            } else {\r\n                stasticarr.push(\"\");\r\n            }\r\n        }\r\n\r\n        return stasticarr;\r\n    },\r\n    generategrouparraymain: function(group, config) {\r\n        let _this = this;\r\n\r\n        //生成数组\r\n        let ret = [];\r\n        for (let i = 0; i < group.length; i++) {\r\n            let name = group[i].name;\r\n            let arr = _this.generategrouparray(group[i].children, config, 1);\r\n\r\n            if (config[0].stastic == \"1\" || config[0].stastic == null) {\r\n                arr.push(_this.generategroupaddstatic(arr, name));\r\n            }\r\n\r\n            ret = ret.concat(arr);\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    generategrouparray: function(group, config, level) {\r\n        let _this = this;\r\n\r\n        let ret = [];\r\n        for (let i = 0; i < group.length; i++) {\r\n            let name = group[i].name;\r\n            let arr;\r\n\r\n            if (group[i].children == 0 || group[i].children.length == 0) {\r\n                arr = [name];\r\n                ret.push(arr);\r\n            } else {\r\n                arr = _this.generategrouparray(group[i].children, config, level + 1);\r\n\r\n                for (let a = 0; a < arr.length; a++) {\r\n                    arr[a].unshift(name);\r\n                }\r\n\r\n                if (config[level].stastic == \"1\" || config[level].stastic == null) {\r\n                    arr.push(_this.generategroupaddstatic(arr, name));\r\n                }\r\n\r\n                ret = ret.concat(arr);\r\n            }\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    addStatisticsData: function(dataposition, valueobj, indicator, d_value) {\r\n        if (dataposition[indicator] == null) {\r\n            dataposition[indicator] = {\r\n                data: [],\r\n                count: 0,\r\n                max: -Infinity,\r\n                min: Infinity,\r\n                counta: 0,\r\n                countunique: 0,\r\n                countuniquedata: {},\r\n                sum: 0,\r\n                digitaldata: [],\r\n                sumtype: valueobj.sumtype,\r\n                index: valueobj.index,\r\n                name: valueobj.fullname,\r\n                acc: 0,\r\n            };\r\n        }\r\n\r\n        if (isdatatypemulti(d_value)[\"num\"] === true) {\r\n            //fix issue 265\r\n            let num = numFormat(d_value, 6);\r\n            dataposition[indicator][\"digitaldata\"].push(num);\r\n            dataposition[indicator][\"count\"] += 1;\r\n            dataposition[indicator][\"sum\"] += num;\r\n\r\n            if (num > dataposition[indicator][\"max\"]) {\r\n                dataposition[indicator][\"max\"] = num;\r\n            }\r\n\r\n            if (num < dataposition[indicator][\"min\"]) {\r\n                dataposition[indicator][\"min\"] = num;\r\n            }\r\n\r\n            let newAcc = numfloatlen(num);\r\n\r\n            if (newAcc > dataposition[indicator][\"acc\"]) {\r\n                dataposition[indicator][\"acc\"] = newAcc;\r\n            }\r\n        }\r\n\r\n        if (d_value != \"\") {\r\n            dataposition[indicator][\"data\"].push(d_value);\r\n            dataposition[indicator][\"counta\"] += 1;\r\n            if (!(d_value in dataposition[indicator][\"countuniquedata\"])) {\r\n                dataposition[indicator][\"countuniquedata\"][d_value] = 1;\r\n                dataposition[indicator][\"countunique\"] += 1;\r\n            }\r\n        }\r\n    },\r\n    dataHandler: function(column, row, values, showType, celldata) {\r\n        //column:[{\"index\":1, name:\"列1\", \"order\":\"asc\", \"orderby\":\"self/0/1/2\", \"stastic\":\"0/1\"}]\r\n        //row:[{\"index\":1, name:\"列3\", \"order\":\"asc\", \"orderby\":\"self/0/1/2\", \"stastic\":\"0/1\"}]\r\n        //values:[{\"index\":1, \"sumtype\":\"SUM/COUNT/COUNTA/COUNTUNIQUE/AVERAGE/MAX/MIN/MEDIAN/PRODUCT/STDEV/STDEVP/let/VARP\", \"name\":\"求和:fyc\"}]\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_filter = _locale.filter;\r\n        const locale_pivotTable = _locale.pivotTable;\r\n\r\n        if (showType == null) {\r\n            showType = \"column\";\r\n        }\r\n\r\n        if ((column.length == 0 && row.length == 0 && values.length == 0) || celldata.length == 0) {\r\n            _this.pivotDatas = [];\r\n            return [];\r\n        }\r\n\r\n        //生成透视表值及定位\r\n        let dataposition = {},\r\n            data = celldata,\r\n            datarowtitle = [],\r\n            datarowtitlegroup = [],\r\n            datarowposition = {},\r\n            datarowposition_i = 0,\r\n            datacoltitle = [],\r\n            datacoltitlegroup = [],\r\n            datacolposition = {},\r\n            datacolposition_i = 0;\r\n\r\n        for (let i = 1; i < data.length; i++) {\r\n            let d = data[i];\r\n            let groupbyrowtxt = \"\",\r\n                groupbycoltxt = \"\",\r\n                rowtxt = \"\",\r\n                rowtitle = [],\r\n                rowtitlename = [],\r\n                coltxt = \"\",\r\n                coltitle = [],\r\n                coltitlename = [];\r\n\r\n            //[\"四川\", \"成都\", \"邛崃\"] 转换为 [\"四川\", \"四川成都\", \"四川成都邛崃\"]\r\n            rowtitlename = _this.getnameArray(d, row);\r\n            coltitlename = _this.getnameArray(d, column);\r\n\r\n            rowtitle = _this.getComposeArray(rowtitlename);\r\n            coltitle = _this.getComposeArray(coltitlename);\r\n\r\n            if (rowtitle.length > 0) {\r\n                rowtitle.unshift(locale_pivotTable.valueSum);\r\n            }\r\n\r\n            if (coltitle.length > 0) {\r\n                coltitle.unshift(locale_pivotTable.valueSum);\r\n            }\r\n\r\n            let curentLevelobj_row = datarowposition,\r\n                curentLevelarr_row = datarowtitlegroup;\r\n\r\n            for (let r = 0; r < rowtitle.length; r++) {\r\n                let item = rowtitle[r],\r\n                    name = r == 0 ? locale_pivotTable.valueSum : rowtitlename[r - 1]; //修改\r\n\r\n                if (curentLevelobj_row[r.toString()] != null && curentLevelobj_row[r.toString()][item] != null) {\r\n                    //修改\r\n                    curentLevelarr_row = curentLevelarr_row[curentLevelobj_row[r.toString()][item]].children;\r\n                } else {\r\n                    let orderby =\r\n                        r == 0\r\n                            ? \"self\"\r\n                            : row[r - 1].orderby == \"self\" || row[r - 1].orderby == null\r\n                            ? item\r\n                            : showType == \"column\"\r\n                            ? item + values[parseInt(row[r - 1].orderby)].fullname\r\n                            : item + locale_pivotTable.valueSum;\r\n\r\n                    if (name == null) {\r\n                        name = locale_filter.valueBlank;\r\n                    }\r\n\r\n                    curentLevelarr_row.push({ name: name, fullname: item, index: r, orderby: orderby, children: [] });\r\n\r\n                    if (curentLevelobj_row[r.toString()] == null) {\r\n                        curentLevelobj_row[r.toString()] = {};\r\n                    }\r\n\r\n                    if (curentLevelobj_row[r.toString()][item] == null) {\r\n                        curentLevelobj_row[r.toString()][item] = curentLevelarr_row.length - 1;\r\n                    }\r\n\r\n                    curentLevelarr_row = curentLevelarr_row[curentLevelarr_row.length - 1].children;\r\n                }\r\n            }\r\n\r\n            let curentLevelobj_col = datacolposition,\r\n                curentLevelarr_col = datacoltitlegroup;\r\n\r\n            for (let r = 0; r < coltitle.length; r++) {\r\n                let item = coltitle[r],\r\n                    name = r == 0 ? locale_pivotTable.valueSum : coltitlename[r - 1];\r\n\r\n                if (curentLevelobj_col[r.toString()] != null && curentLevelobj_col[r.toString()][item] != null) {\r\n                    curentLevelarr_col = curentLevelarr_col[curentLevelobj_col[r.toString()][item]].children;\r\n                } else {\r\n                    let orderby =\r\n                        r == 0\r\n                            ? \"self\"\r\n                            : column[r - 1].orderby == \"self\" || column[r - 1].orderby == null\r\n                            ? item\r\n                            : showType == \"column\"\r\n                            ? locale_pivotTable.valueSum + item\r\n                            : values[parseInt(column[r - 1].orderby)].fullname + item;\r\n\r\n                    if (name == null) {\r\n                        name = locale_filter.valueBlank;\r\n                    }\r\n\r\n                    curentLevelarr_col.push({ name: name, fullname: item, index: r, orderby: orderby, children: [] });\r\n\r\n                    if (curentLevelobj_col[r.toString()] == null) {\r\n                        curentLevelobj_col[r.toString()] = {};\r\n                    }\r\n\r\n                    if (curentLevelobj_col[r.toString()][item] == null) {\r\n                        curentLevelobj_col[r.toString()][item] = curentLevelarr_col.length - 1;\r\n                    }\r\n\r\n                    curentLevelarr_col = curentLevelarr_col[curentLevelarr_col.length - 1].children;\r\n                }\r\n            }\r\n\r\n            let v_str = \"\";\r\n            for (let v = 0; v < values.length; v++) {\r\n                let d_value = getcellvalue(values[v].index, null, d);\r\n\r\n                let coltitle_c = [].concat(coltitle),\r\n                    rowtitle_c = [].concat(rowtitle);\r\n                if (showType == \"column\") {\r\n                    if (coltitle_c.length > 0) {\r\n                        coltitle_c.push(\"\");\r\n                        coltitle_c = coltitle_c\r\n                            .join(values[v].fullname + \"|||\")\r\n                            .split(\"|||\")\r\n                            .slice(0, coltitle_c.length - 1);\r\n                    } else {\r\n                        coltitle_c.push(values[v].fullname);\r\n                    }\r\n                } else {\r\n                    if (rowtitle_c.length > 0) {\r\n                        rowtitle_c.push(\"\");\r\n                        rowtitle_c = rowtitle_c\r\n                            .join(values[v].fullname + \"|||\")\r\n                            .split(\"|||\")\r\n                            .slice(0, rowtitle_c.length - 1);\r\n                    } else {\r\n                        rowtitle_c.push(values[v].fullname);\r\n                    }\r\n                }\r\n\r\n                if (coltitle_c.length == 0) {\r\n                    coltitle_c.push(\"\");\r\n                }\r\n\r\n                if (rowtitle_c.length == 0) {\r\n                    rowtitle_c.push(\"\");\r\n                }\r\n\r\n                for (let r = 0; r < rowtitle_c.length; r++) {\r\n                    for (let c = 0; c < coltitle_c.length; c++) {\r\n                        let indicator = rowtitle_c[r] + coltitle_c[c];\r\n                        _this.addStatisticsData(dataposition, values[v], indicator, d_value);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        //计算值列\r\n        //SUM/COUNT/COUNTA/COUNTUNIQUE/AVERAGE/MAX/MIN/MEDIAN/PRODUCT/STDEV/STDEVP/let/VARP\r\n        for (let indicator in dataposition) {\r\n            let json = dataposition[indicator];\r\n\r\n            if (json.sumtype == \"SUM\") {\r\n                json.result = json.sum;\r\n            } else if (json.sumtype == \"COUNT\") {\r\n                json.result = json.count;\r\n            } else if (json.sumtype == \"COUNTA\") {\r\n                json.result = json.counta;\r\n            } else if (json.sumtype == \"COUNTUNIQUE\") {\r\n                json.result = json.countunique;\r\n            } else if (json.sumtype == \"AVERAGE\") {\r\n                json.result = numFormat(json.sum / json.count);\r\n            } else if (json.sumtype == \"MAX\") {\r\n                json.result = json.max;\r\n            } else if (json.sumtype == \"MIN\") {\r\n                json.result = json.min;\r\n            } else if (json.sumtype == \"MEDIAN\") {\r\n                let numArr = json.digitaldata.sort(function(a, b) {\r\n                    return a - b;\r\n                });\r\n                let numLen = numArr.length;\r\n                let numindex = parseInt(numLen / 2);\r\n\r\n                if (numLen % 2 == 0) {\r\n                    json.result = (numArr[numindex - 1] + numArr[numindex]) / 2;\r\n                } else {\r\n                    json.result = numArr[numindex];\r\n                }\r\n            } else if (json.sumtype == \"PRODUCT\") {\r\n                json.result = new Function(\"return \" + json.digitaldata.join(\"*\"))();\r\n            } else if (json.sumtype == \"STDEV\") {\r\n                let mean = json.sum / json.count;\r\n                json.result = analysis.STDEV(mean, json.digitaldata);\r\n            } else if (json.sumtype == \"STDEVP\") {\r\n                let mean = json.sum / json.count;\r\n                json.result = analysis.STDEVP(mean, json.digitaldata);\r\n            } else if (json.sumtype == \"let\") {\r\n                let mean = json.sum / json.count;\r\n                json.result = analysis.let(mean, json.digitaldata);\r\n            } else if (json.sumtype == \"VARP\") {\r\n                let mean = json.sum / json.count;\r\n                json.result = analysis.VARP(mean, json.digitaldata);\r\n            }\r\n\r\n            let newAcc = numfloatlen(json.result);\r\n            if (newAcc > json.acc) {\r\n                json.acc = newAcc;\r\n            }\r\n\r\n            json.result = numFormat(json.result, json.acc);\r\n        }\r\n\r\n        datarowtitle = _this.getTitleFromGroup(datarowtitlegroup, row, dataposition);\r\n        datacoltitle = _this.getTitleFromGroup(datacoltitlegroup, column, dataposition);\r\n\r\n        //加入值到列/行形成新的表头\r\n        if (showType == \"column\") {\r\n            if (datacoltitle.length > 0 && datacoltitle[0].length > 0) {\r\n                datacoltitle = _this.addValuesToTitle(datacoltitle, values);\r\n            } else {\r\n                for (let v = 0; v < values.length; v++) {\r\n                    datacoltitle.push([values[v].fullname]);\r\n                }\r\n            }\r\n        } else {\r\n            if (datarowtitle.length > 0 && datarowtitle[0].length > 0) {\r\n                datarowtitle = _this.addValuesToTitle(datarowtitle, values);\r\n            } else {\r\n                for (let v = 0; v < values.length; v++) {\r\n                    datarowtitle.push([values[v].fullname]);\r\n                }\r\n            }\r\n        }\r\n\r\n        let datacoltitle_index = datacoltitle;\r\n        datacoltitle = luckysheetArray.transpose(datacoltitle, false);\r\n\r\n        let valuenslen = values.length == 0 ? 0 : 1;\r\n        let rowLen =\r\n                (datacoltitle.length == 0 ? valuenslen : datacoltitle.length) +\r\n                (datarowtitle.length == 0 ? valuenslen : datarowtitle.length),\r\n            colLen =\r\n                (datacoltitle.length == 0 ? valuenslen : datacoltitle[0].length) +\r\n                (datarowtitle.length == 0 ? valuenslen : datarowtitle[0].length);\r\n\r\n        let rowOver = datacoltitle.length,\r\n            colOver = datarowtitle.length == 0 ? 0 : datarowtitle[0].length;\r\n\r\n        let retdata = [];\r\n        for (let r = 0; r < rowLen; r++) {\r\n            retdata[r] = new Array(colLen);\r\n\r\n            for (let c = 0; c < colLen; c++) {\r\n                let drt = datarowtitle[r - rowOver];\r\n\r\n                if (r < rowOver && c < colOver) {\r\n                    //空白列头\r\n                    retdata[r][c] = \"\";\r\n                } else if (r < rowOver && c >= colOver) {\r\n                    //列标题\r\n                    if (datacoltitle[r] != null) {\r\n                        if (getObjType(datacoltitle[r][c - colOver]) == \"object\") {\r\n                            retdata[r][c] = datacoltitle[r][c - colOver].name + locale_pivotTable.valueSum;\r\n                        } else {\r\n                            retdata[r][c] = datacoltitle[r][c - colOver];\r\n                        }\r\n                    } else {\r\n                        retdata[r][c] = \"\";\r\n                    }\r\n                } else if (r >= rowOver && c < colOver) {\r\n                    //行标题\r\n                    if (drt != null) {\r\n                        if (getObjType(drt[c]) == \"object\") {\r\n                            retdata[r][c] = drt[c].name + locale_pivotTable.valueSum;\r\n                        } else {\r\n                            retdata[r][c] = drt[c];\r\n                        }\r\n                    } else {\r\n                        retdata[r][c] = \"\";\r\n                    }\r\n                } else {\r\n                    //单元格内容\r\n                    let prefix = \"\";\r\n                    if (drt != null) {\r\n                        if (!(drt instanceof Array) || drt.length == 1) {\r\n                            if (drt instanceof Array) {\r\n                                prefix = drt[0];\r\n                            } else {\r\n                                prefix = drt;\r\n                            }\r\n                        } else {\r\n                            for (let x = 0; x < drt.length; x++) {\r\n                                if (getObjType(drt[x]) == \"object\") {\r\n                                    prefix += drt[x].name;\r\n                                } else {\r\n                                    prefix += drt[x];\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    let suffix = \"\";\r\n                    let dct = datacoltitle_index[c - colOver];\r\n                    if (dct != null) {\r\n                        if (!(dct instanceof Array) || dct.length == 1) {\r\n                            if (dct instanceof Array) {\r\n                                suffix = dct[0];\r\n                            } else {\r\n                                suffix = dct;\r\n                            }\r\n                        } else {\r\n                            for (let x = 0; x < dct.length; x++) {\r\n                                if (getObjType(dct[x]) == \"object\") {\r\n                                    suffix += dct[x].name;\r\n                                } else {\r\n                                    suffix += dct[x];\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    let indicator = prefix;\r\n\r\n                    if (prefix != \"\" && suffix != \"\") {\r\n                        indicator = prefix + suffix;\r\n                    } else if (prefix == \"\") {\r\n                        indicator = suffix;\r\n                    }\r\n\r\n                    if (dataposition[indicator] == null) {\r\n                        retdata[r][c] = \"\";\r\n                    } else {\r\n                        retdata[r][c] = dataposition[indicator].result;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        if (values.length == 1 && column.length > 0 && row.length > 0) {\r\n            retdata[0][0] = values[0].fullname;\r\n            retdata.splice(column.length, 1);\r\n        } else if (values.length == 1 && column.length > 0) {\r\n            // 0: (6) [\"English\", \"foreign language\", \"mathematics\", \"science\", \"Sum\", undefined]\r\n            // 1: (6) [\"CountA:score\", \"CountA:score\", \"CountA:score\", \"CountA:score\", \"CountA:score\", undefined]\r\n            // 2: (6) [3, 3, 3, 3, 12, \"\"]\r\n            //The above format does not meet viewing habits,Process retdata into the correct format\r\n            let titleRow = retdata.splice(column.length, 1);\r\n            let newRetdata = [];\r\n            for (let r = 0; r < retdata.length; r++) {\r\n                let row = [];\r\n                if (r == retdata.length - 1) {\r\n                    row.push(titleRow[0][0]);\r\n                } else {\r\n                    row.push(\"\");\r\n                }\r\n                for (let c = 0; c < retdata[r].length - 1; c++) {\r\n                    row.push(retdata[r][c]);\r\n                }\r\n                newRetdata.push(row);\r\n            }\r\n            retdata = newRetdata;\r\n        }\r\n\r\n        _this.pivotDatas = retdata;\r\n\r\n        return retdata;\r\n    },\r\n    drillDown: function(row_index, col_index) {\r\n        if (!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"usePivotTablereports\")) {\r\n            return;\r\n        }\r\n        let _this = this;\r\n\r\n        let cell = _this.pivotDatas[row_index][col_index];\r\n        let d = $.extend(true, [], sheetmanage.nulldata);\r\n\r\n        const _locale = locale();\r\n        const locale_filter = _locale.filter;\r\n        const locale_pivotTable = _locale.pivotTable;\r\n\r\n        let selecteditemNullIndex = 1;\r\n        for (let i = 0; i < _this.celldata[0].length; i++) {\r\n            let name;\r\n            if (!!_this.celldata[0][i] && !!_this.celldata[0][i][\"m\"]) {\r\n                name = _this.celldata[0][i][\"m\"];\r\n            } else {\r\n                name = getcellvalue(0, i, _this.celldata);\r\n            }\r\n\r\n            if (name != null) {\r\n                name = name.toString();\r\n            }\r\n\r\n            if (name == null || $.trim(name.toString()).length == 0) {\r\n                name = locale_pivotTable.titleColumn + \" \" + selecteditemNullIndex;\r\n            }\r\n            selecteditemNullIndex++;\r\n\r\n            d[0][i] = name;\r\n        }\r\n\r\n        let obj = {};\r\n\r\n        //行\r\n        if (_this.row != null && _this.row.length > 0) {\r\n            for (let a = 0; a < _this.row.length; a++) {\r\n                obj[_this.row[a][\"index\"]] = _this.pivotDatas[row_index][a];\r\n            }\r\n        }\r\n\r\n        //列\r\n        if (_this.column != null && _this.column.length > 0) {\r\n            for (let b = 0; b < _this.column.length; b++) {\r\n                obj[_this.column[b][\"index\"]] = _this.pivotDatas[b][col_index];\r\n            }\r\n        }\r\n\r\n        let rowArr = [];\r\n        for (let j = 1; j < _this.celldata.length; j++) {\r\n            let isEqual = true;\r\n\r\n            for (let x in obj) {\r\n                let value;\r\n                if (!!_this.celldata[j][x] && !!_this.celldata[j][x][\"m\"]) {\r\n                    value = _this.celldata[j][x][\"m\"];\r\n                } else {\r\n                    value = getcellvalue(j, x, _this.celldata);\r\n                }\r\n\r\n                if (value != null) {\r\n                    value = value.toString();\r\n                } else {\r\n                    value = locale_filter.valueBlank;\r\n                }\r\n\r\n                if (value != obj[x]) {\r\n                    isEqual = false;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (isEqual) {\r\n                rowArr.push(j);\r\n            }\r\n        }\r\n\r\n        for (let r = 0; r < rowArr.length; r++) {\r\n            for (let c = 0; c < _this.celldata[0].length; c++) {\r\n                let value;\r\n                if (!!_this.celldata[rowArr[r]][c] && !!_this.celldata[rowArr[r]][c][\"m\"]) {\r\n                    value = _this.celldata[rowArr[r]][c][\"m\"];\r\n                } else {\r\n                    value = getcellvalue(rowArr[r], c, _this.celldata);\r\n                }\r\n\r\n                if (value != null) {\r\n                    value = value.toString();\r\n                } else {\r\n                    value = \"\";\r\n                }\r\n\r\n                d[r + 1][c] = value;\r\n            }\r\n        }\r\n\r\n        Store.luckysheet_select_save = [{ row: [0, rowArr.length], column: [0, _this.celldata[0].length - 1] }];\r\n\r\n        Store.clearjfundo = false;\r\n        jfrefreshgrid(d, Store.luckysheet_select_save);\r\n        selectHightlightShow();\r\n        Store.clearjfundo = true;\r\n    },\r\n};\r\n\r\nexport default pivotTable;\r\n"
  },
  {
    "path": "src/controllers/postil.js",
    "content": "import { rowLocation, colLocation, mouseposition } from '../global/location';\r\nimport editor from '../global/editor';\r\nimport formula from '../global/formula';\r\nimport { luckysheetRangeLast } from '../global/cursorPos';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport { setluckysheet_scroll_status } from '../methods/set';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { getObjType } from '../utils/util';\r\nimport luckysheetFreezen from './freezen';\r\nimport menuButton from './menuButton';\r\nimport {checkProtectionAuthorityNormal} from './protection';\r\nimport server from './server';\r\nimport Store from '../store';\r\nimport method from '../global/method';\r\n\r\n//批注\r\nconst luckysheetPostil = {\r\n    defaultWidth: 144,\r\n    defaultHeight: 84,\r\n    currentObj: null,\r\n    currentWinW: null,\r\n    currentWinH: null,\r\n    resize: null,\r\n    resizeXY: null,\r\n    move: false,\r\n    moveXY: null,\r\n    init: function(){\r\n        let _this = this;\r\n\r\n        //点击批注框 聚焦\r\n        $(\"#luckysheet-postil-showBoxs\").off(\"mousedown.showPs\").on(\"mousedown.showPs\", \".luckysheet-postil-show\", function(event){\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n                return;\r\n            }\r\n            \r\n            _this.currentObj = $(this).find(\".luckysheet-postil-show-main\");\r\n\r\n            if($(this).hasClass(\"luckysheet-postil-show-active\")){\r\n                event.stopPropagation();\r\n                return;\r\n            }\r\n\r\n            _this.removeActivePs();\r\n\r\n            $(this).addClass(\"luckysheet-postil-show-active\");\r\n            $(this).find(\".luckysheet-postil-dialog-resize\").show();\r\n            $(this).find(\".arrowCanvas\").css(\"z-index\", 200);\r\n            $(this).find(\".luckysheet-postil-show-main\").css(\"z-index\", 200);\r\n\r\n            event.stopPropagation();\r\n        });\r\n        $(\"#luckysheet-postil-showBoxs\").off(\"mouseup.showPs\").on(\"mouseup.showPs\", \".luckysheet-postil-show\", function(event){\r\n            if(event.which == \"3\"){\r\n                event.stopPropagation();\r\n            }\r\n        });\r\n\r\n        //批注框 改变大小\r\n        $(\"#luckysheet-postil-showBoxs\").off(\"mousedown.resize\").on(\"mousedown.resize\", \".luckysheet-postil-show .luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item\", function(event){\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n                return;\r\n            }\r\n            \r\n            _this.currentObj = $(this).closest(\".luckysheet-postil-show-main\");\r\n            _this.currentWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n            _this.currentWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n\r\n            _this.resize = $(this).data(\"type\");\r\n\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), \r\n                scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let x = mouse[0] + scrollLeft;\r\n            let y = mouse[1] + scrollTop;\r\n\r\n            let position = _this.currentObj.position();\r\n            let width = _this.currentObj.width();\r\n            let height = _this.currentObj.height();\r\n\r\n            _this.resizeXY = [\r\n                x, \r\n                y, \r\n                width, \r\n                height, \r\n                position.left + scrollLeft, \r\n                position.top + scrollTop, \r\n                scrollLeft, \r\n                scrollTop\r\n            ];\r\n\r\n            setluckysheet_scroll_status(true);\r\n\r\n            if($(this).closest(\".luckysheet-postil-show\").hasClass(\"luckysheet-postil-show-active\")){\r\n                event.stopPropagation();\r\n                return;\r\n            }\r\n\r\n            _this.removeActivePs();\r\n\r\n            $(this).closest(\".luckysheet-postil-show\").addClass(\"luckysheet-postil-show-active\");\r\n            $(this).closest(\".luckysheet-postil-show\").find(\".luckysheet-postil-dialog-resize\").show();\r\n            $(this).closest(\".luckysheet-postil-show\").find(\".arrowCanvas\").css(\"z-index\", 200);\r\n            $(this).closest(\".luckysheet-postil-show\").find(\".luckysheet-postil-show-main\").css(\"z-index\", 200);\r\n\r\n            event.stopPropagation();\r\n        });\r\n\r\n        //批注框 移动\r\n        $(\"#luckysheet-postil-showBoxs\").off(\"mousedown.move\").on(\"mousedown.move\", \".luckysheet-postil-show .luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item\", function(event){\r\n            if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\",false)){\r\n                return;\r\n            }\r\n            \r\n            _this.currentObj = $(this).closest(\".luckysheet-postil-show-main\");\r\n            _this.currentWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n            _this.currentWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n\r\n            _this.move = true;\r\n\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(), \r\n                scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n            let offset = _this.currentObj.offset();\r\n            let position = _this.currentObj.position();\r\n\r\n            _this.moveXY = [\r\n                event.pageX - offset.left, \r\n                event.pageY - offset.top, \r\n                position.left, \r\n                position.top, \r\n                scrollLeft, \r\n                scrollTop\r\n            ];\r\n\r\n            setluckysheet_scroll_status(true);\r\n\r\n            if($(this).closest(\".luckysheet-postil-show\").hasClass(\"luckysheet-postil-show-active\")){\r\n                event.stopPropagation();\r\n                return;\r\n            }\r\n\r\n            _this.removeActivePs();\r\n\r\n            $(this).closest(\".luckysheet-postil-show\").addClass(\"luckysheet-postil-show-active\");\r\n            $(this).closest(\".luckysheet-postil-show\").find(\".luckysheet-postil-dialog-resize\").show();\r\n            $(this).closest(\".luckysheet-postil-show\").find(\".arrowCanvas\").css(\"z-index\", 200);\r\n            $(this).closest(\".luckysheet-postil-show\").find(\".luckysheet-postil-show-main\").css(\"z-index\", 200);\r\n\r\n            event.stopPropagation();\r\n        });\r\n    },\r\n    overshow: function(event){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-postil-overshow\").remove();\r\n\r\n        if($(event.target).closest(\"#luckysheet-cell-main\").length == 0){\r\n            return;\r\n        }\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let x = mouse[0];\r\n        let y = mouse[1];\r\n        let offsetX = 0;\r\n        let offsetY = 0;\r\n\r\n        if(luckysheetFreezen.freezenverticaldata != null && mouse[0] < (luckysheetFreezen.freezenverticaldata[0] - luckysheetFreezen.freezenverticaldata[2])){\r\n            offsetX = scrollLeft;\r\n        } else {\r\n            x += scrollLeft;\r\n        }\r\n\r\n        if(luckysheetFreezen.freezenhorizontaldata != null && mouse[1] < (luckysheetFreezen.freezenhorizontaldata[0] - luckysheetFreezen.freezenhorizontaldata[2])){\r\n            offsetY = scrollTop;\r\n        } else {\r\n            y += scrollTop;\r\n        }\r\n\r\n        let row_index = rowLocation(y)[2];\r\n        let col_index = colLocation(x)[2];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index);\r\n        if(!!margeset){\r\n            row_index = margeset.row[2];\r\n            col_index = margeset.column[2];\r\n        }\r\n\r\n        if(Store.flowdata[row_index] == null || Store.flowdata[row_index][col_index] == null || Store.flowdata[row_index][col_index].ps == null){\r\n            return;\r\n        }\r\n\r\n        let postil = Store.flowdata[row_index][col_index].ps;\r\n\r\n        if(postil[\"isshow\"] || $(\"#luckysheet-postil-show_\"+ row_index +\"_\"+ col_index).length > 0){\r\n            return;\r\n        }\r\n\r\n        let value = postil[\"value\"] == null ? \"\" : postil[\"value\"];\r\n\r\n        let row = Store.visibledatarow[row_index], \r\n            row_pre = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1];\r\n        let col = Store.visibledatacolumn[col_index], \r\n            col_pre = col_index - 1 == -1 ? 0 : Store.visibledatacolumn[col_index - 1];\r\n\r\n        if(!!margeset){\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n            \r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n        }\r\n\r\n        let toX = col + offsetX;\r\n        let toY = row_pre + offsetY;\r\n\r\n        let fromX = toX + 18 * Store.zoomRatio;\r\n        let fromY = toY - 18 * Store.zoomRatio;\r\n\r\n        if(fromY < 0){\r\n            fromY = 2;\r\n        }\r\n\r\n        let width = postil[\"width\"] == null ? _this.defaultWidth * Store.zoomRatio : postil[\"width\"] * Store.zoomRatio;\r\n        let height = postil[\"height\"] == null ? _this.defaultHeight * Store.zoomRatio : postil[\"height\"] * Store.zoomRatio;\r\n\r\n        let size = _this.getArrowCanvasSize(fromX, fromY, toX, toY);\r\n\r\n        let commentDivs = '';\r\n        let valueLines = value.split('\\n');\r\n        for (let line of valueLines) {\r\n            commentDivs += '<div>' + _this.htmlEscape(line) + '</div>';\r\n        }\r\n\r\n        let html =  '<div id=\"luckysheet-postil-overshow\">' +\r\n                        '<canvas class=\"arrowCanvas\" width=\"'+ size[2] +'\" height=\"'+ size[3] +'\" style=\"position:absolute;left:'+ size[0] +'px;top:'+ size[1] +'px;z-index:100;pointer-events:none;\"></canvas>' +\r\n                        '<div style=\"width:'+ (width - 12) +'px;min-height:'+ (height - 12) +'px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:'+ fromX +'px;top:'+ fromY +'px;z-index:100;\">'+ commentDivs +'</div>' +\r\n                    '</div>';\r\n\r\n        $(html).appendTo($(\"#luckysheet-cell-main\"));\r\n\r\n        let ctx = $(\"#luckysheet-postil-overshow .arrowCanvas\").get(0).getContext(\"2d\");\r\n\r\n        _this.drawArrow(ctx, size[4], size[5], size[6], size[7]);\r\n    },\r\n    getArrowCanvasSize: function(fromX, fromY, toX, toY){\r\n        let left = toX - 5;\r\n        \r\n        if(fromX < toX){\r\n            left = fromX - 5;\r\n        }\r\n\r\n        let top = toY - 5;\r\n        \r\n        if(fromY < toY){\r\n            top = fromY - 5;\r\n        }\r\n\r\n        let width = Math.abs(fromX - toX) + 10;\r\n        let height = Math.abs(fromY - toY) + 10;\r\n\r\n        let x1 = width - 5;\r\n        let x2 = 5;\r\n        \r\n        if(fromX < toX){\r\n            x1 = 5;\r\n            x2 = width - 5;\r\n        }\r\n\r\n        let y1 = height - 5;\r\n        let y2 = 5;\r\n\r\n        if(fromY < toY){\r\n            y1 = 5;\r\n            y2 = height - 5;\r\n        }\r\n\r\n        return [left, top, width, height, x1, y1, x2, y2];\r\n    },\r\n    drawArrow: function(ctx, fromX, fromY, toX, toY, theta, headlen, width, color){\r\n        theta = getObjType(theta) == \"undefined\" ? 30 : theta;\r\n        headlen = getObjType(headlen) == \"undefined\" ? 6 : headlen;\r\n        width = getObjType(width) == \"undefined\" ? 1 : width;\r\n        color = getObjType(color) == \"undefined\" ? \"#000\" : color;\r\n\r\n        // 计算各角度和对应的P2,P3坐标\r\n        let angle = Math.atan2(fromY - toY, fromX - toX) * 180 / Math.PI, \r\n            angle1 = (angle + theta) * Math.PI / 180, \r\n            angle2 = (angle - theta) * Math.PI / 180, \r\n            topX = headlen * Math.cos(angle1), \r\n            topY = headlen * Math.sin(angle1), \r\n            botX = headlen * Math.cos(angle2), \r\n            botY = headlen * Math.sin(angle2);\r\n\r\n        ctx.save();\r\n        ctx.beginPath();\r\n\r\n        let arrowX = fromX - topX,\r\n            arrowY = fromY - topY;\r\n\r\n        ctx.moveTo(arrowX, arrowY); \r\n        ctx.moveTo(fromX, fromY); \r\n        ctx.lineTo(toX, toY); \r\n        \r\n        ctx.lineWidth = width;\r\n        ctx.strokeStyle = color; \r\n        ctx.stroke();\r\n\r\n        arrowX = toX + topX; \r\n        arrowY = toY + topY; \r\n        ctx.moveTo(arrowX, arrowY); \r\n        ctx.lineTo(toX, toY); \r\n        arrowX = toX + botX; \r\n        arrowY = toY + botY; \r\n        ctx.lineTo(arrowX, arrowY); \r\n        \r\n        ctx.fillStyle = color;\r\n        ctx.fill(); \r\n        ctx.restore();\r\n    },\r\n    buildAllPs: function(data){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\").empty();\r\n\r\n        for(let r = 0; r < data.length; r++){\r\n            for(let c = 0; c < data[0].length; c++){\r\n                if(data[r][c] != null && data[r][c].ps != null){\r\n                    let postil = data[r][c].ps;\r\n                    _this.buildPs(r, c, postil);\r\n                }\r\n            }\r\n        }\r\n\r\n        _this.init();\r\n    },\r\n    buildPs: function(r, c, postil){\r\n        if($(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).length > 0){\r\n            $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).remove();\r\n        }\r\n\r\n        if(postil == null){\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n        let isshow = postil[\"isshow\"] == null ? false : postil[\"isshow\"];\r\n\r\n        if(isshow){\r\n            let row = Store.visibledatarow[r], \r\n                row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n            let col = Store.visibledatacolumn[c], \r\n                col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n            if(!!margeset){\r\n                row = margeset.row[1];\r\n                row_pre = margeset.row[0];\r\n                \r\n                col = margeset.column[1];\r\n                col_pre = margeset.column[0];\r\n            }\r\n\r\n            let toX = col;\r\n            let toY = row_pre;\r\n\r\n            let left = postil[\"left\"] == null ? toX + 18 * Store.zoomRatio : postil[\"left\"] * Store.zoomRatio;\r\n            let top = postil[\"top\"] == null ? toY - 18 * Store.zoomRatio : postil[\"top\"] * Store.zoomRatio;\r\n            let width = postil[\"width\"] == null ? _this.defaultWidth * Store.zoomRatio : postil[\"width\"] * Store.zoomRatio;\r\n            let height = postil[\"height\"] == null ? _this.defaultHeight * Store.zoomRatio : postil[\"height\"] * Store.zoomRatio;\r\n            let value = postil[\"value\"] == null ? \"\" : postil[\"value\"];\r\n\r\n            if(top < 0){\r\n                top = 2;\r\n            }\r\n\r\n            let size = _this.getArrowCanvasSize(left, top, toX, toY);\r\n\r\n            let commentDivs = '';\r\n            let valueLines = value.split('\\n');\r\n            for (let line of valueLines) {\r\n                commentDivs += '<div>' + _this.htmlEscape(line) + '</div>';\r\n            }\r\n\r\n            let html =  '<div id=\"luckysheet-postil-show_'+ r +'_'+ c +'\" class=\"luckysheet-postil-show\">' +\r\n                            '<canvas class=\"arrowCanvas\" width=\"'+ size[2] +'\" height=\"'+ size[3] +'\" style=\"position:absolute;left:'+ size[0] +'px;top:'+ size[1] +'px;z-index:100;pointer-events:none;\"></canvas>' +\r\n                            '<div class=\"luckysheet-postil-show-main\" style=\"width:'+ width +'px;height:'+ height +'px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:'+ left +'px;top:'+ top +'px;box-sizing:border-box;z-index:100;\">' +\r\n                                '<div class=\"luckysheet-postil-dialog-move\">' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t\" data-type=\"t\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r\" data-type=\"r\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b\" data-type=\"b\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l\" data-type=\"l\"></div>' +\r\n                                '</div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize\" style=\"display:none;\">' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt\" data-type=\"lt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt\" data-type=\"mt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm\" data-type=\"lm\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm\" data-type=\"rm\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt\" data-type=\"rt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb\" data-type=\"lb\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb\" data-type=\"mb\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb\" data-type=\"rb\"></div>' +\r\n                                '</div>' +\r\n                                '<div style=\"width:100%;height:100%;overflow:hidden;\">' + \r\n                                    '<div class=\"formulaInputFocus\" style=\"width:'+ (width - 12) +'px;height:'+ (height - 12) +'px;line-height:20px;box-sizing:border-box;text-align: center;;word-break:break-all;\" spellcheck=\"false\" contenteditable=\"true\">' +\r\n                                        commentDivs +\r\n                                    '</div>' +\r\n                                '</div>' +\r\n                            '</div>' +\r\n                        '</div>';\r\n\r\n            $(html).appendTo($(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\"));\r\n\r\n            let ctx = $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .arrowCanvas\").get(0).getContext(\"2d\");\r\n\r\n            _this.drawArrow(ctx, size[4], size[5], size[6], size[7]);\r\n        }\r\n    },\r\n    newPs: function(r, c){\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\")){\r\n            return;\r\n        }\r\n\r\n        // Hook function\r\n        if(!method.createHookFunction('commentInsertBefore',r,c, )){\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        let row = Store.visibledatarow[r], \r\n            row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n        let col = Store.visibledatacolumn[c], \r\n            col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n        if(!!margeset){\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n            \r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n        }\r\n\r\n        let toX = col;\r\n        let toY = row_pre;\r\n\r\n        let fromX = toX + 18 * Store.zoomRatio;\r\n        let fromY = toY - 18 * Store.zoomRatio;\r\n\r\n        if(fromY < 0){\r\n            fromY = 2;\r\n        }\r\n\r\n        let width = _this.defaultWidth * Store.zoomRatio;\r\n        let height = _this.defaultHeight * Store.zoomRatio;\r\n\r\n        let size = _this.getArrowCanvasSize(fromX, fromY, toX, toY);\r\n\r\n        let html =  '<div id=\"luckysheet-postil-show_'+ r +'_'+ c +'\" class=\"luckysheet-postil-show luckysheet-postil-show-active\">' +\r\n                        '<canvas class=\"arrowCanvas\" width=\"'+ size[2] +'\" height=\"'+ size[3] +'\" style=\"position:absolute;left:'+ size[0] +'px;top:'+ size[1] +'px;z-index:100;pointer-events:none;\"></canvas>' +\r\n                        '<div class=\"luckysheet-postil-show-main\" style=\"width:'+ width +'px;height:'+ height +'px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:'+ fromX +'px;top:'+ fromY +'px;box-sizing:border-box;z-index:100;\">' +\r\n                            '<div class=\"luckysheet-postil-dialog-move\">' +\r\n                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t\" data-type=\"t\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r\" data-type=\"r\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b\" data-type=\"b\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l\" data-type=\"l\"></div>' +\r\n                            '</div>' +\r\n                            '<div class=\"luckysheet-postil-dialog-resize\">' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt\" data-type=\"lt\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt\" data-type=\"mt\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm\" data-type=\"lm\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm\" data-type=\"rm\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt\" data-type=\"rt\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb\" data-type=\"lb\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb\" data-type=\"mb\"></div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb\" data-type=\"rb\"></div>' +\r\n                            '</div>' +\r\n                            '<div style=\"width:100%;height:100%;overflow:hidden;\">' + \r\n                                '<div class=\"formulaInputFocus\" style=\"width:132px;height:72px;line-height:20px;box-sizing:border-box;text-align: center;word-break:break-all;\" spellcheck=\"false\" contenteditable=\"true\">' +\r\n                                '</div>' +\r\n                            '</div>' +\r\n                        '</div>' +\r\n                    '</div>';\r\n\r\n        $(html).appendTo($(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\"));\r\n\r\n        let ctx = $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .arrowCanvas\").get(0).getContext(\"2d\");\r\n\r\n        _this.drawArrow(ctx, size[4], size[5], size[6], size[7]);\r\n\r\n        $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .formulaInputFocus\").focus();\r\n\r\n        _this.init();\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let rc = [];\r\n\r\n        if(d[r][c] == null){\r\n            d[r][c] = {};\r\n        }\r\n\r\n        d[r][c].ps = { \"left\": null, \"top\": null, \"width\": null, \"height\": null, \"value\": \"\", \"isshow\": false };\r\n        rc.push(r + \"_\" + c);\r\n\r\n        _this.ref(d, rc);\r\n\r\n        // Hook function\r\n        setTimeout(() => {\r\n            method.createHookFunction('commentInsertAfter',r,c, d[r][c])\r\n        }, 0);\r\n    },\r\n    editPs: function(r, c){\r\n        let _this = this;\r\n\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\")){\r\n            return;\r\n        }\r\n\r\n        if($(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).length > 0){\r\n            $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).show();\r\n            $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).addClass(\"luckysheet-postil-show-active\");\r\n            $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).find(\".luckysheet-postil-dialog-resize\").show();\r\n        }\r\n        else{\r\n            let postil = Store.flowdata[r][c].ps;\r\n\r\n            let row = Store.visibledatarow[r], \r\n                row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n            let col = Store.visibledatacolumn[c], \r\n                col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n            if(!!margeset){\r\n                row = margeset.row[1];\r\n                row_pre = margeset.row[0];\r\n                \r\n                col = margeset.column[1];\r\n                col_pre = margeset.column[0];\r\n            }\r\n\r\n            let toX = col;\r\n            let toY = row_pre;\r\n\r\n            let left = postil[\"left\"] == null ? toX + 18 * Store.zoomRatio : postil[\"left\"] * Store.zoomRatio;\r\n            let top = postil[\"top\"] == null ? toY - 18 * Store.zoomRatio : postil[\"top\"] * Store.zoomRatio;\r\n            let width = postil[\"width\"] == null ? _this.defaultWidth * Store.zoomRatio : postil[\"width\"] * Store.zoomRatio;\r\n            let height = postil[\"height\"] == null ? _this.defaultHeight * Store.zoomRatio : postil[\"height\"] * Store.zoomRatio;\r\n            let value = postil[\"value\"] == null ? \"\" : postil[\"value\"];\r\n\r\n            if(top < 0){\r\n                top = 2;\r\n            }\r\n\r\n            let size = _this.getArrowCanvasSize(left, top, toX, toY);\r\n\r\n            let commentDivs = '';\r\n            let valueLines = value.split('\\n');\r\n            for (let line of valueLines) {\r\n                commentDivs += '<div>' + _this.htmlEscape(line) + '</div>';\r\n            }\r\n\r\n            let html =  '<div id=\"luckysheet-postil-show_'+ r +'_'+ c +'\" class=\"luckysheet-postil-show luckysheet-postil-show-active\">' +\r\n                            '<canvas class=\"arrowCanvas\" width=\"'+ size[2] +'\" height=\"'+ size[3] +'\" style=\"position:absolute;left:'+ size[0] +'px;top:'+ size[1] +'px;z-index:100;pointer-events:none;\"></canvas>' +\r\n                            '<div class=\"luckysheet-postil-show-main\" style=\"width:'+ width +'px;height:'+ height +'px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:'+ left +'px;top:'+ top +'px;box-sizing:border-box;z-index:100;\">' +\r\n                                '<div class=\"luckysheet-postil-dialog-move\">' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t\" data-type=\"t\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r\" data-type=\"r\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b\" data-type=\"b\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l\" data-type=\"l\"></div>' +\r\n                                '</div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize\">' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt\" data-type=\"lt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt\" data-type=\"mt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm\" data-type=\"lm\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm\" data-type=\"rm\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt\" data-type=\"rt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb\" data-type=\"lb\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb\" data-type=\"mb\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb\" data-type=\"rb\"></div>' +\r\n                                '</div>' +\r\n                                '<div style=\"width:100%;height:100%;overflow:hidden;\">' + \r\n                                    '<div class=\"formulaInputFocus\" style=\"width:'+ (width - 12) +'px;height:'+ (height - 12) +'px;line-height:20px;box-sizing:border-box;text-align: center;;word-break:break-all;\" spellcheck=\"false\" contenteditable=\"true\">' +\r\n                                        commentDivs +\r\n                                    '</div>' +\r\n                                '</div>' +\r\n                            '</div>' +\r\n                        '</div>';\r\n\r\n            $(html).appendTo($(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\"));\r\n\r\n            let ctx = $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .arrowCanvas\").get(0).getContext(\"2d\");\r\n\r\n            _this.drawArrow(ctx, size[4], size[5], size[6], size[7]);\r\n        }\r\n\r\n        $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .formulaInputFocus\").focus();\r\n        luckysheetRangeLast($(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .formulaInputFocus\").get(0));\r\n\r\n        _this.init();\r\n    },\r\n    delPs: function(r, c){\r\n        if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"editObjects\")){\r\n            return;\r\n        }\r\n\r\n        // Hook function\r\n        if(!method.createHookFunction('commentDeleteBefore',r,c,Store.flowdata[r][c])){\r\n            return;\r\n        }\r\n\r\n        if($(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).length > 0){\r\n            $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).remove();\r\n        }\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let rc = [];\r\n\r\n        delete d[r][c].ps;\r\n        rc.push(r + \"_\" + c);\r\n\r\n        this.ref(d, rc);\r\n\r\n        // Hook function\r\n        setTimeout(() => {\r\n            method.createHookFunction('commentDeleteAfter',r,c, Store.flowdata[r][c])\r\n        }, 0);\r\n    },\r\n    showHidePs: function(r, c){\r\n        let _this = this;\r\n\r\n        let postil = Store.flowdata[r][c].ps;\r\n        let isshow = postil[\"isshow\"];\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let rc = [];\r\n\r\n        if(isshow){\r\n            d[r][c].ps.isshow = false;\r\n\r\n            $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c).remove();\r\n        }\r\n        else{\r\n            d[r][c].ps.isshow = true;\r\n\r\n            let row = Store.visibledatarow[r], \r\n                row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n            let col = Store.visibledatacolumn[c], \r\n                col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n            if(!!margeset){\r\n                row = margeset.row[1];\r\n                row_pre = margeset.row[0];\r\n                \r\n                col = margeset.column[1];\r\n                col_pre = margeset.column[0];\r\n            }\r\n\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            let toX = col;\r\n            let toY = row_pre;\r\n\r\n            if(luckysheetFreezen.freezenverticaldata != null && toX < (luckysheetFreezen.freezenverticaldata[0] - luckysheetFreezen.freezenverticaldata[2])){\r\n                toX += scrollLeft;\r\n            }\r\n            if(luckysheetFreezen.freezenhorizontaldata != null && toY < (luckysheetFreezen.freezenhorizontaldata[0] - luckysheetFreezen.freezenhorizontaldata[2])){\r\n                toY += scrollTop;\r\n            }\r\n\r\n            let left = postil[\"left\"] == null ? toX + 18 * Store.zoomRatio : postil[\"left\"] * Store.zoomRatio;\r\n            let top = postil[\"top\"] == null ? toY - 18 * Store.zoomRatio : postil[\"top\"] * Store.zoomRatio;\r\n            let width = postil[\"width\"] == null ? _this.defaultWidth * Store.zoomRatio : postil[\"width\"] * Store.zoomRatio;\r\n            let height = postil[\"height\"] == null ? _this.defaultHeight * Store.zoomRatio : postil[\"height\"] * Store.zoomRatio;\r\n            let value = postil[\"value\"] == null ? \"\" : postil[\"value\"];\r\n\r\n            if(top < 0){\r\n                top = 2;\r\n            }\r\n\r\n            let size = _this.getArrowCanvasSize(left, top, toX, toY);\r\n            let commentDivs = '';\r\n            let valueLines = value.split('\\n');\r\n            for (let line of valueLines) {\r\n                commentDivs += '<div>' + _this.htmlEscape(line) + '</div>';\r\n            }\r\n            let html =  '<div id=\"luckysheet-postil-show_'+ r +'_'+ c +'\" class=\"luckysheet-postil-show\">' +\r\n                            '<canvas class=\"arrowCanvas\" width=\"'+ size[2] +'\" height=\"'+ size[3] +'\" style=\"position:absolute;left:'+ size[0] +'px;top:'+ size[1] +'px;z-index:100;pointer-events:none;\"></canvas>' +\r\n                            '<div class=\"luckysheet-postil-show-main\" style=\"width:'+ width +'px;height:'+ height +'px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:'+ left +'px;top:'+ top +'px;box-sizing:border-box;z-index:100;\">' +\r\n                                '<div class=\"luckysheet-postil-dialog-move\">' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t\" data-type=\"t\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r\" data-type=\"r\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b\" data-type=\"b\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l\" data-type=\"l\"></div>' +\r\n                                '</div>' +\r\n                                '<div class=\"luckysheet-postil-dialog-resize\" style=\"display:none;\">' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt\" data-type=\"lt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt\" data-type=\"mt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm\" data-type=\"lm\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm\" data-type=\"rm\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt\" data-type=\"rt\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb\" data-type=\"lb\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb\" data-type=\"mb\"></div>' +\r\n                                    '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb\" data-type=\"rb\"></div>' +\r\n                                '</div>' +\r\n                                '<div style=\"width:100%;height:100%;overflow:hidden;\">' + \r\n                                    '<div class=\"formulaInputFocus\" style=\"width:'+ (width - 12) +'px;height:'+ (height - 12) +'px;line-height:20px;box-sizing:border-box;text-align: center;;word-break:break-all;\" spellcheck=\"false\" contenteditable=\"true\">' +\r\n                                        commentDivs +\r\n                                    '</div>' +\r\n                                '</div>' +\r\n                            '</div>' +\r\n                        '</div>';\r\n\r\n            $(html).appendTo($(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\"));\r\n\r\n            let ctx = $(\"#luckysheet-postil-show_\"+ r +\"_\"+ c +\" .arrowCanvas\").get(0).getContext(\"2d\");\r\n\r\n            _this.drawArrow(ctx, size[4], size[5], size[6], size[7]);\r\n\r\n            _this.init();\r\n        }\r\n\r\n        rc.push(r + \"_\" + c);\r\n\r\n        _this.ref(d, rc);\r\n    },\r\n    showHideAllPs: function(){\r\n        let _this = this;\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n        let isAllShow = true;\r\n        let allPs = [];\r\n\r\n        for(let r = 0; r < d.length; r++){\r\n            for(let c = 0; c < d[0].length; c++){\r\n                if(d[r] != null && d[r][c] != null && d[r][c].ps != null){\r\n                    allPs.push(r + \"_\" + c);\r\n\r\n                    if(!d[r][c].ps.isshow){\r\n                        isAllShow = false;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        let rc = [];\r\n        if(allPs.length > 0){\r\n            if(isAllShow){ //全部显示，操作为隐藏所有批注\r\n                $(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\").empty();\r\n\r\n                for(let i = 0; i < allPs.length; i++){\r\n                    let rowIndex = allPs[i].split(\"_\")[0];\r\n                    let colIndex = allPs[i].split(\"_\")[1];\r\n\r\n                    let postil = d[rowIndex][colIndex].ps;\r\n\r\n                    if(postil[\"isshow\"]){\r\n                        d[rowIndex][colIndex].ps.isshow = false;\r\n                        rc.push(allPs[i]);\r\n                    }\r\n                }\r\n            }\r\n            else{ //部分显示或全部隐藏，操作位显示所有批注\r\n                for(let i = 0; i < allPs.length; i++){\r\n                    let rowIndex = allPs[i].split(\"_\")[0];\r\n                    let colIndex = allPs[i].split(\"_\")[1];\r\n\r\n                    let postil = d[rowIndex][colIndex].ps;\r\n\r\n                    if(!postil[\"isshow\"]){\r\n                        let row = Store.visibledatarow[rowIndex], \r\n                            row_pre = rowIndex - 1 == -1 ? 0 : Store.visibledatarow[rowIndex - 1];\r\n                        let col = Store.visibledatacolumn[colIndex], \r\n                            col_pre = colIndex - 1 == -1 ? 0 : Store.visibledatacolumn[colIndex - 1];\r\n\r\n                        let margeset = menuButton.mergeborer(Store.flowdata, rowIndex, colIndex);\r\n                        if(!!margeset){\r\n                            row = margeset.row[1];\r\n                            row_pre = margeset.row[0];\r\n                            \r\n                            col = margeset.column[1];\r\n                            col_pre = margeset.column[0];\r\n                        }\r\n\r\n                        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n                        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            \r\n                        let toX = col;\r\n                        let toY = row_pre;\r\n            \r\n                        if(luckysheetFreezen.freezenverticaldata != null && toX < (luckysheetFreezen.freezenverticaldata[0] - luckysheetFreezen.freezenverticaldata[2])){\r\n                            toX += scrollLeft;\r\n                        }\r\n                        if(luckysheetFreezen.freezenhorizontaldata != null && toY < (luckysheetFreezen.freezenhorizontaldata[0] - luckysheetFreezen.freezenhorizontaldata[2])){\r\n                            toY += scrollTop;\r\n                        }\r\n\r\n                        let left = postil[\"left\"] == null ? toX + 18 * Store.zoomRatio : postil[\"left\"] * Store.zoomRatio;\r\n                        let top = postil[\"top\"] == null ? toY - 18 * Store.zoomRatio : postil[\"top\"] * Store.zoomRatio;\r\n                        let width = postil[\"width\"] == null ? _this.defaultWidth * Store.zoomRatio : postil[\"width\"] * Store.zoomRatio;\r\n                        let height = postil[\"height\"] == null ? _this.defaultHeight * Store.zoomRatio : postil[\"height\"] * Store.zoomRatio;\r\n                        let value = postil[\"value\"] == null ? \"\" : postil[\"value\"];\r\n\r\n                        if(top < 0){\r\n                            top = 2;\r\n                        }\r\n\r\n                        let size = _this.getArrowCanvasSize(left, top, toX, toY);\r\n\r\n                        let commentDivs = '';\r\n                        let valueLines = value.split('\\n');\r\n                        for (let line of valueLines) {\r\n                            commentDivs += '<div>' + _this.htmlEscape(line) + '</div>';\r\n                        }\r\n\r\n                        let html =  '<div id=\"luckysheet-postil-show_'+ rowIndex +'_'+ colIndex +'\" class=\"luckysheet-postil-show\">' +\r\n                                        '<canvas class=\"arrowCanvas\" width=\"'+ size[2] +'\" height=\"'+ size[3] +'\" style=\"position:absolute;left:'+ size[0] +'px;top:'+ size[1] +'px;z-index:100;pointer-events:none;\"></canvas>' +\r\n                                        '<div class=\"luckysheet-postil-show-main\" style=\"width:'+ width +'px;height:'+ height +'px;color:#000;padding:5px;border:1px solid #000;background-color:rgb(255,255,225);position:absolute;left:'+ left +'px;top:'+ top +'px;box-sizing:border-box;z-index:100;\">' +\r\n                                            '<div class=\"luckysheet-postil-dialog-move\">' +\r\n                                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-t\" data-type=\"t\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-r\" data-type=\"r\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-b\" data-type=\"b\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-move-item luckysheet-postil-dialog-move-item-l\" data-type=\"l\"></div>' +\r\n                                            '</div>' +\r\n                                            '<div class=\"luckysheet-postil-dialog-resize\" style=\"display:none;\">' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lt\" data-type=\"lt\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mt\" data-type=\"mt\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lm\" data-type=\"lm\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rm\" data-type=\"rm\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rt\" data-type=\"rt\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-lb\" data-type=\"lb\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-mb\" data-type=\"mb\"></div>' +\r\n                                                '<div class=\"luckysheet-postil-dialog-resize-item luckysheet-postil-dialog-resize-item-rb\" data-type=\"rb\"></div>' +\r\n                                            '</div>' +\r\n                                            '<div style=\"width:100%;height:100%;overflow:hidden;\">' + \r\n                                                '<div class=\"formulaInputFocus\" style=\"width:'+ (width - 12) +'px;height:'+ (height - 12) +'px;line-height:20px;box-sizing:border-box;text-align: center;;word-break:break-all;\" spellcheck=\"false\" contenteditable=\"true\">' +\r\n                                                    commentDivs +\r\n                                                '</div>' +\r\n                                            '</div>' +\r\n                                        '</div>' +\r\n                                    '</div>';\r\n\r\n                        $(html).appendTo($(\"#luckysheet-cell-main #luckysheet-postil-showBoxs\"));\r\n\r\n                        let ctx = $(\"#luckysheet-postil-show_\"+ rowIndex +\"_\"+ colIndex +\" .arrowCanvas\").get(0).getContext(\"2d\");\r\n\r\n                        _this.drawArrow(ctx, size[4], size[5], size[6], size[7]);\r\n\r\n                        d[rowIndex][colIndex].ps.isshow = true;\r\n                        rc.push(allPs[i]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        _this.ref(d, rc);\r\n        _this.init();\r\n    },\r\n    removeActivePs: function(){\r\n        if($(\"#luckysheet-postil-showBoxs .luckysheet-postil-show-active\").length > 0){\r\n            \r\n\r\n            let id = $(\"#luckysheet-postil-showBoxs .luckysheet-postil-show-active\").attr(\"id\");\r\n            let r = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n            let c = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n            // interpret <div> as new line\r\n            let value = $(\"#\" + id).find(\".formulaInputFocus\").html().replaceAll('<div>', '\\n').replaceAll(/<(.*)>.*?|<(.*) \\/>/g, '').trim();\r\n            // Hook function\r\n            if(!method.createHookFunction('commentUpdateBefore',r,c,value)){\r\n                if (!Store.flowdata[r][c].ps.isshow) {\r\n                    $(\"#\" + id).remove();\r\n                }\r\n                return;\r\n            }\r\n\r\n            const previousCell = $.extend(true,{},Store.flowdata[r][c]);\r\n\r\n            $(\"#\" + id).removeClass(\"luckysheet-postil-show-active\");\r\n            $(\"#\" + id).find(\".luckysheet-postil-dialog-resize\").hide();\r\n            $(\"#\" + id).find(\".arrowCanvas\").css(\"z-index\", 100);\r\n            $(\"#\" + id).find(\".luckysheet-postil-show-main\").css(\"z-index\", 100);\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n            let rc = [];\r\n\r\n            d[r][c].ps.value = value;\r\n            rc.push(r + \"_\" + c);\r\n\r\n            this.ref(d, rc);\r\n\r\n            if(!d[r][c].ps.isshow){\r\n                $(\"#\" + id).remove();\r\n            }\r\n            // Hook function\r\n            setTimeout(() => {\r\n                method.createHookFunction('commentUpdateAfter',r,c, previousCell, d[r][c])\r\n            }, 0);\r\n        }\r\n    },\r\n    ref: function(data, rc){\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n            \r\n            Store.jfredo.push({ \r\n                \"type\": \"postil\", \r\n                \"data\": Store.flowdata, \r\n                \"curdata\": data, \r\n                \"sheetIndex\": Store.currentSheetIndex,\r\n                \"rc\": rc \r\n            });\r\n        }\r\n\r\n        //flowdata\r\n        Store.flowdata = data;\r\n        editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = Store.flowdata;\r\n        // formula.execFunctionGroupData = Store.flowdata;\r\n\r\n        //共享编辑模式\r\n        if(server.allowUpdate){\r\n            for(let i = 0; i < rc.length; i++){\r\n                let r = rc[i].split(\"_\")[0];\r\n                let c = rc[i].split(\"_\")[1];\r\n\r\n                server.saveParam(\"v\", Store.currentSheetIndex, Store.flowdata[r][c], { \"r\": r, \"c\": c });\r\n            }\r\n        }\r\n        \r\n        //刷新表格\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    },\r\n    positionSync: function(){\r\n        let _this = this;\r\n\r\n        $(\"#luckysheet-postil-showBoxs .luckysheet-postil-show\").each(function(i, e){\r\n            let id = $(e).attr(\"id\");\r\n\r\n            let r = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[0];\r\n            let c = id.split(\"luckysheet-postil-show_\")[1].split(\"_\")[1];\r\n\r\n            let cell = Store.flowdata[r][c];\r\n            \r\n            if(cell != null && cell.ps != null){\r\n                _this.buildPs(r, c, cell.ps);\r\n            }\r\n            else{\r\n                $(\"#\" + id).hide();\r\n            }\r\n        });\r\n    },\r\n    htmlEscape: function(text){\r\n        return text.replace(/[<>\"&]/g, function(match, pos, originalText){\r\n            console.log(match, pos, originalText)\r\n            switch(match){\r\n                case '<': {\r\n                    return '&lt';\r\n                }\r\n                case '>': {\r\n                    return '&gt';\r\n                }\r\n                case '&': {\r\n                    return '&amp';\r\n                }\r\n                case '\\\"': {\r\n                    return '&quot;';\r\n                }\r\n            }\r\n        })\r\n    }\r\n}\r\n\r\nexport default luckysheetPostil;"
  },
  {
    "path": "src/controllers/protection.js",
    "content": "import Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport { modelHTML } from './constant';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { setluckysheet_scroll_status } from '../methods/set';\r\nimport sheetmanage from './sheetmanage';\r\nimport luckysheetsizeauto from './resize';\r\nimport dataVerificationCtrl from './dataVerificationCtrl';\r\nimport { replaceHtml,transformRangeToAbsolute,openSelfModel } from '../utils/util';\r\nimport { selectionCopyShow } from './select';\r\nimport tooltip from '../global/tooltip';\r\nimport cleargridelement from '../global/cleargridelement';\r\n\r\nlet isInitialProtection = false, isInitialProtectionAddRang = false, rangeItemListCache=[], isAddRangeItemState=true, updateRangeItemIndex = null, validationAuthority=null, updatingSheetFile=null, firstInputSheetProtectionPassword = true;\r\nlet sqrefMapCache = {}, inputRangeProtectionPassword = {}, initialRangePasswordHtml=false;\r\n\r\nconst authorityItemArr = [\r\n    \"selectLockedCells\",\r\n    \"selectunLockedCells\",\r\n    \"formatCells\",\r\n    \"formatColumns\",\r\n    \"formatRows\",\r\n    \"insertColumns\",\r\n    \"insertRows\",\r\n    \"insertHyperlinks\",\r\n    \"deleteColumns\",\r\n    \"deleteRows\",\r\n    \"sort\",\r\n    \"filter\",\r\n    \"usePivotTablereports\",\r\n    \"editObjects\",\r\n    \"editScenarios\"\r\n]\r\n\r\nfunction addRangeItem(item){\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n    const locale_button = _locale.button;\r\n\r\n    let title = item.name, sqref = item.sqref, password = item.password;\r\n    \r\n    let passwordTxt = \"\";\r\n    if(password!=null && password.length>0){\r\n        passwordTxt = '<i class=\"icon iconfont-luckysheet luckysheet-iconfont-bianji2\" title=\"'+ local_protection.rangeItemHasPassword+'\"></i>';\r\n    }\r\n\r\n    let rangeItemTemplate = `\r\n        <div class=\"luckysheet-protection-rangeItem\" title=\"${local_protection.rangeItemDblclick}\">\r\n            <div class=\"luckysheet-protection-rangeItem-del\" title=\"${locale_button.delete}\">\r\n                <i class=\"icon iconfont-luckysheet luckysheet-iconfont-shanchu\"></i>\r\n            </div>\r\n            <div class=\"luckysheet-protection-rangeItem-name\" title=\"${title}\">\r\n                ${title}${passwordTxt}\r\n            </div>\r\n            <div class=\"luckysheet-protection-rangeItem-range\" title=\"${sqref}\">\r\n                ${sqref}\r\n            </div>\r\n            <div class=\"luckysheet-protection-rangeItem-update\" title=\"${locale_button.update}\">\r\n                <i class=\"icon iconfont-luckysheet luckysheet-iconfont-bianji\"></i>\r\n            </div>\r\n        </div>\r\n    `;\r\n\r\n    $(\"#luckysheet-protection-rangeItem-container\").append(rangeItemTemplate);\r\n}\r\n\r\nexport function initialEvent(file){\r\n\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n    const locale_button = _locale.button;\r\n\r\n    //confirm protection\r\n    $(\"#luckysheet-slider-protection-ok\").unbind(\"click\").click(function () {\r\n        let password = $(\"#protection-password\").val();\r\n        let sheet = $(\"#protection-swichProtectionState\").is(\":checked\");\r\n        let hint = $(\"#protection-hint\").val();\r\n\r\n        let file = updatingSheetFile, aut = {};\r\n\r\n        if(file!=null && file.config!=null && file.config.authority!=null){\r\n            aut = file.config.authority;\r\n        }        \r\n        \r\n        let authorityData = {\r\n\r\n        }\r\n\r\n        let algorithmName = \"None\";\r\n        if(password!=\"••••••••\"){\r\n            authorityData.password = password;\r\n            authorityData.algorithmName = \"None\";\r\n            authorityData.saltValue = null;\r\n        }\r\n        else if(aut!=null){\r\n            authorityData.algorithmName = aut.algorithmName;\r\n            authorityData.saltValue = aut.saltValue;\r\n            authorityData.password = aut.password;\r\n        }\r\n        else {\r\n            authorityData.algorithmName = \"None\";\r\n            authorityData.saltValue = null;\r\n            authorityData.password = \"\";\r\n        }\r\n\r\n        authorityData.hintText = hint;\r\n\r\n        authorityData.sheet = sheet==true?1:0;\r\n\r\n        for(let i=0;i<authorityItemArr.length;i++){\r\n            let name = authorityItemArr[i];\r\n            let checkId = \"luckysheet-protection-check-\" + name;\r\n            let authorityValue =  $(\"#\"+checkId).is(':checked');\r\n            \r\n            authorityData[name] = authorityValue==true?1:0;\r\n        }\r\n\r\n        let allowRangeListTemp = JSON.parse(JSON.stringify(rangeItemListCache));\r\n        authorityData.allowRangeList = allowRangeListTemp;\r\n\r\n        rangeItemListCache = [];\r\n        firstInputSheetProtectionPassword = true;\r\n\r\n        if(file.config==null){\r\n            file.config = {};\r\n        }\r\n\r\n        file.config.authority = authorityData;\r\n\r\n        inputRangeProtectionPassword = {};\r\n\r\n        closeProtectionModal();\r\n\r\n    });\r\n\r\n    //cancel protection\r\n    $(\"#luckysheet-slider-protection-cancel, #luckysheet-modal-dialog-protection-close\").click(function(){\r\n        closeProtectionModal();\r\n    });\r\n\r\n    //Add allow edit range\r\n    $(\"#luckysheet-slider-protection-addRange\").click(function(){\r\n        initialProtectionRangeModal();\r\n        isAddRangeItemState = true;\r\n        $(\"#luckysheet-protection-rangeItem-confirm\").html(locale_button.insert);\r\n\r\n        openSelfModel(\"luckysheet-protection-rangeItem-dialog\");\r\n\r\n        $(\"#protection-allowRangeAdd-title\").val(\"Default\"+rangeItemListCache.length);\r\n        $(\"#protection-allowRangeAdd-range input\").val(\"\");\r\n        $(\"#protection-allowRangeAdd-password\").val(\"\");\r\n        $(\"#protection-allowRangeAdd-hint\").val(\"\");\r\n\r\n    });\r\n\r\n    //update allow edit range\r\n    $(document).off(\"click.luckysheetProtection.rangeItemUpdate\").on(\"click.luckysheetProtection.rangeItemUpdate\",\"#luckysheet-protection-rangeItem-container .luckysheet-protection-rangeItem-update\", function(e){\r\n        initialProtectionRangeModal();\r\n\r\n        isAddRangeItemState = false;\r\n        $(\"#luckysheet-protection-rangeItem-confirm\").html(locale_button.update);\r\n\r\n        openSelfModel(\"luckysheet-protection-rangeItem-dialog\");\r\n\r\n        let $rangeItem = $(e.target).closest(\".luckysheet-protection-rangeItem\");\r\n\r\n        let $rangeItemContainer =  $(\"#luckysheet-protection-rangeItem-container\");\r\n\r\n        let index = $rangeItemContainer.find(\"> div.luckysheet-protection-rangeItem\").index($rangeItem);\r\n\r\n        let item = rangeItemListCache[index];\r\n\r\n        updateRangeItemIndex = index;\r\n\r\n        $(\"#protection-allowRangeAdd-title\").val(item.name);\r\n        $(\"#protection-allowRangeAdd-range input\").val(item.sqref);\r\n        if(item.algorithmName==\"None\"){\r\n            $(\"#protection-allowRangeAdd-password\").val(item.password);\r\n        }\r\n        else{\r\n            $(\"#protection-allowRangeAdd-password\").val(\"••••••••\");\r\n        }\r\n        $(\"#protection-allowRangeAdd-hint\").val(item.hintText);\r\n    });\r\n\r\n    //delete allow edit range\r\n    $(document).off(\"click.luckysheetProtection.rangeItemDelete\").on(\"click.luckysheetProtection.rangeItemDelete\",\"#luckysheet-protection-rangeItem-container .luckysheet-protection-rangeItem-del\", function(e){\r\n        let $rangeItem = $(e.target).closest(\".luckysheet-protection-rangeItem\");\r\n\r\n        let $rangeItemContainer =  $(\"#luckysheet-protection-rangeItem-container\");\r\n\r\n        let index = $rangeItemContainer.find(\"> div.luckysheet-protection-rangeItem\").index($rangeItem);\r\n\r\n        let item = rangeItemListCache[index];\r\n\r\n        rangeItemListCache.splice(index, 1);\r\n        $rangeItem.remove();\r\n    });\r\n\r\n    //confirm allow edit range\r\n    $(document).off(\"click.luckysheetProtection.rangeItemConfirm\").on(\"click.luckysheetProtection.rangeItemConfirm\",\"#luckysheet-protection-rangeItem-confirm\", function(){\r\n        let name = $(\"#protection-allowRangeAdd-title\").val(),\r\n        rangeText = $(\"#protection-allowRangeAdd-range input\").val(),\r\n        password = $(\"#protection-allowRangeAdd-password\").val(),\r\n        hint = $(\"#protection-allowRangeAdd-hint\").val();\r\n\r\n        if(name.length==0){\r\n            alert(local_protection.rangeItemErrorTitleNull);\r\n            return;\r\n        }\r\n\r\n        let range = dataVerificationCtrl.getRangeByTxt(rangeText);\r\n\r\n        if(rangeText.length==0){\r\n            alert(local_protection.rangeItemErrorRangeNull);\r\n            return;\r\n        }\r\n\r\n        if(range.length==0){\r\n            alert(local_protection.rangeItemErrorRange);\r\n            return;\r\n        }\r\n\r\n        rangeText = transformRangeToAbsolute(rangeText);\r\n\r\n\r\n        if(isAddRangeItemState){\r\n            let item = {\r\n                name:name,\r\n                password:password,\r\n                hintText:hint,\r\n                algorithmName:\"None\",//MD2,MD4,MD5,RIPEMD-128,RIPEMD-160,SHA-1,SHA-256,SHA-384,SHA-512,WHIRLPOOL\r\n                saltValue:null,\r\n                checkRangePasswordUrl:null,\r\n                sqref:rangeText\r\n            }\r\n\r\n            addRangeItem(item);\r\n            rangeItemListCache.push(item);\r\n        }\r\n        else{\r\n            let index = updateRangeItemIndex;\r\n            let item = rangeItemListCache[index];\r\n\r\n            item.name = name;\r\n            item.sqref = rangeText;\r\n            item.hintText = hint;\r\n\r\n            if(password!=\"••••••••\"){\r\n                item.password = password;\r\n                item.algorithmName = \"None\";\r\n            }\r\n\r\n            let $rangeItemContainer =  $(\"#luckysheet-protection-rangeItem-container\");\r\n\r\n            let $rangeitem = $rangeItemContainer.find(\"> div.luckysheet-protection-rangeItem\").eq(index);\r\n\r\n            let $name = $rangeitem.find(\".luckysheet-protection-rangeItem-name\");\r\n\r\n            let passwordTxt = \"\";\r\n            if(password!=null && password.length>0){\r\n                passwordTxt = '<i class=\"icon iconfont-luckysheet luckysheet-iconfont-bianji2\" title=\"'+ local_protection.rangeItemHasPassword+'\"></i>';\r\n            }\r\n\r\n            $name.html(name+passwordTxt).attr(\"title\",name);\r\n\r\n            let $range = $rangeitem.find(\".luckysheet-protection-rangeItem-range\");\r\n\r\n            $range.html(rangeText).attr(\"title\",rangeText);\r\n        }\r\n\r\n\r\n\r\n        $(\"#luckysheet-protection-rangeItem-dialog\").hide();\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n\r\n    });\r\n\r\n\r\n    //sheet validation check passWord\r\n    $(document).off(\"click.luckysheetProtection.validationConfirm\").on(\"click.luckysheetProtection.validationConfirm\",\"#luckysheet-protection-sheet-validation-confirm\", function(e){\r\n        let $validation = $(\"#luckysheet-protection-sheet-validation\");\r\n        let aut = validationAuthority;\r\n\r\n        if(aut==null){\r\n            restoreProtectionConfig(validationAuthority);\r\n            $validation.hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-protection\").show();\r\n            luckysheetsizeauto();\r\n            return;\r\n        }\r\n        \r\n        let $input = $validation.find(\"input\");\r\n        let password = $input.val();\r\n\r\n\r\n        if(password==null || password.length==0){\r\n            alert(local_protection.checkPasswordNullalert);\r\n            return;\r\n        }\r\n\r\n        if(aut.algorithmName!=null && aut.algorithmName!=\"None\"){\r\n            if(aut.saltValue!=null && aut.saltValue.length>0){\r\n                var hasher = CryptoApi.getHasher(aut.algorithmName);\r\n                password =CryptoApi.hmac(aut.saltValue, password, hasher);\r\n            }\r\n            else{\r\n                password = CryptoApi.hash(aut.algorithmName, password);\r\n            }\r\n        }\r\n\r\n        if(password==aut.password){\r\n            restoreProtectionConfig(validationAuthority);\r\n            $validation.hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-protection\").show();\r\n            luckysheetsizeauto();\r\n            firstInputSheetProtectionPassword = false;\r\n        }\r\n        else{\r\n            alert(local_protection.checkPasswordWrongalert);\r\n        }\r\n        \r\n    });\r\n\r\n    $(\"#luckysheet-protection-check-selectLockedCells\").change(function() { \r\n        let $selectLockedCells = $(\"#luckysheet-protection-check-selectLockedCells\"), $selectunLockedCells = $(\"#luckysheet-protection-check-selectunLockedCells\");\r\n\r\n        let selectLockedCellsChecked = $selectLockedCells.is(\":checked\"), selectunLockedCellsChecked = $selectunLockedCells.is(\":checked\");\r\n\r\n        if(selectLockedCellsChecked){\r\n            $selectunLockedCells.prop('checked', true);\r\n        }\r\n    });\r\n\r\n    $(\"#luckysheet-protection-check-selectunLockedCells\").change(function() { \r\n        let $selectLockedCells = $(\"#luckysheet-protection-check-selectLockedCells\"), $selectunLockedCells = $(\"#luckysheet-protection-check-selectunLockedCells\");\r\n\r\n        let selectLockedCellsChecked = $selectLockedCells.is(\":checked\"), selectunLockedCellsChecked = $selectunLockedCells.is(\":checked\");\r\n\r\n        if(!selectunLockedCellsChecked){\r\n            $selectLockedCells.prop('checked', false);\r\n        }\r\n    });\r\n\r\n\r\n    //Cell range select controll\r\n    $(document).off(\"click.luckysheetProtection.dvRange\").on(\"click.luckysheetProtection.dvRange\", \"#protection-allowRangeAdd-range .fa-table\", function(e) {\r\n        $(\"#luckysheet-protection-rangeItem-dialog\").hide();\r\n\r\n        let dataSource = \"0\";\r\n        let txt = $(this).siblings(\"input\").val().trim(); \r\n\r\n        dataVerificationCtrl.rangeDialog(dataSource, txt);\r\n\r\n        dataVerificationCtrl.selectRange = [];\r\n\r\n        let range = dataVerificationCtrl.getRangeByTxt(txt);\r\n        if(range.length > 0){\r\n            for(let s = 0; s < range.length; s++){\r\n                let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                let row = Store.visibledatarow[r2], \r\n                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                let col = Store.visibledatacolumn[c2], \r\n                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                dataVerificationCtrl.selectRange.push({ \r\n                    \"left\": col_pre, \r\n                    \"width\": col - col_pre - 1, \r\n                    \"top\": row_pre, \r\n                    \"height\": row - row_pre - 1, \r\n                    \"left_move\": col_pre, \r\n                    \"width_move\": col - col_pre - 1, \r\n                    \"top_move\": row_pre, \r\n                    \"height_move\": row - row_pre - 1, \r\n                    \"row\": [r1, r2], \r\n                    \"column\": [c1, c2], \r\n                    \"row_focus\": r1, \r\n                    \"column_focus\": c1 \r\n                });\r\n            }\r\n        }\r\n        \r\n        selectionCopyShow(dataVerificationCtrl.selectRange);\r\n    }); \r\n    $(document).off(\"click.luckysheetProtection.dvRange2\").on(\"click.luckysheetProtection.dvRange2\", \"#luckysheet-protection-rangeItem-dialog .show-box-item-dropdown .range .fa-table\", function(e) {\r\n        $(\"#luckysheet-protection-rangeItem-dialog\").hide();\r\n\r\n        let dataSource = \"1\";\r\n        let txt = $(this).siblings(\"input\").val().trim(); \r\n\r\n        dataVerificationCtrl.rangeDialog(dataSource, txt);\r\n\r\n        dataVerificationCtrl.selectRange = [];\r\n\r\n        let range = dataVerificationCtrl.getRangeByTxt(txt);\r\n        if(range.length > 0){\r\n            for(let s = 0; s < range.length; s++){\r\n                let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                let row = Store.visibledatarow[r2], \r\n                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n                let col = Store.visibledatacolumn[c2], \r\n                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n                    dataVerificationCtrl.selectRange.push({ \r\n                    \"left\": col_pre, \r\n                    \"width\": col - col_pre - 1, \r\n                    \"top\": row_pre, \r\n                    \"height\": row - row_pre - 1, \r\n                    \"left_move\": col_pre, \r\n                    \"width_move\": col - col_pre - 1, \r\n                    \"top_move\": row_pre, \r\n                    \"height_move\": row - row_pre - 1, \r\n                    \"row\": [r1, r2], \r\n                    \"column\": [c1, c2], \r\n                    \"row_focus\": r1, \r\n                    \"column_focus\": c1 \r\n                });\r\n            }\r\n        }\r\n        \r\n        selectionCopyShow(dataVerificationCtrl.selectRange);\r\n    });\r\n    $(document).off(\"click.luckysheetProtection.dvRangeConfirm\").on(\"click.luckysheetProtection.dvRangeConfirm\", \"#luckysheet-dataVerificationRange-dialog-confirm\", function(e) {\r\n        let txt = $(this).parents(\"#luckysheet-dataVerificationRange-dialog\").find(\"input\").val();\r\n\r\n        let $input = $(\"#protection-allowRangeAdd-range input\"), inputValue = $input.val();\r\n        if(inputValue.substr(inputValue.length-1, 1)==\",\"){\r\n            $input.val(inputValue + txt);\r\n        }\r\n        else{\r\n            $input.val(txt);\r\n        }\r\n        $(\"#luckysheet-dataVerificationRange-dialog\").hide();\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-protection-rangeItem-dialog\").show();\r\n\r\n        let range = [];\r\n        selectionCopyShow(range);\r\n    });\r\n    $(document).off(\"click.luckysheetProtection.dvRangeClose\").on(\"click.dvRangeClose\", \"#luckysheet-dataVerificationRange-dialog-close\", function(e) {\r\n        $(\"#luckysheet-dataVerificationRange-dialog\").hide();\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-protection-rangeItem-dialog\").show();\r\n\r\n        let range = [];\r\n        selectionCopyShow(range);\r\n    });\r\n    $(document).on(\"click.luckysheetProtection.luckysheetProtection\", \"#luckysheet-dataVerificationRange-dialog .luckysheet-modal-dialog-title-close\", function(e) {\r\n        $(\"#luckysheet-dataVerificationRange-dialog\").hide();\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-protection-rangeItem-dialog\").show();\r\n\r\n        let range = [];\r\n        selectionCopyShow(range);\r\n    });\r\n}\r\n\r\n//protect range config\r\nfunction initialProtectionRangeModal(file){\r\n    if(isInitialProtectionAddRang){\r\n        return;\r\n    }\r\n    isInitialProtectionAddRang = true;\r\n    let _locale = locale();\r\n    let local_protection = _locale.protection;\r\n    const locale_button = _locale.button;\r\n    $(\"body\").append(replaceHtml(modelHTML, { \r\n        \"id\": \"luckysheet-protection-rangeItem-dialog\", \r\n        \"addclass\": \"luckysheet-protection-rangeItem-dialog\", \r\n        \"title\": local_protection.allowRangeTitle, \r\n        \"content\": `\r\n            <div class=\"luckysheet-protection-rangeItem-content\">\r\n                <div class=\"luckysheet-slider-protection-row\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-3x\">\r\n                        ${local_protection.allowRangeAddTitle}\r\n                    </div>\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-7x\" style=\"left:30%\">\r\n                        <input class=\"luckysheet-protection-rangeItemiInput\" id=\"protection-allowRangeAdd-title\"  placeHolder=\"${local_protection.allowRangeAddtitleDefault}\">\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-row\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-3x\">\r\n                        ${local_protection.allowRangeAddSqrf}\r\n                    </div>\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-7x\" style=\"left:30%\">\r\n                        <div id=\"protection-allowRangeAdd-range\" class=\"range\">\r\n                            <input class=\"formulaInputFocus\" spellcheck=\"false\" placeHolder=\"${local_protection.selectCellRangeHolder}\">\r\n                            <i class=\"fa fa-table\" aria-hidden=\"true\" title=\"${local_protection.selectCellRange}\"></i>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-row\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-3x\">\r\n                        ${local_protection.allowRangeAddTitlePassword}\r\n                    </div>\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-7x\" style=\"left:30%\">\r\n                        <input class=\"luckysheet-protection-rangeItemiInput\" id=\"protection-allowRangeAdd-password\"  placeHolder=\"${local_protection.enterPassword}\">\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-row\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-3x\">\r\n                        ${local_protection.allowRangeAddTitleHint}\r\n                    </div>\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-7x\" style=\"left:30%\">\r\n                        <textarea class=\"luckysheet-protection-rangeItemTextarea\" id=\"protection-allowRangeAdd-hint\"  placeHolder=\"${local_protection.allowRangeAddTitleHintTitle}\"></textarea>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        `, \r\n        \"botton\":  `<button id=\"luckysheet-protection-rangeItem-confirm\" class=\"btn btn-primary\">${locale_button.insert}</button>\r\n                    <button class=\"btn btn-default luckysheet-model-close-btn\">${locale_button.cancel}</button>`, \r\n        \"style\": \"z-index:100003\" \r\n    }));\r\n}\r\n\r\n\r\n//Protect sheet initial\r\nfunction initialProtectionRIghtBar(file){\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n    const locale_button = _locale.button;\r\n\r\n    let authorityItemHtml = \"\";\r\n    for(let i=0;i<authorityItemArr.length;i++){\r\n        let name = authorityItemArr[i];\r\n\r\n        authorityItemHtml += `\r\n            <div class=\"luckysheet-slider-protection-row\" style=\"height:18px;\">\r\n                <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-10x\">\r\n                <label for=\"luckysheet-protection-check-${name}\"><input id=\"luckysheet-protection-check-${name}\" name=\"luckysheet-protection-check-${name}\" type=\"checkbox\">${local_protection[name]}</label>\r\n                </div>\r\n            </div>\r\n        `;\r\n    }\r\n\r\n    const protectionModalHtml = `\r\n    <div id=\"luckysheet-modal-dialog-slider-protection\" class=\"luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-pivot\" style=\"display:none;\">\r\n        <div class=\"luckysheet-modal-dialog-slider-title\"> <span>${local_protection.protectiontTitle}</span> <span id=\"luckysheet-modal-dialog-protection-close\" title=\"${locale_button.close}\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></span> </div>\r\n        <div class=\"luckysheet-modal-dialog-slider-content\">\r\n            <div class=\"luckysheet-slider-protection-config\" style=\"top:10px;height:115px\">\r\n                <div class=\"luckysheet-slider-protection-row\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-10x\">\r\n                    <label for=\"protection-swichProtectionState\"><input id=\"protection-swichProtectionState\" name=\"protection-swichProtectionState\" type=\"checkbox\">${local_protection.swichProtectionTip}</label>\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-row\" style=\"height:23px;\">\r\n                    <div class=\"luckysheet-slider-protection-column\" style=\"width:98%;\">\r\n                        <input class=\"luckysheet-protection-input\" id=\"protection-password\"  placeHolder=\"${local_protection.enterPassword}\">\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-row\" style=\"height:47px;margin-top:4px;\">\r\n                    <div class=\"luckysheet-slider-protection-column\" style=\"width:98%;\">\r\n                        <textarea class=\"luckysheet-protection-textarea\" id=\"protection-hint\"  placeHolder=\"${local_protection.enterHint}\"></textarea>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n            <div class=\"luckysheet-slider-protection-config\" style=\"top:130px;height:290px;border-top:1px solid #c5c5c5\">\r\n                <div class=\"luckysheet-slider-protection-row\" style=\"height:20px;\">\r\n                    ${local_protection.authorityTitle}\r\n                </div>\r\n                ${authorityItemHtml}\r\n            </div>\r\n            <div class=\"luckysheet-slider-protection-config\" style=\"top:440px;bottom:45px;border-top:1px solid #c5c5c5\">\r\n                <div class=\"luckysheet-slider-protection-row\" style=\"height:25px;\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-7x\" style=\"left:0px;line-height: 25px;\">\r\n                        ${local_protection.allowRangeTitle}\r\n                    </div>\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-3x\" style=\"left:70%;\">\r\n                        <div class=\"luckysheet-slider-protection-ok luckysheet-slider-protection-addRange\" id=\"luckysheet-slider-protection-addRange\">\r\n                            ${local_protection.allowRangeAdd}\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n\r\n                <div id=\"luckysheet-protection-rangeItem-container\" class=\"luckysheet-slider-protection-row\" style=\"top:25px;bottom:0px;position:absolute\">\r\n                   \r\n                </div>\r\n            </div>\r\n            <div class=\"luckysheet-slider-protection-config\" style=\"bottom:0px;height:45px\">\r\n                <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-5x\" style=\"left:0px;\">\r\n                    <div class=\"luckysheet-slider-protection-ok\" id=\"luckysheet-slider-protection-ok\">\r\n                        ${locale_button.confirm}\r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-5x\" style=\"left:50%;\">\r\n                    <div class=\"luckysheet-slider-protection-cancel\" id=\"luckysheet-slider-protection-cancel\">\r\n                        ${locale_button.cancel}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    `;\r\n\r\n    $(\"body\").append(protectionModalHtml);\r\n\r\n\r\n    //Password input initial for sheet Protection\r\n    $(\"body\").append(replaceHtml(modelHTML, { \r\n        \"id\": \"luckysheet-protection-sheet-validation\", \r\n        \"addclass\": \"luckysheet-protection-sheet-validation\", \r\n        \"title\": local_protection.validationTitle, \r\n        \"content\": `\r\n            <div class=\"luckysheet-slider-protection-row\">\r\n                <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-10x\">\r\n                    ${local_protection.validationTips}\r\n                </div>\r\n            </div>\r\n            <div class=\"luckysheet-slider-protection-row\" style=\"margin-top:20px\">\r\n                <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-10x\">\r\n                    <input type=\"password\" class=\"luckysheet-protection-rangeItemiInput\" placeHolder=\"${local_protection.validationInputHint}\">\r\n                </div>\r\n            </div>\r\n        `, \r\n        \"botton\":  `<button id=\"luckysheet-protection-sheet-validation-confirm\" class=\"btn btn-primary\">${locale_button.confirm}</button>\r\n                    <button class=\"btn btn-default luckysheet-model-close-btn\">${locale_button.cancel}</button>`, \r\n        \"style\": \"z-index:100003\" \r\n    }));\r\n\r\n}\r\n\r\n\r\nfunction restoreProtectionConfig(aut){\r\n    if(aut==null){\r\n        aut = {};\r\n    }\r\n    for(let i=0;i<authorityItemArr.length;i++){\r\n        let name = authorityItemArr[i];\r\n        let checkId = \"luckysheet-protection-check-\" + name;\r\n        let authorityValue = aut[name];\r\n        if(authorityValue==null){\r\n            authorityValue = 0;\r\n        }\r\n\r\n        if(authorityValue==null && name in {selectLockedCells:1, selectunLockedCells:1}){\r\n            authorityValue = 1;\r\n        }\r\n\r\n        $(\"#\"+checkId).prop('checked',authorityValue==1?true:false);\r\n    }\r\n\r\n    if(aut.password!=null && aut.password.length>0){\r\n        if(aut.algorithmName==\"None\" || aut.algorithmName==null){\r\n            $(\"#protection-password\").val(aut.password);\r\n        }\r\n        else{\r\n            $(\"#protection-password\").val(\"••••••••\");\r\n        }\r\n    }\r\n    else{\r\n        $(\"#protection-password\").val(\"\");\r\n    }\r\n\r\n    let sheet = aut.sheet;\r\n    if(aut.sheet==null){\r\n        sheet = 0;\r\n    }\r\n    $(\"#protection-swichProtectionState\").prop('checked',sheet==1?true:false);\r\n\r\n    let hintText = aut.hintText;\r\n    if(hintText==null){\r\n        hintText = \"\";\r\n    }\r\n    $(\"#protection-hint\").val(hintText);\r\n\r\n\r\n    rangeItemListCache = [];\r\n    $(\"#luckysheet-protection-rangeItem-container\").empty();\r\n    let allowRangeList = aut.allowRangeList;\r\n    if(allowRangeList!=null && allowRangeList.length>0){\r\n        for(let i=0;i<allowRangeList.length;i++){\r\n            let item = allowRangeList[i];\r\n            addRangeItem(item);\r\n            rangeItemListCache.push(item);\r\n        }\r\n    }\r\n\r\n}\r\n\r\nexport function openProtectionModal(file){\r\n    if(!isInitialProtection){\r\n        initialProtectionRIghtBar(file);\r\n        initialEvent(file);\r\n        isInitialProtection = true;\r\n    }\r\n\r\n    updatingSheetFile = file;\r\n\r\n\r\n    if(file!=null && file.config!=null && file.config.authority!=null){\r\n        let aut = file.config.authority;\r\n        if(firstInputSheetProtectionPassword && aut.sheet==1 && aut.password!=null && aut.password.length>0){\r\n            validationAuthority = aut;\r\n            $(\"#luckysheet-protection-sheet-validation input\").val(\"\");\r\n            openSelfModel(\"luckysheet-protection-sheet-validation\");\r\n            return;\r\n        }\r\n        else{//retore protection config\r\n            restoreProtectionConfig(aut);\r\n        }\r\n    }\r\n    else{//protection initial config //没有设置可编辑区域\r\n        //默认全选\r\n        $(\"#protection-swichProtectionState\").prop('checked', true);//保护工作表及其单元格\r\n        $(\"#luckysheet-protection-check-selectLockedCells\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-selectunLockedCells\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-formatCells\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-formatColumns\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-formatRows\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-insertColumns\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-insertRows\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-deleteColumns\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-insertHyperlinks\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-deleteRows\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-sort\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-filter\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-usePivotTablereports\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-editObjects\").prop('checked', true);\r\n        $(\"#luckysheet-protection-check-editScenarios\").prop('checked', true);\r\n        //设置允许用户编辑区域的区域的数据为空，并将缓存区置空。\r\n        clearProtectionModalEditContent();\r\n    }\r\n\r\n    $(\"#luckysheet-modal-dialog-slider-protection\").show();\r\n    luckysheetsizeauto();\r\n\r\n}\r\nexport function clearProtectionModalEditContent() {\r\n    //清除用户可编辑区域的内容\r\n    rangeItemListCache = [];\r\n    $(\"#luckysheet-protection-rangeItem-container\").empty();\r\n}\r\nexport function closeProtectionModal(){\r\n    $(\"#luckysheet-protection-rangeItem-dialog\").hide();\r\n    $(\"#luckysheet-modal-dialog-slider-protection\").hide();\r\n    luckysheetsizeauto();\r\n}\r\n\r\n\r\n\r\n\r\nfunction checkProtectionLockedSqref(r, c, aut, local_protection, isOpenAlert=true, isLock=true){\r\n    let isPass = false;\r\n    let rangeAut = aut.allowRangeList;\r\n    if(rangeAut!=null && rangeAut.length>0){\r\n        let isExists = false;\r\n        for(let i=0;i<rangeAut.length;i++){\r\n            let ra = rangeAut[i];\r\n            let sqref = ra.sqref;\r\n            let range = dataVerificationCtrl.getRangeByTxt(sqref);\r\n\r\n            if(range.length > 0){\r\n                for(let s = 0; s < range.length; s++){\r\n                    let r1 = range[s].row[0], r2 = range[s].row[1];\r\n                    let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n                    if(r>=r1 && r<=r2 && c>=c1 && c<=c2){\r\n                        isExists = true;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(isExists){\r\n\r\n                let password = ra.password;\r\n                if(password!=null && password.length>0  && !(sqref in inputRangeProtectionPassword)){\r\n                    if(isOpenAlert){\r\n                        openRangePasswordModal(ra);\r\n                        $(\"#luckysheet-selection-copy .luckysheet-selection-copy\").hide();\r\n                    }\r\n                    return false;\r\n                }\r\n                else{\r\n                    isPass = true;\r\n                }\r\n\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    if (!isPass && !isLock) isPass = true\r\n    if(!isPass && isOpenAlert){\r\n        let ht;\r\n        if(aut.hintText != null && aut.hintText.length>0){\r\n            ht = aut.hintText;\r\n        }\r\n        else{\r\n            ht = local_protection.defaultSheetHintText;\r\n        }\r\n        tooltip.info(\"\", ht);\r\n        $(\"#luckysheet-selection-copy .luckysheet-selection-copy\").hide();\r\n    }\r\n    \r\n    return isPass;\r\n}\r\n\r\n\r\nfunction openRangePasswordModal(rangeAut) {\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n    const locale_button = _locale.button;\r\n    \r\n    if(!initialRangePasswordHtml){\r\n        //Password input initial for range\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-protection-range-validation\", \r\n            \"addclass\": \"luckysheet-protection-sheet-validation\", \r\n            \"title\": local_protection.validationTitle, \r\n            \"content\": `\r\n                <div class=\"luckysheet-slider-protection-row\">\r\n                    <div id=\"luckysheet-protection-range-validation-hint\" class=\"luckysheet-slider-protection-column luckysheet-protection-column-10x\">\r\n                        \r\n                    </div>\r\n                </div>\r\n                <div class=\"luckysheet-slider-protection-row\" style=\"margin-top:20px\">\r\n                    <div class=\"luckysheet-slider-protection-column luckysheet-protection-column-10x\">\r\n                        <input type=\"password\" class=\"luckysheet-protection-rangeItemiInput\" placeHolder=\"${local_protection.validationInputHint}\">\r\n                    </div>\r\n                </div>\r\n            `, \r\n            \"botton\":  `<button id=\"luckysheet-protection-range-validation-confirm\" class=\"btn btn-primary\">${locale_button.confirm}</button>\r\n                        <button class=\"btn btn-default luckysheet-model-close-btn\">${locale_button.cancel}</button>`, \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n    }\r\n\r\n    initialRangePasswordHtml = true;\r\n\r\n\r\n    \r\n    openSelfModel(\"luckysheet-protection-range-validation\");\r\n\r\n    let $hint = $(\"#luckysheet-protection-range-validation-hint\");\r\n    if(rangeAut.hintText != null && rangeAut.hintText.length>0){\r\n        $hint.html(rangeAut.hintText);\r\n    }\r\n    else{\r\n        $hint.html(local_protection.defaultRangeHintText);\r\n    }\r\n    let $rangeV = $(\"#luckysheet-protection-range-validation\");\r\n    let $input = $rangeV.find(\"input\");\r\n    $input.val(\"\");\r\n\r\n    $(\"#luckysheet-protection-range-validation-confirm\").off(\"click\").on(\"click\", function(){\r\n        let password = $input.val();\r\n\r\n        if(password==null || password.length==0){\r\n            alert(local_protection.checkPasswordNullalert);\r\n            return;\r\n        }\r\n\r\n        if(rangeAut.algorithmName!=null && rangeAut.algorithmName!=\"None\"){\r\n            // password = CryptoApi.hash(rangeAut.algorithmName, password);\r\n            if(rangeAut.saltValue!=null && rangeAut.saltValue.length>0){\r\n                var hasher = CryptoApi.getHasher(rangeAut.algorithmName);\r\n                password =CryptoApi.hmac(rangeAut.saltValue, password, hasher);\r\n            }\r\n            else{\r\n                password = CryptoApi.hash(rangeAut.algorithmName, password);\r\n            }\r\n        }\r\n\r\n        if(password==rangeAut.password){\r\n            inputRangeProtectionPassword[rangeAut.sqref] = 1;\r\n            $rangeV.hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            alert(local_protection.checkPasswordSucceedalert);\r\n        }\r\n        else{\r\n            alert(local_protection.checkPasswordWrongalert);\r\n        }\r\n\r\n    });\r\n    \r\n}\r\n\r\n//protection state\r\nexport function checkProtectionNotEnable(sheetIndex){\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n\r\n    let ht;\r\n    if(aut.hintText != null && aut.hintText.length>0){\r\n        ht = aut.hintText;\r\n    }\r\n    else{\r\n        ht = local_protection.defaultSheetHintText;\r\n    }\r\n    tooltip.info(\"\", ht);\r\n\r\n    return false;\r\n}\r\n\r\n//cell locked state\r\nexport function checkProtectionLocked(r, c, sheetIndex, isOpenAlert=true, isLock=true){\r\n\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let data=sheetFile.data, cell=data[r][c], aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    if(cell && cell.lo === 0){ // lo为0的时候才是可编辑\r\n        return true;\r\n    }\r\n\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n\r\n    return checkProtectionLockedSqref(r, c , aut, local_protection, isOpenAlert, isLock);\r\n}\r\n\r\n//cell hidden state\r\nexport function checkProtectionCellHidden(r, c, sheetIndex){\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(!sheetFile || (sheetFile.data && !sheetFile.data[r]) || (sheetFile.data && !sheetFile.data[r][c])){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let data=sheetFile.data, cell=data[r][c], aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    if(cell==null || cell.hi==null || cell.hi==0){\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n//cell range locked state\r\nexport function checkProtectionLockedRangeList(rangeList, sheetIndex){\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    if(rangeList==null || rangeList.length==0){\r\n        return true;\r\n    }\r\n\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n\r\n    for(let s = 0; s < rangeList.length; s++){\r\n        let r1 = rangeList[s].row[0], r2 = rangeList[s].row[1];\r\n        let c1 = rangeList[s].column[0], c2 = rangeList[s].column[1];\r\n\r\n        for(let r=r1;r<=r2;r++){\r\n            for(let c=c1;c<=c2;c++){\r\n                const cell = sheetFile.data[r][c] || {}\r\n                let isLock = cell.lo === undefined || cell.lo === 1, // 单元格是否锁定\r\n                    isPass = checkProtectionLockedSqref(r, c , aut, local_protection, true, isLock);\r\n                if(!isPass){\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n//selectLockedCells  , selectunLockedCells  and cell state\r\nexport function checkProtectionSelectLockedOrUnLockedCells(r, c, sheetIndex){\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let data=sheetFile.data, cell=data[r][c], aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    if(cell && cell.lo === 0){ // lo为0的时候才是可编辑\r\n        if(aut.selectunLockedCells==1 || aut.selectunLockedCells==null){\r\n            return true;\r\n        }\r\n        else{\r\n            return false;\r\n        }\r\n    }\r\n    else{//locked??\r\n        let isAllEdit = checkProtectionLockedSqref(r, c , aut, local_protection, false);//dont alert password model\r\n        if(isAllEdit){//unlocked\r\n            if(aut.selectunLockedCells==1 || aut.selectunLockedCells==null){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        else{//locked\r\n            if(aut.selectLockedCells==1 || aut.selectLockedCells==null){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n\r\n    \r\n}\r\n\r\n\r\n\r\n//selectLockedCells or selectunLockedCells authority, highlight cell \r\nexport function checkProtectionAllSelected(sheetIndex){\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    let selectunLockedCells = false;\r\n    if(aut.selectunLockedCells==1 || aut.selectunLockedCells==null){\r\n        selectunLockedCells = true;\r\n    }\r\n\r\n    let selectLockedCells = false;\r\n    if(aut.selectLockedCells==1 || aut.selectLockedCells==null){\r\n        selectLockedCells = true;\r\n    }\r\n\r\n    if(selectunLockedCells && selectLockedCells){\r\n        return true;\r\n    }\r\n\r\n    return false;\r\n}\r\n\r\n//formatCells authority, bl cl fc fz ff ct  border etc.\r\nexport function checkProtectionFormatCells(sheetIndex){\r\n\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    if(aut.formatCells==1 || aut.formatCells==null){\r\n        return true;\r\n    }\r\n\r\n    const _locale = locale();\r\n    const local_protection = _locale.protection;\r\n\r\n    let ht;\r\n    if(aut.hintText != null && aut.hintText.length>0){\r\n        ht = aut.hintText;\r\n    }\r\n    else{\r\n        ht = local_protection.defaultSheetHintText;\r\n    }\r\n    tooltip.info(\"\", ht);\r\n\r\n    return false;\r\n}\r\n\r\n//formatColumns authority: controll column hidden and width\r\n//formatRows authority: controll row hidden and height\r\n//insertColumns authority\r\n//insertRows authority\r\n//insertHyperlinks authority:Hyperlinks is not incomplete\r\n//deleteColumns authority\r\n//deleteRows authority\r\n//sort authority\r\n//filter authority\r\n//usePivotTablereports authority\r\n//editObjects authority: insert,delete,update for image, chart, comment,shape etc. \r\n//editScenarios authority: Scenarios features is uncompleted\r\n\r\nexport function checkProtectionAuthorityNormal(sheetIndex, type=\"formatColumns\", isAlert=true){\r\n\r\n    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex);\r\n    if(sheetFile==null){\r\n        return true;\r\n    }\r\n\r\n    if(sheetFile.config==null || sheetFile.config.authority==null){\r\n        return true;\r\n    }\r\n\r\n    let aut = sheetFile.config.authority;\r\n\r\n    if(aut==null || aut.sheet==null || aut.sheet==0 ){\r\n        return true;\r\n    }\r\n\r\n    if(aut[type]==1 || aut[type]==null){\r\n        return true;\r\n    }\r\n\r\n    if(isAlert){\r\n        const _locale = locale();\r\n        const local_protection = _locale.protection;\r\n        \r\n        let ht;\r\n        if(aut.hintText != null && aut.hintText.length>0){\r\n            ht = aut.hintText;\r\n        }\r\n        else{\r\n            ht = local_protection.defaultSheetHintText;\r\n        }\r\n        tooltip.info(\"\", ht);\r\n    }\r\n\r\n    return false;\r\n}\r\n"
  },
  {
    "path": "src/controllers/resize.js",
    "content": "import luckysheetConfigsetting from './luckysheetConfigsetting';\r\nimport luckysheetFreezen from './freezen';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport sheetmanage from './sheetmanage';\r\nimport tooltip from '../global/tooltip'\r\nimport { $$, getObjType, camel2split } from \"../utils/util\";\r\nimport { defaultToolbar, toolbarIdMap } from './toolbar';\r\n\r\nlet gridW = 0,\r\n    gridH = 0;\r\n\r\nexport default function luckysheetsizeauto(isRefreshCanvas=true) {\r\n    if (!luckysheetConfigsetting.showinfobar) {\r\n        Store.infobarHeight = 0;\r\n        $(\"#luckysheet_info_detail\").hide();\r\n    }\r\n    else {\r\n        $(\"#luckysheet_info_detail\").show();\r\n        // Store.infobarHeight = 56;\r\n        Store.infobarHeight = document.querySelector('#luckysheet_info_detail').offsetHeight;\r\n    }\r\n\r\n    if (!!Store.toobarObject && !!Store.toobarObject.toobarElements && Store.toobarObject.toobarElements.length === 0) {\r\n        $(\"#\" + Store.container).find(\".luckysheet-wa-editor\").hide();\r\n        Store.toolbarHeight = 0;\r\n    }\r\n    else {\r\n        $(\"#\" + Store.container).find(\".luckysheet-wa-editor\").show();\r\n        // Store.toolbarHeight = 72;\r\n        Store.toolbarHeight = document.querySelector('#' + Store.container +' .luckysheet-wa-editor').offsetHeight;\r\n    }\r\n\r\n    // if (!luckysheetConfigsetting.showsheetbar) {\r\n    //     $(\"#\" + Store.container).find(\"#luckysheet-sheet-area\").hide();\r\n    //     Store.sheetBarHeight = 0;\r\n    // }\r\n    // else {\r\n    //     $(\"#\" + Store.container).find(\"#luckysheet-sheet-area\").show();\r\n    //     Store.sheetBarHeight = 31;\r\n    // }\r\n\r\n\r\n    customSheetbarConfig();\r\n\r\n    // if (!luckysheetConfigsetting.showstatisticBar) {\r\n    //     $(\"#\" + Store.container).find(\".luckysheet-stat-area\").hide();\r\n    //     Store.statisticBarHeight = 0;\r\n    // }\r\n    // else {\r\n    //     $(\"#\" + Store.container).find(\".luckysheet-stat-area\").show();\r\n    //     Store.statisticBarHeight = 23;\r\n    // }\r\n\r\n    customStatisticBarConfig();\r\n\r\n    // 公式栏\r\n    const formulaEle = document.querySelector(\"#\" + Store.container + ' .luckysheet-wa-calculate');\r\n    if (!luckysheetConfigsetting.sheetFormulaBar) {\r\n        formulaEle.style.display = 'none';\r\n        Store.calculatebarHeight = 0;\r\n    }\r\n    else {\r\n        formulaEle.style.display = 'block';\r\n        Store.calculatebarHeight = formulaEle.offsetHeight;\r\n    }\r\n\r\n    $(\"#\" + Store.container).find(\".luckysheet-grid-container\").css(\"top\", Store.toolbarHeight + Store.infobarHeight + Store.calculatebarHeight);\r\n\r\n    gridW = $(\"#\" + Store.container).width();\r\n\r\n    if(luckysheetConfigsetting.showConfigWindowResize){//数据透视表  图表  交替颜色 Protection\r\n        if($(\"#luckysheet-modal-dialog-slider-pivot\").is(\":visible\")){\r\n            gridW -= $(\"#luckysheet-modal-dialog-slider-pivot\").outerWidth();\r\n        }\r\n        else if($(\".chartSetting\").is(\":visible\")){\r\n            gridW -= $(\".chartSetting\").outerWidth();\r\n        }\r\n        else if($(\"#luckysheet-modal-dialog-slider-alternateformat\").is(\":visible\")){\r\n            gridW -= $(\"#luckysheet-modal-dialog-slider-alternateformat\").outerWidth();\r\n        }\r\n        if($(\"#luckysheet-modal-dialog-slider-protection\").is(\":visible\")){\r\n            gridW -= $(\"#luckysheet-modal-dialog-slider-protection\").outerWidth();\r\n        }\r\n    }\r\n\r\n    const _locale = locale();\r\n    const locale_toolbar = _locale.toolbar;\r\n    let ismore = false,\r\n        toolbarW = 0,\r\n        morebtn = `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${locale_toolbar.toolMoreTip}\" id=\"luckysheet-icon-morebtn\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\" style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\" style=\"user-select: none;\">\r\n\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\" style=\"user-select: none;\">\r\n                        ${locale_toolbar.toolMore}\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\" style=\"user-select: none;font-size:12px;\">\r\n                    </div>\r\n\r\n                </div>\r\n            </div>\r\n         </div>`,\r\n         // Add style left:$$('.luckysheet') left, when the worksheet does not fill the full screen\r\n        morediv = '<div id=\"luckysheet-icon-morebtn-div\" class=\"luckysheet-wa-editor\" style=\"position:absolute;top:'+ (Store.infobarHeight + Store.toolbarHeight + $(\"#\" + Store.container).offset().top + $(\"body\").scrollTop()) +'px;right:0px;z-index:1003;padding:5.5px;visibility:hidden;height:auto;white-space:initial;\"></div>';\r\n\r\n    if($(\"#luckysheet-icon-morebtn-div\").length == 0){\r\n        $(\"body\").append(morediv);\r\n    }\r\n\r\n    // $(\"#luckysheet-icon-morebtn-div\").hide();\r\n    $$(\"#luckysheet-icon-morebtn-div\").style.visibility = 'hidden';\r\n    // $(\"#luckysheet-icon-morebtn-div > div\").appendTo($(\"#luckysheet-wa-editor\"));\r\n\r\n    $(\"#luckysheet-icon-morebtn-div > div\").each(function(){\r\n        const $t = $(this)[0];\r\n        const $container =  $(\"#luckysheet-wa-editor\")[0];\r\n\r\n        $container.appendChild(document.createTextNode(\" \"));\r\n\r\n        $container.appendChild($t);\r\n    });\r\n\r\n    $(\"#luckysheet-icon-morebtn\").remove();\r\n\r\n    // 所有按钮宽度与元素定位\r\n    const toobarWidths = Store.toobarObject.toobarWidths;\r\n    const toobarElements = Store.toobarObject.toobarElements;\r\n    let moreButtonIndex = 0;\r\n\r\n    // When you resize the window during initialization, you will find that the dom has not been rendered yet\r\n    if(toobarWidths == undefined){\r\n        return;\r\n    }\r\n    // 找到应该隐藏的起始元素位置\r\n    for (let index = toobarWidths.length - 1; index >= 0; index--) {\r\n\r\n        // #luckysheet-icon-morebtn button width plus right is 83px\r\n        if(toobarWidths[index] < gridW - 90){\r\n            moreButtonIndex = index;\r\n            if(moreButtonIndex < toobarWidths.length - 1){\r\n\r\n                ismore = true;\r\n            }\r\n            break;\r\n        }\r\n    }\r\n    // 从起始位置开始，后面的元素统一挪到下方隐藏DIV中\r\n    for (let index = moreButtonIndex; index < toobarElements.length; index++) {\r\n        const element = toobarElements[index];\r\n        if(element instanceof Array){\r\n            for(const ele of element){\r\n                $(\"#luckysheet-icon-morebtn-div\").append($(`${ele}`));\r\n            }\r\n        }else{\r\n            $(\"#luckysheet-icon-morebtn-div\").append($(`${element}`));\r\n        }\r\n\r\n    }\r\n\r\n    if(ismore){\r\n\r\n        $(\"#luckysheet-wa-editor\").append(morebtn);\r\n        $(\"#luckysheet-icon-morebtn\").click(function(){\r\n\r\n            //When resize, change the width of the more button container in real time\r\n            $$('#luckysheet-icon-morebtn-div').style.left = '';//reset\r\n\r\n            // *这里计算containerLeft的作用是：获得容器左侧的margin值，以让点击出现的“更多按钮”栏位置不会出错。\r\n            const containerLeft = $$(`#${Store.container}`).getBoundingClientRect ? $$(`#${Store.container}`).getBoundingClientRect().left : 0;\r\n            const morebtnLeft = $$('#luckysheet-icon-morebtn-div').getBoundingClientRect().left;//get real left info\r\n\r\n            if(morebtnLeft < containerLeft){\r\n                $$('#luckysheet-icon-morebtn-div').style.left = containerLeft + 'px';\r\n            }\r\n\r\n            let right = $(window).width() - $(\"#luckysheet-icon-morebtn\").offset().left - $(\"#luckysheet-icon-morebtn\").width()+ $(\"body\").scrollLeft();\r\n\r\n\r\n            // $(\"#luckysheet-icon-morebtn-div\").toggle().css(\"right\", right < 0 ? 0 : right);\r\n\r\n            // use native js operation\r\n            $$('#luckysheet-icon-morebtn-div').style.right = right < 0 ? 0 : right + 'px';\r\n\r\n            // change to visibility,morebtnLeft will get the actual value\r\n            if($$('#luckysheet-icon-morebtn-div').style.visibility === 'hidden'){\r\n                $$('#luckysheet-icon-morebtn-div').style.visibility = 'visible';\r\n            }else{\r\n                $$('#luckysheet-icon-morebtn-div').style.visibility = 'hidden';\r\n            }\r\n\r\n            let $txt = $(this).find(\".luckysheet-toolbar-menu-button-caption\");\r\n            if($txt.text().indexOf(locale_toolbar.toolMore) > -1){\r\n\r\n                const toolCloseHTML = `\r\n                <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\" style=\"user-select: none;\">\r\n                    ${locale_toolbar.toolClose}\r\n                </div>\r\n                <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-shangyige\" style=\"user-select: none;font-size:12px;\">\r\n                </div>\r\n                `\r\n                $(this).find(\".luckysheet-toolbar-button-inner-box\").html(toolCloseHTML);\r\n            }\r\n            else{\r\n\r\n                const toolMoreHTML = `\r\n                <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\" style=\"user-select: none;\">\r\n                    ${locale_toolbar.toolMore}\r\n                </div>\r\n                <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\" style=\"user-select: none;font-size:12px;\">\r\n                </div>\r\n                `\r\n\r\n                $(this).find(\".luckysheet-toolbar-button-inner-box\").html(toolMoreHTML);\r\n            }\r\n\r\n        });\r\n        //$(\"#luckysheet-wa-editor div\").trigger(\"create\");\r\n\r\n        // $(\"#luckysheet-icon-morebtn-div .luckysheet-toolbar-menu-button\").css(\"margin-right\", -1);\r\n        // $(\"#luckysheet-icon-morebtn-div .luckysheet-toolbar-button-split-left\").css(\"margin-right\", -3);\r\n\r\n        // “更多”容器中，联动hover效果\r\n        $(\"#luckysheet-icon-morebtn-div .luckysheet-toolbar-button-split-left\").off(\"hover\").hover(function(){\r\n            $(this).next(\".luckysheet-toolbar-button-split-right\").addClass(\"luckysheet-toolbar-button-split-right-hover\");\r\n        }, function(){\r\n            $(this).next(\".luckysheet-toolbar-button-split-right\").removeClass(\"luckysheet-toolbar-button-split-right-hover\");\r\n        });\r\n\r\n        $(\"#luckysheet-icon-morebtn-div .luckysheet-toolbar-button-split-right\").off(\"hover\").hover(function(){\r\n            $(this).prev(\".luckysheet-toolbar-button-split-left\").addClass(\"luckysheet-toolbar-button-hover\");\r\n        }, function(){\r\n            $(this).prev(\".luckysheet-toolbar-button-split-left\").removeClass(\"luckysheet-toolbar-button-hover\");\r\n        });\r\n\r\n        // tooltip\r\n        tooltip.createHoverTip(\"#luckysheet-icon-morebtn-div\" ,\".luckysheet-toolbar-menu-button, .luckysheet-toolbar-button, .luckysheet-toolbar-combo-button\");\r\n    }\r\n\r\n    $(\"#\"+ Store.container + \" .luckysheet-wa-editor .luckysheet-toolbar-button-split-left\").off(\"hover\").hover(function(){\r\n        $(this).next(\".luckysheet-toolbar-button-split-right\").addClass(\"luckysheet-toolbar-button-split-right-hover\");\r\n    }, function(){\r\n        $(this).next(\".luckysheet-toolbar-button-split-right\").removeClass(\"luckysheet-toolbar-button-split-right-hover\");\r\n    });\r\n\r\n    $(\"#\"+ Store.container + \" .luckysheet-wa-editor .luckysheet-toolbar-button-split-right\").off(\"hover\").hover(function(){\r\n        $(this).prev(\".luckysheet-toolbar-button-split-left\").addClass(\"luckysheet-toolbar-button-hover\");\r\n    }, function(){\r\n        $(this).prev(\".luckysheet-toolbar-button-split-left\").removeClass(\"luckysheet-toolbar-button-hover\");\r\n    });\r\n\r\n    // When adding elements to the luckysheet-icon-morebtn-div element of the toolbar, it will affect the height of the entire workbook area, so the height is obtained here\r\n    gridH = $(\"#\" + Store.container).height();\r\n\r\n    $(\"#\" + Store.container).find(\".luckysheet\").height(gridH - 2).width(gridW - 2);\r\n\r\n    changeSheetContainerSize(gridW, gridH)\r\n\r\n    if(isRefreshCanvas){\r\n        luckysheetrefreshgrid($(\"#luckysheet-cell-main\").scrollLeft(), $(\"#luckysheet-cell-main\").scrollTop());\r\n    }\r\n\r\n    sheetmanage.sheetArrowShowAndHide();\r\n    sheetmanage.sheetBarShowAndHide();\r\n}\r\n\r\n\r\nexport function changeSheetContainerSize(gridW, gridH){\r\n    if(gridW==null){\r\n        gridW = $(\"#\" + Store.container).width();\r\n    }\r\n\r\n    if(gridH==null){\r\n        gridH = $(\"#\" + Store.container).height();\r\n    }\r\n    Store.cellmainHeight = gridH - (Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight + Store.sheetBarHeight + Store.statisticBarHeight);\r\n    Store.cellmainWidth = gridW - Store.rowHeaderWidth;\r\n\r\n    $(\"#luckysheet-cols-h-c, #luckysheet-cell-main\").width(Store.cellmainWidth);\r\n    $(\"#luckysheet-cell-main\").height(Store.cellmainHeight);\r\n    $(\"#luckysheet-rows-h\").height(Store.cellmainHeight - Store.cellMainSrollBarSize);\r\n\r\n    $(\"#luckysheet-scrollbar-y\").height(Store.cellmainHeight + Store.columnHeaderHeight - Store.cellMainSrollBarSize - 3);\r\n    $(\"#luckysheet-scrollbar-x\").height(Store.cellMainSrollBarSize);\r\n    $(\"#luckysheet-scrollbar-y\").width(Store.cellMainSrollBarSize);\r\n\r\n    $(\"#luckysheet-scrollbar-x\").width(Store.cellmainWidth).css(\"left\", Store.rowHeaderWidth - 2);\r\n\r\n    Store.luckysheetTableContentHW = [\r\n        Store.cellmainWidth + Store.rowHeaderWidth - Store.cellMainSrollBarSize,\r\n        Store.cellmainHeight + Store.columnHeaderHeight - Store.cellMainSrollBarSize\r\n    ];\r\n\r\n    $(\"#luckysheetTableContent, #luckysheetTableContentF\").attr({\r\n        width: Math.ceil(Store.luckysheetTableContentHW[0] * Store.devicePixelRatio),\r\n        height: Math.ceil(Store.luckysheetTableContentHW[1] * Store.devicePixelRatio)\r\n    })\r\n    .css({ width: Store.luckysheetTableContentHW[0], height: Store.luckysheetTableContentHW[1] });\r\n\r\n    $(\"#\" + Store.container).find(\"#luckysheet-grid-window-1\").css(\"bottom\", Store.sheetBarHeight);\r\n    $(\"#\" + Store.container).find(\".luckysheet-grid-window\").css(\"bottom\", Store.statisticBarHeight);\r\n\r\n    let gridwidth = $(\"#luckysheet-grid-window-1\").width();\r\n    $(\"#luckysheet-freezebar-horizontal\").find(\".luckysheet-freezebar-horizontal-handle\")\r\n    .css({ \"width\": gridwidth - 10 })\r\n    .end()\r\n    .find(\".luckysheet-freezebar-horizontal-drop\")\r\n    .css({ \"width\": gridwidth - 10 });\r\n\r\n    let gridheight = $(\"#luckysheet-grid-window-1\").height();\r\n    $(\"#luckysheet-freezebar-vertical\")\r\n    .find(\".luckysheet-freezebar-vertical-handle\")\r\n    .css({ \"height\": gridheight - 10 })\r\n    .end()\r\n    .find(\".luckysheet-freezebar-vertical-drop\")\r\n    .css({ \"height\": gridheight - 10 });\r\n\r\n    luckysheetFreezen.createAssistCanvas();\r\n}\r\n\r\n/**\r\n *\r\n *\r\n * Toolbar judgment rules: First set the display and hide of all tool buttons according to showtoolbar, and then override the judgment of showtoolbar according to showtoolbarConfig rules\r\n *\r\n * The width value of each button in the statistics toolbar is used to calculate which needs to be placed in more buttons\r\n */\r\nexport function menuToolBarWidth() {\r\n    const showtoolbar = luckysheetConfigsetting.showtoolbar;\r\n    const showtoolbarConfig = luckysheetConfigsetting.showtoolbarConfig;\r\n\r\n    const toobarWidths = Store.toobarObject.toobarWidths = [];\r\n    const toobarElements = Store.toobarObject.toobarElements = [];\r\n    const toolbarConfig = Store.toobarObject.toolbarConfig = buildBoolBarConfig();\r\n\r\n    /**\r\n     * 基于 showtoolbarConfig 配置 动态生成 toolbarConfig\r\n     * @returns {object}\r\n     * @input showtoolbarConfig = ['undo', 'redo', '|' , 'font' , 'moreFormats', '|']\r\n     * {\r\n     *     undo: {ele: '#luckysheet-icon-undo', index: 0},\r\n     *     redo: {ele: ['#luckysheet-icon-redo', '#luckysheet-separator-redo'], index: 1},\r\n     *     undo: {ele: '#luckysheet-icon-font', index: 2},\r\n     *     moreFormats: {ele: ['#luckysheet-icon-fmt-other', '#luckysheet-separator-more-formats'], index: 3},\r\n     * }\r\n     */\r\n    function buildBoolBarConfig() {\r\n        let obj = {};\r\n        function array2Config(arr) {\r\n            const obj = {};\r\n            let current,next;\r\n            let index = 0;\r\n            for (let i = 0; i<arr.length; i++) {\r\n                current = arr[i];\r\n                next = arr[i + 1];\r\n                if (current !== '|') {\r\n                    obj[current] = {\r\n                        ele: toolbarIdMap[current],\r\n                        index: index++\r\n                    }\r\n                }\r\n                if (next === '|') {\r\n                    if (getObjType(obj[current].ele) === 'array') {\r\n                        obj[current].ele.push(`#toolbar-separator-${camel2split(current)}`);\r\n                    } else {\r\n                        obj[current].ele = [obj[current].ele, `#toolbar-separator-${camel2split(current)}`];\r\n                    }\r\n                }\r\n            }\r\n            return obj;\r\n        }\r\n        // 数组形式直接生成\r\n        if (getObjType(showtoolbarConfig) === 'array') {\r\n            // show 为 false\r\n            if (!showtoolbar) {\r\n                return obj;\r\n            }\r\n            return array2Config(showtoolbarConfig);\r\n        }\r\n        // 否则为全部中从记录中挑选显示或隐藏\r\n        const config = defaultToolbar.reduce(function(total, curr) {\r\n            if (curr !== '|') {\r\n                total[curr] = true;\r\n            }\r\n            return total;\r\n        }, {});\r\n        if (!showtoolbar) {\r\n            for (let s in config) {\r\n                config[s] = false;\r\n            }\r\n        }\r\n\r\n        if (JSON.stringify(showtoolbarConfig) !== '{}') {\r\n            if(showtoolbarConfig.hasOwnProperty('undoRedo')){\r\n                config.undo = config.redo = showtoolbarConfig.undoRedo;\r\n\r\n            }\r\n            Object.assign(config, showtoolbarConfig);\r\n\r\n            let current,next;\r\n            let index = 0;\r\n            for (let i = 0; i<defaultToolbar.length; i++) {\r\n                current = defaultToolbar[i];\r\n                next = defaultToolbar[i + 1];\r\n                if (config[current] === false) {\r\n                    continue;\r\n                }\r\n                if (current !== '|' && config[current]) {\r\n\r\n                    obj[current] = {\r\n                        ele: toolbarIdMap[current],\r\n                        index: index++\r\n                    }\r\n                }\r\n                if (next === '|') {\r\n                    if (getObjType(obj[current].ele) === 'array') {\r\n                        obj[current].ele.push(`#toolbar-separator-${camel2split(current)}`);\r\n                    } else {\r\n                        obj[current].ele = [obj[current].ele, `#toolbar-separator-${camel2split(current)}`];\r\n                    }\r\n                }\r\n            }\r\n        } else {\r\n            obj = showtoolbar ? array2Config(defaultToolbar) : {};\r\n        }\r\n\r\n        return obj;\r\n    }\r\n\r\n    for (let s in toolbarConfig){\r\n        if (Object.prototype.hasOwnProperty.call(toolbarConfig, s)) {\r\n            toobarElements.push($.extend(true,{},toolbarConfig[s]));\r\n        }\r\n    }\r\n\r\n    toobarElements.sort(sortToolbar);\r\n\r\n    function sortToolbar(a,b) {\r\n        if(a.index > b.index){\r\n            return 1;\r\n        }else{\r\n            return -1;\r\n        }\r\n    }\r\n    toobarElements.forEach((curr,index,arr)=>{\r\n        arr[index] = curr.ele;\r\n\r\n        if(index !== toobarElements.length - 1){\r\n            if(curr.ele instanceof Array){\r\n                toobarWidths.push($(curr.ele[0]).offset().left);\r\n            }else{\r\n                toobarWidths.push($(curr.ele).offset().left);\r\n            }\r\n        }else{\r\n            if(curr.ele instanceof Array){\r\n                toobarWidths.push($(curr.ele[0]).offset().left);\r\n                toobarWidths.push($(curr.ele[0]).offset().left + $(curr.ele[0]).outerWidth() + 5);\r\n            }else{\r\n                toobarWidths.push($(curr.ele).offset().left);\r\n                toobarWidths.push($(curr.ele).offset().left + $(curr.ele).outerWidth() + 5);\r\n            }\r\n        }\r\n\r\n    });\r\n\r\n    //If the container does not occupy the full screen, we need to subtract the left margin\r\n    const containerLeft = $('#' + Store.container).offset().left;\r\n    toobarWidths.forEach((item,i)=>{\r\n        toobarWidths[i] -= containerLeft;\r\n    })\r\n\r\n}\r\n\r\n/**\r\n *Custom configuration bottom sheet button\r\n */\r\nfunction customSheetbarConfig() {\r\n\r\n    if(!luckysheetConfigsetting.initShowsheetbarConfig){\r\n\r\n        luckysheetConfigsetting.initShowsheetbarConfig = true;\r\n\r\n        const config = {\r\n            add: true, //Add worksheet\r\n            menu: true, //Worksheet management menu\r\n            sheet: true //Worksheet display\r\n        }\r\n\r\n        if(!luckysheetConfigsetting.showsheetbar){\r\n            for(let s in config){\r\n                config[s] = false;\r\n            }\r\n        }\r\n\r\n        // showsheetbarConfig determines the final result\r\n        if(JSON.stringify(luckysheetConfigsetting.showsheetbarConfig) !== '{}'){\r\n            Object.assign(config,luckysheetConfigsetting.showsheetbarConfig);\r\n        }\r\n\r\n        luckysheetConfigsetting.showsheetbarConfig = config;\r\n\r\n    }\r\n\r\n    const config = luckysheetConfigsetting.showsheetbarConfig;\r\n\r\n    let isHide = 0;\r\n\r\n    for (let s in config) {\r\n        if(!config[s]){\r\n            switch (s) {\r\n                case 'add':\r\n                    $('#luckysheet-sheets-add').hide();\r\n                    isHide++;\r\n                    break;\r\n\r\n                case 'menu':\r\n                    $('#luckysheet-sheets-m').hide();\r\n                    isHide++;\r\n                    break;\r\n\r\n                case 'sheet':\r\n                    $('#luckysheet-sheet-container').hide();\r\n                    $('#luckysheet-sheets-leftscroll').hide();\r\n                    $('#luckysheet-sheets-rightscroll').hide();\r\n                    isHide++;\r\n                    break;\r\n\r\n                default:\r\n                    break;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (isHide === 3) {\r\n        $(\"#\" + Store.container).find(\"#luckysheet-sheet-area\").hide();\r\n        Store.sheetBarHeight = 0;\r\n    }\r\n    else {\r\n        $(\"#\" + Store.container).find(\"#luckysheet-sheet-area\").show();\r\n        Store.sheetBarHeight = 31;\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * Customize the bottom count bar\r\n */\r\nfunction customStatisticBarConfig() {\r\n    if(!luckysheetConfigsetting.initStatisticBarConfig){\r\n\r\n        luckysheetConfigsetting.initStatisticBarConfig = true;\r\n\r\n        const config = {\r\n            count: true, // Count bar\r\n            view: true, // print view\r\n            zoom: true // Zoom\r\n        }\r\n\r\n        if(!luckysheetConfigsetting.showstatisticBar){\r\n            for(let s in config){\r\n                config[s] = false;\r\n            }\r\n        }\r\n\r\n        // showstatisticBarConfig determines the final result\r\n        if(JSON.stringify(luckysheetConfigsetting.showstatisticBarConfig) !== '{}'){\r\n            Object.assign(config,luckysheetConfigsetting.showstatisticBarConfig);\r\n        }\r\n\r\n        luckysheetConfigsetting.showstatisticBarConfig = config;\r\n\r\n    }\r\n\r\n    const config = luckysheetConfigsetting.showstatisticBarConfig;\r\n\r\n    let isHide = 0;\r\n\r\n    for (let s in config) {\r\n        if(!config[s]){\r\n            switch (s) {\r\n                case 'count':\r\n                    $('#luckysheet-sta-content').hide();\r\n                    isHide++;\r\n                    break;\r\n\r\n                case 'view':\r\n                    $('.luckysheet-print-viewList').hide();\r\n                    isHide++;\r\n                    break;\r\n\r\n                case 'zoom':\r\n                    $('#luckysheet-zoom-content').hide();\r\n                    isHide++;\r\n                    break;\r\n\r\n                default:\r\n                    break;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (isHide === 3) {\r\n        $(\"#\" + Store.container).find(\".luckysheet-stat-area\").hide();\r\n        Store.statisticBarHeight = 0;\r\n    }\r\n    else {\r\n        $(\"#\" + Store.container).find(\".luckysheet-stat-area\").show();\r\n        Store.statisticBarHeight = 23;\r\n    }\r\n}\r\n"
  },
  {
    "path": "src/controllers/rowColumnOperation.js",
    "content": "import pivotTable from \"./pivotTable\";\r\nimport luckysheetPostil from \"./postil\";\r\nimport imageCtrl from \"./imageCtrl\";\r\nimport menuButton from \"./menuButton\";\r\nimport server from \"./server\";\r\nimport method from \"../global/method\";\r\nimport { selectHightlightShow, luckysheet_count_show, selectHelpboxFill } from \"./select\";\r\nimport { getObjType, showrightclickmenu, luckysheetContainerFocus, luckysheetfontformat, $$ } from \"../utils/util\";\r\nimport { getSheetIndex, getRangetxt } from \"../methods/get\";\r\nimport { rowLocation, rowLocationByIndex, colLocation, colLocationByIndex, mouseposition } from \"../global/location\";\r\nimport { isRealNull, isRealNum, hasPartMC, isEditMode, checkIsAllowEdit } from \"../global/validate\";\r\nimport { countfunc } from \"../global/count\";\r\nimport formula from \"../global/formula\";\r\nimport { luckysheetextendtable, luckysheetdeletetable, luckysheetDeleteCell } from \"../global/extend\";\r\nimport { jfrefreshgrid, jfrefreshgridall, jfrefreshgrid_rhcw } from \"../global/refresh\";\r\nimport { getcellvalue } from \"../global/getdata\";\r\nimport tooltip from \"../global/tooltip\";\r\nimport editor from \"../global/editor\";\r\nimport locale from \"../locale/locale\";\r\nimport { getMeasureText, getCellTextInfo } from \"../global/getRowlen\";\r\nimport { luckysheet_searcharray } from \"../controllers/sheetSearch\";\r\nimport { isInlineStringCell } from \"./inlineString\";\r\nimport {\r\n    checkProtectionLockedRangeList,\r\n    checkProtectionAllSelected,\r\n    checkProtectionAuthorityNormal,\r\n} from \"./protection\";\r\nimport Store from \"../store\";\r\nimport luckysheetConfigsetting from \"./luckysheetConfigsetting\";\r\n\r\nexport function rowColumnOperationInitial() {\r\n    //表格行标题 mouse事件\r\n    $(\"#luckysheet-rows-h\")\r\n        .mousedown(function(event) {\r\n            if (!checkProtectionAllSelected(Store.currentSheetIndex)) {\r\n                return;\r\n            }\r\n            //有批注在编辑时\r\n            luckysheetPostil.removeActivePs();\r\n\r\n            //图片 active/cropping\r\n            if (\r\n                $(\"#luckysheet-modal-dialog-activeImage\").is(\":visible\") ||\r\n                $(\"#luckysheet-modal-dialog-cropping\").is(\":visible\")\r\n            ) {\r\n                imageCtrl.cancelActiveImgItem();\r\n            }\r\n\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let y = mouse[1] + $(\"#luckysheet-rows-h\").scrollTop();\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n            let col_index = Store.visibledatacolumn.length - 1,\r\n                col = Store.visibledatacolumn[col_index],\r\n                col_pre = 0;\r\n\r\n            $(\"#luckysheet-rightclick-menu\").hide();\r\n            $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n\r\n            //mousedown是右键\r\n            if (event.which == \"3\") {\r\n                let isright = false;\r\n\r\n                for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                    let obj_s = Store.luckysheet_select_save[s];\r\n\r\n                    if (\r\n                        obj_s[\"row\"] != null &&\r\n                        row_index >= obj_s[\"row\"][0] &&\r\n                        row_index <= obj_s[\"row\"][1] &&\r\n                        obj_s[\"column\"][0] == 0 &&\r\n                        obj_s[\"column\"][1] == Store.flowdata[0].length - 1\r\n                    ) {\r\n                        isright = true;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (isright) {\r\n                    return;\r\n                }\r\n            }\r\n\r\n            let top = row_pre,\r\n                height = row - row_pre - 1;\r\n            let rowseleted = [row_index, row_index];\r\n\r\n            Store.luckysheet_scroll_status = true;\r\n\r\n            //公式相关\r\n            let $input = $(\"#luckysheet-input-box\");\r\n            if (parseInt($input.css(\"top\")) > 0) {\r\n                if (\r\n                    formula.rangestart ||\r\n                    formula.rangedrag_column_start ||\r\n                    formula.rangedrag_row_start ||\r\n                    formula.israngeseleciton() ||\r\n                    $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").is(\":visible\")\r\n                ) {\r\n                    //公式选区\r\n                    let changeparam = menuButton.mergeMoveMain(\r\n                        [0, col_index],\r\n                        rowseleted,\r\n                        { row_focus: row_index, column_focus: 0 },\r\n                        top,\r\n                        height,\r\n                        col_pre,\r\n                        col,\r\n                    );\r\n                    if (changeparam != null) {\r\n                        //columnseleted = changeparam[0];\r\n                        rowseleted = changeparam[1];\r\n                        top = changeparam[2];\r\n                        height = changeparam[3];\r\n                        //left = changeparam[4];\r\n                        //width = changeparam[5];\r\n                    }\r\n\r\n                    if (event.shiftKey) {\r\n                        let last = formula.func_selectedrange;\r\n\r\n                        let top = 0,\r\n                            height = 0,\r\n                            rowseleted = [];\r\n                        if (last.top > row_pre) {\r\n                            top = row_pre;\r\n                            height = last.top + last.height - row_pre;\r\n\r\n                            if (last.row[1] > last.row_focus) {\r\n                                last.row[1] = last.row_focus;\r\n                            }\r\n\r\n                            rowseleted = [row_index, last.row[1]];\r\n                        } else if (last.top == row_pre) {\r\n                            top = row_pre;\r\n                            height = last.top + last.height - row_pre;\r\n                            rowseleted = [row_index, last.row[0]];\r\n                        } else {\r\n                            top = last.top;\r\n                            height = row - last.top - 1;\r\n\r\n                            if (last.row[0] < last.row_focus) {\r\n                                last.row[0] = last.row_focus;\r\n                            }\r\n\r\n                            rowseleted = [last.row[0], row_index];\r\n                        }\r\n\r\n                        let changeparam = menuButton.mergeMoveMain(\r\n                            [0, col_index],\r\n                            rowseleted,\r\n                            { row_focus: row_index, column_focus: 0 },\r\n                            top,\r\n                            height,\r\n                            col_pre,\r\n                            col,\r\n                        );\r\n                        if (changeparam != null) {\r\n                            // columnseleted = changeparam[0];\r\n                            rowseleted = changeparam[1];\r\n                            top = changeparam[2];\r\n                            height = changeparam[3];\r\n                            // left = changeparam[4];\r\n                            // width = changeparam[5];\r\n                        }\r\n\r\n                        last[\"row\"] = rowseleted;\r\n\r\n                        last[\"top_move\"] = top;\r\n                        last[\"height_move\"] = height;\r\n\r\n                        formula.func_selectedrange = last;\r\n                    } else if (\r\n                        event.ctrlKey &&\r\n                        $(\"#luckysheet-rich-text-editor\")\r\n                            .find(\"span\")\r\n                            .last()\r\n                            .text() != \",\"\r\n                    ) {\r\n                        //按住ctrl 选择选区时  先处理上一个选区\r\n                        let vText = $(\"#luckysheet-rich-text-editor\").text() + \",\";\r\n                        if (vText.length > 0 && vText.substr(0, 1) == \"=\") {\r\n                            vText = formula.functionHTMLGenerate(vText);\r\n\r\n                            if (window.getSelection) {\r\n                                // all browsers, except IE before version 9\r\n                                let currSelection = window.getSelection();\r\n                                formula.functionRangeIndex = [\r\n                                    $(currSelection.anchorNode)\r\n                                        .parent()\r\n                                        .index(),\r\n                                    currSelection.anchorOffset,\r\n                                ];\r\n                            } else {\r\n                                // Internet Explorer before version 9\r\n                                let textRange = document.selection.createRange();\r\n                                formula.functionRangeIndex = textRange;\r\n                            }\r\n\r\n                            $(\"#luckysheet-rich-text-editor\").html(vText);\r\n\r\n                            formula.canceFunctionrangeSelected();\r\n                            formula.createRangeHightlight();\r\n                        }\r\n\r\n                        formula.rangestart = false;\r\n                        formula.rangedrag_column_start = false;\r\n                        formula.rangedrag_row_start = false;\r\n\r\n                        $(\"#luckysheet-functionbox-cell\").html(vText);\r\n                        formula.rangeHightlightselected($(\"#luckysheet-rich-text-editor\"));\r\n\r\n                        //再进行 选区的选择\r\n                        formula.israngeseleciton();\r\n                        formula.func_selectedrange = {\r\n                            left: colLocationByIndex(0)[0],\r\n                            width: colLocationByIndex(0)[1] - colLocationByIndex(0)[0] - 1,\r\n                            top: top,\r\n                            height: height,\r\n                            left_move: col_pre,\r\n                            width_move: col - col_pre - 1,\r\n                            top_move: top,\r\n                            height_move: height,\r\n                            row: rowseleted,\r\n                            column: [0, col_index],\r\n                            row_focus: row_index,\r\n                            column_focus: 0,\r\n                        };\r\n                    } else {\r\n                        formula.func_selectedrange = {\r\n                            left: colLocationByIndex(0)[0],\r\n                            width: colLocationByIndex(0)[1] - colLocationByIndex(0)[0] - 1,\r\n                            top: top,\r\n                            height: height,\r\n                            left_move: col_pre,\r\n                            width_move: col - col_pre - 1,\r\n                            top_move: top,\r\n                            height_move: height,\r\n                            row: rowseleted,\r\n                            column: [0, col_index],\r\n                            row_focus: row_index,\r\n                            column_focus: 0,\r\n                        };\r\n                    }\r\n\r\n                    if (\r\n                        formula.rangestart ||\r\n                        formula.rangedrag_column_start ||\r\n                        formula.rangedrag_row_start ||\r\n                        formula.israngeseleciton()\r\n                    ) {\r\n                        formula.rangeSetValue({ row: rowseleted, column: [null, null] });\r\n                    } else if ($(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").is(\":visible\")) {\r\n                        //if公式生成器\r\n                        let range = getRangetxt(\r\n                            Store.currentSheetIndex,\r\n                            { row: rowseleted, column: [0, col_index] },\r\n                            Store.currentSheetIndex,\r\n                        );\r\n                        $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog input\").val(range);\r\n                    }\r\n\r\n                    formula.rangedrag_row_start = true;\r\n                    formula.rangestart = false;\r\n                    formula.rangedrag_column_start = false;\r\n\r\n                    $(\"#luckysheet-formula-functionrange-select\")\r\n                        .css({\r\n                            left: col_pre,\r\n                            width: col - col_pre - 1,\r\n                            top: top,\r\n                            height: height,\r\n                        })\r\n                        .show();\r\n                    $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n                    luckysheet_count_show(col_pre, top, col - col_pre - 1, height, rowseleted, [0, col_index]);\r\n\r\n                    setTimeout(function() {\r\n                        let currSelection = window.getSelection();\r\n                        let anchorOffset = currSelection.anchorNode;\r\n\r\n                        let $editor;\r\n                        if (\r\n                            $(\"#luckysheet-search-formula-parm\").is(\":visible\") ||\r\n                            $(\"#luckysheet-search-formula-parm-select\").is(\":visible\")\r\n                        ) {\r\n                            $editor = $(\"#luckysheet-rich-text-editor\");\r\n                            formula.rangechangeindex = formula.data_parm_index;\r\n                        } else {\r\n                            $editor = $(anchorOffset).closest(\"div\");\r\n                        }\r\n\r\n                        let $span = $editor.find(\"span[rangeindex='\" + formula.rangechangeindex + \"']\");\r\n\r\n                        formula.setCaretPosition($span.get(0), 0, $span.html().length);\r\n                    }, 1);\r\n\r\n                    return;\r\n                } else {\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    Store.luckysheet_rows_selected_status = true;\r\n                }\r\n            } else {\r\n                Store.luckysheet_rows_selected_status = true;\r\n            }\r\n\r\n            if (Store.luckysheet_rows_selected_status) {\r\n                if (event.shiftKey) {\r\n                    //按住shift点击行索引选取范围\r\n                    let last = $.extend(\r\n                        true,\r\n                        {},\r\n                        Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n                    ); //选区最后一个\r\n\r\n                    let top = 0,\r\n                        height = 0,\r\n                        rowseleted = [];\r\n                    if (last.top > row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n\r\n                        if (last.row[1] > last.row_focus) {\r\n                            last.row[1] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [row_index, last.row[1]];\r\n                    } else if (last.top == row_pre) {\r\n                        top = row_pre;\r\n                        height = last.top + last.height - row_pre;\r\n                        rowseleted = [row_index, last.row[0]];\r\n                    } else {\r\n                        top = last.top;\r\n                        height = row - last.top - 1;\r\n\r\n                        if (last.row[0] < last.row_focus) {\r\n                            last.row[0] = last.row_focus;\r\n                        }\r\n\r\n                        rowseleted = [last.row[0], row_index];\r\n                    }\r\n\r\n                    last[\"row\"] = rowseleted;\r\n\r\n                    last[\"top_move\"] = top;\r\n                    last[\"height_move\"] = height;\r\n\r\n                    Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n                } else if (event.ctrlKey) {\r\n                    Store.luckysheet_select_save.push({\r\n                        left: colLocationByIndex(0)[0],\r\n                        width: colLocationByIndex(0)[1] - colLocationByIndex(0)[0] - 1,\r\n                        top: top,\r\n                        height: height,\r\n                        left_move: col_pre,\r\n                        width_move: col - col_pre - 1,\r\n                        top_move: top,\r\n                        height_move: height,\r\n                        row: rowseleted,\r\n                        column: [0, col_index],\r\n                        row_focus: row_index,\r\n                        column_focus: 0,\r\n                        row_select: true,\r\n                    });\r\n                } else {\r\n                    Store.luckysheet_select_save.length = 0;\r\n                    Store.luckysheet_select_save.push({\r\n                        left: colLocationByIndex(0)[0],\r\n                        width: colLocationByIndex(0)[1] - colLocationByIndex(0)[0] - 1,\r\n                        top: top,\r\n                        height: height,\r\n                        left_move: col_pre,\r\n                        width_move: col - col_pre - 1,\r\n                        top_move: top,\r\n                        height_move: height,\r\n                        row: rowseleted,\r\n                        column: [0, col_index],\r\n                        row_focus: row_index,\r\n                        column_focus: 0,\r\n                        row_select: true,\r\n                    });\r\n                }\r\n\r\n                selectHightlightShow();\r\n\r\n                //允许编辑后的后台更新时\r\n                server.saveParam(\"mv\", Store.currentSheetIndex, Store.luckysheet_select_save);\r\n            }\r\n\r\n            selectHelpboxFill();\r\n\r\n            setTimeout(function() {\r\n                clearTimeout(Store.countfuncTimeout);\r\n                countfunc();\r\n            }, 101);\r\n        })\r\n        .mousemove(function(event) {\r\n            if (\r\n                Store.luckysheet_rows_selected_status ||\r\n                Store.luckysheet_rows_change_size ||\r\n                Store.luckysheet_select_status\r\n            ) {\r\n                $(\"#luckysheet-rows-h-hover\").hide();\r\n                return;\r\n            }\r\n\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let y = mouse[1] + $(\"#luckysheet-rows-h\").scrollTop();\r\n\r\n            let row_location = rowLocation(y),\r\n                row = row_location[1],\r\n                row_pre = row_location[0],\r\n                row_index = row_location[2];\r\n\r\n            $(\"#luckysheet-rows-h-hover\").css({ top: row_pre, height: row - row_pre - 1, display: \"block\" });\r\n\r\n            if (y < row - 1 && y >= row - 5) {\r\n                $(\"#luckysheet-rows-change-size\").css({ top: row - 3, opacity: 0 });\r\n            } else {\r\n                $(\"#luckysheet-rows-change-size\").css(\"opacity\", 0);\r\n            }\r\n        })\r\n        .mouseleave(function(event) {\r\n            $(\"#luckysheet-rows-h-hover\").hide();\r\n            $(\"#luckysheet-rows-change-size\").css(\"opacity\", 0);\r\n        })\r\n        .mouseup(function(event) {\r\n            if (event.which == 3) {\r\n                // *如果禁止前台编辑，则中止下一步操作\r\n                if (!checkIsAllowEdit()) {\r\n                    return;\r\n                }\r\n                if (isEditMode()) {\r\n                    //非编辑模式下禁止右键功能框\r\n                    return;\r\n                }\r\n\r\n                $(\"#luckysheet-cols-rows-shift\").hide();\r\n                Store.luckysheetRightHeadClickIs = \"row\";\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word\").text(locale().rightclick.row);\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size\").text(locale().rightclick.height);\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left\").text(locale().rightclick.top);\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right\").text(locale().rightclick.bottom);\r\n\r\n                $(\"#luckysheet-cols-rows-add\").show();\r\n                $(\"#luckysheet-cols-rows-data\").show();\r\n                $(\"#luckysheet-cols-rows-shift\").hide();\r\n                $(\"#luckysheet-cols-rows-handleincell\").hide();\r\n\r\n                $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"block\";\r\n                $$(\"#luckysheet-cols-rows-data .luckysheet-menuseparator\").style.display = \"block\";\r\n\r\n                // 自定义右键菜单：向上向下增加行，删除行，隐藏显示行，设置行高\r\n                const cellRightClickConfig = luckysheetConfigsetting.cellRightClickConfig;\r\n\r\n                // 如果全部按钮都隐藏，则整个菜单容器也要隐藏\r\n                if (\r\n                    !cellRightClickConfig.copy &&\r\n                    !cellRightClickConfig.copyAs &&\r\n                    !cellRightClickConfig.paste &&\r\n                    !cellRightClickConfig.insertRow &&\r\n                    !cellRightClickConfig.deleteRow &&\r\n                    !cellRightClickConfig.hideRow &&\r\n                    !cellRightClickConfig.rowHeight &&\r\n                    !cellRightClickConfig.clear &&\r\n                    !cellRightClickConfig.matrix &&\r\n                    !cellRightClickConfig.sort &&\r\n                    !cellRightClickConfig.filter &&\r\n                    !cellRightClickConfig.chart &&\r\n                    !cellRightClickConfig.image &&\r\n                    !cellRightClickConfig.link &&\r\n                    !cellRightClickConfig.data &&\r\n                    !cellRightClickConfig.cellFormat\r\n                ) {\r\n                    return;\r\n                }\r\n\r\n                $$(\"#luckysheet-top-left-add-selected\").style.display = cellRightClickConfig.insertRow\r\n                    ? \"block\"\r\n                    : \"none\";\r\n                $$(\"#luckysheet-bottom-right-add-selected\").style.display = cellRightClickConfig.insertRow\r\n                    ? \"block\"\r\n                    : \"none\";\r\n                $$(\"#luckysheet-del-selected\").style.display = cellRightClickConfig.deleteRow ? \"block\" : \"none\";\r\n                $$(\"#luckysheet-hide-selected\").style.display = cellRightClickConfig.hideRow ? \"block\" : \"none\";\r\n                $$(\"#luckysheet-show-selected\").style.display = cellRightClickConfig.hideRow ? \"block\" : \"none\";\r\n                $$(\"#luckysheet-column-row-width-selected\").style.display = cellRightClickConfig.rowHeight\r\n                    ? \"block\"\r\n                    : \"none\";\r\n\r\n                // 1. 当一个功能菜单块上方的功能块按钮都隐藏的时候，下方的功能块的顶部分割线也需要隐藏\r\n                if (!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste) {\r\n                    $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"none\";\r\n\r\n                    if (\r\n                        !cellRightClickConfig.insertRow &&\r\n                        !cellRightClickConfig.deleteRow &&\r\n                        !cellRightClickConfig.hideRow &&\r\n                        !cellRightClickConfig.rowHeight\r\n                    ) {\r\n                        $$(\"#luckysheet-cols-rows-data .luckysheet-menuseparator\").style.display = \"none\";\r\n                    }\r\n                }\r\n\r\n                // 2. 当一个功能菜单块内所有的按钮都隐藏的时候，它顶部的分割线也需要隐藏掉\r\n                if (\r\n                    !cellRightClickConfig.insertRow &&\r\n                    !cellRightClickConfig.deleteRow &&\r\n                    !cellRightClickConfig.hideRow &&\r\n                    !cellRightClickConfig.rowHeight\r\n                ) {\r\n                    $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"none\";\r\n                }\r\n\r\n                if (\r\n                    !cellRightClickConfig.clear &&\r\n                    !cellRightClickConfig.matrix &&\r\n                    !cellRightClickConfig.sort &&\r\n                    !cellRightClickConfig.filter &&\r\n                    !cellRightClickConfig.chart &&\r\n                    !cellRightClickConfig.image &&\r\n                    !cellRightClickConfig.link &&\r\n                    !cellRightClickConfig.data &&\r\n                    !cellRightClickConfig.cellFormat\r\n                ) {\r\n                    $$(\"#luckysheet-cols-rows-data .luckysheet-menuseparator\").style.display = \"none\";\r\n                }\r\n\r\n                showrightclickmenu($(\"#luckysheet-rightclick-menu\"), $(this).offset().left + 46, event.pageY);\r\n                Store.luckysheet_cols_menu_status = true;\r\n\r\n                //行高默认值\r\n                let cfg = $.extend(true, {}, Store.config);\r\n                if (cfg[\"rowlen\"] == null) {\r\n                    cfg[\"rowlen\"] = {};\r\n                }\r\n\r\n                let first_rowlen =\r\n                    cfg[\"rowlen\"][Store.luckysheet_select_save[0].row[0]] == null\r\n                        ? Store.defaultrowlen\r\n                        : cfg[\"rowlen\"][Store.luckysheet_select_save[0].row[0]];\r\n                let isSame = true;\r\n\r\n                for (let i = 0; i < Store.luckysheet_select_save.length; i++) {\r\n                    let s = Store.luckysheet_select_save[i];\r\n                    let r1 = s.row[0],\r\n                        r2 = s.row[1];\r\n\r\n                    for (let r = r1; r <= r2; r++) {\r\n                        let rowlen = cfg[\"rowlen\"][r] == null ? Store.defaultrowlen : cfg[\"rowlen\"][r];\r\n\r\n                        if (rowlen != first_rowlen) {\r\n                            isSame = false;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (isSame) {\r\n                    $(\"#luckysheet-cols-rows-add\")\r\n                        .find(\"input[type='number'].rcsize\")\r\n                        .val(first_rowlen);\r\n                } else {\r\n                    $(\"#luckysheet-cols-rows-add\")\r\n                        .find(\"input[type='number'].rcsize\")\r\n                        .val(\"\");\r\n                }\r\n            }\r\n        });\r\n\r\n    //表格列标题 mouse事件\r\n    $(\"#luckysheet-cols-h-c\")\r\n        .mousedown(function(event) {\r\n            if (!checkProtectionAllSelected(Store.currentSheetIndex)) {\r\n                return;\r\n            }\r\n            //有批注在编辑时\r\n            luckysheetPostil.removeActivePs();\r\n\r\n            //图片 active/cropping\r\n            if (\r\n                $(\"#luckysheet-modal-dialog-activeImage\").is(\":visible\") ||\r\n                $(\"#luckysheet-modal-dialog-cropping\").is(\":visible\")\r\n            ) {\r\n                imageCtrl.cancelActiveImgItem();\r\n            }\r\n\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let x = mouse[0] + $(this).scrollLeft();\r\n\r\n            let row_index = Store.visibledatarow.length - 1,\r\n                row = Store.visibledatarow[row_index],\r\n                row_pre = 0;\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n\r\n            Store.orderbyindex = col_index; //排序全局函数\r\n\r\n            $(\"#luckysheet-rightclick-menu\").hide();\r\n            $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n            $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n\r\n            //mousedown是右键\r\n            if (event.which == \"3\") {\r\n                let isright = false;\r\n\r\n                for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                    let obj_s = Store.luckysheet_select_save[s];\r\n\r\n                    if (\r\n                        obj_s[\"column\"] != null &&\r\n                        col_index >= obj_s[\"column\"][0] &&\r\n                        col_index <= obj_s[\"column\"][1] &&\r\n                        obj_s[\"row\"][0] == 0 &&\r\n                        obj_s[\"row\"][1] == Store.flowdata.length - 1\r\n                    ) {\r\n                        isright = true;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (isright) {\r\n                    return;\r\n                }\r\n            }\r\n\r\n            let left = col_pre,\r\n                width = col - col_pre - 1;\r\n            let columnseleted = [col_index, col_index];\r\n\r\n            Store.luckysheet_scroll_status = true;\r\n\r\n            //公式相关\r\n            let $input = $(\"#luckysheet-input-box\");\r\n            if (parseInt($input.css(\"top\")) > 0) {\r\n                if (\r\n                    formula.rangestart ||\r\n                    formula.rangedrag_column_start ||\r\n                    formula.rangedrag_row_start ||\r\n                    formula.israngeseleciton() ||\r\n                    $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").is(\":visible\")\r\n                ) {\r\n                    //公式选区\r\n                    let changeparam = menuButton.mergeMoveMain(\r\n                        columnseleted,\r\n                        [0, row_index],\r\n                        { row_focus: 0, column_focus: col_index },\r\n                        row_pre,\r\n                        row,\r\n                        left,\r\n                        width,\r\n                    );\r\n                    if (changeparam != null) {\r\n                        columnseleted = changeparam[0];\r\n                        //rowseleted= changeparam[1];\r\n                        //top = changeparam[2];\r\n                        //height = changeparam[3];\r\n                        left = changeparam[4];\r\n                        width = changeparam[5];\r\n                    }\r\n\r\n                    if (event.shiftKey) {\r\n                        let last = formula.func_selectedrange;\r\n\r\n                        let left = 0,\r\n                            width = 0,\r\n                            columnseleted = [];\r\n                        if (last.left > col_pre) {\r\n                            left = col_pre;\r\n                            width = last.left + last.width - col_pre;\r\n\r\n                            if (last.column[1] > last.column_focus) {\r\n                                last.column[1] = last.column_focus;\r\n                            }\r\n\r\n                            columnseleted = [col_index, last.column[1]];\r\n                        } else if (last.left == col_pre) {\r\n                            left = col_pre;\r\n                            width = last.left + last.width - col_pre;\r\n                            columnseleted = [col_index, last.column[0]];\r\n                        } else {\r\n                            left = last.left;\r\n                            width = col - last.left - 1;\r\n\r\n                            if (last.column[0] < last.column_focus) {\r\n                                last.column[0] = last.column_focus;\r\n                            }\r\n\r\n                            columnseleted = [last.column[0], col_index];\r\n                        }\r\n\r\n                        let changeparam = menuButton.mergeMoveMain(\r\n                            columnseleted,\r\n                            [0, row_index],\r\n                            { row_focus: 0, column_focus: col_index },\r\n                            row_pre,\r\n                            row,\r\n                            left,\r\n                            width,\r\n                        );\r\n                        if (changeparam != null) {\r\n                            columnseleted = changeparam[0];\r\n                            //rowseleted= changeparam[1];\r\n                            //top = changeparam[2];\r\n                            //height = changeparam[3];\r\n                            left = changeparam[4];\r\n                            width = changeparam[5];\r\n                        }\r\n\r\n                        last[\"column\"] = columnseleted;\r\n\r\n                        last[\"left_move\"] = left;\r\n                        last[\"width_move\"] = width;\r\n\r\n                        formula.func_selectedrange = last;\r\n                    } else if (\r\n                        event.ctrlKey &&\r\n                        $(\"#luckysheet-rich-text-editor\")\r\n                            .find(\"span\")\r\n                            .last()\r\n                            .text() != \",\"\r\n                    ) {\r\n                        //按住ctrl 选择选区时  先处理上一个选区\r\n                        let vText = $(\"#luckysheet-rich-text-editor\").text() + \",\";\r\n                        if (vText.length > 0 && vText.substr(0, 1) == \"=\") {\r\n                            vText = formula.functionHTMLGenerate(vText);\r\n\r\n                            if (window.getSelection) {\r\n                                // all browsers, except IE before version 9\r\n                                let currSelection = window.getSelection();\r\n                                formula.functionRangeIndex = [\r\n                                    $(currSelection.anchorNode)\r\n                                        .parent()\r\n                                        .index(),\r\n                                    currSelection.anchorOffset,\r\n                                ];\r\n                            } else {\r\n                                // Internet Explorer before version 9\r\n                                let textRange = document.selection.createRange();\r\n                                formula.functionRangeIndex = textRange;\r\n                            }\r\n\r\n                            $(\"#luckysheet-rich-text-editor\").html(vText);\r\n\r\n                            formula.canceFunctionrangeSelected();\r\n                            formula.createRangeHightlight();\r\n                        }\r\n\r\n                        formula.rangestart = false;\r\n                        formula.rangedrag_column_start = false;\r\n                        formula.rangedrag_row_start = false;\r\n\r\n                        $(\"#luckysheet-functionbox-cell\").html(vText);\r\n                        formula.rangeHightlightselected($(\"#luckysheet-rich-text-editor\"));\r\n\r\n                        //再进行 选区的选择\r\n                        formula.israngeseleciton();\r\n                        formula.func_selectedrange = {\r\n                            left: left,\r\n                            width: width,\r\n                            top: rowLocationByIndex(0)[0],\r\n                            height: rowLocationByIndex(0)[1] - rowLocationByIndex(0)[0] - 1,\r\n                            left_move: left,\r\n                            width_move: width,\r\n                            top_move: row_pre,\r\n                            height_move: row - row_pre - 1,\r\n                            row: [0, row_index],\r\n                            column: columnseleted,\r\n                            row_focus: 0,\r\n                            column_focus: col_index,\r\n                        };\r\n                    } else {\r\n                        formula.func_selectedrange = {\r\n                            left: left,\r\n                            width: width,\r\n                            top: rowLocationByIndex(0)[0],\r\n                            height: rowLocationByIndex(0)[1] - rowLocationByIndex(0)[0] - 1,\r\n                            left_move: left,\r\n                            width_move: width,\r\n                            top_move: row_pre,\r\n                            height_move: row - row_pre - 1,\r\n                            row: [0, row_index],\r\n                            column: columnseleted,\r\n                            row_focus: 0,\r\n                            column_focus: col_index,\r\n                        };\r\n                    }\r\n\r\n                    if (\r\n                        formula.rangestart ||\r\n                        formula.rangedrag_column_start ||\r\n                        formula.rangedrag_row_start ||\r\n                        formula.israngeseleciton()\r\n                    ) {\r\n                        formula.rangeSetValue({ row: [null, null], column: columnseleted });\r\n                    } else if ($(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").is(\":visible\")) {\r\n                        //if公式生成器\r\n                        let range = getRangetxt(\r\n                            Store.currentSheetIndex,\r\n                            { row: [0, row_index], column: columnseleted },\r\n                            Store.currentSheetIndex,\r\n                        );\r\n                        $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog input\").val(range);\r\n                    }\r\n\r\n                    formula.rangedrag_column_start = true;\r\n                    formula.rangestart = false;\r\n                    formula.rangedrag_row_start = false;\r\n\r\n                    $(\"#luckysheet-formula-functionrange-select\")\r\n                        .css({\r\n                            left: left,\r\n                            width: width,\r\n                            top: row_pre,\r\n                            height: row - row_pre - 1,\r\n                        })\r\n                        .show();\r\n                    $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n                    luckysheet_count_show(left, row_pre, width, row - row_pre - 1, [0, row_index], columnseleted);\r\n\r\n                    return;\r\n                } else {\r\n                    formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n                    Store.luckysheet_cols_selected_status = true;\r\n                }\r\n            } else {\r\n                Store.luckysheet_cols_selected_status = true;\r\n            }\r\n\r\n            if (Store.luckysheet_cols_selected_status) {\r\n                if (event.shiftKey) {\r\n                    //按住shift点击列索引选取范围\r\n                    let last = $.extend(\r\n                        true,\r\n                        {},\r\n                        Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n                    ); //选区最后一个\r\n\r\n                    let left = 0,\r\n                        width = 0,\r\n                        columnseleted = [];\r\n                    if (last.left > col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n\r\n                        if (last.column[1] > last.column_focus) {\r\n                            last.column[1] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [col_index, last.column[1]];\r\n                    } else if (last.left == col_pre) {\r\n                        left = col_pre;\r\n                        width = last.left + last.width - col_pre;\r\n                        columnseleted = [col_index, last.column[0]];\r\n                    } else {\r\n                        left = last.left;\r\n                        width = col - last.left - 1;\r\n\r\n                        if (last.column[0] < last.column_focus) {\r\n                            last.column[0] = last.column_focus;\r\n                        }\r\n\r\n                        columnseleted = [last.column[0], col_index];\r\n                    }\r\n\r\n                    last[\"column\"] = columnseleted;\r\n\r\n                    last[\"left_move\"] = left;\r\n                    last[\"width_move\"] = width;\r\n\r\n                    Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1] = last;\r\n                } else if (event.ctrlKey) {\r\n                    //选区添加\r\n                    Store.luckysheet_select_save.push({\r\n                        left: left,\r\n                        width: width,\r\n                        top: rowLocationByIndex(0)[0],\r\n                        height: rowLocationByIndex(0)[1] - rowLocationByIndex(0)[0] - 1,\r\n                        left_move: left,\r\n                        width_move: width,\r\n                        top_move: row_pre,\r\n                        height_move: row - row_pre - 1,\r\n                        row: [0, row_index],\r\n                        column: columnseleted,\r\n                        row_focus: 0,\r\n                        column_focus: col_index,\r\n                        column_select: true,\r\n                    });\r\n                } else {\r\n                    Store.luckysheet_select_save.length = 0;\r\n                    Store.luckysheet_select_save.push({\r\n                        left: left,\r\n                        width: width,\r\n                        top: rowLocationByIndex(0)[0],\r\n                        height: rowLocationByIndex(0)[1] - rowLocationByIndex(0)[0] - 1,\r\n                        left_move: left,\r\n                        width_move: width,\r\n                        top_move: row_pre,\r\n                        height_move: row - row_pre - 1,\r\n                        row: [0, row_index],\r\n                        column: columnseleted,\r\n                        row_focus: 0,\r\n                        column_focus: col_index,\r\n                        column_select: true,\r\n                    });\r\n                }\r\n\r\n                selectHightlightShow();\r\n\r\n                //允许编辑后的后台更新时\r\n                server.saveParam(\"mv\", Store.currentSheetIndex, Store.luckysheet_select_save);\r\n            }\r\n\r\n            selectHelpboxFill();\r\n\r\n            setTimeout(function() {\r\n                clearTimeout(Store.countfuncTimeout);\r\n                countfunc();\r\n            }, 101);\r\n\r\n            if (Store.luckysheet_cols_menu_status) {\r\n                $(\"#luckysheet-rightclick-menu\").hide();\r\n                $(\"#luckysheet-cols-h-hover\").hide();\r\n                $(\"#luckysheet-cols-menu-btn\").hide();\r\n                Store.luckysheet_cols_menu_status = false;\r\n            }\r\n            event.stopPropagation();\r\n        })\r\n        .mousemove(function(event) {\r\n            if (Store.luckysheet_cols_selected_status || Store.luckysheet_select_status) {\r\n                $(\"#luckysheet-cols-h-hover\").hide();\r\n                $(\"#luckysheet-cols-menu-btn\").hide();\r\n                return;\r\n            }\r\n\r\n            if (Store.luckysheet_cols_menu_status || Store.luckysheet_cols_change_size) {\r\n                return;\r\n            }\r\n\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let x = mouse[0] + $(\"#luckysheet-cols-h-c\").scrollLeft();\r\n\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n\r\n            $(\"#luckysheet-cols-h-hover\").css({ left: col_pre, width: col - col_pre - 1, display: \"block\" });\r\n            $(\"#luckysheet-cols-menu-btn\").css({ left: col - 19, display: \"block\" });\r\n\r\n            $(\"#luckysheet-cols-change-size\").css({ left: col - 5 });\r\n            if (x < col && x >= col - 5) {\r\n                $(\"#luckysheet-cols-change-size\").css({ opacity: 0 });\r\n                $(\"#luckysheet-cols-menu-btn\").hide();\r\n            } else {\r\n                $(\"#luckysheet-change-size-line\").hide();\r\n                $(\"#luckysheet-cols-change-size\").css(\"opacity\", 0);\r\n            }\r\n        })\r\n        .mouseleave(function(event) {\r\n            if (Store.luckysheet_cols_menu_status || Store.luckysheet_cols_change_size) {\r\n                return;\r\n            }\r\n\r\n            $(\"#luckysheet-cols-h-hover\").hide();\r\n            $(\"#luckysheet-cols-menu-btn\").hide();\r\n            $(\"#luckysheet-cols-change-size\").css(\"opacity\", 0);\r\n        })\r\n        .mouseup(function(event) {\r\n            if (event.which == 3) {\r\n                // *如果禁止前台编辑，则中止下一步操作\r\n                if (!checkIsAllowEdit()) {\r\n                    return;\r\n                }\r\n                if (isEditMode()) {\r\n                    //非编辑模式下禁止右键功能框\r\n                    return;\r\n                }\r\n\r\n                Store.luckysheetRightHeadClickIs = \"column\";\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word\").text(locale().rightclick.column);\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size\").text(locale().rightclick.width);\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left\").text(locale().rightclick.left);\r\n                $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right\").text(locale().rightclick.right);\r\n\r\n                $(\"#luckysheet-cols-rows-add\").show();\r\n                $(\"#luckysheet-cols-rows-data\").show();\r\n                $(\"#luckysheet-cols-rows-shift\").hide();\r\n                $(\"#luckysheet-cols-rows-handleincell\").hide();\r\n\r\n                $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"block\";\r\n                $$(\"#luckysheet-cols-rows-data .luckysheet-menuseparator\").style.display = \"block\";\r\n\r\n                // 自定义右键菜单：向左向右增加列，删除列，隐藏显示列，设置列宽\r\n                const cellRightClickConfig = luckysheetConfigsetting.cellRightClickConfig;\r\n\r\n                // 如果全部按钮都隐藏，则整个菜单容器也要隐藏\r\n                if (\r\n                    !cellRightClickConfig.copy &&\r\n                    !cellRightClickConfig.copyAs &&\r\n                    !cellRightClickConfig.paste &&\r\n                    !cellRightClickConfig.insertColumn &&\r\n                    !cellRightClickConfig.deleteColumn &&\r\n                    !cellRightClickConfig.hideColumn &&\r\n                    !cellRightClickConfig.columnWidth &&\r\n                    !cellRightClickConfig.clear &&\r\n                    !cellRightClickConfig.matrix &&\r\n                    !cellRightClickConfig.sort &&\r\n                    !cellRightClickConfig.filter &&\r\n                    !cellRightClickConfig.chart &&\r\n                    !cellRightClickConfig.image &&\r\n                    !cellRightClickConfig.link &&\r\n                    !cellRightClickConfig.data &&\r\n                    !cellRightClickConfig.cellFormat\r\n                ) {\r\n                    return;\r\n                }\r\n\r\n                $$(\"#luckysheet-top-left-add-selected\").style.display = cellRightClickConfig.insertColumn\r\n                    ? \"block\"\r\n                    : \"none\";\r\n                $$(\"#luckysheet-bottom-right-add-selected\").style.display = cellRightClickConfig.insertColumn\r\n                    ? \"block\"\r\n                    : \"none\";\r\n                $$(\"#luckysheet-del-selected\").style.display = cellRightClickConfig.deleteColumn ? \"block\" : \"none\";\r\n                $$(\"#luckysheet-hide-selected\").style.display = cellRightClickConfig.hideColumn ? \"block\" : \"none\";\r\n                $$(\"#luckysheet-show-selected\").style.display = cellRightClickConfig.hideColumn ? \"block\" : \"none\";\r\n                $$(\"#luckysheet-column-row-width-selected\").style.display = cellRightClickConfig.columnWidth\r\n                    ? \"block\"\r\n                    : \"none\";\r\n\r\n                // 1. 当一个功能菜单块上方的功能块按钮都隐藏的时候，下方的功能块的顶部分割线也需要隐藏\r\n                if (!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste) {\r\n                    $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"none\";\r\n\r\n                    if (\r\n                        !cellRightClickConfig.insertColumn &&\r\n                        !cellRightClickConfig.deleteColumn &&\r\n                        !cellRightClickConfig.hideColumn &&\r\n                        !cellRightClickConfig.columnWidth\r\n                    ) {\r\n                        $$(\"#luckysheet-cols-rows-data .luckysheet-menuseparator\").style.display = \"none\";\r\n                    }\r\n                }\r\n\r\n                // 2. 当一个功能菜单块内所有的按钮都隐藏的时候，它顶部的分割线也需要隐藏掉\r\n                if (\r\n                    !cellRightClickConfig.insertColumn &&\r\n                    !cellRightClickConfig.deleteColumn &&\r\n                    !cellRightClickConfig.hideColumn &&\r\n                    !cellRightClickConfig.columnWidth\r\n                ) {\r\n                    $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"none\";\r\n                }\r\n\r\n                if (\r\n                    !cellRightClickConfig.clear &&\r\n                    !cellRightClickConfig.matrix &&\r\n                    !cellRightClickConfig.sort &&\r\n                    !cellRightClickConfig.filter &&\r\n                    !cellRightClickConfig.chart &&\r\n                    !cellRightClickConfig.image &&\r\n                    !cellRightClickConfig.link &&\r\n                    !cellRightClickConfig.data &&\r\n                    !cellRightClickConfig.cellFormat\r\n                ) {\r\n                    $$(\"#luckysheet-cols-rows-data .luckysheet-menuseparator\").style.display = \"none\";\r\n                }\r\n\r\n                showrightclickmenu($(\"#luckysheet-rightclick-menu\"), event.pageX, $(this).offset().top + 18);\r\n                Store.luckysheet_cols_menu_status = true;\r\n\r\n                //列宽默认值\r\n                let cfg = $.extend(true, {}, Store.config);\r\n                if (cfg[\"columnlen\"] == null) {\r\n                    cfg[\"columnlen\"] = {};\r\n                }\r\n\r\n                let first_collen =\r\n                    cfg[\"columnlen\"][Store.luckysheet_select_save[0].column[0]] == null\r\n                        ? Store.defaultcollen\r\n                        : cfg[\"columnlen\"][Store.luckysheet_select_save[0].column[0]];\r\n                let isSame = true;\r\n\r\n                for (let i = 0; i < Store.luckysheet_select_save.length; i++) {\r\n                    let s = Store.luckysheet_select_save[i];\r\n                    let c1 = s.column[0],\r\n                        c2 = s.column[1];\r\n\r\n                    for (let c = c1; c <= c2; c++) {\r\n                        let collen = cfg[\"columnlen\"][c] == null ? Store.defaultcollen : cfg[\"columnlen\"][c];\r\n\r\n                        if (collen != first_collen) {\r\n                            isSame = false;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (isSame) {\r\n                    $(\"#luckysheet-cols-rows-add\")\r\n                        .find(\"input[type='number'].rcsize\")\r\n                        .val(first_collen);\r\n                } else {\r\n                    $(\"#luckysheet-cols-rows-add\")\r\n                        .find(\"input[type='number'].rcsize\")\r\n                        .val(\"\");\r\n                }\r\n            }\r\n        });\r\n\r\n    //表格行标题 改变行高按钮\r\n    $(\"#luckysheet-rows-change-size\").mousedown(function(event) {\r\n        // *如果禁止前台编辑，则中止下一步操作\r\n        if (!checkIsAllowEdit()) {\r\n            return;\r\n        }\r\n        //有批注在编辑时\r\n        luckysheetPostil.removeActivePs();\r\n\r\n        //图片 active/cropping\r\n        if (\r\n            $(\"#luckysheet-modal-dialog-activeImage\").is(\":visible\") ||\r\n            $(\"#luckysheet-modal-dialog-cropping\").is(\":visible\")\r\n        ) {\r\n            imageCtrl.cancelActiveImgItem();\r\n        }\r\n\r\n        $(\"#luckysheet-input-box\").hide();\r\n        $(\"#luckysheet-rows-change-size\").css({ opacity: 1 });\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let y = mouse[1] + $(\"#luckysheet-rows-h\").scrollTop();\r\n\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n        let row_location = rowLocation(y),\r\n            row = row_location[1],\r\n            row_pre = row_location[0],\r\n            row_index = row_location[2];\r\n\r\n        Store.luckysheet_rows_change_size = true;\r\n        Store.luckysheet_scroll_status = true;\r\n        $(\"#luckysheet-change-size-line\").css({\r\n            height: \"1px\",\r\n            \"border-width\": \"0 0px 1px 0\",\r\n            top: row - 3,\r\n            left: 0,\r\n            width: scrollLeft + winW,\r\n            display: \"block\",\r\n            cursor: \"ns-resize\",\r\n        });\r\n        $(\"#luckysheet-sheettable, #luckysheet-rows-h, #luckysheet-rows-h canvas\").css(\"cursor\", \"ns-resize\");\r\n        Store.luckysheet_rows_change_size_start = [row_pre, row_index];\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        $(\"#luckysheet-rows-h-hover\").hide();\r\n        $(\"#luckysheet-cols-menu-btn\").hide();\r\n        event.stopPropagation();\r\n    });\r\n\r\n    //表格列标题 改变列宽按钮\r\n    $(\"#luckysheet-cols-change-size\")\r\n        .mousedown(function(event) {\r\n            // *如果禁止前台编辑，则中止下一步操作\r\n            if (!checkIsAllowEdit()) {\r\n                return;\r\n            }\r\n            //有批注在编辑时\r\n            luckysheetPostil.removeActivePs();\r\n\r\n            //图片 active/cropping\r\n            if (\r\n                $(\"#luckysheet-modal-dialog-activeImage\").is(\":visible\") ||\r\n                $(\"#luckysheet-modal-dialog-cropping\").is(\":visible\")\r\n            ) {\r\n                imageCtrl.cancelActiveImgItem();\r\n            }\r\n\r\n            $(\"#luckysheet-input-box\").hide();\r\n            $(\"#luckysheet-cols-change-size\").css({ opacity: 1 });\r\n\r\n            let mouse = mouseposition(event.pageX, event.pageY);\r\n            let scrollLeft = $(\"#luckysheet-cols-h-c\").scrollLeft();\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let winH = $(\"#luckysheet-cell-main\").height();\r\n            let x = mouse[0] + scrollLeft;\r\n\r\n            let row_index = Store.visibledatarow.length - 1,\r\n                row = Store.visibledatarow[row_index],\r\n                row_pre = 0;\r\n            let col_location = colLocation(x),\r\n                col = col_location[1],\r\n                col_pre = col_location[0],\r\n                col_index = col_location[2];\r\n\r\n            Store.luckysheet_cols_change_size = true;\r\n            Store.luckysheet_scroll_status = true;\r\n            $(\"#luckysheet-change-size-line\").css({\r\n                height: winH + scrollTop,\r\n                \"border-width\": \"0 1px 0 0\",\r\n                top: 0,\r\n                left: col - 3,\r\n                width: \"1px\",\r\n                display: \"block\",\r\n                cursor: \"ew-resize\",\r\n            });\r\n            $(\r\n                \"#luckysheet-sheettable, #luckysheet-cols-h-c, .luckysheet-cols-h-cells, .luckysheet-cols-h-cells canvas\",\r\n            ).css(\"cursor\", \"ew-resize\");\r\n            Store.luckysheet_cols_change_size_start = [col_pre, col_index];\r\n            $(\"#luckysheet-rightclick-menu\").hide();\r\n            $(\"#luckysheet-cols-h-hover\").hide();\r\n            $(\"#luckysheet-cols-menu-btn\").hide();\r\n            Store.luckysheet_cols_dbclick_times = 0;\r\n            event.stopPropagation();\r\n        })\r\n        .dblclick(function() {\r\n            luckysheetcolsdbclick();\r\n        });\r\n\r\n    // 列标题的下拉箭头\r\n    $(\"#luckysheet-cols-menu-btn\").click(function(event) {\r\n        // *如果禁止前台编辑，则中止下一步操作\r\n        if (!checkIsAllowEdit()) {\r\n            tooltip.info(\"\", locale().pivotTable.errorNotAllowEdit);\r\n            return;\r\n        }\r\n        let $menu = $(\"#luckysheet-rightclick-menu\");\r\n        let offset = $(this).offset();\r\n        $(\"#luckysheet-cols-rows-shift\").show();\r\n        Store.luckysheetRightHeadClickIs = \"column\";\r\n        $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word\").text(locale().rightclick.column);\r\n        $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left\").text(locale().rightclick.left);\r\n        $(\"#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right\").text(locale().rightclick.right);\r\n\r\n        $(\"#luckysheet-cols-rows-add\").show();\r\n        $(\"#luckysheet-cols-rows-data\").hide();\r\n        $(\"#luckysheet-cols-rows-shift\").show();\r\n        $(\"#luckysheet-cols-rows-handleincell\").hide();\r\n\r\n        $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"block\";\r\n        $$(\"#luckysheet-cols-rows-shift .luckysheet-menuseparator\").style.display = \"block\";\r\n\r\n        // 自定义右键菜单：向左向右增加列，删除列，隐藏显示列，设置列宽\r\n        const cellRightClickConfig = luckysheetConfigsetting.cellRightClickConfig;\r\n\r\n        // 如果全部按钮都隐藏，则整个菜单容器也要隐藏\r\n        if (\r\n            !cellRightClickConfig.copy &&\r\n            !cellRightClickConfig.copyAs &&\r\n            !cellRightClickConfig.paste &&\r\n            !cellRightClickConfig.insertColumn &&\r\n            !cellRightClickConfig.deleteColumn &&\r\n            !cellRightClickConfig.hideColumn &&\r\n            !cellRightClickConfig.columnWidth &&\r\n            !cellRightClickConfig.sort\r\n        ) {\r\n            return;\r\n        }\r\n\r\n        $$(\"#luckysheet-top-left-add-selected\").style.display = cellRightClickConfig.insertColumn ? \"block\" : \"none\";\r\n        $$(\"#luckysheet-bottom-right-add-selected\").style.display = cellRightClickConfig.insertColumn\r\n            ? \"block\"\r\n            : \"none\";\r\n        $$(\"#luckysheet-del-selected\").style.display = cellRightClickConfig.deleteColumn ? \"block\" : \"none\";\r\n        $$(\"#luckysheet-hide-selected\").style.display = cellRightClickConfig.hideColumn ? \"block\" : \"none\";\r\n        $$(\"#luckysheet-show-selected\").style.display = cellRightClickConfig.hideColumn ? \"block\" : \"none\";\r\n        $$(\"#luckysheet-column-row-width-selected\").style.display = cellRightClickConfig.columnWidth ? \"block\" : \"none\";\r\n\r\n        // 1. 当一个功能菜单块上方的功能块按钮都隐藏的时候，下方的功能块的顶部分割线也需要隐藏\r\n        if (!cellRightClickConfig.copy && !cellRightClickConfig.copyAs && !cellRightClickConfig.paste) {\r\n            $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"none\";\r\n\r\n            if (\r\n                !cellRightClickConfig.insertColumn &&\r\n                !cellRightClickConfig.deleteColumn &&\r\n                !cellRightClickConfig.hideColumn &&\r\n                !cellRightClickConfig.columnWidth\r\n            ) {\r\n                $$(\"#luckysheet-cols-rows-shift .luckysheet-menuseparator\").style.display = \"none\";\r\n            }\r\n        }\r\n\r\n        // 2. 当一个功能菜单块内所有的按钮都隐藏的时候，它顶部的分割线也需要隐藏掉\r\n        if (\r\n            !cellRightClickConfig.insertColumn &&\r\n            !cellRightClickConfig.deleteColumn &&\r\n            !cellRightClickConfig.hideColumn &&\r\n            !cellRightClickConfig.columnWidth\r\n        ) {\r\n            $$(\"#luckysheet-cols-rows-add .luckysheet-menuseparator\").style.display = \"none\";\r\n        }\r\n\r\n        if (!cellRightClickConfig.sort) {\r\n            $$(\"#luckysheet-cols-rows-shift .luckysheet-menuseparator\").style.display = \"none\";\r\n        }\r\n\r\n        showrightclickmenu($menu, offset.left, offset.top + 18);\r\n        Store.luckysheet_cols_menu_status = true;\r\n    });\r\n\r\n    //向左增加列，向上增加行\r\n    // $(\"#luckysheet-add-lefttop, #luckysheet-add-lefttop_t\").click(function (event) {\r\n    $(\"#luckysheet-top-left-add-selected\").click(function(event) {\r\n        // Click input element, don't comfirm\r\n        if (event.target.nodeName === \"INPUT\") {\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const _locale = locale();\r\n        const locale_drag = _locale.drag;\r\n        const locale_info = _locale.info;\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            if (isEditMode()) {\r\n                alert(locale_drag.noMulti);\r\n            } else {\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let $t = $(this),\r\n            value = $t.find(\"input\").val();\r\n        if (!isRealNum(value)) {\r\n            if (isEditMode()) {\r\n                alert(locale_info.tipInputNumber);\r\n            } else {\r\n                tooltip.info(locale_info.tipInputNumber, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        value = parseInt(value);\r\n\r\n        if (value < 1 || value > 100) {\r\n            if (isEditMode()) {\r\n                alert(locale_info.tipInputNumberLimit);\r\n            } else {\r\n                tooltip.info(locale_info.tipInputNumberLimit, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][0];\r\n\r\n\t\tif(!method.createHookFunction(\"rowInsertBefore\",  st_index, value, \"lefttop\", Store.luckysheetRightHeadClickIs)){ \r\n\t\t\treturn; \r\n\t\t}\r\n\t\tluckysheetextendtable(Store.luckysheetRightHeadClickIs, st_index, value, \"lefttop\");\r\n\r\n    });\r\n\r\n    // When you right-click a cell, a row is inserted before the row by default\r\n    $(\"#luckysheetColsRowsHandleAdd_row\").click(function(event) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if (Store.allowEdit === false) {\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0].row[0];\r\n\r\n\t\tif(!method.createHookFunction(\"rowInsertBefore\",  st_index, 1, \"lefttop\", Store.luckysheetRightHeadClickIs)){ \r\n\t\t\treturn; \r\n\t\t}\r\n        luckysheetextendtable('row', st_index, 1, \"lefttop\");\r\n\r\n\r\n    })\r\n    $(\"#luckysheetColsRowsHandleAdd_column\").click(function (event) {\r\n\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if (Store.allowEdit === false) {\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0].column[0];\r\n        luckysheetextendtable(\"column\", st_index, 1, \"lefttop\");\r\n    });\r\n\r\n    // custom right-click a cell buttton click\r\n    $(\".luckysheetColsRowsHandleAdd_custom\").click(function(clickEvent) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        const cellRightClickConfig = luckysheetConfigsetting.cellRightClickConfig;\r\n        const rowIndex = Store.luckysheet_select_save[0].row[0];\r\n        const columnIndex = Store.luckysheet_select_save[0].column[0];\r\n        if (cellRightClickConfig.customs[Number(clickEvent.currentTarget.dataset.index)]) {\r\n            try {\r\n                cellRightClickConfig.customs[Number(clickEvent.currentTarget.dataset.index)].onClick(\r\n                    clickEvent,\r\n                    event,\r\n                    { rowIndex, columnIndex },\r\n                );\r\n            } catch (e) {\r\n                console.error(\"custom click error\", e);\r\n            }\r\n        }\r\n    });\r\n    // Add the row up, and click the text area to trigger the confirmation instead of clicking the confirmation button to enhance the experience\r\n    // $(\"#luckysheet-addTopRows\").click(function (event) {\r\n    // $(\"#luckysheetColsRowsHandleAdd_sub .luckysheet-cols-menuitem:first-child\").click(function (event) {\r\n\r\n    //     // Click input element, don't comfirm\r\n    //     if(event.target.nodeName === 'INPUT'){\r\n    //         return;\r\n    //     }\r\n\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     const _locale = locale();\r\n    //     const locale_drag = _locale.drag;\r\n    //     const locale_info = _locale.info;\r\n\r\n    //     if(Store.luckysheet_select_save.length > 1){\r\n    //         if(isEditMode()){\r\n    //             alert(locale_drag.noMulti);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_drag.noMulti, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     let $t = $(this), value = $t.find(\"input\").val();\r\n    //     if (!isRealNum(value)) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumber);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumber, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     value = parseInt(value);\r\n\r\n    //     if (value < 1 || value > 100) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumberLimit);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumberLimit, \"\");\r\n    //         }\r\n    //         return;\r\n    //     }\r\n\r\n    //     let st_index = Store.luckysheet_select_save[0].row[0];\r\n    //     luckysheetextendtable('row', st_index, value, \"lefttop\");\r\n\r\n    //     $(\"#luckysheetColsRowsHandleAdd_sub\").hide();\r\n    // })\r\n\r\n    // // input输入时阻止冒泡，禁止父级元素的确认事件触发\r\n    // $(\"input.luckysheet-mousedown-cancel\").click(function(event) {\r\n    //     event.stopPropagation;\r\n    // })\r\n\r\n    // $(\"#luckysheet-addLeftCols\").click(function (event) {\r\n    // $(\"#luckysheetColsRowsHandleAdd_sub .luckysheet-cols-menuitem:nth-child(3)\").click(function (event) {\r\n\r\n    //     // Click input element, don't comfirm\r\n    //     if(event.target.nodeName === 'INPUT'){\r\n    //         return;\r\n    //     }\r\n\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     const _locale = locale();\r\n    //     const locale_drag = _locale.drag;\r\n    //     const locale_info = _locale.info;\r\n\r\n    //     if(Store.luckysheet_select_save.length > 1){\r\n    //         if(isEditMode()){\r\n    //             alert(locale_drag.noMulti);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_drag.noMulti, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     let $t = $(this), value = $t.find(\"input\").val();\r\n    //     if (!isRealNum(value)) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumber);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumber, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     value = parseInt(value);\r\n\r\n    //     if (value < 1 || value > 100) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumberLimit);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumberLimit, \"\");\r\n    //         }\r\n    //         return;\r\n    //     }\r\n\r\n    //     let st_index = Store.luckysheet_select_save[0].column[0];\r\n    //     luckysheetextendtable('column', st_index, value, \"lefttop\");\r\n\r\n    //     $(\"#luckysheetColsRowsHandleAdd_sub\").hide();\r\n\r\n    // })\r\n\r\n    //向右增加列，向下增加行\r\n    // $(\"#luckysheet-add-rightbottom, #luckysheet-add-rightbottom_t\").click(function (event) {\r\n    $(\"#luckysheet-bottom-right-add-selected\").click(function(event) {\r\n        // Click input element, don't comfirm\r\n        if (event.target.nodeName === \"INPUT\") {\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const _locale = locale();\r\n        const locale_drag = _locale.drag;\r\n        const locale_info = _locale.info;\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            if (isEditMode()) {\r\n                alert(locale_drag.noMulti);\r\n            } else {\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let $t = $(this),\r\n            value = $t.find(\"input\").val();\r\n        if (!isRealNum(value)) {\r\n            if (isEditMode()) {\r\n                alert(locale_info.tipInputNumber);\r\n            } else {\r\n                tooltip.info(locale_info.tipInputNumber, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        value = parseInt(value);\r\n\r\n        if (value < 1 || value > 100) {\r\n            if (isEditMode()) {\r\n                alert(locale_info.tipInputNumberLimit);\r\n            } else {\r\n                tooltip.info(locale_info.tipInputNumberLimit, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][1];\r\n\r\n\t\tif(!method.createHookFunction(\"rowInsertBefore\",  st_index, value, \"rightbottom\", Store.luckysheetRightHeadClickIs)){\r\n\t\t\treturn; \r\n\t\t}\r\n\r\n        luckysheetextendtable(Store.luckysheetRightHeadClickIs, st_index, value, \"rightbottom\");\r\n    });\r\n\r\n    // $(\"#luckysheet-addBottomRows\").click(function (event) {\r\n    // $(\"#luckysheetColsRowsHandleAdd_sub .luckysheet-cols-menuitem:nth-child(2)\").click(function (event) {\r\n\r\n    //      // Click input element, don't comfirm\r\n    //      if(event.target.nodeName === 'INPUT'){\r\n    //         return;\r\n    //     }\r\n\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     const _locale = locale();\r\n    //     const locale_drag = _locale.drag;\r\n    //     const locale_info = _locale.info;\r\n\r\n    //     if(Store.luckysheet_select_save.length > 1){\r\n    //         if(isEditMode()){\r\n    //             alert(locale_drag.noMulti);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_drag.noMulti, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     let $t = $(this), value = $t.find(\"input\").val();\r\n    //     if (!isRealNum(value)) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumber);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumber, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     value = parseInt(value);\r\n\r\n    //     if (value < 1 || value > 100) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumberLimit);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumberLimit, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     let st_index = Store.luckysheet_select_save[0].row[1];\r\n    //     luckysheetextendtable('row', st_index, value, \"rightbottom\");\r\n\r\n    //     $(\"#luckysheetColsRowsHandleAdd_sub\").hide();\r\n\r\n    // });\r\n    // $(\"#luckysheet-addRightCols\").click(function (event) {\r\n    // $(\"#luckysheetColsRowsHandleAdd_sub .luckysheet-cols-menuitem:nth-child(4)\").click(function (event) {\r\n\r\n    //     // Click input element, don't comfirm\r\n    //     if(event.target.nodeName === 'INPUT'){\r\n    //         return;\r\n    //     }\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     const _locale = locale();\r\n    //     const locale_drag = _locale.drag;\r\n    //     const locale_info = _locale.info;\r\n\r\n    //     if(Store.luckysheet_select_save.length > 1){\r\n    //         if(isEditMode()){\r\n    //             alert(locale_drag.noMulti);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_drag.noMulti, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     let $t = $(this), value = $t.find(\"input\").val();\r\n    //     if (!isRealNum(value)) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumber);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumber, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     value = parseInt(value);\r\n\r\n    //     if (value < 1 || value > 100) {\r\n    //         if(isEditMode()){\r\n    //             alert(locale_info.tipInputNumberLimit);\r\n    //         }\r\n    //         else{\r\n    //             tooltip.info(locale_info.tipInputNumberLimit, \"\");\r\n    //         }\r\n\r\n    //         return;\r\n    //     }\r\n\r\n    //     let st_index = Store.luckysheet_select_save[0].column[1];\r\n    //     luckysheetextendtable('column', st_index, value, \"rightbottom\");\r\n\r\n    //     $(\"#luckysheetColsRowsHandleAdd_sub\").hide();\r\n\r\n    // });\r\n\r\n    //删除选中行列\r\n    $(\"#luckysheet-del-selected, #luckysheet-del-selected_t\").click(function(event) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const locale_drag = locale().drag;\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            if (Store.luckysheetRightHeadClickIs == \"row\") {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                } else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            } else if (Store.luckysheetRightHeadClickIs == \"column\") {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                } else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            }\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][0],\r\n            ed_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][1];\r\n\r\n        if(!method.createHookFunction(\"rowDeleteBefore\", st_index, ed_index, Store.luckysheetRightHeadClickIs)){\r\n        \treturn; \r\n\r\n        }\r\n        luckysheetdeletetable(Store.luckysheetRightHeadClickIs, st_index, ed_index);\r\n    });\r\n    $(\"#luckysheet-delRows\").click(function(event) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const locale_drag = locale().drag;\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            if (Store.luckysheetRightHeadClickIs == \"row\") {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                } else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            } else if (Store.luckysheetRightHeadClickIs == \"column\") {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                } else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            }\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0].row[0],\r\n            ed_index = Store.luckysheet_select_save[0].row[1];\r\n\r\n\t\tif(!method.createHookFunction(\"rowDeleteBefore\", st_index, ed_index, 'row')){\r\n\t\t\treturn; \r\n\t\t}\r\n        luckysheetdeletetable('row', st_index, ed_index);\r\n    })\r\n    $(\"#luckysheet-delCols\").click(function (event) {\r\n\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const locale_drag = locale().drag;\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            if (Store.luckysheetRightHeadClickIs == \"row\") {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                } else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            } else if (Store.luckysheetRightHeadClickIs == \"column\") {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                } else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            }\r\n            return;\r\n        }\r\n\r\n        let st_index = Store.luckysheet_select_save[0].column[0],\r\n            ed_index = Store.luckysheet_select_save[0].column[1];\r\n        luckysheetdeletetable(\"column\", st_index, ed_index);\r\n    });\r\n\r\n    //隐藏选中行列\r\n    $(\"#luckysheet-hide-selected\").click(function(event) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const locale_drag = locale().drag;\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            if (Store.luckysheetRightHeadClickIs == \"row\") {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                } else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            } else if (Store.luckysheetRightHeadClickIs == \"column\") {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                } else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            }\r\n            return;\r\n        }\r\n\r\n        // 隐藏行\r\n        if (Store.luckysheetRightHeadClickIs == \"row\") {\r\n            if (!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatRows\")) {\r\n                return;\r\n            }\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if (cfg[\"rowhidden\"] == null) {\r\n                cfg[\"rowhidden\"] = {};\r\n            }\r\n\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                let r1 = Store.luckysheet_select_save[s].row[0],\r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n\r\n                for (let r = r1; r <= r2; r++) {\r\n                    cfg[\"rowhidden\"][r] = 0;\r\n                }\r\n            }\r\n\r\n            //保存撤销\r\n            if (Store.clearjfundo) {\r\n                let redo = {};\r\n                redo[\"type\"] = \"showHidRows\";\r\n                redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n                redo[\"config\"] = $.extend(true, {}, Store.config);\r\n                redo[\"curconfig\"] = cfg;\r\n\r\n                Store.jfundo.length = 0;\r\n                Store.jfredo.push(redo);\r\n            }\r\n\r\n            //config\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowhidden\"], { k: \"rowhidden\" });\r\n\r\n            //行高、列宽 刷新\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n        // 隐藏列\r\n        else if (Store.luckysheetRightHeadClickIs == \"column\") {\r\n            if (!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatColumns\")) {\r\n                return;\r\n            }\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if (cfg[\"colhidden\"] == null) {\r\n                cfg[\"colhidden\"] = {};\r\n            }\r\n\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                let c1 = Store.luckysheet_select_save[s].column[0],\r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                for (let c = c1; c <= c2; c++) {\r\n                    cfg[\"colhidden\"][c] = 0;\r\n                }\r\n            }\r\n\r\n            //保存撤销\r\n            if (Store.clearjfundo) {\r\n                let redo = {};\r\n                redo[\"type\"] = \"showHidCols\";\r\n                redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n                redo[\"config\"] = $.extend(true, {}, Store.config);\r\n                redo[\"curconfig\"] = cfg;\r\n\r\n                Store.jfundo.length = 0;\r\n                Store.jfredo.push(redo);\r\n            }\r\n\r\n            //config\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"colhidden\"], { k: \"colhidden\" });\r\n\r\n            //行高、列宽 刷新\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n    });\r\n\r\n    //取消隐藏选中行列\r\n    $(\"#luckysheet-show-selected\").click(function(event) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const locale_drag = locale().drag;\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            if (Store.luckysheetRightHeadClickIs == \"row\") {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                } else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            } else if (Store.luckysheetRightHeadClickIs == \"column\") {\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noMulti);\r\n                } else {\r\n                    tooltip.info(locale_drag.noMulti, \"\");\r\n                }\r\n            }\r\n            return;\r\n        }\r\n\r\n        // 取消隐藏行\r\n        if (Store.luckysheetRightHeadClickIs == \"row\") {\r\n            if (!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatRows\")) {\r\n                return;\r\n            }\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if (cfg[\"rowhidden\"] == null) {\r\n                return;\r\n            }\r\n\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                let r1 = Store.luckysheet_select_save[s].row[0],\r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n\r\n                for (let r = r1; r <= r2; r++) {\r\n                    delete cfg[\"rowhidden\"][r];\r\n                }\r\n            }\r\n\r\n            //保存撤销\r\n            if (Store.clearjfundo) {\r\n                let redo = {};\r\n                redo[\"type\"] = \"showHidRows\";\r\n                redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n                redo[\"config\"] = $.extend(true, {}, Store.config);\r\n                redo[\"curconfig\"] = cfg;\r\n\r\n                Store.jfundo.length = 0;\r\n                Store.jfredo.push(redo);\r\n            }\r\n\r\n            //config\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowhidden\"], { k: \"rowhidden\" });\r\n\r\n            //行高、列宽 刷新\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        } else if (Store.luckysheetRightHeadClickIs == \"column\") {\r\n            if (!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatColumns\")) {\r\n                return;\r\n            }\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if (cfg[\"colhidden\"] == null) {\r\n                return;\r\n            }\r\n\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                let c1 = Store.luckysheet_select_save[s].column[0],\r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                for (let c = c1; c <= c2; c++) {\r\n                    delete cfg[\"colhidden\"][c];\r\n                }\r\n            }\r\n\r\n            //保存撤销\r\n            if (Store.clearjfundo) {\r\n                let redo = {};\r\n                redo[\"type\"] = \"showHidCols\";\r\n                redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n                redo[\"config\"] = $.extend(true, {}, Store.config);\r\n                redo[\"curconfig\"] = cfg;\r\n\r\n                Store.jfundo.length = 0;\r\n                Store.jfredo.push(redo);\r\n            }\r\n\r\n            //config\r\n            Store.config = cfg;\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"colhidden\"], { k: \"colhidden\" });\r\n\r\n            //行高、列宽 刷新\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n    });\r\n    //隐藏、显示行\r\n    // $(\"#luckysheet-hidRows\").click(function (event) {\r\n    //     if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatRows\")){\r\n    //         return;\r\n    //     }\r\n\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     let cfg = $.extend(true, {}, Store.config);\r\n    //     if(cfg[\"rowhidden\"] == null){\r\n    //         cfg[\"rowhidden\"] = {};\r\n    //     }\r\n\r\n    //     for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n    //         let r1 = Store.luckysheet_select_save[s].row[0],\r\n    //             r2 = Store.luckysheet_select_save[s].row[1];\r\n\r\n    //         for(let r = r1; r <= r2; r++){\r\n    //             cfg[\"rowhidden\"][r] = 0;\r\n    //         }\r\n    //     }\r\n\r\n    //     //保存撤销\r\n    //     if(Store.clearjfundo){\r\n    //         let redo = {};\r\n    //         redo[\"type\"] = \"showHidRows\";\r\n    //         redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n    //         redo[\"config\"] = $.extend(true, {}, Store.config);\r\n    //         redo[\"curconfig\"] = cfg;\r\n\r\n    //         Store.jfundo.length  = 0;\r\n    //         Store.jfredo.push(redo);\r\n    //     }\r\n\r\n    //     //config\r\n    //     Store.config = cfg;\r\n    //     Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n    //     server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n\r\n    //     //行高、列宽 刷新\r\n    //     jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    // })\r\n    // $(\"#luckysheet-showHidRows\").click(function (event) {\r\n    //     if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatRows\")){\r\n    //         return;\r\n    //     }\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     let cfg = $.extend(true, {}, Store.config);\r\n    //     if(cfg[\"rowhidden\"] == null){\r\n    //         return;\r\n    //     }\r\n\r\n    //     for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n    //         let r1 = Store.luckysheet_select_save[s].row[0],\r\n    //             r2 = Store.luckysheet_select_save[s].row[1];\r\n\r\n    //         for(let r = r1; r <= r2; r++){\r\n    //             delete cfg[\"rowhidden\"][r];\r\n    //         }\r\n    //     }\r\n\r\n    //     //保存撤销\r\n    //     if(Store.clearjfundo){\r\n    //         let redo = {};\r\n    //         redo[\"type\"] = \"showHidRows\";\r\n    //         redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n    //         redo[\"config\"] = $.extend(true, {}, Store.config);\r\n    //         redo[\"curconfig\"] = cfg;\r\n\r\n    //         Store.jfundo.length  = 0;\r\n    //         Store.jfredo.push(redo);\r\n    //     }\r\n\r\n    //     //config\r\n    //     Store.config = cfg;\r\n    //     Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n    //     server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowhidden\"], { \"k\": \"rowhidden\" });\r\n\r\n    //     //行高、列宽 刷新\r\n    //     jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    // })\r\n\r\n    //隐藏、显示列\r\n    // $(\"#luckysheet-hidCols\").click(function (event) {\r\n    //     if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatColumns\")){\r\n    //         return;\r\n    //     }\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     let cfg = $.extend(true, {}, Store.config);\r\n    //     if(cfg[\"colhidden\"] == null){\r\n    //         cfg[\"colhidden\"] = {};\r\n    //     }\r\n\r\n    //     for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n    //         let c1 = Store.luckysheet_select_save[s].column[0],\r\n    //             c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n    //         for(let c = c1; c <= c2; c++){\r\n    //             cfg[\"colhidden\"][c] = 0;\r\n    //         }\r\n    //     }\r\n\r\n    //     //保存撤销\r\n    //     if(Store.clearjfundo){\r\n    //         let redo = {};\r\n    //         redo[\"type\"] = \"showHidCols\";\r\n    //         redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n    //         redo[\"config\"] = $.extend(true, {}, Store.config);\r\n    //         redo[\"curconfig\"] = cfg;\r\n\r\n    //         Store.jfundo.length  = 0;\r\n    //         Store.jfredo.push(redo);\r\n    //     }\r\n\r\n    //     //config\r\n    //     Store.config = cfg;\r\n    //     Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n    //     server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"colhidden\"], { \"k\": \"colhidden\" });\r\n\r\n    //     //行高、列宽 刷新\r\n    //     jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    // })\r\n    // $(\"#luckysheet-showHidCols\").click(function (event) {\r\n    //     if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatColumns\")){\r\n    //         return;\r\n    //     }\r\n    //     $(\"#luckysheet-rightclick-menu\").hide();\r\n    //     luckysheetContainerFocus();\r\n\r\n    //     let cfg = $.extend(true, {}, Store.config);\r\n    //     if(cfg[\"colhidden\"] == null){\r\n    //         return;\r\n    //     }\r\n\r\n    //     for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n    //         let c1 = Store.luckysheet_select_save[s].column[0],\r\n    //             c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n    //         for(let c = c1; c <= c2; c++){\r\n    //             delete cfg[\"colhidden\"][c];\r\n    //         }\r\n    //     }\r\n\r\n    //     //保存撤销\r\n    //     if(Store.clearjfundo){\r\n    //         let redo = {};\r\n    //         redo[\"type\"] = \"showHidCols\";\r\n    //         redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n    //         redo[\"config\"] = $.extend(true, {}, Store.config);\r\n    //         redo[\"curconfig\"] = cfg;\r\n\r\n    //         Store.jfundo.length  = 0;\r\n    //         Store.jfredo.push(redo);\r\n    //     }\r\n\r\n    //     //config\r\n    //     Store.config = cfg;\r\n    //     Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n    //     server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"colhidden\"], { \"k\": \"colhidden\" });\r\n\r\n    //     //行高、列宽 刷新\r\n    //     jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    // })\r\n\r\n    //删除单元格（左移、上移）\r\n    $(\"#luckysheet-delCellsMoveLeft\").click(function(event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n        const locale_drag = locale().drag;\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            if (isEditMode()) {\r\n                alert(locale_drag.noMulti);\r\n            } else {\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let str = Store.luckysheet_select_save[0].row[0],\r\n            edr = Store.luckysheet_select_save[0].row[1],\r\n            stc = Store.luckysheet_select_save[0].column[0],\r\n            edc = Store.luckysheet_select_save[0].column[1];\r\n\r\n        luckysheetDeleteCell(\"moveLeft\", str, edr, stc, edc);\r\n    });\r\n    $(\"#luckysheet-delCellsMoveUp\").click(function(event) {\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        const locale_drag = locale().drag;\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            if (isEditMode()) {\r\n                alert(locale_drag.noMulti);\r\n            } else {\r\n                tooltip.info(locale_drag.noMulti, \"\");\r\n            }\r\n            return;\r\n        }\r\n\r\n        let str = Store.luckysheet_select_save[0].row[0],\r\n            edr = Store.luckysheet_select_save[0].row[1],\r\n            stc = Store.luckysheet_select_save[0].column[0],\r\n            edc = Store.luckysheet_select_save[0].column[1];\r\n\r\n        luckysheetDeleteCell(\"moveUp\", str, edr, stc, edc);\r\n    });\r\n\r\n    //清除单元格内容\r\n    $(\"#luckysheet-delete-text\").click(function() {\r\n        if (!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)) {\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        if (Store.allowEdit === false) {\r\n            return;\r\n        }\r\n\r\n        if (Store.luckysheet_select_save.length > 0) {\r\n            let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n            let has_PartMC = false;\r\n\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                let r1 = Store.luckysheet_select_save[s].row[0],\r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0],\r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                if (hasPartMC(Store.config, r1, r2, c1, c2)) {\r\n                    has_PartMC = true;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (has_PartMC) {\r\n                const locale_drag = locale().drag;\r\n\r\n                if (isEditMode()) {\r\n                    alert(locale_drag.noPartMerge);\r\n                } else {\r\n                    tooltip.info(locale_drag.noPartMerge, \"\");\r\n                }\r\n\r\n                return;\r\n            }\r\n\r\n            const file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n            const hyperlink = file.hyperlink && $.extend(true, {}, file.hyperlink);\r\n            let hyperlinkUpdated;\r\n\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                let r1 = Store.luckysheet_select_save[s].row[0],\r\n                    r2 = Store.luckysheet_select_save[s].row[1];\r\n                let c1 = Store.luckysheet_select_save[s].column[0],\r\n                    c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                for (let r = r1; r <= r2; r++) {\r\n                    for (let c = c1; c <= c2; c++) {\r\n                        if (pivotTable.isPivotRange(r, c)) {\r\n                            continue;\r\n                        }\r\n\r\n                        if (getObjType(d[r][c]) == \"object\") {\r\n                            delete d[r][c][\"m\"];\r\n                            delete d[r][c][\"v\"];\r\n\r\n                            if (d[r][c][\"f\"] != null) {\r\n                                delete d[r][c][\"f\"];\r\n                                formula.delFunctionGroup(r, c, Store.currentSheetIndex);\r\n\r\n                                delete d[r][c][\"spl\"];\r\n                            }\r\n\r\n                            if (d[r][c][\"ct\"] != null && d[r][c][\"ct\"].t == \"inlineStr\") {\r\n                                delete d[r][c][\"ct\"];\r\n                            }\r\n                        } else {\r\n                            d[r][c] = null;\r\n                        }\r\n                        // 同步清除 hyperlink\r\n                        if (hyperlink?.[`${r}_${c}`]) {\r\n                            delete hyperlink[`${r}_${c}`];\r\n                            hyperlinkUpdated = true;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            jfrefreshgrid(d, Store.luckysheet_select_save, hyperlinkUpdated && { hyperlink });\r\n\r\n            // 清空编辑框的内容\r\n            // 备注：在functionInputHanddler方法中会把该标签的内容拷贝到 #luckysheet-functionbox-cell\r\n            $(\"#luckysheet-rich-text-editor\").html(\"\");\r\n        }\r\n    });\r\n\r\n    //行高列宽设置\r\n    // $(\"#luckysheet-rows-cols-changesize\").click(function(){\r\n    $(\"#luckysheet-column-row-width-selected\").click(function(event) {\r\n        // Click input element, don't comfirm\r\n        if (event.target.nodeName === \"INPUT\") {\r\n            return;\r\n        }\r\n\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        luckysheetContainerFocus();\r\n\r\n        // let size = parseInt($(this).siblings(\"input[type='number']\").val().trim());\r\n        let size = parseInt(\r\n            $(this)\r\n                .closest(\".luckysheet-cols-menuitem\")\r\n                .find(\"input[type='number']\")\r\n                .val()\r\n                .trim(),\r\n        );\r\n\r\n        const locale_info = locale().info;\r\n\r\n        /* 对异常情况进行判断：NaN */\r\n        if (isNaN(size)) {\r\n            tooltip.info(locale_info.tipInputNumber, \"\");\r\n            return;\r\n        }\r\n\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        let type;\r\n        let images = null;\r\n\r\n        if (Store.luckysheetRightHeadClickIs == \"row\") {\r\n            if (!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatRows\")) {\r\n                return;\r\n            }\r\n\r\n            if (size < 0 || size > 545) {\r\n                if (isEditMode()) {\r\n                    alert(locale_info.tipRowHeightLimit);\r\n                } else {\r\n                    tooltip.info(locale_info.tipRowHeightLimit, \"\");\r\n                }\r\n                return;\r\n            }\r\n\r\n            type = \"resizeR\";\r\n\r\n            if (cfg[\"rowlen\"] == null) {\r\n                cfg[\"rowlen\"] = {};\r\n            }\r\n\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                let r1 = Store.luckysheet_select_save[s].row[0];\r\n                let r2 = Store.luckysheet_select_save[s].row[1];\r\n\r\n                for (let r = r1; r <= r2; r++) {\r\n                    cfg[\"rowlen\"][r] = size;\r\n\r\n                    images = imageCtrl.moveChangeSize(\"row\", r, size);\r\n                }\r\n            }\r\n        } else if (Store.luckysheetRightHeadClickIs == \"column\") {\r\n            if (!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"formatColumns\")) {\r\n                return;\r\n            }\r\n\r\n            if (size < 0 || size > 2038) {\r\n                if (isEditMode()) {\r\n                    alert(locale_info.tipColumnWidthLimit);\r\n                } else {\r\n                    tooltip.info(locale_info.tipColumnWidthLimit, \"\");\r\n                }\r\n                return;\r\n            }\r\n\r\n            type = \"resizeC\";\r\n\r\n            if (cfg[\"columnlen\"] == null) {\r\n                cfg[\"columnlen\"] = {};\r\n            }\r\n\r\n            for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n                let c1 = Store.luckysheet_select_save[s].column[0];\r\n                let c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n                for (let c = c1; c <= c2; c++) {\r\n                    cfg[\"columnlen\"][c] = size;\r\n\r\n                    images = imageCtrl.moveChangeSize(\"column\", c, size);\r\n                }\r\n            }\r\n        }\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length = 0;\r\n            Store.jfredo.push({\r\n                type: \"resize\",\r\n                ctrlType: type,\r\n                sheetIndex: Store.currentSheetIndex,\r\n                config: $.extend(true, {}, Store.config),\r\n                curconfig: $.extend(true, {}, cfg),\r\n                images: $.extend(true, {}, imageCtrl.images),\r\n                curImages: $.extend(true, {}, images),\r\n            });\r\n        }\r\n\r\n        //config\r\n        Store.config = cfg;\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n        //images\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].images = images;\r\n        server.saveParam(\"all\", Store.currentSheetIndex, images, { k: \"images\" });\r\n        imageCtrl.images = images;\r\n        imageCtrl.allImagesShow();\r\n\r\n        if (Store.luckysheetRightHeadClickIs == \"row\") {\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"rowlen\"], { k: \"rowlen\" });\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, null);\r\n        } else if (Store.luckysheetRightHeadClickIs == \"column\") {\r\n            server.saveParam(\"cg\", Store.currentSheetIndex, cfg[\"columnlen\"], { k: \"columnlen\" });\r\n            jfrefreshgrid_rhcw(null, Store.flowdata[0].length);\r\n        }\r\n    });\r\n}\r\n\r\nfunction luckysheetcolsdbclick() {\r\n    Store.luckysheet_cols_change_size = false;\r\n\r\n    $(\"#luckysheet-change-size-line\").hide();\r\n    $(\"#luckysheet-cols-change-size\").css(\"opacity\", 0);\r\n    $(\"#luckysheet-sheettable, #luckysheet-cols-h-c, .luckysheet-cols-h-cells, .luckysheet-cols-h-cells canvas\").css(\r\n        \"cursor\",\r\n        \"default\",\r\n    );\r\n\r\n    let mouse = mouseposition(event.pageX, event.pageY);\r\n    let scrollLeft = $(\"#luckysheet-cols-h-c\").scrollLeft();\r\n    let x = mouse[0] + scrollLeft;\r\n\r\n    let colIndex = colLocation(x)[2];\r\n    let d = editor.deepCopyFlowData(Store.flowdata);\r\n    let canvas = $(\"#luckysheetTableContent\")\r\n        .get(0)\r\n        .getContext(\"2d\");\r\n\r\n    let cfg = $.extend(true, {}, Store.config);\r\n    if (cfg[\"columnlen\"] == null) {\r\n        cfg[\"columnlen\"] = {};\r\n    }\r\n\r\n    let matchColumn = {};\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop(),\r\n        drawHeight = Store.luckysheetTableContentHW[1];\r\n    let dataset_row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n    let dataset_row_ed = luckysheet_searcharray(Store.visibledatarow, scrollTop + drawHeight);\r\n    dataset_row_ed += dataset_row_ed - dataset_row_st;\r\n    if (dataset_row_ed >= d.length) {\r\n        dataset_row_ed = d.length - 1;\r\n    }\r\n\r\n    for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n        let c1 = Store.luckysheet_select_save[s].column[0],\r\n            c2 = Store.luckysheet_select_save[s].column[1];\r\n\r\n        if (colIndex < c1 || colIndex > c2) {\r\n            if (colIndex in matchColumn) {\r\n                //此列已计算过\r\n                continue;\r\n            }\r\n\r\n            let currentColLen = Store.defaultcollen;\r\n\r\n            for (let r = dataset_row_st; r <= dataset_row_ed; r++) {\r\n                let cell = d[r][colIndex];\r\n\r\n                if (cell == null || (isRealNull(cell.v) && !isInlineStringCell(cell))) {\r\n                    continue;\r\n                }\r\n\r\n                // let fontset = luckysheetfontformat(cell);\r\n                // canvas.font = fontset;\r\n\r\n                // let value = getcellvalue(r, colIndex, d, \"m\").toString(); //单元格文本\r\n                // let textMetrics = getMeasureText(value, canvas).width; //文本宽度\r\n                let cellWidth = colLocationByIndex(colIndex)[1] - colLocationByIndex(colIndex)[0] - 2;\r\n                let textInfo = getCellTextInfo(cell, canvas, {\r\n                    r: r,\r\n                    c: colIndex,\r\n                    cellWidth: cellWidth,\r\n                });\r\n\r\n                let computeRowlen = 0;\r\n                // console.log(\"rowlen\", textInfo);\r\n                if (textInfo != null) {\r\n                    computeRowlen = textInfo.textWidthAll;\r\n                }\r\n\r\n                if (computeRowlen + 6 > currentColLen) {\r\n                    currentColLen = computeRowlen + 6;\r\n                }\r\n            }\r\n\r\n            if (currentColLen != Store.defaultcollen) {\r\n                cfg[\"columnlen\"][colIndex] = currentColLen;\r\n                if (cfg[\"customWidth\"]) {\r\n                    delete cfg[\"customWidth\"][colIndex];\r\n                }\r\n            }\r\n\r\n            matchColumn[colIndex] = 1;\r\n        } else {\r\n            for (let c = c1; c <= c2; c++) {\r\n                if (c in matchColumn) {\r\n                    //此列已计算过\r\n                    continue;\r\n                }\r\n\r\n                let currentColLen = Store.defaultcollen;\r\n\r\n                for (let r = dataset_row_st; r <= dataset_row_ed; r++) {\r\n                    let cell = d[r][c];\r\n\r\n                    if (cell == null || (isRealNull(cell.v) && !isInlineStringCell(cell))) {\r\n                        continue;\r\n                    }\r\n\r\n                    // let fontset = luckysheetfontformat(cell);\r\n                    // canvas.font = fontset;\r\n\r\n                    // let value = getcellvalue(r, c, d, \"m\").toString(); //单元格文本\r\n                    // let textMetrics = getMeasureText(value, canvas).width; //文本宽度\r\n\r\n                    // if(textMetrics + 6 > currentColLen){\r\n                    //     currentColLen = textMetrics + 6;\r\n                    // }\r\n\r\n                    let cellWidth = colLocationByIndex(c)[1] - colLocationByIndex(c)[0] - 2;\r\n                    let textInfo = getCellTextInfo(cell, canvas, {\r\n                        r: r,\r\n                        c: c,\r\n                        cellWidth: cellWidth,\r\n                    });\r\n\r\n                    let computeRowlen = 0;\r\n                    // console.log(\"rowlen\", textInfo);\r\n                    if (textInfo != null) {\r\n                        computeRowlen = textInfo.textWidthAll;\r\n                    }\r\n\r\n                    if (computeRowlen + 6 > currentColLen) {\r\n                        currentColLen = computeRowlen + 6;\r\n                    }\r\n                }\r\n\r\n                if (currentColLen != Store.defaultcollen) {\r\n                    cfg[\"columnlen\"][c] = currentColLen;\r\n                    if (cfg[\"customWidth\"]) {\r\n                        delete cfg[\"customWidth\"][c];\r\n                    }\r\n                }\r\n\r\n                matchColumn[c] = 1;\r\n            }\r\n        }\r\n    }\r\n\r\n    jfrefreshgridall(\r\n        Store.flowdata[0].length,\r\n        Store.flowdata.length,\r\n        Store.flowdata,\r\n        cfg,\r\n        Store.luckysheet_select_save,\r\n        \"resizeC\",\r\n        \"columnlen\",\r\n    );\r\n}\r\n\r\n/**\r\n *\r\n * @param {String} type:delete type,\r\n * @param {*} st_index\r\n * @param {*} ed_index\r\n */\r\n// Delete row api\r\nexport function deleteRows(type, st_index, ed_index) {\r\n    Store.luckysheetRightHeadClickIs = \"column\";\r\n}\r\n\r\n// Delete column api\r\nexport function deleteColumns() {}\r\n"
  },
  {
    "path": "src/controllers/searchReplace.js",
    "content": "import { replaceHtml, chatatABC } from \"../utils/util\";\r\nimport { getSheetIndex } from \"../methods/get\";\r\nimport { modelHTML, keycode } from \"./constant\";\r\nimport { selectHightlightShow } from \"./select\";\r\nimport sheetmanage from \"./sheetmanage\";\r\nimport { isEditMode } from \"../global/validate\";\r\nimport { valueShowEs } from \"../global/format\";\r\nimport { setcellvalue } from \"../global/setdata\";\r\nimport { jfrefreshgrid } from \"../global/refresh\";\r\nimport editor from \"../global/editor\";\r\nimport tooltip from \"../global/tooltip\";\r\nimport func_methods from \"../global/func_methods\";\r\nimport Store from \"../store\";\r\nimport locale from \"../locale/locale\";\r\nimport { checkProtectionLocked } from \"./protection\";\r\nimport escapeHtml from \"escape-html\";\r\n\r\n//查找替换\r\nconst luckysheetSearchReplace = {\r\n    createDialog: function(source) {\r\n        $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        $(\"#luckysheet-search-replace\").remove();\r\n\r\n        const _locale = locale();\r\n        const locale_findAndReplace = _locale.findAndReplace;\r\n        const locale_button = _locale.button;\r\n\r\n        let content =\r\n            '<div class=\"tabBox\">' +\r\n            '<span id=\"searchTab\">' +\r\n            locale_findAndReplace.find +\r\n            \"</span>\" +\r\n            '<span id=\"replaceTab\">' +\r\n            locale_findAndReplace.replace +\r\n            \"</span>\" +\r\n            \"</div>\" +\r\n            '<div class=\"ctBox\">' +\r\n            '<div class=\"inputBox\">' +\r\n            '<div class=\"textboxs\" id=\"searchInput\">' +\r\n            locale_findAndReplace.findTextbox +\r\n            '：<input class=\"formulaInputFocus\" spellcheck=\"false\" value=\"\"/></div>' +\r\n            '<div class=\"textboxs\" id=\"replaceInput\">' +\r\n            locale_findAndReplace.replaceTextbox +\r\n            '：<input class=\"formulaInputFocus\" spellcheck=\"false\" value=\"\"/></div>' +\r\n            '<div class=\"checkboxs\">' +\r\n            '<div id=\"regCheck\">' +\r\n            '<input type=\"checkbox\"/>' +\r\n            \"<span>\" +\r\n            locale_findAndReplace.regexTextbox +\r\n            \"</span>\" +\r\n            \"</div>\" +\r\n            '<div id=\"wordCheck\">' +\r\n            '<input type=\"checkbox\"/>' +\r\n            \"<span>\" +\r\n            locale_findAndReplace.wholeTextbox +\r\n            \"</span>\" +\r\n            \"</div>\" +\r\n            '<div id=\"caseCheck\">' +\r\n            '<input type=\"checkbox\"/>' +\r\n            \"<span>\" +\r\n            locale_findAndReplace.distinguishTextbox +\r\n            \"</span>\" +\r\n            \"</div>\" +\r\n            \"</div>\" +\r\n            \"</div>\" +\r\n            '<div class=\"btnBox\">' +\r\n            '<button id=\"replaceAllBtn\" class=\"btn btn-default\">' +\r\n            locale_findAndReplace.allReplaceBtn +\r\n            \"</button>\" +\r\n            '<button id=\"replaceBtn\" class=\"btn btn-default\">' +\r\n            locale_findAndReplace.replaceBtn +\r\n            \"</button>\" +\r\n            '<button id=\"searchAllBtn\" class=\"btn btn-default\">' +\r\n            locale_findAndReplace.allFindBtn +\r\n            \"</button>\" +\r\n            '<button id=\"searchNextBtn\" class=\"btn btn-default\">' +\r\n            locale_findAndReplace.findBtn +\r\n            \"</button>\" +\r\n            \"</div>\" +\r\n            \"</div>\";\r\n\r\n        $(\"body\").append(\r\n            replaceHtml(modelHTML, {\r\n                id: \"luckysheet-search-replace\",\r\n                addclass: \"luckysheet-search-replace\",\r\n                title: \"\",\r\n                content: content,\r\n                botton:\r\n                    '<button class=\"btn btn-default luckysheet-model-close-btn\">' + locale_button.close + \"</button>\",\r\n                style: \"z-index:100003\",\r\n                close: locale_button.close,\r\n            }),\r\n        );\r\n        let $t = $(\"#luckysheet-search-replace\")\r\n                .find(\".luckysheet-modal-dialog-content\")\r\n                .css(\"min-width\", 500)\r\n                .end(),\r\n            myh = $t.outerHeight(),\r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(),\r\n            winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(),\r\n            scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-search-replace\")\r\n            .css({ left: (winw + scrollLeft - myw) / 2, top: (winh + scrollTop - myh) / 3 })\r\n            .show();\r\n\r\n        if (source == \"0\") {\r\n            $(\"#luckysheet-search-replace #searchTab\")\r\n                .addClass(\"on\")\r\n                .siblings()\r\n                .removeClass(\"on\");\r\n            $(\"#luckysheet-search-replace #replaceInput\").hide();\r\n            $(\"#luckysheet-search-replace #replaceAllBtn\").hide();\r\n            $(\"#luckysheet-search-replace #replaceBtn\").hide();\r\n        } else if (source == \"1\") {\r\n            $(\"#luckysheet-search-replace #replaceTab\")\r\n                .addClass(\"on\")\r\n                .siblings()\r\n                .removeClass(\"on\");\r\n            $(\"#luckysheet-search-replace #replaceInput\").show();\r\n            $(\"#luckysheet-search-replace #replaceAllBtn\").show();\r\n            $(\"#luckysheet-search-replace #replaceBtn\").show();\r\n        }\r\n    },\r\n    init: function() {\r\n        let _this = this;\r\n\r\n        //查找替换 切换\r\n        $(document)\r\n            .off(\"click.SRtabBoxspan\")\r\n            .on(\"click.SRtabBoxspan\", \"#luckysheet-search-replace .tabBox span\", function() {\r\n                $(this)\r\n                    .addClass(\"on\")\r\n                    .siblings()\r\n                    .removeClass(\"on\");\r\n\r\n                let $id = $(this).attr(\"id\");\r\n                if ($id == \"searchTab\") {\r\n                    $(\"#luckysheet-search-replace #replaceInput\").hide();\r\n                    $(\"#luckysheet-search-replace #replaceAllBtn\").hide();\r\n                    $(\"#luckysheet-search-replace #replaceBtn\").hide();\r\n\r\n                    $(\"#luckysheet-search-replace #searchInput input\").focus();\r\n                } else if ($id == \"replaceTab\") {\r\n                    $(\"#luckysheet-search-replace #replaceInput\").show();\r\n                    $(\"#luckysheet-search-replace #replaceAllBtn\").show();\r\n                    $(\"#luckysheet-search-replace #replaceBtn\").show();\r\n\r\n                    $(\"#luckysheet-search-replace #replaceInput input\").focus();\r\n                }\r\n            });\r\n\r\n        //查找下一个\r\n        $(document)\r\n            .off(\"keyup.SRsearchInput\")\r\n            .on(\"keyup.SRsearchInput\", \"#luckysheet-search-replace #searchInput input\", function(event) {\r\n                let kcode = event.keyCode;\r\n                if (kcode == keycode.ENTER) {\r\n                    _this.searchNext();\r\n                }\r\n            });\r\n        $(document)\r\n            .off(\"click.SRsearchNextBtn\")\r\n            .on(\"click.SRsearchNextBtn\", \"#luckysheet-search-replace #searchNextBtn\", function() {\r\n                _this.searchNext();\r\n            });\r\n\r\n        //查找全部\r\n        $(document)\r\n            .off(\"click.SRsearchAllBtn\")\r\n            .on(\"click.SRsearchAllBtn\", \"#luckysheet-search-replace #searchAllBtn\", function() {\r\n                _this.searchAll();\r\n            });\r\n        $(document)\r\n            .off(\"click.SRsearchAllboxItem\")\r\n            .on(\"click.SRsearchAllboxItem\", \"#luckysheet-search-replace #searchAllbox .boxItem\", function() {\r\n                $(this)\r\n                    .addClass(\"on\")\r\n                    .siblings()\r\n                    .removeClass(\"on\");\r\n\r\n                let r = $(this).attr(\"data-row\");\r\n                let c = $(this).attr(\"data-col\");\r\n                let sheetIndex = $(this).attr(\"data-sheetIndex\");\r\n\r\n                if (sheetIndex != Store.currentSheetIndex) {\r\n                    sheetmanage.changeSheetExec(sheetIndex);\r\n                }\r\n\r\n                Store.luckysheet_select_save = [{ row: [r, r], column: [c, c] }];\r\n\r\n                selectHightlightShow();\r\n\r\n                let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(),\r\n                    scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n                let winH = $(\"#luckysheet-cell-main\").height(),\r\n                    winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n                let row = Store.visibledatarow[r],\r\n                    row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n                let col = Store.visibledatacolumn[c],\r\n                    col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n                if (col - scrollLeft - winW + 20 > 0) {\r\n                    $(\"#luckysheet-scrollbar-x\").scrollLeft(col - winW + 20);\r\n                } else if (col_pre - scrollLeft - 20 < 0) {\r\n                    $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre - 20);\r\n                }\r\n\r\n                if (row - scrollTop - winH + 20 > 0) {\r\n                    $(\"#luckysheet-scrollbar-y\").scrollTop(row - winH + 20);\r\n                } else if (row_pre - scrollTop - 20 < 0) {\r\n                    $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre - 20);\r\n                }\r\n            });\r\n\r\n        //替换\r\n        $(document)\r\n            .off(\"click.SRreplaceBtn\")\r\n            .on(\"click.SRreplaceBtn\", \"#luckysheet-search-replace #replaceBtn\", function() {\r\n                _this.replace();\r\n            });\r\n\r\n        //全部替换\r\n        $(document)\r\n            .off(\"click.SRreplaceAllBtn\")\r\n            .on(\"click.SRreplaceAllBtn\", \"#luckysheet-search-replace #replaceAllBtn\", function() {\r\n                _this.replaceAll();\r\n            });\r\n    },\r\n    searchNext: function() {\r\n        let _this = this;\r\n\r\n        let searchText = $(\"#luckysheet-search-replace #searchInput input\").val();\r\n        if (searchText == \"\" || searchText == null) {\r\n            return;\r\n        }\r\n        const _locale = locale();\r\n        const locale_findAndReplace = _locale.findAndReplace;\r\n        let range;\r\n        if (\r\n            Store.luckysheet_select_save.length == 0 ||\r\n            (Store.luckysheet_select_save.length == 1 &&\r\n                Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] &&\r\n                Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])\r\n        ) {\r\n            range = [\r\n                {\r\n                    row: [0, Store.flowdata.length - 1],\r\n                    column: [0, Store.flowdata[0].length - 1],\r\n                },\r\n            ];\r\n        } else {\r\n            range = $.extend(true, [], Store.luckysheet_select_save);\r\n        }\r\n\r\n        let searchIndexArr = _this.getSearchIndexArr(searchText, range);\r\n\r\n        if (searchIndexArr.length == 0) {\r\n            if (isEditMode()) {\r\n                alert(locale_findAndReplace.noFindTip);\r\n            } else {\r\n                tooltip.info(locale_findAndReplace.noFindTip, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let count = 0;\r\n\r\n        if (\r\n            Store.luckysheet_select_save.length == 0 ||\r\n            (Store.luckysheet_select_save.length == 1 &&\r\n                Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] &&\r\n                Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])\r\n        ) {\r\n            if (Store.luckysheet_select_save.length == 0) {\r\n                count = 0;\r\n            } else {\r\n                for (let i = 0; i < searchIndexArr.length; i++) {\r\n                    if (\r\n                        searchIndexArr[i].r == Store.luckysheet_select_save[0].row[0] &&\r\n                        searchIndexArr[i].c == Store.luckysheet_select_save[0].column[0]\r\n                    ) {\r\n                        if (i == searchIndexArr.length - 1) {\r\n                            count = 0;\r\n                        } else {\r\n                            count = i + 1;\r\n                        }\r\n\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            Store.luckysheet_select_save = [\r\n                {\r\n                    row: [searchIndexArr[count].r, searchIndexArr[count].r],\r\n                    column: [searchIndexArr[count].c, searchIndexArr[count].c],\r\n                },\r\n            ];\r\n        } else {\r\n            let rf = range[range.length - 1].row_focus;\r\n            let cf = range[range.length - 1].column_focus;\r\n\r\n            for (let i = 0; i < searchIndexArr.length; i++) {\r\n                if (searchIndexArr[i].r == rf && searchIndexArr[i].c == cf) {\r\n                    if (i == searchIndexArr.length - 1) {\r\n                        count = 0;\r\n                    } else {\r\n                        count = i + 1;\r\n                    }\r\n\r\n                    break;\r\n                }\r\n            }\r\n\r\n            for (let s = 0; s < range.length; s++) {\r\n                let r1 = range[s].row[0],\r\n                    r2 = range[s].row[1];\r\n                let c1 = range[s].column[0],\r\n                    c2 = range[s].column[1];\r\n\r\n                if (\r\n                    searchIndexArr[count].r >= r1 &&\r\n                    searchIndexArr[count].r <= r2 &&\r\n                    searchIndexArr[count].c >= c1 &&\r\n                    searchIndexArr[count].c <= c2\r\n                ) {\r\n                    let obj = range[s];\r\n                    obj[\"row_focus\"] = searchIndexArr[count].r;\r\n                    obj[\"column_focus\"] = searchIndexArr[count].c;\r\n                    range.splice(s, 1);\r\n                    range.push(obj);\r\n\r\n                    break;\r\n                }\r\n            }\r\n\r\n            Store.luckysheet_select_save = range;\r\n        }\r\n\r\n        selectHightlightShow();\r\n\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(),\r\n            scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let winH = $(\"#luckysheet-cell-main\").height(),\r\n            winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n        let row = Store.visibledatarow[searchIndexArr[count].r],\r\n            row_pre = searchIndexArr[count].r - 1 == -1 ? 0 : Store.visibledatarow[searchIndexArr[count].r - 1];\r\n        let col = Store.visibledatacolumn[searchIndexArr[count].c],\r\n            col_pre = searchIndexArr[count].c - 1 == -1 ? 0 : Store.visibledatacolumn[searchIndexArr[count].c - 1];\r\n\r\n        if (col - scrollLeft - winW + 20 > 0) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(col - winW + 20);\r\n        } else if (col_pre - scrollLeft - 20 < 0) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre - 20);\r\n        }\r\n\r\n        if (row - scrollTop - winH + 20 > 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row - winH + 20);\r\n        } else if (row_pre - scrollTop - 20 < 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre - 20);\r\n        }\r\n\r\n        if ($(\"#searchAllbox\").is(\":visible\")) {\r\n            $(\"#luckysheet-search-replace #searchAllbox .boxItem\").removeClass(\"on\");\r\n        }\r\n    },\r\n    searchAll: function() {\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_findAndReplace = _locale.findAndReplace;\r\n\r\n        $(\"#luckysheet-search-replace #searchAllbox\").remove();\r\n\r\n        let searchText = $(\"#luckysheet-search-replace #searchInput input\").val();\r\n        if (searchText == \"\" || searchText == null) {\r\n            return;\r\n        }\r\n\r\n        /**\r\n         * fix #1115 查找改为全局查找（todo: 后续可以传入range）\r\n         */\r\n        let range;\r\n        // if(Store.luckysheet_select_save.length == 0 || (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])){\r\n        range = [\r\n            {\r\n                row: [0, Store.flowdata.length - 1],\r\n                column: [0, Store.flowdata[0].length - 1],\r\n            },\r\n        ];\r\n        // }\r\n        // else{\r\n        //     range = $.extend(true, [], Store.luckysheet_select_save);\r\n        // }\r\n\r\n        let searchIndexArr = _this.getSearchIndexArr(searchText, range);\r\n\r\n        if (searchIndexArr.length == 0) {\r\n            if (isEditMode()) {\r\n                alert(locale_findAndReplace.noFindTip);\r\n            } else {\r\n                tooltip.info(locale_findAndReplace.noFindTip, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let searchAllHtml = \"\";\r\n\r\n        for (let i = 0; i < searchIndexArr.length; i++) {\r\n            let value_ShowEs = valueShowEs(searchIndexArr[i].r, searchIndexArr[i].c, Store.flowdata).toString();\r\n\r\n            if (value_ShowEs.indexOf(\"</\") > -1 && value_ShowEs.indexOf(\">\") > -1) {\r\n                searchAllHtml +=\r\n                    '<div class=\"boxItem\" data-row=\"' +\r\n                    searchIndexArr[i].r +\r\n                    '\" data-col=\"' +\r\n                    searchIndexArr[i].c +\r\n                    '\" data-sheetIndex=\"' +\r\n                    Store.currentSheetIndex +\r\n                    '\">' +\r\n                    \"<span>\" +\r\n                    escapeHtml(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name) +\r\n                    \"</span>\" +\r\n                    \"<span>\" +\r\n                    chatatABC(searchIndexArr[i].c) +\r\n                    (searchIndexArr[i].r + 1) +\r\n                    \"</span>\" +\r\n                    \"<span>\" +\r\n                    escapeHtml(value_ShowEs) +\r\n                    \"</span>\" +\r\n                    \"</div>\";\r\n            } else {\r\n                searchAllHtml +=\r\n                    '<div class=\"boxItem\" data-row=\"' +\r\n                    searchIndexArr[i].r +\r\n                    '\" data-col=\"' +\r\n                    searchIndexArr[i].c +\r\n                    '\" data-sheetIndex=\"' +\r\n                    Store.currentSheetIndex +\r\n                    '\">' +\r\n                    \"<span>\" +\r\n                    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name +\r\n                    \"</span>\" +\r\n                    \"<span>\" +\r\n                    chatatABC(searchIndexArr[i].c) +\r\n                    (searchIndexArr[i].r + 1) +\r\n                    \"</span>\" +\r\n                    '<span title=\"' +\r\n                    escapeHtml(value_ShowEs) +\r\n                    '\">' +\r\n                    escapeHtml(value_ShowEs) +\r\n                    \"</span>\" +\r\n                    \"</div>\";\r\n            }\r\n        }\r\n\r\n        $(\r\n            `<div id=\"searchAllbox\"><div class=\"boxTitle\"><span>${locale_findAndReplace.searchTargetSheet}</span><span>${locale_findAndReplace.searchTargetCell}</span><span>${locale_findAndReplace.searchTargetValue}</span></div><div class=\"boxMain\">${searchAllHtml}</div></div>`,\r\n        ).appendTo($(\"#luckysheet-search-replace\"));\r\n\r\n        $(\"#luckysheet-search-replace #searchAllbox .boxItem\")\r\n            .eq(0)\r\n            .addClass(\"on\")\r\n            .siblings()\r\n            .removeClass(\"on\");\r\n\r\n        Store.luckysheet_select_save = [\r\n            {\r\n                row: [searchIndexArr[0].r, searchIndexArr[0].r],\r\n                column: [searchIndexArr[0].c, searchIndexArr[0].c],\r\n            },\r\n        ];\r\n\r\n        selectHightlightShow();\r\n    },\r\n    getSearchIndexArr: function(searchText, range) {\r\n        const arr = [];\r\n        const obj = {};\r\n\r\n        const $container = $(\"#luckysheet-search-replace\");\r\n        const isChecked = (inputId) => $container.find(`#${inputId} input[type='checkbox']`).is(\":checked\");\r\n\r\n        //正则表达式匹配\r\n        const regCheck = isChecked(\"regCheck\");\r\n        //整词匹配\r\n        const wordCheck = isChecked(\"wordCheck\");\r\n        //区分大小写匹配\r\n        const caseCheck = isChecked(\"caseCheck\");\r\n\r\n        let regExpFlags = \"g\";\r\n        if (!caseCheck) {\r\n            searchText = searchText.toLowerCase();\r\n            regExpFlags += \"i\";\r\n        }\r\n\r\n        const addResult = (r, c) => {\r\n            if (!(r + \"_\" + c in obj)) {\r\n                obj[r + \"_\" + c] = 0;\r\n                arr.push({ r: r, c: c });\r\n            }\r\n        };\r\n\r\n        for (let s = 0; s < range.length; s++) {\r\n            const r1 = range[s].row[0],\r\n                r2 = range[s].row[1];\r\n            const c1 = range[s].column[0],\r\n                c2 = range[s].column[1];\r\n\r\n            for (let r = r1; r <= r2; r++) {\r\n                for (let c = c1; c <= c2; c++) {\r\n                    const cell = Store.flowdata[r][c];\r\n\r\n                    if (cell != null) {\r\n                        let value = valueShowEs(r, c, Store.flowdata);\r\n\r\n                        if (value == 0) {\r\n                            value = value.toString();\r\n                        }\r\n\r\n                        if (value != null && value != \"\") {\r\n                            let wasFound = false;\r\n                            value = value.toString();\r\n                            value = caseCheck ? value : value.toLowerCase();\r\n\r\n                            if (wordCheck) {\r\n                                //整词\r\n                                wasFound = searchText == value;\r\n                            } else if (regCheck) {\r\n                                //正则表达式\r\n                                let reg = new RegExp(func_methods.getRegExpStr(searchText), regExpFlags);\r\n                                wasFound = reg.test(value);\r\n                            } else {\r\n                                wasFound = ~value.indexOf(searchText);\r\n                            }\r\n\r\n                            wasFound && addResult(r, c);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return arr;\r\n    },\r\n    replace: function() {\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_findAndReplace = _locale.findAndReplace;\r\n\r\n        if (!Store.allowEdit) {\r\n            tooltip.info(locale_findAndReplace.modeTip, \"\");\r\n            return;\r\n        }\r\n\r\n        let searchText = $(\"#luckysheet-search-replace #searchInput input\").val();\r\n        if (searchText == \"\" || searchText == null) {\r\n            if (isEditMode()) {\r\n                alert(locale_findAndReplace.searchInputTip);\r\n            } else {\r\n                tooltip.info(locale_findAndReplace.searchInputTip, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let range;\r\n        if (\r\n            Store.luckysheet_select_save.length == 0 ||\r\n            (Store.luckysheet_select_save.length == 1 &&\r\n                Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] &&\r\n                Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])\r\n        ) {\r\n            range = [\r\n                {\r\n                    row: [0, Store.flowdata.length - 1],\r\n                    column: [0, Store.flowdata[0].length - 1],\r\n                },\r\n            ];\r\n        } else {\r\n            range = $.extend(true, [], Store.luckysheet_select_save);\r\n        }\r\n\r\n        let searchIndexArr = _this.getSearchIndexArr(searchText, range);\r\n\r\n        if (searchIndexArr.length == 0) {\r\n            if (isEditMode()) {\r\n                alert(locale_findAndReplace.noReplceTip);\r\n            } else {\r\n                tooltip.info(locale_findAndReplace.noReplceTip, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let count = null;\r\n\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rf = last.row_focus;\r\n        let cf = last.column_focus;\r\n\r\n        for (let i = 0; i < searchIndexArr.length; i++) {\r\n            if (searchIndexArr[i].r == rf && searchIndexArr[i].c == cf) {\r\n                count = i;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (count == null) {\r\n            if (searchIndexArr.length == 0) {\r\n                if (isEditMode()) {\r\n                    alert(locale_findAndReplace.noMatchTip);\r\n                } else {\r\n                    tooltip.info(locale_findAndReplace.noMatchTip, \"\");\r\n                }\r\n\r\n                return;\r\n            } else {\r\n                count = 0;\r\n            }\r\n        }\r\n\r\n        //正则表达式匹配\r\n        let regCheck = false;\r\n        if ($(\"#luckysheet-search-replace #regCheck input[type='checkbox']\").is(\":checked\")) {\r\n            regCheck = true;\r\n        }\r\n\r\n        //整词匹配\r\n        let wordCheck = false;\r\n        if ($(\"#luckysheet-search-replace #wordCheck input[type='checkbox']\").is(\":checked\")) {\r\n            wordCheck = true;\r\n        }\r\n\r\n        //区分大小写匹配\r\n        let caseCheck = false;\r\n        if ($(\"#luckysheet-search-replace #caseCheck input[type='checkbox']\").is(\":checked\")) {\r\n            caseCheck = true;\r\n        }\r\n\r\n        let replaceText = $(\"#luckysheet-search-replace #replaceInput input\").val();\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n        let r, c;\r\n        if (wordCheck) {\r\n            r = searchIndexArr[count].r;\r\n            c = searchIndexArr[count].c;\r\n\r\n            let v = replaceText;\r\n\r\n            if (!checkProtectionLocked(r, c, Store.currentSheetIndex)) {\r\n                return;\r\n            }\r\n\r\n            setcellvalue(r, c, d, v);\r\n        } else {\r\n            let reg;\r\n            if (caseCheck) {\r\n                reg = new RegExp(func_methods.getRegExpStr(searchText), \"g\");\r\n            } else {\r\n                reg = new RegExp(func_methods.getRegExpStr(searchText), \"ig\");\r\n            }\r\n\r\n            r = searchIndexArr[count].r;\r\n            c = searchIndexArr[count].c;\r\n\r\n            if (!checkProtectionLocked(r, c, Store.currentSheetIndex)) {\r\n                return;\r\n            }\r\n\r\n            let v = valueShowEs(r, c, d)\r\n                .toString()\r\n                .replace(reg, replaceText);\r\n\r\n            setcellvalue(r, c, d, v);\r\n        }\r\n\r\n        Store.luckysheet_select_save = [{ row: [r, r], column: [c, c] }];\r\n\r\n        if ($(\"#luckysheet-search-replace #searchAllbox\").is(\":visible\")) {\r\n            $(\"#luckysheet-search-replace #searchAllbox\").hide();\r\n        }\r\n\r\n        jfrefreshgrid(d, Store.luckysheet_select_save);\r\n        selectHightlightShow();\r\n\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(),\r\n            scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let winH = $(\"#luckysheet-cell-main\").height(),\r\n            winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n        let row = Store.visibledatarow[r],\r\n            row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1];\r\n        let col = Store.visibledatacolumn[c],\r\n            col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n        if (col - scrollLeft - winW + 20 > 0) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(col - winW + 20);\r\n        } else if (col_pre - scrollLeft - 20 < 0) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre - 20);\r\n        }\r\n\r\n        if (row - scrollTop - winH + 20 > 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row - winH + 20);\r\n        } else if (row_pre - scrollTop - 20 < 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre - 20);\r\n        }\r\n    },\r\n    replaceAll: function() {\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_findAndReplace = _locale.findAndReplace;\r\n\r\n        if (!Store.allowEdit) {\r\n            tooltip.info(locale_findAndReplace.modeTip, \"\");\r\n            return;\r\n        }\r\n\r\n        let searchText = $(\"#luckysheet-search-replace #searchInput input\").val();\r\n        if (searchText == \"\" || searchText == null) {\r\n            if (isEditMode()) {\r\n                alert(locale_findAndReplace.searchInputTip);\r\n            } else {\r\n                tooltip.info(locale_findAndReplace.searchInputTip, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let range;\r\n        if (\r\n            Store.luckysheet_select_save.length == 0 ||\r\n            (Store.luckysheet_select_save.length == 1 &&\r\n                Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] &&\r\n                Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1])\r\n        ) {\r\n            range = [\r\n                {\r\n                    row: [0, Store.flowdata.length - 1],\r\n                    column: [0, Store.flowdata[0].length - 1],\r\n                },\r\n            ];\r\n        } else {\r\n            range = $.extend(true, [], Store.luckysheet_select_save);\r\n        }\r\n\r\n        let searchIndexArr = _this.getSearchIndexArr(searchText, range);\r\n\r\n        if (searchIndexArr.length == 0) {\r\n            if (isEditMode()) {\r\n                alert(locale_findAndReplace.noReplceTip);\r\n            } else {\r\n                tooltip.info(locale_findAndReplace.noReplceTip, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        //正则表达式匹配\r\n        let regCheck = false;\r\n        if ($(\"#luckysheet-search-replace #regCheck input[type='checkbox']\").is(\":checked\")) {\r\n            regCheck = true;\r\n        }\r\n\r\n        //整词匹配\r\n        let wordCheck = false;\r\n        if ($(\"#luckysheet-search-replace #wordCheck input[type='checkbox']\").is(\":checked\")) {\r\n            wordCheck = true;\r\n        }\r\n\r\n        //区分大小写匹配\r\n        let caseCheck = false;\r\n        if ($(\"#luckysheet-search-replace #caseCheck input[type='checkbox']\").is(\":checked\")) {\r\n            caseCheck = true;\r\n        }\r\n\r\n        let replaceText = $(\"#luckysheet-search-replace #replaceInput input\").val();\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let replaceCount = 0;\r\n        if (wordCheck) {\r\n            for (let i = 0; i < searchIndexArr.length; i++) {\r\n                let r = searchIndexArr[i].r;\r\n                let c = searchIndexArr[i].c;\r\n\r\n                if (!checkProtectionLocked(r, c, Store.currentSheetIndex, false)) {\r\n                    continue;\r\n                }\r\n\r\n                let v = replaceText;\r\n\r\n                setcellvalue(r, c, d, v);\r\n\r\n                range.push({ row: [r, r], column: [c, c] });\r\n                replaceCount++;\r\n            }\r\n        } else {\r\n            let reg;\r\n            if (caseCheck) {\r\n                reg = new RegExp(func_methods.getRegExpStr(searchText), \"g\");\r\n            } else {\r\n                reg = new RegExp(func_methods.getRegExpStr(searchText), \"ig\");\r\n            }\r\n\r\n            for (let i = 0; i < searchIndexArr.length; i++) {\r\n                let r = searchIndexArr[i].r;\r\n                let c = searchIndexArr[i].c;\r\n\r\n                if (!checkProtectionLocked(r, c, Store.currentSheetIndex, false)) {\r\n                    continue;\r\n                }\r\n\r\n                let v = valueShowEs(r, c, d)\r\n                    .toString()\r\n                    .replace(reg, replaceText);\r\n\r\n                setcellvalue(r, c, d, v);\r\n\r\n                range.push({ row: [r, r], column: [c, c] });\r\n                replaceCount++;\r\n            }\r\n        }\r\n\r\n        if ($(\"#luckysheet-search-replace #searchAllbox\").is(\":visible\")) {\r\n            $(\"#luckysheet-search-replace #searchAllbox\").hide();\r\n        }\r\n\r\n        jfrefreshgrid(d, range);\r\n\r\n        Store.luckysheet_select_save = $.extend(true, [], range);\r\n        selectHightlightShow();\r\n\r\n        let succeedInfo = replaceHtml(locale_findAndReplace.successTip, {\r\n            xlength: replaceCount,\r\n        });\r\n        if (isEditMode()) {\r\n            alert(succeedInfo);\r\n        } else {\r\n            tooltip.info(succeedInfo, \"\");\r\n        }\r\n    },\r\n};\r\n\r\nexport default luckysheetSearchReplace;\r\n"
  },
  {
    "path": "src/controllers/select.js",
    "content": "import menuButton from './menuButton';\r\nimport formula from '../global/formula';\r\nimport { dynamicArrayHightShow } from '../global/dynamicArray';\r\nimport { rowLocationByIndex, colLocationByIndex } from '../global/location';\r\nimport browser from '../global/browser';\r\nimport dataVerificationCtrl from './dataVerificationCtrl';\r\nimport { getSheetIndex, getRangetxt } from '../methods/get';\r\nimport Store from '../store';\r\nimport method from '../global/method';\r\nimport locale from '../locale/locale';\r\nimport { refreshMenuButtonFocus } from \"../global/api\";\r\n\r\n//公式函数 选区实体框\r\nfunction seletedHighlistByindex(id, r1, r2, c1, c2) {\r\n    let row = Store.visibledatarow[r2],\r\n        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n    let col = Store.visibledatacolumn[c2],\r\n        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n    $('#' + id).css({\r\n        \"left\": col_pre,\r\n        \"width\": col - col_pre - 1,\r\n        \"top\": row_pre,\r\n        \"height\": row - row_pre - 1\r\n    });\r\n}\r\n\r\n//Set selection highlight\r\nfunction selectHightlightShow(isRestore = false) {\r\n    $(\"#luckysheet-cell-selected-boxs\").show();\r\n    $(\"#luckysheet-cell-selected-boxs #luckysheet-cell-selected\").siblings(\".luckysheet-cell-selected\").remove();\r\n\r\n    if (Store.luckysheet_select_save.length > 0) {\r\n        for (let i = 0; i < Store.luckysheet_select_save.length; i++) {\r\n            let r1 = Store.luckysheet_select_save[i].row[0],\r\n                r2 = Store.luckysheet_select_save[i].row[1];\r\n            let c1 = Store.luckysheet_select_save[i].column[0],\r\n                c2 = Store.luckysheet_select_save[i].column[1];\r\n\r\n            let rf, cf;\r\n            if (Store.luckysheet_select_save[i].row_focus == null) {\r\n                rf = r1;\r\n            }\r\n            else {\r\n                rf = Store.luckysheet_select_save[i].row_focus;\r\n            }\r\n\r\n            if (Store.luckysheet_select_save[i].column_focus == null) {\r\n                cf = c1;\r\n            }\r\n            else {\r\n                cf = Store.luckysheet_select_save[i].column_focus;\r\n            }\r\n\r\n            let row = Store.visibledatarow[r2],\r\n                row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n            let col = Store.visibledatacolumn[c2],\r\n                col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n            let row_f = Store.visibledatarow[rf],\r\n                row_pre_f = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1];\r\n            let col_f = Store.visibledatacolumn[cf],\r\n                col_pre_f = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1];\r\n\r\n            let margeset = menuButton.mergeborer(Store.flowdata, rf, cf);\r\n            if (!!margeset) {\r\n                row_f = margeset.row[1];\r\n                row_pre_f = margeset.row[0];\r\n\r\n                col_f = margeset.column[1];\r\n                col_pre_f = margeset.column[0];\r\n            }\r\n\r\n            Store.luckysheet_select_save[i][\"row\"] = [r1, r2];\r\n            Store.luckysheet_select_save[i][\"column\"] = [c1, c2];\r\n\r\n            Store.luckysheet_select_save[i][\"row_focus\"] = rf;\r\n            Store.luckysheet_select_save[i][\"column_focus\"] = cf;\r\n\r\n            Store.luckysheet_select_save[i][\"left\"] = col_pre_f;\r\n            Store.luckysheet_select_save[i][\"width\"] = col_f - col_pre_f - 1;\r\n            Store.luckysheet_select_save[i][\"top\"] = row_pre_f;\r\n            Store.luckysheet_select_save[i][\"height\"] = row_f - row_pre_f - 1;\r\n\r\n            Store.luckysheet_select_save[i][\"left_move\"] = col_pre;\r\n            Store.luckysheet_select_save[i][\"width_move\"] = col - col_pre - 1;\r\n            Store.luckysheet_select_save[i][\"top_move\"] = row_pre;\r\n            Store.luckysheet_select_save[i][\"height_move\"] = row - row_pre - 1;\r\n\r\n            if (i == 0) {\r\n                if (Store.luckysheet_select_save.length == 1) {\r\n                    if (browser.mobilecheck()) {//移动端\r\n                        $(\"#luckysheet-cell-selected-boxs #luckysheet-cell-selected\").css({\r\n                            \"left\": Store.luckysheet_select_save[i][\"left_move\"],\r\n                            \"width\": Store.luckysheet_select_save[i][\"width_move\"],\r\n                            \"top\": Store.luckysheet_select_save[i][\"top_move\"],\r\n                            \"height\": Store.luckysheet_select_save[i][\"height_move\"],\r\n                            \"display\": \"block\",\r\n                            \"border\": \"1px solid #0188fb\"\r\n                        })\r\n                            .find(\".luckysheet-cs-draghandle\")\r\n                            .css(\"display\", \"block\")\r\n                            .end()\r\n                            .find(\".luckysheet-cs-fillhandle\")\r\n                            .css(\"display\", \"none\")\r\n                            .end()\r\n                            .find(\".luckysheet-cs-touchhandle\")\r\n                            .css(\"display\", \"block\");\r\n                    }\r\n                    else {\r\n                        $(\"#luckysheet-cell-selected-boxs #luckysheet-cell-selected\").css({\r\n                            \"left\": Store.luckysheet_select_save[i][\"left_move\"],\r\n                            \"width\": Store.luckysheet_select_save[i][\"width_move\"],\r\n                            \"top\": Store.luckysheet_select_save[i][\"top_move\"],\r\n                            \"height\": Store.luckysheet_select_save[i][\"height_move\"],\r\n                            \"display\": \"block\",\r\n                            \"border\": \"1px solid #0188fb\"\r\n                        })\r\n                            .find(\".luckysheet-cs-draghandle\")\r\n                            .css(\"display\", \"block\")\r\n                            .end()\r\n                            .find(\".luckysheet-cs-fillhandle\")\r\n                            .css(\"display\", \"block\")\r\n                            .end()\r\n                            .find(\".luckysheet-cs-touchhandle\")\r\n                            .css(\"display\", \"none\");\r\n                    }\r\n                }\r\n                else {\r\n                    $(\"#luckysheet-cell-selected-boxs #luckysheet-cell-selected\").css({\r\n                        \"left\": Store.luckysheet_select_save[i][\"left_move\"],\r\n                        \"width\": Store.luckysheet_select_save[i][\"width_move\"],\r\n                        \"top\": Store.luckysheet_select_save[i][\"top_move\"],\r\n                        \"height\": Store.luckysheet_select_save[i][\"height_move\"],\r\n                        \"display\": \"block\",\r\n                        \"border\": \"1px solid rgba(1, 136, 251, 0.15)\"\r\n                    })\r\n                        .find(\".luckysheet-cs-draghandle\")\r\n                        .css(\"display\", \"none\")\r\n                        .end()\r\n                        .find(\".luckysheet-cs-fillhandle\")\r\n                        .css(\"display\", \"none\");\r\n                }\r\n            }\r\n            else {\r\n                $(\"#luckysheet-cell-selected-boxs\").append('<div class=\"luckysheet-cell-selected\" style=\"left: ' + Store.luckysheet_select_save[i][\"left_move\"] + 'px; width: ' + Store.luckysheet_select_save[i][\"width_move\"] + 'px; top: ' + Store.luckysheet_select_save[i][\"top_move\"] + 'px; height: ' + Store.luckysheet_select_save[i][\"height_move\"] + 'px; border: 1px solid rgba(1, 136, 251, 0.15); display: block;\"></div>');\r\n            }\r\n\r\n            if (i == Store.luckysheet_select_save.length - 1) {\r\n                //focus 取选区数组最后一个\r\n                $(\"#luckysheet-cell-selected-focus\").css({\r\n                    \"left\": Store.luckysheet_select_save[i][\"left\"],\r\n                    \"width\": Store.luckysheet_select_save[i][\"width\"],\r\n                    \"top\": Store.luckysheet_select_save[i][\"top\"],\r\n                    \"height\": Store.luckysheet_select_save[i][\"height\"],\r\n                    \"display\": \"block\"\r\n                });\r\n                //行列数\r\n                luckysheet_count_show(\r\n                    Store.luckysheet_select_save[i][\"left_move\"],\r\n                    Store.luckysheet_select_save[i][\"top_move\"],\r\n                    Store.luckysheet_select_save[i][\"width_move\"],\r\n                    Store.luckysheet_select_save[i][\"height_move\"],\r\n                    [r1, r2],\r\n                    [c1, c2]\r\n                );\r\n                //左上角选择区域框\r\n                formula.fucntionboxshow(rf, cf);\r\n                //focus单元格数据验证\r\n                dataVerificationCtrl.cellFocus(rf, cf);\r\n            }\r\n        }\r\n\r\n        //行列标题栏\r\n        selectTitlesShow(Store.luckysheet_select_save, isRestore);\r\n\r\n        //左上角范围显示\r\n        selectHelpboxFill();\r\n\r\n        //动态数组显示\r\n        if (Store.luckysheet_select_save.length == 1 && Store.luckysheet_select_save[0].row[0] == Store.luckysheet_select_save[0].row[1] && Store.luckysheet_select_save[0].column[0] == Store.luckysheet_select_save[0].column[1]) {\r\n            dynamicArrayHightShow(Store.luckysheet_select_save[0].row[0], Store.luckysheet_select_save[0].column[0]);\r\n        }\r\n    \r\n        /* 刷新当前状态栏 */\r\n        refreshMenuButtonFocus();\r\n    }\r\n\r\n    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].luckysheet_select_save = Store.luckysheet_select_save;\r\n            // Hook function, change the range selection box, selectHightlightShowillbe triggered multiple times when mousemove is moused, and thhistoricalvalue is used here to throttle\r\n        const luckysheet_select_save_previous = JSON.stringify(Store.luckysheet_select_save);\r\n\r\n        if(Store.luckysheet_select_save_previous == null |Store.luckysheet_select_save_previous !== luckysheet_select_save_previous){\r\n            method.createHookFunction('rangeSelect', Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)], Store.luckysheet_select_save);\r\n        }\r\n        \r\n        Store.luckysheet_select_save_previous = luckysheet_select_save_previous;\r\n}\r\n\r\n//选区标题栏\r\nfunction selectTitlesShow(rangeArr, isRestore = false) {\r\n    let s = $.extend(true, [], rangeArr);\r\n\r\n    let rowTitleMap = {}, columnTitleMap = {};\r\n    for (let i = 0; i < s.length; i++) {\r\n        let r1 = s[i][\"row\"][0], r2 = s[i][\"row\"][1], c1 = s[i][\"column\"][0], c2 = s[i][\"column\"][1];\r\n\r\n        // if(isRestore){\r\n        //     let margeset = menuButton.mergeborer(Store.flowdata, r1, c1);\r\n        //     if(!!margeset){\r\n        //         r1 = margeset.row[2];\r\n        //         r2 = margeset.row[3];\r\n\r\n        //         c1 = margeset.column[2];\r\n        //         c2 = margeset.column[3];\r\n        //     }\r\n        // }\r\n\r\n        //行、列标题栏\r\n        rowTitleMap = selectTitlesMap(rowTitleMap, r1, r2);\r\n        columnTitleMap = selectTitlesMap(columnTitleMap, c1, c2);\r\n    }\r\n\r\n    //行标题\r\n    $(\"#luckysheet-rows-h-selected\").empty();\r\n\r\n    let rowTitleRange = selectTitlesRange(rowTitleMap);\r\n    for (let i = 0; i < rowTitleRange.length; i++) {\r\n        let r1 = rowTitleRange[i][0], r2 = rowTitleRange[i][rowTitleRange[i].length - 1];\r\n        let row = rowLocationByIndex(r2)[1], row_pre = rowLocationByIndex(r1)[0];\r\n\r\n        $(\"#luckysheet-rows-h-selected\").append('<div class=\"luckysheet-rows-h-selected\" style=\"top: ' + row_pre + 'px; height: ' + (row - row_pre - 1) + 'px; display: block; background-color: rgba(76, 76, 76, 0.1);\"></div>');\r\n    }\r\n\r\n    //列标题\r\n    $(\"#luckysheet-cols-h-selected\").empty();\r\n\r\n    let columnTitleRange = selectTitlesRange(columnTitleMap);\r\n    for (let j = 0; j < columnTitleRange.length; j++) {\r\n        let c1 = columnTitleRange[j][0], c2 = columnTitleRange[j][columnTitleRange[j].length - 1];\r\n        let col = colLocationByIndex(c2)[1], col_pre = colLocationByIndex(c1)[0];\r\n\r\n        $(\"#luckysheet-cols-h-selected\").append('<div class=\"luckysheet-cols-h-selected\" style=\"left: ' + col_pre + 'px; width: ' + (col - col_pre - 1) + 'px; display: block; background-color: rgba(76, 76, 76, 0.1);\"></div>');\r\n\r\n    }\r\n}\r\nfunction selectTitlesMap(rangeMap, range1, range2) {\r\n    let map = $.extend(true, {}, rangeMap);\r\n\r\n    for (let i = range1; i <= range2; i++) {\r\n        if (i in map) {\r\n            continue;\r\n        }\r\n\r\n        map[i] = 0;\r\n    }\r\n\r\n    return map;\r\n}\r\nfunction selectTitlesRange(map) {\r\n    let mapArr = [];\r\n\r\n    for (let i in map) {\r\n        mapArr.push(i);\r\n    }\r\n\r\n    mapArr.sort(function (a, b) { return a - b; });\r\n\r\n    let rangeArr = [];\r\n    let item = [];\r\n\r\n    if (mapArr.length > 1) {\r\n        for (let j = 1; j < mapArr.length; j++) {\r\n            if (mapArr[j] - mapArr[j - 1] == 1) {\r\n                item.push(mapArr[j - 1]);\r\n\r\n                if (j == mapArr.length - 1) {\r\n                    item.push(mapArr[j]);\r\n                    rangeArr.push(item);\r\n                }\r\n            }\r\n            else {\r\n                if (j == 1) {\r\n                    if (j == mapArr.length - 1) {\r\n                        item.push(mapArr[j - 1]);\r\n                        rangeArr.push(item);\r\n                        rangeArr.push([mapArr[j]]);\r\n                    }\r\n                    else {\r\n                        rangeArr.push(mapArr[0]);\r\n                    }\r\n                }\r\n                else if (j == mapArr.length - 1) {\r\n                    item.push(mapArr[j - 1]);\r\n                    rangeArr.push(item);\r\n                    rangeArr.push([mapArr[j]]);\r\n                }\r\n                else {\r\n                    item.push(mapArr[j - 1]);\r\n                    rangeArr.push(item);\r\n                    item = [];\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else {\r\n        rangeArr.push([mapArr[0]]);\r\n    }\r\n\r\n    return rangeArr;\r\n}\r\n\r\n//选区是否重叠\r\nfunction selectIsOverlap(range) {\r\n    if (range == null) {\r\n        range = Store.luckysheet_select_save;\r\n    }\r\n    range = JSON.parse(JSON.stringify(range));\r\n\r\n    let overlap = false;\r\n    let map = {};\r\n\r\n    for (let s = 0; s < range.length; s++) {\r\n        let str_r = range[s].row[0],\r\n            end_r = range[s].row[1];\r\n        let str_c = range[s].column[0],\r\n            end_c = range[s].column[1];\r\n\r\n        for (let r = str_r; r <= end_r; r++) {\r\n            for (let c = str_c; c <= end_c; c++) {\r\n                if ((r + \"_\" + c) in map) {\r\n                    overlap = true;\r\n                    break;\r\n                }\r\n                else {\r\n                    map[r + \"_\" + c] = 0;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return overlap;\r\n}\r\n// 协同提示框\r\nfunction collaborativeEditBox() {\r\n    let all_width = Store.visibledatacolumn;//当前操作页的所有列距离左边的距离\r\n    let all_height = Store.visibledatarow;//当前操作页的所有列距离顶部的距离\r\n\r\n    Store.cooperativeEdit.changeCollaborationSize.forEach(value => {\r\n        if (value.i == Store.currentSheetIndex) {\r\n            let count_col = value.v.column;//系统提示框所在的列范围\r\n            let change_width = all_width[count_col[0]] -1 //提示框所在列号为0时要改变的宽\r\n            if(value.v.column[0] !== 0)  {\r\n                //用提示框右边框到图表最左的距离减去左边框到图表左边距离再减去边框值\r\n                change_width = all_width[count_col[1]] - all_width[count_col[0] - 1] - (count_col[1] - count_col[0] + 1)\r\n            }\r\n            let count_row = value.v.row;//系统提示框所在的行范围\r\n            let change_height = all_height[count_row[0]] -1\r\n            if(value.v.row[0] !== 0){\r\n                change_height = all_height[count_row[1]] - all_height[count_row[0] - 1] - (count_row[1] - count_row[0] + 1)\r\n            }\r\n            let range = Store.cooperativeEdit.merge_range //获取单元格合并后的数据\r\n            let change_left = all_width[value.v.column[0] - 1] - 1 //提示框离图表最左边的距离\r\n            let change_top = all_height[value.v.row[0] - 1] - 1 //提示框离图表最右边的距离\r\n            if (Store.config.columnlen !== null) {\r\n                //当改变宽的列不在提示框范围内时，将改变列的初始位置改为在提示框范围内\r\n                for (let k in Store.config.columnlen) {\r\n                    if (value.v.column[0] <= k && k <= value.v.column[1]) {\r\n                        Store.luckysheet_cols_change_size_start[1] = k - 0\r\n                        break\r\n                    }\r\n                }\r\n            }\r\n            if (Store.config.rowlen !== null) {\r\n                for (let k in Store.config.rowlen) {\r\n                    if (value.v.row[0] <= k && k <= value.v.row[1]) {\r\n                        Store.luckysheet_rows_change_size_start[1] = k - 0\r\n                        break\r\n                    }\r\n                }\r\n            }\r\n            // 改变列宽的位置在提示框范围内\r\n            let flag_width = value.v.column[0] <= Store.luckysheet_cols_change_size_start[1] && Store.luckysheet_cols_change_size_start[1] <= value.v.column[1]\r\n            if (flag_width) {\r\n                if (Store.luckysheet_cols_change_size_start[1] == 0) {\r\n                    change_width = all_width[0] - 1\r\n                } else {\r\n                    // 不在提示框范围内\r\n                    let counts = value.v.column;\r\n                    change_width = all_width[counts[1]] - all_width[counts[0] - 1] - (counts[1] - counts[0] + 1)\r\n                }\r\n            }\r\n            let flag_height = value.v.row[0] <= Store.luckysheet_rows_change_size_start[1] && Store.luckysheet_rows_change_size_start[1] <= value.v.row[1]\r\n            if (flag_height) {\r\n                if (Store.luckysheet_rows_change_size_start[1] == 0) {\r\n                    change_height = all_height[0] - 1\r\n                } else {\r\n                    let counts = value.v.row;\r\n                    change_height = all_height[counts[1]] - all_height[counts[0] - 1] - (counts[1] - counts[0] + 1)\r\n                }\r\n            }\r\n            //合并单元格时执行\r\n            if (Object.keys(range).length > 0 ) {\r\n                let flag_sure_merge = false\r\n                if(range.v.length > 1) {\r\n                    flag_sure_merge = range.v[1][0] == null || Object.keys(range.v[1][0]).length > 0\r\n                }\r\n                if(range.v[0].length > 1) {\r\n                    flag_sure_merge = range.v[0][1] == null || Object.keys(range.v[0][1]).length > 0\r\n                }\r\n                if(flag_sure_merge) {\r\n                    // 合并成一个时执行\r\n                    let flag_merge_width = range.column[0] <= value.v.column[0] && range.column[1] >= value.v.column[1];\r\n                    change_left = all_width[range.column[0] - 1] - 1\r\n                    change_top = all_height[range.row[0] - 1] - 1\r\n                    change_width = all_width[range.column[1]] - 1\r\n                    change_height = all_height[range.row[1]] - 1\r\n                    if (flag_merge_width) {\r\n                        if (range.column[0] !== 0) {\r\n                            let counts = range.column;\r\n                            change_width = all_width[counts[1]] - all_width[counts[0] - 1] - (counts[1] - counts[0] + 1)\r\n                        } else {\r\n                            change_left = 0\r\n                        }\r\n                        value.v.column = range.column\r\n                    }\r\n                    let flag_merge_height = range.row[0] <= value.v.row[0] && range.row[1] >= value.v.row[1];\r\n                    if (flag_merge_height) {\r\n                        if (range.row[0] !== 0) {\r\n                            let counts = range.row;\r\n                            change_height = all_height[counts[1]] - all_height[counts[0] - 1] - (counts[1] - counts[0] + 1)\r\n                        } else {\r\n                            change_top = 0\r\n                        }\r\n                        value.v.row = range.row\r\n                    }\r\n                } else {\r\n                    // 合并取消变成多个单元格时执行\r\n                    change_width = all_width[count_col[0]] - all_width[count_col[0] - 1] - 1\r\n                    if(count_col[0] === 0) {\r\n                        change_width = all_width[count_col[0]] - 1\r\n                    }\r\n                    change_height = all_height[count_row[0]] - all_height[count_row[0] - 1] - 1\r\n                    if(count_row[0] === 0) {\r\n                        change_height = all_height[count_row[0]] - 1\r\n                    }\r\n                }\r\n            }\r\n            $(\"#luckysheet-multipleRange-show-\" + value.id).css({ \"height\": change_height, \"width\": change_width, \"top\": change_top + 'px', \"left\": change_left + 'px' })\r\n            let change_bottom = $(\"#luckysheet-multipleRange-show-\" + value.id)[0].offsetHeight - 1\r\n            $(\"#luckysheet-multipleRange-show-\" + value.id + \">.username\").css({ \"bottom\": change_bottom + 'px' })\r\n        }\r\n    })\r\n}\r\n//复制选区虚线框\r\nfunction selectionCopyShow(range) {\r\n    $(\"#luckysheet-selection-copy\").empty();\r\n\r\n    if (range == null) {\r\n        range = Store.luckysheet_selection_range;\r\n    }\r\n    range = JSON.parse(JSON.stringify(range));\r\n\r\n    if (range.length > 0) {\r\n        for (let s = 0; s < range.length; s++) {\r\n            let r1 = range[s].row[0], r2 = range[s].row[1];\r\n            let c1 = range[s].column[0], c2 = range[s].column[1];\r\n\r\n            let row = Store.visibledatarow[r2],\r\n                row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n            let col = Store.visibledatacolumn[c2],\r\n                col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n            let copyDomHtml = '<div class=\"luckysheet-selection-copy\" style=\"display: block; left: ' + col_pre + 'px; width: ' + (col - col_pre - 1) + 'px; top: ' + row_pre + 'px; height: ' + (row - row_pre - 1) + 'px;\">' +\r\n                '<div class=\"luckysheet-selection-copy-top luckysheet-copy\"></div>' +\r\n                '<div class=\"luckysheet-selection-copy-right luckysheet-copy\"></div>' +\r\n                '<div class=\"luckysheet-selection-copy-bottom luckysheet-copy\"></div>' +\r\n                '<div class=\"luckysheet-selection-copy-left luckysheet-copy\"></div>' +\r\n                '<div class=\"luckysheet-selection-copy-hc\"></div>' +\r\n                '</div>';\r\n            $(\"#luckysheet-selection-copy\").append(copyDomHtml);\r\n        }\r\n    }\r\n}\r\n\r\n//选区行列数显示\r\nfunction luckysheet_count_show(left, top, width, height, rowseleted, columnseleted) {\r\n    let rowl = rowseleted[1] - rowseleted[0] + 1,\r\n        coll = columnseleted[1] - columnseleted[0] + 1;\r\n    let drawWidth = Store.luckysheetTableContentHW[0],\r\n        drawHeight = Store.luckysheetTableContentHW[1];\r\n    let scrollWidth = $(\"#luckysheet-cell-main\").scrollLeft(),\r\n        scrollHeight = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n    const _locale = locale();\r\n    const locale_info = _locale.info;\r\n\r\n    if (rowl >= 4) {\r\n        let leftv = left - 25;\r\n        if (leftv < 0) {\r\n            leftv = left + 5;\r\n        }\r\n\r\n        if (leftv < scrollWidth) {\r\n            leftv = scrollWidth + 10;\r\n        }\r\n\r\n        let topv = top + height / 2;\r\n        if (height > drawHeight) {\r\n            topv = scrollHeight + drawHeight / 2;\r\n        }\r\n\r\n        $(\"#luckysheet-row-count-show\").css({ \"left\": leftv, \"top\": topv, \"display\": \"block\", \"width\": \"11px\" }).html(\"<div>\" + rowl.toString().split(\"\").join(\"</div><div>\") + \"</div><div>\" + locale_info.row + \"</div>\");\r\n    }\r\n    else {\r\n        $(\"#luckysheet-row-count-show\").hide();\r\n    }\r\n\r\n    if (coll >= 4) {\r\n        let topv = top - 25;\r\n        if (topv < 0) {\r\n            topv = top + 5;\r\n        }\r\n\r\n        if (topv < scrollHeight) {\r\n            topv = scrollHeight + 10;\r\n        }\r\n\r\n        let leftv = left + width / 2;\r\n        if (width > drawWidth) {\r\n            leftv = scrollWidth + drawWidth / 2;\r\n        }\r\n\r\n        $(\"#luckysheet-column-count-show\").css({ \"left\": leftv, \"top\": topv, \"display\": \"block\" }).text(coll + locale_info.column);\r\n    }\r\n    else {\r\n        $(\"#luckysheet-column-count-show\").hide();\r\n    }\r\n}\r\n\r\nfunction selectHelpboxFill() {\r\n    let range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n    let rf = range[\"row_focus\"], cf = range[\"column_focus\"];\r\n    if (Store.config[\"merge\"] != null && (rf + \"_\" + cf) in Store.config[\"merge\"]) {\r\n        $(\"#luckysheet-helpbox-cell\").text(getRangetxt(Store.currentSheetIndex, {\r\n            column: [cf, cf],\r\n            row: [rf, rf],\r\n        }));\r\n    }\r\n    else {\r\n        $(\"#luckysheet-helpbox-cell\").text(getRangetxt(Store.currentSheetIndex, range));\r\n    }\r\n\r\n}\r\n\r\nexport {\r\n    seletedHighlistByindex,\r\n    selectHightlightShow,\r\n    selectIsOverlap,\r\n    selectionCopyShow,\r\n    collaborativeEditBox,\r\n    luckysheet_count_show,\r\n    selectHelpboxFill\r\n}\r\n"
  },
  {
    "path": "src/controllers/selection.js",
    "content": "import { selectHightlightShow, selectionCopyShow } from \"./select\";\r\nimport menuButton from \"./menuButton\";\r\nimport conditionformat from \"./conditionformat\";\r\nimport { checkProtectionLockedRangeList } from \"./protection\";\r\nimport editor from \"../global/editor\";\r\nimport tooltip from \"../global/tooltip\";\r\nimport formula from \"../global/formula\";\r\nimport { getBorderInfoCompute } from \"../global/border\";\r\nimport { getdatabyselection, getcellvalue, datagridgrowth } from \"../global/getdata\";\r\nimport { rowlenByRange } from \"../global/getRowlen\";\r\nimport { isEditMode, hasPartMC, isRealNum } from \"../global/validate\";\r\nimport { jfrefreshgrid, jfrefreshgrid_pastcut } from \"../global/refresh\";\r\nimport { genarate, update } from \"../global/format\";\r\nimport { getSheetIndex } from \"../methods/get\";\r\nimport { replaceHtml, getObjType, luckysheetfontformat } from \"../utils/util\";\r\nimport Store from \"../store\";\r\nimport locale from \"../locale/locale\";\r\nimport imageCtrl from \"./imageCtrl\";\r\n\r\nconst selection = {\r\n    clearcopy: function(e) {\r\n        let clipboardData = window.clipboardData; //for IE\r\n        if (!clipboardData) {\r\n            // for chrome\r\n            if (!!e) {\r\n                clipboardData = e.originalEvent.clipboardData;\r\n            }\r\n        }\r\n        let cpdata = \" \";\r\n\r\n        Store.luckysheet_selection_range = [];\r\n        selectionCopyShow();\r\n        // Store.luckysheet_copy_save = {};\r\n\r\n        if (!clipboardData) {\r\n            let textarea = $(\"#luckysheet-copy-content\").css(\"visibility\", \"hidden\");\r\n            textarea.val(cpdata);\r\n            textarea.focus();\r\n            textarea.select();\r\n            // 等50毫秒，keyPress事件发生了再去处理数据\r\n            setTimeout(function() {\r\n                textarea.blur().css(\"visibility\", \"visible\");\r\n            }, 10);\r\n        } else {\r\n            clipboardData.setData(\"Text\", cpdata);\r\n            return false; //否则设不生效\r\n        }\r\n    },\r\n    getHtmlBorderStyle: function(type, color) {\r\n        let style = \"\";\r\n        let borderType = {\r\n            0: \"none\",\r\n            1: \"Thin\",\r\n            2: \"Hair\",\r\n            3: \"Dotted\",\r\n            4: \"Dashed\",\r\n            5: \"DashDot\",\r\n            6: \"DashDotDot\",\r\n            7: \"Double\",\r\n            8: \"Medium\",\r\n            9: \"MediumDashed\",\r\n            10: \"MediumDashDot\",\r\n            11: \"MediumDashDotDot\",\r\n            12: \"SlantedDashDot\",\r\n            13: \"Thick\",\r\n        };\r\n        type = borderType[type.toString()];\r\n\r\n        if (type.indexOf(\"Medium\") > -1) {\r\n            style += \"1pt \";\r\n        } else if (type == \"Thick\") {\r\n            style += \"1.5pt \";\r\n        } else {\r\n            style += \"0.5pt \";\r\n        }\r\n\r\n        if (type == \"Hair\") {\r\n            style += \"double \";\r\n        } else if (type.indexOf(\"DashDotDot\") > -1) {\r\n            style += \"dotted \";\r\n        } else if (type.indexOf(\"DashDot\") > -1) {\r\n            style += \"dashed \";\r\n        } else if (type.indexOf(\"Dotted\") > -1) {\r\n            style += \"dotted \";\r\n        } else if (type.indexOf(\"Dashed\") > -1) {\r\n            style += \"dashed \";\r\n        } else {\r\n            style += \"solid \";\r\n        }\r\n\r\n        return style + color + \";\";\r\n    },\r\n    copy: function(e) {\r\n        //copy事件\r\n        let clipboardData = window.clipboardData; //for IE\r\n        if (!clipboardData) {\r\n            // for chrome\r\n            clipboardData = e.originalEvent.clipboardData;\r\n        }\r\n\r\n        Store.luckysheet_selection_range = [];\r\n        //copy范围\r\n        let rowIndexArr = [],\r\n            colIndexArr = [];\r\n        let copyRange = [],\r\n            RowlChange = false,\r\n            HasMC = false;\r\n\r\n        for (let s = 0; s < Store.luckysheet_select_save.length; s++) {\r\n            let range = Store.luckysheet_select_save[s];\r\n\r\n            let r1 = range.row[0],\r\n                r2 = range.row[1];\r\n            let c1 = range.column[0],\r\n                c2 = range.column[1];\r\n\r\n            for (let copyR = r1; copyR <= r2; copyR++) {\r\n                if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][copyR] != null) {\r\n                    continue;\r\n                }\r\n\r\n                if (!rowIndexArr.includes(copyR)) {\r\n                    rowIndexArr.push(copyR);\r\n                }\r\n\r\n                if (Store.config[\"rowlen\"] != null && copyR in Store.config[\"rowlen\"]) {\r\n                    RowlChange = true;\r\n                }\r\n\r\n                for (let copyC = c1; copyC <= c2; copyC++) {\r\n                    if (Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][copyC] != null) {\r\n                        continue;\r\n                    }\r\n\r\n                    if (!colIndexArr.includes(copyC)) {\r\n                        colIndexArr.push(copyC);\r\n                    }\r\n\r\n                    let cell = Store.flowdata[copyR][copyC];\r\n\r\n                    if (getObjType(cell) == \"object\" && \"mc\" in cell && cell.mc.rs != null) {\r\n                        HasMC = true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            Store.luckysheet_selection_range.push({ row: range.row, column: range.column });\r\n            copyRange.push({ row: range.row, column: range.column });\r\n        }\r\n\r\n        selectionCopyShow();\r\n\r\n        //luckysheet内copy保存\r\n        Store.luckysheet_copy_save = {\r\n            dataSheetIndex: Store.currentSheetIndex,\r\n            copyRange: copyRange,\r\n            RowlChange: RowlChange,\r\n            HasMC: HasMC,\r\n        };\r\n\r\n        //copy范围数据拼接成table 赋给剪贴板\r\n        let _this = this;\r\n\r\n        let borderInfoCompute;\r\n        if (Store.config[\"borderInfo\"] && Store.config[\"borderInfo\"].length > 0) {\r\n            //边框\r\n            borderInfoCompute = getBorderInfoCompute();\r\n        }\r\n\r\n        let cpdata = \"\",\r\n            d = editor.deepCopyFlowData(Store.flowdata);\r\n        let colgroup = \"\";\r\n\r\n        // rowIndexArr = rowIndexArr.sort();\r\n        // colIndexArr = colIndexArr.sort();\r\n\r\n        for (let i = 0; i < rowIndexArr.length; i++) {\r\n            let r = rowIndexArr[i];\r\n\r\n            if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                continue;\r\n            }\r\n\r\n            // 将行高绑定到 <tr> 标签上\r\n            if (\r\n                Store.config == null ||\r\n                Store.config[\"rowlen\"] == null ||\r\n                Store.config[\"rowlen\"][r.toString()] == null\r\n            ) {\r\n                cpdata += '<tr height=\"19\">';\r\n            } else {\r\n                cpdata += `<tr height=\"${Store.config[\"rowlen\"][r.toString()]}\">`;\r\n            }\r\n\r\n            for (let j = 0; j < colIndexArr.length; j++) {\r\n                let c = colIndexArr[j];\r\n\r\n                if (r == rowIndexArr[0]) {\r\n                    if (\r\n                        Store.config == null ||\r\n                        Store.config[\"columnlen\"] == null ||\r\n                        Store.config[\"columnlen\"][c.toString()] == null\r\n                    ) {\r\n                        colgroup += '<col width=\"72px\"></col>';\r\n                    } else {\r\n                        colgroup += '<col width=\"' + Store.config[\"columnlen\"][c.toString()] + 'px\"></col>';\r\n                    }\r\n                }\r\n\r\n                if (Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c] != null) {\r\n                    continue;\r\n                }\r\n\r\n                let column = '<td ${span} style=\"${style}\">';\r\n\r\n                if (d[r] != null && d[r][c] != null) {\r\n                    let style = \"\",\r\n                        span = \"\";\r\n\r\n                    let reg = /^(w|W)((0?)|(0\\.0+))$/;\r\n                    let c_value;\r\n                    if (d[r][c].ct != null && d[r][c].ct.fa != null && d[r][c].ct.fa.match(reg)) {\r\n                        c_value = getcellvalue(r, c, d);\r\n                    } else {\r\n                        c_value = getcellvalue(r, c, d, \"m\");\r\n                    }\r\n\r\n                    style += menuButton.getStyleByCell(d, r, c);\r\n\r\n                    if (getObjType(d[r][c]) == \"object\" && \"mc\" in d[r][c]) {\r\n                        if (\"rs\" in d[r][c][\"mc\"]) {\r\n                            span = 'rowspan=\"' + d[r][c][\"mc\"].rs + '\" colspan=\"' + d[r][c][\"mc\"].cs + '\"';\r\n\r\n                            //边框\r\n                            if (borderInfoCompute && borderInfoCompute[r + \"_\" + c]) {\r\n                                let bl_obj = { color: {}, style: {} },\r\n                                    br_obj = { color: {}, style: {} },\r\n                                    bt_obj = { color: {}, style: {} },\r\n                                    bb_obj = { color: {}, style: {} };\r\n\r\n                                for (let bd_r = r; bd_r < r + d[r][c][\"mc\"].rs; bd_r++) {\r\n                                    for (let bd_c = c; bd_c < c + d[r][c][\"mc\"].cs; bd_c++) {\r\n                                        if (\r\n                                            bd_r == r &&\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] &&\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].t\r\n                                        ) {\r\n                                            let linetype = borderInfoCompute[bd_r + \"_\" + bd_c].t.style;\r\n                                            let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].t.color;\r\n\r\n                                            if (bt_obj[\"style\"][linetype] == null) {\r\n                                                bt_obj[\"style\"][linetype] = 1;\r\n                                            } else {\r\n                                                bt_obj[\"style\"][linetype] = bt_obj[\"style\"][linetype] + 1;\r\n                                            }\r\n\r\n                                            if (bt_obj[\"color\"][bcolor] == null) {\r\n                                                bt_obj[\"color\"][bcolor] = 1;\r\n                                            } else {\r\n                                                bt_obj[\"color\"][bcolor] = bt_obj[\"color\"][bcolor] + 1;\r\n                                            }\r\n                                        }\r\n\r\n                                        if (\r\n                                            bd_r == r + d[r][c][\"mc\"].rs - 1 &&\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] &&\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].b\r\n                                        ) {\r\n                                            let linetype = borderInfoCompute[bd_r + \"_\" + bd_c].b.style;\r\n                                            let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].b.color;\r\n\r\n                                            if (bb_obj[\"style\"][linetype] == null) {\r\n                                                bb_obj[\"style\"][linetype] = 1;\r\n                                            } else {\r\n                                                bb_obj[\"style\"][linetype] = bb_obj[\"style\"][linetype] + 1;\r\n                                            }\r\n\r\n                                            if (bb_obj[\"color\"][bcolor] == null) {\r\n                                                bb_obj[\"color\"][bcolor] = 1;\r\n                                            } else {\r\n                                                bb_obj[\"color\"][bcolor] = bb_obj[\"color\"][bcolor] + 1;\r\n                                            }\r\n                                        }\r\n\r\n                                        if (\r\n                                            bd_c == c &&\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] &&\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].l\r\n                                        ) {\r\n                                            let linetype = borderInfoCompute[r + \"_\" + c].l.style;\r\n                                            let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].l.color;\r\n\r\n                                            if (bl_obj[\"style\"][linetype] == null) {\r\n                                                bl_obj[\"style\"][linetype] = 1;\r\n                                            } else {\r\n                                                bl_obj[\"style\"][linetype] = bl_obj[\"style\"][linetype] + 1;\r\n                                            }\r\n\r\n                                            if (bl_obj[\"color\"][bcolor] == null) {\r\n                                                bl_obj[\"color\"][bcolor] = 1;\r\n                                            } else {\r\n                                                bl_obj[\"color\"][bcolor] = bl_obj[\"color\"][bcolor] + 1;\r\n                                            }\r\n                                        }\r\n\r\n                                        if (\r\n                                            bd_c == c + d[r][c][\"mc\"].cs - 1 &&\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] &&\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].r\r\n                                        ) {\r\n                                            let linetype = borderInfoCompute[bd_r + \"_\" + bd_c].r.style;\r\n                                            let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].r.color;\r\n\r\n                                            if (br_obj[\"style\"][linetype] == null) {\r\n                                                br_obj[\"style\"][linetype] = 1;\r\n                                            } else {\r\n                                                br_obj[\"style\"][linetype] = br_obj[\"style\"][linetype] + 1;\r\n                                            }\r\n\r\n                                            if (br_obj[\"color\"][bcolor] == null) {\r\n                                                br_obj[\"color\"][bcolor] = 1;\r\n                                            } else {\r\n                                                br_obj[\"color\"][bcolor] = br_obj[\"color\"][bcolor] + 1;\r\n                                            }\r\n                                        }\r\n                                    }\r\n                                }\r\n\r\n                                let rowlen = d[r][c][\"mc\"].rs,\r\n                                    collen = d[r][c][\"mc\"].cs;\r\n\r\n                                if (JSON.stringify(bl_obj).length > 23) {\r\n                                    let bl_color = null,\r\n                                        bl_style = null;\r\n\r\n                                    for (let x in bl_obj.color) {\r\n                                        if (bl_obj.color[x] >= rowlen / 2) {\r\n                                            bl_color = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    for (let x in bl_obj.style) {\r\n                                        if (bl_obj.style[x] >= rowlen / 2) {\r\n                                            bl_style = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    if (bl_color != null && bl_style != null) {\r\n                                        style += \"border-left:\" + _this.getHtmlBorderStyle(bl_style, bl_color);\r\n                                    }\r\n                                }\r\n\r\n                                if (JSON.stringify(br_obj).length > 23) {\r\n                                    let br_color = null,\r\n                                        br_style = null;\r\n\r\n                                    for (let x in br_obj.color) {\r\n                                        if (br_obj.color[x] >= rowlen / 2) {\r\n                                            br_color = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    for (let x in br_obj.style) {\r\n                                        if (br_obj.style[x] >= rowlen / 2) {\r\n                                            br_style = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    if (br_color != null && br_style != null) {\r\n                                        style += \"border-right:\" + _this.getHtmlBorderStyle(br_style, br_color);\r\n                                    }\r\n                                }\r\n\r\n                                if (JSON.stringify(bt_obj).length > 23) {\r\n                                    let bt_color = null,\r\n                                        bt_style = null;\r\n\r\n                                    for (let x in bt_obj.color) {\r\n                                        if (bt_obj.color[x] >= collen / 2) {\r\n                                            bt_color = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    for (let x in bt_obj.style) {\r\n                                        if (bt_obj.style[x] >= collen / 2) {\r\n                                            bt_style = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    if (bt_color != null && bt_style != null) {\r\n                                        style += \"border-top:\" + _this.getHtmlBorderStyle(bt_style, bt_color);\r\n                                    }\r\n                                }\r\n\r\n                                if (JSON.stringify(bb_obj).length > 23) {\r\n                                    let bb_color = null,\r\n                                        bb_style = null;\r\n\r\n                                    for (let x in bb_obj.color) {\r\n                                        if (bb_obj.color[x] >= collen / 2) {\r\n                                            bb_color = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    for (let x in bb_obj.style) {\r\n                                        if (bb_obj.style[x] >= collen / 2) {\r\n                                            bb_style = x;\r\n                                        }\r\n                                    }\r\n\r\n                                    if (bb_color != null && bb_style != null) {\r\n                                        style += \"border-bottom:\" + _this.getHtmlBorderStyle(bb_style, bb_color);\r\n                                    }\r\n                                }\r\n                            }\r\n                        } else {\r\n                            continue;\r\n                        }\r\n                    } else {\r\n                        //边框\r\n                        if (borderInfoCompute && borderInfoCompute[r + \"_\" + c]) {\r\n                            //左边框\r\n                            if (borderInfoCompute[r + \"_\" + c].l) {\r\n                                let linetype = borderInfoCompute[r + \"_\" + c].l.style;\r\n                                let bcolor = borderInfoCompute[r + \"_\" + c].l.color;\r\n                                style += \"border-left:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                            }\r\n\r\n                            //右边框\r\n                            if (borderInfoCompute[r + \"_\" + c].r) {\r\n                                let linetype = borderInfoCompute[r + \"_\" + c].r.style;\r\n                                let bcolor = borderInfoCompute[r + \"_\" + c].r.color;\r\n                                style += \"border-right:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                            }\r\n\r\n                            //下边框\r\n                            if (borderInfoCompute[r + \"_\" + c].b) {\r\n                                let linetype = borderInfoCompute[r + \"_\" + c].b.style;\r\n                                let bcolor = borderInfoCompute[r + \"_\" + c].b.color;\r\n                                style += \"border-bottom:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                            }\r\n\r\n                            //上边框\r\n                            if (borderInfoCompute[r + \"_\" + c].t) {\r\n                                let linetype = borderInfoCompute[r + \"_\" + c].t.style;\r\n                                let bcolor = borderInfoCompute[r + \"_\" + c].t.color;\r\n                                style += \"border-top:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    column = replaceHtml(column, { style: style, span: span });\r\n\r\n                    if (c_value == null) {\r\n                        c_value = getcellvalue(r, c, d);\r\n                    }\r\n                    if (c_value == null && d[r][c] && d[r][c].ct && d[r][c].ct.t == \"inlineStr\") {\r\n                        c_value = d[r][c].ct.s\r\n                            .map((val) => {\r\n                                const brDom = $('<br style=\"mso-data-placement:same-cell;\">');\r\n                                const splitValue = val.v.split(\"\\r\\n\");\r\n                                return splitValue\r\n                                    .map((item) => {\r\n                                        if (!item) {\r\n                                            return \"\";\r\n                                        }\r\n                                        const font = $(\"<font></font>\");\r\n                                        val.fs && font.css(\"font-size\", `${val.fs}pt`); //  字号\r\n                                        val.bl && font.css(\"font-weight\", \"bold\"); //  加粗\r\n                                        val.it && font.css(\"font-style\", \"italic\"); //  斜体\r\n                                        val.un && font.css(\"text-decoration\", \"underline\"); // 下划线\r\n                                        val.fc && font.css(\"color\", val.fc); //  字体颜色\r\n                                        if (val.cl) {\r\n                                            // 判断删除线\r\n                                            font.append(`<s>${item}</s>`);\r\n                                        } else {\r\n                                            font.text(item);\r\n                                        }\r\n                                        return font[0].outerHTML;\r\n                                    })\r\n                                    .join(brDom[0].outerHTML);\r\n                            })\r\n                            .join(\"\");\r\n                    }\r\n\r\n                    if (c_value == null) {\r\n                        c_value = \"\";\r\n                    }\r\n\r\n                    // c_value = formula.ltGtSignDeal(c_value)\r\n\r\n                    column += c_value;\r\n                } else {\r\n                    let style = \"\";\r\n\r\n                    //边框\r\n                    if (borderInfoCompute && borderInfoCompute[r + \"_\" + c]) {\r\n                        //左边框\r\n                        if (borderInfoCompute[r + \"_\" + c].l) {\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].l.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].l.color;\r\n                            style += \"border-left:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n\r\n                        //右边框\r\n                        if (borderInfoCompute[r + \"_\" + c].r) {\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].r.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].r.color;\r\n                            style += \"border-right:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n\r\n                        //下边框\r\n                        if (borderInfoCompute[r + \"_\" + c].b) {\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].b.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].b.color;\r\n                            style += \"border-bottom:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n\r\n                        //上边框\r\n                        if (borderInfoCompute[r + \"_\" + c].t) {\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].t.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].t.color;\r\n                            style += \"border-top:\" + _this.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n                    }\r\n\r\n                    column += \"\";\r\n\r\n                    column = replaceHtml(column, { style: style, span: \"\" });\r\n                    column += \"\";\r\n                }\r\n\r\n                column += \"</td>\";\r\n                cpdata += column;\r\n            }\r\n\r\n            cpdata += \"</tr>\";\r\n        }\r\n        cpdata =\r\n            '<table data-type=\"luckysheet_copy_action_table\">' +\r\n            `<colgroup>${colgroup}</colgroup>` +\r\n            cpdata +\r\n            \"</table>\";\r\n\r\n        Store.iscopyself = true;\r\n\r\n        if (!clipboardData) {\r\n            let textarea = $(\"#luckysheet-copy-content\");\r\n            textarea.html(cpdata);\r\n            textarea.focus();\r\n            textarea.select();\r\n            document.execCommand(\"selectAll\");\r\n            document.execCommand(\"Copy\");\r\n\r\n            // 等50毫秒，keyPress事件发生了再去处理数据\r\n            setTimeout(function() {\r\n                $(\"#luckysheet-copy-content\").blur();\r\n            }, 10);\r\n\r\n            // var oInput = document.createElement('input');\r\n            // oInput.setAttribute('readonly', 'readonly');\r\n            // oInput.value = cpdata;\r\n            // document.body.appendChild(oInput);\r\n            // oInput.select(); // 选择对象\r\n            // document.execCommand(\"Copy\");\r\n            // oInput.style.display='none';\r\n            // document.body.removeChild(oInput);\r\n        } else {\r\n            clipboardData.setData(\"Text\", cpdata);\r\n            return false; //否则设不生效\r\n        }\r\n    },\r\n    copybyformat: function(e, txt) {\r\n        //copy事件\r\n        let clipboardData = window.clipboardData; //for IE\r\n        if (!clipboardData) {\r\n            // for chrome\r\n            clipboardData = e.originalEvent && e.originalEvent.clipboardData;\r\n        }\r\n\r\n        Store.luckysheet_selection_range = [\r\n            { row: Store.luckysheet_select_save[0].row, column: Store.luckysheet_select_save[0].column },\r\n        ];\r\n        selectionCopyShow();\r\n\r\n        let cpdata = txt;\r\n        Store.iscopyself = true;\r\n\r\n        if (!clipboardData) {\r\n            let textarea = $(\"#luckysheet-copy-content\");\r\n            textarea.text(cpdata);\r\n            textarea.focus();\r\n            textarea.select();\r\n            document.execCommand(\"selectAll\");\r\n            document.execCommand(\"Copy\");\r\n            // 等50毫秒，keyPress事件发生了再去处理数据\r\n            setTimeout(function() {\r\n                textarea.blur();\r\n            }, 10);\r\n        } else {\r\n            clipboardData.setData(\"Text\", cpdata);\r\n            return false; //否则设不生效\r\n        }\r\n    },\r\n    isPasteAction: false,\r\n    paste: function(e, triggerType) {\r\n        //paste事件\r\n        let _this = this;\r\n\r\n        if (Store.allowEdit === false) {\r\n            return;\r\n        }\r\n\r\n        const _locale = locale();\r\n        const local_drag = _locale.drag;\r\n\r\n        let textarea = $(\"#luckysheet-copy-content\");\r\n        textarea.focus();\r\n        textarea.select();\r\n\r\n        // 等50毫秒，keyPress事件发生了再去处理数据\r\n        setTimeout(function() {\r\n            let data = textarea.html();\r\n\r\n            if (\r\n                data.indexOf(\"luckysheet_copy_action_table\") > -1 &&\r\n                Store.luckysheet_copy_save[\"copyRange\"] != null &&\r\n                Store.luckysheet_copy_save[\"copyRange\"].length > 0\r\n            ) {\r\n                if (Store.luckysheet_paste_iscut) {\r\n                    Store.luckysheet_paste_iscut = false;\r\n                    _this.pasteHandlerOfCutPaste(Store.luckysheet_copy_save);\r\n                    _this.clearcopy(e);\r\n                } else {\r\n                    _this.pasteHandlerOfCopyPaste(Store.luckysheet_copy_save);\r\n                }\r\n            } else if (data.indexOf(\"luckysheet_copy_action_image\") > -1) {\r\n                imageCtrl.pasteImgItem();\r\n            } else if (triggerType != \"btn\") {\r\n                _this.pasteHandler(data);\r\n            } else {\r\n                if (isEditMode()) {\r\n                    alert(local_drag.pasteMustKeybordAlert);\r\n                } else {\r\n                    tooltip.info(local_drag.pasteMustKeybordAlertHTMLTitle, local_drag.pasteMustKeybordAlertHTML);\r\n                }\r\n            }\r\n        }, 10);\r\n    },\r\n    pasteHandler: function(data, borderInfo) {\r\n        if (!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)) {\r\n            return;\r\n        }\r\n\r\n        if (Store.allowEdit === false) {\r\n            return;\r\n        }\r\n\r\n        const _locale = locale();\r\n        const locale_paste = _locale.paste;\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            if (isEditMode()) {\r\n                alert(locale_paste.errorNotAllowMulti);\r\n            } else {\r\n                tooltip.info(\r\n                    `<i class=\"fa fa-exclamation-triangle\"></i>${locale_paste.warning}`,\r\n                    locale_paste.errorNotAllowMulti,\r\n                );\r\n            }\r\n        }\r\n\r\n        if (typeof data == \"object\") {\r\n            if (data.length == 0) {\r\n                return;\r\n            }\r\n\r\n            let cfg = $.extend(true, {}, Store.config);\r\n            if (cfg[\"merge\"] == null) {\r\n                cfg[\"merge\"] = {};\r\n            }\r\n\r\n            if (JSON.stringify(borderInfo).length > 2 && cfg[\"borderInfo\"] == null) {\r\n                cfg[\"borderInfo\"] = [];\r\n            }\r\n\r\n            let copyh = data.length,\r\n                copyc = data[0].length;\r\n\r\n            let minh = Store.luckysheet_select_save[0].row[0], //应用范围首尾行\r\n                maxh = minh + copyh - 1;\r\n            let minc = Store.luckysheet_select_save[0].column[0], //应用范围首尾列\r\n                maxc = minc + copyc - 1;\r\n\r\n            //应用范围包含部分合并单元格，则return提示\r\n            let has_PartMC = false;\r\n            if (cfg[\"merge\"] != null) {\r\n                has_PartMC = hasPartMC(cfg, minh, maxh, minc, maxc);\r\n            }\r\n\r\n            if (has_PartMC) {\r\n                if (isEditMode()) {\r\n                    alert(locale_paste.errorNotAllowMerged);\r\n                } else {\r\n                    tooltip.info(\r\n                        `<i class=\"fa fa-exclamation-triangle\"></i>${locale_paste.warning}`,\r\n                        locale_paste.errorNotAllowMerged,\r\n                    );\r\n                }\r\n\r\n                return;\r\n            }\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata); //取数据\r\n            let rowMaxLength = d.length;\r\n            let cellMaxLength = d[0].length;\r\n\r\n            //若应用范围超过最大行或最大列，增加行列\r\n            let addr = maxh - rowMaxLength + 1,\r\n                addc = maxc - cellMaxLength + 1;\r\n            if (addr > 0 || addc > 0) {\r\n                d = datagridgrowth([].concat(d), addr, addc, true);\r\n            }\r\n\r\n            if (cfg[\"rowlen\"] == null) {\r\n                cfg[\"rowlen\"] = {};\r\n            }\r\n\r\n            let RowlChange = false;\r\n            let offsetMC = {};\r\n            for (let h = minh; h <= maxh; h++) {\r\n                let x = [].concat(d[h]);\r\n\r\n                let currentRowLen = Store.defaultrowlen;\r\n                if (cfg[\"rowlen\"][h] != null) {\r\n                    currentRowLen = cfg[\"rowlen\"][h];\r\n                }\r\n\r\n                for (let c = minc; c <= maxc; c++) {\r\n                    if (getObjType(x[c]) == \"object\" && \"mc\" in x[c]) {\r\n                        if (\"rs\" in x[c].mc) {\r\n                            delete cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c];\r\n                        }\r\n\r\n                        delete x[c].mc;\r\n                    }\r\n\r\n                    let value = null;\r\n                    if (data[h - minh] != null && data[h - minh][c - minc] != null) {\r\n                        value = data[h - minh][c - minc];\r\n                    }\r\n\r\n                    x[c] = $.extend(true, {}, value);\r\n\r\n                    if (value != null && \"mc\" in x[c]) {\r\n                        if (x[c][\"mc\"].rs != null) {\r\n                            x[c][\"mc\"].r = h;\r\n                            x[c][\"mc\"].c = c;\r\n\r\n                            cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c] = x[c][\"mc\"];\r\n\r\n                            offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c] = [x[c][\"mc\"].r, x[c][\"mc\"].c];\r\n                        } else {\r\n                            x[c] = {\r\n                                mc: {\r\n                                    r: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][0],\r\n                                    c: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][1],\r\n                                },\r\n                            };\r\n                        }\r\n                    }\r\n\r\n                    if (borderInfo[h - minh + \"_\" + (c - minc)]) {\r\n                        let bd_obj = {\r\n                            rangeType: \"cell\",\r\n                            value: {\r\n                                row_index: h,\r\n                                col_index: c,\r\n                                l: borderInfo[h - minh + \"_\" + (c - minc)].l,\r\n                                r: borderInfo[h - minh + \"_\" + (c - minc)].r,\r\n                                t: borderInfo[h - minh + \"_\" + (c - minc)].t,\r\n                                b: borderInfo[h - minh + \"_\" + (c - minc)].b,\r\n                            },\r\n                        };\r\n\r\n                        cfg[\"borderInfo\"].push(bd_obj);\r\n                    }\r\n\r\n                    let fontset = luckysheetfontformat(x[c]);\r\n                    let oneLineTextHeight = menuButton.getTextSize(\"田\", fontset)[1];\r\n                    //比较计算高度和当前高度取最大高度\r\n                    if (oneLineTextHeight > currentRowLen) {\r\n                        currentRowLen = oneLineTextHeight;\r\n                        RowlChange = true;\r\n                    }\r\n                }\r\n                d[h] = x;\r\n\r\n                if (currentRowLen != Store.defaultrowlen) {\r\n                    cfg[\"rowlen\"][h] = currentRowLen;\r\n                }\r\n            }\r\n\r\n            Store.luckysheet_select_save = [{ row: [minh, maxh], column: [minc, maxc] }];\r\n\r\n            if (addr > 0 || addc > 0 || RowlChange) {\r\n                let allParam = {\r\n                    cfg: cfg,\r\n                    RowlChange: true,\r\n                };\r\n                jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n            } else {\r\n                let allParam = {\r\n                    cfg: cfg,\r\n                };\r\n                jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n                selectHightlightShow();\r\n            }\r\n        } else {\r\n            data = data.replace(/\\r/g, \"\");\r\n            let dataChe = [];\r\n            let che = data.split(\"\\n\"),\r\n                colchelen = che[0].split(\"\\t\").length;\r\n\r\n            for (let i = 0; i < che.length; i++) {\r\n                if (che[i].split(\"\\t\").length < colchelen) {\r\n                    continue;\r\n                }\r\n\r\n                dataChe.push(che[i].split(\"\\t\"));\r\n            }\r\n\r\n            let d = editor.deepCopyFlowData(Store.flowdata); //取数据\r\n\r\n            let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n            let curR = last[\"row\"] == null ? 0 : last[\"row\"][0];\r\n            let curC = last[\"column\"] == null ? 0 : last[\"column\"][0];\r\n            let rlen = dataChe.length,\r\n                clen = dataChe[0].length;\r\n\r\n            //应用范围包含部分合并单元格，则return提示\r\n            let has_PartMC = false;\r\n            if (Store.config[\"merge\"] != null) {\r\n                has_PartMC = hasPartMC(Store.config, curR, curR + rlen - 1, curC, curC + clen - 1);\r\n            }\r\n\r\n            if (has_PartMC) {\r\n                if (isEditMode()) {\r\n                    alert(locale_paste.errorNotAllowMerged);\r\n                } else {\r\n                    tooltip.info(\r\n                        `<i class=\"fa fa-exclamation-triangle\"></i>${locale_paste.warning}`,\r\n                        locale_paste.errorNotAllowMerged,\r\n                    );\r\n                }\r\n                return;\r\n            }\r\n\r\n            let addr = curR + rlen - d.length,\r\n                addc = curC + clen - d[0].length;\r\n            if (addr > 0 || addc > 0) {\r\n                d = datagridgrowth([].concat(d), addr, addc, true);\r\n            }\r\n\r\n            for (let r = 0; r < rlen; r++) {\r\n                let x = [].concat(d[r + curR]);\r\n                for (let c = 0; c < clen; c++) {\r\n                    let originCell = x[c + curC];\r\n                    let value = dataChe[r][c];\r\n                    if (isRealNum(value)) {\r\n                        // 如果单元格设置了纯文本格式，那么就不要转成数值类型了，防止数值过大自动转成科学计数法\r\n                        if (originCell && originCell.ct && originCell.ct.fa === \"@\") {\r\n                            value = String(value);\r\n                        } else {\r\n                            value = parseFloat(value);\r\n                        }\r\n                    }\r\n                    if (originCell instanceof Object) {\r\n                        originCell.v = value;\r\n                        if (originCell.ct != null && originCell.ct.fa != null) {\r\n                            originCell.m = update(originCell[\"ct\"][\"fa\"], value);\r\n                        } else {\r\n                            originCell.m = value;\r\n                        }\r\n\r\n                        if (originCell.f != null && originCell.f.length > 0) {\r\n                            originCell.f = \"\";\r\n                            formula.delFunctionGroup(r + curR, c + curC, Store.currentSheetIndex);\r\n                        }\r\n                    } else {\r\n                        let cell = {};\r\n                        let mask = genarate(value);\r\n                        cell.v = mask[2];\r\n                        cell.ct = mask[1];\r\n                        cell.m = mask[0];\r\n\r\n                        x[c + curC] = cell;\r\n                    }\r\n                }\r\n                d[r + curR] = x;\r\n            }\r\n\r\n            last[\"row\"] = [curR, curR + rlen - 1];\r\n            last[\"column\"] = [curC, curC + clen - 1];\r\n\r\n            if (addr > 0 || addc > 0) {\r\n                let allParam = {\r\n                    RowlChange: true,\r\n                };\r\n                jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n            } else {\r\n                jfrefreshgrid(d, Store.luckysheet_select_save);\r\n                selectHightlightShow();\r\n            }\r\n        }\r\n    },\r\n    pasteHandlerOfCutPaste: function(copyRange) {\r\n        if (!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)) {\r\n            return;\r\n        }\r\n        if (Store.allowEdit === false) {\r\n            return;\r\n        }\r\n\r\n        const _locale = locale();\r\n        const locale_paste = _locale.paste;\r\n\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        if (cfg[\"merge\"] == null) {\r\n            cfg[\"merge\"] = {};\r\n        }\r\n\r\n        //复制范围\r\n        let copyHasMC = copyRange[\"HasMC\"];\r\n        let copyRowlChange = copyRange[\"RowlChange\"];\r\n        let copySheetIndex = copyRange[\"dataSheetIndex\"];\r\n\r\n        let c_r1 = copyRange[\"copyRange\"][0].row[0],\r\n            c_r2 = copyRange[\"copyRange\"][0].row[1],\r\n            c_c1 = copyRange[\"copyRange\"][0].column[0],\r\n            c_c2 = copyRange[\"copyRange\"][0].column[1];\r\n\r\n        let copyData = $.extend(\r\n            true,\r\n            [],\r\n            getdatabyselection({ row: [c_r1, c_r2], column: [c_c1, c_c2] }, copySheetIndex),\r\n        );\r\n\r\n        let copyh = copyData.length,\r\n            copyc = copyData[0].length;\r\n\r\n        //应用范围\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let minh = last[\"row_focus\"],\r\n            maxh = minh + copyh - 1; //应用范围首尾行\r\n        let minc = last[\"column_focus\"],\r\n            maxc = minc + copyc - 1; //应用范围首尾列\r\n\r\n        //应用范围包含部分合并单元格，则提示\r\n        let has_PartMC = false;\r\n        if (cfg[\"merge\"] != null) {\r\n            has_PartMC = hasPartMC(cfg, minh, maxh, minc, maxc);\r\n        }\r\n\r\n        if (has_PartMC) {\r\n            if (isEditMode()) {\r\n                alert(locale_paste.errorNotAllowMerged);\r\n            } else {\r\n                tooltip.info(\r\n                    `<i class=\"fa fa-exclamation-triangle\"></i>${locale_paste.warning}`,\r\n                    locale_paste.errorNotAllowMerged,\r\n                );\r\n            }\r\n            return;\r\n        }\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata); //取数据\r\n        let rowMaxLength = d.length;\r\n        let cellMaxLength = d[0].length;\r\n\r\n        let addr = copyh + minh - rowMaxLength,\r\n            addc = copyc + minc - cellMaxLength;\r\n        if (addr > 0 || addc > 0) {\r\n            d = datagridgrowth([].concat(d), addr, addc, true);\r\n        }\r\n\r\n        let borderInfoCompute = getBorderInfoCompute(copySheetIndex);\r\n        let c_dataVerification = $.extend(\r\n            true,\r\n            {},\r\n            Store.luckysheetfile[getSheetIndex(copySheetIndex)][\"dataVerification\"],\r\n        );\r\n        let dataVerification = $.extend(\r\n            true,\r\n            {},\r\n            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dataVerification\"],\r\n        );\r\n\r\n        //剪切粘贴在当前表操作，删除剪切范围内数据、合并单元格和数据验证\r\n        if (Store.currentSheetIndex == copySheetIndex) {\r\n            for (let i = c_r1; i <= c_r2; i++) {\r\n                for (let j = c_c1; j <= c_c2; j++) {\r\n                    let cell = d[i][j];\r\n\r\n                    if (getObjType(cell) == \"object\" && \"mc\" in cell) {\r\n                        if (\"rs\" in cell[\"mc\"]) {\r\n                            delete cfg[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n                        }\r\n                        delete cell[\"mc\"];\r\n                    }\r\n\r\n                    d[i][j] = null;\r\n\r\n                    delete dataVerification[i + \"_\" + j];\r\n                }\r\n            }\r\n\r\n            //边框\r\n            if (cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0) {\r\n                let source_borderInfo = [];\r\n\r\n                for (let i = 0; i < cfg[\"borderInfo\"].length; i++) {\r\n                    let bd_rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n                    if (bd_rangeType == \"range\") {\r\n                        let bd_range = cfg[\"borderInfo\"][i].range;\r\n                        let bd_emptyRange = [];\r\n\r\n                        for (let j = 0; j < bd_range.length; j++) {\r\n                            bd_emptyRange = bd_emptyRange.concat(\r\n                                conditionformat.CFSplitRange(\r\n                                    bd_range[j],\r\n                                    { row: [c_r1, c_r2], column: [c_c1, c_c2] },\r\n                                    { row: [minh, maxh], column: [minc, maxc] },\r\n                                    \"restPart\",\r\n                                ),\r\n                            );\r\n                        }\r\n\r\n                        cfg[\"borderInfo\"][i].range = bd_emptyRange;\r\n\r\n                        source_borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                    } else if (bd_rangeType == \"cell\") {\r\n                        let bd_r = cfg[\"borderInfo\"][i].value.row_index;\r\n                        let bd_c = cfg[\"borderInfo\"][i].value.col_index;\r\n\r\n                        if (!(bd_r >= c_r1 && bd_r <= c_r2 && bd_c >= c_c1 && bd_c <= c_c2)) {\r\n                            source_borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                cfg[\"borderInfo\"] = source_borderInfo;\r\n            }\r\n        }\r\n\r\n        let offsetMC = {};\r\n        for (let h = minh; h <= maxh; h++) {\r\n            let x = [].concat(d[h]);\r\n\r\n            for (let c = minc; c <= maxc; c++) {\r\n                if (borderInfoCompute[c_r1 + h - minh + \"_\" + (c_c1 + c - minc)]) {\r\n                    let bd_obj = {\r\n                        rangeType: \"cell\",\r\n                        value: {\r\n                            row_index: h,\r\n                            col_index: c,\r\n                            l: borderInfoCompute[c_r1 + h - minh + \"_\" + (c_c1 + c - minc)].l,\r\n                            r: borderInfoCompute[c_r1 + h - minh + \"_\" + (c_c1 + c - minc)].r,\r\n                            t: borderInfoCompute[c_r1 + h - minh + \"_\" + (c_c1 + c - minc)].t,\r\n                            b: borderInfoCompute[c_r1 + h - minh + \"_\" + (c_c1 + c - minc)].b,\r\n                        },\r\n                    };\r\n\r\n                    if (cfg[\"borderInfo\"] == null) {\r\n                        cfg[\"borderInfo\"] = [];\r\n                    }\r\n\r\n                    cfg[\"borderInfo\"].push(bd_obj);\r\n                } else if (borderInfoCompute[h + \"_\" + c]) {\r\n                    let bd_obj = {\r\n                        rangeType: \"cell\",\r\n                        value: {\r\n                            row_index: h,\r\n                            col_index: c,\r\n                            l: null,\r\n                            r: null,\r\n                            t: null,\r\n                            b: null,\r\n                        },\r\n                    };\r\n\r\n                    if (cfg[\"borderInfo\"] == null) {\r\n                        cfg[\"borderInfo\"] = [];\r\n                    }\r\n\r\n                    cfg[\"borderInfo\"].push(bd_obj);\r\n                }\r\n\r\n                //数据验证 剪切\r\n                if (c_dataVerification[c_r1 + h - minh + \"_\" + (c_c1 + c - minc)]) {\r\n                    dataVerification[h + \"_\" + c] = c_dataVerification[c_r1 + h - minh + \"_\" + (c_c1 + c - minc)];\r\n                }\r\n\r\n                if (getObjType(x[c]) == \"object\" && \"mc\" in x[c]) {\r\n                    if (\"rs\" in x[c].mc) {\r\n                        delete cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c];\r\n                    }\r\n                    delete x[c].mc;\r\n                }\r\n\r\n                let value = null;\r\n                if (copyData[h - minh] != null && copyData[h - minh][c - minc] != null) {\r\n                    value = copyData[h - minh][c - minc];\r\n                }\r\n\r\n                x[c] = $.extend(true, {}, value);\r\n\r\n                if (value != null && copyHasMC && \"mc\" in x[c]) {\r\n                    if (x[c][\"mc\"].rs != null) {\r\n                        x[c][\"mc\"].r = h;\r\n                        x[c][\"mc\"].c = c;\r\n\r\n                        cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c] = x[c][\"mc\"];\r\n\r\n                        offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c] = [x[c][\"mc\"].r, x[c][\"mc\"].c];\r\n                    } else {\r\n                        x[c] = {\r\n                            mc: {\r\n                                r: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][0],\r\n                                c: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][1],\r\n                            },\r\n                        };\r\n                    }\r\n                }\r\n            }\r\n\r\n            d[h] = x;\r\n        }\r\n\r\n        last[\"row\"] = [minh, maxh];\r\n        last[\"column\"] = [minc, maxc];\r\n\r\n        //若有行高改变，重新计算行高改变\r\n        if (copyRowlChange) {\r\n            if (Store.currentSheetIndex != copySheetIndex) {\r\n                cfg = rowlenByRange(d, minh, maxh, cfg);\r\n            } else {\r\n                cfg = rowlenByRange(d, c_r1, c_r2, cfg);\r\n                cfg = rowlenByRange(d, minh, maxh, cfg);\r\n            }\r\n        }\r\n\r\n        let source, target;\r\n        if (Store.currentSheetIndex != copySheetIndex) {\r\n            //跨表操作\r\n            let sourceData = $.extend(true, [], Store.luckysheetfile[getSheetIndex(copySheetIndex)][\"data\"]);\r\n            let sourceConfig = $.extend(true, {}, Store.luckysheetfile[getSheetIndex(copySheetIndex)][\"config\"]);\r\n\r\n            let sourceCurData = $.extend(true, [], sourceData);\r\n            let sourceCurConfig = $.extend(true, {}, sourceConfig);\r\n            if (sourceCurConfig[\"merge\"] == null) {\r\n                sourceCurConfig[\"merge\"] = {};\r\n            }\r\n\r\n            for (let source_r = c_r1; source_r <= c_r2; source_r++) {\r\n                for (let source_c = c_c1; source_c <= c_c2; source_c++) {\r\n                    let cell = sourceCurData[source_r][source_c];\r\n\r\n                    if (getObjType(cell) == \"object\" && \"mc\" in cell) {\r\n                        if (\"rs\" in cell[\"mc\"]) {\r\n                            delete sourceCurConfig[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n                        }\r\n                        delete cell[\"mc\"];\r\n                    }\r\n                    sourceCurData[source_r][source_c] = null;\r\n                }\r\n            }\r\n\r\n            if (copyRowlChange) {\r\n                sourceCurConfig = rowlenByRange(sourceCurData, c_r1, c_r2, sourceCurConfig);\r\n            }\r\n\r\n            //边框\r\n            if (sourceCurConfig[\"borderInfo\"] && sourceCurConfig[\"borderInfo\"].length > 0) {\r\n                let source_borderInfo = [];\r\n\r\n                for (let i = 0; i < sourceCurConfig[\"borderInfo\"].length; i++) {\r\n                    let bd_rangeType = sourceCurConfig[\"borderInfo\"][i].rangeType;\r\n\r\n                    if (bd_rangeType == \"range\") {\r\n                        let bd_range = sourceCurConfig[\"borderInfo\"][i].range;\r\n                        let bd_emptyRange = [];\r\n\r\n                        for (let j = 0; j < bd_range.length; j++) {\r\n                            bd_emptyRange = bd_emptyRange.concat(\r\n                                conditionformat.CFSplitRange(\r\n                                    bd_range[j],\r\n                                    { row: [c_r1, c_r2], column: [c_c1, c_c2] },\r\n                                    { row: [minh, maxh], column: [minc, maxc] },\r\n                                    \"restPart\",\r\n                                ),\r\n                            );\r\n                        }\r\n\r\n                        sourceCurConfig[\"borderInfo\"][i].range = bd_emptyRange;\r\n\r\n                        source_borderInfo.push(sourceCurConfig[\"borderInfo\"][i]);\r\n                    } else if (bd_rangeType == \"cell\") {\r\n                        let bd_r = sourceCurConfig[\"borderInfo\"][i].value.row_index;\r\n                        let bd_c = sourceCurConfig[\"borderInfo\"][i].value.col_index;\r\n\r\n                        if (!(bd_r >= c_r1 && bd_r <= c_r2 && bd_c >= c_c1 && bd_c <= c_c2)) {\r\n                            source_borderInfo.push(sourceCurConfig[\"borderInfo\"][i]);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                sourceCurConfig[\"borderInfo\"] = source_borderInfo;\r\n            }\r\n\r\n            //条件格式\r\n            let source_cdformat = $.extend(\r\n                true,\r\n                [],\r\n                Store.luckysheetfile[getSheetIndex(copySheetIndex)][\"luckysheet_conditionformat_save\"],\r\n            );\r\n            let source_curCdformat = $.extend(true, [], source_cdformat);\r\n            let ruleArr = [];\r\n            if (source_curCdformat != null && source_curCdformat.length > 0) {\r\n                for (let i = 0; i < source_curCdformat.length; i++) {\r\n                    let source_curCdformat_cellrange = source_curCdformat[i].cellrange;\r\n                    let emptyRange = [];\r\n                    let emptyRange2 = [];\r\n\r\n                    for (let j = 0; j < source_curCdformat_cellrange.length; j++) {\r\n                        let range = conditionformat.CFSplitRange(\r\n                            source_curCdformat_cellrange[j],\r\n                            { row: [c_r1, c_r2], column: [c_c1, c_c2] },\r\n                            { row: [minh, maxh], column: [minc, maxc] },\r\n                            \"restPart\",\r\n                        );\r\n\r\n                        emptyRange = emptyRange.concat(range);\r\n\r\n                        let range2 = conditionformat.CFSplitRange(\r\n                            source_curCdformat_cellrange[j],\r\n                            { row: [c_r1, c_r2], column: [c_c1, c_c2] },\r\n                            { row: [minh, maxh], column: [minc, maxc] },\r\n                            \"operatePart\",\r\n                        );\r\n\r\n                        if (range2.length > 0) {\r\n                            emptyRange2 = emptyRange2.concat(range2);\r\n                        }\r\n                    }\r\n\r\n                    source_curCdformat[i].cellrange = emptyRange;\r\n\r\n                    if (emptyRange2.length > 0) {\r\n                        let ruleObj = $.extend(true, {}, source_curCdformat[i]);\r\n                        ruleObj.cellrange = emptyRange2;\r\n                        ruleArr.push(ruleObj);\r\n                    }\r\n                }\r\n            }\r\n\r\n            let target_cdformat = $.extend(\r\n                true,\r\n                [],\r\n                Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"],\r\n            );\r\n            let target_curCdformat = $.extend(true, [], target_cdformat);\r\n            if (ruleArr.length > 0) {\r\n                target_curCdformat = target_curCdformat.concat(ruleArr);\r\n            }\r\n\r\n            //数据验证\r\n            for (let i = c_r1; i <= c_r2; i++) {\r\n                for (let j = c_c1; j <= c_c2; j++) {\r\n                    delete c_dataVerification[i + \"_\" + j];\r\n                }\r\n            }\r\n\r\n            source = {\r\n                sheetIndex: copySheetIndex,\r\n                data: sourceData,\r\n                curData: sourceCurData,\r\n                config: sourceConfig,\r\n                curConfig: sourceCurConfig,\r\n                cdformat: source_cdformat,\r\n                curCdformat: source_curCdformat,\r\n                dataVerification: $.extend(\r\n                    true,\r\n                    {},\r\n                    Store.luckysheetfile[getSheetIndex(copySheetIndex)][\"dataVerification\"],\r\n                ),\r\n                curDataVerification: c_dataVerification,\r\n                range: {\r\n                    row: [c_r1, c_r2],\r\n                    column: [c_c1, c_c2],\r\n                },\r\n            };\r\n            target = {\r\n                sheetIndex: Store.currentSheetIndex,\r\n                data: Store.flowdata,\r\n                curData: d,\r\n                config: $.extend(true, {}, Store.config),\r\n                curConfig: cfg,\r\n                cdformat: target_cdformat,\r\n                curCdformat: target_curCdformat,\r\n                dataVerification: $.extend(\r\n                    true,\r\n                    {},\r\n                    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dataVerification\"],\r\n                ),\r\n                curDataVerification: dataVerification,\r\n                range: {\r\n                    row: [minh, maxh],\r\n                    column: [minc, maxc],\r\n                },\r\n            };\r\n        } else {\r\n            //条件格式\r\n            let cdformat = $.extend(\r\n                true,\r\n                [],\r\n                Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"],\r\n            );\r\n            let curCdformat = $.extend(true, [], cdformat);\r\n            if (curCdformat != null && curCdformat.length > 0) {\r\n                for (let i = 0; i < curCdformat.length; i++) {\r\n                    let cellrange = curCdformat[i].cellrange;\r\n                    let emptyRange = [];\r\n\r\n                    for (let j = 0; j < cellrange.length; j++) {\r\n                        let range = conditionformat.CFSplitRange(\r\n                            cellrange[j],\r\n                            { row: [c_r1, c_r2], column: [c_c1, c_c2] },\r\n                            { row: [minh, maxh], column: [minc, maxc] },\r\n                            \"allPart\",\r\n                        );\r\n\r\n                        emptyRange = emptyRange.concat(range);\r\n                    }\r\n\r\n                    curCdformat[i].cellrange = emptyRange;\r\n                }\r\n            }\r\n\r\n            //当前表操作\r\n            source = {\r\n                sheetIndex: Store.currentSheetIndex,\r\n                data: Store.flowdata,\r\n                curData: d,\r\n                config: $.extend(true, {}, Store.config),\r\n                curConfig: cfg,\r\n                cdformat: cdformat,\r\n                curCdformat: curCdformat,\r\n                dataVerification: $.extend(\r\n                    true,\r\n                    {},\r\n                    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dataVerification\"],\r\n                ),\r\n                curDataVerification: dataVerification,\r\n                range: {\r\n                    row: [c_r1, c_r2],\r\n                    column: [c_c1, c_c2],\r\n                },\r\n            };\r\n            target = {\r\n                sheetIndex: Store.currentSheetIndex,\r\n                data: Store.flowdata,\r\n                curData: d,\r\n                config: $.extend(true, {}, Store.config),\r\n                curConfig: cfg,\r\n                cdformat: cdformat,\r\n                curCdformat: curCdformat,\r\n                dataVerification: $.extend(\r\n                    true,\r\n                    {},\r\n                    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dataVerification\"],\r\n                ),\r\n                curDataVerification: dataVerification,\r\n                range: {\r\n                    row: [minh, maxh],\r\n                    column: [minc, maxc],\r\n                },\r\n            };\r\n        }\r\n\r\n        if (addr > 0 || addc > 0) {\r\n            jfrefreshgrid_pastcut(source, target, true);\r\n        } else {\r\n            jfrefreshgrid_pastcut(source, target, copyRowlChange);\r\n        }\r\n    },\r\n    pasteHandlerOfCopyPaste: function(copyRange) {\r\n        if (!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)) {\r\n            return;\r\n        }\r\n\r\n        const _locale = locale();\r\n        const locale_paste = _locale.paste;\r\n\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        if (cfg[\"merge\"] == null) {\r\n            cfg[\"merge\"] = {};\r\n        }\r\n\r\n        //复制范围\r\n        let copyHasMC = copyRange[\"HasMC\"];\r\n        let copyRowlChange = copyRange[\"RowlChange\"];\r\n        let copySheetIndex = copyRange[\"dataSheetIndex\"];\r\n\r\n        let c_r1 = copyRange[\"copyRange\"][0].row[0],\r\n            c_r2 = copyRange[\"copyRange\"][0].row[1],\r\n            c_c1 = copyRange[\"copyRange\"][0].column[0],\r\n            c_c2 = copyRange[\"copyRange\"][0].column[1];\r\n\r\n        let arr = [],\r\n            isSameRow = false;\r\n        for (let i = 0; i < copyRange[\"copyRange\"].length; i++) {\r\n            let arrData = getdatabyselection(\r\n                { row: copyRange[\"copyRange\"][i].row, column: copyRange[\"copyRange\"][i].column },\r\n                copySheetIndex,\r\n            );\r\n            if (copyRange[\"copyRange\"].length > 1) {\r\n                if (c_r1 == copyRange[\"copyRange\"][1].row[0] && c_r2 == copyRange[\"copyRange\"][1].row[1]) {\r\n                    arrData = arrData[0].map(function(col, a) {\r\n                        return arrData.map(function(row) {\r\n                            return row[a];\r\n                        });\r\n                    });\r\n\r\n                    arr = arr.concat(arrData);\r\n\r\n                    isSameRow = true;\r\n                } else if (c_c1 == copyRange[\"copyRange\"][1].column[0] && c_c2 == copyRange[\"copyRange\"][1].column[1]) {\r\n                    arr = arr.concat(arrData);\r\n                }\r\n            } else {\r\n                arr = arrData;\r\n            }\r\n        }\r\n\r\n        if (isSameRow) {\r\n            arr = arr[0].map(function(col, b) {\r\n                return arr.map(function(row) {\r\n                    return row[b];\r\n                });\r\n            });\r\n        }\r\n\r\n        let copyData = $.extend(true, [], arr);\r\n\r\n        //多重选择选择区域 单元格如果有函数 则只取值 不取函数\r\n        if (copyRange[\"copyRange\"].length > 1) {\r\n            for (let i = 0; i < copyData.length; i++) {\r\n                for (let j = 0; j < copyData[i].length; j++) {\r\n                    if (copyData[i][j] != null && copyData[i][j].f != null) {\r\n                        delete copyData[i][j].f;\r\n                        delete copyData[i][j].spl;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        let copyh = copyData.length,\r\n            copyc = copyData[0].length;\r\n\r\n        //应用范围\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let minh = last[\"row\"][0],\r\n            maxh = last[\"row\"][1]; //应用范围首尾行\r\n        let minc = last[\"column\"][0],\r\n            maxc = last[\"column\"][1]; //应用范围首尾列\r\n\r\n        let mh = (maxh - minh + 1) % copyh;\r\n        let mc = (maxc - minc + 1) % copyc;\r\n\r\n        if (mh != 0 || mc != 0) {\r\n            //若应用范围不是copydata行列数的整数倍，则取copydata的行列数\r\n            maxh = minh + copyh - 1;\r\n            maxc = minc + copyc - 1;\r\n        }\r\n\r\n        //应用范围包含部分合并单元格，则提示\r\n        let has_PartMC = false;\r\n        if (cfg[\"merge\"] != null) {\r\n            has_PartMC = hasPartMC(cfg, minh, maxh, minc, maxc);\r\n        }\r\n\r\n        if (has_PartMC) {\r\n            if (isEditMode()) {\r\n                alert(locale_paste.errorNotAllowMerged);\r\n            } else {\r\n                tooltip.info(\r\n                    `<i class=\"fa fa-exclamation-triangle\"></i>${locale_paste.warning}`,\r\n                    locale_paste.errorNotAllowMerged,\r\n                );\r\n            }\r\n            return;\r\n        }\r\n\r\n        let timesH = (maxh - minh + 1) / copyh;\r\n        let timesC = (maxc - minc + 1) / copyc;\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata); //取数据\r\n        let rowMaxLength = d.length;\r\n        let cellMaxLength = d[0].length;\r\n\r\n        //若应用范围超过最大行或最大列，增加行列\r\n        let addr = copyh + minh - rowMaxLength,\r\n            addc = copyc + minc - cellMaxLength;\r\n        if (addr > 0 || addc > 0) {\r\n            d = datagridgrowth([].concat(d), addr, addc, true);\r\n        }\r\n\r\n        let borderInfoCompute = getBorderInfoCompute(copySheetIndex);\r\n        let c_dataVerification = $.extend(\r\n            true,\r\n            {},\r\n            Store.luckysheetfile[getSheetIndex(copySheetIndex)].dataVerification,\r\n        );\r\n        let dataVerification = null;\r\n\r\n        let mth = 0,\r\n            mtc = 0,\r\n            maxcellCahe = 0,\r\n            maxrowCache = 0;\r\n        for (let th = 1; th <= timesH; th++) {\r\n            for (let tc = 1; tc <= timesC; tc++) {\r\n                mth = minh + (th - 1) * copyh;\r\n                mtc = minc + (tc - 1) * copyc;\r\n                maxrowCache = minh + th * copyh;\r\n                maxcellCahe = minc + tc * copyc;\r\n\r\n                //行列位移值 用于单元格有函数\r\n                let offsetRow = mth - c_r1;\r\n                let offsetCol = mtc - c_c1;\r\n\r\n                let offsetMC = {};\r\n                for (let h = mth; h < maxrowCache; h++) {\r\n                    let x = [].concat(d[h]);\r\n\r\n                    for (let c = mtc; c < maxcellCahe; c++) {\r\n                        if (borderInfoCompute[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)]) {\r\n                            let bd_obj = {\r\n                                rangeType: \"cell\",\r\n                                value: {\r\n                                    row_index: h,\r\n                                    col_index: c,\r\n                                    l: borderInfoCompute[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)].l,\r\n                                    r: borderInfoCompute[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)].r,\r\n                                    t: borderInfoCompute[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)].t,\r\n                                    b: borderInfoCompute[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)].b,\r\n                                },\r\n                            };\r\n\r\n                            if (cfg[\"borderInfo\"] == null) {\r\n                                cfg[\"borderInfo\"] = [];\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        } else if (borderInfoCompute[h + \"_\" + c]) {\r\n                            let bd_obj = {\r\n                                rangeType: \"cell\",\r\n                                value: {\r\n                                    row_index: h,\r\n                                    col_index: c,\r\n                                    l: null,\r\n                                    r: null,\r\n                                    t: null,\r\n                                    b: null,\r\n                                },\r\n                            };\r\n\r\n                            if (cfg[\"borderInfo\"] == null) {\r\n                                cfg[\"borderInfo\"] = [];\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n\r\n                        //数据验证 复制\r\n                        if (c_dataVerification[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)]) {\r\n                            if (dataVerification == null) {\r\n                                dataVerification = $.extend(\r\n                                    true,\r\n                                    {},\r\n                                    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].dataVerification,\r\n                                );\r\n                            }\r\n\r\n                            dataVerification[h + \"_\" + c] = c_dataVerification[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)];\r\n                        }\r\n\r\n                        if (getObjType(x[c]) == \"object\" && \"mc\" in x[c]) {\r\n                            if (\"rs\" in x[c].mc) {\r\n                                delete cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c];\r\n                            }\r\n                            delete x[c].mc;\r\n                        }\r\n\r\n                        let value = null;\r\n                        if (copyData[h - mth] != null && copyData[h - mth][c - mtc] != null) {\r\n                            value = $.extend(true, {}, copyData[h - mth][c - mtc]);\r\n                        }\r\n\r\n                        if (value != null && value.f != null) {\r\n                            let func = value.f;\r\n\r\n                            if (offsetRow > 0) {\r\n                                func = \"=\" + formula.functionCopy(func, \"down\", offsetRow);\r\n                            }\r\n\r\n                            if (offsetRow < 0) {\r\n                                func = \"=\" + formula.functionCopy(func, \"up\", Math.abs(offsetRow));\r\n                            }\r\n\r\n                            if (offsetCol > 0) {\r\n                                func = \"=\" + formula.functionCopy(func, \"right\", offsetCol);\r\n                            }\r\n\r\n                            if (offsetCol < 0) {\r\n                                func = \"=\" + formula.functionCopy(func, \"left\", Math.abs(offsetCol));\r\n                            }\r\n\r\n                            let funcV = formula.execfunction(func, h, c, undefined, true);\r\n\r\n                            if (value.spl != null) {\r\n                                value.f = funcV[2];\r\n                                value.v = funcV[1];\r\n                                value.spl = funcV[3].data;\r\n                            } else {\r\n                                value.f = funcV[2];\r\n                                value.v = funcV[1];\r\n\r\n                                if (value.ct != null && value.ct[\"fa\"] != null) {\r\n                                    value.m = update(value.ct[\"fa\"], funcV[1]);\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        x[c] = $.extend(true, {}, value);\r\n\r\n                        if (value != null && copyHasMC && \"mc\" in x[c]) {\r\n                            if (x[c][\"mc\"].rs != null) {\r\n                                x[c][\"mc\"].r = h;\r\n                                x[c][\"mc\"].c = c;\r\n\r\n                                cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c] = x[c][\"mc\"];\r\n\r\n                                offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c] = [x[c][\"mc\"].r, x[c][\"mc\"].c];\r\n                            } else {\r\n                                x[c] = {\r\n                                    mc: {\r\n                                        r: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][0],\r\n                                        c: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][1],\r\n                                    },\r\n                                };\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    d[h] = x;\r\n                }\r\n            }\r\n        }\r\n\r\n        //复制范围 是否有 条件格式和数据验证\r\n        let cdformat = null;\r\n        if (copyRange[\"copyRange\"].length == 1) {\r\n            let c_file = Store.luckysheetfile[getSheetIndex(copySheetIndex)];\r\n            let a_file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n            let ruleArr_cf = $.extend(true, [], c_file[\"luckysheet_conditionformat_save\"]);\r\n\r\n            if (ruleArr_cf != null && ruleArr_cf.length > 0) {\r\n                cdformat = $.extend(true, [], a_file[\"luckysheet_conditionformat_save\"]);\r\n\r\n                for (let i = 0; i < ruleArr_cf.length; i++) {\r\n                    let cf_range = ruleArr_cf[i].cellrange;\r\n\r\n                    let emptyRange = [];\r\n\r\n                    for (let th = 1; th <= timesH; th++) {\r\n                        for (let tc = 1; tc <= timesC; tc++) {\r\n                            mth = minh + (th - 1) * copyh;\r\n                            mtc = minc + (tc - 1) * copyc;\r\n                            maxrowCache = minh + th * copyh;\r\n                            maxcellCahe = minc + tc * copyc;\r\n\r\n                            for (let j = 0; j < cf_range.length; j++) {\r\n                                let range = conditionformat.CFSplitRange(\r\n                                    cf_range[j],\r\n                                    { row: [c_r1, c_r2], column: [c_c1, c_c2] },\r\n                                    { row: [mth, maxrowCache - 1], column: [mtc, maxcellCahe - 1] },\r\n                                    \"operatePart\",\r\n                                );\r\n\r\n                                if (range.length > 0) {\r\n                                    emptyRange = emptyRange.concat(range);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (emptyRange.length > 0) {\r\n                        ruleArr_cf[i].cellrange = emptyRange;\r\n                        cdformat.push(ruleArr_cf[i]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        last[\"row\"] = [minh, maxh];\r\n        last[\"column\"] = [minc, maxc];\r\n\r\n        if (copyRowlChange || addr > 0 || addc > 0) {\r\n            cfg = rowlenByRange(d, minh, maxh, cfg);\r\n\r\n            let allParam = {\r\n                cfg: cfg,\r\n                RowlChange: true,\r\n                cdformat: cdformat,\r\n                dataVerification: dataVerification,\r\n            };\r\n            jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n        } else {\r\n            let allParam = {\r\n                cfg: cfg,\r\n                cdformat: cdformat,\r\n                dataVerification: dataVerification,\r\n            };\r\n            jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n\r\n            selectHightlightShow();\r\n        }\r\n    },\r\n    pasteHandlerOfPaintModel: function(copyRange) {\r\n        if (!checkProtectionLockedRangeList(Store.luckysheet_select_save, Store.currentSheetIndex)) {\r\n            return;\r\n        }\r\n\r\n        const _locale = locale();\r\n        const locale_paste = _locale.paste;\r\n\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        if (cfg[\"merge\"] == null) {\r\n            cfg[\"merge\"] = {};\r\n        }\r\n\r\n        //复制范围\r\n        let copyHasMC = copyRange[\"HasMC\"];\r\n        let copyRowlChange = copyRange[\"RowlChange\"];\r\n        let copySheetIndex = copyRange[\"dataSheetIndex\"];\r\n\r\n        let c_r1 = copyRange[\"copyRange\"][0].row[0],\r\n            c_r2 = copyRange[\"copyRange\"][0].row[1],\r\n            c_c1 = copyRange[\"copyRange\"][0].column[0],\r\n            c_c2 = copyRange[\"copyRange\"][0].column[1];\r\n\r\n        let copyData = $.extend(\r\n            true,\r\n            [],\r\n            getdatabyselection({ row: [c_r1, c_r2], column: [c_c1, c_c2] }, copySheetIndex),\r\n        );\r\n\r\n        //应用范围\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let minh = last[\"row\"][0],\r\n            maxh = last[\"row\"][1]; //应用范围首尾行\r\n        let minc = last[\"column\"][0],\r\n            maxc = last[\"column\"][1]; //应用范围首尾列\r\n\r\n        let copyh = copyData.length,\r\n            copyc = copyData[0].length;\r\n\r\n        if (minh == maxh && minc == maxc) {\r\n            //应用范围是一个单元格，自动增加到复制范围大小 (若自动增加的范围包含部分合并单元格，则提示)\r\n            let has_PartMC = false;\r\n            if (cfg[\"merge\"] != null) {\r\n                has_PartMC = hasPartMC(cfg, minh, minh + copyh - 1, minc, minc + copyc - 1);\r\n            }\r\n\r\n            if (has_PartMC) {\r\n                if (isEditMode()) {\r\n                    alert(locale_paste.errorNotAllowMerged);\r\n                } else {\r\n                    tooltip.info(\r\n                        `<i class=\"fa fa-exclamation-triangle\"></i>${locale_paste.warning}`,\r\n                        locale_paste.errorNotAllowMerged,\r\n                    );\r\n                }\r\n                return;\r\n            }\r\n\r\n            maxh = minh + copyh - 1;\r\n            maxc = minc + copyc - 1;\r\n        }\r\n\r\n        let timesH = Math.ceil((maxh - minh + 1) / copyh); //复制行 组数\r\n        let timesC = Math.ceil((maxc - minc + 1) / copyc); //复制列 组数\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata); //取数据\r\n        let cellMaxLength = d[0].length;\r\n        let rowMaxLength = d.length;\r\n\r\n        let borderInfoCompute = getBorderInfoCompute(copySheetIndex);\r\n        let c_dataVerification = $.extend(\r\n            true,\r\n            {},\r\n            Store.luckysheetfile[getSheetIndex(copySheetIndex)].dataVerification,\r\n        );\r\n        let dataVerification = null;\r\n\r\n        let mth = 0,\r\n            mtc = 0,\r\n            maxcellCahe = 0,\r\n            maxrowCache = 0;\r\n        for (let th = 1; th <= timesH; th++) {\r\n            for (let tc = 1; tc <= timesC; tc++) {\r\n                mth = minh + (th - 1) * copyh;\r\n                mtc = minc + (tc - 1) * copyc;\r\n\r\n                maxrowCache = minh + th * copyh > rowMaxLength ? rowMaxLength : minh + th * copyh;\r\n                if (maxrowCache > maxh + 1) {\r\n                    maxrowCache = maxh + 1;\r\n                }\r\n\r\n                maxcellCahe = minc + tc * copyc > cellMaxLength ? cellMaxLength : minc + tc * copyc;\r\n                if (maxcellCahe > maxc + 1) {\r\n                    maxcellCahe = maxc + 1;\r\n                }\r\n\r\n                let offsetMC = {};\r\n                for (let h = mth; h < maxrowCache; h++) {\r\n                    let x = [].concat(d[h]);\r\n\r\n                    for (let c = mtc; c < maxcellCahe; c++) {\r\n                        if (borderInfoCompute[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)]) {\r\n                            let bd_obj = {\r\n                                rangeType: \"cell\",\r\n                                value: {\r\n                                    row_index: h,\r\n                                    col_index: c,\r\n                                    l: borderInfoCompute[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)].l,\r\n                                    r: borderInfoCompute[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)].r,\r\n                                    t: borderInfoCompute[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)].t,\r\n                                    b: borderInfoCompute[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)].b,\r\n                                },\r\n                            };\r\n\r\n                            if (cfg[\"borderInfo\"] == null) {\r\n                                cfg[\"borderInfo\"] = [];\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        } else if (borderInfoCompute[h + \"_\" + c]) {\r\n                            let bd_obj = {\r\n                                rangeType: \"cell\",\r\n                                value: {\r\n                                    row_index: h,\r\n                                    col_index: c,\r\n                                    l: null,\r\n                                    r: null,\r\n                                    t: null,\r\n                                    b: null,\r\n                                },\r\n                            };\r\n\r\n                            if (cfg[\"borderInfo\"] == null) {\r\n                                cfg[\"borderInfo\"] = [];\r\n                            }\r\n\r\n                            cfg[\"borderInfo\"].push(bd_obj);\r\n                        }\r\n\r\n                        //数据验证 复制\r\n                        if (c_dataVerification[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)]) {\r\n                            if (dataVerification == null) {\r\n                                dataVerification = $.extend(\r\n                                    true,\r\n                                    {},\r\n                                    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].dataVerification,\r\n                                );\r\n                            }\r\n\r\n                            dataVerification[h + \"_\" + c] = c_dataVerification[c_r1 + h - mth + \"_\" + (c_c1 + c - mtc)];\r\n                        }\r\n\r\n                        if (getObjType(x[c]) == \"object\" && \"mc\" in x[c]) {\r\n                            if (\"rs\" in x[c].mc) {\r\n                                delete cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c];\r\n                            }\r\n                            delete x[c].mc;\r\n                        }\r\n\r\n                        let value = null;\r\n                        if (copyData[h - mth] != null && copyData[h - mth][c - mtc] != null) {\r\n                            value = copyData[h - mth][c - mtc];\r\n                        }\r\n\r\n                        if (value != null) {\r\n                            delete value[\"v\"];\r\n                            delete value[\"m\"];\r\n                            delete value[\"f\"];\r\n                            delete value[\"spl\"];\r\n\r\n                            if (value.ct && value.ct.t == \"inlineStr\") {\r\n                                delete value.ct;\r\n                            }\r\n\r\n                            if (getObjType(x[c]) == \"object\") {\r\n                                if (x[c].ct && x[c].ct.t === \"inlineStr\") {\r\n                                    delete value[\"ct\"];\r\n                                } else {\r\n                                    let format = [\r\n                                        \"bg\",\r\n                                        \"fc\",\r\n                                        \"ct\",\r\n                                        \"ht\",\r\n                                        \"vt\",\r\n                                        \"bl\",\r\n                                        \"it\",\r\n                                        \"cl\",\r\n                                        \"un\",\r\n                                        \"fs\",\r\n                                        \"ff\",\r\n                                        \"tb\",\r\n                                    ];\r\n                                    format.forEach((item) => {\r\n                                        Reflect.deleteProperty(x[c], item);\r\n                                    });\r\n                                }\r\n                            } else {\r\n                                x[c] = { v: x[c] };\r\n                            }\r\n\r\n                            x[c] = $.extend(true, x[c], value);\r\n                            if (x[c].ct && x[c].ct.t === \"inlineStr\") {\r\n                                x[c].ct.s.forEach((item) => (item = $.extend(true, item, value)));\r\n                            }\r\n\r\n                            if (copyHasMC && \"mc\" in x[c]) {\r\n                                if (x[c][\"mc\"].rs != null) {\r\n                                    x[c][\"mc\"].r = h;\r\n                                    if (x[c][\"mc\"].rs + h >= maxrowCache) {\r\n                                        x[c][\"mc\"].rs = maxrowCache - h;\r\n                                    }\r\n\r\n                                    x[c][\"mc\"].c = c;\r\n                                    if (x[c][\"mc\"].cs + c >= maxcellCahe) {\r\n                                        x[c][\"mc\"].cs = maxcellCahe - c;\r\n                                    }\r\n\r\n                                    cfg[\"merge\"][x[c][\"mc\"].r + \"_\" + x[c][\"mc\"].c] = x[c][\"mc\"];\r\n\r\n                                    offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c] = [x[c][\"mc\"].r, x[c][\"mc\"].c];\r\n                                } else {\r\n                                    x[c] = {\r\n                                        mc: {\r\n                                            r: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][0],\r\n                                            c: offsetMC[value[\"mc\"].r + \"_\" + value[\"mc\"].c][1],\r\n                                        },\r\n                                    };\r\n                                }\r\n                            }\r\n\r\n                            if (x[c].v != null) {\r\n                                if (value[\"ct\"] != null && value[\"ct\"][\"fa\"] != null) {\r\n                                    let mask = update(value[\"ct\"][\"fa\"], x[c].v);\r\n                                    x[c].m = mask;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    d[h] = x;\r\n                }\r\n            }\r\n        }\r\n\r\n        //复制范围 是否有 条件格式\r\n        let cdformat = null;\r\n        let ruleArr = $.extend(\r\n            true,\r\n            [],\r\n            Store.luckysheetfile[getSheetIndex(copySheetIndex)][\"luckysheet_conditionformat_save\"],\r\n        );\r\n\r\n        if (ruleArr != null && ruleArr.length > 0) {\r\n            cdformat = $.extend(\r\n                true,\r\n                [],\r\n                Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"],\r\n            );\r\n\r\n            for (let i = 0; i < ruleArr.length; i++) {\r\n                let cdformat_cellrange = ruleArr[i].cellrange;\r\n                let emptyRange = [];\r\n\r\n                for (let j = 0; j < cdformat_cellrange.length; j++) {\r\n                    let range = conditionformat.CFSplitRange(\r\n                        cdformat_cellrange[j],\r\n                        { row: [c_r1, c_r2], column: [c_c1, c_c2] },\r\n                        { row: [minh, maxh], column: [minc, maxc] },\r\n                        \"operatePart\",\r\n                    );\r\n\r\n                    if (range.length > 0) {\r\n                        emptyRange = emptyRange.concat(range);\r\n                    }\r\n                }\r\n\r\n                if (emptyRange.length > 0) {\r\n                    ruleArr[i].cellrange = [{ row: [minh, maxh], column: [minc, maxc] }];\r\n                    cdformat.push(ruleArr[i]);\r\n                }\r\n            }\r\n        }\r\n\r\n        last[\"row\"] = [minh, maxh];\r\n        last[\"column\"] = [minc, maxc];\r\n\r\n        if (copyRowlChange) {\r\n            cfg = rowlenByRange(d, minh, maxh, cfg);\r\n\r\n            let allParam = {\r\n                cfg: cfg,\r\n                RowlChange: true,\r\n                cdformat: cdformat,\r\n                dataVerification: dataVerification,\r\n            };\r\n            jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n        } else {\r\n            // 选区格式刷存在超出边界的情况\r\n            if (maxh >= d.length) {\r\n                maxh = d.length - 1;\r\n            }\r\n            cfg = rowlenByRange(d, minh, maxh, cfg); //更新行高\r\n            let allParam = {\r\n                cfg: cfg,\r\n                RowlChange: true,\r\n                cdformat: cdformat,\r\n                dataVerification: dataVerification,\r\n            };\r\n            jfrefreshgrid(d, Store.luckysheet_select_save, allParam);\r\n\r\n            selectHightlightShow();\r\n        }\r\n    },\r\n    matchcopy: function(data1, data2) {\r\n        let data1cache = [],\r\n            data2cache = [],\r\n            data1len,\r\n            data2len;\r\n        if (typeof data1 == \"object\") {\r\n            data1cache = data1;\r\n        } else {\r\n            data1cache = data1.split(\"\\n\");\r\n            for (let i = 0; i < data1cache.length; i++) {\r\n                data1cache[i] = data1cache[i].split(\"\\t\");\r\n            }\r\n        }\r\n\r\n        data1len = data1cache.length;\r\n\r\n        if (typeof data2 == \"object\") {\r\n            data2cache = data2;\r\n        } else {\r\n            data2cache = data2.split(\"\\n\");\r\n            for (let i = 0; i < data2cache.length; i++) {\r\n                data2cache[i] = data2cache[i].split(\"\\t\");\r\n            }\r\n        }\r\n\r\n        data2len = data2cache.length;\r\n\r\n        if (data1len != data2len) {\r\n            return false;\r\n        }\r\n\r\n        for (let r1 = 0; r1 < data1len; r1++) {\r\n            if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r1] != null) {\r\n                continue;\r\n            }\r\n\r\n            for (let r2 = 0; r2 < data2len; r2++) {\r\n                if (data1cache[r1].length != data2cache[r2].length) {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n\r\n        for (let r = 0; r < data1len; r++) {\r\n            if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                continue;\r\n            }\r\n\r\n            for (let c = 0; c < data1cache[0].length; c++) {\r\n                if (getcellvalue(r, c, data1cache) != getcellvalue(r, c, data2cache)) {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n\r\n        return true;\r\n    },\r\n};\r\n\r\nexport default selection;\r\n"
  },
  {
    "path": "src/controllers/server.js",
    "content": "import pako from 'pako'\r\nimport { showloading, hideloading } from '../global/loading';\r\nimport { luckysheetrefreshgrid, jfrefreshgrid_rhcw } from '../global/refresh';\r\nimport editor from '../global/editor'\r\nimport { sheetHTML, luckyColor } from './constant';\r\nimport sheetmanage from './sheetmanage';\r\nimport menuButton from './menuButton';\r\nimport { createFilterOptions } from './filter';\r\nimport luckysheetFreezen from './freezen';\r\nimport luckysheetPostil from './postil';\r\nimport imageCtrl from './imageCtrl';\r\nimport dataVerificationCtrl from './dataVerificationCtrl';\r\nimport hyperlinkCtrl from './hyperlinkCtrl';\r\nimport { getObjType, replaceHtml, getByteLen } from '../utils/util';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport Store from '../store';\r\nimport { collaborativeEditBox } from './select'\r\nimport locale from '../locale/locale';\r\nimport dayjs from \"dayjs\";\r\nimport json from '../global/json';\r\nimport luckysheetConfigsetting from './luckysheetConfigsetting';\r\nimport {customImageUpdate} from './imageUpdateCtrl';\r\nimport method from '../global/method';\r\n\r\nconst server = {\r\n    gridKey: null,\r\n    loadUrl: null,\r\n    updateUrl: null,\r\n    updateImageUrl: null,\r\n    title: null,\r\n\t\tloadSheetUrl: null,\r\n\t\tretryTimer:null,\r\n    allowUpdate: false, //共享编辑模式\r\n    historyParam: function(data, sheetIndex, range) {\r\n    \tlet _this = this;\r\n\r\n\t    let r1 = range.row[0], r2 = range.row[1];\r\n\t    let c1 = range.column[0], c2 = range.column[1];\r\n\r\n\t    if(r1 == r2 && c1 == c2){ //单个单元格更新\r\n\t        let v = data[r1][c1];\r\n\t        _this.saveParam(\"v\", sheetIndex, v, { \"r\": r1, \"c\": c1 });\r\n\t    }\r\n\t    else{ //范围单元格更新\r\n\t        let rowlen = r2 - r1 + 1;\r\n\t        let collen = c2 - c1 + 1;\r\n\r\n\t        let timeR = Math.floor(1000 / collen);\r\n\t        let n = Math.ceil(rowlen / timeR); //分批次更新，一次最多1000个单元格\r\n\r\n\t        for(let i = 0; i < n; i++){\r\n\t            let str = r1 + timeR * i;\r\n\r\n\t\t\t\tlet edr;\r\n\t            if(i == n - 1){\r\n\t                edr = r2;\r\n\t            }\r\n\t            else{\r\n\t                edr = r1 + timeR * (i + 1) - 1;\r\n\t            }\r\n\r\n\t            let v = [];\r\n\r\n\t            for(let r = str; r <= edr; r++){\r\n\t                let v_row = [];\r\n\r\n\t                for(let c = c1; c <= c2; c++){\r\n\t\t\t\t\t\tif(data[r]==null){\r\n\t\t\t\t\t\t\tv_row.push(null);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse{\r\n\t\t\t\t\t\t\tv_row.push(data[r][c]);\r\n\t\t\t\t\t\t}\r\n\t                }\r\n\r\n\t                v.push(v_row);\r\n\t            }\r\n\r\n\t            _this.saveParam(\"rv\", sheetIndex, v, { \"range\": { \"row\": [str, edr], \"column\": [c1, c2] } });\r\n\r\n\t            if(i == n - 1){\r\n\t                _this.saveParam(\"rv_end\", sheetIndex, null);\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t},\r\n    saveParam: function (type, index, value, params) {\r\n    \tlet _this = this;\r\n\r\n\t    if(!_this.allowUpdate){\r\n\t        return;\r\n\t    }\r\n\r\n\t    if(value == undefined){\r\n\t        value = null;\r\n\t    }\r\n\r\n\t    let d = {};\r\n\t    d.t = type;\r\n\t    d.i = index;\r\n\t    d.v = value;\r\n\r\n\t\t//切换sheet页不发后台，TODO：改为发后台+后台不广播\r\n\t\tif(type === 'shs'){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t    if (type == \"rv\") { //单元格批量更新\r\n\t        d.range = params.range;\r\n\t    }\r\n\t    else if (type == \"v\" || type == \"fu\" || type == \"fm\") {\r\n\t        d.r = params.r;\r\n\t        d.c = params.c;\r\n\t    }\r\n\t    else if (type == \"fc\") {\r\n\t        d.op = params.op;\r\n\t        d.pos = params.pos;\r\n\t    }\r\n\t    else if (type == \"drc\" || type == \"arc\" || type == \"h\" || type == \"wh\") {\r\n\t        d.rc = params.rc;\r\n\t    }\r\n\t    else if (type == \"c\") {\r\n\t        d.cid = params.cid;\r\n\t        d.op = params.op;\r\n\t    }\r\n\t    else if (type == \"f\") {\r\n\t        d.op = params.op;\r\n\t        d.pos = params.pos;\r\n\t    }\r\n\t    else if (type == \"s\") {\r\n\r\n\t    }\r\n\t    else if (type == \"sh\") {\r\n\t        d.op = params.op;\r\n\t        if(params.cur != null){\r\n\t            d.cur = params.cur;\r\n\t        }\r\n\t    }\r\n\t    else if (type == \"cg\") {\r\n\t        d.k = params.k;\r\n\t    }\r\n\t    else if (type == \"all\") {\r\n\t        d.k = params.k;\r\n\t        // d.s = params.s;\r\n\t    }\r\n\r\n\t    // TODO 配置自定义方式同步图片\r\n        const customImageUpdateMethodConfig = luckysheetConfigsetting.imageUpdateMethodConfig\r\n\t\tif (JSON.stringify(customImageUpdateMethodConfig) !== \"{}\") {\r\n            if (\"images\" != d.k) {\r\n                let msg = pako.gzip(encodeURIComponent(JSON.stringify(d)), {to: \"string\"});\r\n\r\n                if (_this.websocket != null) {\r\n                    _this.websocket.send(msg);\r\n                }\r\n            } else {\r\n                customImageUpdate(customImageUpdateMethodConfig.method, customImageUpdateMethodConfig.url, d)\r\n                    .then((data) => {\r\n                        console.log(data);\r\n                    })\r\n                    .catch((err) => {\r\n                        console.log(err);\r\n                    });\r\n\r\n            }\r\n        } else {\r\n            let msg = pako.gzip(encodeURIComponent(JSON.stringify(d)), {to: \"string\"});\r\n            if (_this.websocket != null) {\r\n                _this.websocket.send(msg);\r\n            }\r\n        }\r\n\r\n\t},\r\n    websocket: null,\r\n    wxErrorCount: 0,\r\n    openWebSocket: function(){\r\n        let _this = this;\r\n\r\n        if('WebSocket' in window){\r\n\t\t\tlet wxUrl = _this.updateUrl + \"?t=111&g=\" + encodeURIComponent(_this.gridKey);\r\n\t\t\tif(_this.updateUrl.indexOf('?') > -1){\r\n\t\t\t\twxUrl = _this.updateUrl + \"&t=111&g=\" + encodeURIComponent(_this.gridKey);\r\n\t\t\t}\r\n\r\n\t        _this.websocket = new WebSocket(wxUrl);\r\n\r\n\t        //连接建立时触发\r\n\t        _this.websocket.onopen = function() {\r\n\t        \tconsole.info(locale().websocket.success);\r\n\t        \thideloading();\r\n\t\t\t\t_this.wxErrorCount = 0;\r\n\r\n\t            //防止websocket长时间不发送消息导致断连\r\n\t\t\t\t_this.retryTimer = setInterval(function(){\r\n\t                _this.websocket.send(\"rub\");\r\n\t            }, 60000);\r\n\t        }\r\n\r\n\t        //客户端接收服务端数据时触发\r\n\t        _this.websocket.onmessage = function(result){\r\n\t\t\t\tStore.result = result\r\n\t\t\t\tlet data = new Function(\"return \" + result.data)();\r\n        method.createHookFunction('cooperativeMessage', data)\r\n\t\t\t\tconsole.info(data);\r\n\t\t\t\tlet type = data.type;\r\n\t\t\t\tlet {message,id} = data;\r\n\t\t\t\t// 用户退出时，关闭协同编辑时其提示框\r\n\t\t\t\tif(message === '用户退出') {\r\n\t\t\t\t\t$(\"#luckysheet-multipleRange-show-\" + id).hide();\r\n\t\t\t\t\tStore.cooperativeEdit.changeCollaborationSize = Store.cooperativeEdit.changeCollaborationSize.filter(value => {\r\n\t\t\t\t\t\treturn value.id != id\r\n\t\t\t\t\t})\r\n\t\t\t\t\tStore.cooperativeEdit.checkoutData = Store.cooperativeEdit.checkoutData.filter(value => {\r\n\t\t\t\t\t\treturn value.id != id\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t            if(type == 1){ //send 成功或失败\r\n                const oldIndex = data.data.v.index;\r\n                const sheetToUpdate = Store.luckysheetfile.filter((sheet)=> sheet.index === oldIndex)[0];\r\n                if (sheetToUpdate !== null) {\r\n                  setTimeout(() => {\r\n                    const index = data.data.i;\r\n                    sheetToUpdate.index = index;\r\n                    Store.currentSheetIndex = index;\r\n\r\n                    $(`#luckysheet-sheets-item${oldIndex}`).attr('data-index', index);\r\n                    $(`#luckysheet-sheets-item${oldIndex}`).prop('id', `luckysheet-sheets-item${index}`);\r\n                    $(`#luckysheet-datavisual-selection-set-${oldIndex}`).prop('id', `luckysheet-datavisual-selection-set-${index}`);\r\n                  }, 1);\r\n                }\r\n\t            }\r\n\t            else if(type == 2){ //更新数据\r\n\t                let item = JSON.parse(data.data);\r\n\t\t\t\t\t_this.wsUpdateMsg(item);\r\n\t\t\t\t\tlet chang_data = JSON.parse(data.data)\r\n\t\t\t\t\tif(chang_data.k == 'columnlen') {\r\n\t\t\t\t\t\tcollaborativeEditBox(chang_data.v,null)\r\n\t\t\t\t\t} else if(chang_data.k == 'rowlen') {\r\n\t\t\t\t\t\tcollaborativeEditBox(null,chang_data.v)\r\n\t\t\t\t\t}\r\n\t            }\r\n\t            else if(type == 3){ //多人操作不同选区(\"t\": \"mv\")（用不同颜色显示其他人所操作的选区）\r\n\t                let id = data.id;\r\n\t                let username = data.username;\r\n\t                let item = JSON.parse(data.data);\r\n\t                let type = item.t,\r\n\t                    index = item.i,\r\n\t                    value = item.v;\r\n\t\t\t\t\tif(Store.cooperativeEdit.changeCollaborationSize.length === 0) {\r\n\t\t\t\t\t\tStore.cooperativeEdit.changeCollaborationSize.push({id:id,v:item.v[0],i:index})\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlet flag = Store.cooperativeEdit.changeCollaborationSize.some(value1 => {\r\n\t\t\t\t\t\treturn value1.id == id\r\n\t\t\t\t\t})\r\n\t\t\t\t\tif(flag) {\r\n\t\t\t\t\t\tStore.cooperativeEdit.changeCollaborationSize.forEach(val => {\r\n\t\t\t\t\t\t\tif(val.id == id) {\r\n\t\t\t\t\t\t\t\tval.v = item.v[0] || item.range[0]\r\n\t\t\t\t\t\t\t\tval.i = index\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tStore.cooperativeEdit.changeCollaborationSize.push({id:id,v:item.v[0],i:index})\r\n\t\t\t\t\t}\r\n\t                if(getObjType(value) != \"array\" && getObjType(value) !== \"object\"){\r\n\t                    value = JSON.parse(value);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlet r = 0\r\n\t\t\t\t\tlet c = 0\r\n\t\t\t\t\tif(index == Store.currentSheetIndex){//发送消息者在当前页面\r\n\r\n\t\t\t\t\t\tif(getObjType(value) === \"object\" && value.op === 'enterEdit'){\r\n\t\t\t\t\t\t\tr = value.range[value.range.length - 1].row[0];\r\n\t\t\t\t\t\t\tc = value.range[value.range.length - 1].column[0];\r\n\t\t\t\t\t\t\t_this.multipleRangeShow(id, username, r, c, value.op);\r\n\r\n\t\t\t\t\t\t}else {\r\n\r\n\t\t\t\t\t\t\tr = value[value.length - 1].row[0];\r\n\t\t\t\t\t\t\tc = value[value.length - 1].column[0];\r\n\r\n\t\t\t\t\t\t\t_this.multipleRangeShow(id, username, r, c);\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif(getObjType(value) === \"object\" && value.op === 'enterEdit'){\r\n\t\t\t\t\t\t\tr = value.range[value.range.length - 1].row[0];\r\n\t\t\t\t\t\t\tc = value.range[value.range.length - 1].column[0];\r\n\t\t\t\t\t\t}else {\r\n\t\t\t\t\t\t\tr = value[value.length - 1].row[0];\r\n\t\t\t\t\t\t\tc = value[value.length - 1].column[0];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif(Store.cooperativeEdit.checkoutData.length === 0) {\r\n\t\t\t\t\t\tif(value.op) {\r\n\t\t\t\t\t\t\tStore.cooperativeEdit.checkoutData.push({id,username,r,c,op:value.op,index})\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tStore.cooperativeEdit.checkoutData.push({id,username,r,c,index})\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlet checkoutFlag = Store.cooperativeEdit.checkoutData.some(item => {\r\n\t\t\t\t\t\treturn item.id == id\r\n\t\t\t\t\t})\r\n\t\t\t\t\tif(checkoutFlag) {\r\n\t\t\t\t\t\tStore.cooperativeEdit.checkoutData.forEach(item => {\r\n\t\t\t\t\t\t\tif(item.id == id) {\r\n\t\t\t\t\t\t\t\titem.username = username\r\n\t\t\t\t\t\t\t\titem.r = r\r\n\t\t\t\t\t\t\t\titem.c = c\r\n\t\t\t\t\t\t\t\titem.index = index\r\n\t\t\t\t\t\t\t\tif (value.op === 'enterEdit') {\r\n\t\t\t\t\t\t\t\t\titem.op = value.op\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif(value.op === 'enterEdit') {\r\n\t\t\t\t\t\t\tStore.cooperativeEdit.checkoutData.push({id,username,r,c,op:value.op,index})\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tStore.cooperativeEdit.checkoutData.push({id,username,r,c,index})\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//其他客户端切换页面时\r\n\t\t\t\t\tStore.cooperativeEdit.checkoutData.forEach(item => {\r\n\t\t\t\t\t\tif(item.index != Store.currentSheetIndex) {\r\n\t\t\t\t\t\t\t$(\"#luckysheet-multipleRange-show-\" + item.id).hide();\r\n\t\t\t\t\t\t\titem.op == ''\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tif($(\"#luckysheet-multipleRange-show-\" + id)[0]) {\r\n\t\t\t\t\t\tlet change_bottom = $(\"#luckysheet-multipleRange-show-\" + id)[0].offsetHeight - 1\r\n\t\t\t\t\t\t$(\"#luckysheet-multipleRange-show-\" + id + \">.username\").css({\"bottom\":change_bottom + 'px'})\r\n\t\t\t\t\t}\r\n\t            }\r\n\t            else if(type == 4){ //批量指令更新\r\n\t\t\t\t\t// let items = JSON.parse(data.data);\r\n\r\n\t\t\t\t\t// After editing by multiple people, data.data may appear as an empty string\r\n\t\t\t\t\tlet items = data.data === \"\" ?  data.data : JSON.parse(data.data);\r\n\r\n\t                for(let i = 0; i < items.length; i++){\r\n\t                    _this.wsUpdateMsg(item[i]);\r\n\t                }\r\n\t            } else if (type == 5) {\r\n                showloading(data.data);\r\n              } else if (type == 6) {\r\n                hideloading();\r\n              }\r\n\t        }\r\n\r\n\t        //通信发生错误时触发\r\n\t        _this.websocket.onerror = function(){\r\n\t            _this.wxErrorCount++;\r\n\r\n\t            if(_this.wxErrorCount > 3){\r\n\t                showloading(locale().websocket.refresh);\r\n\t            }\r\n\t            else{\r\n\t                showloading(locale().websocket.wait);\r\n\t                _this.openWebSocket();\r\n\t            }\r\n\t        }\r\n\r\n\t        //连接关闭时触发\r\n\t        _this.websocket.onclose = function(e){\r\n\t\t\t\tconsole.info(locale().websocket.close);\r\n\t\t\t\tif(e.code === 1000){\r\n\t\t\t\t\tclearInterval(_this.retryTimer)\r\n\t\t\t\t\t_this.retryTimer = null\r\n\t\t\t\t}else{\r\n\t\t\t\t\talert(locale().websocket.contact);\r\n\t\t\t\t}\r\n\t        }\r\n\t    }\r\n\t    else{\r\n\t        alert(locale().websocket.support);\r\n\t    }\r\n    },\r\n    wsUpdateMsg: function(item) {\r\n\t    let type = item.t,\r\n\t        index = item.i,\r\n\t        value = item.v;\r\n\r\n\t    let file = Store.luckysheetfile[getSheetIndex(index)];\r\n\r\n\t    if([\"v\",\"rv\",\"cg\",\"all\",\"fc\",\"drc\",\"arc\",\"f\",\"fsc\",\"fsr\",\"sh\",\"c\"].includes(type) && file == null){\r\n\t        return;\r\n\t    }\r\n\r\n\t    if(type == \"v\"){ //单个单元格数据更新\r\n\t        if(file.data == null || file.data.length == 0){\r\n\t            return;\r\n\t        }\r\n\r\n\t        let r = item.r, c = item.c;\r\n\t        file.data[r][c] = value;\r\n\r\n\t        if(index == Store.currentSheetIndex){//更新数据为当前表格数据\r\n\t\t\t\tStore.flowdata = file.data;\r\n\t\t\t\teditor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n\r\n\t            //如果更新的单元格有批注\r\n\t            if(value != null && value.ps != null){\r\n\t                luckysheetPostil.buildPs(r, c, value.ps);\r\n\t            }\r\n\t            else{\r\n\t                luckysheetPostil.buildPs(r, c, null);\r\n\t            }\r\n\r\n\t            setTimeout(function () {\r\n\t                luckysheetrefreshgrid();\r\n\t            }, 1);\r\n\t        }\r\n\t    }\r\n\t\telse if(type == \"rv\"){ //范围单元格数据更新\r\n\t\t\tif(Object.keys(item.range).length > 0) {\r\n\t\t\t\tStore.cooperativeEdit.merge_range = item.range\r\n\t\t\t\tStore.cooperativeEdit.merge_range.v = item.v\r\n\t\t\t\tcollaborativeEditBox();\r\n\t\t\t}\r\n\t        if(file.data == null || file.data.length == 0){\r\n\t            return;\r\n\t        }\r\n\r\n\t        let r1 = item.range.row[0], r2 = item.range.row[1];\r\n\t        let c1 = item.range.column[0], c2 = item.range.column[1];\r\n\r\n\t        for(let r = r1; r <= r2; r++){\r\n\t            for(let c = c1; c <= c2; c++){\r\n\t                file.data[r][c] = value[r - r1][c - c1];\r\n\t            }\r\n\t        }\r\n\r\n\t        if(index == Store.currentSheetIndex){//更新数据为当前表格数据\r\n\t\t\t\tStore.flowdata = file.data;\r\n\t\t\t\teditor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n\r\n\t            //如果更新的单元格有批注\r\n\t            for(let r = r1; r <= r2; r++){\r\n\t                for(let c = c1; c <= c2; c++){\r\n\t                    if(value[r - r1][c - c1] != null && value[r - r1][c - c1].ps != null){\r\n\t                        luckysheetPostil.buildPs(r, c, value[r - r1][c - c1].ps);\r\n\t                    }\r\n\t                    else{\r\n\t                        luckysheetPostil.buildPs(r, c, null);\r\n\t                    }\r\n\t                }\r\n\t            }\r\n\r\n\t            setTimeout(function () {\r\n\t                luckysheetrefreshgrid();\r\n\t            }, 1);\r\n\t\t\t}\r\n\t    }\r\n\t    else if(type == \"cg\"){ //config更新（rowhidden，rowlen，columnlen，merge，borderInfo）\r\n\t        let k = item.k;\r\n\r\n\t        if(k == \"borderInfo\"){\r\n\t\t\t\tfile[\"config\"][\"borderInfo\"] = value;\r\n\t        }\r\n\t        else{\r\n\t            if(!(k in file[\"config\"])){\r\n\t                file[\"config\"][k] = {};\r\n\t            }\r\n\r\n\t            // for(let key in value){\r\n\t            //     file[\"config\"][k][key] = value[key];\r\n\t\t\t\t// }\r\n\r\n\t\t\t\t// ⚠️ 上面的处理方式会导致部分配置项被遗漏，以致协同编辑的时候多视图出现不一致的情况，调整处理的策略为直接替换配置项：\r\n\t\t\t\t// 可能的配置项为：\r\n\t\t\t\t// columnlen: {0: 65, 1: 186, 2: 52}\r\n\t\t\t\t// customHeight: {0: 1, 5: 1, 6: 1}\r\n\t\t\t\t// customWidth: {0: 1, 1: 1, 2: 1}\r\n\t\t\t\t// merge: {2_1: {…}, 4_2: {…}, 6_2: {…}}\r\n\t\t\t\t// rowlen: {0: 19, 5: 93, 6: 117}\r\n\t\t\t\tif(value && (typeof value == \"object\")){\r\n\t\t\t\t\tfile[\"config\"][k] = value;\r\n\t\t\t\t}\r\n\r\n\t        }\r\n\r\n\t        if(index == Store.currentSheetIndex){//更新数据为当前表格数据\r\n\t            Store.config = file[\"config\"];\r\n\r\n\t            if(k == \"rowlen\" || k == \"columnlen\" || k == \"rowhidden\"){\r\n\t                jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n\t            }\r\n\r\n\t            setTimeout(function () {\r\n\t                luckysheetrefreshgrid();\r\n\t            }, 1);\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"all\"){ //通用保存更新\r\n\t        let k = item.k;\r\n\t        file[k] = value;\r\n\r\n\t        if(k == \"name\"){ //工作表名\r\n\t            $(\"#luckysheet-sheet-container-c #luckysheet-sheets-item\" + index).find(\"span.luckysheet-sheets-item-name\").html(value);\r\n\t        }\r\n\t        else if(k == \"color\"){ //工作表颜色\r\n\t            let currentSheetItem = $(\"#luckysheet-sheet-container-c #luckysheet-sheets-item\" + index);\r\n\t            currentSheetItem.find(\".luckysheet-sheets-item-color\").remove();\r\n\r\n\t            if(value != null || value != \"\"){\r\n\t                currentSheetItem.append('<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + value + ';\"></div>');\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"pivotTable\"){ //PivotTable\r\n\t            // luckysheet.pivotTable.changePivotTable(index);\r\n\t        }\r\n\t\t\telse if(k == \"frozen\"){ //freezen row and column\r\n\r\n\t\t\t\t// tranform frozen\r\n\t\t\t\tluckysheetFreezen.frozenTofreezen();\r\n\r\n\t            if(index == Store.currentSheetIndex){\r\n\t\t\t\t\tconst _locale = locale();\r\n\t\t\t\t\tconst locale_freezen = _locale.freezen;\r\n\t                if(file[\"freezen\"].horizontal == null){\r\n\t                    $(\"#luckysheet-freezen-btn-horizontal\").html('<i class=\"fa fa-list-alt\"></i> '+locale_freezen.freezenRow);\r\n\t                    luckysheetFreezen.freezenhorizontaldata = null;\r\n\t                    $(\"#luckysheet-freezebar-horizontal\").hide();\r\n\t                }\r\n\t                else{\r\n\t                    luckysheetFreezen.createFreezenHorizontal(file[\"freezen\"].horizontal.freezenhorizontaldata, file[\"freezen\"].horizontal.top);\r\n\t                }\r\n\r\n\t                if(file[\"freezen\"].vertical == null){\r\n\t                    $(\"#luckysheet-freezen-btn-vertical\").html('<i class=\"fa fa-indent\"></i> '+locale_freezen.freezenColumn);\r\n\t                    luckysheetFreezen.freezenverticaldata = null;\r\n\t                    $(\"#luckysheet-freezebar-vertical\").hide();\r\n\t                }\r\n\t                else{\r\n\t                    luckysheetFreezen.createFreezenVertical(file[\"freezen\"].vertical.freezenverticaldata, file[\"freezen\"].vertical.left);\r\n\t                }\r\n\r\n                  luckysheetFreezen.createAssistCanvas();\r\n                  setTimeout(function () {\r\n                    luckysheetrefreshgrid();\r\n                  }, 1);\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"filter_select\"){ //筛选范围\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                createFilterOptions(value);\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"filter\"){ //筛选保存\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                createFilterOptions(file.filter_select, value);\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"luckysheet_conditionformat_save\"){ //条件格式\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                setTimeout(function () {\r\n\t                    luckysheetrefreshgrid();\r\n\t                }, 1);\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"luckysheet_alternateformat_save\"){ //交替颜色\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                setTimeout(function () {\r\n\t                    luckysheetrefreshgrid();\r\n\t                }, 1);\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"config\"){ //config\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                Store.config = value;\r\n\t                jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n\t            }\r\n\t        }\r\n\t        else if(k == \"dynamicArray\"){ //动态数组\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                setTimeout(function () {\r\n\t                    luckysheetrefreshgrid();\r\n\t                }, 1);\r\n\t            }\r\n\t\t\t}\r\n\t\t\telse if(k == \"images\"){ //图片\r\n\t\t\t\tif(index == Store.currentSheetIndex){\r\n\t\t\t\t\timageCtrl.images = value;\r\n\t\t\t\t\timageCtrl.allImagesShow();\r\n\t\t\t\t\timageCtrl.init();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if(k == \"dataVerification\"){ //数据验证\r\n\t\t\t\tif(index == Store.currentSheetIndex){\r\n\t\t\t\t\tdataVerificationCtrl.dataVerification = value;\r\n        \t\t\tdataVerificationCtrl.init();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if(k == \"hyperlink\"){ //链接\r\n\t\t\t\tif(index == Store.currentSheetIndex){\r\n\t\t\t\t\thyperlinkCtrl.hyperlink = value;\r\n        \t\t\thyperlinkCtrl.init();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t    }\r\n\t    else if(type == \"fc\"){ //函数链calc\r\n\t        let op = item.op, pos = item.pos;\r\n\r\n\t        if(getObjType(value) != \"object\"){\r\n\t\t\t\tvalue = new Function(\"return \" + value)();\r\n\t        }\r\n\r\n\t        let r = value.r, c = value.c;\r\n\r\n\t        let calcChain = file[\"calcChain\"] == null ? [] : file[\"calcChain\"];\r\n\r\n\t        if(op == \"add\"){\r\n\t            calcChain.push(value);\r\n\t        }\r\n\t        else if(op == \"del\"){\r\n\t            for(let a = 0; a < calcChain.length; a++){\r\n\t                if(r == calcChain[a].r && c == calcChain[a].c && index == calcChain[a].index){\r\n\t                    calcChain.splice(a, 1);\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t        // else if(op == \"update\"){\r\n\t        //     for(let a = 0; a < calcChain.length; a++){\r\n\t        //         if(r == calcChain[a].r && c == calcChain[a].c && index == calcChain[a].index){\r\n\t        //             calcChain[a].func = func;\r\n\t        //         }\r\n\t        //     }\r\n\t        // }\r\n\r\n\t        setTimeout(function () {\r\n\t            luckysheetrefreshgrid();\r\n\t        }, 1);\r\n\t    }\r\n\t    else if(type == \"drc\"){ //删除行列\r\n\t        if(file.data == null || file.data.length == 0){\r\n\t            return;\r\n\t        }\r\n\r\n\t        let rc = item.rc,\r\n\t        \tst_i = value.index,\r\n\t        \tlen = value.len,\r\n\t        \tmc = value.mc,\r\n\t        \tborderInfo = value.borderInfo;\r\n\t        let data = file.data;\r\n\r\n\t        if(rc == \"r\"){\r\n\t            file[\"row\"] -= len;\r\n\r\n\t            data.splice(st_i, len);\r\n\r\n\t            //空白行模板\r\n\t            let row = [];\r\n\t            for (let c = 0; c < data[0].length; c++) {\r\n\t                row.push(null);\r\n\t            }\r\n\r\n\t            //删除多少行，增加多少行空白行\r\n\t            for (let r = 0; r < len; r++) {\r\n\t                data.push(row);\r\n\t            }\r\n\t        }\r\n\t        else{\r\n\t            file[\"column\"] -= len;\r\n\r\n\t            //空白列模板\r\n\t            let addcol = [];\r\n\t            for (let r = 0; r < len; r++) {\r\n\t                addcol.push(null);\r\n\t            }\r\n\r\n\t            for(let i = 0; i < data.length; i++){\r\n\t                data[i].splice(st_i, len);\r\n\r\n\t                data[i] = data[i].concat(addcol);\r\n\t            }\r\n\t        }\r\n\r\n\t        for(let x in mc){\r\n\t            let r = mc[x].r, c = mc[x].c;\r\n\t            data[r][c].mc = mc[x];\r\n\t        }\r\n\r\n\t        file[\"config\"].merge = mc;\r\n\t        file[\"config\"].borderInfo = borderInfo;\r\n\r\n\t        if(index == Store.currentSheetIndex){\r\n\t\t\t\tStore.flowdata = data;\r\n\t\t\t\teditor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n\r\n\t            Store.config[\"merge\"] = mc;\r\n\t            Store.config[\"borderInfo\"] = borderInfo;\r\n\r\n\t            setTimeout(function () {\r\n\t                luckysheetrefreshgrid();\r\n\t            }, 1);\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"arc\"){ //增加行列\r\n\t        if(file.data == null || file.data.length == 0){\r\n\t            return;\r\n\t        }\r\n\r\n\t        let rc = item.rc,\r\n\t        \tst_i = value.index,\r\n\t        \tlen = value.len,\r\n\t\t\t\taddData = value.data,\r\n\t\t\t\tdirection = value.direction,\r\n\t        \tmc = value.mc,\r\n\t        \tborderInfo = value.borderInfo;\r\n\t        let data = $.extend(true, [], file.data);\r\n\r\n\t        if(rc == \"r\"){\r\n\t\t\t\tfile[\"row\"] += len;\r\n\r\n\t\t\t\t//空行模板\r\n\t\t\t\tlet row = [];\r\n\t\t\t\tfor(let c = 0; c < data[0].length; c++){\r\n\t\t\t\t\trow.push(null);\r\n\t\t\t\t}\r\n\r\n\t            let arr = [];\r\n\t            for(let i = 0; i < len; i++){\r\n\t\t\t\t\tif(addData[i] == null){\r\n\t\t\t\t\t\tarr.push(JSON.stringify(row));\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse{\r\n\t\t\t\t\t\tarr.push(JSON.stringify(addData[i]));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(direction == \"lefttop\"){\r\n\t\t\t\t\tif(st_i == 0){\r\n\t\t\t\t\t\tnew Function(\"data\",\"return \" + 'data.unshift(' + arr.join(\",\") + ')')(data);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse{\r\n\t\t\t\t\t\tnew Function(\"data\",\"return \" + 'data.splice(' + st_i + ', 0, ' + arr.join(\",\") + ')')(data);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse{\r\n\t\t\t\t\tnew Function(\"data\",\"return \" + 'data.splice(' + (st_i + 1) + ', 0, ' + arr.join(\",\") + ')')(data);\r\n\t\t\t\t}\r\n\t        }\r\n\t        else{\r\n\t\t\t\tfile[\"column\"] += len;\r\n\r\n\t            for(let i = 0; i < data.length; i++){\r\n\t\t\t\t\t/* 在每一行的指定位置都插入一列 */\r\n\t\t\t\t\tfor (let j = 0; j < len; j++) {\r\n\t\t\t\t\t\tif(direction == \"lefttop\"){\r\n\t\t\t\t\t\t\tdata[i].splice(st_i, 0, addData[j]);\r\n\t\t\t\t\t\t}else{\r\n\t\t\t\t\t\t\tdata[i].splice(st_i + 1, 0, addData[j]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t            }\r\n\t        }\r\n\r\n\t        for(let x in mc){\r\n\t            let r = mc[x].r, c = mc[x].c;\r\n\t            data[r][c].mc = mc[x];\r\n\t        }\r\n\r\n\t\t\tfile.data = data;\r\n\t        file[\"config\"].merge = mc;\r\n\t        file[\"config\"].borderInfo = borderInfo;\r\n\r\n\t        if(index == Store.currentSheetIndex){\r\n\t\t\t\tStore.flowdata = data;\r\n\t\t\t\teditor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n\r\n\t            Store.config[\"merge\"] = mc;\r\n\t            Store.config[\"borderInfo\"] = borderInfo;\r\n\r\n\t            setTimeout(function () {\r\n\t                luckysheetrefreshgrid();\r\n\t            }, 1);\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"f\"){ //筛选\r\n\t        let op = item.op, pos = item.pos;\r\n\r\n\t        let filter = file.filter;\r\n\r\n\t        if(filter == null){\r\n\t            filter = {};\r\n\t        }\r\n\r\n\t        if(op == \"upOrAdd\"){\r\n\t            filter[pos] =  value;\r\n\t        }\r\n\t        else if(op == \"del\"){\r\n\t            delete filter[pos];\r\n\t        }\r\n\r\n\t        if(index == Store.currentSheetIndex){\r\n\t            createFilterOptions(file.filter_select, filter);\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"fsc\"){ //清除筛选\r\n\t        file.filter = null;\r\n\t        file.filter_select = null;\r\n\r\n\t        if(index == Store.currentSheetIndex){\r\n\t            $('#luckysheet-filter-selected-sheet' + Store.currentSheetIndex + ', #luckysheet-filter-options-sheet' + Store.currentSheetIndex).remove();\r\n\t            $(\"#luckysheet-filter-menu, #luckysheet-filter-submenu\").hide();\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"fsr\"){ //恢复筛选\r\n\t        file.filter = value.filter;\r\n\t        file.filter_select = value.filter_select;\r\n\r\n\t        if(index == Store.currentSheetIndex){\r\n\t            createFilterOptions(file.filter_select, file.filter);\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"sha\"){ //新建sheet\r\n\t        Store.luckysheetfile.push(value);\r\n\r\n\t        let colorset = '';\r\n\t        if(value.color != null){\r\n\t            colorset = '<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + value.color + ';\"></div>';\r\n\t        }\r\n\r\n\t        $(\"#luckysheet-sheet-container-c\").append(replaceHtml(sheetHTML, { \"index\": value.index, \"active\": \"\", \"name\": value.name, \"style\": \"\", \"colorset\": colorset }));\r\n\t        $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-datavisual-selection-set-' + value.index + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n\r\n\t\t\t\t\t// *添加sheet之后,要判断是否需要显示sheet滚动按钮\r\n\t\t\t\t\tsheetmanage.locationSheet()\r\n\t    }\r\n\t    else if(type == \"shc\"){ //复制sheet\r\n\t        let copyindex = value.copyindex, name = value.name;\r\n\r\n\t        let copyarrindex = getSheetIndex(copyindex);\r\n\t        let copyjson = $.extend(true, {}, Store.luckysheetfile[copyarrindex]);\r\n\r\n\t        copyjson.index = index;\r\n\t        copyjson.name = name;\r\n\r\n\t        Store.luckysheetfile.splice(copyarrindex + 1, 0, copyjson);\r\n\r\n\t        let copyobject = $(\"#luckysheet-sheets-item\" + copyindex);\r\n\t        $(\"#luckysheet-sheet-container-c\").append(replaceHtml(sheetHTML, { \"index\": copyjson.index, \"active\": \"\", \"name\": copyjson.name, \"style\": \"\", \"colorset\": \"\" }));\r\n\t        $(\"#luckysheet-sheets-item\" + copyjson.index).insertAfter(copyobject);\r\n\t        $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-datavisual-selection-set-' + copyjson.index + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n\t    }\r\n\t    else if(type == \"shd\"){ //删除sheet\r\n\t        for(let i = 0; i < Store.luckysheetfile.length; i++){\r\n\t            if(Store.luckysheetfile[i].index == value.deleIndex){\r\n\r\n\t\t\t\t\t// 如果删除的是当前sheet，则切换到前一个sheet页\r\n\t\t\t\t\tif(Store.currentSheetIndex === value.deleIndex){\r\n\t\t\t\t\t\tconst index = value.deleIndex;\r\n\r\n\t\t\t\t\t\tStore.luckysheetfile[sheetmanage.getSheetIndex(index)].hide = 1;\r\n\r\n\t\t\t\t\t\tlet luckysheetcurrentSheetitem = $(\"#luckysheet-sheets-item\" + index);\r\n\t\t\t\t\t\tluckysheetcurrentSheetitem.hide();\r\n\r\n\t\t\t\t\t\t$(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n\r\n\t\t\t\t\t\tlet indicator = luckysheetcurrentSheetitem.nextAll(\":visible\");\r\n\t\t\t\t\t\tif (luckysheetcurrentSheetitem.nextAll(\":visible\").length > 0) {\r\n\t\t\t\t\t\t\tindicator = indicator.eq(0).data(\"index\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tindicator = luckysheetcurrentSheetitem.prevAll(\":visible\").eq(0).data(\"index\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t$(\"#luckysheet-sheets-item\" + indicator).addClass(\"luckysheet-sheets-item-active\");\r\n\r\n\t\t\t\t\t\tsheetmanage.changeSheetExec(indicator);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tserver.sheetDeleSave.push(Store.luckysheetfile[i]);\r\n\r\n\t\t\t\t\tStore.luckysheetfile.splice(i, 1);\r\n\r\n\t                break;\r\n\t            }\r\n\t        }\r\n\r\n\t        $(\"#luckysheet-sheets-item\" + value.deleIndex).remove();\r\n\t\t\t$(\"#luckysheet-datavisual-selection-set-\" + value.deleIndex).remove();\r\n\t\t\tsheetmanage.locationSheet()\r\n\r\n\t    }\r\n\t    else if(type == \"shr\"){ //sheet位置\r\n\t        for(let x in value){\r\n\t            Store.luckysheetfile[getSheetIndex(x)].order = value[x];\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"shre\"){ //删除sheet恢复操作\r\n\t        for(let i = 0; i < server.sheetDeleSave.length; i++){\r\n\t            if(server.sheetDeleSave[i].index == value.reIndex){\r\n\t                let datav = server.sheetDeleSave[i];\r\n\r\n\t                Store.luckysheetfile.push(datav);\r\n\r\n\t                let colorset = '';\r\n\t                if(value.color != null){\r\n\t                    colorset = '<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + datav.color + ';\"></div>';\r\n\t                }\r\n\r\n\t                $(\"#luckysheet-sheet-container-c\").append(replaceHtml(sheetHTML, { \"index\": datav.index, \"active\": \"\", \"name\": datav.name, \"style\": \"\", \"colorset\": colorset }));\r\n\t                $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-datavisual-selection-set-' + datav.index + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n\t                break;\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"sh\"){ //隐藏sheet\r\n\t        let op = item.op, cur = item.cur;\r\n\r\n\t        if(op == \"hide\"){\r\n\t            file.hide = 1;\r\n\t            $(\"#luckysheet-sheets-item\" + index).hide();\r\n\r\n\t            if(index == Store.currentSheetIndex){\r\n\t                $(\"#luckysheet-sheets-item\" + cur).addClass(\"luckysheet-sheets-item-active\");\r\n\t                sheetmanage.changeSheetExec(cur);\r\n\t            }\r\n\t        }\r\n\t        else if(op == \"show\"){\r\n\t            file.hide = 0;\r\n\t            $(\"#luckysheet-sheets-item\" + index).show();\r\n\t        }\r\n\t\t\t\tsheetmanage.locationSheet()\r\n\t    }\r\n\t    else if(type == \"c\"){ //图表操作 TODO\r\n\t        let op = item.op, cid = item.cid;\r\n\r\n\t        if(op == \"add\"){ //插入\r\n\t            file.chart.push(value);\r\n\r\n\t            luckysheet.insertChartTosheet(value.sheetIndex, value.dataSheetIndex, value.option, value.chartType, value.selfOption, value.defaultOption, value.row, value.column, value.chart_selection_color, value.chart_id, value.chart_selection_id, value.chartStyle, value.rangeConfigCheck, value.rangeRowCheck, value.rangeColCheck, value.chartMarkConfig, value.chartTitleConfig, value.winWidth, value.winHeight, value.scrollLeft1, value.scrollTop1, value.chartTheme, value.myWidth, value.myHeight, value.myLeft, value.myTop, value.myindexrank1, true);\r\n\t        }\r\n\t        else if(op == \"xy\" || op == \"wh\" || op == \"update\"){ //移动 缩放 更新\r\n\t            for(let i = 0; i < file.chart.length; i++){\r\n\t                let chartjson = file.chart[i];\r\n\r\n\t                if(chartjson.chart_id == cid){\r\n\t                    for(let item in chartjson){\r\n\t                        for(let vitem in value){\r\n\t                            if(item == vitem){\r\n\t                                chartjson[item] = value[vitem];\r\n\t                            }\r\n\t                        }\r\n\t                    }\r\n\r\n\t                    sheetmanage.saveChart(chartjson);\r\n\r\n\t                    return;\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t        else if(op == \"del\"){ //删除\r\n\t            for(let i = 0; i < file.chart.length; i++){\r\n\t                let chartjson = file.chart[i];\r\n\r\n\t                if(chartjson.chart_id == cid){\r\n\t                    file.chart.splice(i, 1);\r\n\r\n\t                    $(\"#\" + cid).remove();\r\n\t                    sheetmanage.delChart($(\"#\" + cid).attr(\"chart_id\"), $(\"#\" + cid).attr(\"sheetIndex\"));\r\n\r\n\t                    return;\r\n\t                }\r\n\t            }\r\n\t        }\r\n\t    }\r\n\t    else if(type == \"na\"){ //表格名称\r\n\t        $(\"#luckysheet_info_detail_input\").val(value).css(\"width\", getByteLen(value) * 10);\r\n\t    }\r\n\t},\r\n    multipleIndex: 0,\r\n    multipleRangeShow: function(id, name, r, c, value) {\r\n    \tlet _this = this;\r\n\t\t\tconst fullName = name;\r\n\r\n\t    let row = Store.visibledatarow[r],\r\n\t        row_pre = r - 1 == -1 ? 0 : Store.visibledatarow[r - 1],\r\n\t        col = Store.visibledatacolumn[c],\r\n\t        col_pre = c - 1 == -1 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n\t    let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n\t    if(!!margeset){\r\n\t        row = margeset.row[1];\r\n\t        row_pre = margeset.row[0];\r\n\r\n\t        col = margeset.column[1];\r\n\t        col_pre = margeset.column[0];\r\n\t\t\t}\r\n\r\n\t\t\t// *处理光标在靠左或者靠上顶着的时候，光标显示不全的问题\r\n\t\t\tif(col_pre <= 0){\r\n\t\t\t\tcol_pre += 1\r\n\t\t\t}\r\n\r\n\t\t\tif(row_pre <= 0){\r\n\t\t\t\trow_pre +=1\r\n\t\t\t}\r\n\r\n\t\t\t// 超出16个字符就显示...\r\n\t\t\tif(getByteLen(name) > 16){\r\n\t\t\t\tname = getByteLen(name,16) + \"...\";\r\n\t\t\t}\r\n\r\n\t\t\t// 如果正在编辑，就显示“正在输入”\r\n\t\t\tif(value === 'enterEdit'){\r\n\t\t\t\tname += \" \" + locale().edit.typing;\r\n\t\t\t}\r\n\r\n\t    if($(\"#luckysheet-multipleRange-show-\" + id).length > 0){\r\n\t\t\t$(\"#luckysheet-multipleRange-show-\" + id).css({ \"position\": \"absolute\", \"left\": col_pre - 1, \"width\": col - col_pre - 1, \"top\": row_pre - 1, \"height\": row - row_pre - 1 });\r\n\r\n\t\t\t$(\"#luckysheet-multipleRange-show-\" + id + \" .username\").text(name);\r\n\t\t\t$(\"#luckysheet-multipleRange-show-\" + id + \" .username\").show();\r\n\r\n\t\t\tif(Store.cooperativeEdit.usernameTimeout['user' + id] != null){\r\n\t\t\t\tclearTimeout(Store.cooperativeEdit.usernameTimeout['user' + id])\r\n\t\t\t}\r\n\t\t\tStore.cooperativeEdit.usernameTimeout['user' + id] = setTimeout(()=>{\r\n\t\t\t\tclearTimeout(Store.cooperativeEdit.usernameTimeout['user' + id]);\r\n\t\t\t\tStore.cooperativeEdit.usernameTimeout['user' + id] = null;\r\n\t\t\t},10 * 1000)\r\n\r\n\r\n\r\n\t    }\r\n\t    else{\r\n\t        // let itemHtml = '<div id=\"luckysheet-multipleRange-show-'+ id +'\" data-color=\"'+ luckyColor[_this.multipleIndex] +'\" title=\"'+ name +'\" style=\"position: absolute;left: '+ (col_pre - 1) +'px;width: '+ (col - col_pre - 1) +'px;top: '+ (row_pre - 1) +'px;height: '+ (row - row_pre - 1) +'px;border: 1px solid '+ luckyColor[_this.multipleIndex] +';z-index: 15;\">'+\r\n\t        //                 '<div style=\"width: 100%;height: 100%;position: absolute;top: 0;right: 0;bottom: 0;left: 0;opacity: 0.03;background-color: '+ luckyColor[_this.multipleIndex] +'\"></div>'+\r\n\t\t\t//                '</div>';\r\n\r\n\t\t\tlet itemHtml = `<div\r\n\t\t\t\t\t\t\t\tid=\"luckysheet-multipleRange-show-${id}\"\r\n\t\t\t\t\t\t\t\tclass=\"luckysheet-multipleRange-show\"\r\n\t\t\t\t\t\t\t\tdata-color=\"${luckyColor[_this.multipleIndex]}\"\r\n\t\t\t\t\t\t\t\ttitle=\"${fullName}\"\r\n\t\t\t\t\t\t\t\tstyle=\"position: absolute;left: ${col_pre - 1}px;width: ${col - col_pre - 1}px;top: ${row_pre - 1}px;height: ${row - row_pre - 1}px;border: 1px solid ${luckyColor[_this.multipleIndex]};z-index: 15;\">\r\n\r\n\t\t\t\t\t\t\t\t<div class=\"username\" style=\"height: 19px;line-height:19px;width: max-content;position: absolute;bottom: ${row - row_pre - 1}px;right: 0;background-color: ${luckyColor[_this.multipleIndex]};color:#ffffff;padding:0 10px;\">\r\n\t\t\t\t\t\t\t\t${name}\r\n\t\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t\t<div style=\"width: 100%;height: 100%;position: absolute;top: 0;right: 0;bottom: 0;left: 0;opacity: 0.03;background-color: ${luckyColor[_this.multipleIndex]}\">\r\n\t\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t</div>`;\r\n\t\t\t\t\t\t\t// 正在输入\r\n\r\n\t        $(itemHtml).appendTo($(\"#luckysheet-cell-main #luckysheet-multipleRange-show\"));\r\n\r\n\t\t\t_this.multipleIndex++;\r\n\r\n\t\t\t// 设定允许用户名消失的定时器，10秒后用户名可隐藏\r\n\t\t\t// 10秒之类，用户操作界面不会隐藏用户名；10秒之后如果用户操作了界面，则隐藏用户名，没操作就不隐藏\r\n\t\t\tif(Store.cooperativeEdit.usernameTimeout['user' + id] != null){\r\n\t\t\t\tclearTimeout(Store.cooperativeEdit.usernameTimeout['user' + id])\r\n\t\t\t}\r\n\t\t\tStore.cooperativeEdit.usernameTimeout['user' + id] = setTimeout(()=>{\r\n\t\t\t\tclearTimeout(Store.cooperativeEdit.usernameTimeout['user' + id]);\r\n\t\t\t\tStore.cooperativeEdit.usernameTimeout['user' + id] = null;\r\n\t\t\t},10 * 1000)\r\n\t    }\r\n\t},\r\n    sheetDeleSave: [], //共享编辑模式下 删除的sheet保存下来，方便恢复时取值\r\n    submitInterval: 1000,\r\n    imagesubmitInterval: 5000,\r\n    submitdatalimit: 50,\r\n    submitcompresslimit: 1000,\r\n    checksubmit: function(data){\r\n        let _this = this;\r\n        //clearTimeout(_this.requestTimeOut);\r\n\r\n        _this.submitTimeout();\r\n\r\n        clearTimeout(_this.imageRequestTimeout);\r\n        _this.imageRequestTimeout = setTimeout(function(){\r\n            _this.imageRequest();\r\n        }, _this.imagesubmitInterval);\r\n    },\r\n    submitTimeout: function(){\r\n        let _this = this;\r\n        clearTimeout(_this.requestTimeOut);\r\n\r\n        //console.log(_this.requestlast, dayjs(), (_this.requestlast!=null && _this.requestlast.add(10, 'seconds').isBefore(dayjs()) ) );\r\n        if(!_this.requestLock && (_this.requestlast!=null && _this.requestlast.clone().add(1, 'seconds').isBefore(dayjs()) ) ){\r\n            _this.request();\r\n        }\r\n\r\n        // if(!_this.imageRequestLock && (_this.imageRequestLast==null || _this.imageRequestLast.clone().add(30, 'seconds').isBefore(dayjs()) ) ){\r\n\r\n        // }\r\n\r\n        _this.requestTimeOut = setTimeout(function(){\r\n            _this.submitTimeout();\r\n        }, _this.submitInterval);\r\n    },\r\n    requestLock: false,\r\n    requestlast: null,\r\n    firstchange: true,\r\n    requestTimeOut: null,\r\n    request: function () {\r\n        let _this = this;\r\n        let key = this.gridKey;\r\n        let cahce_key = key + \"__qkcache\";\r\n\r\n        _this.cachelocaldata(function(cahce_key, params){\r\n            if(params.length==0){\r\n                return;\r\n            }\r\n\r\n            params = encodeURIComponent(JSON.stringify(params));\r\n            let compressBeginLen = params.length;\r\n            let iscommpress = false;\r\n            // if (compressBeginLen > _this.submitcompresslimit) {\r\n            //     params = pako.gzip(params, { to: \"string\" });\r\n            //     iscommpress = true;\r\n            // }\r\n            _this.requestLock = true;\r\n            //console.log(params);\r\n            // console.log(\"request\");\r\n            if(_this.updateUrl != \"\"){\r\n                $.post(_this.updateUrl, { compress: iscommpress, gridKey: _this.gridKey, data: params }, function (data) {\r\n\t\t\t\t\tlet re = new Function(\"return \" + data)();\r\n                    if(re.status){\r\n                        $(\"#luckysheet_info_detail_update\").html(\"最近存档时间:\"+ dayjs().format(\"M-D H:m:s\"));\r\n                        $(\"#luckysheet_info_detail_save\").html(\"同步成功\");\r\n                        _this.clearcachelocaldata();\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet_info_detail_save\").html(\"<span style='color:#ff2121'>同步失败</span>\");\r\n                        _this.restorecachelocaldata();\r\n                    }\r\n                    _this.requestlast = dayjs();\r\n                    _this.requestLock = false;\r\n                });\r\n             }\r\n        });\r\n    },\r\n    imageRequestLast: null,\r\n    imageRequestLock: false,\r\n    imageRequestTimeout: null,\r\n    imageRequest: function(){\r\n        let _this = this;\r\n\r\n        html2canvas($(\"#\" + container).find(\".luckysheet-grid-window\").get(0), {\r\n          onrendered: function(canvas) {\r\n            //let imgcut = $(\"#luckysheet-cell-main\").find(\".luckysheet-grid-window\");\r\n            //document.body.appendChild(canvas);\r\n            let old = $(canvas).appendTo(\"body\");\r\n            old.hide();\r\n            let newwidth = old.width();\r\n            let newheight = old.height();\r\n            let imageData = old.get(0).getContext(\"2d\").getImageData(0, 0, newwidth, newheight);\r\n\r\n            let cutW = newwidth, cutH = newheight;\r\n            if(cutW*0.54 > cutH){\r\n                cutW = cutH / 0.54;\r\n            }\r\n            else{\r\n                cutH = cutW * 0.54;\r\n            }\r\n            let newCanvas = $(\"<canvas>\").attr(\"width\", cutW).attr(\"height\", cutH)[0];\r\n\r\n            newCanvas.getContext(\"2d\").putImageData(imageData, 0, 0);\r\n\r\n            old.attr(\"width\", 350);\r\n            old.attr(\"height\", 189);\r\n            old.get(0).getContext(\"2d\").drawImage(newCanvas, 0, 0, 350, 189);\r\n            let base64 = old.get(0).toDataURL('image/jpeg', 0.9);\r\n\r\n            //console.log(base64);\r\n            //console.log(\"压缩：\", pako.gzip(base64, { to: \"string\" }));\r\n            //console.log(\"imageRequest\");\r\n            let curindex = luckysheet.sheetmanage.getCurSheetnoset();\r\n            _this.imageRequestLock =true;\r\n            // let data1 = pako.gzip(encodeURIComponent(JSON.stringify({\"t\":\"thumb\", \"img\": base64, \"curindex\":curindex })), { to: \"string\" });\r\n            let data1 = encodeURIComponent(JSON.stringify({\"t\":\"thumb\", \"img\": base64, \"curindex\":curindex }));\r\n            old.remove();\r\n            //console.log(\"缩略图\", _this.imageRequestLast,base64);\r\n            if(_this.updateImageUrl != \"\"){\r\n                // $.post(_this.updateImageUrl, { compress: true, gridKey: _this.gridKey, data:data1  }, function (data) {\r\n                $.post(_this.updateImageUrl, { compress: false, gridKey: _this.gridKey, data:data1  }, function (data) {\r\n\t\t\t\t\tlet re = new Function(\"return \" + data)();\r\n                    if(re.status){\r\n                        imageRequestLast = dayjs();\r\n                    }\r\n                    else{\r\n                        $(\"#luckysheet_info_detail_save\").html(\"<span style='color:#ff2121'>网络不稳定</span>\");\r\n                    }\r\n                    _this.imageRequestLock =true;\r\n                });\r\n            }\r\n\r\n          }\r\n        });\r\n    },\r\n    localdata: [],\r\n    matchOpt: function(v, d){\r\n        for(let vitem in v){\r\n            if(vitem == \"t\" && v[\"t\"] in {\"drc\":1, \"arc\":1,\"sha\":1,\"shc\":1,\"shd\":1 } ){\r\n                return false;\r\n            }\r\n\r\n            if(vitem==\"v\"){\r\n                continue;\r\n            }\r\n\r\n            if(!(vitem in d)){\r\n                return false;\r\n            }\r\n\r\n            if(d[vitem] != v[vitem]){\r\n                return false;\r\n            }\r\n        }\r\n\r\n        return true;\r\n    },\r\n    deleteRepeatOpt: function(data, value){\r\n        //let d = $.extend(true, [], data); //原来\r\n        let d = data;\r\n        let _this = this;\r\n\r\n        if(value instanceof Array){\r\n            for(let i = 0; i < value.length; i++){\r\n                let vitem = value[i];\r\n\r\n                for(let a = 0; a < d.length; a++){\r\n                    let ditem = data[i]; //let ditem = data[a];?\r\n\r\n                    if(_this.matchOpt(vitem, ditem)){\r\n                        delete d[a];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            for(let a = 0; a < d.length; a++){\r\n                let ditem = d[a];\r\n\r\n                if(_this.matchOpt(value, ditem)){\r\n                    delete d[a];\r\n                }\r\n            }\r\n        }\r\n\r\n        let ret = [];\r\n        for(let i = 0; i < d.length; i++){\r\n            if(d[i] != null){\r\n                ret.push(d[i]);\r\n            }\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    setlocaldata: function (value, func) {\r\n        let key = this.gridKey;\r\n        //store.push(key, data);\r\n        let _this = this;\r\n        _this.getlocaldata(function(data){\r\n            if(data==null){\r\n                data = [];\r\n            }\r\n\r\n            //此处不去重，在request同步后台时统一循环一次去重\r\n            //let data = _this.deleteRepeatOpt(data, value);\r\n\r\n            if(value instanceof Array){\r\n                data = data.concat(value);\r\n            }\r\n            else{\r\n                data.push(value);\r\n            }\r\n\r\n            _this.localdata = data;\r\n            func(_this.localdata);\r\n\r\n            //console.log(value);\r\n            // localforage.setItem(key, data).then(function () {\r\n            //     console.log(data);\r\n            //     func(data);\r\n            // }).catch(function (err) {\r\n\r\n            // });\r\n        });\r\n    },\r\n    getlocaldata: function (func) {\r\n        let key = this.gridKey;\r\n        //return store.get(key);\r\n        func(this.localdata);\r\n        // localforage.getItem(key).then(function(readValue) {\r\n        //     func(readValue);\r\n        // });\r\n    },\r\n    clearlocaldata: function (func) {\r\n        let key = this.gridKey;\r\n        //store.remove(key);\r\n        this.localdata = [];\r\n        func();\r\n        // localforage.removeItem(key, function(err,value) {\r\n        //     func();\r\n        // });\r\n    },\r\n    cachelocaldata: function (func) {\r\n        let key = this.gridKey;\r\n        let _this = this;\r\n        let cahce_key = key + \"__qkcache\";\r\n        //store.remove(key);\r\n        //console.log(key, cahce_key);\r\n\r\n\r\n        //处理localdata去重\r\n        let updatedata = _this.localdata;\r\n        let uLen = updatedata.length;\r\n        if(uLen > 1){\r\n            let prevData = [];\r\n            prevData[0] = updatedata[0];\r\n            for(let i = 1; i < uLen; i++){\r\n                let value = updatedata[i];\r\n                let flag = true;\r\n                for(let a=0;a<prevData.length;a++){\r\n                    let ditem = prevData[a];\r\n                    if(_this.matchOpt(value, ditem)){\r\n                        prevData.splice(a,1,value);\r\n                        flag = false; //如果已匹配重复，则后续无需再加\r\n                        break;\r\n                    }\r\n                }\r\n                if(flag){\r\n                    prevData = prevData.concat(value);\r\n                }\r\n\r\n            }\r\n            updatedata = prevData;\r\n\r\n        }\r\n        if(updatedata==null || updatedata.length==0){\r\n            return;\r\n        }\r\n        //console.log(key, cahce_key,updatedata);\r\n        _this.clearlocaldata(function(){\r\n            localforage.setItem(cahce_key, updatedata).then(function () {\r\n                func(cahce_key, updatedata);\r\n            });\r\n        });\r\n\r\n        // localforage.getItem(key).then(function(readValue) {\r\n        //     let updatedata = readValue;\r\n        //     if(readValue==null || readValue.length==0){\r\n        //         return;\r\n        //     }\r\n        //     //console.log(key, cahce_key,updatedata);\r\n        //     _this.clearlocaldata(function(){\r\n        //         localforage.setItem(cahce_key, updatedata).then(function () {\r\n        //             func(cahce_key, updatedata);\r\n        //         });\r\n        //     });\r\n        // });\r\n    },\r\n    clearcachelocaldata: function(func){\r\n        let key = this.gridKey;\r\n        let cahce_key = key + \"__qkcache\";\r\n        //store.remove(key);\r\n        localforage.removeItem(cahce_key, function(err,value) {\r\n            if(func && typeof(func)==\"function\"){\r\n                func();\r\n            }\r\n\r\n        });\r\n    },\r\n    restorecachelocaldata: function(func){\r\n        let key = this.gridKey;\r\n        let cahce_key = key + \"__qkcache\";\r\n        let _this = this;\r\n        localforage.getItem(cahce_key).then(function(readValue) {\r\n            let updatedata = readValue;\r\n            _this.getlocaldata(function(data){\r\n                if(data==null){\r\n                    data = [];\r\n                }\r\n                let newdata = updatedata.concat(data);\r\n                //data.unshift(updatedata);\r\n\r\n                _this.localdata = newdata;\r\n                if(func instanceof Function){\r\n                    func(_this.localdata);\r\n                }\r\n\r\n                // localforage.setItem(key, newdata).then(function () {\r\n                //     func(newdata);\r\n                // }).catch(function (err) {\r\n\r\n                // });\r\n            });\r\n        });\r\n\t},\r\n\tkeepHighLightBox: function() {\r\n        Store.cooperativeEdit.checkoutData.forEach(value => {\r\n            if(value.index == Store.currentSheetIndex) {\r\n                if(value.op === 'enterEdit') {\r\n                    server.multipleRangeShow(value.id, value.username, value.r, value.c, value.op);\r\n                } else {\r\n                    server.multipleRangeShow(value.id, value.username, value.r, value.c);\r\n                }\r\n            }\r\n        })\r\n    }\r\n}\r\n\r\nexport default server;\r\n"
  },
  {
    "path": "src/controllers/sheetBar.js",
    "content": "\r\nimport sheetmanage from './sheetmanage';\r\nimport server from './server';\r\nimport { sheetselectlistitemHTML, sheetselectlistHTML, keycode } from './constant';\r\nimport {\r\n    replaceHtml,\r\n    mouseclickposition,\r\n} from '../utils/util';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { isEditMode } from '../global/validate';\r\nimport formula from '../global/formula';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport tooltip from '../global/tooltip';\r\n    selectTextDom\r\nimport {selectTextDom} from '../global/cursorPos';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\nimport luckysheetConfigsetting from './luckysheetConfigsetting';\r\nimport {pagerInit} from '../global/api'\r\nimport method from '../global/method';\r\nimport luckysheetsizeauto from './resize';\r\nimport {openProtectionModal} from \"./protection\";\r\n\r\n//表格底部名称栏区域 相关事件（增、删、改、隐藏显示、颜色等等）\r\nlet isInitialSheetConfig = false, luckysheetcurrentSheetitem = null, jfdbclicklagTimeout = null,oldSheetFileName = \"\";\r\nfunction showsheetconfigmenu() {\r\n    if (!isInitialSheetConfig) {\r\n        isInitialSheetConfig = true;\r\n        const _locale = locale();\r\n        let locale_toolbar = _locale.toolbar;\r\n        $(\"#luckysheetsheetconfigcolorur\").spectrum({\r\n            showPalette: true,\r\n            preferredFormat: \"hex\",\r\n            clickoutFiresChange: false,\r\n            showInitial: true,\r\n            showInput: true,\r\n            flat: true,\r\n            hideAfterPaletteSelect: false,\r\n            showSelectionPalette: true,\r\n            maxPaletteSize: 10,\r\n            cancelText: _locale.sheetconfig.cancelText,\r\n            chooseText: _locale.sheetconfig.chooseText,\r\n            togglePaletteMoreText: locale_toolbar.toolMore,\r\n            togglePaletteLessText: locale_toolbar.toolLess,\r\n            clearText: locale_toolbar.clearText,\r\n            noColorSelectedText: locale_toolbar.noColorSelectedText,\r\n            palette: [[\"rgb(0, 0, 0)\", \"rgb(67, 67, 67)\", \"rgb(102, 102, 102)\", \"rgb(204, 204, 204)\", \"rgb(217, 217, 217)\", \"rgb(255, 255, 255)\"], [\"rgb(152, 0, 0)\", \"rgb(255, 0, 0)\", \"rgb(255, 153, 0)\", \"rgb(255, 255, 0)\", \"rgb(0, 255, 0)\", \"rgb(0, 255, 255)\", \"rgb(74, 134, 232)\", \"rgb(0, 0, 255)\", \"rgb(153, 0, 255)\", \"rgb(255, 0, 255)\"], [\"rgb(230, 184, 175)\", \"rgb(244, 204, 204)\", \"rgb(252, 229, 205)\", \"rgb(255, 242, 204)\", \"rgb(217, 234, 211)\", \"rgb(208, 224, 227)\", \"rgb(201, 218, 248)\", \"rgb(207, 226, 243)\", \"rgb(217, 210, 233)\", \"rgb(234, 209, 220)\"], [\"rgb(221, 126, 107)\", \"rgb(234, 153, 153)\", \"rgb(249, 203, 156)\", \"rgb(255, 229, 153)\", \"rgb(182, 215, 168)\", \"rgb(162, 196, 201)\", \"rgb(164, 194, 244)\", \"rgb(159, 197, 232)\", \"rgb(180, 167, 214)\", \"rgb(213, 166, 189)\"], [\"rgb(204, 65, 37)\", \"rgb(224, 102, 102)\", \"rgb(246, 178, 107)\", \"rgb(255, 217, 102)\", \"rgb(147, 196, 125)\", \"rgb(118, 165, 175)\", \"rgb(109, 158, 235)\", \"rgb(111, 168, 220)\", \"rgb(142, 124, 195)\", \"rgb(194, 123, 160)\"], [\"rgb(166, 28, 0)\", \"rgb(204, 0, 0)\", \"rgb(230, 145, 56)\", \"rgb(241, 194, 50)\", \"rgb(106, 168, 79)\", \"rgb(69, 129, 142)\", \"rgb(60, 120, 216)\", \"rgb(61, 133, 198)\", \"rgb(103, 78, 167)\", \"rgb(166, 77, 121)\"], [\"rgb(91, 15, 0)\", \"rgb(102, 0, 0)\", \"rgb(120, 63, 4)\", \"rgb(127, 96, 0)\", \"rgb(39, 78, 19)\", \"rgb(12, 52, 61)\", \"rgb(28, 69, 135)\", \"rgb(7, 55, 99)\", \"rgb(32, 18, 77)\", \"rgb(76, 17, 48)\"], [\"#c1232b\", \"#27727b\", \"#fcce10\", \"#e87c25\", \"#b5c334\", \"#fe8463\", \"#9bca63\", \"#fad860\", \"#f3a43b\", \"#60c0dd\", \"#d7504b\", \"#c6e579\", \"#f4e001\", \"#f0805a\", \"#26c0c0\", \"#c12e34\", \"#e6b600\", \"#0098d9\", \"#2b821d\", \"#005eaa\", \"#339ca8\", \"#cda819\", \"#32a487\", \"#3fb1e3\", \"#6be6c1\", \"#626c91\", \"#a0a7e6\", \"#c4ebad\", \"#96dee8\"]],\r\n            change: function (color) {\r\n                let $input = $(this);\r\n                if (color != null) {\r\n                    color = color.toHexString();\r\n                }\r\n                else {\r\n                    color = \"rgb(0, 0, 0)\";\r\n                }\r\n\r\n                let oldcolor = null;\r\n                if(luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").length>0){\r\n                    oldcolor = luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").css(\"background-color\");\r\n                }\r\n\r\n                luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").remove();\r\n                luckysheetcurrentSheetitem.append('<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + color + ';\"></div>');\r\n                let index = getSheetIndex(Store.currentSheetIndex);\r\n                Store.luckysheetfile[index].color = color;\r\n                server.saveParam(\"all\", Store.currentSheetIndex, color, { \"k\": \"color\" });\r\n\r\n                if (Store.clearjfundo) {\r\n                    let redo = {};\r\n                    redo[\"type\"] = \"sheetColor\";\r\n                    redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n                    redo[\"oldcolor\"] = oldcolor;\r\n                    redo[\"color\"] = color;\r\n\r\n                    Store.jfundo.length = 0;\r\n                    Store.jfredo.push(redo);\r\n                }\r\n            }\r\n        });\r\n\r\n        $(\"#luckysheetsheetconfigcolorreset\").click(function () {\r\n            let oldcolor = null;\r\n            if(luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").length>0){\r\n                oldcolor = luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").css(\"background-color\");\r\n            }\r\n\r\n            luckysheetcurrentSheetitem.find(\".luckysheet-sheets-item-color\").remove();\r\n            let index = getSheetIndex(Store.currentSheetIndex);\r\n            Store.luckysheetfile[index].color = null;\r\n            server.saveParam(\"all\", Store.currentSheetIndex, null, { \"k\": \"color\" } );\r\n\r\n            if (Store.clearjfundo) {\r\n                let redo = {};\r\n                redo[\"type\"] = \"sheetColor\";\r\n                redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n                redo[\"oldcolor\"] = oldcolor;\r\n                redo[\"color\"] = null;\r\n\r\n                Store.jfundo.length = 0;\r\n                Store.jfredo.push(redo);\r\n            }\r\n        });\r\n    }\r\n\r\n    let index = getSheetIndex(Store.currentSheetIndex);\r\n    if (Store.luckysheetfile[index].color != null && Store.luckysheetfile[index].color.length > 0) {\r\n        $(\"#luckysheetsheetconfigcolorur\").spectrum(\"set\", Store.luckysheetfile[index].color);\r\n\r\n    }\r\n\r\n    $(\"#luckysheetsheetconfigcolorur\").parent().find(\"span, div, button, input, a\").addClass(\"luckysheet-mousedown-cancel\");\r\n\r\n    // 如果全部按钮设置了隐藏，则不显示\r\n    const config = luckysheetConfigsetting.sheetRightClickConfig;\r\n    // if(!config.delete && !config.copy && !config.rename && !config.color && !config.hide && !config.move){\r\n    if(Object.values(config).every(ele=> !ele)){\r\n        return;\r\n    }\r\n\r\n    setTimeout(function(){\r\n        mouseclickposition($(\"#luckysheet-rightclick-sheet-menu\"), luckysheetcurrentSheetitem.offset().left + luckysheetcurrentSheetitem.width(), luckysheetcurrentSheetitem.offset().top - 18, \"leftbottom\");\r\n    },1);\r\n}\r\n\r\nlet luckysheetsheetrightclick = function ($t, $cur, e) {\r\n        //引用单元格范围时，禁止切换sheer\r\n    if ($(\"#luckysheet-dataVerificationRange-dialog\").is(\":visible\"))//是否可见\r\n    {\r\n        //禁止切换sheer\r\n        window.alert(\"选择单元格范围窗口打开时，不能切换sheet!\");\r\n        return;\r\n    }\r\n    clearTimeout(jfdbclicklagTimeout);\r\n    if ($cur.hasClass(\"luckysheet-sheets-item-name\") && $cur.attr(\"contenteditable\") == \"true\") {\r\n        return;\r\n    }\r\n    if (formula.rangestart || formula.rangedrag_column_start || formula.rangedrag_row_start || formula.israngeseleciton()) {\r\n        setTimeout(function () {\r\n            formula.setCaretPosition(formula.rangeSetValueTo.get(0), 0, formula.rangeSetValueTo.text().length);\r\n            formula.createRangeHightlight();\r\n            $(\"#luckysheet-input-box-index\").find(\".luckysheet-input-box-index-sheettxt\").remove().end().prepend(\"<span class='luckysheet-input-box-index-sheettxt'>\" + sheetmanage.getSheetName(formula.rangetosheet) + \"!</span>\").show();\r\n            $(\"#luckysheet-input-box-index\").css({\"left\": $(\"#luckysheet-input-box\").css(\"left\"), \"top\": (parseInt($(\"#luckysheet-input-box\").css(\"top\")) - 20) + \"px\", \"z-index\": $(\"#luckysheet-input-box\").css(\"z-index\")});\r\n        }, 1);\r\n    }\r\n    else {\r\n        //保存正在编辑的单元格内容\r\n        if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0) {\r\n            formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n        }\r\n\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight\").remove();\r\n    }\r\n\r\n    $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n    $t.addClass(\"luckysheet-sheets-item-active\");\r\n    cleargridelement(e);\r\n    sheetmanage.changeSheet($t.data(\"index\"));\r\n\r\n    $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n\r\n    if ($cur.hasClass(\"luckysheet-sheets-item-menu\") || $cur.hasClass(\"fa-sort-desc\") || e.which == \"3\") {\r\n        luckysheetcurrentSheetitem = $cur.closest(\".luckysheet-sheets-item\");\r\n        showsheetconfigmenu();\r\n    }\r\n        //切换完成后，如果工作表内容保护页面打开，则刷新页面，否则等用户打开时会刷新\r\n    if ($(\"#luckysheet-modal-dialog-slider-protection\").is(\":visible\"))//是否可见\r\n    {\r\n        //刷新页面\r\n        refreshProtectionContent();\r\n\r\n    }\r\n    luckysheetsizeauto();\r\n}\r\n\r\nexport function refreshProtectionContent() {\r\n    //刷新页面\r\n    let sheetFile = sheetmanage.getSheetByIndex();//获取到的数据是正确的\r\n    openProtectionModal(sheetFile);\r\n    // 如果打开了数据透视表 会住工作表保护。隐藏数据透视表\r\n    if (!!sheetFile.isPivotTable) {//如果是数据透视表,把数据透视关了\r\n        Store.luckysheetcurrentisPivotTable = false;//关闭数据透视表\r\n        $(\"#luckysheet-modal-dialog-slider-pivot\").hide();\r\n    }\r\n\r\n}\r\n\r\nexport function initialSheetBar(){\r\n    const _locale = locale();\r\n    const locale_sheetconfig = _locale.sheetconfig;\r\n    isInitialSheetConfig = false\r\n\r\n    $(\"#luckysheet-sheet-area\").on(\"mousedown\", \"div.luckysheet-sheets-item\", function (e) {\r\n        if(isEditMode()){\r\n            // alert(\"非编辑模式下不允许该操作！\");\r\n            return;\r\n        }\r\n\r\n        let $t = $(this), $cur = $(e.target), $item = $cur.closest(\".luckysheet-sheets-item\");\r\n\r\n        if (e.which == \"3\") {\r\n            setTimeout(() => {\r\n                luckysheetsheetrightclick($t, $cur, e);\r\n                luckysheetcurrentSheetitem = $item;\r\n                showsheetconfigmenu();\r\n                return;\r\n            }, 0);\r\n        }\r\n\r\n        if ($item.hasClass(\"luckysheet-sheets-item-active\") && $item.find(\".luckysheet-sheets-item-name\").attr(\"contenteditable\") == \"false\") {\r\n            jfdbclicklagTimeout = setTimeout(function () {\r\n                Store.luckysheet_sheet_move_status = true;\r\n                Store.luckysheet_sheet_move_data = {};\r\n                Store.luckysheet_sheet_move_data.widthlist = [];\r\n\r\n                $(\"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\").each(function (i) {\r\n                    if (i == 0) {\r\n                        Store.luckysheet_sheet_move_data.widthlist.push(parseInt($(this).outerWidth()));\r\n                    }\r\n                    else {\r\n                        Store.luckysheet_sheet_move_data.widthlist.push(parseInt($(this).outerWidth()) + Store.luckysheet_sheet_move_data.widthlist[i - 1]);\r\n                    }\r\n                });\r\n\r\n                Store.luckysheet_sheet_move_data.curindex = $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").index($item);\r\n                let x = e.pageX;\r\n                Store.luckysheet_sheet_move_data.curleft = x - $item.offset().left;\r\n                Store.luckysheet_sheet_move_data.pageX = x;\r\n                Store.luckysheet_sheet_move_data.activeobject = $item;\r\n                Store.luckysheet_sheet_move_data.cursorobject = $cur;\r\n                let $itemclone = $item.clone().css(\"visibility\", \"hidden\").attr(\"id\", \"luckysheet-sheets-item-clone\");\r\n                $item.after($itemclone);\r\n                $item.css({ \"position\": \"absolute\", \"opacity\": 0.8, \"cursor\": \"move\", \"transition\": \"initial\", \"z-index\": 10 });\r\n            }, 200);\r\n        }\r\n    }).on(\"click\", \"div.luckysheet-sheets-item\", function (e) {\r\n\r\n        if(isEditMode()){\r\n            // alert(\"非编辑模式下不允许该操作！\");\r\n            return;\r\n        }\r\n\r\n        let $t = $(this), $cur = $(e.target);\r\n        luckysheetsheetrightclick($t, $cur, e);\r\n        server.keepHighLightBox()\r\n    });\r\n\r\n    let luckysheetsheetnameeditor = function ($t) {\r\n        if(Store.allowEdit===false || !luckysheetConfigsetting.sheetRightClickConfig.rename){\r\n            return;\r\n        }\r\n        $t.attr(\"contenteditable\", \"true\").addClass(\"luckysheet-mousedown-cancel\").data(\"oldtxt\", $t.text());\r\n\r\n        setTimeout(function () {\r\n            selectTextDom($t.get(0));\r\n        }, 1);\r\n    }\r\n\r\n    $(\"#luckysheet-sheet-area\").on(\"dblclick\", \"span.luckysheet-sheets-item-name\", function (e) {\r\n        luckysheetsheetnameeditor($(this));\r\n    });\r\n\r\n    let compositionFlag = true;\r\n    $(\"#luckysheet-sheet-area\").on(\"compositionstart\", \"span.luckysheet-sheets-item-name\",  ()=> compositionFlag = false);\r\n    $(\"#luckysheet-sheet-area\").on(\"compositionend\", \"span.luckysheet-sheets-item-name\", ()=> compositionFlag = true);\r\n    $(\"#luckysheet-sheet-area\").on(\"input\", \"span.luckysheet-sheets-item-name\", function () {\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n\r\n        if(Store.limitSheetNameLength === false){\r\n            return\r\n        }\r\n\r\n        let maxLength = Store.defaultSheetNameMaxLength;\r\n        if(maxLength  === 0){\r\n            return\r\n        }\r\n\r\n        setTimeout( ()=> {\r\n            if (compositionFlag) {\r\n\r\n                if ($(this).text().length >= maxLength) {  /* 检查：值是否越界 */\r\n                    setTimeout(() => {\r\n                        $(this).text($(this).text().substring(0, maxLength));\r\n\r\n                        let range = window.getSelection();\r\n                        range.selectAllChildren(this);\r\n                        range.collapseToEnd();\r\n                    }, 0);\r\n                 }\r\n            }\r\n        }, 0);\r\n    });\r\n\r\n    $(\"#luckysheet-sheet-area\").on(\"blur\", \"span.luckysheet-sheets-item-name\", function (e) {\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n\r\n        let $t = $(this);\r\n        let txt = $t.text(), oldtxt = $t.data(\"oldtxt\");\r\n\r\n        if(0 === $(this).text().length){\r\n            tooltip.info(\"\", locale_sheetconfig.sheetNamecannotIsEmptyError);\r\n            $t.text(oldtxt).attr(\"contenteditable\", \"false\");\r\n            return;\r\n        }\r\n\r\n        if(txt.length>31 || txt.charAt(0)==\"'\" || txt.charAt(txt.length-1)==\"'\" || /[：\\:\\\\\\/？\\?\\*\\[\\]]+/.test(txt)){\r\n            tooltip.info(\"\", locale_sheetconfig.sheetNameSpecCharError);\r\n            $t.text(oldtxt).attr(\"contenteditable\", \"false\");\r\n            return;\r\n        }\r\n\r\n        let index = getSheetIndex(Store.currentSheetIndex);\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            if (index != i && Store.luckysheetfile[i].name == txt) {\r\n                if(isEditMode()){\r\n                    alert(locale_sheetconfig.tipNameRepeat);\r\n                }\r\n                else{\r\n                    tooltip.info(\"\", locale_sheetconfig.tipNameRepeat);\r\n                }\r\n                $t.text(oldtxt).attr(\"contenteditable\", \"false\");\r\n                return;\r\n            }\r\n        }\r\n\r\n        sheetmanage.sheetArrowShowAndHide();\r\n\r\n        Store.luckysheetfile[index].name = txt;\r\n        server.saveParam(\"all\", Store.currentSheetIndex, txt, { \"k\": \"name\" });\r\n\r\n        $t.attr(\"contenteditable\", \"false\").removeClass(\"luckysheet-mousedown-cancel\");\r\n\r\n        if (Store.clearjfundo) {\r\n            let redo = {};\r\n            redo[\"type\"] = \"sheetName\";\r\n            redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n\r\n            redo[\"oldtxt\"] = oldtxt;\r\n            redo[\"txt\"] = txt;\r\n\r\n            Store.jfundo.length = 0;\r\n            Store.jfredo.push(redo);\r\n        }\r\n        // 钩子： sheetEditNameAfter\r\n        method.createHookFunction('sheetEditNameAfter', {\r\n            i: Store.luckysheetfile[index].index,\r\n            oldName: oldtxt, newName: txt \r\n        });\r\n    });\r\n\r\n    $(\"#luckysheet-sheet-area\").on(\"keydown\", \"span.luckysheet-sheets-item-name\", function (e) {\r\n        if(Store.allowEdit===false){\r\n            return;\r\n        }\r\n        let kcode = e.keyCode;\r\n        let $t = $(this);\r\n        if (kcode == keycode.ENTER) {\r\n            let index = getSheetIndex(Store.currentSheetIndex);\r\n            oldSheetFileName = Store.luckysheetfile[index].name || oldSheetFileName;\r\n            Store.luckysheetfile[index].name = $t.text();\r\n            $t.attr(\"contenteditable\", \"false\");\r\n        }\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfigrename\").click(function () {\r\n        var $name = luckysheetcurrentSheetitem.find(\"span.luckysheet-sheets-item-name\")\r\n        // 钩子 sheetEditNameBefore\r\n        if (!method.createHookFunction('sheetEditNameBefore', { i: luckysheetcurrentSheetitem.data('index') , name: $name.text() })){\r\n            return;\r\n        }\r\n        luckysheetsheetnameeditor(luckysheetcurrentSheetitem.find(\"span.luckysheet-sheets-item-name\"));\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfigshow\").click(function () {\r\n        $(\"#luckysheet-sheets-m\").click();\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-rightclick-sheet-menu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfigmoveleft\").click(function () {\r\n        if (luckysheetcurrentSheetitem.prevAll(\":visible\").length > 0) {\r\n            luckysheetcurrentSheetitem.insertBefore(luckysheetcurrentSheetitem.prevAll(\":visible\").eq(0));\r\n            sheetmanage.reOrderAllSheet();\r\n        }\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfigmoveright\").click(function () {\r\n        if (luckysheetcurrentSheetitem.nextAll(\":visible\").length > 0) {\r\n            luckysheetcurrentSheetitem.insertAfter(luckysheetcurrentSheetitem.nextAll(\":visible\").eq(0));\r\n            sheetmanage.reOrderAllSheet();\r\n        }\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfigdelete\").click(function (e) {\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n\r\n        if($(\"#luckysheet-sheet-container-c .luckysheet-sheets-item:visible\").length <= 1){\r\n            if(isEditMode()){\r\n                alert(locale_sheetconfig.noMoreSheet);\r\n            }\r\n            else{\r\n                tooltip.info(locale_sheetconfig.noMoreSheet, \"\");\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        let index = getSheetIndex(Store.currentSheetIndex);\r\n\r\n        tooltip.confirm(locale_sheetconfig.confirmDelete+\"【\" + Store.luckysheetfile[index].name + \"】？\", \"<span style='color:#9e9e9e;font-size:12px;'>\"+locale_sheetconfig.redoDelete+\"</span>\", function () {\r\n            sheetmanage.deleteSheet(luckysheetcurrentSheetitem.data(\"index\"));\r\n        }, null);\r\n\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfigcopy\").click(function (e) {\r\n        sheetmanage.copySheet(luckysheetcurrentSheetitem.data(\"index\"), e);\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheetsheetconfighide\").click(function () {\r\n        if ($(\"#luckysheet-sheet-area div.luckysheet-sheets-item:visible\").length == 1) {\r\n            if(isEditMode()){\r\n                alert(locale_sheetconfig.noHide);\r\n            }\r\n            else{\r\n                tooltip.info(\"\", locale_sheetconfig.noHide);\r\n            }\r\n            return;\r\n        }\r\n        sheetmanage.setSheetHide(luckysheetcurrentSheetitem.data(\"index\"));\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n    });\r\n\r\n    $(\"#luckysheet-sheets-add\").click(function (e) {\r\n        //保存正在编辑的单元格内容\r\n        if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0) {\r\n            formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n        }\r\n\r\n        sheetmanage.addNewSheet(e);\r\n        sheetmanage.locationSheet();\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n    });\r\n\r\n    let sheetscrollani = null, sheetscrollstart = 0, sheetscrollend = 0, sheetscrollstep = 150;\r\n    $(\"#luckysheet-sheets-leftscroll\").click(function () {\r\n        let $c = $(\"#luckysheet-sheet-container-c\");\r\n        sheetscrollstart = $c.scrollLeft();\r\n        sheetscrollend = $c.scrollLeft() - sheetscrollstep;\r\n\r\n        if (sheetscrollend <= 0) {\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").hide();\r\n        }\r\n        $(\"#luckysheet-sheet-container .docs-sheet-fade-right\").show();\r\n\r\n        clearInterval(sheetscrollani);\r\n        sheetscrollani = setInterval(function () {\r\n            sheetscrollstart -= 4;\r\n            $c.scrollLeft(sheetscrollstart);\r\n            if (sheetscrollstart <= sheetscrollend) {\r\n                clearInterval(sheetscrollani);\r\n            }\r\n        }, 1);\r\n    });\r\n\r\n    $(\"#luckysheet-sheets-rightscroll\").click(function () {\r\n        let $c = $(\"#luckysheet-sheet-container-c\");\r\n        sheetscrollstart = $c.scrollLeft();\r\n        sheetscrollend = $c.scrollLeft() + sheetscrollstep;\r\n\r\n        if (sheetscrollstart > 0) {\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-right\").hide();\r\n        }\r\n        $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").show();\r\n\r\n        clearInterval(sheetscrollani);\r\n        sheetscrollani = setInterval(function () {\r\n            sheetscrollstart += 4;\r\n            $c.scrollLeft(sheetscrollstart);\r\n            if (sheetscrollstart >= sheetscrollend) {\r\n                clearInterval(sheetscrollani);\r\n            }\r\n        }, 1);\r\n    });\r\n\r\n    let initialOpenSheet = true;\r\n    $(\"#luckysheet-sheets-m\").click(function (e) {\r\n        //保存正在编辑的单元格内容\r\n        if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0) {\r\n            formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n        }\r\n\r\n        $(\"#luckysheet-sheet-list\").html(\"\");\r\n\r\n        let item = \"\";\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            let f = Store.luckysheetfile[i], icon = '', style = \"\";\r\n            if (f[\"status\"] == 1) {\r\n                icon = '<i class=\"fa fa-check\" aria-hidden=\"true\"></i>';\r\n            }\r\n\r\n            if (f[\"hide\"] == 1) {\r\n                icon = '<i class=\"fa fa-low-vision\" aria-hidden=\"true\"></i>';\r\n                style += \"color:#BBBBBB;\";\r\n            }\r\n\r\n            if (f[\"color\"] != null && f[\"color\"].length > 0) {\r\n                style += \"border-right:4px solid \" + f[\"color\"] + \";\";\r\n            }\r\n\r\n            item += replaceHtml(sheetselectlistitemHTML, { \"index\": f[\"index\"], \"name\": f[\"name\"], \"icon\": icon, \"style\": style });\r\n        }\r\n\r\n        if (initialOpenSheet) {\r\n            $(\"#\" + Store.container).append(replaceHtml(sheetselectlistHTML, { \"item\": item }));\r\n            $(\"#luckysheet-sheet-list\").on(\"click\", \".luckysheet-cols-menuitem\", function (e) {\r\n                if(isEditMode()){\r\n                    // tooltip.info(\"提示\", \"图表编辑模式下不允许该操作！\");\r\n                    alert(locale_sheetconfig.chartEditNoOpt);\r\n                    return;\r\n                }\r\n\r\n                let $item = $(this), index = $item.data(\"index\");\r\n\r\n                if ($item.data(\"index\") != Store.currentSheetIndex) {\r\n                    sheetmanage.setSheetShow(index);\r\n                    sheetmanage.locationSheet();\r\n                }\r\n                server.keepHighLightBox()\r\n            });\r\n\r\n            initialOpenSheet = false;\r\n        }\r\n        else {\r\n            $(\"#luckysheet-sheet-list\").html(item);\r\n        }\r\n\r\n        let $t = $(\"#luckysheet-sheet-list\");\r\n\r\n        let left = $(this).offset().left - $('#' + Store.container).offset().left;\r\n        let bottom = $(this).height() + $('#luckysheet-sta-content').height() + 12;\r\n        $t.css({left: left + 'px', bottom: bottom + 'px'}).show();\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n    });\r\n\r\n    // 初始化分页器\r\n    if (luckysheetConfigsetting.pager) {\r\n        pagerInit(luckysheetConfigsetting.pager)\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "src/controllers/sheetMove.js",
    "content": "import { getObjType } from '../utils/util';\r\nimport formula from '../global/formula';\r\nimport { isRealNull } from '../global/validate';\r\nimport { countfunc } from '../global/count';\r\nimport menuButton from './menuButton';\r\nimport { selectHightlightShow } from './select';\r\nimport pivotTable from './pivotTable';\r\nimport Store from '../store';\r\nimport server from './server';\r\n\r\nfunction luckysheetMoveEndCell(postion, type, isScroll, terminal, onlyvalue) {\r\n    if (isScroll == null) {\r\n        isScroll = true;\r\n    }\r\n\r\n    if (!postion) {\r\n        postion = \"down\";\r\n    }\r\n\r\n    if (!type) {\r\n        type = \"cell\";\r\n    }\r\n\r\n    if (onlyvalue == null) {\r\n        onlyvalue = false;\r\n    }\r\n\r\n    let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n    let curR = last[\"row\"] == null ? 0 : last[\"row\"][0];\r\n    let curC = last[\"column\"] == null ? 0 : last[\"column\"][0];\r\n\r\n    let startR = last[\"row\"] == null ? 0 : last[\"row\"][0];\r\n    let startC = last[\"column\"] == null ? 0 : last[\"column\"][0];\r\n\r\n    let endR = last[\"row\"] == null ? 0 : last[\"row\"][1];\r\n    let endC = last[\"column\"] == null ? 0 : last[\"column\"][1];\r\n\r\n    formula.fucntionboxshow(curR, curC);\r\n\r\n    if (type == \"range\") {\r\n        // need var\r\n        var p_startR = Store.luckysheet_shiftpositon[\"row\"][0];\r\n        var p_startC = Store.luckysheet_shiftpositon[\"column\"][0];\r\n\r\n        let p_endR = Store.luckysheet_shiftpositon[\"row\"][1];\r\n        let p_endC = Store.luckysheet_shiftpositon[\"column\"][1];\r\n\r\n        if (postion == \"down\" || postion == \"up\") {\r\n            if (p_endR < endR) {\r\n                curR = last[\"row\"] == null ? 0 : last[\"row\"][1];\r\n            }\r\n            else if (p_startR > startR) {\r\n                curR = last[\"row\"] == null ? 0 : last[\"row\"][0];\r\n            }\r\n            else if (p_endR == endR && p_startR == startR) {\r\n                if (postion == \"down\") {\r\n                    curR = last[\"row\"] == null ? 0 : last[\"row\"][1];\r\n                }\r\n                else {\r\n                    curR = last[\"row\"] == null ? 0 : last[\"row\"][0];\r\n                }\r\n            }\r\n        }\r\n        else if (postion == \"right\" || postion == \"left\") {\r\n            if (p_endC < endC) {\r\n                curC = last[\"column\"] == null ? 0 : last[\"column\"][1];\r\n            }\r\n            else if (p_startC > startC) {\r\n                curC = last[\"column\"] == null ? 0 : last[\"column\"][0];\r\n            }\r\n            else if (p_endC == endC && p_startC == startC) {\r\n                if (postion == \"right\") {\r\n                    curC = last[\"column\"] == null ? 0 : last[\"column\"][1];\r\n                }\r\n                else {\r\n                    curC = last[\"column\"] == null ? 0 : last[\"column\"][0];\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    let datarowlen = Store.flowdata.length, \r\n        datacolumnlen = Store.flowdata[0].length;\r\n\r\n    let data = Store.flowdata, moveP = \"\", moveV = 0;\r\n\r\n    if (postion == \"up\") {\r\n        if (curR == 0) {\r\n            return;\r\n        }\r\n        else {\r\n            let stvalue = [], p = null, i = 0, p_pre = null;\r\n            for (let c = startC; c <= endC; c++) {\r\n                stvalue = [];\r\n                i = 0;\r\n\r\n                for (let r = curR - 1; r >= 0; r--) {\r\n                    let cell = data[r][c];\r\n\r\n                    if (getObjType(cell) == \"object\" && isRealNull(cell.v)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else if (isRealNull(cell)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else {\r\n                        stvalue.push(true);\r\n                    }\r\n\r\n                    if (stvalue.length > 1) {\r\n                        if (stvalue[i] == true && stvalue[i - 1] == false) {\r\n                            p = r;\r\n                            break\r\n                        }\r\n                        else if (stvalue[i] == false && stvalue[i - 1] == true) {\r\n                            p = r + 1;\r\n                            break\r\n                        }\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n\r\n                if(p == null){\r\n                    p = 0;\r\n                }\r\n\r\n                if (p_pre == null || p < p_pre) {\r\n                    p_pre = p;\r\n                }\r\n            }\r\n            \r\n            moveP = \"down\";\r\n            moveV = p_pre - curR;\r\n        }\r\n    }\r\n    else if (postion == \"down\") {\r\n        if (curR == datarowlen - 1) {\r\n            return;\r\n        }\r\n        else {\r\n            let stvalue = [], p = null, i = 0, p_pre = null;\r\n            for (let c = startC; c <= endC; c++) {\r\n                stvalue = [];\r\n                i = 0;\r\n\r\n                for (let r = curR + 1; r < data.length; r++) {\r\n                    let cell = data[r][c];\r\n\r\n                    if (getObjType(cell) == \"object\" && isRealNull(cell.v)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else if (isRealNull(cell)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else {\r\n                        stvalue.push(true);\r\n                    }\r\n                    \r\n                    if (stvalue.length > 1) {\r\n                        if (stvalue[i] == true && stvalue[i - 1] == false) {\r\n                            p = r;\r\n                            break\r\n                        }\r\n                        else if (stvalue[i] == false && stvalue[i - 1] == true) {\r\n                            p = r - 1;\r\n                            break\r\n                        }\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n\r\n                if(p == null){\r\n                    p = data.length - 1;\r\n                }\r\n\r\n                if (p_pre == null || p > p_pre) {\r\n                    p_pre = p;\r\n                }\r\n            }\r\n            \r\n            moveP = \"down\";\r\n            moveV = p_pre - curR;\r\n        }\r\n    }\r\n    else if (postion == \"left\") {\r\n        if (curC == 0) {\r\n            return;\r\n        }\r\n        else {\r\n            let stvalue = [], p = null, i = 0, p_pre = null;\r\n            for (let r = startR; r <= endR; r++) {\r\n                stvalue = [];\r\n                i = 0;\r\n                for (let c = curC - 1; c >= 0; c--) {\r\n                    let cell = data[r][c];\r\n\r\n                    if (getObjType(cell) == \"object\" && isRealNull(cell.v)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else if (isRealNull(cell)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else {\r\n                        stvalue.push(true);\r\n                    }\r\n\r\n                    if (stvalue.length > 1) {\r\n                        if (stvalue[i] == true && stvalue[i - 1] == false) {\r\n                            p = c;\r\n                            break\r\n                        }\r\n                        else if (stvalue[i] == false && stvalue[i - 1] == true) {\r\n                            p = c + 1;\r\n                            break\r\n                        }\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n\r\n                if(p == null){\r\n                    p = 0;\r\n                }\r\n\r\n                if (p_pre == null || p < p_pre) {\r\n                    p_pre = p;\r\n                }\r\n            }\r\n            \r\n            moveP = \"right\";\r\n            moveV = p_pre - curC;\r\n        }\r\n    }\r\n    else if (postion == \"right\") {\r\n        if (curC == datacolumnlen - 1) {\r\n            return;\r\n        }\r\n        else {\r\n            let stvalue = [], p = null, i = 0, p_pre = null;\r\n            for (let r = startR; r <= endR; r++) {\r\n                stvalue = [];\r\n                i = 0;\r\n\r\n                for (let c = curC + 1; c < data[0].length; c++) {\r\n                    let cell = data[r][c];\r\n\r\n                    if (getObjType(cell) == \"object\" && isRealNull(cell.v)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else if (isRealNull(cell)) {\r\n                        stvalue.push(false);\r\n                    }\r\n                    else {\r\n                        stvalue.push(true);\r\n                    }\r\n\r\n                    if (stvalue.length > 1) {\r\n                        if (stvalue[i] == true && stvalue[i - 1] == false) {\r\n                            p = c;\r\n                            break\r\n                        }\r\n                        else if (stvalue[i] == false && stvalue[i - 1] == true) {\r\n                            p = c - 1;\r\n                            break\r\n                        }\r\n                    }\r\n\r\n                    i++;\r\n                }\r\n\r\n                if(p == null){\r\n                    p = data[0].length - 1;\r\n                }\r\n\r\n                if (p_pre == null || p > p_pre) {\r\n                    p_pre = p;\r\n                }\r\n            }\r\n\r\n            moveP = \"right\";\r\n            moveV = p_pre - curC;\r\n        }\r\n    }\r\n\r\n    if (type == \"range\") {\r\n        if (postion == \"up\") {\r\n            if (p_endR < endR) {\r\n                if (moveV + curR < p_endR) {\r\n                    moveV = p_endR - curR;\r\n                }\r\n            }\r\n        }\r\n        else if (postion == \"down\") {\r\n            if (p_startR > startR) {\r\n                if (moveV + curR > p_startR) {\r\n                    moveV = p_startR - curR;\r\n                }\r\n            }\r\n        }\r\n        else if (postion == \"left\") {\r\n            if (p_endC < endC) {\r\n                if (moveV + curC < p_endC) {\r\n                    moveV = p_endC - curC;\r\n                }\r\n            }\r\n        }\r\n        else if (postion == \"right\") {\r\n            if (p_startC > startC) {\r\n                if (moveV + curC > p_startC) {\r\n                    moveV = p_startC - curC;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (terminal != null && Math.abs(moveV) > Math.abs(terminal)) {\r\n            moveV = terminal;\r\n        }\r\n    }\r\n\r\n    if (!onlyvalue) {\r\n        if (type == \"cell\") {\r\n            luckysheetMoveHighlightCell(moveP, moveV, \"rangeOfSelect\", isScroll);\r\n        }\r\n        else if (type == \"range\") {\r\n            luckysheetMoveHighlightRange(moveP, moveV, \"rangeOfSelect\", isScroll);\r\n        }\r\n    }\r\n    else {\r\n        return moveV;\r\n    }\r\n}\r\n\r\n//方向键  调整单元格\r\nfunction luckysheetMoveHighlightCell(postion, index, type, isScroll) {\r\n    if (isScroll == null) {\r\n        isScroll = true;\r\n    }\r\n\r\n    if (!postion) {\r\n        postion == \"down\";\r\n    }\r\n\r\n    let datarowlen = Store.flowdata.length, \r\n        datacolumnlen = Store.flowdata[0].length;\r\n\r\n    let row, row_pre, row_index, row_index_ed;\r\n    let col, col_pre, col_index, col_index_ed;\r\n\r\n    if(type == \"rangeOfSelect\"){\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        \r\n        let curR;\r\n        if(last[\"row_focus\"] == null){\r\n            curR = last[\"row\"][0];    \r\n        }\r\n        else{\r\n            curR = last[\"row_focus\"];    \r\n        }\r\n\r\n        let curC;\r\n        if(last[\"column_focus\"] == null){\r\n            curC = last[\"column\"][0];\r\n        }\r\n        else{\r\n            curC = last[\"column_focus\"];    \r\n        }\r\n        \r\n        //focus单元格 是否是合并单元格\r\n        let margeset = menuButton.mergeborer(Store.flowdata, curR, curC);\r\n        if(!!margeset){\r\n            let str_r = margeset.row[2];\r\n            let end_r = margeset.row[3];\r\n\r\n            let str_c = margeset.column[2];\r\n            let end_c = margeset.column[3];\r\n\r\n            if(index > 0){\r\n                if(postion == \"down\"){\r\n                    curR = end_r;\r\n                    curC = str_c;\r\n                }\r\n                else if(postion == \"right\"){\r\n                    curR = str_r;\r\n                    curC = end_c;\r\n                }\r\n            }\r\n            else{\r\n                curR = str_r;\r\n                curC = str_c;\r\n            }\r\n        }\r\n\r\n        let moveX = last[\"moveXY\"] == null ? curR : last[\"moveXY\"].x;\r\n        let moveY = last[\"moveXY\"] == null ? curC : last[\"moveXY\"].y;\r\n\r\n        if (postion == \"down\") {\r\n            curR += index;\r\n            moveX = curR;\r\n        }\r\n        else if (postion == \"right\") {\r\n            curC += index;\r\n            moveY = curC;\r\n        }\r\n\r\n        if (curR >= datarowlen) {\r\n            curR = datarowlen - 1;\r\n            moveX = curR;\r\n        }\r\n\r\n        if (curR < 0) {\r\n            curR = 0;\r\n            moveX = curR;\r\n        }\r\n\r\n        if (curC >= datacolumnlen) {\r\n            curC = datacolumnlen - 1;\r\n            moveY = curC;\r\n        }\r\n\r\n        if (curC < 0) {\r\n            curC = 0;\r\n            moveY = curC;\r\n        }\r\n\r\n        //移动的下一个单元格是否是合并的单元格\r\n        let margeset2 = menuButton.mergeborer(Store.flowdata, curR, curC);\r\n        if(!!margeset2){\r\n            row = margeset2.row[1];\r\n            row_pre = margeset2.row[0];\r\n            row_index = margeset2.row[2];\r\n            row_index_ed = margeset2.row[3];\r\n\r\n            col = margeset2.column[1];\r\n            col_pre = margeset2.column[0];\r\n            col_index = margeset2.column[2];\r\n            col_index_ed = margeset2.column[3];\r\n        }\r\n        else{\r\n            row = Store.visibledatarow[moveX]; \r\n            row_pre = moveX - 1 == -1 ? 0 : Store.visibledatarow[moveX - 1];\r\n            // row_index = moveX;\r\n            // row_index_ed = moveX;\r\n\r\n            col = Store.visibledatacolumn[moveY]; \r\n            col_pre = moveY - 1 == -1 ? 0 : Store.visibledatacolumn[moveY - 1];\r\n            // col_index = moveY;\r\n            // col_index_ed = moveY;\r\n            \r\n            row_index = row_index_ed = curR;\r\n            col_index = col_index_ed = curC;\r\n        }\r\n\r\n        last[\"row\"] = [row_index, row_index_ed];\r\n        last[\"column\"] = [col_index, col_index_ed];\r\n        last[\"row_focus\"] = row_index;\r\n        last[\"column_focus\"] = col_index;\r\n        last[\"moveXY\"] = {\"x\": moveX,\"y\": moveY};\r\n\r\n        selectHightlightShow();\r\n        pivotTable.pivotclick(row_index, col_index);\r\n        formula.fucntionboxshow(row_index, col_index);\r\n    }\r\n    else if(type == \"rangeOfFormula\"){\r\n        let last = formula.func_selectedrange;\r\n        \r\n        let curR;\r\n        if(last[\"row_focus\"] == null){\r\n            curR = last[\"row\"][0];    \r\n        }\r\n        else{\r\n            curR = last[\"row_focus\"];    \r\n        }\r\n\r\n        let curC;\r\n        if(last[\"column_focus\"] == null){\r\n            curC = last[\"column\"][0];\r\n        }\r\n        else{\r\n            curC = last[\"column_focus\"];    \r\n        }\r\n        \r\n        //focus单元格 是否是合并单元格\r\n        let margeset = menuButton.mergeborer(Store.flowdata, curR, curC);\r\n        if(!!margeset){\r\n            let str_r = margeset.row[2];\r\n            let end_r = margeset.row[3];\r\n\r\n            let str_c = margeset.column[2];\r\n            let end_c = margeset.column[3];\r\n\r\n            if(index > 0){\r\n                if(postion == \"down\"){\r\n                    curR = end_r;\r\n                    curC = str_c;\r\n                }\r\n                else if(postion == \"right\"){\r\n                    curR = str_r;\r\n                    curC = end_c;\r\n                }\r\n            }\r\n            else{\r\n                curR = str_r;\r\n                curC = str_c;\r\n            }\r\n        }\r\n\r\n        let moveX = last[\"moveXY\"] == null ? curR : last[\"moveXY\"].x;\r\n        let moveY = last[\"moveXY\"] == null ? curC : last[\"moveXY\"].y;\r\n\r\n        if (postion == \"down\") {\r\n            curR += index;\r\n            moveX = curR;\r\n        }\r\n        else if (postion == \"right\") {\r\n            curC += index;\r\n            moveY = curC;\r\n        }\r\n\r\n        if (curR >= datarowlen) {\r\n            curR = datarowlen - 1;\r\n            moveX = curR;\r\n        }\r\n\r\n        if (curR < 0) {\r\n            curR = 0;\r\n            moveX = curR;\r\n        }\r\n\r\n        if (curC >= datacolumnlen) {\r\n            curC = datacolumnlen - 1;\r\n            moveY = curC;\r\n        }\r\n\r\n        if (curC < 0) {\r\n            curC = 0;\r\n            moveY = curC;\r\n        }\r\n\r\n        //移动的下一个单元格是否是合并的单元格\r\n        let margeset2 = menuButton.mergeborer(Store.flowdata, curR, curC);\r\n        if(!!margeset2){\r\n            row = margeset2.row[1];\r\n            row_pre = margeset2.row[0];\r\n            row_index = margeset2.row[2];\r\n            row_index_ed = margeset2.row[3];\r\n\r\n            col = margeset2.column[1];\r\n            col_pre = margeset2.column[0];\r\n            col_index = margeset2.column[2];\r\n            col_index_ed = margeset2.column[3];\r\n        }\r\n        else{\r\n            row = Store.visibledatarow[moveX]; \r\n            row_pre = moveX - 1 == -1 ? 0 : Store.visibledatarow[moveX - 1];\r\n            row_index = moveX;\r\n            row_index_ed = moveX;\r\n\r\n            col = Store.visibledatacolumn[moveY];\r\n            col_pre = moveY - 1 == -1 ? 0 : Store.visibledatacolumn[moveY - 1];\r\n            col_index = moveY;\r\n            col_index_ed = moveY;\r\n        }\r\n\r\n        formula.func_selectedrange = {\r\n            \"left\": col_pre,\r\n            \"width\": col - col_pre - 1,\r\n            \"top\": row_pre,\r\n            \"height\": row - row_pre - 1,\r\n            \"left_move\": col_pre,\r\n            \"width_move\": col - col_pre - 1,\r\n            \"top_move\": row_pre,\r\n            \"height_move\": row - row_pre - 1,\r\n            \"row\": [row_index, row_index_ed],\r\n            \"column\": [col_index, col_index_ed],\r\n            \"row_focus\": row_index,\r\n            \"column_focus\": col_index,\r\n            \"moveXY\": {\"x\": moveX, \"y\": moveY}\r\n        };\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\").css({\r\n            \"left\": col_pre,\r\n            \"width\": col - col_pre - 1,\r\n            \"top\": row_pre,\r\n            \"height\": row - row_pre - 1\r\n        }).show();\r\n\r\n        formula.rangeSetValue({\r\n            \"row\": [row_index, row_index_ed],\r\n            \"column\": [col_index, col_index_ed]\r\n        });\r\n    }\r\n\r\n    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n    let winH = $(\"#luckysheet-cell-main\").height(), winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n    let sleft = 0, stop = 0;\r\n    if (col - scrollLeft - winW + 20 > 0) {\r\n        sleft = col - winW + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n    else if (col_pre - scrollLeft - 20 < 0) {\r\n        sleft = col_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n\r\n    if (row - scrollTop - winH + 20 > 0) {\r\n        stop = row - winH + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n    else if (row_pre - scrollTop - 20 < 0) {\r\n        stop = row_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n\r\n    clearTimeout(Store.countfuncTimeout);\r\n    countfunc();\r\n    \r\n    // 移动单元格通知后台\r\n    server.saveParam(\"mv\", Store.currentSheetIndex, Store.luckysheet_select_save);\r\n}\r\n\r\n//ctrl + 方向键  调整单元格\r\nfunction luckysheetMoveHighlightCell2(postion, type, isScroll) {\r\n    if(!isScroll){\r\n        isScroll = true;\r\n    }\r\n\r\n    let row, row_pre;\r\n    let col, col_pre;\r\n\r\n    if(type == \"rangeOfSelect\"){\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rf = last[\"row_focus\"], cf = last[\"column_focus\"];\r\n\r\n        let focusIsMerge = false, mc = {};\r\n        if(Store.config[\"merge\"] != null && (rf + \"_\" + cf) in Store.config[\"merge\"]){\r\n            focusIsMerge = true;\r\n            mc = Store.config[\"merge\"][rf + \"_\" + cf];\r\n        }\r\n\r\n        if(postion == \"down\"){\r\n            if(rf == Store.flowdata.length - 1){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                rf = getNextIndex(\"down\", cf, mc.r + mc.rs - 1, Store.flowdata.length - 1);\r\n            }\r\n            else{\r\n                rf = getNextIndex(\"down\", cf, rf, Store.flowdata.length - 1);\r\n            }\r\n        }\r\n        else if(postion == \"up\"){\r\n            if(rf == 0){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                rf = getNextIndex(\"up\", cf, 0, mc.r);\r\n            }\r\n            else{\r\n                rf = getNextIndex(\"up\", cf, 0, rf);\r\n            }\r\n        }\r\n        else if(postion == \"right\"){\r\n            if(cf == Store.flowdata[0].length - 1){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                cf = getNextIndex(\"right\", rf, mc.c + mc.cs - 1, Store.flowdata[0].length - 1);\r\n            }\r\n            else{\r\n                cf = getNextIndex(\"right\", rf, cf, Store.flowdata[0].length - 1);\r\n            }\r\n        }\r\n        else if(postion == \"left\"){\r\n            if(cf == 0){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                cf = getNextIndex(\"left\", rf, 0, mc.c);\r\n            }\r\n            else{\r\n                cf = getNextIndex(\"left\", rf, 0, cf);\r\n            }\r\n        }\r\n\r\n        let rowseleted = [rf, rf];\r\n        let columnseleted = [cf, cf];\r\n\r\n        row = Store.visibledatarow[rf];\r\n        row_pre = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1];\r\n        col = Store.visibledatacolumn[cf];\r\n        col_pre = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1];\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, row_pre, row - row_pre - 1, col_pre, col - col_pre - 1);\r\n        if(changeparam != null){\r\n            columnseleted = changeparam[0];\r\n            rowseleted= changeparam[1];\r\n            // top = changeparam[2];\r\n            // height = changeparam[3];\r\n            // left = changeparam[4];\r\n            // width = changeparam[5];\r\n        }\r\n\r\n        Store.luckysheet_select_save = [{\"row\": rowseleted, \"column\": columnseleted}];\r\n        selectHightlightShow();\r\n        pivotTable.pivotclick(rf, cf);\r\n        formula.fucntionboxshow(rf, cf);\r\n    }\r\n    else if(type == \"rangeOfFormula\"){\r\n        let last = formula.func_selectedrange;\r\n        let rf = last[\"row_focus\"], cf = last[\"column_focus\"];\r\n\r\n        let focusIsMerge = false, mc = {};\r\n        if(Store.config[\"merge\"] != null && (rf + \"_\" + cf) in Store.config[\"merge\"]){\r\n            focusIsMerge = true;\r\n            mc = Store.config[\"merge\"][rf + \"_\" + cf];\r\n        }\r\n\r\n        if(postion == \"down\"){\r\n            if(rf == Store.flowdata.length - 1){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                rf = getNextIndex(\"down\", cf, mc.r + mc.rs - 1, Store.flowdata.length - 1);\r\n            }\r\n            else{\r\n                rf = getNextIndex(\"down\", cf, rf, Store.flowdata.length - 1);\r\n            }\r\n        }\r\n        else if(postion == \"up\"){\r\n            if(rf == 0){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                rf = getNextIndex(\"up\", cf, 0, mc.r);\r\n            }\r\n            else{\r\n                rf = getNextIndex(\"up\", cf, 0, rf);\r\n            }\r\n        }\r\n        else if(postion == \"right\"){\r\n            if(cf == Store.flowdata[0].length - 1){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                cf = getNextIndex(\"right\", rf, mc.c + mc.cs - 1, Store.flowdata[0].length - 1);\r\n            }\r\n            else{\r\n                cf = getNextIndex(\"right\", rf, cf, Store.flowdata[0].length - 1);\r\n            }\r\n        }\r\n        else if(postion == \"left\"){\r\n            if(cf == 0){\r\n                return;\r\n            }\r\n\r\n            if(focusIsMerge){\r\n                cf = getNextIndex(\"left\", rf, 0, mc.c);\r\n            }\r\n            else{\r\n                cf = getNextIndex(\"left\", rf, 0, cf);\r\n            }\r\n        }\r\n\r\n        let rowseleted = [rf, rf];\r\n        let columnseleted = [cf, cf];\r\n\r\n        row = Store.visibledatarow[rf];\r\n        row_pre = rf - 1 == -1 ? 0 : Store.visibledatarow[rf - 1];\r\n        col = Store.visibledatacolumn[cf]; \r\n        col_pre = cf - 1 == -1 ? 0 : Store.visibledatacolumn[cf - 1];\r\n\r\n        let top = row_pre, height = row - row_pre - 1;\r\n        let left = col_pre, width = col - col_pre - 1;\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n        if(changeparam != null){\r\n            columnseleted = changeparam[0];\r\n            rowseleted= changeparam[1];\r\n            top = changeparam[2];\r\n            height = changeparam[3];\r\n            left = changeparam[4];\r\n            width = changeparam[5];\r\n        }\r\n\r\n        formula.func_selectedrange = {\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": top,\r\n            \"height\": height,\r\n            \"left_move\": left,\r\n            \"width_move\": width,\r\n            \"top_move\": top,\r\n            \"height_move\": height,\r\n            \"row\": rowseleted,\r\n            \"column\": columnseleted,\r\n            \"row_focus\": rf,\r\n            \"column_focus\": cf\r\n        };\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\").css({\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": top,\r\n            \"height\": height\r\n        }).show();\r\n\r\n        formula.rangeSetValue({\r\n            \"row\": rowseleted,\r\n            \"column\": columnseleted\r\n        });\r\n    }\r\n\r\n    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n    let winH = $(\"#luckysheet-cell-main\").height(), winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n    let sleft = 0, stop = 0;\r\n    if (col - scrollLeft - winW + 20 > 0) {\r\n        sleft = col - winW + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n    else if (col_pre - scrollLeft - 20 < 0) {\r\n        sleft = col_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n\r\n    if (row - scrollTop - winH + 20 > 0) {\r\n        stop = row - winH + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n    else if (row_pre - scrollTop - 20 < 0) {\r\n        stop = row_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n\r\n    clearTimeout(Store.countfuncTimeout);\r\n    countfunc();\r\n}\r\n\r\n//shift + 方向键  调整选区\r\nfunction luckysheetMoveHighlightRange(postion, index, type, isScroll) {\r\n    if (isScroll == null) {\r\n        isScroll = true;\r\n    }\r\n\r\n    if (!postion) {\r\n        postion == \"down\";\r\n    }\r\n\r\n    let row, row_pre;\r\n    let col, col_pre;\r\n\r\n    if(type == \"rangeOfSelect\"){\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n        let curR = last[\"row\"][0], endR = last[\"row\"][1];\r\n        let curC = last[\"column\"][0], endC = last[\"column\"][1];\r\n        let rf = last[\"row_focus\"], cf = last[\"column_focus\"];\r\n\r\n        let datarowlen = Store.flowdata.length, \r\n            datacolumnlen = Store.flowdata[0].length;\r\n\r\n        if(postion == \"down\"){ //选区上下变动\r\n            if(rowHasMerge(rf, curC, endC)){ //focus单元格所在行有合并单元格\r\n                let rfMerge = getRowMerge(rf, curC, endC);\r\n                let rf_str = rfMerge[0], rf_end = rfMerge[1];\r\n\r\n                if(rf_str > curR && rf_end == endR){\r\n                    if(index > 0 && rowHasMerge(curR, curC, endC)){\r\n                        curR = getRowMerge(curR, curC, endC)[1];\r\n                    }\r\n\r\n                    curR += index;\r\n                }\r\n                else if(rf_end < endR && rf_str == curR){\r\n                    if(index < 0 && rowHasMerge(endR, curC, endC)){\r\n                        endR = getRowMerge(endR, curC, endC)[0];\r\n                    }\r\n\r\n                    endR += index;\r\n                }\r\n                else{\r\n                    if(index > 0){\r\n                        endR += index;\r\n                    }\r\n                    else{\r\n                        curR += index;\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                if(rf > curR && rf == endR){\r\n                    if(index > 0 && rowHasMerge(curR, curC, endC)){\r\n                        curR = getRowMerge(curR, curC, endC)[1];\r\n                    }\r\n\r\n                    curR += index;\r\n                }\r\n                else if(rf < endR && rf == curR){\r\n                    if(index < 0 && rowHasMerge(endR, curC, endC)){\r\n                        endR = getRowMerge(endR, curC, endC)[0];\r\n                    }\r\n\r\n                    endR += index;\r\n                }\r\n                else if(rf == curR && rf == endR){\r\n                    if(index > 0){\r\n                        endR += index;\r\n                    }\r\n                    else{\r\n                        curR += index;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (endR >= datarowlen) {\r\n                endR = datarowlen - 1;\r\n            }\r\n\r\n            if (endR < 0) {\r\n                endR = 0;\r\n            }\r\n\r\n            if (curR >= datarowlen) {\r\n                curR = datarowlen - 1;\r\n            }\r\n\r\n            if (curR < 0) {\r\n                curR = 0;\r\n            }\r\n        }\r\n        else{\r\n            if(colHasMerge(cf, curR, endR)){ //focus单元格所在列有合并单元格\r\n                let cfMerge = getColMerge(cf, curR, endR);\r\n                let cf_str = cfMerge[0], cf_end = cfMerge[1];\r\n\r\n                if(cf_str > curC && cf_end == endC){\r\n                    if(index > 0 && colHasMerge(curC, curR, endR)){\r\n                        curC = getColMerge(curC, curR, endR)[1];\r\n                    }\r\n\r\n                    curC += index;\r\n                }\r\n                else if(cf_end < endC && cf_str == curC){\r\n                    if(index < 0 && colHasMerge(endC, curR, endR)){\r\n                        endC = getColMerge(endC, curR, endR)[0];\r\n                    }\r\n\r\n                    endC += index;\r\n                }\r\n                else{\r\n                    if(index > 0){\r\n                        endC += index;\r\n                    }\r\n                    else{\r\n                        curC += index;\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                if(cf > curC && cf == endC){\r\n                    if(index > 0 && colHasMerge(curC, curR, endR)){\r\n                        curC = getColMerge(curC, curR, endR)[1];\r\n                    }\r\n\r\n                    curC += index;\r\n                }\r\n                else if(cf < endC && cf == curC){\r\n                    if(index < 0 && colHasMerge(endC, curR, endR)){\r\n                        endC = getColMerge(endC, curR, endR)[0];\r\n                    }\r\n\r\n                    endC += index;\r\n                }\r\n                else if(cf == curC && cf == endC){\r\n                    if(index > 0){\r\n                        endC += index;\r\n                    }\r\n                    else{\r\n                        curC += index;\r\n                    }\r\n                }\r\n            } \r\n\r\n            if (endC >= datacolumnlen) {\r\n                endC = datacolumnlen - 1;\r\n            }\r\n\r\n            if (endC < 0) {\r\n                endC = 0;\r\n            }\r\n\r\n            if (curC >= datacolumnlen) {\r\n                curC = datacolumnlen - 1;\r\n            }\r\n\r\n            if (curC < 0) {\r\n                curC = 0;\r\n            }\r\n        }\r\n\r\n        let rowseleted = [curR, endR];\r\n        let columnseleted = [curC, endC];\r\n\r\n        row = Store.visibledatarow[endR]; \r\n        row_pre = curR - 1 == -1 ? 0 : Store.visibledatarow[curR - 1];\r\n        col = Store.visibledatacolumn[endC]; \r\n        col_pre = curC - 1 == -1 ? 0 : Store.visibledatacolumn[curC - 1];\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, row_pre, row - row_pre - 1, col_pre, col - col_pre - 1);\r\n        if(changeparam != null){\r\n            columnseleted = changeparam[0];\r\n            rowseleted= changeparam[1];\r\n            // top = changeparam[2];\r\n            // height = changeparam[3];\r\n            // left = changeparam[4];\r\n            // width = changeparam[5];\r\n        }\r\n\r\n        last[\"row\"] = rowseleted;\r\n        last[\"column\"] = columnseleted;\r\n\r\n        selectHightlightShow();\r\n    }\r\n    else if(type == \"rangeOfFormula\"){\r\n        let last = formula.func_selectedrange;\r\n\r\n        let curR = last[\"row\"][0], endR = last[\"row\"][1];\r\n        let curC = last[\"column\"][0], endC = last[\"column\"][1];\r\n        let rf = last[\"row_focus\"], cf = last[\"column_focus\"];\r\n\r\n        let datarowlen = Store.flowdata.length, \r\n            datacolumnlen = Store.flowdata[0].length;\r\n\r\n        if(postion == \"down\"){ //选区上下变动\r\n            if(rowHasMerge(rf, curC, endC)){ //focus单元格所在行有合并单元格\r\n                let rfMerge = getRowMerge(rf, curC, endC);\r\n                let rf_str = rfMerge[0], rf_end = rfMerge[1];\r\n\r\n                if(rf_str > curR && rf_end == endR){\r\n                    if(index > 0 && rowHasMerge(curR, curC, endC)){\r\n                        curR = getRowMerge(curR, curC, endC)[1];\r\n                    }\r\n\r\n                    curR += index;\r\n                }\r\n                else if(rf_end < endR && rf_str == curR){\r\n                    if(index < 0 && rowHasMerge(endR, curC, endC)){\r\n                        endR = getRowMerge(endR, curC, endC)[0];\r\n                    }\r\n\r\n                    endR += index;\r\n                }\r\n                else{\r\n                    if(index > 0){\r\n                        endR += index;\r\n                    }\r\n                    else{\r\n                        curR += index;\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                if(rf > curR && rf == endR){\r\n                    if(index > 0 && rowHasMerge(curR, curC, endC)){\r\n                        curR = getRowMerge(curR, curC, endC)[1];\r\n                    }\r\n\r\n                    curR += index;\r\n                }\r\n                else if(rf < endR && rf == curR){\r\n                    if(index < 0 && rowHasMerge(endR, curC, endC)){\r\n                        endR = getRowMerge(endR, curC, endC)[0];\r\n                    }\r\n\r\n                    endR += index;\r\n                }\r\n                else if(rf == curR && rf == endR){\r\n                    if(index > 0){\r\n                        endR += index;\r\n                    }\r\n                    else{\r\n                        curR += index;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (endR >= datarowlen) {\r\n                endR = datarowlen - 1;\r\n            }\r\n\r\n            if (endR < 0) {\r\n                endR = 0;\r\n            }\r\n\r\n            if (curR >= datarowlen) {\r\n                curR = datarowlen - 1;\r\n            }\r\n\r\n            if (curR < 0) {\r\n                curR = 0;\r\n            }\r\n        }\r\n        else{\r\n            if(colHasMerge(cf, curR, endR)){ //focus单元格所在列有合并单元格\r\n                let cfMerge = getColMerge(cf, curR, endR);\r\n                let cf_str = cfMerge[0], cf_end = cfMerge[1];\r\n\r\n                if(cf_str > curC && cf_end == endC){\r\n                    if(index > 0 && colHasMerge(curC, curR, endR)){\r\n                        curC = getColMerge(curC, curR, endR)[1];\r\n                    }\r\n\r\n                    curC += index;\r\n                }\r\n                else if(cf_end < endC && cf_str == curC){\r\n                    if(index < 0 && colHasMerge(endC, curR, endR)){\r\n                        endC = getColMerge(endC, curR, endR)[0];\r\n                    }\r\n\r\n                    endC += index;\r\n                }\r\n                else{\r\n                    if(index > 0){\r\n                        endC += index;\r\n                    }\r\n                    else{\r\n                        curC += index;\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                if(cf > curC && cf == endC){\r\n                    if(index > 0 && colHasMerge(curC, curR, endR)){\r\n                        curC = getColMerge(curC, curR, endR)[1];\r\n                    }\r\n\r\n                    curC += index;\r\n                }\r\n                else if(cf < endC && cf == curC){\r\n                    if(index < 0 && colHasMerge(endC, curR, endR)){\r\n                        endC = getColMerge(endC, curR, endR)[0];\r\n                    }\r\n\r\n                    endC += index;\r\n                }\r\n                else if(cf == curC && cf == endC){\r\n                    if(index > 0){\r\n                        endC += index;\r\n                    }\r\n                    else{\r\n                        curC += index;\r\n                    }\r\n                }\r\n            } \r\n\r\n            if (endC >= datacolumnlen) {\r\n                endC = datacolumnlen - 1;\r\n            }\r\n\r\n            if (endC < 0) {\r\n                endC = 0;\r\n            }\r\n\r\n            if (curC >= datacolumnlen) {\r\n                curC = datacolumnlen - 1;\r\n            }\r\n\r\n            if (curC < 0) {\r\n                curC = 0;\r\n            }\r\n        }\r\n\r\n        let rowseleted = [curR, endR];\r\n        let columnseleted = [curC, endC];\r\n\r\n        row = Store.visibledatarow[endR]; \r\n        row_pre = curR - 1 == -1 ? 0 : Store.visibledatarow[curR - 1];\r\n        col = Store.visibledatacolumn[endC]; \r\n        col_pre = curC - 1 == -1 ? 0 : Store.visibledatacolumn[curC - 1];\r\n\r\n        let top = row_pre, height = row - row_pre - 1;\r\n        let left = col_pre, width = col - col_pre - 1;\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n        if(changeparam != null){\r\n            columnseleted = changeparam[0];\r\n            rowseleted= changeparam[1];\r\n            top = changeparam[2];\r\n            height = changeparam[3];\r\n            left = changeparam[4];\r\n            width = changeparam[5];\r\n        }\r\n\r\n        formula.func_selectedrange = {\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": top,\r\n            \"height\": height,\r\n            \"left_move\": left,\r\n            \"width_move\": width,\r\n            \"top_move\": top,\r\n            \"height_move\": height,\r\n            \"row\": rowseleted,\r\n            \"column\": columnseleted,\r\n            \"row_focus\": rf,\r\n            \"column_focus\": cf\r\n        };\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\").css({\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": top,\r\n            \"height\": height\r\n        }).show();\r\n\r\n        formula.rangeSetValue({\r\n            \"row\": rowseleted,\r\n            \"column\": columnseleted\r\n        });\r\n    }\r\n\r\n    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n    let winH = $(\"#luckysheet-cell-main\").height(), winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n    let sleft = 0, stop = 0;\r\n    if (col - scrollLeft - winW + 20 > 0) {\r\n        sleft = col - winW + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n    else if (col_pre - scrollLeft - 20 < 0) {\r\n        sleft = col_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n\r\n    if (row - scrollTop - winH + 20 > 0) {\r\n        stop = row - winH + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n    else if (row_pre - scrollTop - 20 < 0) {\r\n        stop = row_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n\r\n    clearTimeout(Store.countfuncTimeout);\r\n    countfunc();\r\n}\r\n\r\n//ctrl + shift + 方向键  调整选区\r\nfunction luckysheetMoveHighlightRange2(postion, type, isScroll) {\r\n    if(!isScroll){\r\n        isScroll = true;\r\n    }\r\n\r\n    let row, row_pre;\r\n    let col, col_pre;\r\n\r\n    if(type == \"rangeOfSelect\"){\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let rf = last[\"row_focus\"], cf = last[\"column_focus\"];\r\n\r\n        let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n        let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n\r\n        if(postion == \"down\"){\r\n            if(r2 == Store.flowdata.length - 1){\r\n                return;\r\n            }\r\n\r\n            if(rowHasMerge(rf, c1, c2)){ //focus所在行有合并单元格\r\n                let rfMerge = getRowMerge(rf, c1, c2);\r\n                let rf_str = rfMerge[0], rf_end = rfMerge[1];\r\n\r\n                if(rf_str > r1 && rf_end == r2){\r\n                    r1 = getNextIndex(\"down\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r2 = getNextIndex(\"down\", cf, r2, Store.flowdata.length - 1);\r\n                }\r\n            }\r\n            else{\r\n                if(rf > r1 && rf == r2){\r\n                    r1 = getNextIndex(\"down\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r2 = getNextIndex(\"down\", cf, r2, Store.flowdata.length - 1);\r\n                }\r\n            }\r\n        }\r\n        else if(postion == \"up\"){\r\n            if(r1 == 0){\r\n                return;\r\n            }\r\n\r\n            if(rowHasMerge(rf, c1, c2)){ //focus所在行有合并单元格\r\n                let rfMerge = getRowMerge(rf, c1, c2);\r\n                let rf_str = rfMerge[0], rf_end = rfMerge[1];\r\n\r\n                if(rf_end < r2 && rf_str == r1){\r\n                    r2 = getNextIndex(\"up\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r1 = getNextIndex(\"up\", cf, 0, r1);\r\n                }\r\n            }\r\n            else{\r\n                if(rf < r2 && rf == r1){\r\n                    r2 = getNextIndex(\"up\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r1 = getNextIndex(\"up\", cf, 0, r1);\r\n                }\r\n            }\r\n        }\r\n        else if(postion == \"right\"){\r\n            if(c2 == Store.flowdata[0].length - 1){\r\n                return;\r\n            }\r\n\r\n            if(colHasMerge(cf, r1, r2)){ //focus所在行有合并单元格\r\n                let cfMerge = getColMerge(cf, r1, r2);\r\n                let cf_str = cfMerge[0], cf_end = cfMerge[1];\r\n\r\n                if(cf_str > c1 && cf_end == c2){\r\n                    c1 = getNextIndex(\"right\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c2 = getNextIndex(\"right\", rf, c2, Store.flowdata[0].length - 1);\r\n                }\r\n            }\r\n            else{\r\n                if(cf > c1 && cf == c2){\r\n                    c1 = getNextIndex(\"right\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c2 = getNextIndex(\"right\", rf, c2, Store.flowdata[0].length - 1);\r\n                }\r\n            }\r\n        }\r\n        else if(postion == \"left\"){\r\n            if(c1 == 0){\r\n                return;\r\n            }\r\n\r\n            if(colHasMerge(cf, r1, r2)){ //focus所在行有合并单元格\r\n                let cfMerge = getColMerge(cf, r1, r2);\r\n                let cf_str = cfMerge[0], cf_end = cfMerge[1];\r\n\r\n                if(cf_end < c2 && cf_str == c1){\r\n                    c2 = getNextIndex(\"left\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c1 = getNextIndex(\"left\", rf, 0, c1);\r\n                }\r\n            }\r\n            else{\r\n                if(cf < c2 && cf == c1){\r\n                    c2 = getNextIndex(\"left\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c1 = getNextIndex(\"left\", rf, 0, c1);\r\n                }\r\n            }\r\n        }\r\n\r\n        let rowseleted = [r1, r2];\r\n        let columnseleted = [c1, c2];\r\n\r\n        row = Store.visibledatarow[r2]; \r\n        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n        col = Store.visibledatacolumn[c2]; \r\n        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, row_pre, row - row_pre - 1, col_pre, col - col_pre - 1);\r\n        if(changeparam != null){\r\n            columnseleted = changeparam[0];\r\n            rowseleted= changeparam[1];\r\n            // top = changeparam[2];\r\n            // height = changeparam[3];\r\n            // left = changeparam[4];\r\n            // width = changeparam[5];\r\n        }\r\n\r\n        last[\"row\"] = rowseleted;\r\n        last[\"column\"] = columnseleted;\r\n\r\n        selectHightlightShow();\r\n    }\r\n    else if(type == \"rangeOfFormula\"){\r\n        let last = formula.func_selectedrange;\r\n        let rf = last[\"row_focus\"], cf = last[\"column_focus\"];\r\n\r\n        let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n        let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n\r\n        if(postion == \"down\"){\r\n            if(r2 == Store.flowdata.length - 1){\r\n                return;\r\n            }\r\n\r\n            if(rowHasMerge(rf, c1, c2)){ //focus所在行有合并单元格\r\n                let rfMerge = getRowMerge(rf, c1, c2);\r\n                let rf_str = rfMerge[0], rf_end = rfMerge[1];\r\n\r\n                if(rf_str > r1 && rf_end == r2){\r\n                    r1 = getNextIndex(\"down\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r2 = getNextIndex(\"down\", cf, r2, Store.flowdata.length - 1);\r\n                }\r\n            }\r\n            else{\r\n                if(rf > r1 && rf == r2){\r\n                    r1 = getNextIndex(\"down\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r2 = getNextIndex(\"down\", cf, r2, Store.flowdata.length - 1);\r\n                }\r\n            }\r\n        }\r\n        else if(postion == \"up\"){\r\n            if(r1 == 0){\r\n                return;\r\n            }\r\n\r\n            if(rowHasMerge(rf, c1, c2)){ //focus所在行有合并单元格\r\n                let rfMerge = getRowMerge(rf, c1, c2);\r\n                let rf_str = rfMerge[0], rf_end = rfMerge[1];\r\n\r\n                if(rf_end < r2 && rf_str == r1){\r\n                    r2 = getNextIndex(\"up\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r1 = getNextIndex(\"up\", cf, 0, r1);\r\n                }\r\n            }\r\n            else{\r\n                if(rf < r2 && rf == r1){\r\n                    r2 = getNextIndex(\"up\", cf, r1, r2);\r\n                }\r\n                else{\r\n                    r1 = getNextIndex(\"up\", cf, 0, r1);\r\n                }\r\n            }\r\n        }\r\n        else if(postion == \"right\"){\r\n            if(c2 == Store.flowdata[0].length - 1){\r\n                return;\r\n            }\r\n\r\n            if(colHasMerge(cf, r1, r2)){ //focus所在行有合并单元格\r\n                let cfMerge = getColMerge(cf, r1, r2);\r\n                let cf_str = cfMerge[0], cf_end = cfMerge[1];\r\n\r\n                if(cf_str > c1 && cf_end == c2){\r\n                    c1 = getNextIndex(\"right\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c2 = getNextIndex(\"right\", rf, c2, Store.flowdata[0].length - 1);\r\n                }\r\n            }\r\n            else{\r\n                if(cf > c1 && cf == c2){\r\n                    c1 = getNextIndex(\"right\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c2 = getNextIndex(\"right\", rf, c2, Store.flowdata[0].length - 1);\r\n                }\r\n            }\r\n        }\r\n        else if(postion == \"left\"){\r\n            if(c1 == 0){\r\n                return;\r\n            }\r\n\r\n            if(colHasMerge(cf, r1, r2)){ //focus所在行有合并单元格\r\n                let cfMerge = getColMerge(cf, r1, r2);\r\n                let cf_str = cfMerge[0], cf_end = cfMerge[1];\r\n\r\n                if(cf_end < c2 && cf_str == c1){\r\n                    c2 = getNextIndex(\"left\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c1 = getNextIndex(\"left\", rf, 0, c1);\r\n                }\r\n            }\r\n            else{\r\n                if(cf < c2 && cf == c1){\r\n                    c2 = getNextIndex(\"left\", rf, c1, c2);\r\n                }\r\n                else{\r\n                    c1 = getNextIndex(\"left\", rf, 0, c1);\r\n                }\r\n            }\r\n        }\r\n\r\n        let rowseleted = [r1, r2];\r\n        let columnseleted = [c1, c2];\r\n\r\n        row = Store.visibledatarow[r2]; \r\n        row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n        col = Store.visibledatacolumn[c2]; \r\n        col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n        let top = row_pre, height = row - row_pre - 1;\r\n        let left = col_pre, width = col - col_pre - 1;\r\n\r\n        let changeparam = menuButton.mergeMoveMain(columnseleted, rowseleted, last, top, height, left, width);\r\n        if(changeparam != null){\r\n            columnseleted = changeparam[0];\r\n            rowseleted= changeparam[1];\r\n            top = changeparam[2];\r\n            height = changeparam[3];\r\n            left = changeparam[4];\r\n            width = changeparam[5];\r\n        }\r\n\r\n        formula.func_selectedrange = {\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": top,\r\n            \"height\": height,\r\n            \"left_move\": left,\r\n            \"width_move\": width,\r\n            \"top_move\": top,\r\n            \"height_move\": height,\r\n            \"row\": rowseleted,\r\n            \"column\": columnseleted,\r\n            \"row_focus\": rf,\r\n            \"column_focus\": cf\r\n        };\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\").css({\r\n            \"left\": left,\r\n            \"width\": width,\r\n            \"top\": top,\r\n            \"height\": height\r\n        }).show();\r\n\r\n        formula.rangeSetValue({\r\n            \"row\": rowseleted,\r\n            \"column\": columnseleted\r\n        });\r\n    }\r\n\r\n    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n    let winH = $(\"#luckysheet-cell-main\").height(), winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n    let sleft = 0, stop = 0;\r\n    if (col - scrollLeft - winW + 20 > 0) {\r\n        sleft = col - winW + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n    else if (col_pre - scrollLeft - 20 < 0) {\r\n        sleft = col_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(sleft);\r\n        }\r\n    }\r\n\r\n    if (row - scrollTop - winH + 20 > 0) {\r\n        stop = row - winH + 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n    else if (row_pre - scrollTop - 20 < 0) {\r\n        stop = row_pre - 20;\r\n        if (isScroll) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(stop);\r\n        }\r\n    }\r\n\r\n    clearTimeout(Store.countfuncTimeout);\r\n    countfunc();\r\n}\r\n\r\n//shift + 方向键 / ctrl + shift + 方向键 功能\r\nfunction rowHasMerge(r, c1, c2){\r\n    let rowHasMerge = false;\r\n\r\n    for(let c = c1; c <= c2; c++){\r\n        let cell = Store.flowdata[r][c];\r\n\r\n        if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n            rowHasMerge = true;\r\n            break;\r\n        }\r\n    }\r\n\r\n    return rowHasMerge;\r\n}\r\nfunction colHasMerge(c, r1, r2){\r\n    let colHasMerge = false;\r\n\r\n    for(let r = r1; r <= r2; r++){\r\n        let cell = Store.flowdata[r][c];\r\n\r\n        if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n            colHasMerge = true;\r\n            break;\r\n        }\r\n    }\r\n\r\n    return colHasMerge;\r\n}\r\nfunction getRowMerge(rIndex, c1, c2){\r\n    let r1 = 0, r2 = Store.flowdata.length - 1;\r\n\r\n    let str = null;\r\n    if(rIndex > r1){\r\n        for(let r = rIndex; r >= r1; r--){\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = Store.flowdata[r][c];\r\n                \r\n                if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                    let mc = Store.config[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n\r\n                    if(str == null || mc.r < str){\r\n                        str = mc.r;\r\n                    }\r\n                }    \r\n            }\r\n\r\n            if(rowHasMerge(str - 1, c1, c2) && str > r1){\r\n                r = str;\r\n            }\r\n            else{\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    else{\r\n        str = r1;\r\n    }\r\n\r\n    let end = null;\r\n    if(rIndex < r2){\r\n        for(let r = rIndex; r <= r2; r++){\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = Store.flowdata[r][c];\r\n                \r\n                if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                    let mc = Store.config[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n\r\n                    if(end == null || (mc.r + mc.rs - 1) > end){\r\n                        end = mc.r + mc.rs - 1;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(rowHasMerge(end + 1, c1, c2) && end < r2){\r\n                r = end;\r\n            }\r\n            else{\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    else{\r\n        end = r2;\r\n    }\r\n\r\n    return [str, end];\r\n}\r\nfunction getColMerge(cIndex, r1, r2){\r\n    let c1 = 0, c2 = Store.flowdata[0].length - 1;\r\n\r\n    let str = null;\r\n    if(cIndex > c1){\r\n        for(let c = cIndex; c >= c1; c--){\r\n            for(let r = r1; r <= r2; r++){\r\n                let cell = Store.flowdata[r][c];\r\n                \r\n                if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                    let mc = Store.config[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n\r\n                    if(str == null || mc.c < str){\r\n                        str = mc.c;\r\n                    }\r\n                }    \r\n            }\r\n\r\n            if(colHasMerge(str - 1, r1, r2) && str > c1){\r\n                c = str;\r\n            }\r\n            else{\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    else{\r\n        str = c1;\r\n    }\r\n\r\n    let end = null;\r\n    if(cIndex < c2){\r\n        for(let c = cIndex; c <= c2; c++){\r\n            for(let r = r1; r <= r2; r++){\r\n                let cell = Store.flowdata[r][c];\r\n                \r\n                if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                    let mc = Store.config[\"merge\"][cell[\"mc\"].r + \"_\" + cell[\"mc\"].c];\r\n\r\n                    if(end == null || (mc.c + mc.cs - 1) > end){\r\n                        end = mc.c + mc.cs - 1;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(colHasMerge(end + 1, r1, r2) && end < c2){\r\n                c = end;\r\n            }\r\n            else{\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    else{\r\n        end = c2;\r\n    }\r\n\r\n    return [str, end];\r\n}\r\nfunction getNextIndex(direction, focusIndex, strIndex, endIndex) {\r\n    let index = null;\r\n\r\n    let stNull;\r\n    if(direction == \"down\"){\r\n        let stValue = Store.flowdata[strIndex][focusIndex];\r\n\r\n        if(getObjType(stValue) == \"object\" && isRealNull(stValue.v)){\r\n            stNull = true;\r\n        }\r\n        else if(isRealNull(stValue)){\r\n            stNull = true;\r\n        }\r\n        else{\r\n            stNull = false;\r\n        }\r\n\r\n        console.log(stNull, \"stNull\");\r\n\r\n        let cellNull = [], i = 0;\r\n        for(let r = strIndex + 1; r <= endIndex; r++){\r\n            let cell = Store.flowdata[r][focusIndex];\r\n\r\n            if(getObjType(cell) == \"object\" && isRealNull(cell.v)){\r\n                cellNull.push(true);\r\n            }\r\n            else if(isRealNull(cell)){\r\n                cellNull.push(true);\r\n            }\r\n            else{\r\n                cellNull.push(false);\r\n            }\r\n\r\n            if(cellNull.length == 1 && stNull==true && cellNull[i] == false){\r\n                index = strIndex + i + 1;\r\n                break;\r\n            }\r\n            else if(cellNull.length > 1){\r\n                if(stNull && cellNull[i] == false){ //起始是空，找第一个有值的位置\r\n                    index = strIndex + i + 1;\r\n                    break;\r\n                }\r\n                else if(!stNull){ //起始有值，找一个有值的位置\r\n                    if(cellNull[i] == false && cellNull[i - 1] == true){ //前面为空\r\n                        index = strIndex + i + 1;\r\n                        break;\r\n                    }\r\n                    else if(cellNull[i] == true && cellNull[i - 1] == false){ //后面为空\r\n                        index = strIndex + i;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(r == endIndex){\r\n                index = endIndex;\r\n            }\r\n\r\n            i++;\r\n        }\r\n    }\r\n    else if(direction == \"up\"){\r\n        let stValue = Store.flowdata[endIndex][focusIndex];\r\n\r\n        if(getObjType(stValue) == \"object\" && isRealNull(stValue.v)){\r\n            stNull = true;\r\n        }\r\n        else if(isRealNull(stValue)){\r\n            stNull = true;\r\n        }\r\n        else{\r\n            stNull = false;\r\n        }\r\n\r\n        let cellNull = [], i = 0;\r\n        for(let r = endIndex - 1; r >= strIndex; r--){\r\n            let cell = Store.flowdata[r][focusIndex];\r\n\r\n            if(getObjType(cell) == \"object\" && isRealNull(cell.v)){\r\n                cellNull.push(true);\r\n            }\r\n            else if(isRealNull(cell)){\r\n                cellNull.push(true);\r\n            }\r\n            else{\r\n                cellNull.push(false);\r\n            }\r\n\r\n            if(cellNull.length == 1 && stNull && cellNull[i] == false){\r\n                index = endIndex - (i + 1);\r\n                break;\r\n            }\r\n            else if(cellNull.length > 1){\r\n                if(stNull && cellNull[i] == false){ //起始是空，找第一个有值的位置\r\n                    index = endIndex - (i + 1);\r\n                    break;\r\n                }\r\n                else if(!stNull){ //起始有值，找一个有值的位置\r\n                    if(cellNull[i] == false && cellNull[i - 1] == true){ //前面为空\r\n                        index = endIndex - (i + 1);\r\n                        break;\r\n                    }\r\n                    else if(cellNull[i] == true && cellNull[i - 1] == false){ //后面为空\r\n                        index = endIndex - i;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(r == strIndex){\r\n                index = strIndex;\r\n            }\r\n\r\n            i++;\r\n        }\r\n    }\r\n    else if(direction == \"right\"){\r\n        let stValue = Store.flowdata[focusIndex][strIndex];\r\n\r\n        if(getObjType(stValue) == \"object\" && isRealNull(stValue.v)){\r\n            stNull = true;\r\n        }\r\n        else if(isRealNull(stValue)){\r\n            stNull = true;\r\n        }\r\n        else{\r\n            stNull = false;\r\n        }\r\n\r\n        let cellNull = [], i = 0;\r\n        for(let c = strIndex + 1; c <= endIndex; c++){\r\n            let cell = Store.flowdata[focusIndex][c];\r\n\r\n            if(getObjType(cell) == \"object\" && isRealNull(cell.v)){\r\n                cellNull.push(true);\r\n            }\r\n            else if(isRealNull(cell)){\r\n                cellNull.push(true);\r\n            }\r\n            else{\r\n                cellNull.push(false);\r\n            }\r\n\r\n            if(cellNull.length == 1 && stNull && cellNull[i] == false){\r\n                index = strIndex + i + 1;\r\n                break;\r\n            }\r\n            else if(cellNull.length > 1){\r\n                if(stNull && cellNull[i] == false){ //起始是空，找第一个有值的位置\r\n                    index = strIndex + i + 1;\r\n                    break;\r\n                }\r\n                else if(!stNull){ //起始有值，找一个有值的位置\r\n                    if(cellNull[i] == false && cellNull[i - 1] == true){ //前面为空\r\n                        index = strIndex + i + 1;\r\n                        break;\r\n                    }\r\n                    else if(cellNull[i] == true && cellNull[i - 1] == false){ //后面为空\r\n                        index = strIndex + i;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(c == endIndex){\r\n                index = endIndex;\r\n            }\r\n\r\n            i++;\r\n        }\r\n    }\r\n    else if(direction == \"left\"){\r\n        let stValue = Store.flowdata[focusIndex][endIndex];\r\n\r\n        if(getObjType(stValue) == \"object\" && isRealNull(stValue.v)){\r\n            stNull = true;\r\n        }\r\n        else if(isRealNull(stValue)){\r\n            stNull = true;\r\n        }\r\n        else{\r\n            stNull = false;\r\n        }\r\n\r\n        let cellNull = [], i = 0;\r\n        for(let c = endIndex - 1; c >= strIndex; c--){\r\n            let cell = Store.flowdata[focusIndex][c];\r\n\r\n            if(getObjType(cell) == \"object\" && isRealNull(cell.v)){\r\n                cellNull.push(true);\r\n            }\r\n            else if(isRealNull(cell)){\r\n                cellNull.push(true);\r\n            }\r\n            else{\r\n                cellNull.push(false);\r\n            }\r\n\r\n            if(cellNull.length == 1 && stNull && cellNull[i] == false){\r\n                index = endIndex - (i + 1);\r\n                break;\r\n            }\r\n            else if(cellNull.length > 1){\r\n                if(stNull && cellNull[i] == false){ //起始是空，找第一个有值的位置\r\n                    index = endIndex - (i + 1);\r\n                    break;\r\n                }\r\n                else if(!stNull){ //起始有值，找一个有值的位置\r\n                    if(cellNull[i] == false && cellNull[i - 1] == true){ //前面为空\r\n                        index = endIndex - (i + 1);\r\n                        break;\r\n                    }\r\n                    else if(cellNull[i] == true && cellNull[i - 1] == false){ //后面为空\r\n                        index = endIndex - i;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(c == strIndex){\r\n                index = strIndex;\r\n            }\r\n\r\n            i++;\r\n        }\r\n    }\r\n\r\n    return index;\r\n}\r\n\r\nexport {\r\n    luckysheetMoveEndCell,\r\n    luckysheetMoveHighlightCell,\r\n    luckysheetMoveHighlightCell2,\r\n    luckysheetMoveHighlightRange,\r\n    luckysheetMoveHighlightRange2,\r\n}"
  },
  {
    "path": "src/controllers/sheetSearch.js",
    "content": "function luckysheetbinary_search(arr, key) {\r\n    let low = 0, high = arr.length - 1;\r\n    \r\n    while (low <= high) {\r\n        let mid = parseInt((high + low) / 2);\r\n        \r\n        if (key < arr[mid] && (mid == 0 || key >= arr[mid - 1])) {\r\n            return mid;\r\n        } \r\n        else if (key >= arr[mid]) {\r\n            low = mid + 1;\r\n        } \r\n        else if (key < arr[mid]) {\r\n            high = mid - 1;\r\n        }\r\n        else {\r\n            return -1;\r\n        }\r\n    }\r\n}\r\n\r\nfunction luckysheetorder_search(arr, y) {\r\n    let i = 0, \r\n        row = 0, \r\n        row_pre = 0, \r\n        row_index = -1, \r\n        i_ed = arr.length - 1;\r\n\r\n    while (i < arr.length && i_ed >= 0 && i_ed >= i) {\r\n        row = arr[i_ed];\r\n\r\n        if (i_ed == 0) {\r\n            row_pre = 0;\r\n        }\r\n        else {\r\n            row_pre = arr[i_ed - 1];\r\n        }\r\n\r\n        if (y >= row_pre && y < row) {\r\n            row_index = i_ed;\r\n            break;\r\n        }\r\n\r\n        row = arr[i];\r\n\r\n        if (i == 0) {\r\n            row_pre = 0;\r\n        }\r\n        else {\r\n            row_pre = arr[i - 1];\r\n        }\r\n\r\n        if (y >= row_pre && y < row) {\r\n            row_index = i;\r\n            break;\r\n        }\r\n\r\n        i++;\r\n        i_ed--;\r\n    }\r\n\r\n    return row_index;\r\n}\r\n\r\nfunction luckysheet_searcharray(arr, y) {\r\n    let index = arr.length - 1;\r\n\r\n    if (arr.length < 40 || y <= arr[20] || y >= arr[index - 20]) {\r\n        index = luckysheetorder_search(arr, y);\r\n    }\r\n    else {\r\n        index = luckysheetbinary_search(arr, y);\r\n    }\r\n\r\n    return index;\r\n}\r\n\r\nexport {\r\n    luckysheet_searcharray,\r\n}"
  },
  {
    "path": "src/controllers/sheetmanage.js",
    "content": "import { isEditMode } from \"../global/validate\";\r\nimport cleargridelement from \"../global/cleargridelement\";\r\nimport { getdatabyselectionD, getcellvalue, datagridgrowth, getcellFormula } from \"../global/getdata\";\r\nimport { setcellvalue } from \"../global/setdata\";\r\nimport luckysheetcreatedom from \"../global/createdom\";\r\nimport tooltip from \"../global/tooltip\";\r\nimport formula from \"../global/formula\";\r\nimport { luckysheetrefreshgrid, jfrefreshgrid_rhcw,jfrefreshgrid } from \"../global/refresh\";\r\nimport rhchInit from \"../global/rhchInit\";\r\nimport editor from \"../global/editor\";\r\nimport { luckysheetextendtable, luckysheetdeletetable } from \"../global/extend\";\r\nimport { isRealNum } from \"../global/validate\";\r\nimport { replaceHtml, getObjType, chatatABC, arrayRemoveItem } from \"../utils/util\";\r\nimport { sheetHTML, luckysheetlodingHTML } from \"./constant\";\r\nimport server from \"./server\";\r\nimport luckysheetConfigsetting from \"./luckysheetConfigsetting\";\r\nimport pivotTable from \"./pivotTable\";\r\nimport luckysheetsizeauto from \"./resize\";\r\nimport luckysheetPostil from \"./postil\";\r\nimport imageCtrl from \"./imageCtrl\";\r\nimport dataVerificationCtrl from \"./dataVerificationCtrl\";\r\nimport hyperlinkCtrl from \"./hyperlinkCtrl\";\r\nimport luckysheetFreezen from \"./freezen\";\r\nimport { createFilterOptions, labelFilterOptionState } from \"./filter\";\r\nimport { selectHightlightShow, selectionCopyShow } from \"./select\";\r\nimport Store from \"../store\";\r\nimport locale from \"../locale/locale\";\r\nimport { renderChartShow } from \"../expendPlugins/chart/plugin\";\r\nimport { changeSheetContainerSize, menuToolBarWidth } from \"./resize\";\r\nimport { zoomNumberDomBind } from \"./zoom\";\r\nimport menuButton from \"./menuButton\";\r\nimport method from \"../global/method\";\r\nimport { initialEvent } from \"./protection\";\r\nimport luckysheetformula from \"../global/formula\";\r\n\r\nconst sheetmanage = {\r\n    generateRandomSheetIndex: function(prefix) {\r\n        if (prefix == null) {\r\n            prefix = \"Sheet\";\r\n        }\r\n\r\n        let userAgent = window.navigator.userAgent.replace(/[^a-zA-Z0-9]/g, \"\").split(\"\");\r\n\r\n        let mid = \"\";\r\n\r\n        for (let i = 0; i < 12; i++) {\r\n            mid += userAgent[Math.round(Math.random() * (userAgent.length - 1))];\r\n        }\r\n\r\n        let time = new Date().getTime();\r\n\r\n        return prefix + \"_\" + mid + \"_\" + time;\r\n    },\r\n    generateRandomSheetName: function(file, isPivotTable) {\r\n        let index = file.length;\r\n\r\n        const locale_pivotTable = locale().pivotTable;\r\n        const title = locale_pivotTable.title;\r\n\r\n        for (let i = 0; i < file.length; i++) {\r\n            if (file[i].name.indexOf(\"Sheet\") > -1 || file[i].name.indexOf(title) > -1) {\r\n                let suffix = parseFloat(file[i].name.replace(\"Sheet\", \"\").replace(title, \"\"));\r\n\r\n                if (suffix != \"NaN\" && Math.ceil(suffix) > index) {\r\n                    index = Math.ceil(suffix);\r\n                }\r\n            }\r\n        }\r\n\r\n        if (isPivotTable) {\r\n            return title + (index + 1);\r\n        } else {\r\n            return \"Sheet\" + (index + 1);\r\n        }\r\n    },\r\n    generateCopySheetName: function(file, name) {\r\n        let _locale = locale();\r\n        let locale_info = _locale.info;\r\n        let copyWord = \"(\" + locale_info.copy;\r\n        const copy_i = name.toString().indexOf(copyWord);\r\n\r\n        if (~copy_i) {\r\n            name = name.toString().substring(0, copy_i);\r\n        }\r\n\r\n        let index = \"\";\r\n        let nameCopy = name + copyWord;\r\n        const sheetNames = [];\r\n\r\n        for (let i = 0; i < file.length; i++) {\r\n            let fileName = file[i].name.toString();\r\n            sheetNames.push(fileName);\r\n            let st_i = fileName.indexOf(nameCopy);\r\n\r\n            if (st_i === 0) {\r\n                index = index || 2;\r\n                let ed_i = fileName.indexOf(\")\", st_i + nameCopy.length);\r\n                let num = fileName.substring(st_i + nameCopy.length, ed_i);\r\n\r\n                if (isRealNum(num)) {\r\n                    if (parseInt(num) >= index) {\r\n                        index = parseInt(num) + 1;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        let sheetCopyName;\r\n\r\n        do {\r\n            let postfix = copyWord + index + \")\";\r\n\r\n            const lengthLimit = 31 - postfix.length;\r\n            sheetCopyName = name;\r\n            if (sheetCopyName.length > lengthLimit) {\r\n                sheetCopyName = sheetCopyName.slice(0, lengthLimit - 1) + \"…\";\r\n            }\r\n\r\n            sheetCopyName = sheetCopyName + postfix;\r\n        } while (~sheetNames.indexOf(sheetCopyName) && (index = (index || 1) + 1));\r\n\r\n        return sheetCopyName;\r\n    },\r\n    getSheetByIndex: function(index) {\r\n        let _this = this;\r\n\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        let i = _this.getSheetIndex(index);\r\n\r\n        return Store.luckysheetfile[i];\r\n    },\r\n    getSheetByName: function(name) {\r\n        let _this = this;\r\n\r\n        if (name == null) {\r\n            return null;\r\n        }\r\n\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            let file = Store.luckysheetfile[i];\r\n            if (file.name == name) {\r\n                return file;\r\n            }\r\n        }\r\n\r\n        return null;\r\n    },\r\n    getCurSheetnoset: function() {\r\n        let curindex = 0;\r\n\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            if (Store.luckysheetfile[i].status == 1) {\r\n                curindex = Store.luckysheetfile[i].index;\r\n                break;\r\n            }\r\n        }\r\n\r\n        return curindex;\r\n    },\r\n    getCurSheet: function() {\r\n        if (Store.luckysheetfile.length) {\r\n            let hasActive = false,\r\n                indexs = [];\r\n            Store.luckysheetfile.forEach((item) => {\r\n                if (\"undefined\" === typeof item.index) {\r\n                    item.index = this.generateRandomSheetIndex();\r\n                }\r\n                if (indexs.includes(item.index)) {\r\n                    item.index = this.generateRandomSheetIndex();\r\n                } else {\r\n                    indexs.push(item.index);\r\n                }\r\n\r\n                if (\"undefined\" === typeof item.status) {\r\n                    item.status = 0;\r\n                }\r\n                if (item.status == 1) {\r\n                    if (hasActive) {\r\n                        item.status = 0;\r\n                    } else {\r\n                        hasActive = true;\r\n                    }\r\n                }\r\n            });\r\n            if (!hasActive) {\r\n                Store.luckysheetfile[0].status = 1;\r\n            }\r\n        }\r\n        Store.currentSheetIndex = Store.luckysheetfile[0].index;\r\n\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            if (Store.luckysheetfile[i].status == 1) {\r\n                Store.currentSheetIndex = Store.luckysheetfile[i].index;\r\n                break;\r\n            }\r\n        }\r\n\r\n        return Store.currentSheetIndex;\r\n    },\r\n    getCustomSheet() {\r\n        //设置自定义luckysheet 配置项。\r\n        if (!this.Luckysheet_custom_sheet) return {};\r\n        return JSON.parse(JSON.stringify(this.Luckysheet_custom_sheet)); //每次都返回一个自定义sheet新对象\r\n    },\r\n    setCustomSheet(luckysheet_custom_sheet) {\r\n        this.Luckysheet_custom_sheet = luckysheet_custom_sheet;\r\n    },\r\n    addNewSheet: function(e, isPivotTable) {\r\n        if (isEditMode() || Store.allowEdit === false) {\r\n            // alert(\"非编辑模式下不允许该操作！\");\r\n            return;\r\n        }\r\n        // 钩子 sheetCreateBefore\r\n        if (!method.createHookFunction(\"sheetCreateBefore\")) {\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        let order = Store.luckysheetfile.length;\r\n        let index = _this.generateRandomSheetIndex();\r\n\r\n        let sheetname = _this.generateRandomSheetName(Store.luckysheetfile, isPivotTable);\r\n\r\n        $(\"#luckysheet-sheet-container-c\").append(\r\n            replaceHtml(sheetHTML, { index: index, active: \"\", name: sheetname, style: \"\", colorset: \"\" }),\r\n        );\r\n\r\n        let sheetconfig = {};\r\n        let sheet_defaullt_config = this.getCustomSheet();\r\n        if (\r\n            JSON.stringify(sheet_defaullt_config) != \"{}\" &&\r\n            sheet_defaullt_config != null &&\r\n            sheetconfig != undefined\r\n        ) {\r\n            //判断设置的自定义sheet\r\n            sheetconfig = sheet_defaullt_config;\r\n            // sheet_defaullt_config.isPivotTable=false;\r\n            sheetconfig.index = index;\r\n            sheetconfig.order = order;\r\n            sheetconfig.name = sheetname;\r\n            // sheet_defaullt_config.config={};\r\n        } else {\r\n            //自定义sheet为空的话\r\n            sheetconfig = {\r\n                name: sheetname,\r\n                color: \"\",\r\n                status: \"0\",\r\n                order: order,\r\n                index: index,\r\n                celldata: [],\r\n                row: Store.defaultrowNum,\r\n                column: Store.defaultcolumnNum,\r\n                config: {},\r\n                pivotTable: null,\r\n                isPivotTable: !!isPivotTable,\r\n            };\r\n        }\r\n        Store.luckysheetfile.push(sheetconfig);\r\n\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n        $(\"#luckysheet-sheets-item\" + index).addClass(\"luckysheet-sheets-item-active\");\r\n        $(\"#luckysheet-cell-main\").append(\r\n            '<div id=\"luckysheet-datavisual-selection-set-' +\r\n                index +\r\n                '\" class=\"luckysheet-datavisual-selection-set\"></div>',\r\n        );\r\n        cleargridelement(e);\r\n\r\n        server.saveParam(\"sha\", null, $.extend(true, {}, sheetconfig));\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length = 0;\r\n            let redo = {};\r\n            redo[\"type\"] = \"addSheet\";\r\n            redo[\"sheetconfig\"] = $.extend(true, {}, sheetconfig);\r\n            redo[\"index\"] = index;\r\n            redo[\"currentSheetIndex\"] = Store.currentSheetIndex;\r\n            Store.jfredo.push(redo);\r\n        }\r\n\r\n        _this.changeSheetExec(index, isPivotTable, true);\r\n\r\n        // 钩子 sheetCreateAfter 不应该在这里 应在绘制完成后 因此在 changeSheet 实现\r\n    },\r\n    setSheetHide: function(index, isDelete) {\r\n        let _this = this;\r\n        let currentIdx = _this.getSheetIndex(index);\r\n        // 钩子 sheetHideBefore\r\n        if (!isDelete && !method.createHookFunction(\"sheetHideBefore\", { sheet: Store.luckysheetfile[currentIdx] })) {\r\n            return;\r\n        }\r\n        Store.luckysheetfile[currentIdx].hide = 1;\r\n\r\n        let luckysheetcurrentSheetitem = $(\"#luckysheet-sheets-item\" + index);\r\n        luckysheetcurrentSheetitem.hide();\r\n\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n\r\n        let indicator;\r\n        if (luckysheetConfigsetting.showsheetbarConfig.sheet) {\r\n            indicator = luckysheetcurrentSheetitem.nextAll(\":visible\");\r\n            if (luckysheetcurrentSheetitem.nextAll(\":visible\").length > 0) {\r\n                indicator = indicator.eq(0).data(\"index\");\r\n            } else {\r\n                indicator = luckysheetcurrentSheetitem\r\n                    .prevAll(\":visible\")\r\n                    .eq(0)\r\n                    .data(\"index\");\r\n            }\r\n        } else {\r\n            let nextActiveIdx,\r\n                showSheetIdxs = [];\r\n            Store.luckysheetfile.forEach((ele, index) => {\r\n                if (1 !== ele.hide) showSheetIdxs.push(index);\r\n            });\r\n            let len = showSheetIdxs.length;\r\n            if (1 === len) {\r\n                nextActiveIdx = showSheetIdxs[0];\r\n            } else {\r\n                nextActiveIdx =\r\n                    showSheetIdxs[len - 1] > currentIdx\r\n                        ? showSheetIdxs.find((e) => e > currentIdx)\r\n                        : showSheetIdxs[len - 1];\r\n            }\r\n\r\n            indicator = Store.luckysheetfile[nextActiveIdx].index;\r\n        }\r\n\r\n        $(\"#luckysheet-sheets-item\" + indicator).addClass(\"luckysheet-sheets-item-active\");\r\n\r\n        _this.changeSheetExec(indicator);\r\n        _this.locationSheet();\r\n\r\n        server.saveParam(\"sh\", luckysheetcurrentSheetitem.data(\"index\"), 1, { op: \"hide\", cur: indicator });\r\n        // 钩子 sheetHideAfter\r\n        if (!isDelete) {\r\n            method.createHookFunction(\"sheetHideAfter\", { sheet: Store.luckysheetfile[currentIdx] });\r\n        }\r\n    },\r\n    setSheetShow: function(index) {\r\n        let _this = this;\r\n        const file = Store.luckysheetfile[_this.getSheetIndex(index)];\r\n        // 钩子 sheetShowBefore\r\n        if (!method.createHookFunction(\"sheetShowBefore\", { sheet: file })) {\r\n            return;\r\n        }\r\n        file.hide = 0;\r\n        _this.changeSheetExec(index);\r\n\r\n        server.saveParam(\"sh\", index, 0, { op: \"show\", cur: null });\r\n        // 钩子 sheetShowAfter\r\n        method.createHookFunction(\"sheetShowAfter\", { sheet: file });\r\n    },\r\n    sheetMaxIndex: 0,\r\n    ordersheet: function(property) {\r\n        return function(a, b) {\r\n            let value1 = a[property];\r\n            let value2 = b[property];\r\n            return value1 - value2;\r\n        };\r\n    },\r\n    getCurrentOrder: function() {\r\n        let orders = {};\r\n\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").each(function(a) {\r\n            let index = $(this).data(\"index\");\r\n\r\n            for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n                if (Store.luckysheetfile[i].index == index) {\r\n                    orders[index.toString()] = a;\r\n                    break;\r\n                }\r\n            }\r\n        });\r\n\r\n        return orders;\r\n    },\r\n    reOrderAllSheet: function() {\r\n        let orders = {};\r\n\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").each(function(a) {\r\n            let index = $(this).data(\"index\");\r\n\r\n            for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n                if (Store.luckysheetfile[i].index == index) {\r\n                    Store.luckysheetfile[i].order = a;\r\n                    orders[index.toString()] = a;\r\n                    break;\r\n                }\r\n            }\r\n        });\r\n\r\n        server.saveParam(\"shr\", null, orders);\r\n\r\n        Store.luckysheetfile.sort((x, y) => {\r\n            let order_x = x.order;\r\n            let order_y = y.order;\r\n\r\n            if (order_x != null && order_y != null) {\r\n                return order_x - order_y;\r\n            } else if (order_x != null) {\r\n                return -1;\r\n            } else if (order_y != null) {\r\n                return 1;\r\n            } else {\r\n                return 1;\r\n            }\r\n        });\r\n    },\r\n    createSheet: function() {\r\n        //修复拖动sheet更新后台后，重新打开显示错误\r\n        let _this = this;\r\n\r\n        let btn = [];\r\n        Store.luckysheetfile.sort(_this.ordersheet(\"order\"));\r\n\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            let display = \"\";\r\n            let sheetIndex = Store.luckysheetfile[i].index;\r\n\r\n            let colorset = \"\";\r\n            if (Store.luckysheetfile[i].color != null) {\r\n                colorset =\r\n                    '<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' +\r\n                    Store.luckysheetfile[i].color +\r\n                    ';\"></div>';\r\n            }\r\n\r\n            if (Store.currentSheetIndex == sheetIndex) {\r\n                //使用Store.luckysheetfile中的index比较，而不是order\r\n                btn.push(\r\n                    replaceHtml(sheetHTML, {\r\n                        index: sheetIndex,\r\n                        active: \"luckysheet-sheets-item-active\",\r\n                        name: Store.luckysheetfile[i].name,\r\n                        style: \"\",\r\n                        colorset: colorset,\r\n                    }),\r\n                );\r\n            } else {\r\n                if (Store.luckysheetfile[i].hide == 1) {\r\n                    btn.push(\r\n                        replaceHtml(sheetHTML, {\r\n                            index: sheetIndex,\r\n                            active: \"\",\r\n                            name: Store.luckysheetfile[i].name,\r\n                            style: \"display:none;\",\r\n                            colorset: colorset,\r\n                        }),\r\n                    );\r\n                } else {\r\n                    btn.push(\r\n                        replaceHtml(sheetHTML, {\r\n                            index: sheetIndex,\r\n                            active: \"\",\r\n                            name: Store.luckysheetfile[i].name,\r\n                            style: \"\",\r\n                            colorset: colorset,\r\n                        }),\r\n                    );\r\n                }\r\n                display = \"style='display:none;'\";\r\n            }\r\n            //Store.luckysheetfile[i].index = i; //index即为默认\r\n            // if(sheetIndex > this.sheetMaxIndex){\r\n            //     this.sheetMaxIndex = sheetIndex;\r\n            // }\r\n\r\n            $(\"#luckysheet-cell-main\").append(\r\n                \"<div \" +\r\n                    display +\r\n                    ' id=\"luckysheet-datavisual-selection-set-' +\r\n                    sheetIndex +\r\n                    '\" class=\"luckysheet-datavisual-selection-set\"></div>',\r\n            );\r\n        }\r\n\r\n        $(\"#luckysheet-sheet-container-c\").append(btn.join(\"\"));\r\n\r\n        _this.locationSheet();\r\n    },\r\n    // *控制sheet栏的左右滚动按钮是否显示\r\n    locationSheet: function() {\r\n        let $c = $(\"#luckysheet-sheet-container-c\"),\r\n            winW = $(\"#\" + Store.container).width();\r\n        let $cursheet = $(\"#luckysheet-sheet-container-c > div.luckysheet-sheets-item-active\").eq(0);\r\n\r\n        let scrollLeftpx = 0;\r\n        let c_width = 0;\r\n\r\n        $(\"#luckysheet-sheet-container-c > div.luckysheet-sheets-item:visible\").each(function() {\r\n            if ($(this).hasClass(\"luckysheet-sheets-item-active\")) {\r\n                scrollLeftpx = c_width;\r\n            }\r\n            c_width += $(this).outerWidth();\r\n        });\r\n\r\n        setTimeout(function() {\r\n            $c.scrollLeft(scrollLeftpx - 10);\r\n\r\n            if (luckysheetConfigsetting.showsheetbarConfig.sheet) {\r\n                if (c_width >= winW * 0.7) {\r\n                    $(\"#luckysheet-sheet-area .luckysheet-sheets-scroll\").css(\"display\", \"inline-block\");\r\n                    $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").show();\r\n                } else {\r\n                    $(\"#luckysheet-sheet-area .luckysheet-sheets-scroll\").css(\"display\", \"none\");\r\n                    $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").hide();\r\n                }\r\n            }\r\n        }, 1);\r\n    },\r\n    copySheet: function(copyindex, e) {\r\n        if (isEditMode() || Store.allowEdit === false) {\r\n            // alert(\"非编辑模式下不允许该操作！\");\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        let order = Store.luckysheetfile.length;\r\n        let index = _this.generateRandomSheetIndex();\r\n\r\n        let copyarrindex = _this.getSheetIndex(copyindex);\r\n        let copyjson = $.extend(true, {}, Store.luckysheetfile[copyarrindex]);\r\n        copyjson.order = order;\r\n        copyjson.index = index;\r\n        copyjson.name = _this.generateCopySheetName(Store.luckysheetfile, copyjson.name);\r\n\r\n        // 钩子 sheetCreateBefore\r\n        if (\r\n            !method.createHookFunction(\"sheetCopyBefore\", {\r\n                targetSheet: Store.luckysheetfile[copyarrindex],\r\n                copySheet: copyjson,\r\n            })\r\n        ) {\r\n            return;\r\n        }\r\n\r\n        let colorset = \"\";\r\n        if (copyjson.color != null) {\r\n            colorset =\r\n                '<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' +\r\n                copyjson.color +\r\n                ';\"></div>';\r\n        }\r\n\r\n        let copyobject = $(\"#luckysheet-sheets-item\" + copyindex);\r\n        $(\"#luckysheet-sheet-container-c\").append(\r\n            replaceHtml(sheetHTML, {\r\n                index: copyjson.index,\r\n                active: \"\",\r\n                name: copyjson.name,\r\n                order: copyjson.order,\r\n                style: \"\",\r\n                colorset: colorset,\r\n            }),\r\n        );\r\n        $(\"#luckysheet-sheets-item\" + copyjson.index).insertAfter(copyobject);\r\n        Store.luckysheetfile.splice(copyarrindex + 1, 0, copyjson);\r\n\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n        $(\"#luckysheet-sheets-item\" + index).addClass(\"luckysheet-sheets-item-active\");\r\n        $(\"#luckysheet-cell-main\").append(\r\n            '<div id=\"luckysheet-datavisual-selection-set-' +\r\n                index +\r\n                '\" class=\"luckysheet-datavisual-selection-set\"></div>',\r\n        );\r\n        cleargridelement(e);\r\n\r\n        server.saveParam(\"shc\", index, { copyindex: copyindex, name: copyjson.name });\r\n\r\n        _this.changeSheetExec(index, undefined, undefined, true);\r\n        _this.reOrderAllSheet();\r\n\r\n        if (Store.clearjfundo) {\r\n            Store.jfredo.push({\r\n                type: \"copySheet\",\r\n                copyindex: copyindex,\r\n                index: copyjson.index,\r\n                sheetIndex: copyjson.index,\r\n            });\r\n        } else if (Store.jfredo.length > 0) {\r\n            let jfredostr = Store.jfredo[Store.jfredo.length - 1];\r\n\r\n            if (jfredostr.type == \"copySheet\") {\r\n                jfredostr.index = copyjson.index;\r\n                jfredostr.sheetIndex = copyjson.index;\r\n            }\r\n        }\r\n    },\r\n    hasSheet: function(index) {\r\n        if (index == null) {\r\n            return false;\r\n        }\r\n\r\n        index = this.getSheetIndex(index);\r\n\r\n        if (index == null) {\r\n            return false;\r\n        } else {\r\n            return true;\r\n        }\r\n    },\r\n    createSheetbydata: function(data, isrenew, isBefore = true) {\r\n        let _this = this;\r\n\r\n        let colorset = \"\";\r\n        if (data.color != null) {\r\n            colorset =\r\n                '<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' +\r\n                data.color +\r\n                ';\"></div>';\r\n        }\r\n\r\n        $(\"#luckysheet-sheet-container-c\").append(\r\n            replaceHtml(sheetHTML, {\r\n                index: data.index,\r\n                active: \"\",\r\n                name: data.name,\r\n                order: data.order,\r\n                style: \"\",\r\n                colorset: colorset,\r\n            }),\r\n        );\r\n\r\n        if (isBefore) {\r\n            let previndex = data.order;\r\n            if (previndex >= Store.luckysheetfile.length) {\r\n                previndex = Store.luckysheetfile.length - 1;\r\n                $(\"#luckysheet-sheets-item\" + data.index).insertAfter(\r\n                    $(\"#luckysheet-sheets-item\" + Store.luckysheetfile[previndex].index),\r\n                );\r\n            } else {\r\n                $(\"#luckysheet-sheets-item\" + data.index).insertBefore(\r\n                    $(\"#luckysheet-sheets-item\" + Store.luckysheetfile[previndex].index),\r\n                );\r\n            }\r\n        }\r\n\r\n        Store.luckysheetfile.push(data);\r\n\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n        $(\"#luckysheet-sheets-item\" + data.index).addClass(\"luckysheet-sheets-item-active\");\r\n        $(\"#luckysheet-cell-main\").append(\r\n            '<div id=\"luckysheet-datavisual-selection-set-' +\r\n                data.index +\r\n                '\" class=\"luckysheet-datavisual-selection-set\"></div>',\r\n        );\r\n        cleargridelement();\r\n\r\n        if (isrenew != null) {\r\n            server.saveParam(\"shre\", null, { reIndex: data.index });\r\n            data.hide = 0;\r\n            server.saveParam(\"sh\", data.index, 0, { op: \"show\", cur: null });\r\n        } else {\r\n            server.saveParam(\"sha\", null, data);\r\n        }\r\n\r\n        _this.changeSheetExec(data.index, data.isPivotTable, true);\r\n        _this.reOrderAllSheet();\r\n    },\r\n    deleteSheet: function(index) {\r\n        let _this = this;\r\n\r\n        if (Store.allowEdit === false) {\r\n            return;\r\n        }\r\n\r\n        let arrIndex = _this.getSheetIndex(index);\r\n\r\n        const file = Store.luckysheetfile[arrIndex];\r\n\r\n        // 钩子 sheetDeleteBefore\r\n        if (!method.createHookFunction(\"sheetDeleteBefore\", { sheet: file })) {\r\n            return;\r\n        }\r\n\r\n        _this.setSheetHide(index, true);\r\n\r\n        $(\"#luckysheet-sheets-item\" + index).remove();\r\n        $(\"#luckysheet-datavisual-selection-set-\" + index).remove();\r\n\r\n        let removedsheet = Store.luckysheetfile.splice(arrIndex, 1);\r\n        _this.reOrderAllSheet();\r\n\r\n        server.saveParam(\"shd\", null, { deleIndex: index });\r\n\r\n        if (Store.clearjfundo) {\r\n            removedsheet[0].type = \"deleteSheet\";\r\n            Store.jfredo.push(removedsheet[0]);\r\n        }\r\n        // 钩子 sheetDeleteAfter\r\n        method.createHookFunction(\"sheetDeleteAfter\", { sheet: file });\r\n    },\r\n    nulldata: null,\r\n    getGridData: function(d) {\r\n        let ret = [];\r\n\r\n        for (let r = 0; r < d.length; r++) {\r\n            for (let c = 0; c < d[0].length; c++) {\r\n                if (d[r][c] == null) {\r\n                    continue;\r\n                }\r\n\r\n                ret.push({ r: r, c: c, v: d[r][c] });\r\n            }\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    buildGridData: function(file) {\r\n        // 如果已经存在二维数据data,那么直接返回data；如果只有celldata，那么就转化成二维数组data，再返回\r\n        let row = file.row == null ? Store.defaultrowNum : file.row,\r\n            column = file.column == null ? Store.defaultcolumnNum : file.column,\r\n            data = file.data && file.data.length > 0 ? file.data : datagridgrowth([], row, column),\r\n            celldata = file.celldata;\r\n        if (file.data && file.data.length > 0) {\r\n            for (let i = 0; i < data.length; i++) {\r\n                for (let j = 0; j < data[0].length; j++) {\r\n                    setcellvalue(i, j, data, data[i][j]);\r\n                }\r\n            }\r\n        } else {\r\n            if (celldata && celldata.length > 0) {\r\n                for (let i = 0; i < celldata.length; i++) {\r\n                    let item = celldata[i];\r\n                    let r = item.r;\r\n                    let c = item.c;\r\n                    let v = item.v;\r\n\r\n                    if (r >= data.length) {\r\n                        data = datagridgrowth(data, r - data.length + 1, 0);\r\n                    }\r\n                    if (c >= data[0].length) {\r\n                        data = datagridgrowth(data, 0, c - data[0].length + 1);\r\n                    }\r\n                    setcellvalue(r, c, data, v);\r\n                }\r\n            }\r\n        }\r\n\r\n        //亿万格式+精确度 恢复全局初始化\r\n        luckysheetConfigsetting.autoFormatw = false;\r\n        luckysheetConfigsetting.accuracy = undefined;\r\n        return data;\r\n    },\r\n    cutGridData: function(d) {\r\n        let rowindex = 0;\r\n\r\n        for (let r = d.length - 1; r >= 0; r--) {\r\n            let isnull = true;\r\n\r\n            for (let c = 0; c < d[0].length; c++) {\r\n                let value = getcellvalue(r, c);\r\n\r\n                if (value != null && $.trim(value).length > 0) {\r\n                    isnull = false;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (!isnull) {\r\n                break;\r\n            } else {\r\n                rowindex = r;\r\n            }\r\n        }\r\n\r\n        return d.slice(0, rowindex);\r\n    },\r\n    addGridData: function(celldata, row, column) {\r\n        let data = datagridgrowth([], row, column);\r\n\r\n        if (celldata != null) {\r\n            for (let i = 0; i < celldata.length; i++) {\r\n                let item = celldata[i];\r\n                let r = item.r;\r\n                let c = item.c;\r\n                let v = item.v;\r\n\r\n                if (r >= data.length) {\r\n                    data = datagridgrowth(data, r - data.length + 1, 0);\r\n                }\r\n\r\n                if (c >= data[0].length) {\r\n                    data = datagridgrowth(data, 0, c - data[0].length + 1);\r\n                }\r\n\r\n                setcellvalue(r, c, data, v);\r\n            }\r\n        }\r\n\r\n        return data;\r\n    },\r\n    sheetParamRestore: function(file, data) {\r\n        Store.luckysheet_select_save = file[\"luckysheet_select_save\"];\r\n        if (Store.luckysheet_select_save == null || Store.luckysheet_select_save.length == 0) {\r\n            if (data[0] != null && data[0][0] != null && data[0][0].mc != null) {\r\n                Store.luckysheet_select_save = [\r\n                    {\r\n                        row: [0, data[0][0].mc.rs - 1],\r\n                        column: [0, data[0][0].mc.cs - 1],\r\n                    },\r\n                ];\r\n            } else {\r\n                Store.luckysheet_select_save = [\r\n                    {\r\n                        row: [0, 0],\r\n                        column: [0, 0],\r\n                    },\r\n                ];\r\n            }\r\n        }\r\n\r\n        Store.luckysheet_selection_range =\r\n            file[\"luckysheet_selection_range\"] == null ? [] : file[\"luckysheet_selection_range\"];\r\n        Store.config = file[\"config\"] == null ? {} : file[\"config\"];\r\n\r\n        Store.zoomRatio = file[\"zoomRatio\"] == null ? 1 : file[\"zoomRatio\"];\r\n\r\n        if (file[\"defaultRowHeight\"] != null) {\r\n            Store.defaultrowlen = parseFloat(file[\"defaultRowHeight\"]);\r\n        } else {\r\n            Store.defaultrowlen = luckysheetConfigsetting[\"defaultRowHeight\"];\r\n        }\r\n\r\n        if (file[\"defaultColWidth\"] != null) {\r\n            Store.defaultcollen = parseFloat(file[\"defaultColWidth\"]);\r\n        } else {\r\n            Store.defaultcollen = luckysheetConfigsetting[\"defaultColWidth\"];\r\n        }\r\n\r\n        if (file[\"showGridLines\"] != null) {\r\n            let showGridLines = file[\"showGridLines\"];\r\n            if (showGridLines == 0 || showGridLines == false) {\r\n                Store.showGridLines = false;\r\n            } else {\r\n                Store.showGridLines = true;\r\n            }\r\n        } else {\r\n            Store.showGridLines = true;\r\n        }\r\n    },\r\n    initialjfFile: function(menu, title) {\r\n        let _this = this;\r\n\r\n        _this.getCurSheet();\r\n        let file = Store.luckysheetfile[_this.getSheetIndex(Store.currentSheetIndex)];\r\n        _this.nulldata = datagridgrowth([], Store.defaultrowNum, Store.defaultcolumnNum);\r\n        let data = _this.buildGridData(file);\r\n\r\n        //初始化的时候 记录选区\r\n        let select_save = [];\r\n        file.jfgird_select_save = file.jfgird_select_save || [];\r\n        file.jfgird_select_save.forEach((item) => select_save.push({ row: item.row, column: item.column }));\r\n        file.luckysheet_select_save = select_save;\r\n\r\n        this.sheetParamRestore(file, data);\r\n\r\n        let r2 = Store.luckysheet_select_save[0].row[1],\r\n            c2 = Store.luckysheet_select_save[0].column[1];\r\n\r\n        if (Store.luckysheet_select_save.length > 1) {\r\n            for (let i = 0; i < Store.luckysheet_select_save.length; i++) {\r\n                if (Store.luckysheet_select_save[i].row[1] > r2) {\r\n                    r2 = Store.luckysheet_select_save[i].row[1];\r\n                }\r\n\r\n                if (Store.luckysheet_select_save[i].column[1] > c2) {\r\n                    c2 = Store.luckysheet_select_save[i].column[1];\r\n                }\r\n            }\r\n        }\r\n\r\n        menuButton.fontInitial(Store.fontList); //initial font\r\n\r\n        file.data = data;\r\n\r\n        let rowheight = data.length;\r\n        if (r2 > rowheight - 1) {\r\n            rowheight = r2 + 1;\r\n        }\r\n\r\n        let colwidth = data[0].length;\r\n        if (c2 > colwidth - 1) {\r\n            colwidth = c2 + 1;\r\n        }\r\n\r\n        //钩子函数 表格创建之前触发\r\n        if (typeof luckysheetConfigsetting.beforeCreateDom == \"function\") {\r\n            luckysheetConfigsetting.beforeCreateDom(luckysheet);\r\n        }\r\n\r\n        if (typeof luckysheetConfigsetting.workbookCreateBefore == \"function\") {\r\n            luckysheetConfigsetting.workbookCreateBefore(luckysheet);\r\n        }\r\n\r\n        // Store.flowdata = data;\r\n\r\n        luckysheetcreatedom(colwidth, rowheight, data, menu, title);\r\n\r\n        setTimeout(function() {\r\n            tooltip.createHoverTip(\r\n                \"#luckysheet_info_detail\",\r\n                \".luckysheet_info_detail_back, .luckysheet_info_detail_input, .luckysheet_info_detail_update\",\r\n            );\r\n            tooltip.createHoverTip(\r\n                \"#luckysheet-wa-editor\",\r\n                \".luckysheet-toolbar-menu-button, .luckysheet-toolbar-button, .luckysheet-toolbar-combo-button\",\r\n            );\r\n\r\n            Store.luckysheetTableContentHW = [\r\n                $(\"#luckysheet-cell-main\").width() + Store.rowHeaderWidth - Store.cellMainSrollBarSize,\r\n                $(\"#luckysheet-cell-main\").height() + Store.columnHeaderHeight - Store.cellMainSrollBarSize,\r\n            ];\r\n            $(\"#luckysheetTableContent, #luckysheetTableContentF\")\r\n                .attr({\r\n                    width: Math.ceil(Store.luckysheetTableContentHW[0] * Store.devicePixelRatio),\r\n                    height: Math.ceil(Store.luckysheetTableContentHW[1] * Store.devicePixelRatio),\r\n                })\r\n                .css({\r\n                    width: Store.luckysheetTableContentHW[0],\r\n                    height: Store.luckysheetTableContentHW[1],\r\n                })\r\n                .get(0)\r\n                .getContext(\"2d\");\r\n            let locale_info = locale().info;\r\n            let key = server.gridKey;\r\n            let cahce_key = key + \"__qkcache\";\r\n\r\n            let ini = function() {\r\n                file[\"load\"] = \"1\";\r\n\r\n                _this.createSheet();\r\n\r\n                let execF = function() {\r\n                    _this.mergeCalculation(file[\"index\"]);\r\n                    _this.setSheetParam(false);\r\n                    // editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n                    _this.storeSheetParam();\r\n                    _this.restoreselect();\r\n                    _this.CacheNotLoadControll = [];\r\n                    _this.restoreCache();\r\n                    formula.execFunctionGroupForce(luckysheetConfigsetting.forceCalculation);\r\n                    _this.restoreSheetAll(Store.currentSheetIndex);\r\n\r\n                    // luckysheetrefreshgrid(0, 0);\r\n                    $(\"#luckysheet_info_detail_save\").html(locale_info.detailSave);\r\n\r\n                    if (!!file.isPivotTable) {\r\n                        Store.luckysheetcurrentisPivotTable = true;\r\n                        // pivotTable.changePivotTable(Store.currentSheetIndex); //此方法需要注释掉，在restoreSheetAll中已经执行了刷新了数据透视表，这里就不需要了\r\n                    } else {\r\n                        Store.luckysheetcurrentisPivotTable = false;\r\n                        $(\"#luckysheet-modal-dialog-slider-pivot\").hide();\r\n                    }\r\n\r\n                    // Store toolbar button width value\r\n                    menuToolBarWidth();\r\n\r\n                    luckysheetsizeauto();\r\n\r\n                    //等待滚动条dom宽高加载完成后 初始化滚动位置\r\n                    if (file[\"scrollLeft\"] != null && file[\"scrollLeft\"] > 0) {\r\n                        $(\"#luckysheet-scrollbar-x\").scrollLeft(file[\"scrollLeft\"]);\r\n                    } else {\r\n                        $(\"#luckysheet-scrollbar-x\").scrollLeft(0);\r\n                    }\r\n\r\n                    if (file[\"scrollTop\"] != null && file[\"scrollTop\"] > 0) {\r\n                        $(\"#luckysheet-scrollbar-y\").scrollTop(file[\"scrollTop\"]);\r\n                    } else {\r\n                        $(\"#luckysheet-scrollbar-y\").scrollTop(0);\r\n                    }\r\n\r\n                    // 此处已经渲染完成表格，应该挪到前面\r\n                    // //钩子函数 表格创建之前触发\r\n                    // if(typeof luckysheetConfigsetting.beforeCreateDom == \"function\" ){\r\n                    //     luckysheetConfigsetting.beforeCreateDom(luckysheet);\r\n                    // }\r\n\r\n                    // if(typeof luckysheetConfigsetting.workbookCreateBefore == \"function\"){\r\n                    //     luckysheetConfigsetting.workbookCreateBefore(luckysheet);\r\n                    // }\r\n\r\n                    arrayRemoveItem(Store.asyncLoad, \"core\");\r\n\r\n                    if (luckysheetConfigsetting.pointEdit) {\r\n                        setTimeout(function() {\r\n                            Store.loadingObj.close();\r\n                        }, 0);\r\n                    } else {\r\n                        setTimeout(function() {\r\n                            Store.loadingObj.close();\r\n                        }, 500);\r\n                    }\r\n                };\r\n\r\n                let loadSheetUrl = server.loadSheetUrl;\r\n\r\n                if (loadSheetUrl == \"\") {\r\n                    //     execF();\r\n                    // }\r\n                    // else if(sheetindex.length>0 && loadSheetUrl == \"\"){\r\n                    // for(let i = 0;i<Store.luckysheetfile.length;i++){\r\n                    //     let otherfile = Store.luckysheetfile[i];\r\n                    //     if(otherfile.index == file.index){\r\n                    //         continue;\r\n                    //     }\r\n                    //     // let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)];\r\n                    //     if(otherfile[\"load\"] == null || otherfile[\"load\"] == \"0\"){\r\n                    //         otherfile[\"data\"] = _this.buildGridData(otherfile);\r\n                    //         otherfile[\"load\"] = \"1\";\r\n                    //     }\r\n                    // }\r\n\r\n                    _this.loadOtherFile(file);\r\n                    execF();\r\n                } else {\r\n                    let sheetindexset = _this.checkLoadSheetIndex(file);\r\n                    let sheetindex = [];\r\n\r\n                    for (let i = 0; i < sheetindexset.length; i++) {\r\n                        let item = sheetindexset[i];\r\n\r\n                        if (item == file[\"index\"]) {\r\n                            continue;\r\n                        }\r\n\r\n                        sheetindex.push(item);\r\n                    }\r\n\r\n                    // No request is sent if it is not linked to other worksheets\r\n                    if (sheetindex.length === 0) {\r\n                        execF();\r\n                        return;\r\n                    }\r\n                    $.post(loadSheetUrl, { gridKey: server.gridKey, index: sheetindex.join(\",\") }, function(d) {\r\n                        let dataset = new Function(\"return \" + d)();\r\n\r\n                        for (let item in dataset) {\r\n                            if (item == file[\"index\"]) {\r\n                                continue;\r\n                            }\r\n\r\n                            let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)];\r\n\r\n                            if (otherfile[\"load\"] == null || otherfile[\"load\"] == \"0\") {\r\n                                otherfile.celldata = dataset[item.toString()];\r\n                                otherfile[\"data\"] = _this.buildGridData(otherfile);\r\n                                otherfile[\"load\"] = \"1\";\r\n                            }\r\n                        }\r\n\r\n                        execF();\r\n                    });\r\n                }\r\n            };\r\n\r\n            try {\r\n                localforage.getItem(cahce_key).then(function(readValue) {\r\n                    if (readValue != null) {\r\n                        _this.CacheNotLoadControll = readValue;\r\n                    }\r\n                    server.clearcachelocaldata(function() {\r\n                        ini();\r\n                    });\r\n                });\r\n            } catch (e) {\r\n                ini();\r\n                console.log(\"缓存操作失败\");\r\n            }\r\n        }, 1);\r\n    },\r\n    storeSheetParam: function() {\r\n        let index = this.getSheetIndex(Store.currentSheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n        file[\"config\"] = Store.config;\r\n        file[\"visibledatarow\"] = Store.visibledatarow;\r\n        file[\"visibledatacolumn\"] = Store.visibledatacolumn;\r\n        file[\"ch_width\"] = Store.ch_width;\r\n        file[\"rh_height\"] = Store.rh_height;\r\n        file[\"luckysheet_select_save\"] = $.extend(true, [], Store.luckysheet_select_save);\r\n        file[\"luckysheet_selection_range\"] = $.extend(true, [], Store.luckysheet_selection_range);\r\n\r\n        if ($(\"#luckysheet-scrollbar-x\")[0].scrollWidth > $(\"#luckysheet-scrollbar-x\")[0].offsetWidth) {\r\n            file[\"scrollLeft\"] = $(\"#luckysheet-scrollbar-x\").scrollLeft(); //横向滚动条\r\n        }\r\n\r\n        if ($(\"#luckysheet-scrollbar-y\")[0].scrollHeight > $(\"#luckysheet-scrollbar-y\")[0].offsetHeight) {\r\n            file[\"scrollTop\"] = $(\"#luckysheet-scrollbar-y\").scrollTop(); //纵向滚动条\r\n        }\r\n\r\n        file[\"zoomRatio\"] = Store.zoomRatio;\r\n    },\r\n    setSheetParam: function(isload = true) {\r\n        let index = this.getSheetIndex(Store.currentSheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        Store.flowdata = file[\"data\"];\r\n        editor.webWorkerFlowDataCache(Store.flowdata); //worker存数据\r\n\r\n        // formula.execFunctionGroupData = null;\r\n        formula.execFunctionGlobalData = null;\r\n        window.luckysheet_getcelldata_cache = null;\r\n\r\n        this.sheetParamRestore(file, Store.flowdata);\r\n\r\n        if (file[\"freezen\"] == null) {\r\n            luckysheetFreezen.freezenhorizontaldata = null;\r\n            luckysheetFreezen.freezenverticaldata = null;\r\n        } else {\r\n            luckysheetFreezen.freezenhorizontaldata =\r\n                file[\"freezen\"].horizontal == null ? null : file[\"freezen\"].horizontal.freezenhorizontaldata;\r\n            luckysheetFreezen.freezenverticaldata =\r\n                file[\"freezen\"].vertical == null ? null : file[\"freezen\"].vertical.freezenverticaldata;\r\n        }\r\n\r\n        if (isload) {\r\n            rhchInit(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n\r\n        //批注\r\n        luckysheetPostil.buildAllPs(Store.flowdata);\r\n\r\n        //图片\r\n        imageCtrl.currentImgId = null;\r\n        imageCtrl.images = file.images;\r\n        imageCtrl.allImagesShow();\r\n        imageCtrl.init();\r\n\r\n        //数据验证\r\n        dataVerificationCtrl.dataVerification = file.dataVerification;\r\n        dataVerificationCtrl.init();\r\n\r\n        //链接\r\n        hyperlinkCtrl.hyperlink = file.hyperlink;\r\n        hyperlinkCtrl.init();\r\n\r\n        createFilterOptions(file[\"filter_select\"], file[\"filter\"]);\r\n    },\r\n    restoreselect: function() {\r\n        let index = this.getSheetIndex(Store.currentSheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        //选区\r\n        selectHightlightShow(true);\r\n\r\n        //复制选区虚线框\r\n        selectionCopyShow();\r\n\r\n        if (file[\"scrollLeft\"] != null && file[\"scrollLeft\"] > 0) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(file[\"scrollLeft\"]); //列标题\r\n        } else {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(0);\r\n        }\r\n\r\n        if (file[\"scrollTop\"] != null && file[\"scrollTop\"] > 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(file[\"scrollTop\"]); //列标题\r\n        } else {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(0);\r\n        }\r\n    },\r\n    storeSheetParamALL: function() {\r\n        let _this = this;\r\n\r\n        _this.storeSheetParam();\r\n        let index = _this.getSheetIndex(Store.currentSheetIndex);\r\n        Store.luckysheetfile[index][\"data\"] = Store.flowdata;\r\n        Store.luckysheetfile[index][\"config\"] = $.extend(true, {}, Store.config);\r\n    },\r\n    mergeCalculationSheet: {},\r\n    mergeCalculation: function(index) {\r\n        let file = Store.luckysheetfile[this.getSheetIndex(index)];\r\n        let config = file.config,\r\n            data = file.data;\r\n        if (config == null) {\r\n            return;\r\n        }\r\n        let mergeConfig = config.merge;\r\n        if (mergeConfig == null || index in this.mergeCalculationSheet || file[\"autoCalculationMerge\"] === false) {\r\n            return;\r\n        }\r\n\r\n        this.mergeCalculationSheet[index] = 1;\r\n\r\n        for (let x in mergeConfig) {\r\n            let r = parseInt(x.substr(0, x.indexOf(\"_\")));\r\n            let c = parseInt(x.substr(x.indexOf(\"_\") + 1));\r\n            let mcInfo = mergeConfig[x];\r\n            if (data[r][c] == null) {\r\n                data[r][c] = {};\r\n            }\r\n\r\n            data[r][c][\"mc\"] = {\r\n                r: r,\r\n                c: c,\r\n                rs: mcInfo.rs,\r\n                cs: mcInfo.cs,\r\n            };\r\n\r\n            for (let ir = r; ir < r + mcInfo.rs; ir++) {\r\n                for (let ic = c; ic < c + mcInfo.cs; ic++) {\r\n                    if (ir == r && ic == c) {\r\n                        continue;\r\n                    }\r\n                    if (data[ir][ic] == null) {\r\n                        data[ir][ic] = {};\r\n                    }\r\n                    data[ir][ic][\"mc\"] = {\r\n                        r: r,\r\n                        c: c,\r\n                    };\r\n                }\r\n            }\r\n        }\r\n    },\r\n    loadOtherFile: function(file) {\r\n        let _this = this;\r\n        // let sheetindexset = _this.checkLoadSheetIndex(file);\r\n        // let sheetindex = [];\r\n\r\n        // for(let i = 0; i < sheetindexset.length; i++){\r\n        //     let item = sheetindexset[i];\r\n\r\n        //     if(item == file[\"index\"]){\r\n        //         continue;\r\n        //     }\r\n\r\n        //     sheetindex.push(item);\r\n        // }\r\n\r\n        // for(let i = 0;i<sheetindex.length;i++){\r\n        //     let item = sheetindex[i];\r\n        //     let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)];\r\n        //     if(otherfile[\"load\"] == null || otherfile[\"load\"] == \"0\"){\r\n        //         otherfile[\"data\"] = _this.buildGridData(otherfile);\r\n        //         otherfile[\"load\"] = \"1\";\r\n        //     }\r\n        // }\r\n\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            let otherfile = Store.luckysheetfile[i];\r\n            if (otherfile.index == file.index) {\r\n                continue;\r\n            }\r\n            // let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)];\r\n            if (otherfile[\"load\"] == null || otherfile[\"load\"] == \"0\") {\r\n                otherfile[\"data\"] = _this.buildGridData(otherfile);\r\n                otherfile[\"load\"] = \"1\";\r\n            }\r\n        }\r\n    },\r\n    changeSheet: function(index, isPivotInitial, isNewSheet, isCopySheet) {\r\n        if (isEditMode()) {\r\n            // alert(\"非编辑模式下不允许该操作！\");\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        if (index == Store.currentSheetIndex) {\r\n            return;\r\n        }\r\n\r\n        if (server.allowUpdate) {\r\n            $(\"#luckysheet-cell-main #luckysheet-multipleRange-show\").empty();\r\n            server.multipleIndex = 0;\r\n        }\r\n        let file = Store.luckysheetfile[_this.getSheetIndex(index)];\r\n        // 钩子 sheetCreateAfter\r\n        if (isNewSheet) {\r\n            method.createHookFunction(\"sheetCreateAfter\", { sheet: file });\r\n        }\r\n        // 钩子 sheetCopyAfter\r\n        if (isCopySheet) {\r\n            method.createHookFunction(\"sheetCopyAfter\", { sheet: file });\r\n        }\r\n\r\n        // 钩子函数\r\n        method.createHookFunction(\"sheetActivate\", index, isPivotInitial, isNewSheet);\r\n\r\n        $(\r\n            \"#luckysheet-filter-selected-sheet\" +\r\n                Store.currentSheetIndex +\r\n                \", #luckysheet-filter-options-sheet\" +\r\n                Store.currentSheetIndex,\r\n        ).hide();\r\n        $(\"#luckysheet-filter-selected-sheet\" + index + \", #luckysheet-filter-options-sheet\" + index).show();\r\n\r\n        // 存储当前index，在远程公式里能识别，如果不是当前页就不要刷新（远程公式只能刷新当前页）\r\n        window.luckysheetCurrentIndex = index;\r\n\r\n        _this.storeSheetParamALL();\r\n        _this.setCurSheet(index);\r\n\r\n        if (!!file.isPivotTable) {\r\n            Store.luckysheetcurrentisPivotTable = true;\r\n            if (!isPivotInitial) {\r\n                pivotTable.changePivotTable(index);\r\n            }\r\n        } else {\r\n            Store.luckysheetcurrentisPivotTable = false;\r\n            $(\"#luckysheet-modal-dialog-slider-pivot\").hide();\r\n            luckysheetsizeauto(false);\r\n            this.refreshAllPivotTable(Store.currentSheetIndex);\r\n        }\r\n\r\n        let load = file[\"load\"];\r\n        if (load != null) {\r\n            let data = _this.buildGridData(file);\r\n            file.data = data;\r\n            // _this.loadOtherFile(file);\r\n\r\n            _this.mergeCalculation(index);\r\n            _this.setSheetParam(true);\r\n            _this.showSheet();\r\n\r\n            setTimeout(function() {\r\n                formula.execFunctionGroupForce(true);\r\n                luckysheetrefreshgrid();\r\n                server.saveParam(\"shs\", null, Store.currentSheetIndex);\r\n            }, 1);\r\n        } else {\r\n            let loadSheetUrl = server.loadSheetUrl;\r\n            if (loadSheetUrl == \"\" || Store.luckysheetcurrentisPivotTable || !!isNewSheet) {\r\n                let data = _this.buildGridData(file);\r\n\r\n                file[\"data\"] = data;\r\n                file[\"load\"] = \"1\";\r\n\r\n                // *这里不应该调用loadOtherFile去加载其余页面的数据,\r\n                // *因为loadOtherFile里判断后会调用buildGridData把其余的sheet的数据设置为空的二维数组,即使那个sheet在服务端存在数据.\r\n                // *这就导致一个数据丢失问题.\r\n                // _this.loadOtherFile(file);\r\n\r\n                // let sheetindexset = _this.checkLoadSheetIndex(file);\r\n                // let sheetindex = [];\r\n\r\n                // for(let i = 0; i < sheetindexset.length; i++){\r\n                //     let item = sheetindexset[i];\r\n\r\n                //     if(item == file[\"index\"]){\r\n                //         continue;\r\n                //     }\r\n\r\n                //     sheetindex.push(item);\r\n                // }\r\n\r\n                // for(let i = 0;i<sheetindex.length;i++){\r\n                //     let item = sheetindex[i];\r\n                //     let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)];\r\n                //     if(otherfile[\"load\"] == null || otherfile[\"load\"] == \"0\"){\r\n                //         otherfile[\"data\"] = _this.buildGridData(otherfile);\r\n                //         otherfile[\"load\"] = \"1\";\r\n                //     }\r\n                // }\r\n\r\n                _this.mergeCalculation(index);\r\n                _this.setSheetParam();\r\n                _this.showSheet();\r\n\r\n                setTimeout(function() {\r\n                    _this.restoreCache();\r\n                    formula.execFunctionGroupForce(luckysheetConfigsetting.forceCalculation);\r\n                    _this.restoreSheetAll(Store.currentSheetIndex);\r\n                    luckysheetrefreshgrid();\r\n                }, 1);\r\n\r\n                server.saveParam(\"shs\", null, Store.currentSheetIndex);\r\n            } else {\r\n                $(\"#luckysheet-grid-window-1\").append(luckysheetlodingHTML());\r\n\r\n                let sheetindex = _this.checkLoadSheetIndex(file);\r\n\r\n                $.post(loadSheetUrl, { gridKey: server.gridKey, index: sheetindex.join(\",\") }, function(d) {\r\n                    let dataset = new Function(\"return \" + d)();\r\n                    file.celldata = dataset[index.toString()];\r\n                    let data = _this.buildGridData(file);\r\n\r\n                    setTimeout(function() {\r\n                        Store.loadingObj.close();\r\n                    }, 500);\r\n\r\n                    for (let item in dataset) {\r\n                        if (item == index) {\r\n                            continue;\r\n                        }\r\n\r\n                        let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)];\r\n\r\n                        if (otherfile[\"load\"] == null || otherfile[\"load\"] == \"0\") {\r\n                            otherfile.celldata = dataset[item.toString()];\r\n                            otherfile[\"data\"] = _this.buildGridData(otherfile);\r\n                            otherfile[\"load\"] = \"1\";\r\n                        }\r\n                    }\r\n\r\n                    file[\"data\"] = data;\r\n                    file[\"load\"] = \"1\";\r\n                    _this.mergeCalculation(index);\r\n                    _this.setSheetParam();\r\n                    _this.showSheet();\r\n\r\n                    setTimeout(function() {\r\n                        _this.restoreCache();\r\n                        formula.execFunctionGroupForce(luckysheetConfigsetting.forceCalculation);\r\n                        _this.restoreSheetAll(Store.currentSheetIndex);\r\n                        luckysheetrefreshgrid();\r\n                    }, 1);\r\n\r\n                    server.saveParam(\"shs\", null, Store.currentSheetIndex);\r\n                });\r\n            }\r\n        }\r\n\r\n        $(\"#luckysheet-cell-main .luckysheet-datavisual-selection-set\").hide();\r\n        $(\"#luckysheet-datavisual-selection-set-\" + index).show();\r\n        luckysheetformula.hideButton()\r\n\r\n        //隐藏其他sheet的图表，显示当前sheet的图表 chartMix\r\n        renderChartShow(index);\r\n\r\n        luckysheetFreezen.initialFreezen(index);\r\n        _this.restoreselect();\r\n        //工作表保护的事件 不初始化工作表保护打开以后引用单元格点不动\r\n        initialEvent(file);\r\n    },\r\n\r\n    refreshAllPivotTable: function(index) {\r\n        Store.luckysheetfile.forEach((file)=>{\r\n            if(file.isPivotTable){\r\n                this.refreshPivotTableByFile(file)\r\n            }\r\n        })\r\n    },\r\n    refreshPivotTableByFile:function(file) {\r\n        let pivotTableConfig = file.pivotTable\r\n\r\n        let column = pivotTableConfig.column\r\n        let row = pivotTableConfig.row\r\n        let values = pivotTableConfig.values\r\n        let showType = pivotTableConfig.showType\r\n        let filterparm = pivotTableConfig.filterparm\r\n        let pivotDataSheetIndex = pivotTableConfig.pivotDataSheetIndex\r\n\r\n        let pivotrealIndex = this.getSheetIndex(pivotDataSheetIndex);\r\n\r\n        let otherfile = Store.luckysheetfile[pivotrealIndex];\r\n        if(otherfile[\"data\"] == null){\r\n            otherfile[\"data\"] = this.buildGridData(otherfile);\r\n        }\r\n\r\n        const origindata = getdatabyselectionD(otherfile.data, pivotTableConfig.pivot_select_save);\r\n\r\n        let rowhidden = {};\r\n        if (filterparm != null) {\r\n            for (let f in filterparm) {\r\n                // 目的是取出rowhidden\r\n                for (let h in filterparm[f]) {\r\n                    if (h === 'rowhidden' && _this.filterparm[f][h] != null) {\r\n                        rowhidden = $.extend(true, rowhidden, filterparm[f][h]);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n\r\n        let newdata = [];\r\n        for (let i = 0; i < origindata.length; i++) {\r\n            if (rowhidden != null && rowhidden[i] != null) {\r\n                continue;\r\n            }\r\n            newdata.push([].concat(origindata[i]));\r\n        }\r\n\r\n        let ret = pivotTable.dataHandler(column, row, values, showType, newdata);\r\n        \r\n        pivotTableConfig.pivotDatas = ret\r\n\r\n\r\n        let d = $.extend(true, [], this.nulldata);\r\n        let data = d;\r\n\r\n        let addr = 0, addc = 0;\r\n        let rlen = ret.length, \r\n                clen = ret[0].length;\r\n\r\n            addr = rlen - d.length; \r\n            addc = clen - d[0].length;\r\n\r\n            data = datagridgrowth(d, addr + 20, addc + 10, true);\r\n\r\n            for (let r = 0; r < rlen; r++) {\r\n                // let x = [].concat(data[r]);\r\n                for (let c = 0; c < clen; c++) {\r\n                    let value = \"\";\r\n                    if (ret[r] != null && ret[r][c] != null) {\r\n                        value = getcellvalue(r, c, ret);\r\n                        setcellvalue(r,c,data,value)\r\n                    }\r\n                    // x[c] = value;\r\n                }\r\n                // data[r] = x;\r\n            }\r\n        file.data = data;\r\n    },\r\n    checkLoadSheetIndexToDataIndex: {},\r\n    checkLoadSheetIndex: function(file) {\r\n        let calchain = formula.getAllFunctionGroup(); //file.calcChain; //index\r\n        let chart = file.chart; //dataSheetIndex\r\n        let pivotTable = file.pivotTable; //pivotDataSheetIndex\r\n\r\n        let ret = [],\r\n            cache = {};\r\n\r\n        if (file.index in this.checkLoadSheetIndexToDataIndex) {\r\n            return [];\r\n        }\r\n\r\n        ret.push(file.index);\r\n        cache[file.index.toString()] = 1;\r\n        this.checkLoadSheetIndexToDataIndex[file.index] = 1;\r\n        if (calchain != null) {\r\n            let dataIndexList = {};\r\n            for (let i = 0; i < calchain.length; i++) {\r\n                let f = calchain[i];\r\n                let dataindex = f.index;\r\n                let formulaTxt = getcellFormula(f.r, f.c, dataindex);\r\n\r\n                if (formulaTxt == null) {\r\n                    let file = Store.luckysheetfile[this.getSheetIndex(dataindex)];\r\n                    file.data = this.buildGridData(file);\r\n                    formulaTxt = getcellFormula(f.r, f.c, dataindex);\r\n\r\n                    if (formulaTxt == null) {\r\n                        continue;\r\n                    }\r\n                }\r\n\r\n                if (formulaTxt.indexOf(\"!\") == -1) {\r\n                    // dataIndexList[dataindex] = 1;\r\n                    formula.addToSheetIndexList(formulaTxt, dataindex);\r\n                } else if (\r\n                    formula.formulaContainSheetList != null &&\r\n                    formula.formulaContainSheetList[formulaTxt] != null\r\n                ) {\r\n                    for (let dataSheetIndex in formula.formulaContainSheetList[formulaTxt]) {\r\n                        dataIndexList[dataSheetIndex] = 1;\r\n                    }\r\n                } else {\r\n                    formula.functionParser(formulaTxt, (str) => {\r\n                        formula.addToCellList(formulaTxt, str);\r\n                        if (str.indexOf(\"!\") > -1) {\r\n                            let name = str.substr(0, str.indexOf(\"!\"));\r\n                            // dataNameList[name] = true;\r\n\r\n                            let sheet = this.getSheetByName(name);\r\n                            if (sheet != null) {\r\n                                let dataSheetIndex = sheet.index;\r\n                                dataIndexList[dataSheetIndex] = 1;\r\n\r\n                                formula.addToSheetIndexList(formulaTxt, dataSheetIndex);\r\n                            }\r\n                        }\r\n                    });\r\n\r\n                    if (formula.formulaContainSheetList[formulaTxt] == null) {\r\n                        // dataIndexList[dataindex] = 1;\r\n                        formula.addToSheetIndexList(formulaTxt, dataindex);\r\n                    }\r\n                }\r\n\r\n                if (dataindex == null) {\r\n                    continue;\r\n                }\r\n\r\n                // if(cache[dataindex.toString()] == null){\r\n                // \t// ret.push(dataindex);\r\n                //     cache[dataindex.toString()] = 1;\r\n                //     this.checkLoadSheetIndexToDataIndex[dataindex] = 1;\r\n                // }\r\n            }\r\n\r\n            for (let index in dataIndexList) {\r\n                // let sheet = this.getSheetByName(n);\r\n                // if(sheet==null){\r\n                //     continue;\r\n                // }\r\n\r\n                // if(index == Store.currentSheetIndex){\r\n                //     continue;\r\n                // }\r\n\r\n                let dataindex = index;\r\n\r\n                if (cache[dataindex.toString()] == null) {\r\n                    ret.push(dataindex);\r\n                    cache[dataindex.toString()] = 1;\r\n                    this.checkLoadSheetIndexToDataIndex[dataindex] = 1;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (chart != null) {\r\n            for (let i = 0; i < chart.length; i++) {\r\n                let cc = chart[i];\r\n                let dataindex = cc.dataSheetIndex;\r\n\r\n                if (dataindex == null) {\r\n                    continue;\r\n                }\r\n\r\n                if (cache[dataindex.toString()] == null) {\r\n                    ret.push(dataindex);\r\n                    cache[dataindex.toString()] = 1;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (pivotTable != null) {\r\n            let dataindex = pivotTable.pivotDataSheetIndex;\r\n\r\n            if (dataindex != null && cache[dataindex.toString()] == null) {\r\n                ret.push(dataindex);\r\n                cache[dataindex.toString()] = 1;\r\n            }\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    showSheet: function() {\r\n        // changeSheetContainerSize();\r\n        $(\"#luckysheet-cell-flow_0\").css({ width: Store.ch_width, top: \"-1px\" }); //width更新\r\n        $(\"#luckysheet-sheettable_0\").css({ width: Store.ch_width - 1, height: Store.rh_height });\r\n        $(\"#luckysheetrowHeader_0\").css(\"height\", Store.rh_height);\r\n        $(\"#luckysheet-cols-h-cells_0\").css(\"width\", Store.ch_width); //width更新\r\n\r\n        $(\"#luckysheet-scrollbar-x div\").width(Store.ch_width);\r\n        $(\"#luckysheet-scrollbar-y div\").height(\r\n            Store.rh_height + Store.columnHeaderHeight - Store.cellMainSrollBarSize - 3,\r\n        );\r\n\r\n        //等待滚动条dom宽高计算完成后 初始化该表格滚动位置\r\n        let index = this.getSheetIndex(Store.currentSheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        Store.scrollRefreshSwitch = false;\r\n\r\n        if (file[\"scrollLeft\"] != null && file[\"scrollLeft\"] > 0) {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(file[\"scrollLeft\"] * Store.zoomRatio);\r\n        } else {\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(0);\r\n        }\r\n\r\n        if (file[\"scrollTop\"] != null && file[\"scrollTop\"] > 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(file[\"scrollTop\"] * Store.zoomRatio);\r\n        } else {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(0);\r\n        }\r\n\r\n        setTimeout(() => {\r\n            Store.scrollRefreshSwitch = true;\r\n        }, 0);\r\n\r\n        zoomNumberDomBind(Store.zoomRatio);\r\n    },\r\n    setCurSheet: function(index) {\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            if (Store.luckysheetfile[i][\"index\"] == index) {\r\n                Store.luckysheetfile[i].status = 1;\r\n            } else {\r\n                Store.luckysheetfile[i].status = 0;\r\n            }\r\n        }\r\n\r\n        Store.currentSheetIndex = index;\r\n    },\r\n    getSheetIndex: function(index) {\r\n        for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n            if (Store.luckysheetfile[i][\"index\"] == index) {\r\n                return i;\r\n            }\r\n        }\r\n\r\n        return null;\r\n    },\r\n    changeSheetExec: function(index, isPivotInitial, isNewSheet, isCopySheet) {\r\n        let $sheet = $(\"#luckysheet-sheets-item\" + index);\r\n\r\n        window.luckysheet_getcelldata_cache = null;\r\n        $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n        $sheet.addClass(\"luckysheet-sheets-item-active\").show();\r\n\r\n        cleargridelement();\r\n        this.changeSheet(index, isPivotInitial, isNewSheet, isCopySheet);\r\n\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu\").hide();\r\n\r\n        if (formula.rangestart) {\r\n            formula.createRangeHightlight();\r\n        }\r\n\r\n        this.sheetBarShowAndHide(index);\r\n    },\r\n    sheetArrowShowAndHide() {\r\n        const $wrap = $(\"#luckysheet-sheet-container-c\");\r\n        if (!$wrap.length) return;\r\n        var sw = $wrap[0].scrollWidth;\r\n        var w = Math.ceil($wrap.width());\r\n\r\n        if (sw > w) {\r\n            if (luckysheetConfigsetting.showsheetbarConfig.sheet) {\r\n                $(\"#luckysheet-sheet-area .luckysheet-sheets-scroll\").css(\"display\", \"inline-block\");\r\n                $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").show();\r\n            }\r\n        } else {\r\n            $(\"#luckysheet-sheet-area .luckysheet-sheets-scroll\").css(\"display\", \"none\");\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").hide();\r\n        }\r\n    },\r\n    // *显示sheet栏左右的灰色\r\n    sheetBarShowAndHide(index) {\r\n        let $c = $(\"#luckysheet-sheet-container-c\");\r\n\r\n        if (index != null) {\r\n            let $sheet = $(\"#luckysheet-sheets-item\" + index);\r\n            $c.scrollLeft($sheet.offset().left);\r\n        }\r\n\r\n        let c_width = $c.width(),\r\n            c_srollwidth = $c[0].scrollWidth,\r\n            scrollLeft = $c.scrollLeft();\r\n\r\n        if (scrollLeft <= 0) {\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").hide();\r\n        } else {\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-left\").show();\r\n        }\r\n\r\n        if (c_width + scrollLeft >= c_srollwidth) {\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-right\").hide();\r\n        } else {\r\n            $(\"#luckysheet-sheet-container .docs-sheet-fade-right\").show();\r\n        }\r\n    },\r\n    delChart: function(chart_id, sheetIndex) {\r\n        let index = this.getSheetIndex(sheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        if (file.chart == null) {\r\n            file.chart = [];\r\n        } else {\r\n            for (let i = 0; i < file.chart.length; i++) {\r\n                if (file.chart[i].chart_id == chart_id) {\r\n                    Store.luckysheetfile[index].chart.splice(i, 1);\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n    },\r\n    saveChart: function(json) {\r\n        //采用chartMix store存储，弃用Store.luckysheetfile存储，防止重复存储\r\n        let index = this.getSheetIndex(json.sheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        if (file.chart == null) {\r\n            file.chart = [];\r\n            file.chart.push(json);\r\n        } else {\r\n            for (let i = 0; i < file.chart.length; i++) {\r\n                if (file.chart[i].chart_id == json.chart_id) {\r\n                    let old = $.extend(true, {}, file.chart[i]);\r\n                    file.chart[i] = $.extend(true, {}, old, json);\r\n                    return;\r\n                }\r\n            }\r\n\r\n            file.chart.push(json);\r\n        }\r\n    },\r\n    getChart: function(sheetIndex, chart_id) {\r\n        let index = this.getSheetIndex(sheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        if (file.chart == null) {\r\n            return null;\r\n        } else {\r\n            for (let i = 0; i < file.chart.length; i++) {\r\n                if (file.chart[i].chart_id == chart_id) {\r\n                    return file.chart[i];\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n    },\r\n    getRangetxt: function(sheetIndex, range, currentIndex) {\r\n        let sheettxt = \"\";\r\n\r\n        if (currentIndex == null) {\r\n            currentIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        if (sheetIndex != currentIndex) {\r\n            sheettxt = Store.luckysheetfile[this.getSheetIndex(sheetIndex)].name + \"!\";\r\n        }\r\n\r\n        let row0 = range[\"row\"][0],\r\n            row1 = range[\"row\"][1];\r\n        let column0 = range[\"column\"][0],\r\n            column1 = range[\"column\"][1];\r\n\r\n        if (row0 == null && row1 == null) {\r\n            return sheettxt + chatatABC(column0) + \":\" + chatatABC(column1);\r\n        } else if (column0 == null && column1 == null) {\r\n            return sheettxt + (row0 + 1) + \":\" + (row1 + 1);\r\n        } else {\r\n            if (column0 == column1 && row0 == row1) {\r\n                return sheettxt + chatatABC(column0) + (row0 + 1);\r\n            } else {\r\n                return sheettxt + chatatABC(column0) + (row0 + 1) + \":\" + chatatABC(column1) + (row1 + 1);\r\n            }\r\n        }\r\n    },\r\n    getSheetName: function(sheetIndex) {\r\n        if (sheetIndex == null) {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        return Store.luckysheetfile[this.getSheetIndex(sheetIndex)].name;\r\n    },\r\n    getSheetMerge: function() {\r\n        if (Store.config.merge == null) {\r\n            return null;\r\n        }\r\n\r\n        return Store.config.merge;\r\n    },\r\n    getSheetData: function(sheetIndex) {\r\n        if (sheetIndex == null) {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        return Store.luckysheetfile[this.getSheetIndex(sheetIndex)].data;\r\n    },\r\n    getSheetConfig: function(sheetIndex) {\r\n        let _this = this;\r\n\r\n        if (sheetIndex == null) {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        let config = Store.luckysheetfile[_this.getSheetIndex(sheetIndex)].config;\r\n\r\n        if (config == null) {\r\n            Store.luckysheetfile[_this.getSheetIndex(sheetIndex)].config = {};\r\n        }\r\n\r\n        return Store.luckysheetfile[_this.getSheetIndex(sheetIndex)].config;\r\n    },\r\n    restoreFilter: function(sheetIndex) {\r\n        let index = this.getSheetIndex(sheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        // if($('#luckysheet-filter-selected-sheet' + sheetIndex).length > 0 || file.filter_select == null || JSON.stringify(file.filter_select) == \"{}\"){\r\n        //     if(file.config != null && file.config.rowhidden != null){\r\n        //         file.config.rowhidden =  {};\r\n        //         Store.config = file.config;\r\n\r\n        //         jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length,false);\r\n        //     }\r\n\r\n        //     return;\r\n        // }\r\n\r\n        if (getObjType(file.filter_select) == \"string\") {\r\n            file.filter_select = JSON.parse(file.filter_select);\r\n        }\r\n\r\n        if (file.filter_select == null || file.filter_select.row == null || file.filter_select.column == null) {\r\n            return;\r\n        }\r\n\r\n        createFilterOptions(file.filter_select);\r\n\r\n        if (getObjType(file.filter) != \"object\") {\r\n            if (file.filter != null && getObjType(file.filter) == \"string\") {\r\n                file.filter = JSON.parse(file.filter);\r\n            }\r\n        }\r\n\r\n        let rowhidden = {};\r\n        if (file.config != null && file.config.rowhidden != null) {\r\n            rowhidden = file.config.rowhidden;\r\n        }\r\n\r\n        $(\"#luckysheet-filter-options-sheet\" + sheetIndex + \" .luckysheet-filter-options\").each(function(i) {\r\n            if (file.filter == null) {\r\n                return false;\r\n            }\r\n\r\n            let $top = $(this);\r\n            let item = file.filter[i];\r\n\r\n            if (item == null) {\r\n                return true;\r\n            }\r\n\r\n            if (getObjType(item) != \"object\") {\r\n                item = JSON.parse(item);\r\n            }\r\n\r\n            labelFilterOptionState(\r\n                $top,\r\n                item.optionstate,\r\n                item.rowhidden,\r\n                item.caljs,\r\n                false,\r\n                item.st_r,\r\n                item.ed_r,\r\n                item.cindex,\r\n                item.st_c,\r\n                item.ed_c,\r\n            );\r\n\r\n            rowhidden = $.extend(true, rowhidden, item.rowhidden);\r\n        });\r\n\r\n        if (file.config == null) {\r\n            file.config = {};\r\n        }\r\n\r\n        file.config[\"rowhidden\"] = rowhidden;\r\n        Store.config = file.config;\r\n\r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length, false);\r\n    },\r\n    restorePivot: function(sheetIndex) {\r\n        let index = this.getSheetIndex(sheetIndex);\r\n        let file = Store.luckysheetfile[index];\r\n\r\n        if (!file.isPivotTable) {\r\n            return;\r\n        }\r\n\r\n        pivotTable.getCellData(sheetIndex);\r\n        pivotTable.initialPivotManage(true);\r\n        pivotTable.refreshPivotTable(false);\r\n    },\r\n    restoreSheetAll: function(sheetIndex) {\r\n        let _this = this;\r\n        _this.restorePivot(sheetIndex);\r\n        _this.restoreFilter(sheetIndex);\r\n        _this.restoreFreezen(sheetIndex);\r\n    },\r\n    restoreFreezen: function(sheetIndex) {\r\n        luckysheetFreezen.initialFreezen(sheetIndex);\r\n    },\r\n    restoreCache: function() {\r\n        let _this = this;\r\n\r\n        let data = _this.CacheNotLoadControll;\r\n        _this.CacheNotLoadControll = [];\r\n\r\n        if (data.length == 0) {\r\n            return;\r\n        }\r\n\r\n        for (let i = 0; i < data.length; i++) {\r\n            let item = data[i];\r\n            _this.execCache(item);\r\n        }\r\n    },\r\n    CacheNotLoadControll: [],\r\n    execCache: function(item) {\r\n        let _this = this;\r\n\r\n        let type = item.t;\r\n        let index = item.i;\r\n        let value = item.v;\r\n        let file = Store.luckysheetfile[_this.getSheetIndex(index)];\r\n\r\n        if (type == \"sha\") {\r\n            Store.luckysheetfile.push(value);\r\n        } else if (type == \"shc\") {\r\n            let copyjson = $.extend(true, {}, Store.luckysheetfile[_this.getSheetIndex(value.copyindex)]);\r\n            copyjson.index = index;\r\n            Store.luckysheetfile.push(copyjson);\r\n        } else if (type == \"shd\") {\r\n            Store.luckysheetfile.splice(value.deleIndex, 1);\r\n        } else if (type == \"shr\") {\r\n            for (let pos in value) {\r\n                Store.luckysheetfile[_this.getSheetIndex(pos)].order = value[pos];\r\n            }\r\n        }\r\n\r\n        if ((file == null || file.load != \"1\") && !(type in { sha: 0, shc: 0, shd: 0, shr: 0 })) {\r\n            _this.CacheNotLoadControll.push(item);\r\n            return;\r\n        }\r\n\r\n        if (type == \"v\") {\r\n            let r = item.r,\r\n                c = item.c,\r\n                v = item.v;\r\n            let data = _this.getSheetData(index);\r\n            file.data[r][c] = v;\r\n        } else if (type == \"fc\") {\r\n            let op = item.op,\r\n                pos = item.pos;\r\n\r\n            if (getObjType(value) != \"object\") {\r\n                value = new Function(\"return \" + value)();\r\n            }\r\n\r\n            let r = value.r,\r\n                c = value.c;\r\n\r\n            if (op == \"del\") {\r\n                formula.delFunctionGroup(r, c, index);\r\n            } else {\r\n                formula.insertUpdateFunctionGroup(r, c, index);\r\n            }\r\n        } else if (type == \"cg\") {\r\n            let v = value,\r\n                k = item.k;\r\n            let config1 = _this.getSheetConfig(index);\r\n\r\n            if (!(k in config1)) {\r\n                config1[k] = {};\r\n            }\r\n\r\n            for (let key in v) {\r\n                config1[k][key] = v[key];\r\n            }\r\n\r\n            Store.config = config1;\r\n        } else if (type == \"f\") {\r\n            let v = value,\r\n                op = item.op,\r\n                pos = item.pos;\r\n            let filter = file.filter;\r\n\r\n            if (filter == null) {\r\n                filter = {};\r\n            }\r\n\r\n            if (op == \"upOrAdd\") {\r\n                filter[pos] = v;\r\n            } else if (op == \"del\") {\r\n                delete filter[pos];\r\n            }\r\n        } else if (type == \"fsc\") {\r\n            file.filter = null;\r\n            file.filter_select = null;\r\n        } else if (type == \"fsr\") {\r\n            let v = value;\r\n            file.filter = v.filter;\r\n            file.filter_select = v.filter_select;\r\n        } else if (type == \"sh\") {\r\n            let op = item.op,\r\n                cur = item.cur,\r\n                v = value;\r\n            if (op == \"hide\") {\r\n                file.status = 0;\r\n                Store.luckysheetfile[_this.getSheetIndex(cur)].status = 1;\r\n            } else if (op == \"show\") {\r\n                for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n                    Store.luckysheetfile[i].status = 0;\r\n                }\r\n                file.status = 1;\r\n            }\r\n        } else if (type == \"all\") {\r\n            let k = item.k,\r\n                s = item.s;\r\n            if (s && getObjType(value) != \"object\") {\r\n                file[k] = JSON.stringify(value);\r\n            } else {\r\n                file[k] = value;\r\n            }\r\n        } else if (type == \"c\") {\r\n            let op = item.op,\r\n                cid = item.cid;\r\n\r\n            if (op == \"add\") {\r\n                file.chart.push(value);\r\n            } else if (op == \"xy\" || op == \"wh\" || op == \"update\") {\r\n                for (let i = 0; i < file.chart.length; i++) {\r\n                    if (file.chart[i].chart_id == cid) {\r\n                        for (let item in file.chart[i]) {\r\n                            for (let vitem in value) {\r\n                                if (item == vitem) {\r\n                                    file.chart[i][item] = value[vitem];\r\n                                }\r\n                            }\r\n                        }\r\n                        return;\r\n                    }\r\n                }\r\n            } else if (op == \"del\") {\r\n                for (let i = 0; i < file.chart.length; i++) {\r\n                    if (file.chart[i].chart_id == cid) {\r\n                        file.chart.splice(i, 1);\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n        } else if (type == \"drc\") {\r\n            let rc = item.rc,\r\n                index = value.index,\r\n                len = value.len;\r\n            let celldata = file.celldata;\r\n\r\n            if (rc == \"r\") {\r\n                for (let i = 0; celldata.length == 0; i++) {\r\n                    let cell = celldata[i];\r\n                    if (cell.r >= index && cell.r < index + len) {\r\n                        delete celldata[i];\r\n                    } else if (cell.r >= index + len) {\r\n                        cell.r -= len;\r\n                    }\r\n                }\r\n\r\n                file.row -= len;\r\n            } else {\r\n                for (let i = 0; celldata.length == 0; i++) {\r\n                    let cell = celldata[i];\r\n                    if (cell.c >= index && cell.c < index + len) {\r\n                        delete celldata[i];\r\n                    } else if (cell.c >= index + len) {\r\n                        cell.c -= len;\r\n                    }\r\n                }\r\n\r\n                file.column -= len;\r\n            }\r\n\r\n            let ret = [];\r\n            for (let i = 0; i < celldata.length; i++) {\r\n                if (celldata[i] != null) {\r\n                    ret.push(celldata[i]);\r\n                }\r\n            }\r\n            file.celldata = ret;\r\n\r\n            let mtype, mst, med;\r\n            if (rc == \"r\") {\r\n                mtype = \"row\";\r\n            } else {\r\n                mtype = \"column\";\r\n            }\r\n            mst = index;\r\n            med = index + len - 1;\r\n\r\n            luckysheetdeletetable(mtype, mst, med, true);\r\n        } else if (type == \"arc\") {\r\n            let rc = item.rc,\r\n                index = value.index,\r\n                len = value.len;\r\n            let celldata = file.celldata;\r\n\r\n            if (rc == \"r\") {\r\n                for (let i = 0; i < celldata.length; i++) {\r\n                    let cell = celldata[i];\r\n                    if (cell.r > index) {\r\n                        cell.r += len;\r\n                    }\r\n                }\r\n\r\n                file.row += len;\r\n            } else {\r\n                for (let i = 0; i < celldata.length; i++) {\r\n                    let cell = celldata[i];\r\n                    if (cell.c > index) {\r\n                        cell.c += len;\r\n                    }\r\n                }\r\n\r\n                file.column += len;\r\n            }\r\n\r\n            let mtype;\r\n            if (rc == \"r\") {\r\n                mtype = \"row\";\r\n            } else {\r\n                mtype = \"column\";\r\n            }\r\n\r\n            luckysheetextendtable(mtype, index, len, true);\r\n        } else if (type == \"na\") {\r\n            server.saveParam(\"na\", null, value);\r\n        } else if (type == \"thumb\") {\r\n            setTimeout(function() {\r\n                _this.imageRequest();\r\n            }, 2000);\r\n        }\r\n    },\r\n};\r\n\r\nexport default sheetmanage;\r\n"
  },
  {
    "path": "src/controllers/sparkline.js",
    "content": "import Store from \"../store\";\r\n\r\n//sparkline设置\r\nlet createClass = function (/* [baseclass, [mixin, ...]], definition */) {\r\n    let Class, args;\r\n    Class = function () {\r\n        this.init.apply(this, arguments);\r\n    };\r\n    if (arguments.length > 1) {\r\n        if (arguments[0]) {\r\n            Class.prototype = $.extend(new arguments[0](), arguments[arguments.length - 1]);\r\n            Class._super = arguments[0].prototype;\r\n        } else {\r\n            Class.prototype = arguments[arguments.length - 1];\r\n        }\r\n        if (arguments.length > 2) {\r\n            args = Array.prototype.slice.call(arguments, 1, -1);\r\n            args.unshift(Class.prototype);\r\n            $.extend.apply($, args);\r\n        }\r\n    } else {\r\n        Class.prototype = arguments[0];\r\n    }\r\n    Class.prototype.cls = Class;\r\n    return Class;\r\n};\r\n\r\n/**\r\n * Wraps a format string for tooltips\r\n * {{x}}\r\n * {{x.2}\r\n * {{x:months}}\r\n */\r\nlet SPFormat = createClass({\r\n    fre: /\\{\\{([\\w.]+?)(:(.+?))?\\}\\}/g,\r\n    precre: /(\\w+)\\.(\\d+)/,\r\n\r\n    init: function (format, fclass) {\r\n        this.format = format;\r\n        this.fclass = fclass;\r\n    },\r\n\r\n    render: function (fieldset, lookups, options) {\r\n        let self = this,\r\n            fields = fieldset,\r\n            match, token, lookupkey, fieldvalue, prec;\r\n        return this.format.replace(this.fre, function () {\r\n            let lookup;\r\n            token = arguments[1];\r\n            lookupkey = arguments[3];\r\n            match = self.precre.exec(token);\r\n            if (match) {\r\n                prec = match[2];\r\n                token = match[1];\r\n            } else {\r\n                prec = false;\r\n            }\r\n            fieldvalue = fields[token];\r\n            if (fieldvalue === undefined) {\r\n                return '';\r\n            }\r\n            if (lookupkey && lookups && lookups[lookupkey]) {\r\n                lookup = lookups[lookupkey];\r\n                if (lookup.get) { // RangeMap\r\n                    return lookups[lookupkey].get(fieldvalue) || fieldvalue;\r\n                } else {\r\n                    return lookups[lookupkey][fieldvalue] || fieldvalue;\r\n                }\r\n            }\r\n            if (isNumber(fieldvalue)) {\r\n                if (options.get('numberFormatter')) {\r\n                    fieldvalue = options.get('numberFormatter')(fieldvalue);\r\n                } else {\r\n                    fieldvalue = formatNumber(fieldvalue, prec,\r\n                        options.get('numberDigitGroupCount'),\r\n                        options.get('numberDigitGroupSep'),\r\n                        options.get('numberDecimalMark'));\r\n                }\r\n            }\r\n            return fieldvalue;\r\n        });\r\n    }\r\n});\r\n\r\n// convience method to avoid needing the new operator\r\n$.spformat = function(format, fclass) {\r\n    return new SPFormat(format, fclass);\r\n};\r\n\r\nlet clipval = function (val, min, max) {\r\n    if (val < min) {\r\n        return min;\r\n    }\r\n    if (val > max) {\r\n        return max;\r\n    }\r\n    return val;\r\n};\r\n\r\nlet quartile = function (values, q) {\r\n    let vl;\r\n    if (q === 2) {\r\n        vl = Math.floor(values.length / 2);\r\n        return values.length % 2 ? values[vl] : (values[vl-1] + values[vl]) / 2;\r\n    } else {\r\n        if (values.length % 2 ) { // odd\r\n            vl = (values.length * q + q) / 4;\r\n            return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 : values[vl-1];\r\n        } else { //even\r\n            vl = (values.length * q + 2) / 4;\r\n            return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 :  values[vl-1];\r\n\r\n        }\r\n    }\r\n};\r\n\r\nlet normalizeValue = function (val) {\r\n    let nf;\r\n    switch (val) {\r\n        case 'undefined':\r\n            val = undefined;\r\n            break;\r\n        case 'null':\r\n            val = null;\r\n            break;\r\n        case 'true':\r\n            val = true;\r\n            break;\r\n        case 'false':\r\n            val = false;\r\n            break;\r\n        default:\r\n            nf = parseFloat(val);\r\n            if (val == nf) {\r\n                val = nf;\r\n            }\r\n    }\r\n    return val;\r\n};\r\n\r\nlet normalizeValues = function (vals) {\r\n    let i, result = [];\r\n    for (i = vals.length; i--;) {\r\n        result[i] = normalizeValue(vals[i]);\r\n    }\r\n    return result;\r\n};\r\n\r\n\r\nlet all = function (val, arr, ignoreNull) {\r\n    let i;\r\n    for (i = arr.length; i--; ) {\r\n        if (ignoreNull && arr[i] === null) continue;\r\n        if (arr[i] !== val) {\r\n            return false;\r\n        }\r\n    }\r\n    return true;\r\n};\r\n\r\n// sums the numeric values in an array, ignoring other values\r\nlet sum = function (vals) {\r\n    let total = 0, i;\r\n    for (i = vals.length; i--;) {\r\n        total += typeof vals[i] === 'number' ? vals[i] : 0;\r\n    }\r\n    return total;\r\n};\r\n\r\nlet remove = function (vals, filter) {\r\n    let i, vl, result = [];\r\n    for (i = 0, vl = vals.length; i < vl; i++) {\r\n        if (vals[i] !== filter) {\r\n            result.push(vals[i]);\r\n        }\r\n    }\r\n    return result;\r\n};\r\n\r\nlet isNumber = function (num) {\r\n    return !isNaN(parseFloat(num)) && isFinite(num);\r\n};\r\n\r\nlet formatNumber = function (num, prec, groupsize, groupsep, decsep) {\r\n    let p, i;\r\n    num = (prec === false ? parseFloat(num).toString() : num.toFixed(prec)).split('');\r\n    p = (p = $.inArray('.', num)) < 0 ? num.length : p;\r\n    if (p < num.length) {\r\n        num[p] = decsep;\r\n    }\r\n    for (i = p - groupsize; i > 0; i -= groupsize) {\r\n        num.splice(i, 0, groupsep);\r\n    }\r\n    return num.join('');\r\n};\r\n\r\n\r\nlet RangeMap = createClass({\r\n    init: function (map) {\r\n        let key, range, rangelist = [];\r\n        for (key in map) {\r\n            if (map.hasOwnProperty(key) && typeof key === 'string' && key.indexOf(':') > -1) {\r\n                range = key.split(':');\r\n                range[0] = range[0].length === 0 ? -Infinity : parseFloat(range[0]);\r\n                range[1] = range[1].length === 0 ? Infinity : parseFloat(range[1]);\r\n                range[2] = map[key];\r\n                rangelist.push(range);\r\n            }\r\n        }\r\n        this.map = map;\r\n        this.rangelist = rangelist || false;\r\n    },\r\n\r\n    get: function (value) {\r\n        let rangelist = this.rangelist,\r\n            i, range, result;\r\n        if ((result = this.map[value]) !== undefined) {\r\n            return result;\r\n        }\r\n        if (rangelist) {\r\n            for (i = rangelist.length; i--;) {\r\n                range = rangelist[i];\r\n                if (range[0] <= value && range[1] >= value) {\r\n                    return range[2];\r\n                }\r\n            }\r\n        }\r\n        return undefined;\r\n    }\r\n});\r\n\r\n// Convenience function\r\n$.range_map = function(map) {\r\n    return new RangeMap(map);\r\n};\r\n\r\nconst luckysheetSparkline = {\r\n    defaultOption:{\r\n        // Settings common to most/all chart types\r\n        common: {\r\n            type: 'line',\r\n            lineColor: '#2ec7c9',\r\n            fillColor: '#CCF3F4',\r\n            defaultPixelsPerValue: 3,\r\n            width: 'auto',\r\n            height: 'auto',\r\n            composite: false,\r\n            tagValuesAttribute: 'values',\r\n            tagOptionsPrefix: 'spark',\r\n            enableTagOptions: false,\r\n            enableHighlight: true,\r\n            highlightLighten: 1.4,\r\n            tooltipSkipNull: true,\r\n            tooltipPrefix: '',\r\n            tooltipSuffix: '',\r\n            disableHiddenCheck: false,\r\n            numberFormatter: false,\r\n            numberDigitGroupCount: 3,\r\n            numberDigitGroupSep: ',',\r\n            numberDecimalMark: '.',\r\n            disableTooltips: true,\r\n            disableInteraction: true,\r\n            offsetX:0,\r\n            offsetY:0\r\n        },\r\n        // Defaults for line charts\r\n        //=LINESPL\r\n        line: {\r\n            spotColor: 0,\r\n            highlightSpotColor: '#5f5',\r\n            highlightLineColor: '#f22',\r\n            spotRadius: 1.5,\r\n            minSpotColor: 0,\r\n            maxSpotColor: 0,\r\n            lineWidth: 1,\r\n            normalRangeMin: undefined,\r\n            normalRangeMax: undefined,\r\n            normalRangeColor: '#ccc',\r\n            drawNormalOnTop: true,\r\n            chartRangeMin: undefined,\r\n            chartRangeMax: undefined,\r\n            chartRangeMinX: undefined,\r\n            chartRangeMaxX: undefined,\r\n            // tooltipFormat: new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{prefix}}{{y}}{{suffix}}')\r\n        },\r\n        // Defaults for bar charts\r\n        bar: {\r\n            barColor: '#fc5c5c',\r\n            negBarColor: '#97b552',\r\n            stackedBarColor: [\"#2ec7c9\", \"#fc5c5c\", \"#5ab1ef\", \"#ffb980\", \"#d87a80\", \"#8d98b3\", \"#e5cf0d\", \"#97b552\", \"#95706d\",\"#dc69aa\",\"#07a2a4\",\"#9a7fd1\",\"#588dd5\",\"#f5994e\",\"#c05050\",\"#59678c\",\"#c9ab00\",\"#7eb00a\",\"#6f5553\",\"#c14089\"],\r\n            zeroColor: undefined,\r\n            nullColor: undefined,\r\n            zeroAxis: true,\r\n            barWidth: 4,\r\n            barSpacing: 1,\r\n            chartRangeMax: undefined,\r\n            chartRangeMin: undefined,\r\n            chartRangeClip: false,\r\n            colorMap: undefined,\r\n            // tooltipFormat: new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{prefix}}{{value}}{{suffix}}')\r\n        },\r\n        column: {\r\n            barColor: '#fc5c5c',\r\n            negBarColor: '#97b552',\r\n            stackedBarColor: [\"#2ec7c9\", \"#fc5c5c\", \"#5ab1ef\", \"#ffb980\", \"#d87a80\", \"#8d98b3\", \"#e5cf0d\", \"#97b552\", \"#95706d\",\"#dc69aa\",\"#07a2a4\",\"#9a7fd1\",\"#588dd5\",\"#f5994e\",\"#c05050\",\"#59678c\",\"#c9ab00\",\"#7eb00a\",\"#6f5553\",\"#c14089\"],\r\n            zeroColor: undefined,\r\n            nullColor: undefined,\r\n            zeroAxis: true,\r\n            barWidth: 4,\r\n            barSpacing: 1,\r\n            chartRangeMax: undefined,\r\n            chartRangeMin: undefined,\r\n            chartRangeClip: false,\r\n            colorMap: undefined,\r\n            // tooltipFormat: new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{prefix}}{{value}}{{suffix}}')\r\n        },\r\n        // Defaults for tristate charts\r\n        tristate: {\r\n            barWidth: 4,\r\n            barSpacing: 1,\r\n            posBarColor: '#fc5c5c',\r\n            negBarColor: '#97b552',\r\n            zeroBarColor: '#999',\r\n            colorMap: {},\r\n            // tooltipFormat: new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{value:map}}'),\r\n            // tooltipValueLookups: { map: { '-1': 'Loss', '0': 'Draw', '1': 'Win' } }\r\n        },\r\n        // Defaults for discrete charts\r\n        discrete: {\r\n            lineHeight: 'auto',\r\n            thresholdColor: \"#fc5c5c\",\r\n            thresholdValue: 0,\r\n            chartRangeMax: undefined,\r\n            chartRangeMin: undefined,\r\n            chartRangeClip: false,\r\n            // tooltipFormat: new SPFormat('{{prefix}}{{value}}{{suffix}}')\r\n        },\r\n        // Defaults for bullet charts\r\n        bullet: {\r\n            targetColor: '#f33',\r\n            targetWidth: 3, // width of the target bar in pixels\r\n            performanceColor: '#33f',\r\n            rangeColors: ['#d3dafe', '#a8b6ff', '#7f94ff','#6D87FF','#5876FF','#4465FF','#2F54FF','#1A43FF','#0532FF'],\r\n            base: undefined, // set this to a number to change the base start number\r\n            // tooltipFormat: new SPFormat('{{fieldkey:fields}} - {{value}}'),\r\n            // tooltipValueLookups: { fields: {r: 'Range', p: 'Performance', t: 'Target'} }\r\n        },\r\n        // Defaults for pie charts\r\n        pie: {\r\n            offset: 0,\r\n            sliceColors: [\"#2ec7c9\", \"#fc5c5c\", \"#5ab1ef\", \"#ffb980\", \"#d87a80\", \"#8d98b3\", \"#e5cf0d\", \"#97b552\", \"#95706d\",\"#dc69aa\",\"#07a2a4\",\"#9a7fd1\",\"#588dd5\",\"#f5994e\",\"#c05050\",\"#59678c\",\"#c9ab00\",\"#7eb00a\",\"#6f5553\",\"#c14089\"],\r\n            borderWidth: 0,\r\n            borderColor: '#000',\r\n            // tooltipFormat: new SPFormat('<span style=\"color: {{color}}\">&#9679;</span> {{value}} ({{percent.1}}%)')\r\n        },\r\n        // Defaults for box plots\r\n        box: {\r\n            raw: false,\r\n            boxLineColor: '#000',\r\n            boxFillColor: '#cdf',\r\n            whiskerColor: '#000',\r\n            outlierLineColor: '#5E5E5E',\r\n            outlierFillColor: '#fff',\r\n            medianColor: '#f00',\r\n            showOutliers: true,\r\n            outlierIQR: 1.5,\r\n            spotRadius: 1.5,\r\n            target: undefined,\r\n            targetColor: '#4a2',\r\n            chartRangeMax: undefined,\r\n            chartRangeMin: undefined,\r\n            // tooltipFormat: new SPFormat('{{field:fields}}: {{value}}'),\r\n            // tooltipFormatFieldlistKey: 'field',\r\n            // tooltipValueLookups: { fields: { lq: 'Lower Quartile', med: 'Median',\r\n            //     uq: 'Upper Quartile', lo: 'Left Outlier', ro: 'Right Outlier',\r\n            //     lw: 'Left Whisker', rw: 'Right Whisker'} }\r\n        }\r\n    },\r\n    line:{\r\n        type: 'line',\r\n        init: function (el, values, options, width, height) {\r\n            //line._super.init.call(this, el, values, options, width, height);\r\n            this.vertices = [];\r\n            this.regionMap = [];\r\n            this.xvalues = [];\r\n            this.yvalues = [];\r\n            this.yminmax = [];\r\n            this.hightlightSpotId = null;\r\n            this.lastShapeId = null;\r\n            //this.initTarget();\r\n        },\r\n        getRegion: function (el, x, y) {\r\n            let i,\r\n                regionMap = this.regionMap; // maps regions to value positions\r\n            for (i = regionMap.length; i--;) {\r\n                if (regionMap[i] !== null && x >= regionMap[i][0] && x <= regionMap[i][1]) {\r\n                    return regionMap[i][2];\r\n                }\r\n            }\r\n            return undefined;\r\n        },\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion;\r\n            return {\r\n                isNull: this.yvalues[currentRegion] === null,\r\n                x: this.xvalues[currentRegion],\r\n                y: this.yvalues[currentRegion],\r\n                color: this.options.get('lineColor'),\r\n                fillColor: this.options.get('fillColor'),\r\n                offset: currentRegion\r\n            };\r\n        },\r\n        renderHighlight: function () {\r\n            let currentRegion = this.currentRegion,\r\n                target = this.target,\r\n                vertex = this.vertices[currentRegion],\r\n                options = this.options,\r\n                spotRadius = options.get('spotRadius'),\r\n                highlightSpotColor = options.get('highlightSpotColor'),\r\n                highlightLineColor = options.get('highlightLineColor'),\r\n                highlightSpot, highlightLine;\r\n\r\n            if (!vertex) {\r\n                return;\r\n            }\r\n            if (spotRadius && highlightSpotColor) {\r\n                highlightSpot = target.drawCircle(vertex[0], vertex[1],\r\n                    spotRadius, undefined, highlightSpotColor);\r\n                this.highlightSpotId = highlightSpot.id;\r\n                target.insertAfterShape(this.lastShapeId, highlightSpot);\r\n            }\r\n            if (highlightLineColor) {\r\n                highlightLine = target.drawLine(vertex[0], this.canvasTop, vertex[0],\r\n                    this.canvasTop + this.canvasHeight, highlightLineColor);\r\n                this.highlightLineId = highlightLine.id;\r\n                target.insertAfterShape(this.lastShapeId, highlightLine);\r\n            }\r\n        },\r\n        removeHighlight: function () {\r\n            let target = this.target;\r\n            if (this.highlightSpotId) {\r\n                target.removeShapeId(this.highlightSpotId);\r\n                this.highlightSpotId = null;\r\n            }\r\n            if (this.highlightLineId) {\r\n                target.removeShapeId(this.highlightLineId);\r\n                this.highlightLineId = null;\r\n            }\r\n        },\r\n        scanValues: function () {\r\n            let values = this.values,\r\n                valcount = values.length,\r\n                xvalues = this.xvalues,\r\n                yvalues = this.yvalues,\r\n                yminmax = this.yminmax,\r\n                i, val, isStr, isArray, sp;\r\n            for (i = 0; i < valcount; i++) {\r\n                val = values[i];\r\n                isStr = typeof(values[i]) === 'string';\r\n                isArray = typeof(values[i]) === 'object' && values[i] instanceof Array;\r\n                sp = isStr && values[i].split(':');\r\n                if (isStr && sp.length === 2) { // x:y\r\n                    xvalues.push(Number(sp[0]));\r\n                    yvalues.push(Number(sp[1]));\r\n                    yminmax.push(Number(sp[1]));\r\n                } else if (isArray) {\r\n                    xvalues.push(val[0]);\r\n                    yvalues.push(val[1]);\r\n                    yminmax.push(val[1]);\r\n                } else {\r\n                    xvalues.push(i);\r\n                    if (values[i] === null || values[i] === 'null') {\r\n                        yvalues.push(null);\r\n                    } else {\r\n                        yvalues.push(Number(val));\r\n                        yminmax.push(Number(val));\r\n                    }\r\n                }\r\n            }\r\n            if (this.options.get('xvalues')) {\r\n                xvalues = this.options.get('xvalues');\r\n            }\r\n\r\n            this.maxy = this.maxyorg = Math.max.apply(Math, yminmax);\r\n            this.miny = this.minyorg = Math.min.apply(Math, yminmax);\r\n\r\n            this.maxx = Math.max.apply(Math, xvalues);\r\n            this.minx = Math.min.apply(Math, xvalues);\r\n\r\n            this.xvalues = xvalues;\r\n            this.yvalues = yvalues;\r\n            this.yminmax = yminmax;\r\n\r\n        },\r\n        processRangeOptions: function () {\r\n            let options = this.options,\r\n                normalRangeMin = options.get('normalRangeMin'),\r\n                normalRangeMax = options.get('normalRangeMax');\r\n\r\n            if (normalRangeMin !== undefined) {\r\n                if (normalRangeMin < this.miny) {\r\n                    this.miny = normalRangeMin;\r\n                }\r\n                if (normalRangeMax > this.maxy) {\r\n                    this.maxy = normalRangeMax;\r\n                }\r\n            }\r\n            if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.miny)) {\r\n                this.miny = options.get('chartRangeMin');\r\n            }\r\n            if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.maxy)) {\r\n                this.maxy = options.get('chartRangeMax');\r\n            }\r\n            if (options.get('chartRangeMinX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMinX') < this.minx)) {\r\n                this.minx = options.get('chartRangeMinX');\r\n            }\r\n            if (options.get('chartRangeMaxX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMaxX') > this.maxx)) {\r\n                this.maxx = options.get('chartRangeMaxX');\r\n            }\r\n\r\n        },\r\n        drawNormalRange: function (canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey) {\r\n            let normalRangeMin = this.options.get('normalRangeMin'),\r\n                normalRangeMax = this.options.get('normalRangeMax'),\r\n                ytop = canvasTop + Math.round(canvasHeight - (canvasHeight * ((normalRangeMax - this.miny) / rangey))),\r\n                height = Math.round((canvasHeight * (normalRangeMax - normalRangeMin)) / rangey);\r\n            //(x1, y1, x2, y2, lineColor, lineWidth)\r\n            if(height==0 && normalRangeMin==normalRangeMax){\r\n                height=1;\r\n            }\r\n            this.target.drawRect(canvasLeft, ytop, canvasWidth, height, undefined, this.options.get('normalRangeColor')).append();\r\n        },\r\n        render: function (el,userValues) {\r\n            this.vertices = [];\r\n            this.regionMap = [];\r\n            this.xvalues = [];\r\n            this.yvalues = [];\r\n            this.yminmax = [];\r\n            this.hightlightSpotId = null;\r\n            this.lastShapeId = null;\r\n\r\n            this.values = userValues;\r\n\r\n            let options = this.options,\r\n                target = this.target,\r\n\r\n                canvasWidth = el.mergedOptions.width,\r\n                canvasHeight = el.mergedOptions.height,\r\n\r\n                vertices = this.vertices,\r\n                spotRadius = options.get('spotRadius'),\r\n                regionMap = this.regionMap,\r\n                rangex, rangey, yvallast,\r\n                canvasTop, canvasLeft,\r\n                vertex, path, paths, x, y, xnext, xpos, xposnext,\r\n                last, next, yvalcount, lineShapes, fillShapes, plen,\r\n                valueSpots, hlSpotsEnabled, color, xvalues, yvalues, i;\r\n\r\n            // if (!line._super.render.call(this)) {\r\n            //     return;\r\n            // }\r\n\r\n            this.scanValues();\r\n            this.processRangeOptions();\r\n\r\n            xvalues = this.xvalues;\r\n            yvalues = this.yvalues;\r\n\r\n            if (!this.yminmax.length || this.yvalues.length < 2) {\r\n                // empty or all null valuess\r\n                return;\r\n            }\r\n\r\n            canvasTop = canvasLeft = 0;\r\n\r\n            rangex = this.maxx - this.minx === 0 ? 1 : this.maxx - this.minx;\r\n            rangey = this.maxy - this.miny === 0 ? 1 : this.maxy - this.miny;\r\n            yvallast = this.yvalues.length - 1;\r\n\r\n            if (spotRadius && (canvasWidth < (spotRadius * 4) || canvasHeight < (spotRadius * 4))) {\r\n                spotRadius = 0;\r\n            }\r\n            if (spotRadius) {\r\n                // adjust the canvas size as required so that spots will fit\r\n                hlSpotsEnabled = options.get('highlightSpotColor') &&  !options.get('disableInteraction');\r\n                if (hlSpotsEnabled || options.get('minSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.miny)) {\r\n                    canvasHeight -= Math.ceil(spotRadius);\r\n                }\r\n                if (hlSpotsEnabled || options.get('maxSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.maxy)) {\r\n                    canvasHeight -= Math.ceil(spotRadius);\r\n                    canvasTop += Math.ceil(spotRadius);\r\n                }\r\n                if (hlSpotsEnabled ||\r\n                        ((options.get('minSpotColor') || options.get('maxSpotColor')) && (yvalues[0] === this.miny || yvalues[0] === this.maxy))) {\r\n                    canvasLeft += Math.ceil(spotRadius);\r\n                    canvasWidth -= Math.ceil(spotRadius);\r\n                }\r\n                if (hlSpotsEnabled || options.get('spotColor') ||\r\n                    (options.get('minSpotColor') || options.get('maxSpotColor') &&\r\n                        (yvalues[yvallast] === this.miny || yvalues[yvallast] === this.maxy))) {\r\n                    canvasWidth -= Math.ceil(spotRadius);\r\n                }\r\n            }\r\n\r\n\r\n            canvasHeight--;\r\n\r\n            if (options.get('normalRangeMin') !== undefined && !options.get('drawNormalOnTop')) {\r\n                this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey);\r\n            }\r\n\r\n            path = [];\r\n            paths = [path];\r\n            last = next = null;\r\n            yvalcount = yvalues.length;\r\n            for (i = 0; i < yvalcount; i++) {\r\n                x = xvalues[i];\r\n                xnext = xvalues[i + 1];\r\n                y = yvalues[i];\r\n                xpos = canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex));\r\n                xposnext = i < yvalcount - 1 ? canvasLeft + Math.round((xnext - this.minx) * (canvasWidth / rangex)) : canvasWidth;\r\n                next = xpos + ((xposnext - xpos) / 2);\r\n                regionMap[i] = [last || 0, next, i];\r\n                last = next;\r\n                if (y === null) {\r\n                    if (i) {\r\n                        if (yvalues[i - 1] !== null) {\r\n                            path = [];\r\n                            paths.push(path);\r\n                        }\r\n                        vertices.push(null);\r\n                    }\r\n                } else {\r\n                    if (y < this.miny) {\r\n                        y = this.miny;\r\n                    }\r\n                    if (y > this.maxy) {\r\n                        y = this.maxy;\r\n                    }\r\n                    if (!path.length) {\r\n                        // previous value was null\r\n                        path.push([xpos, canvasTop + canvasHeight]);\r\n                    }\r\n                    vertex = [xpos, canvasTop + Math.round(canvasHeight - (canvasHeight * ((y - this.miny) / rangey)))];\r\n                    path.push(vertex);\r\n                    vertices.push(vertex);\r\n                }\r\n            }\r\n\r\n            lineShapes = [];\r\n            fillShapes = [];\r\n            plen = paths.length;\r\n            for (i = 0; i < plen; i++) {\r\n                path = paths[i];\r\n                if (path.length) {\r\n                    if (options.get('fillColor')) {\r\n                        path.push([path[path.length - 1][0], (canvasTop + canvasHeight)]);\r\n                        fillShapes.push(path.slice(0));\r\n                        path.pop();\r\n                    }\r\n                    // if there's only a single point in this path, then we want to display it\r\n                    // as a vertical line which means we keep path[0]  as is\r\n                    if (path.length > 2) {\r\n                        // else we want the first value\r\n                        path[0] = [path[0][0], path[1][1]];\r\n                    }\r\n                    lineShapes.push(path);\r\n                }\r\n            }\r\n\r\n            // draw the fill first, then optionally the normal range, then the line on top of that\r\n            plen = fillShapes.length;\r\n            for (i = 0; i < plen; i++) {\r\n                target.drawShape(fillShapes[i],\r\n                    options.get('fillColor'), options.get('fillColor')).append();\r\n            }\r\n\r\n\r\n\r\n            plen = lineShapes.length;\r\n            for (i = 0; i < plen; i++) {\r\n                target.drawShape(lineShapes[i], options.get('lineColor'), undefined,\r\n                    options.get('lineWidth')).append();\r\n            }\r\n\r\n            if (options.get('normalRangeMin') !== undefined && options.get('drawNormalOnTop')) {\r\n                this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey);\r\n            }\r\n            \r\n            if (spotRadius && options.get('valueSpots')) {\r\n                valueSpots = options.get('valueSpots');\r\n                if (valueSpots.get === undefined) {\r\n                    valueSpots = new RangeMap(valueSpots);\r\n                }\r\n                for (i = 0; i < yvalcount; i++) {\r\n                    color = valueSpots.get(yvalues[i]);\r\n                    if (color) {\r\n                        target.drawCircle(canvasLeft + Math.round((xvalues[i] - this.minx) * (canvasWidth / rangex)),\r\n                            canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[i] - this.miny) / rangey))),\r\n                            spotRadius, undefined,\r\n                            color).append();\r\n                    }\r\n                }\r\n\r\n            }\r\n            if (spotRadius && options.get('spotColor') && yvalues[yvallast] !== null) {\r\n                target.drawCircle(canvasLeft + Math.round((xvalues[xvalues.length - 1] - this.minx) * (canvasWidth / rangex)),\r\n                    canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[yvallast] - this.miny) / rangey))),\r\n                    spotRadius, undefined,\r\n                    options.get('spotColor')).append();\r\n            }\r\n            if (this.maxy !== this.minyorg) {\r\n                if (spotRadius && options.get('minSpotColor')) {\r\n                    x = xvalues[$.inArray(this.minyorg, yvalues)];\r\n                    target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)),\r\n                        canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.minyorg - this.miny) / rangey))),\r\n                        spotRadius, undefined,\r\n                        options.get('minSpotColor')).append();\r\n                }\r\n                if (spotRadius && options.get('maxSpotColor')) {\r\n                    x = xvalues[$.inArray(this.maxyorg, yvalues)];\r\n                    target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)),\r\n                        canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.maxyorg - this.miny) / rangey))),\r\n                        spotRadius, undefined,\r\n                        options.get('maxSpotColor')).append();\r\n                }\r\n            }\r\n\r\n            // this.lastShapeId = target.getLastShapeId();\r\n            // this.canvasTop = canvasTop;\r\n            // target.render();\r\n\r\n        }\r\n    },\r\n    bar:{\r\n        type: 'bar',\r\n\r\n        init: function (el, values) {\r\n            let options = this.options;\r\n            let width = el.mergedOptions.height;\r\n            let height = el.mergedOptions.width;\r\n\r\n            this.canvasWidth = el.mergedOptions.height;\r\n            this.canvasHeight = el.mergedOptions.width;\r\n\r\n            let barWidth = parseInt(options.get('barWidth'), 10),\r\n                barSpacing = parseInt(options.get('barSpacing'), 10),\r\n                chartRangeMin = options.get('chartRangeMin'),\r\n                chartRangeMax = options.get('chartRangeMax'),\r\n                chartRangeClip = options.get('chartRangeClip'),\r\n                stackMin = Infinity,\r\n                stackMax = -Infinity,\r\n                isStackString, groupMin, groupMax, stackRanges,\r\n                numValues, i, vlen, range, zeroAxis, xaxisOffset, min, max, clipMin, clipMax,\r\n                stacked, vlist, j, slen, svals, val, yoffset, yMaxCalc, canvasHeightEf;\r\n            //bar._super.init.call(this, el, values, options, width, height);\r\n\r\n            this.values = values;\r\n\r\n            // scan values to determine whether to stack bars\r\n            for (i = 0, vlen = values.length; i < vlen; i++) {\r\n                val = values[i];\r\n                isStackString = typeof(val) === 'string' && val.indexOf(':') > -1;\r\n                if (isStackString || $.isArray(val)) {\r\n                    stacked = true;\r\n                    if (isStackString) {\r\n                        val = values[i] = normalizeValues(val.split(':'));\r\n                    }\r\n                    val = remove(val, null); // min/max will treat null as zero\r\n                    groupMin = Math.min.apply(Math, val);\r\n                    groupMax = Math.max.apply(Math, val);\r\n                    if (groupMin < stackMin) {\r\n                        stackMin = groupMin;\r\n                    }\r\n                    if (groupMax > stackMax) {\r\n                        stackMax = groupMax;\r\n                    }\r\n                }\r\n            }\r\n\r\n            this.stacked = stacked;\r\n            this.regionShapes = {};\r\n            this.barWidth = Math.floor(width/values.length)-barSpacing;\r\n            this.barSpacing = barSpacing;\r\n            this.totalBarWidth = this.barWidth + barSpacing;\r\n            //this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing);\r\n            this.width = width;\r\n            //this.initTarget();\r\n\r\n            if (chartRangeClip) {\r\n                clipMin = chartRangeMin === undefined ? -Infinity : chartRangeMin;\r\n                clipMax = chartRangeMax === undefined ? Infinity : chartRangeMax;\r\n            }\r\n\r\n            numValues = [];\r\n            stackRanges = stacked ? [] : numValues;\r\n            let stackTotals = [];\r\n            let stackRangesNeg = [];\r\n            for (i = 0, vlen = values.length; i < vlen; i++) {\r\n                if (stacked) {\r\n                    vlist = values[i];\r\n                    values[i] = svals = [];\r\n                    stackTotals[i] = 0;\r\n                    stackRanges[i] = stackRangesNeg[i] = 0;\r\n                    for (j = 0, slen = vlist.length; j < slen; j++) {\r\n                        val = svals[j] = chartRangeClip ? clipval(vlist[j], clipMin, clipMax) : vlist[j];\r\n                        if (val !== null) {\r\n                            if (val > 0) {\r\n                                stackTotals[i] += val;\r\n                            }\r\n                            if (stackMin < 0 && stackMax > 0) {\r\n                                if (val < 0) {\r\n                                    stackRangesNeg[i] += Math.abs(val);\r\n                                } else {\r\n                                    stackRanges[i] += val;\r\n                                }\r\n                            } else {\r\n                                stackRanges[i] += Math.abs(val);\r\n                                // stackRanges[i] += Math.abs(val - (val < 0 ? stackMax : stackMin));\r\n                            }\r\n                            numValues.push(val);\r\n                        }\r\n                    }\r\n                } else {\r\n                    val = chartRangeClip ? clipval(values[i], clipMin, clipMax) : values[i];\r\n                    val = values[i] = normalizeValue(val);\r\n                    if (val !== null) {\r\n                        numValues.push(val);\r\n                    }\r\n                }\r\n            }\r\n            this.max = max = Math.max.apply(Math, numValues);\r\n            this.min = min = Math.min.apply(Math, numValues);\r\n            this.stackMax = stackMax = stacked ? Math.max.apply(Math, stackTotals) : max;\r\n            this.stackMin = stackMin = stacked ? Math.min.apply(Math, numValues) : min;\r\n\r\n            if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < min)) {\r\n                min = options.get('chartRangeMin');\r\n            }\r\n            if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > max)) {\r\n                max = options.get('chartRangeMax');\r\n            }\r\n\r\n            this.zeroAxis = zeroAxis = options.get('zeroAxis', true);\r\n            if (min <= 0 && max >= 0 && zeroAxis) {\r\n                xaxisOffset = 0;\r\n            } else if (zeroAxis == false) {\r\n                xaxisOffset = min;\r\n            } else if (min > 0) {\r\n                xaxisOffset = 0;\r\n            } else {\r\n                xaxisOffset = max;\r\n            }\r\n            this.xaxisOffset = xaxisOffset;\r\n\r\n            range = stacked ? (Math.max.apply(Math, stackRanges) + Math.max.apply(Math, stackRangesNeg)) : max - xaxisOffset;\r\n\r\n            // as we plot zero/min values a single pixel line, we add a pixel to all other\r\n            // values - Reduce the effective canvas size to suit\r\n            this.canvasHeightEf = (zeroAxis && min < 0) ? this.canvasHeight - 2 : this.canvasHeight - 1;\r\n            this.isNeg = false;\r\n            if (min < xaxisOffset) {\r\n                // yMaxCalc = (stacked && max >= 0) ? stackMax : max;\r\n                // yoffset = (yMaxCalc - xaxisOffset) / range * this.canvasHeight;\r\n                yoffset = Math.floor(this.canvasHeight/2);\r\n                this.isNeg = true;\r\n                if (yoffset !== Math.ceil(yoffset)) {\r\n                    this.canvasHeightEf -= 2;\r\n                    yoffset = Math.ceil(yoffset);\r\n                }\r\n            } else {\r\n                yoffset = 0;\r\n            }\r\n            this.yoffset = yoffset;\r\n\r\n            if ($.isArray(options.get('colorMap'))) {\r\n                this.colorMapByIndex = options.get('colorMap');\r\n                this.colorMapByValue = null;\r\n            } else {\r\n                this.colorMapByIndex = null;\r\n                this.colorMapByValue = options.get('colorMap');\r\n                if (this.colorMapByValue && this.colorMapByValue.get === undefined) {\r\n                    this.colorMapByValue = new RangeMap(this.colorMapByValue);\r\n                }\r\n            }\r\n\r\n            this.range = range;\r\n        },\r\n\r\n        getRegion: function (el, x, y) {\r\n            let result = Math.floor(x / this.totalBarWidth);\r\n            return (result < 0 || result >= this.values.length) ? undefined : result;\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion,\r\n                values = ensureArray(this.values[currentRegion]),\r\n                result = [],\r\n                value, i;\r\n            for (i = values.length; i--;) {\r\n                value = values[i];\r\n                result.push({\r\n                    isNull: value === null,\r\n                    value: value,\r\n                    color: this.calcColor(i, value, currentRegion),\r\n                    offset: currentRegion\r\n                });\r\n            }\r\n            return result;\r\n        },\r\n\r\n        calcColor: function (stacknum, value, valuenum) {\r\n            let colorMapByIndex = this.colorMapByIndex,\r\n                colorMapByValue = this.colorMapByValue,\r\n                options = this.options,\r\n                color, newColor;\r\n            if (this.stacked) {\r\n                color = options.get('stackedBarColor');\r\n            } else {\r\n                color = (value < 0) ? options.get('negBarColor') : options.get('barColor');\r\n            }\r\n            if (value === 0 && options.get('zeroColor') !== undefined) {\r\n                color = options.get('zeroColor');\r\n            }\r\n            if (colorMapByValue && (newColor = colorMapByValue.get(value))) {\r\n                color = newColor;\r\n            } else if (colorMapByIndex && colorMapByIndex.length > valuenum) {\r\n                color = colorMapByIndex[valuenum];\r\n            }\r\n            return $.isArray(color) ? color[stacknum % color.length] : color;\r\n        },\r\n\r\n        /**\r\n         * Render bar(s) for a region\r\n         */\r\n        renderRegion: function (valuenum, highlight) {\r\n            let vals = this.values[valuenum],\r\n                options = this.options,\r\n                xaxisOffset = this.xaxisOffset,\r\n                result = [],\r\n                range = this.range,\r\n                stacked = this.stacked,\r\n                target = this.target,\r\n                x = valuenum * this.totalBarWidth,\r\n                canvasHeightEf = this.canvasHeightEf,\r\n                yoffset = this.yoffset,\r\n                y, height, color, isNull, yoffsetNeg, i, valcount, val, minPlotted, allMin;\r\n\r\n            vals = $.isArray(vals) ? vals : [vals];\r\n            valcount = vals.length;\r\n            val = vals[0];\r\n            isNull = all(null, vals);\r\n            allMin = all(xaxisOffset, vals, true);\r\n\r\n            if (isNull) {\r\n                if (options.get('nullColor')) {\r\n                    color = highlight ? options.get('nullColor') : this.calcHighlightColor(options.get('nullColor'), options);\r\n                    y = (yoffset > 0) ? yoffset - 1 : yoffset;\r\n                    return target.drawRect(y, x, 0, this.barWidth - 1, color, color);\r\n                } else {\r\n                    return undefined;\r\n                }\r\n            }\r\n            yoffsetNeg = yoffset;\r\n            if(this.isNeg){\r\n                canvasHeightEf = Math.floor(canvasHeightEf/2);\r\n            }\r\n            for (i = 0; i < valcount; i++) {\r\n                val = vals[i];\r\n\r\n                if (stacked && val === xaxisOffset) {\r\n                    if (!allMin || minPlotted) {\r\n                        continue;\r\n                    }\r\n                    minPlotted = true;\r\n                }\r\n\r\n                if (range > 0) {\r\n                    height = Math.floor(canvasHeightEf * ((Math.abs(val - xaxisOffset) / range)));\r\n                } else {\r\n                    height = canvasHeightEf;\r\n                }\r\n\r\n                if (val < xaxisOffset || (val === xaxisOffset && yoffset === 0)) {\r\n                    y = yoffsetNeg - height;\r\n                    yoffsetNeg += height;\r\n                } else {\r\n                    if(stacked){\r\n                        y = yoffset;\r\n                        yoffset += height;\r\n                    }\r\n                    else{\r\n                        y = yoffset;\r\n                        yoffset -= height;\r\n                    }\r\n                    \r\n                }\r\n                color = this.calcColor(i, val, valuenum);\r\n                if (highlight) {\r\n                    color = this.calcHighlightColor(color, options);\r\n                }\r\n                result.push(target.drawRect(y, x,  height - 1, this.barWidth - 1,color, color));\r\n            }\r\n            if (result.length === 1) {\r\n                return result[0];\r\n            }\r\n            return result;\r\n        }\r\n    },\r\n    column:{\r\n        type: 'column',\r\n\r\n        init: function (el, values) {\r\n            let options = this.options;\r\n            let width = el.mergedOptions.width;\r\n            let height = el.mergedOptions.height;\r\n\r\n            this.canvasWidth = el.mergedOptions.width;\r\n            this.canvasHeight = el.mergedOptions.height;\r\n\r\n            let barWidth = parseInt(options.get('barWidth'), 10),\r\n                barSpacing = parseInt(options.get('barSpacing'), 10),\r\n                chartRangeMin = options.get('chartRangeMin'),\r\n                chartRangeMax = options.get('chartRangeMax'),\r\n                chartRangeClip = options.get('chartRangeClip'),\r\n                stackMin = Infinity,\r\n                stackMax = -Infinity,\r\n                isStackString, groupMin, groupMax, stackRanges,\r\n                numValues, i, vlen, range, zeroAxis, xaxisOffset, min, max, clipMin, clipMax,\r\n                stacked, vlist, j, slen, svals, val, yoffset, yMaxCalc, canvasHeightEf;\r\n            //bar._super.init.call(this, el, values, options, width, height);\r\n\r\n            this.values = values;\r\n\r\n            // scan values to determine whether to stack bars\r\n            for (i = 0, vlen = values.length; i < vlen; i++) {\r\n                val = values[i];\r\n                isStackString = typeof(val) === 'string' && val.indexOf(':') > -1;\r\n                if (isStackString || $.isArray(val)) {\r\n                    stacked = true;\r\n                    if (isStackString) {\r\n                        val = values[i] = normalizeValues(val.split(':'));\r\n                    }\r\n                    val = remove(val, null); // min/max will treat null as zero\r\n                    groupMin = Math.min.apply(Math, val);\r\n                    groupMax = Math.max.apply(Math, val);\r\n                    if (groupMin < stackMin) {\r\n                        stackMin = groupMin;\r\n                    }\r\n                    if (groupMax > stackMax) {\r\n                        stackMax = groupMax;\r\n                    }\r\n                }\r\n            }\r\n\r\n            this.stacked = stacked;\r\n            this.regionShapes = {};\r\n            this.barWidth = Math.floor(width/values.length)-barSpacing;\r\n            this.barSpacing = barSpacing;\r\n            this.totalBarWidth = this.barWidth + barSpacing;\r\n            //this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing);\r\n            this.width = width;\r\n            //this.initTarget();\r\n\r\n            if (chartRangeClip) {\r\n                clipMin = chartRangeMin === undefined ? -Infinity : chartRangeMin;\r\n                clipMax = chartRangeMax === undefined ? Infinity : chartRangeMax;\r\n            }\r\n\r\n            numValues = [];\r\n            stackRanges = stacked ? [] : numValues;\r\n            let stackTotals = [];\r\n            let stackRangesNeg = [];\r\n            for (i = 0, vlen = values.length; i < vlen; i++) {\r\n                if (stacked) {\r\n                    vlist = values[i];\r\n                    values[i] = svals = [];\r\n                    stackTotals[i] = 0;\r\n                    stackRanges[i] = stackRangesNeg[i] = 0;\r\n                    for (j = 0, slen = vlist.length; j < slen; j++) {\r\n                        val = svals[j] = chartRangeClip ? clipval(vlist[j], clipMin, clipMax) : vlist[j];\r\n                        if (val !== null) {\r\n                            if (val > 0) {\r\n                                stackTotals[i] += val;\r\n                            }\r\n                            if (stackMin < 0 && stackMax > 0) {\r\n                                if (val < 0) {\r\n                                    stackRangesNeg[i] += Math.abs(val);\r\n                                } else {\r\n                                    stackRanges[i] += val;\r\n                                }\r\n                            } else {\r\n                                stackRanges[i] += Math.abs(val);\r\n                                // stackRanges[i] += Math.abs(val - (val < 0 ? stackMax : stackMin));\r\n                            }\r\n                            numValues.push(val);\r\n                        }\r\n                    }\r\n                } else {\r\n                    val = chartRangeClip ? clipval(values[i], clipMin, clipMax) : values[i];\r\n                    val = values[i] = normalizeValue(val);\r\n                    if (val !== null) {\r\n                        numValues.push(val);\r\n                    }\r\n                }\r\n            }\r\n            this.max = max = Math.max.apply(Math, numValues);\r\n            this.min = min = Math.min.apply(Math, numValues);\r\n            this.stackMax = stackMax = stacked ? Math.max.apply(Math, stackTotals) : max;\r\n            this.stackMin = stackMin = stacked ? Math.min.apply(Math, numValues) : min;\r\n\r\n            if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < min)) {\r\n                min = options.get('chartRangeMin');\r\n            }\r\n            if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > max)) {\r\n                max = options.get('chartRangeMax');\r\n            }\r\n\r\n            this.zeroAxis = zeroAxis = options.get('zeroAxis', true);\r\n            if (min <= 0 && max >= 0 && zeroAxis) {\r\n                xaxisOffset = 0;\r\n            } else if (zeroAxis == false) {\r\n                xaxisOffset = min;\r\n            } else if (min > 0) {\r\n                xaxisOffset = 0;\r\n            } else {\r\n                xaxisOffset = max;\r\n            }\r\n            this.xaxisOffset = xaxisOffset;\r\n\r\n            range = stacked ? (Math.max.apply(Math, stackRanges) + Math.max.apply(Math, stackRangesNeg)) : max - xaxisOffset;\r\n\r\n            // as we plot zero/min values a single pixel line, we add a pixel to all other\r\n            // values - Reduce the effective canvas size to suit\r\n            this.canvasHeightEf = (zeroAxis && min < 0) ? this.canvasHeight - 2 : this.canvasHeight - 1;\r\n            this.isNeg = false;\r\n            if (min < xaxisOffset) {\r\n                // yMaxCalc = (stacked && max >= 0) ? stackMax : max;\r\n                // yoffset = (yMaxCalc - xaxisOffset) / range * this.canvasHeight;\r\n                yoffset = Math.floor(this.canvasHeight/2);\r\n                this.isNeg = true;\r\n                if (yoffset !== Math.ceil(yoffset)) {\r\n                    this.canvasHeightEf -= 2;\r\n                    yoffset = Math.ceil(yoffset);\r\n                }\r\n            } else {\r\n                yoffset = this.canvasHeight;\r\n            }\r\n            this.yoffset = yoffset;\r\n\r\n            if ($.isArray(options.get('colorMap'))) {\r\n                this.colorMapByIndex = options.get('colorMap');\r\n                this.colorMapByValue = null;\r\n            } else {\r\n                this.colorMapByIndex = null;\r\n                this.colorMapByValue = options.get('colorMap');\r\n                if (this.colorMapByValue && this.colorMapByValue.get === undefined) {\r\n                    this.colorMapByValue = new RangeMap(this.colorMapByValue);\r\n                }\r\n            }\r\n\r\n            this.range = range;\r\n        },\r\n\r\n        getRegion: function (el, x, y) {\r\n            let result = Math.floor(x / this.totalBarWidth);\r\n            return (result < 0 || result >= this.values.length) ? undefined : result;\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion,\r\n                values = ensureArray(this.values[currentRegion]),\r\n                result = [],\r\n                value, i;\r\n            for (i = values.length; i--;) {\r\n                value = values[i];\r\n                result.push({\r\n                    isNull: value === null,\r\n                    value: value,\r\n                    color: this.calcColor(i, value, currentRegion),\r\n                    offset: currentRegion\r\n                });\r\n            }\r\n            return result;\r\n        },\r\n\r\n        calcColor: function (stacknum, value, valuenum) {\r\n            let colorMapByIndex = this.colorMapByIndex,\r\n                colorMapByValue = this.colorMapByValue,\r\n                options = this.options,\r\n                color, newColor;\r\n            if (this.stacked) {\r\n                color = options.get('stackedBarColor');\r\n            } else {\r\n                color = (value < 0) ? options.get('negBarColor') : options.get('barColor');\r\n            }\r\n            if (value === 0 && options.get('zeroColor') !== undefined) {\r\n                color = options.get('zeroColor');\r\n            }\r\n            if (colorMapByValue && (newColor = colorMapByValue.get(value))) {\r\n                color = newColor;\r\n            } else if (colorMapByIndex && colorMapByIndex.length > valuenum) {\r\n                color = colorMapByIndex[valuenum];\r\n            }\r\n            return $.isArray(color) ? color[stacknum % color.length] : color;\r\n        },\r\n\r\n        /**\r\n         * Render bar(s) for a region\r\n         */\r\n        renderRegion: function (valuenum, highlight) {\r\n            let vals = this.values[valuenum],\r\n                options = this.options,\r\n                xaxisOffset = this.xaxisOffset,\r\n                result = [],\r\n                range = this.range,\r\n                stacked = this.stacked,\r\n                target = this.target,\r\n                x = valuenum * this.totalBarWidth,\r\n                canvasHeightEf = this.canvasHeightEf,\r\n                yoffset = this.yoffset,\r\n                y, height, color, isNull, yoffsetNeg, i, valcount, val, minPlotted, allMin;\r\n\r\n            vals = $.isArray(vals) ? vals : [vals];\r\n            valcount = vals.length;\r\n            val = vals[0];\r\n            isNull = all(null, vals);\r\n            allMin = all(xaxisOffset, vals, true);\r\n\r\n            if (isNull) {\r\n                if (options.get('nullColor')) {\r\n                    color = highlight ? options.get('nullColor') : this.calcHighlightColor(options.get('nullColor'), options);\r\n                    y = (yoffset > 0) ? yoffset - 1 : yoffset;\r\n                    return target.drawRect(x, y, this.barWidth - 1, 0, color, color);\r\n                } else {\r\n                    return undefined;\r\n                }\r\n            }\r\n            yoffsetNeg = yoffset;\r\n            if(this.isNeg){\r\n                canvasHeightEf = Math.floor(canvasHeightEf/2);\r\n            }\r\n            for (i = 0; i < valcount; i++) {\r\n                val = vals[i];\r\n\r\n                if (stacked && val === xaxisOffset) {\r\n                    if (!allMin || minPlotted) {\r\n                        continue;\r\n                    }\r\n                    minPlotted = true;\r\n                }\r\n\r\n                if (range > 0) {\r\n                    height = Math.floor(canvasHeightEf * ((Math.abs(val - xaxisOffset) / range)));\r\n                } else {\r\n                    height = canvasHeightEf;\r\n                }\r\n\r\n                if (val < xaxisOffset || (val === xaxisOffset && yoffset === 0)) {\r\n                    y = yoffsetNeg;\r\n                    yoffsetNeg += height;\r\n                } else {\r\n                    y = yoffset - height;\r\n                    yoffset -= height;\r\n                }\r\n                color = this.calcColor(i, val, valuenum);\r\n                if (highlight) {\r\n                    color = this.calcHighlightColor(color, options);\r\n                }\r\n                result.push(target.drawRect(x, y, this.barWidth - 1, height - 1, color, color));\r\n            }\r\n            if (result.length === 1) {\r\n                return result[0];\r\n            }\r\n            return result;\r\n        }\r\n    },\r\n    tristate:{\r\n        type: 'tristate',\r\n        init: function(el, values) {\r\n            let options = this.options;\r\n            let width = el.mergedOptions.width;\r\n            let height = el.mergedOptions.height;\r\n\r\n            this.canvasWidth = el.mergedOptions.width;\r\n            this.canvasHeight = el.mergedOptions.height;\r\n\r\n            let barWidth = parseInt(options.get('barWidth'), 10),\r\n                barSpacing = parseInt(options.get('barSpacing'), 10);\r\n            //tristate._super.init.call(this, el, values, options, width, height);\r\n\r\n            this.regionShapes = {};\r\n            this.barWidth = barWidth;\r\n            this.barSpacing = barSpacing;\r\n            this.totalBarWidth = barWidth + barSpacing;\r\n            this.values = $.map(values, Number);\r\n            this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing);\r\n\r\n            if ($.isArray(options.get('colorMap'))) {\r\n                this.colorMapByIndex = options.get('colorMap');\r\n                this.colorMapByValue = null;\r\n            } else {\r\n                this.colorMapByIndex = null;\r\n                this.colorMapByValue = options.get('colorMap');\r\n                if (this.colorMapByValue && this.colorMapByValue.get === undefined) {\r\n                    this.colorMapByValue = new RangeMap(this.colorMapByValue);\r\n                }\r\n            }\r\n            //this.initTarget();\r\n        },\r\n\r\n        getRegion: function (el, x, y) {\r\n            return Math.floor(x / this.totalBarWidth);\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion;\r\n            return {\r\n                isNull: this.values[currentRegion] === undefined,\r\n                value: this.values[currentRegion],\r\n                color: this.calcColor(this.values[currentRegion], currentRegion),\r\n                offset: currentRegion\r\n            };\r\n        },\r\n\r\n        calcColor: function (value, valuenum) {\r\n            let values = this.values,\r\n                options = this.options,\r\n                colorMapByIndex = this.colorMapByIndex,\r\n                colorMapByValue = this.colorMapByValue,\r\n                color, newColor;\r\n\r\n            if (colorMapByValue && (newColor = colorMapByValue.get(value))) {\r\n                color = newColor;\r\n            } else if (colorMapByIndex && colorMapByIndex.length > valuenum) {\r\n                color = colorMapByIndex[valuenum];\r\n            } else if (values[valuenum] < 0) {\r\n                color = options.get('negBarColor');\r\n            } else if (values[valuenum] > 0) {\r\n                color = options.get('posBarColor');\r\n            } else {\r\n                color = options.get('zeroBarColor');\r\n            }\r\n            return color;\r\n        },\r\n\r\n        renderRegion: function (valuenum, highlight) {\r\n            let values = this.values,\r\n                options = this.options,\r\n                target = this.target,\r\n                canvasHeight, height, halfHeight,\r\n                x, y, color;\r\n\r\n            canvasHeight = this.canvasHeight;\r\n            halfHeight = Math.round(canvasHeight / 2);\r\n\r\n            x = valuenum * this.totalBarWidth;\r\n            if (values[valuenum] < 0) {\r\n                y = halfHeight;\r\n                height = halfHeight - 1;\r\n            } else if (values[valuenum] > 0) {\r\n                y = 0;\r\n                height = halfHeight - 1;\r\n            } else {\r\n                y = halfHeight - 1;\r\n                height = 2;\r\n            }\r\n            color = this.calcColor(values[valuenum], valuenum);\r\n            if (color === null) {\r\n                return;\r\n            }\r\n            if (highlight) {\r\n                color = this.calcHighlightColor(color, options);\r\n            }\r\n            return target.drawRect(x, y, this.barWidth - 1, height - 1, color, color);\r\n        }\r\n    },\r\n    discrete:{\r\n        type: 'discrete',\r\n\r\n        init: function(el, values) {\r\n            let options = this.options;\r\n            let width = el.mergedOptions.width;\r\n            let height = el.mergedOptions.height;\r\n\r\n            this.canvasWidth = el.mergedOptions.width;\r\n            this.canvasHeight = el.mergedOptions.height;\r\n\r\n            this.regionShapes = {};\r\n            this.values = values = $.map(values, Number);\r\n            this.min = Math.min.apply(Math, values);\r\n            this.max = Math.max.apply(Math, values);\r\n            this.range = this.max - this.min;\r\n            this.width = width;\r\n            this.interval = Math.floor(width / values.length);\r\n            this.itemWidth = width / values.length;\r\n            if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.min)) {\r\n                this.min = options.get('chartRangeMin');\r\n            }\r\n            if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.max)) {\r\n                this.max = options.get('chartRangeMax');\r\n            }\r\n            //this.initTarget();\r\n            if (this.target) {\r\n                this.lineHeight = options.get('lineHeight') === 'auto' ? Math.round(this.canvasHeight * 0.3) : options.get('lineHeight');\r\n            }\r\n        },\r\n\r\n        getRegion: function (el, x, y) {\r\n            return Math.floor(x / this.itemWidth);\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion;\r\n            return {\r\n                isNull: this.values[currentRegion] === undefined,\r\n                value: this.values[currentRegion],\r\n                offset: currentRegion\r\n            };\r\n        },\r\n\r\n        renderRegion: function (valuenum, highlight) {\r\n            let values = this.values,\r\n                options = this.options,\r\n                min = this.min,\r\n                max = this.max,\r\n                range = this.range,\r\n                interval = this.interval,\r\n                target = this.target,\r\n                canvasHeight = this.canvasHeight,\r\n                lineHeight = this.lineHeight,\r\n                pheight = canvasHeight - lineHeight,\r\n                ytop, val, color, x;\r\n\r\n            val = clipval(values[valuenum], min, max);\r\n            x = valuenum * interval;\r\n            ytop = Math.round(pheight - pheight * ((val - min) / range));\r\n            color = (options.get('thresholdColor') && val < options.get('thresholdValue')) ? options.get('thresholdColor') : options.get('lineColor');\r\n            if (highlight) {\r\n                color = this.calcHighlightColor(color, options);\r\n            }\r\n            //return target.drawLine(x, ytop, x, ytop + lineHeight, color);\r\n\r\n            return this.target.drawRect(x, ytop, interval<=2?1:interval-2, lineHeight, color, color);\r\n        }\r\n    },\r\n    bullet:{\r\n        type: 'bullet',\r\n        init: function(el, values) {\r\n\r\n            let options = this.options;\r\n            let width = el.mergedOptions.width;\r\n            let height = el.mergedOptions.height;\r\n\r\n            this.canvasWidth = el.mergedOptions.width;\r\n            this.canvasHeight = el.mergedOptions.height;\r\n\r\n            let min, max, vals;\r\n            //bullet._super.init.call(this, el, values, options, width, height);\r\n\r\n            // values: target, performance, range1, range2, range3\r\n            this.values = values = normalizeValues(values);\r\n            // target or performance could be null\r\n            vals = values.slice();\r\n            vals[0] = vals[0] === null ? vals[2] : vals[0];\r\n            vals[1] = values[1] === null ? vals[2] : vals[1];\r\n            min = Math.min.apply(Math, values);\r\n            max = Math.max.apply(Math, values);\r\n            if (options.get('base') === undefined) {\r\n                min = min < 0 ? min : 0;\r\n            } else {\r\n                min = options.get('base');\r\n            }\r\n            this.min = min;\r\n            this.max = max;\r\n            this.range = max - min;\r\n            this.shapes = {};\r\n            this.valueShapes = {};\r\n            this.regiondata = {};\r\n            this.width = width;\r\n            //this.target = this.$el.simpledraw(width, height, options.get('composite'));\r\n            if (!values.length) {\r\n                this.disabled = true;\r\n            }\r\n            //this.initTarget();\r\n        },\r\n\r\n        getRegion: function (el, x, y) {\r\n            let shapeid = this.target.getShapeAt(el, x, y);\r\n            return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined;\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion;\r\n            return {\r\n                fieldkey: currentRegion.substr(0, 1),\r\n                value: this.values[currentRegion.substr(1)],\r\n                region: currentRegion\r\n            };\r\n        },\r\n\r\n        changeHighlight: function (highlight) {\r\n            let currentRegion = this.currentRegion,\r\n                shapeid = this.valueShapes[currentRegion],\r\n                shape;\r\n            delete this.shapes[shapeid];\r\n            switch (currentRegion.substr(0, 1)) {\r\n                case 'r':\r\n                    shape = this.renderRange(currentRegion.substr(1), highlight);\r\n                    break;\r\n                case 'p':\r\n                    shape = this.renderPerformance(highlight);\r\n                    break;\r\n                case 't':\r\n                    shape = this.renderTarget(highlight);\r\n                    break;\r\n            }\r\n            this.valueShapes[currentRegion] = shape.id;\r\n            this.shapes[shape.id] = currentRegion;\r\n            this.target.replaceWithShape(shapeid, shape);\r\n        },\r\n\r\n        renderRange: function (rn, highlight) {\r\n            let rangeval = this.values[rn],\r\n                rangewidth = Math.round(this.canvasWidth * ((rangeval - this.min) / this.range)),\r\n                color = this.options.get('rangeColors')[rn - 2];\r\n            if (highlight) {\r\n                color = this.calcHighlightColor(color, this.options);\r\n            }\r\n            return this.target.drawRect(0, 0, rangewidth - 1, this.canvasHeight - 1, color, color);\r\n        },\r\n\r\n        renderPerformance: function (highlight) {\r\n            let perfval = this.values[1],\r\n                perfwidth = Math.round(this.canvasWidth * ((perfval - this.min) / this.range)),\r\n                color = this.options.get('performanceColor');\r\n            if (highlight) {\r\n                color = this.calcHighlightColor(color, this.options);\r\n            }\r\n            return this.target.drawRect(0, Math.round(this.canvasHeight * 0.3), perfwidth - 1,\r\n                Math.round(this.canvasHeight * 0.4) - 1, color, color);\r\n        },\r\n\r\n        renderTarget: function (highlight) {\r\n            let targetval = this.values[0],\r\n                x = Math.round(this.canvasWidth * ((targetval - this.min) / this.range) - (this.options.get('targetWidth') / 2)),\r\n                targettop = Math.round(this.canvasHeight * 0.10),\r\n                targetheight = this.canvasHeight - (targettop * 2),\r\n                color = this.options.get('targetColor');\r\n            if (highlight) {\r\n                color = this.calcHighlightColor(color, this.options);\r\n            }\r\n            return this.target.drawRect(x, targettop, this.options.get('targetWidth') - 1, targetheight - 1, color, color);\r\n        },\r\n\r\n        render: function (el,userValues) {\r\n            this.init(el,userValues);\r\n            let vlen = this.values.length,\r\n                target = this.target,\r\n                i, shape;\r\n            // if (!bullet._super.render.call(this)) {\r\n            //     return;\r\n            // }\r\n            for (i = 2; i < vlen; i++) {\r\n                shape = this.renderRange(i).append();\r\n                this.shapes[shape.id] = 'r' + i;\r\n                this.valueShapes['r' + i] = shape.id;\r\n            }\r\n            if (this.values[1] !== null) {\r\n                shape = this.renderPerformance().append();\r\n                this.shapes[shape.id] = 'p1';\r\n                this.valueShapes.p1 = shape.id;\r\n            }\r\n            if (this.values[0] !== null) {\r\n                shape = this.renderTarget().append();\r\n                this.shapes[shape.id] = 't0';\r\n                this.valueShapes.t0 = shape.id;\r\n            }\r\n            //target.render();\r\n        }\r\n    },\r\n    pie:{\r\n        type: 'pie',\r\n\r\n        init: function(el, values) {\r\n\r\n            let options = this.options;\r\n            let width = el.mergedOptions.width;\r\n            let height = el.mergedOptions.height;\r\n\r\n            this.canvasWidth = el.mergedOptions.width;\r\n            this.canvasHeight = el.mergedOptions.height;\r\n\r\n            let total = 0, i;\r\n\r\n            //pie._super.init.call(this, el, values, options, width, height);\r\n\r\n            this.shapes = {}; // map shape ids to value offsets\r\n            this.valueShapes = {}; // maps value offsets to shape ids\r\n            this.values = values = $.map(values, Number);\r\n\r\n            if (options.get('width') === 'auto') {\r\n                this.width = this.height;\r\n            }\r\n\r\n            if (values.length > 0) {\r\n                for (i = values.length; i--;) {\r\n                    total += values[i];\r\n                }\r\n            }\r\n            this.total = total;\r\n            //this.initTarget();\r\n            this.radius = Math.floor(Math.min(this.canvasWidth, this.canvasHeight) / 2);\r\n        },\r\n\r\n        getRegion: function (el, x, y) {\r\n            let shapeid = this.target.getShapeAt(el, x, y);\r\n            return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined;\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let currentRegion = this.currentRegion;\r\n            return {\r\n                isNull: this.values[currentRegion] === undefined,\r\n                value: this.values[currentRegion],\r\n                percent: this.values[currentRegion] / this.total * 100,\r\n                color: this.options.get('sliceColors')[currentRegion % this.options.get('sliceColors').length],\r\n                offset: currentRegion\r\n            };\r\n        },\r\n\r\n        changeHighlight: function (highlight) {\r\n            let currentRegion = this.currentRegion,\r\n                    newslice = this.renderSlice(currentRegion, highlight),\r\n                    shapeid = this.valueShapes[currentRegion];\r\n            delete this.shapes[shapeid];\r\n            this.target.replaceWithShape(shapeid, newslice);\r\n            this.valueShapes[currentRegion] = newslice.id;\r\n            this.shapes[newslice.id] = currentRegion;\r\n        },\r\n\r\n        renderSlice: function (valuenum, highlight) {\r\n            let target = this.target,\r\n                options = this.options,\r\n                radius = this.radius,\r\n                borderWidth = options.get('borderWidth'),\r\n                offset = options.get('offset'),\r\n                circle = 2 * Math.PI,\r\n                values = this.values,\r\n                total = this.total,\r\n                next = offset ? (2*Math.PI)*(offset/360) : 0,\r\n                start, end, i, vlen, color;\r\n\r\n            vlen = values.length;\r\n            for (i = 0; i < vlen; i++) {\r\n                start = next;\r\n                end = next;\r\n                if (total > 0) {  // avoid divide by zero\r\n                    end = next + (circle * (values[i] / total));\r\n                }\r\n                if (valuenum === i) {\r\n                    color = options.get('sliceColors')[i % options.get('sliceColors').length];\r\n                    if (highlight) {\r\n                        color = this.calcHighlightColor(color, options);\r\n                    }\r\n\r\n                    return target.drawPieSlice(radius, radius, radius - borderWidth, start, end, undefined, color);\r\n                }\r\n                next = end;\r\n            }\r\n        },\r\n\r\n        render: function (el,userValues) {\r\n            this.init(el,userValues);\r\n            let target = this.target,\r\n                values = this.values,\r\n                options = this.options,\r\n                radius = this.radius,\r\n                borderWidth = options.get('borderWidth'),\r\n                shape, i;\r\n\r\n            // if (!pie._super.render.call(this)) {\r\n            //     return;\r\n            // }\r\n            if (borderWidth) {\r\n                target.drawCircle(radius, radius, Math.floor(radius - (borderWidth / 2)),\r\n                    options.get('borderColor'), undefined, borderWidth).append();\r\n            }\r\n            for (i = values.length; i--;) {\r\n                if (values[i]) { // don't render zero values\r\n                    shape = this.renderSlice(i).append();\r\n                    this.valueShapes[i] = shape.id; // store just the shapeid\r\n                    this.shapes[shape.id] = i;\r\n                }\r\n            }\r\n            //target.render();\r\n        }\r\n    },\r\n    box:{\r\n        type: 'box',\r\n\r\n        init: function(el, values) {\r\n\r\n            let options = this.options;\r\n            let width = el.mergedOptions.width;\r\n            let height = el.mergedOptions.height;\r\n\r\n            this.canvasWidth = el.mergedOptions.width;\r\n            this.canvasHeight = el.mergedOptions.height;\r\n\r\n            //box._super.init.call(this, el, values, options, width, height);\r\n            this.values = $.map(values, Number);\r\n            this.width = options.get('width') === 'auto' ? '4.0em' : width;\r\n            //this.initTarget();\r\n            if (!this.values.length) {\r\n                this.disabled = 1;\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Simulate a single region\r\n         */\r\n        getRegion: function () {\r\n            return 1;\r\n        },\r\n\r\n        getCurrentRegionFields: function () {\r\n            let result = [\r\n                { field: 'lq', value: this.quartiles[0] },\r\n                { field: 'med', value: this.quartiles[1] },\r\n                { field: 'uq', value: this.quartiles[2] }\r\n            ];\r\n            if (this.loutlier !== undefined) {\r\n                result.push({ field: 'lo', value: this.loutlier});\r\n            }\r\n            if (this.routlier !== undefined) {\r\n                result.push({ field: 'ro', value: this.routlier});\r\n            }\r\n            if (this.lwhisker !== undefined) {\r\n                result.push({ field: 'lw', value: this.lwhisker});\r\n            }\r\n            if (this.rwhisker !== undefined) {\r\n                result.push({ field: 'rw', value: this.rwhisker});\r\n            }\r\n            return result;\r\n        },\r\n\r\n        render:  function (el,userValues) {\r\n            this.init(el,userValues);\r\n\r\n            let target = this.target,\r\n                values = this.values,\r\n                vlen = values.length,\r\n                options = this.options,\r\n                canvasWidth = this.canvasWidth,\r\n                canvasHeight = this.canvasHeight,\r\n                minValue = options.get('chartRangeMin') === undefined ? Math.min.apply(Math, values) : options.get('chartRangeMin'),\r\n                maxValue = options.get('chartRangeMax') === undefined ? Math.max.apply(Math, values) : options.get('chartRangeMax'),\r\n                canvasLeft = 0,\r\n                lwhisker, loutlier, iqr, q1, q2, q3, rwhisker, routlier, i,\r\n                size, unitSize;\r\n\r\n            // if (!box._super.render.call(this)) {\r\n            //     return;\r\n            // }\r\n\r\n            if (options.get('raw')) {\r\n                if (options.get('showOutliers') && values.length > 5) {\r\n                    loutlier = values[0];\r\n                    lwhisker = values[1];\r\n                    q1 = values[2];\r\n                    q2 = values[3];\r\n                    q3 = values[4];\r\n                    rwhisker = values[5];\r\n                    routlier = values[6];\r\n                } else {\r\n                    lwhisker = values[0];\r\n                    q1 = values[1];\r\n                    q2 = values[2];\r\n                    q3 = values[3];\r\n                    rwhisker = values[4];\r\n                }\r\n            } else {\r\n                values.sort(function (a, b) { return a - b; });\r\n                q1 = quartile(values, 1);\r\n                q2 = quartile(values, 2);\r\n                q3 = quartile(values, 3);\r\n                iqr = q3 - q1;\r\n                if (options.get('showOutliers')) {\r\n                    lwhisker = rwhisker = undefined;\r\n                    for (i = 0; i < vlen; i++) {\r\n                        if (lwhisker === undefined && values[i] > q1 - (iqr * options.get('outlierIQR'))) {\r\n                            lwhisker = values[i];\r\n                        }\r\n                        if (values[i] < q3 + (iqr * options.get('outlierIQR'))) {\r\n                            rwhisker = values[i];\r\n                        }\r\n                    }\r\n                    loutlier = values[0];\r\n                    routlier = values[vlen - 1];\r\n                } else {\r\n                    lwhisker = values[0];\r\n                    rwhisker = values[vlen - 1];\r\n                }\r\n            }\r\n            this.quartiles = [q1, q2, q3];\r\n            this.lwhisker = lwhisker;\r\n            this.rwhisker = rwhisker;\r\n            this.loutlier = loutlier;\r\n            this.routlier = routlier;\r\n\r\n            unitSize = canvasWidth / (maxValue - minValue + 1);\r\n            if (options.get('showOutliers')) {\r\n                canvasLeft = Math.ceil(options.get('spotRadius'));\r\n                canvasWidth -= 2 * Math.ceil(options.get('spotRadius'));\r\n                unitSize = canvasWidth / (maxValue - minValue + 1);\r\n                if (loutlier < lwhisker) {\r\n                    target.drawCircle((loutlier - minValue) * unitSize + canvasLeft,\r\n                        canvasHeight / 2,\r\n                        options.get('spotRadius'),\r\n                        options.get('outlierLineColor'),\r\n                        options.get('outlierFillColor')).append();\r\n                }\r\n                if (routlier > rwhisker) {\r\n                    target.drawCircle((routlier - minValue) * unitSize + canvasLeft,\r\n                        canvasHeight / 2,\r\n                        options.get('spotRadius'),\r\n                        options.get('outlierLineColor'),\r\n                        options.get('outlierFillColor')).append();\r\n                }\r\n            }\r\n\r\n            // box\r\n            target.drawRect(\r\n                Math.round((q1 - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight * 0.1),\r\n                Math.round((q3 - q1) * unitSize),\r\n                Math.round(canvasHeight * 0.8),\r\n                options.get('boxLineColor'),\r\n                options.get('boxFillColor')).append();\r\n            // left whisker\r\n            target.drawLine(\r\n                Math.round((lwhisker - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight / 2),\r\n                Math.round((q1 - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight / 2),\r\n                options.get('lineColor')).append();\r\n            target.drawLine(\r\n                Math.round((lwhisker - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight / 4),\r\n                Math.round((lwhisker - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight - canvasHeight / 4),\r\n                options.get('whiskerColor')).append();\r\n            // right whisker\r\n            target.drawLine(Math.round((rwhisker - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight / 2),\r\n                Math.round((q3 - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight / 2),\r\n                options.get('lineColor')).append();\r\n            target.drawLine(\r\n                Math.round((rwhisker - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight / 4),\r\n                Math.round((rwhisker - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight - canvasHeight / 4),\r\n                options.get('whiskerColor')).append();\r\n            // median line\r\n            target.drawLine(\r\n                Math.round((q2 - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight * 0.1),\r\n                Math.round((q2 - minValue) * unitSize + canvasLeft),\r\n                Math.round(canvasHeight * 0.9),\r\n                options.get('medianColor')).append();\r\n            if (options.get('target')) {\r\n                size = Math.ceil(options.get('spotRadius'));\r\n                target.drawLine(\r\n                    Math.round((options.get('target') - minValue) * unitSize + canvasLeft),\r\n                    Math.round((canvasHeight / 2) - size),\r\n                    Math.round((options.get('target') - minValue) * unitSize + canvasLeft),\r\n                    Math.round((canvasHeight / 2) + size),\r\n                    options.get('targetColor')).append();\r\n                target.drawLine(\r\n                    Math.round((options.get('target') - minValue) * unitSize + canvasLeft - size),\r\n                    Math.round(canvasHeight / 2),\r\n                    Math.round((options.get('target') - minValue) * unitSize + canvasLeft + size),\r\n                    Math.round(canvasHeight / 2),\r\n                    options.get('targetColor')).append();\r\n            }\r\n            //target.render();\r\n        }\r\n    },\r\n    shapeCount:0,\r\n    shapes:{},\r\n    shapeseq:[],\r\n    lastShapeId:null,\r\n    mergedOptions:null,\r\n    init:function(userValues, userOptions){\r\n        let extendedOptions, defaults, base;\r\n        userOptions = userOptions || {};\r\n        let _this = this;\r\n        defaults = this.defaultOption;\r\n        base = defaults.common;\r\n        extendedOptions = defaults[userOptions.type || base.type];\r\n\r\n        _this.shapeCount = 0;\r\n        _this.shapes = {};\r\n        _this.shapeseq = [];\r\n        _this.lastShapeId = null;\r\n\r\n        _this.mergedOptions = $.extend({}, base, extendedOptions, userOptions);\r\n        _this.mergedOptions.width = _this.mergedOptions.width;\r\n        _this.mergedOptions.height = _this.mergedOptions.height;\r\n        _this[_this.mergedOptions.type].render(_this, userValues);\r\n\r\n        return { shapes:_this.shapes, shapeseq:_this.shapeseq, offsetX:_this.mergedOptions.offsetX, offsetY:_this.mergedOptions.offsetY, pixelWidth:_this.mergedOptions.width, pixelHeight:_this.mergedOptions.height};\r\n\r\n    },\r\n    _getContext: function (lineColor, fillColor, lineWidth) {\r\n        let context;\r\n        if(this.ctx != null){\r\n            context = this.ctx;\r\n        }\r\n        else{\r\n            context = $(\"#\" + this._canvasID ).get(0).getContext('2d');\r\n        }\r\n\r\n        if (lineColor !== undefined) {\r\n            context.strokeStyle = lineColor;\r\n        }\r\n        context.lineWidth = lineWidth === undefined ? 1 : lineWidth;\r\n        if (fillColor !== undefined) {\r\n            context.fillStyle = fillColor;\r\n        }\r\n        return context;\r\n    },\r\n\r\n    reset: function () {\r\n        let context = this._getContext();\r\n        context.clearRect(0, 0, this.pixelWidth, this.pixelHeight);\r\n        this.shapes = {};\r\n        this.shapeseq = [];\r\n        this.currentTargetShapeId = undefined;\r\n    },\r\n\r\n    _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) {\r\n        let context = this._getContext(lineColor, fillColor, lineWidth),\r\n            i, plen;\r\n        context.beginPath();\r\n        context.moveTo(path[0][0] + 0.5 + this.offsetX, path[0][1] + 0.5 + this.offsetY);\r\n        \r\n        for (i = 1, plen = path.length; i < plen; i++) {\r\n            context.lineTo(path[i][0] + 0.5 + this.offsetX, path[i][1] + 0.5 + this.offsetY); // the 0.5 offset gives us crisp pixel-width lines\r\n        }\r\n        if (lineColor !== undefined) {\r\n            context.stroke();\r\n        }\r\n        if (fillColor !== undefined) {\r\n            context.fill();\r\n        }\r\n        if (this.targetX !== undefined && this.targetY !== undefined &&\r\n            context.isPointInPath(this.targetX + this.offsetX, this.targetY + this.offsetY)) {\r\n            this.currentTargetShapeId = shapeid;\r\n        }\r\n    },\r\n\r\n    _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) {\r\n        let context = this._getContext(lineColor, fillColor, lineWidth);\r\n        context.beginPath();\r\n        x+=this.offsetX;\r\n        y+=this.offsetY;\r\n        context.arc(x, y, radius, 0, 2 * Math.PI, false);\r\n        if (this.targetX !== undefined && this.targetY !== undefined &&\r\n            context.isPointInPath(this.targetX+this.offsetX, this.targetY+this.offsetY)) {\r\n            this.currentTargetShapeId = shapeid;\r\n        }\r\n        if (lineColor !== undefined) {\r\n            context.stroke();\r\n        }\r\n        if (fillColor !== undefined) {\r\n            context.fill();\r\n        }\r\n    },\r\n\r\n    _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) {\r\n        let context = this._getContext(lineColor, fillColor);\r\n        x+=this.offsetX;\r\n        y+=this.offsetY;\r\n        context.beginPath();\r\n        context.moveTo(x, y);\r\n        context.arc(x, y, radius, startAngle, endAngle, false);\r\n        context.lineTo(x, y);\r\n        context.closePath();\r\n        if (lineColor !== undefined) {\r\n            context.stroke();\r\n        }\r\n        if (fillColor) {\r\n            context.fill();\r\n        }\r\n        if (this.targetX !== undefined && this.targetY !== undefined &&\r\n            context.isPointInPath(this.targetX+this.offsetX, this.targetY+this.offsetY)) {\r\n            this.currentTargetShapeId = shapeid;\r\n        }\r\n    },\r\n\r\n    _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) {\r\n        // x+=this.offsetX;\r\n        // y+=this.offsetY;\r\n        return this._drawShape(shapeid, [[x, y], [x + width, y], [x + width, y + height], [x, y + height], [x, y]], lineColor, fillColor);\r\n    },\r\n\r\n    appendShape: function (shape) {\r\n        this.shapes[shape.id] = shape;\r\n        this.shapeseq.push(shape.id);\r\n        this.lastShapeId = shape.id;\r\n        return shape.id;\r\n    },\r\n\r\n    replaceWithShape: function (shapeid, shape) {\r\n        let shapeseq = this.shapeseq,\r\n            i;\r\n        this.shapes[shape.id] = shape;\r\n        for (i = shapeseq.length; i--;) {\r\n            if (shapeseq[i] == shapeid) {\r\n                shapeseq[i] = shape.id;\r\n            }\r\n        }\r\n        delete this.shapes[shapeid];\r\n    },\r\n\r\n    replaceWithShapes: function (shapeids, shapes) {\r\n        let shapeseq = this.shapeseq,\r\n            shapemap = {},\r\n            sid, i, first;\r\n\r\n        for (i = shapeids.length; i--;) {\r\n            shapemap[shapeids[i]] = true;\r\n        }\r\n        for (i = shapeseq.length; i--;) {\r\n            sid = shapeseq[i];\r\n            if (shapemap[sid]) {\r\n                shapeseq.splice(i, 1);\r\n                delete this.shapes[sid];\r\n                first = i;\r\n            }\r\n        }\r\n        for (i = shapes.length; i--;) {\r\n            shapeseq.splice(first, 0, shapes[i].id);\r\n            this.shapes[shapes[i].id] = shapes[i];\r\n        }\r\n\r\n    },\r\n\r\n    insertAfterShape: function (shapeid, shape) {\r\n        let shapeseq = this.shapeseq,\r\n            i;\r\n        for (i = shapeseq.length; i--;) {\r\n            if (shapeseq[i] === shapeid) {\r\n                shapeseq.splice(i + 1, 0, shape.id);\r\n                this.shapes[shape.id] = shape;\r\n                return;\r\n            }\r\n        }\r\n    },\r\n\r\n    removeShapeId: function (shapeid) {\r\n        let shapeseq = this.shapeseq,\r\n            i;\r\n        for (i = shapeseq.length; i--;) {\r\n            if (shapeseq[i] === shapeid) {\r\n                shapeseq.splice(i, 1);\r\n                break;\r\n            }\r\n        }\r\n        delete this.shapes[shapeid];\r\n    },\r\n\r\n    getShapeAt: function (el, x, y) {\r\n        this.targetX = x;\r\n        this.targetY = y;\r\n        this.render();\r\n        return this.currentTargetShapeId;\r\n    },\r\n    _canvasID:\"luckysheetTableContent\",\r\n    render: function (shapeseq, shapes, offsetX, offsetY, pixelWidth, pixelHeight,canvasid,ctx) {\r\n        if(canvasid==null){\r\n            canvasid = \"luckysheetTableContent\";\r\n        }\r\n        this._canvasID = canvasid;\r\n\r\n        if(ctx != null){\r\n            this.ctx = ctx;\r\n        }\r\n\r\n        let shapeCount = shapeseq.length,\r\n            context = this._getContext(),\r\n            shapeid, shape, i;\r\n        this.offsetX = offsetX;\r\n        this.offsetY = offsetY;\r\n        this.pixelWidth = pixelWidth;\r\n        this.pixelHeight = pixelHeight;\r\n        //context.clearRect(this.offsetX, this.offsetY, this.pixelWidth, this.pixelHeight);\r\n\r\n        // qkSparkSetting.currentSparkVlaue = {\r\n        //     shapeseq : shapeseq,\r\n        //     shapes:shapes,\r\n        //     shapeCount:shapeCount,\r\n        //     el:this\r\n        // }\r\n\r\n        for (i = 0; i < shapeCount; i++) {\r\n            shapeid = shapeseq[i];\r\n            shape = shapes[shapeid];\r\n            this['_draw' + shape.type].apply(this, shape.args);\r\n        }\r\n        // if (!this.interact) {\r\n        //     // not interactive so no need to keep the shapes array\r\n        //     this.shapes = {};\r\n        //     this.shapeseq = [];\r\n        // }\r\n    },\r\n    drawLine: function (x1, y1, x2, y2, lineColor, lineWidth) {\r\n        return this.drawShape([[x1, y1], [x2, y2]], lineColor, lineWidth);\r\n    },\r\n\r\n    drawShape: function (path, lineColor, fillColor, lineWidth) {\r\n        return this._genShape('Shape', [path, lineColor, fillColor, lineWidth]);\r\n    },\r\n\r\n    drawCircle: function (x, y, radius, lineColor, fillColor, lineWidth) {\r\n        return this._genShape('Circle', [x, y, radius, lineColor, fillColor, lineWidth]);\r\n    },\r\n\r\n    drawPieSlice: function (x, y, radius, startAngle, endAngle, lineColor, fillColor) {\r\n        return this._genShape('PieSlice', [x, y, radius, startAngle, endAngle, lineColor, fillColor]);\r\n    },\r\n\r\n    drawRect: function (x, y, width, height, lineColor, fillColor) {\r\n        return this._genShape('Rect', [x, y, width, height, lineColor, fillColor]);\r\n    },\r\n    _genShape: function (shapetype, shapeargs) {\r\n        let id = this.shapeCount++;\r\n        shapeargs.unshift(id);\r\n        // return new VShape(this, id, shapetype, shapeargs);\r\n        // this.target = target;\r\n        // this.id = id;\r\n        // this.type = type;\r\n        // this.args = args;\r\n        let shape = { id:id, type:shapetype, args:shapeargs };\r\n        this.shapes[id] = shape;\r\n        this.shapeseq.push(id);\r\n        this.lastShapeId = id;\r\n        return {\r\n            append:function(){\r\n                return shape;\r\n            },\r\n            get:function(){\r\n                return id;\r\n            }\r\n        };\r\n    }\r\n\r\n}\r\n\r\nlet barHighlightMixin = {\r\n    changeHighlight: function (highlight) {\r\n        let currentRegion = this.currentRegion,\r\n            target = this.target,\r\n            shapeids = this.regionShapes[currentRegion],\r\n            newShapes;\r\n        // will be null if the region value was null\r\n        if (shapeids) {\r\n            newShapes = this.renderRegion(currentRegion, highlight);\r\n            if ($.isArray(newShapes) || $.isArray(shapeids)) {\r\n                target.replaceWithShapes(shapeids, newShapes);\r\n                this.regionShapes[currentRegion] = $.map(newShapes, function (newShape) {\r\n                    return newShape.id;\r\n                });\r\n            } else {\r\n                target.replaceWithShape(shapeids, newShapes);\r\n                this.regionShapes[currentRegion] = newShapes.id;\r\n            }\r\n        }\r\n    },\r\n    render: function (el,userValues) {\r\n        this.init(el, userValues);\r\n        let values = this.values,\r\n            target = this.target,\r\n            regionShapes = this.regionShapes,\r\n            shapes, ids, i, j;\r\n\r\n        // if (!this.cls._super.render.call(this)) {\r\n        //     return;\r\n        // }\r\n        for (i = values.length; i--;) {\r\n            shapes = this.renderRegion(i);\r\n            if (shapes) {\r\n                if ($.isArray(shapes)) {\r\n                    ids = [];\r\n                    for (j = shapes.length; j--;) {\r\n                        shapes[j].append();\r\n                        ids.push(shapes[j].id);\r\n                    }\r\n                    regionShapes[i] = ids;\r\n                } else {\r\n                    shapes.append();\r\n                    regionShapes[i] = shapes.id; // store just the shapeid\r\n                }\r\n            } else {\r\n                // null value\r\n                regionShapes[i] = null;\r\n            }\r\n        }\r\n        //target.render();\r\n    }\r\n};\r\n\r\nlet _luckysheetSparkLineOptions = {\r\n    get:function(type){\r\n        return luckysheetSparkline.mergedOptions[type];\r\n    }\r\n}\r\n\r\nlet _luckysheetSparkLineTarget = {\r\n    drawLine:function(x1, y1, x2, y2, lineColor, lineWidth){\r\n        return luckysheetSparkline.drawLine(x1, y1, x2, y2, lineColor, lineWidth);\r\n    },\r\n\r\n    drawShape:function(path, lineColor, fillColor, lineWidth){\r\n        return luckysheetSparkline.drawShape(path, lineColor, fillColor, lineWidth);\r\n    },\r\n\r\n    drawCircle:function(x, y, radius, lineColor, fillColor, lineWidth){\r\n        return luckysheetSparkline.drawCircle(x, y, radius, lineColor, fillColor, lineWidth);\r\n    },\r\n\r\n    drawPieSlice:function(x, y, radius, startAngle, endAngle, lineColor, fillColor){\r\n        return luckysheetSparkline.drawPieSlice(x, y, radius, startAngle, endAngle, lineColor, fillColor);\r\n    },\r\n\r\n    drawRect:function(x, y, width, height, lineColor, fillColor){\r\n        return luckysheetSparkline.drawRect(x, y, width, height, lineColor, fillColor);\r\n    }\r\n}\r\n\r\nfor(let item in luckysheetSparkline){\r\n    if(item in {\"line\":null, \"bar\":null, \"column\":null, \"tristate\":null, \"discrete\":null, \"bullet\":null, \"pie\":null, \"box\":null}){\r\n        luckysheetSparkline[item].options = _luckysheetSparkLineOptions;\r\n        luckysheetSparkline[item].target = _luckysheetSparkLineTarget;\r\n    }\r\n\r\n    if(item in {\"bar\":null, \"column\":null, \"tristate\":null, \"discrete\":null}){\r\n        luckysheetSparkline[item].changeHighlight = barHighlightMixin.changeHighlight;\r\n        luckysheetSparkline[item].render = barHighlightMixin.render;\r\n    }\r\n}\r\n\r\nexport default luckysheetSparkline;\r\n"
  },
  {
    "path": "src/controllers/splitColumn.js",
    "content": "import { replaceHtml } from '../utils/util';\r\nimport { modelHTML } from './constant';\r\nimport { selectHightlightShow } from './select';\r\nimport tooltip from '../global/tooltip';\r\nimport editor from '../global/editor';\r\nimport { setcellvalue } from '../global/setdata';\r\nimport { getcellvalue } from '../global/getdata';\r\nimport { jfrefreshgrid } from '../global/refresh';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\n//分列\r\nconst luckysheetSplitColumn = {\r\n    createDialog: function(){\r\n        let _this = this;\r\n\r\n        const _locale = locale();\r\n        const locale_splitText = _locale.splitText;\r\n        const locale_punctuation = _locale.punctuation;\r\n        const locale_button = _locale.button;\r\n\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-splitColumn-dialog\").remove();\r\n\r\n        let content = '<div class=\"box\">' +\r\n                        '<div class=\"boxTitle\">'+locale_splitText.splitDelimiters+'</div>' +\r\n                        '<div class=\"boxMain\">' +\r\n                            '<div style=\"height: 22px;line-height: 22px;\">' +\r\n                                '<input id=\"splitColumn_type_01\" type=\"checkbox\"/>' +\r\n                                '<label for=\"splitColumn_type_01\">'+ locale_punctuation.tab +'</label>' +\r\n                            '</div>' +\r\n                            '<div style=\"height: 22px;line-height: 22px;\">' +\r\n                                '<input id=\"splitColumn_type_02\" type=\"checkbox\"/>' +\r\n                                '<label for=\"splitColumn_type_02\">'+ locale_punctuation.semicolon +'</label>' +\r\n                            '</div>' +\r\n                            '<div style=\"height: 22px;line-height: 22px;\">' +\r\n                                '<input id=\"splitColumn_type_03\" type=\"checkbox\"/>' +\r\n                                '<label for=\"splitColumn_type_03\">'+ locale_punctuation.comma +'</label>' +\r\n                            '</div>' +\r\n                            '<div style=\"height: 22px;line-height: 22px;\">' +\r\n                                '<input id=\"splitColumn_type_04\" type=\"checkbox\"/>' +\r\n                                '<label for=\"splitColumn_type_04\">'+ locale_punctuation.space +'</label>' +\r\n                            '</div>' +\r\n                            '<div style=\"height: 22px;line-height: 22px;\">' +\r\n                                '<input id=\"splitColumn_type_05\" type=\"checkbox\"/>' +\r\n                                '<label for=\"splitColumn_type_05\">'+ locale_splitText.splitOther +'</label>' +\r\n                                '<input type=\"text\" class=\"formulaInputFocus\" maxlength=\"1\"/>' +\r\n                            '</div>' +\r\n                        '</div>' +\r\n                        '<div style=\"height: 22px;line-height: 22px;\">' +\r\n                            '<input id=\"splitColumn_type_06\" type=\"checkbox\"/>' +\r\n                            '<label for=\"splitColumn_type_06\">'+ locale_splitText.splitContinueSymbol +'</label>' +\r\n                        '</div>' +\r\n                        '<div class=\"boxTitle\" style=\"margin-top: 10px;\">'+ locale_splitText.splitDataPreview +'</div>' +\r\n                        '<div class=\"boxMain\" id=\"splitColumnData\">' +\r\n\r\n                        '</div>' +\r\n                      '</div>';\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-splitColumn-dialog\", \r\n            \"addclass\": \"luckysheet-splitColumn-dialog\", \r\n            \"title\": locale_splitText.splitTextTitle, \r\n            \"content\": content, \r\n            \"botton\": '<button id=\"luckysheet-splitColumn-dialog-confirm\" class=\"btn btn-primary\">'+ locale_button.confirm +'</button><button class=\"btn btn-default luckysheet-model-close-btn\">'+ locale_button.cancel +'</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-splitColumn-dialog\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 400).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-splitColumn-dialog\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n\r\n        let dataArr = _this.getDataArr();\r\n        _this.dataPreview(dataArr);\r\n    },\r\n    init: function(){\r\n        let _this = this;\r\n        const _locale = locale();\r\n        const locale_splitText = _locale.splitText;\r\n\r\n        //数据预览\r\n        $(document).off(\"change.SPCinpcheckbox\").on(\"change.SPCcheckbox\", \"#luckysheet-splitColumn-dialog .box input[type='checkbox']\", function(){\r\n            let regStr = _this.getRegStr();\r\n            let dataArr = _this.getDataArr(regStr);\r\n            _this.dataPreview(dataArr);\r\n        });\r\n        $(document).off(\"keyup.SPCinptext\").on(\"keyup.SPCinptext\", \"#luckysheet-splitColumn-dialog .box input[type='text']\", function(){\r\n            if($(this).siblings(\"input[type='checkbox']\").is(\":checked\")){\r\n                let regStr = _this.getRegStr();\r\n                let dataArr = _this.getDataArr(regStr);\r\n                _this.dataPreview(dataArr);\r\n            }\r\n        })\r\n\r\n        //确定按钮\r\n        $(document).off(\"click.SPCconfirm\").on(\"click.SPCconfirm\", \"#luckysheet-splitColumn-dialog #luckysheet-splitColumn-dialog-confirm\", function(){\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n            $(\"#luckysheet-splitColumn-dialog\").hide();\r\n\r\n            let regStr = _this.getRegStr();\r\n            let dataArr = _this.getDataArr(regStr);\r\n\r\n            let r = Store.luckysheet_select_save[0].row[0];\r\n            let c = Store.luckysheet_select_save[0].column[0];\r\n\r\n            if(dataArr[0].length == 1){\r\n                return;\r\n            }\r\n\r\n            let dataCover = false;\r\n            for(let i = 0; i < dataArr.length; i++){\r\n                for(let j = 1; j < dataArr[0].length; j++){\r\n                    let cell = Store.flowdata[r + i][c + j];\r\n\r\n                    if(cell != null && cell.v != null){\r\n                        dataCover = true;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(dataCover){\r\n                let func1 = function(){\r\n                    _this.update(r, c, dataArr);\r\n                } \r\n\r\n                tooltip.confirm(\"\", locale_splitText.splitConfirmToExe, func1);\r\n            }\r\n            else{\r\n                _this.update(r, c, dataArr);\r\n            }\r\n        });\r\n    },\r\n    update: function(r, c, dataArr){\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n        for(let i = 0; i < dataArr.length; i++){\r\n            for(let j = 0; j < dataArr[0].length; j++){\r\n                let v = dataArr[i][j];\r\n                setcellvalue(r + i, c + j, d, v);\r\n            }\r\n        }\r\n\r\n        let st_r = Store.luckysheet_select_save[0].row[0], \r\n            st_c = Store.luckysheet_select_save[0].column[0];\r\n\r\n        let range = [{ \"row\": [st_r, st_r + dataArr.length - 1], \"column\": [st_c, st_c + dataArr[0].length - 1] }]\r\n\r\n        jfrefreshgrid(d, range);\r\n        selectHightlightShow();\r\n    },\r\n    dataPreview: function(dataArr){\r\n        $(\"#luckysheet-splitColumn-dialog #splitColumnData\").empty();\r\n\r\n        let trHtml = '';\r\n\r\n        for(let i = 0; i < dataArr.length; i++){\r\n            let tdHtml = '';\r\n\r\n            for(let j = 0; j < dataArr[0].length; j++){\r\n                tdHtml += '<td>' + dataArr[i][j] + '</td>';\r\n            }\r\n\r\n            trHtml += '<tr>' + tdHtml + '</tr>';\r\n        }\r\n\r\n        let tableHtml = '<table>' + trHtml + '</table>';\r\n\r\n        $(\"#luckysheet-splitColumn-dialog #splitColumnData\").append(tableHtml);\r\n    },\r\n    getRegStr: function(){\r\n        let regStr = '', mark = 0;\r\n\r\n        $(\"#luckysheet-splitColumn-dialog .box input[type='checkbox']:checked\").each(function(i, e){\r\n            let $id = $(e).attr(\"id\");\r\n\r\n            if($id == \"splitColumn_type_01\"){ //Tab键\r\n                regStr += \"\\\\t\";\r\n                mark++;\r\n            }\r\n            else if($id == \"splitColumn_type_02\"){ //分号\r\n                if(mark > 0){\r\n                    regStr += \"|\";\r\n                }\r\n\r\n                regStr += \";\";\r\n                mark++;\r\n            }\r\n            else if($id == \"splitColumn_type_03\"){ //逗号\r\n                if(mark > 0){\r\n                    regStr += \"|\";\r\n                }\r\n\r\n                regStr += \",\";\r\n                mark++;\r\n            }\r\n            else if($id == \"splitColumn_type_04\"){ //空格\r\n                if(mark > 0){\r\n                    regStr += \"|\";\r\n                }\r\n\r\n                regStr += \"\\\\s\";\r\n                mark++;\r\n            }\r\n            else if($id == \"splitColumn_type_05\"){ //其它\r\n                let txt = $(e).siblings(\"input[type='text']\").val().trim();\r\n\r\n                if(txt != \"\"){\r\n                    if(mark > 0){\r\n                        regStr += \"|\";\r\n                    }\r\n\r\n                    regStr += txt;\r\n                }\r\n            }\r\n            else if($id == \"splitColumn_type_06\"){ //连续分隔符号视为单个处理\r\n                regStr = \"[\" + regStr + \"]+\";\r\n            }\r\n        })\r\n\r\n        return regStr;\r\n    },\r\n    getDataArr: function(regStr){\r\n        let _this = this;\r\n\r\n        let arr = [];\r\n\r\n        let r1 = Store.luckysheet_select_save[0].row[0];\r\n        let r2 = Store.luckysheet_select_save[0].row[1];\r\n        let c = Store.luckysheet_select_save[0].column[0];\r\n\r\n        if(regStr != null && regStr != \"\"){\r\n            let reg = new RegExp(regStr, \"g\");\r\n\r\n            let dataArr = [];\r\n\r\n            for(let r = r1; r <= r2; r++){\r\n                let rowArr = [];\r\n\r\n                let cell = Store.flowdata[r][c];\r\n\r\n                let value;\r\n                if(cell != null && cell[\"m\"] != null){\r\n                    value = cell[\"m\"];\r\n                }\r\n                else{\r\n                    value = getcellvalue(r, c, Store.flowdata);\r\n                }\r\n\r\n                if(value == null){\r\n                    value = \"\";\r\n                }\r\n\r\n                rowArr = value.toString().split(reg);\r\n\r\n                dataArr.push(rowArr);\r\n            }\r\n\r\n            let rlen = dataArr.length;\r\n            let clen = 0;\r\n\r\n            for(let i = 0; i < rlen; i++){\r\n                if(dataArr[i].length > clen){\r\n                    clen = dataArr[i].length;\r\n                }\r\n            }\r\n\r\n            arr = _this.getNullData(rlen, clen);\r\n\r\n            for(let i = 0; i < arr.length; i++){\r\n                for(let j = 0; j < arr[0].length; j++){\r\n                    if(dataArr[i][j] != null){\r\n                        arr[i][j] = dataArr[i][j];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            for(let r = r1; r <= r2; r++){\r\n                let rowArr = [];\r\n\r\n                let cell = Store.flowdata[r][c];\r\n\r\n                let value;\r\n                if(cell != null && cell[\"m\"] != null){\r\n                    value = cell[\"m\"];\r\n                }\r\n                else{\r\n                    value = getcellvalue(r, c, Store.flowdata);\r\n                }\r\n\r\n                if(value == null){\r\n                    value = \"\";\r\n                }\r\n\r\n                rowArr.push(value);\r\n\r\n                arr.push(rowArr);\r\n            }\r\n        }\r\n\r\n        return arr;\r\n    },\r\n    getNullData: function(rlen, clen){\r\n        let arr = [];\r\n\r\n        for(let r = 0; r < rlen; r++){\r\n            let rowArr = [];\r\n\r\n            for(let c = 0; c < clen; c++){\r\n                rowArr.push(\"\");\r\n            }\r\n\r\n            arr.push(rowArr);\r\n        }\r\n\r\n        return arr;\r\n    }\r\n}\r\n\r\nexport default luckysheetSplitColumn;"
  },
  {
    "path": "src/controllers/toolbar.js",
    "content": "import locale from '../locale/locale';\r\nimport luckysheetConfigsetting from './luckysheetConfigsetting';\r\n\r\nimport { getObjType, camel2split } from '../utils/util';\r\n\r\n// 默认的工具栏按钮\r\nexport const defaultToolbar = [\r\n    'undo',\r\n    'redo',\r\n    'paintFormat',\r\n    '|',\r\n\r\n    'currencyFormat',\r\n    'percentageFormat',\r\n    'numberIncrease',\r\n    'numberDecrease',\r\n    'moreFormats',\r\n    '|',\r\n\r\n    'font',\r\n    '|',\r\n    'fontSize',\r\n    '|',\r\n\r\n    'bold',\r\n    'italic',\r\n    'strikethrough',\r\n    'underline',\r\n    'textColor',\r\n    '|',\r\n\r\n    'fillColor',\r\n    'border',\r\n    'mergeCell',\r\n    '|',\r\n\r\n    'horizontalAlignMode',\r\n    'verticalAlignMode',\r\n    'textWrapMode',\r\n    'textRotateMode',\r\n    '|',\r\n\r\n    'image',\r\n    'link',\r\n    'chart',\r\n    'postil',\r\n    'pivotTable',\r\n    '|',\r\n\r\n    'function',\r\n    'frozenMode',\r\n    'sortAndFilter',\r\n    'conditionalFormat',\r\n    'dataVerification',\r\n    'splitColumn',\r\n    'screenshot',\r\n    'findAndReplace',\r\n    'protection',\r\n    'print',\r\n    'exportXlsx',\r\n];\r\n\r\n// 工具栏按钮 id 关系\r\nexport const toolbarIdMap = {\r\n    undo: '#luckysheet-icon-undo', //Undo redo\r\n    redo: '#luckysheet-icon-redo',\r\n    paintFormat: ['#luckysheet-icon-paintformat'], //Format brush\r\n    currencyFormat: '#luckysheet-icon-currency', //currency format\r\n    percentageFormat: '#luckysheet-icon-percent', //Percentage format\r\n    numberDecrease: '#luckysheet-icon-fmt-decimal-decrease', //'Decrease the number of decimal places'\r\n    numberIncrease: '#luckysheet-icon-fmt-decimal-increase', //'Increase the number of decimal places\r\n    moreFormats: '#luckysheet-icon-fmt-other', //'More Formats'\r\n    font: '#luckysheet-icon-font-family', //'font'\r\n    fontSize: '#luckysheet-icon-font-size', //'Font size'\r\n    bold: '#luckysheet-icon-bold', //'Bold (Ctrl+B)'\r\n    italic: '#luckysheet-icon-italic', //'Italic (Ctrl+I)'\r\n    strikethrough: '#luckysheet-icon-strikethrough', //'Strikethrough (Alt+Shift+5)'\r\n    underline: '#luckysheet-icon-underline', //'Underline (Alt+Shift+6)'\r\n    textColor: ['#luckysheet-icon-text-color', '#luckysheet-icon-text-color-menu'], //'Text color'\r\n    fillColor: ['#luckysheet-icon-cell-color', '#luckysheet-icon-cell-color-menu'], //'Cell color'\r\n    border: ['#luckysheet-icon-border-all', '#luckysheet-icon-border-menu'], //'border'\r\n    mergeCell: ['#luckysheet-icon-merge-button', '#luckysheet-icon-merge-menu'], //'Merge cells'\r\n    horizontalAlignMode: ['#luckysheet-icon-align', '#luckysheet-icon-align-menu'], //'Horizontal alignment'\r\n    verticalAlignMode: ['#luckysheet-icon-valign', '#luckysheet-icon-valign-menu'], //'Vertical alignment'\r\n    textWrapMode: ['#luckysheet-icon-textwrap', '#luckysheet-icon-textwrap-menu'], //'Wrap mode'\r\n    textRotateMode: ['#luckysheet-icon-rotation', '#luckysheet-icon-rotation-menu'], //'Text Rotation Mode'\r\n    image: '#luckysheet-insertImg-btn-title', //'Insert link'\r\n    link: '#luckysheet-insertLink-btn-title', //'Insert picture'\r\n    chart: '#luckysheet-chart-btn-title', //'chart' (the icon is hidden, but if the chart plugin is configured, you can still create a new chart by right click)\r\n    postil: '#luckysheet-icon-postil', //'comment'\r\n    pivotTable: ['#luckysheet-pivot-btn-title'], //'PivotTable'\r\n    function: ['#luckysheet-icon-function', '#luckysheet-icon-function-menu'], //'formula'\r\n    frozenMode: ['#luckysheet-freezen-btn-horizontal', '#luckysheet-icon-freezen-menu'], //'freeze mode'\r\n    sortAndFilter: '#luckysheet-icon-autofilter', //'sort and filter'\r\n    conditionalFormat: '#luckysheet-icon-conditionformat', //'Conditional Format'\r\n    dataVerification: '#luckysheet-dataVerification-btn-title', // 'Data Verification'\r\n    splitColumn: '#luckysheet-splitColumn-btn-title', //'Split column'\r\n    screenshot: '#luckysheet-chart-btn-screenshot', //'screenshot'\r\n    findAndReplace: '#luckysheet-icon-seachmore', //'Find and Replace'\r\n    protection: '#luckysheet-icon-protection', // 'Worksheet protection'\r\n    print: '#luckysheet-icon-print', // 'print'\r\n    exportXlsx: '#luckysheet-exportXlsx-btn-title' // 'export xlsx'\r\n};\r\n\r\n// 创建工具栏按钮的html\r\nexport function createToolbarHtml() {\r\n    const toolbar = locale().toolbar;\r\n    const fontarray = locale().fontarray;\r\n    const defaultFmtArray = locale().defaultFmt;\r\n    const htmlMap = {\r\n        undo: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block disabled\" data-tips=\"${toolbar.undo}\"\r\n        id=\"luckysheet-icon-undo\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-undo iconfont-luckysheet luckysheet-iconfont-qianjin\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`,\r\n        redo: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block disabled\" data-tips=\"${toolbar.redo}\"\r\n        id=\"luckysheet-icon-redo\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-redo iconfont-luckysheet luckysheet-iconfont-houtui\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`,\r\n        paintFormat: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.paintFormat}\"\r\n        id=\"luckysheet-icon-paintformat\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img iconfont-luckysheet luckysheet-iconfont-geshishua\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`,\r\n        currencyFormat: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.currencyFormat}\"\r\n        id=\"luckysheet-icon-currency\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img iconfont-luckysheet luckysheet-iconfont-jine\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`,\r\n        percentageFormat: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.percentageFormat}\"\r\n        id=\"luckysheet-icon-percent\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img iconfont-luckysheet luckysheet-iconfont-baifenhao\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //Percentage format\r\n        numberDecrease: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.numberDecrease}\"\r\n        id=\"luckysheet-icon-fmt-decimal-decrease\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block toolbar-decimal-icon\"\r\n                    style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-decimal-decrease iconfont-luckysheet luckysheet-iconfont-zengjiaxiaoshuwei\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Decrease the number of decimal places'\r\n        numberIncrease: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.numberIncrease}\"\r\n        id=\"luckysheet-icon-fmt-decimal-increase\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block toolbar-decimal-icon\"\r\n                    style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-decimal-increase iconfont-luckysheet luckysheet-iconfont-jianxiaoxiaoshuwei\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Increase the number of decimal places\r\n        moreFormats: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\" data-tips=\"${toolbar.moreFormats}\"\r\n        id=\"luckysheet-icon-fmt-other\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        ${defaultFmtArray[0].text}\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'More Formats'\r\n        font: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.font}\" id=\"luckysheet-icon-font-family\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        ${fontarray[0]}\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'font'\r\n        fontSize: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-zoom-combobox luckysheet-toolbar-combo-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.fontSize}\" id=\"luckysheet-icon-font-size\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-combo-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-combo-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div aria-posinset=\"4\" aria-setsize=\"7\" class=\"luckysheet-inline-block luckysheet-toolbar-combo-button-caption\"\r\n                    style=\"user-select: none;\">\r\n                        <input aria-label=\"${toolbar.fontSize}\" class=\"luckysheet-toolbar-combo-button-input luckysheet-toolbar-textinput\"\r\n                        role=\"combobox\" style=\"user-select: none;\" tabindex=\"-1\" type=\"text\" value=\"10\"\r\n                        />\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-combo-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Font size'\r\n        bold: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.bold}\"\r\n        id=\"luckysheet-icon-bold\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-bold iconfont-luckysheet luckysheet-iconfont-jiacu\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Bold (Ctrl+B)'\r\n        italic: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.italic}\"\r\n        id=\"luckysheet-icon-italic\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-italic iconfont-luckysheet luckysheet-iconfont-wenbenqingxie1\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Italic (Ctrl+I)'\r\n        strikethrough: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.strikethrough}\"\r\n        id=\"luckysheet-icon-strikethrough\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-strikethrough iconfont-luckysheet luckysheet-iconfont-wenbenshanchuxian\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Strikethrough (Alt+Shift+5)'\r\n        underline: `<div class=\"luckysheet-toolbar-button luckysheet-inline-block\" data-tips=\"${toolbar.underline}\"\r\n        id=\"luckysheet-icon-underline\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-underline iconfont-luckysheet luckysheet-iconfont-wenbenxiahuaxian\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Underline (Alt+Shift+6)'\r\n        textColor: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-text-color\"\r\n        data-tips=\"${toolbar.textColor}\" id=\"luckysheet-icon-text-color\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-color-menu-button-indicator\" style=\"border-bottom-color: rgb(0, 0, 0); user-select: none;\">\r\n                            <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                                <div class=\"text-color-bar\" style=\"background-color:${luckysheetConfigsetting.defaultTextColor}\"></div>\r\n                                <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-text-color iconfont-luckysheet luckysheet-iconfont-wenbenyanse\"\r\n                                style=\"user-select: none;\">\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.chooseColor}...\" id=\"luckysheet-icon-text-color-menu\" role=\"button\"\r\n        style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Text color'\r\n        fillColor: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-cell-color\"\r\n        data-tips=\"${toolbar.fillColor}\" id=\"luckysheet-icon-cell-color\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-color-menu-button-indicator\" style=\"border-bottom-color: rgb(255, 255, 255); user-select: none;\">\r\n                            <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                                <div class=\"text-color-bar\" style=\"background-color:${luckysheetConfigsetting.defaultCellColor}\"></div>\r\n                                <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-cell-color iconfont-luckysheet luckysheet-iconfont-tianchong\"\r\n                                style=\"user-select: none;\">\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.chooseColor}...\" id=\"luckysheet-icon-cell-color-menu\" role=\"button\"\r\n        style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Cell color'\r\n        border: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-border-all\"\r\n        data-tips=\"${toolbar.border}\" id=\"luckysheet-icon-border-all\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-border-all iconfont-luckysheet luckysheet-iconfont-quanjiabiankuang\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.borderStyle}...\" id=\"luckysheet-icon-border-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'border'\r\n        mergeCell: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-merge-button\"\r\n        data-tips=\"${toolbar.mergeCell}\" id=\"luckysheet-icon-merge-button\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-merge iconfont-luckysheet luckysheet-iconfont-hebing\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.chooseMergeType}...\" id=\"luckysheet-icon-merge-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Merge cells'\r\n        horizontalAlignMode: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-align\"\r\n        data-tips=\"${toolbar.horizontalAlign}\" id=\"luckysheet-icon-align\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-align-left iconfont-luckysheet luckysheet-iconfont-wenbenzuoduiqi\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.alignment}...\" id=\"luckysheet-icon-align-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Horizontal alignment'\r\n        verticalAlignMode: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-valign\"\r\n        data-tips=\"${toolbar.verticalAlign}\" id=\"luckysheet-icon-valign\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-valign-bottom iconfont-luckysheet luckysheet-iconfont-dibuduiqi\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.alignment}...\" id=\"luckysheet-icon-valign-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Vertical alignment'\r\n        textWrapMode: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-textwrap\"\r\n        data-tips=\"${toolbar.textWrap}\" id=\"luckysheet-icon-textwrap\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-textwrap-clip iconfont-luckysheet luckysheet-iconfont-jieduan\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.textWrapMode}...\" id=\"luckysheet-icon-textwrap-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Wrap mode'\r\n        textRotateMode: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-rotation\"\r\n        data-tips=\"${toolbar.textRotate}\" id=\"luckysheet-icon-rotation\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont-luckysheet luckysheet-iconfont-wuxuanzhuang\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.textRotateMode}...\" id=\"luckysheet-icon-rotation-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Text Rotation Mode'\r\n        image: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.insertImage}\" id=\"luckysheet-insertImg-btn-title\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont-luckysheet luckysheet-iconfont-tupian\"\r\n                            style=\"user-select: none;\">\r\n                                <input id=\"luckysheet-imgUpload\" type=\"file\" accept=\"image/*\" style=\"display:none;\"></input>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, // 'Insert picture'\r\n        link: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.insertLink}\" id=\"luckysheet-insertLink-btn-title\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont-luckysheet luckysheet-iconfont-lianjie\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, // 'Insert link'(TODO)\r\n        chart: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.chart}\" id=\"luckysheet-chart-btn-title\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont-luckysheet luckysheet-iconfont-tubiao\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'chart' (the icon is hidden, but if the chart plugin is configured, you can still create a new chart by right click)\r\n        postil: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\" data-tips=\"${toolbar.postil}\"\r\n        id=\"luckysheet-icon-postil\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon-img-container luckysheet-toolbar-menu-button-caption luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-zhushi\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'comment'\r\n        pivotTable: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.pivotTable}\" id=\"luckysheet-pivot-btn-title\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont-luckysheet luckysheet-iconfont-shujutoushi\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'PivotTable'\r\n        function: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-icon-function\"\r\n        data-tips=\"${toolbar.autoSum}\" id=\"luckysheet-icon-function\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-function iconfont-luckysheet luckysheet-iconfont-jisuan\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        ${toolbar.sum}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.moreFunction}...\" id=\"luckysheet-icon-function-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'formula'\r\n        frozenMode: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block luckysheet-freezen-btn-horizontal\"\r\n        data-tips=\"${toolbar.freezeTopRow}\" id=\"luckysheet-freezen-btn-horizontal\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont-luckysheet luckysheet-iconfont-dongjie1\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"luckysheet-toolbar-button-split-right luckysheet-toolbar-menu-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.moreOptions}...\" id=\"luckysheet-icon-freezen-menu\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'freeze mode'\r\n        sortAndFilter: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\" data-tips=\"${toolbar.sortAndFilter}\"\r\n        id=\"luckysheet-icon-autofilter\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-autofilter iconfont-luckysheet luckysheet-iconfont-shaixuan\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;margin-left: 0px;margin-right: 4px;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Sort and filter'\r\n        conditionalFormat: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\" data-tips=\"${toolbar.conditionalFormat}\"\r\n        id=\"luckysheet-icon-conditionformat\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-autofilter iconfont-luckysheet luckysheet-iconfont-geshitiaojian\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Conditional Format'\r\n        dataVerification: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.dataVerification}\" id=\"luckysheet-dataVerification-btn-title\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont-luckysheet luckysheet-iconfont-shujuyanzheng\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, // 'Data Verification'\r\n        splitColumn: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.splitColumn}\" id=\"luckysheet-splitColumn-btn-title\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont-luckysheet luckysheet-iconfont-wenbenfenge\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Split column'\r\n        screenshot: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.screenshot}\" id=\"luckysheet-chart-btn-screenshot\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont-luckysheet luckysheet-iconfont-jieping\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'screenshot'\r\n        findAndReplace: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\" data-tips=\"${toolbar.findAndReplace}\"\r\n        id=\"luckysheet-icon-seachmore\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-autofilter iconfont-luckysheet luckysheet-iconfont-sousuo\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;margin-left: 0px;margin-right: 4px;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, //'Find and Replace'\r\n        protection: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.protection}\" id=\"luckysheet-icon-protection\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none iconfont-luckysheet luckysheet-iconfont-biaogesuoding\"\r\n                            style=\"user-select: none;\">\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, // 'Worksheet protection'\r\n        print: `<div class=\"luckysheet-toolbar-select luckysheet-toolbar-menu-button luckysheet-inline-block\" data-tips=\"${toolbar.print}\"\r\n        id=\"luckysheet-icon-print\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-menu-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n\r\n                    <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                        <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-autofilter iconfont-luckysheet luckysheet-iconfont-dayin\"\r\n                        style=\"user-select: none;\">\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"luckysheet-toolbar-menu-button-dropdown luckysheet-inline-block iconfont-luckysheet luckysheet-iconfont-xiayige\"\r\n                    style=\"user-select: none;margin-left: 0px;margin-right: 4px;\">\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, // 'print'\r\n        exportXlsx: `<div class=\"luckysheet-toolbar-button-split-left luckysheet-toolbar-button luckysheet-inline-block\"\r\n        data-tips=\"${toolbar.exportXlsx}\" id=\"luckysheet-exportXlsx-btn-title\" role=\"button\" style=\"user-select: none;\">\r\n            <div class=\"luckysheet-toolbar-button-outer-box luckysheet-inline-block\"\r\n            style=\"user-select: none;\">\r\n                <div class=\"luckysheet-toolbar-menu-button-inner-box luckysheet-inline-block\"\r\n                style=\"user-select: none;\">\r\n                    <div class=\"luckysheet-toolbar-menu-button-caption luckysheet-inline-block\"\r\n                    style=\"user-select: none;\">\r\n                        <div class=\"luckysheet-icon luckysheet-inline-block \" style=\"user-select: none;\">\r\n                            <div aria-hidden=\"true\" class=\"luckysheet-icon-img-container luckysheet-icon-img luckysheet-icon-rotation-none\"\r\n                            style=\"user-select: none;\">\r\n                                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"24\" viewBox=\"0 0 24 24\"><g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-width=\"1.5\"><path d=\"M4 12a8 8 0 1 0 16 0\"/><path stroke-linejoin=\"round\" d=\"M12 14V4m0 0l3 3m-3-3L9 7\"/></g></svg>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`, // 'Insert picture'\r\n    };\r\n\r\n    const showtoolbar = luckysheetConfigsetting.showtoolbar;\r\n    const showtoolbarConfig = luckysheetConfigsetting.showtoolbarConfig;\r\n\r\n    const buttonHTML = ['<div class=\"luckysheet-toolbar-left-theme\"></div>'];\r\n\r\n    // 数组形式直接生成\r\n    if (getObjType(showtoolbarConfig) === 'array') {\r\n        // 此时不根据 showtoolbar=false，showtoolbarConfig为某几个进行适配，此时showtoolbarConfig本身就是全部要显示的按钮\r\n        if (!showtoolbar) {\r\n            return '';\r\n        }\r\n        let i = 0;\r\n        showtoolbarConfig.forEach(function(key, i) {\r\n            if (key === '|') {\r\n                const nameKeys = showtoolbarConfig[i - 1]\r\n                if(nameKeys !== '|') {\r\n                    buttonHTML.push(\r\n                        `<div id=\"toolbar-separator-${camel2split(nameKeys)}\" class=\"luckysheet-toolbar-separator luckysheet-inline-block\" style=\"user-select: none;\"></div>`\r\n                        );\r\n                }\r\n            } else {\r\n                buttonHTML.push(htmlMap[key]);\r\n            }\r\n        });\r\n        return buttonHTML.join('');\r\n    }\r\n\r\n    const config = defaultToolbar.reduce(function(total, curr) {\r\n        if (curr !== '|') {\r\n            total[curr] = true;\r\n        }\r\n        return total;\r\n    }, {});\r\n\r\n    if (!showtoolbar) {\r\n        for (let s in config) {\r\n            config[s] = false;\r\n        }\r\n    }\r\n\r\n    // 对象模式 则从里面挑选 true 保留 false 删掉\r\n    if (JSON.stringify(showtoolbarConfig) !== '{}') {\r\n        if(showtoolbarConfig.hasOwnProperty('undoRedo')){\r\n            config.undo = config.redo = showtoolbarConfig.undoRedo;\r\n        }\r\n        Object.assign(config, showtoolbarConfig);\r\n    }\r\n    for (let i = 0; i < defaultToolbar.length; i++) {\r\n        let key = defaultToolbar[i];\r\n        if (!config[key] && key !== '|') {\r\n            // 如果当前元素隐藏 按照之前的规则 后面紧跟的 | 分割也不需要显示了\r\n            if (defaultToolbar[i + 1] === '|') {\r\n                i++;\r\n            }\r\n            continue;\r\n        }\r\n        if (key === '|') {\r\n            const nameKeys = defaultToolbar[i - 1]\r\n            if(nameKeys !== '|') {\r\n                buttonHTML.push(\r\n                    `<div id=\"toolbar-separator-${camel2split(nameKeys)}\" class=\"luckysheet-toolbar-separator luckysheet-inline-block\" style=\"user-select: none;\"></div>`\r\n                );\r\n            }\r\n        } else {\r\n            buttonHTML.push(htmlMap[key]);\r\n        }\r\n    }\r\n    return buttonHTML.join('');\r\n}\r\n"
  },
  {
    "path": "src/controllers/updateCell.js",
    "content": "import pivotTable from './pivotTable';\r\nimport luckysheetFreezen from './freezen';\r\nimport menuButton from './menuButton';\r\nimport conditionformat from './conditionformat';\r\nimport alternateformat from './alternateformat';\r\nimport cellDatePickerCtrl from './cellDatePickerCtrl';\r\nimport dataVerificationCtrl from './dataVerificationCtrl';\r\nimport {checkProtectionLocked,checkProtectionCellHidden}  from './protection';\r\nimport { chatatABC } from '../utils/util';\r\nimport { isEditMode } from '../global/validate';\r\nimport { getcellvalue,getInlineStringStyle } from '../global/getdata';\r\nimport { valueShowEs } from '../global/format';\r\nimport formula from '../global/formula';\r\nimport { luckysheetRangeLast } from '../global/cursorPos';\r\nimport cleargridelement from '../global/cleargridelement';\r\nimport {isInlineStringCell} from './inlineString';\r\nimport Store from '../store';\r\nimport server from './server';\r\nimport method from '../global/method';\r\n\r\nexport function luckysheetupdateCell(row_index1, col_index1, d, cover, isnotfocus) {\r\n    if(!checkProtectionLocked(row_index1, col_index1, Store.currentSheetIndex)){\r\n        $(\"#luckysheet-functionbox-cell\").blur();\r\n        return;\r\n    }\r\n\r\n    if(isEditMode() || Store.allowEdit===false){//此模式下禁用单元格编辑\r\n        return;\r\n    }\r\n\r\n    // 钩子函数\r\n    if(!method.createHookFunction('cellEditBefore',Store.luckysheet_select_save)){return;}\r\n\r\n    // 编辑单元格时发送指令到后台，通知其他单元格更新为“正在输入”状态\r\n    server.saveParam(\"mv\", Store.currentSheetIndex,  {op:\"enterEdit\",range:Store.luckysheet_select_save});\r\n\r\n    //数据验证\r\n    if(dataVerificationCtrl.dataVerification != null && dataVerificationCtrl.dataVerification[row_index1 + '_' + col_index1] != null){\r\n        let dataVerificationItem = dataVerificationCtrl.dataVerification[row_index1 + '_' + col_index1];\r\n        if(dataVerificationItem.type == 'dropdown'){\r\n            dataVerificationCtrl.dropdownListShow();\r\n        }\r\n        else if(dataVerificationItem.type == 'checkbox'){\r\n            return;\r\n        }\r\n    }\r\n\r\n    let size = getColumnAndRowSize(row_index1, col_index1, d);\r\n    let row = size.row, \r\n        row_pre = size.row_pre, \r\n        col = size.col, \r\n        col_pre = size.col_pre, \r\n        row_index = size.row_index, \r\n        col_index = size.col_index;\r\n\r\n    if($(\"#luckysheet-dropCell-icon\").is(\":visible\")){\r\n        $(\"#luckysheet-dropCell-icon\").remove();\r\n    }\r\n\r\n    let winH = $(window).height(), winW = $(window).width();\r\n    let container_offset = $(\"#\" + Store.container).offset();\r\n    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n    if (pivotTable.isPivotRange(row_index, col_index)) {\r\n        return;\r\n    }\r\n\r\n    let left = col_pre + container_offset.left + Store.rowHeaderWidth - scrollLeft - 2;\r\n    if(luckysheetFreezen.freezenverticaldata != null && col_index1 <= luckysheetFreezen.freezenverticaldata[1]){\r\n        left = col_pre + container_offset.left + Store.rowHeaderWidth - 2;\r\n    }\r\n\r\n    let top = row_pre + container_offset.top + Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight - scrollTop - 2;\r\n    if(luckysheetFreezen.freezenhorizontaldata != null && row_index1 <= luckysheetFreezen.freezenhorizontaldata[1]){\r\n        top = row_pre + container_offset.top + Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight - 2;\r\n    }\r\n\r\n    let input_postition = {\r\n        \"min-width\": col - col_pre+ 1- 8, \r\n        \"min-height\": row - row_pre + 1- 4,  \r\n        \r\n        \"max-width\": winW + scrollLeft - col_pre - 20 - Store.rowHeaderWidth, \r\n        \"max-height\": winH + scrollTop - row_pre - 20 - 15 - Store.toolbarHeight - Store.infobarHeight - Store.calculatebarHeight - Store.sheetBarHeight - Store.statisticBarHeight, \r\n        \"left\": left, \r\n        \"top\": top, \r\n    }\r\n\r\n    let inputContentScale = {\r\n        \"transform\":\"scale(\"+ Store.zoomRatio +\")\",\r\n        \"transform-origin\":\"left top\",\r\n        \"width\":(100 / Store.zoomRatio) + \"%\",\r\n        \"height\":(100 / Store.zoomRatio) + \"%\",\r\n    }\r\n\r\n    Store.luckysheetCellUpdate = [row_index, col_index];\r\n    if (!isnotfocus) {\r\n        $(\"#luckysheet-rich-text-editor\").focus().select();\r\n    }\r\n\r\n    $(\"#luckysheet-input-box\").removeAttr(\"style\").css({ \r\n        \"background-color\": \"rgb(255, 255, 255)\", \r\n        \"padding\": \"0px 2px\", \r\n        \"font-size\": `${Store.defaultFontSize}pt`,\r\n        \"right\": \"auto\", \r\n        \"overflow-y\": \"auto\",\r\n        \"box-sizing\": \"initial\",\r\n        \"display\":\"flex\",\r\n    });\r\n\r\n    if(luckysheetFreezen.freezenverticaldata != null || luckysheetFreezen.freezenhorizontaldata != null){\r\n        $(\"#luckysheet-input-box\").css(\"z-index\", 10002);\r\n    }\r\n    \r\n    $(\"#luckysheet-input-box-index\").html(chatatABC(col_index) + (row_index + 1)).hide();\r\n    $(\"#luckysheet-wa-functionbox-cancel, #luckysheet-wa-functionbox-confirm\").addClass(\"luckysheet-wa-calculate-active\");\r\n    \r\n    let value = \"\", isCenter=false;\r\n    \r\n    if (d[row_index] != null && d[row_index][col_index] != null) {\r\n        let cell = d[row_index][col_index];\r\n        let htValue = cell[\"ht\"];\r\n        let leftOrigin = \"left\", topOrigin = \"top\";\r\n        if(htValue == \"0\"){//0 center, 1 left, 2 right\r\n            input_postition = { \r\n                \"min-width\": col - col_pre + 1- 8, \r\n                \"min-height\": row - row_pre + 1- 4, \r\n                // \"transform\":\"scale(\"+ Store.zoomRatio +\")\",\r\n                // \"transform-origin\":\"center top\",\r\n                \"max-width\": winW*2/3, \r\n                \"max-height\": winH + scrollTop - row_pre - 20 - 15 - Store.toolbarHeight - Store.infobarHeight - Store.calculatebarHeight - Store.sheetBarHeight - Store.statisticBarHeight, \r\n                \"left\": col_pre + container_offset.left + Store.rowHeaderWidth - scrollLeft - 2, \r\n                \"top\":  row_pre + container_offset.top + Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight - scrollTop - 2, \r\n            }\r\n\r\n            if(Store.zoomRatio<1){\r\n                leftOrigin = \"center\";\r\n            }\r\n\r\n            isCenter = true;\r\n        }\r\n        else if(htValue == \"2\"){\r\n            input_postition = { \r\n                \"min-width\": col - col_pre+ 1- 8, \r\n                \"min-height\": row - row_pre + 1- 4, \r\n                // \"transform\":\"scale(\"+ Store.zoomRatio +\")\",\r\n                // \"transform-origin\":\"right top\",\r\n                \"max-width\": col + container_offset.left - scrollLeft  - 8, \r\n                \"max-height\": winH + scrollTop - row_pre - 20 - 15 - Store.toolbarHeight - Store.infobarHeight - Store.calculatebarHeight - Store.sheetBarHeight - Store.statisticBarHeight, \r\n                \"right\": winW - (container_offset.left + (Store.rowHeaderWidth-1) - scrollLeft) - col, \r\n                \"top\":  row_pre + container_offset.top + Store.infobarHeight + Store.toolbarHeight + Store.calculatebarHeight + Store.columnHeaderHeight - scrollTop - 2, \r\n            }\r\n\r\n            if(Store.zoomRatio<1){\r\n                leftOrigin = \"right\";\r\n            }\r\n        }\r\n\r\n        if(cell[\"vt\"]==\"0\"){\r\n            topOrigin = \"center\";\r\n        }\r\n        else if(cell[\"vt\"]==\"2\"){\r\n            topOrigin = \"bottom\";\r\n        }\r\n\r\n        inputContentScale[\"transform-origin\"] = leftOrigin +\" \" + topOrigin;\r\n\r\n        \r\n        if (!cover) {\r\n            if(isInlineStringCell(cell)){\r\n                value = getInlineStringStyle(row_index, col_index, d);\r\n            }\r\n            else if(cell.f!=null){\r\n                value = getcellvalue(row_index, col_index, d, \"f\");\r\n            }\r\n            else{\r\n                value = valueShowEs(row_index, col_index, d);\r\n                if(cell.qp==\"1\"){\r\n                    value = value ? (\"\" + value) : value;\r\n                }\r\n            }\r\n        }\r\n        \r\n        let style = menuButton.getStyleByCell(d, row_index, col_index);\r\n        style = $(\"#luckysheet-input-box\").get(0).style.cssText + style;\r\n\r\n        $(\"#luckysheet-input-box\").get(0).style.cssText = style;\r\n        if($(\"#luckysheet-input-box\").get(0).style.backgroundColor == \"rgba(0, 0, 0, 0)\"){\r\n            $(\"#luckysheet-input-box\").get(0).style.background = \"rgb(255,255,255)\";\r\n        }\r\n    }\r\n    else{\r\n        //交替颜色\r\n        let af_compute = alternateformat.getComputeMap();\r\n        var checksAF = alternateformat.checksAF(row_index, col_index, af_compute);\r\n\r\n        //条件格式\r\n        var cf_compute = conditionformat.getComputeMap();\r\n        var checksCF = conditionformat.checksCF(row_index, col_index, cf_compute);\r\n\r\n        if(checksCF != null && checksCF[\"cellColor\"] != null){\r\n            $(\"#luckysheet-input-box\").get(0).style.background = checksCF[\"cellColor\"];\r\n        }\r\n        else if(checksAF != null){\r\n            $(\"#luckysheet-input-box\").get(0).style.background = checksAF[1];\r\n        }\r\n    }\r\n\r\n    if(input_postition[\"min-height\"] > input_postition[\"max-height\"]){\r\n        input_postition[\"min-height\"] = input_postition[\"max-height\"];\r\n    }\r\n\r\n    if(input_postition[\"min-width\"] > input_postition[\"max-width\"]){\r\n        input_postition[\"min-width\"] = input_postition[\"max-width\"];\r\n    }\r\n   \r\n    // if((value == null || value.toString() == \"\") && !cover){\r\n    //     value = \"<br/>\";\r\n    // }\r\n    value = formula.xssDeal(value);\r\n    if(!checkProtectionCellHidden(row_index, col_index, Store.currentSheetIndex) && value.length>0 && value.substr(0, 63)=='<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span>'){\r\n        $(\"#luckysheet-rich-text-editor\").html(\"\");\r\n    }\r\n    else{\r\n        value = formula.ltGtSignDeal(value);\r\n        $(\"#luckysheet-rich-text-editor\").html(value);\r\n        if (!isnotfocus) {\r\n            luckysheetRangeLast($(\"#luckysheet-rich-text-editor\")[0]);\r\n        }\r\n    }\r\n\r\n    if(isCenter){\r\n        let width = $(\"#luckysheet-input-box\").width();\r\n        if(width> input_postition[\"max-width\"]){\r\n            width = input_postition[\"max-width\"];\r\n        }\r\n\r\n        if(width< input_postition[\"min-width\"]){\r\n            width = input_postition[\"min-width\"];\r\n        }\r\n\r\n        let newLeft = input_postition[\"left\"] - width/2 + (col - col_pre)/2;\r\n        if(newLeft<2){\r\n            newLeft = 2;\r\n        }\r\n\r\n        input_postition[\"left\"] = newLeft-2;\r\n    }\r\n\r\n    $(\"#luckysheet-input-box\").css(input_postition);\r\n    $(\"#luckysheet-rich-text-editor\").css(inputContentScale);\r\n\r\n    //日期\r\n    if(d[row_index1][col_index1] && d[row_index1][col_index1].ct && d[row_index1][col_index1].ct.t == 'd'){\r\n        cellDatePickerCtrl.cellFocus(row_index1, col_index1, d[row_index1][col_index1]);\r\n    }\r\n\r\n    formula.rangetosheet = Store.currentSheetIndex;\r\n    formula.createRangeHightlight();\r\n    formula.rangeResizeTo = $(\"#luckysheet-rich-text-editor\");\r\n    cleargridelement();\r\n}\r\n\r\nexport function setCenterInputPosition(row_index, col_index, d){\r\n    if(row_index==null ||col_index==null){\r\n        return;\r\n    }\r\n    let cell = d[row_index][col_index];\r\n    if(cell==null){\r\n        return;\r\n    }\r\n    let htValue = cell[\"ht\"];\r\n    if(cell!=null && htValue != \"0\"){//0 center, 1 left, 2 right\r\n        return;\r\n    }\r\n\r\n    let size = getColumnAndRowSize(row_index, col_index, d);\r\n    let row = size.row, row_pre = size.row_pre, col = size.col, col_pre = size.col_pre;\r\n\r\n    let winH = $(window).height(), winW = $(window).width();\r\n    let container_offset = $(\"#\" + Store.container).offset();\r\n    let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n    let input_postition = { \r\n        \"min-width\": col - col_pre + 1 - 8, \r\n        \"max-width\": winW*2/3, \r\n        \"left\": col_pre + container_offset.left + Store.rowHeaderWidth - scrollLeft - 2, \r\n    }\r\n\r\n    let width = $(\"#luckysheet-input-box\").width();\r\n    if(width> input_postition[\"max-width\"]){\r\n        width = input_postition[\"max-width\"];\r\n    }\r\n\r\n    if(width< input_postition[\"min-width\"]){\r\n        width = input_postition[\"min-width\"];\r\n    }\r\n\r\n    let newLeft = input_postition[\"left\"] - width/2 + (col - col_pre)/2;\r\n    if(newLeft<2){\r\n        newLeft = 2;\r\n    }\r\n\r\n    input_postition[\"left\"] = newLeft-2;\r\n\r\n    $(\"#luckysheet-input-box\").css(input_postition);\r\n}\r\n\r\nexport function getColumnAndRowSize(row_index, col_index, d){\r\n    let row = Store.visibledatarow[row_index], \r\n        row_pre = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1];\r\n    let col = Store.visibledatacolumn[col_index], \r\n        col_pre = col_index - 1 == -1 ? 0 : Store.visibledatacolumn[col_index - 1];\r\n\r\n    if(d == null){\r\n        d = Store.flowdata;\r\n    }\r\n\r\n    let margeset = menuButton.mergeborer(d, row_index, col_index);\r\n    if(!!margeset){\r\n        row = margeset.row[1];\r\n        row_pre = margeset.row[0];\r\n        row_index = margeset.row[2];\r\n        col = margeset.column[1];\r\n        col_pre = margeset.column[0];\r\n        col_index = margeset.column[2];\r\n    }    \r\n\r\n    return {\r\n        row: row,\r\n        row_pre: row_pre,\r\n        row_index: row_index,\r\n        col: col,\r\n        col_pre: col_pre,\r\n        col_index: col_index\r\n    }\r\n}\r\n"
  },
  {
    "path": "src/controllers/zoom.js",
    "content": "import Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport { replaceHtml } from '../utils/util';\r\nimport sheetmanage from './sheetmanage';\r\nimport {changeSheetContainerSize} from './resize';\r\nimport { jfrefreshgrid_rhcw } from '../global/refresh';\r\nimport server from './server';\r\nimport luckysheetPostil from './postil';\r\nimport imageCtrl from './imageCtrl';\r\n\r\n\r\n\r\nlet luckysheetZoomTimeout = null;\r\n\r\nexport function zoomChange(ratio){\r\n    if(Store.flowdata==null || Store.flowdata.length==0){\r\n        return;\r\n    }\r\n\r\n    clearTimeout(luckysheetZoomTimeout);\r\n    luckysheetZoomTimeout = setTimeout(() => {\r\n        if (Store.clearjfundo) {\r\n            Store.jfredo.push({ \r\n                \"type\": \"zoomChange\", \r\n                \"zoomRatio\": Store.zoomRatio, \r\n                \"curZoomRatio\": ratio, \r\n                \"sheetIndex\": Store.currentSheetIndex, \r\n            });\r\n        }\r\n        currentWheelZoom = null;\r\n        Store.zoomRatio = ratio;\r\n\r\n        let currentSheet = sheetmanage.getSheetByIndex();\r\n\r\n        //批注\r\n        luckysheetPostil.buildAllPs(currentSheet.data);\r\n\r\n        //图片\r\n        imageCtrl.images = currentSheet.images;\r\n        imageCtrl.allImagesShow();\r\n        imageCtrl.init();\r\n\r\n        if(currentSheet.config==null){\r\n            currentSheet.config = {};\r\n        }\r\n    \r\n        if(currentSheet.config.sheetViewZoom==null){\r\n            currentSheet.config.sheetViewZoom = {};\r\n        }\r\n\r\n        let type = currentSheet.config.curentsheetView;\r\n        if(type==null){\r\n            type = \"viewNormal\";\r\n        }\r\n        currentSheet.config.sheetViewZoom[type+\"ZoomScale\"] = ratio;\r\n    \r\n        server.saveParam(\"all\", Store.currentSheetIndex, Store.zoomRatio, { \"k\": \"zoomRatio\" });\r\n        server.saveParam(\"cg\", Store.currentSheetIndex, currentSheet.config[\"sheetViewZoom\"], { \"k\": \"sheetViewZoom\" });\r\n\r\n        zoomRefreshView();\r\n    }, 100);\r\n    \r\n}\r\n\r\nexport function zoomRefreshView(){\r\n    // let $scrollLeft = $(\"#luckysheet-scrollbar-x\"), $scrollTop = $(\"#luckysheet-scrollbar-y\");\r\n    // let sl = $scrollLeft.scrollLeft(), st = $scrollTop.scrollTop();\r\n\r\n    // let wp = $scrollLeft.find(\"div\").width(), hp = $scrollTop.find(\"div\").height();\r\n\r\n    jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    changeSheetContainerSize();\r\n\r\n    // let wc = $scrollLeft.find(\"div\").width(), hc = $scrollTop.find(\"div\").height();\r\n\r\n    // $scrollLeft.scrollLeft(sl+wc-wp);\r\n    // $scrollTop.scrollTop(st+hc-hp);\r\n}\r\n\r\nlet currentWheelZoom = null;\r\nexport function zoomInitial(){\r\n\r\n    // 缩放步长\r\n    const ZOOM_WHEEL_STEP = 0.02; // ctrl + 鼠标滚轮\r\n    const ZOOM_STEP = 0.1; // 点击以及 Ctrl + +-\r\n    \r\n    // 缩放最大最小比例\r\n    const MAX_ZOOM_RATIO = 4;\r\n    const MIN_ZOOM_RATIO = .1;\r\n    \r\n    $(\"#luckysheet-zoom-minus\").click(function(){\r\n        let currentRatio;\r\n        if(Store.zoomRatio==null){\r\n            currentRatio = Store.zoomRatio = 1;\r\n        }\r\n        else{\r\n            currentRatio = Math.ceil(Store.zoomRatio*10)/10;\r\n        }\r\n\r\n        currentRatio = currentRatio-ZOOM_STEP;\r\n\r\n        if(currentRatio==Store.zoomRatio){\r\n            currentRatio = currentRatio-ZOOM_STEP;\r\n        }\r\n\r\n        if(currentRatio<=MIN_ZOOM_RATIO){\r\n            currentRatio = MIN_ZOOM_RATIO;\r\n        }\r\n\r\n        // Store.zoomRatio = currentRatio;\r\n        zoomChange(currentRatio);\r\n        zoomNumberDomBind(currentRatio);\r\n    });\r\n\r\n    $(\"#luckysheet-zoom-plus\").click(function(){\r\n        let currentRatio;\r\n        if(Store.zoomRatio==null){\r\n            currentRatio = Store.zoomRatio = 1;\r\n        }\r\n        else{\r\n            currentRatio = Math.floor(Store.zoomRatio*10)/10;\r\n        }\r\n\r\n        currentRatio = currentRatio+ZOOM_STEP;\r\n\r\n        if(currentRatio==Store.zoomRatio){\r\n            currentRatio = currentRatio+ZOOM_STEP;\r\n        }\r\n\r\n        if(currentRatio>=MAX_ZOOM_RATIO){\r\n            currentRatio = MAX_ZOOM_RATIO;\r\n        }\r\n\r\n        // Store.zoomRatio = currentRatio;\r\n        zoomChange(currentRatio);\r\n        zoomNumberDomBind(currentRatio);\r\n    });\r\n\r\n    $(\"#luckysheet-zoom-slider\").mousedown(function(e){\r\n        let xoffset = $(this).offset().left, pageX = e.pageX;\r\n\r\n        let currentRatio = positionToRatio(pageX-xoffset);\r\n        // Store.zoomRatio = currentRatio;\r\n        zoomChange(currentRatio);\r\n        zoomNumberDomBind(currentRatio);\r\n    });\r\n\r\n    $(\"#luckysheet-zoom-cursor\").mousedown(function(e){\r\n        let curentX = e.pageX,cursorLeft = parseFloat($(\"#luckysheet-zoom-cursor\").css(\"left\"));\r\n        $(\"#luckysheet-zoom-cursor\").css(\"transition\",\"none\");\r\n        $(document).off(\"mousemove.zoomCursor\").on(\"mousemove.zoomCursor\",function(event){\r\n            let moveX = event.pageX;\r\n            let offsetX = moveX - curentX;\r\n            // console.log(moveX, curentX, offsetX);\r\n            // curentX = moveX;\r\n            // let left = parseFloat($(\"#luckysheet-zoom-cursor\").css(\"left\"));\r\n            let pos = cursorLeft + offsetX; \r\n            let currentRatio = positionToRatio(pos);\r\n\r\n            if(currentRatio>MAX_ZOOM_RATIO){\r\n                currentRatio = MAX_ZOOM_RATIO;\r\n                pos = 100;\r\n            }\r\n\r\n            if(currentRatio<MIN_ZOOM_RATIO){\r\n                currentRatio = MIN_ZOOM_RATIO;\r\n                pos = 0;\r\n            }\r\n\r\n            // Store.zoomRatio = currentRatio;\r\n            zoomChange(currentRatio);\r\n            let r = Math.round(currentRatio*100) + \"%\";\r\n            $(\"#luckysheet-zoom-ratioText\").html(r);\r\n            $(\"#luckysheet-zoom-cursor\").css(\"left\", pos-4);\r\n        });\r\n\r\n        $(document).off(\"mouseup.zoomCursor\").on(\"mouseup.zoomCursor\",function(event){\r\n            $(document).off(\".zoomCursor\");\r\n            $(\"#luckysheet-zoom-cursor\").css(\"transition\",\"all 0.3s\");\r\n        });\r\n\r\n        e.stopPropagation();\r\n    }).click(function(e){\r\n        e.stopPropagation();\r\n    });\r\n\r\n    $(\"#luckysheet-zoom-ratioText\").click(function(){\r\n        // Store.zoomRatio = 1;\r\n        zoomChange(1);\r\n        zoomNumberDomBind(1);\r\n    });\r\n\r\n    zoomNumberDomBind(Store.zoomRatio);\r\n\r\n    currentWheelZoom = null;\r\n    // 拦截系统缩放快捷键 Ctrl + wheel\r\n    document.addEventListener(\r\n        'wheel',\r\n        function (ev) {\r\n            if (!ev.ctrlKey || !ev.deltaY) {\r\n                return;\r\n            }\r\n            if (currentWheelZoom === null) {\r\n                currentWheelZoom = Store.zoomRatio || 1;\r\n            }\r\n            currentWheelZoom += ev.deltaY < 0 ? ZOOM_WHEEL_STEP : -ZOOM_WHEEL_STEP;\r\n            if (currentWheelZoom >= MAX_ZOOM_RATIO) {\r\n                currentWheelZoom = MAX_ZOOM_RATIO;\r\n            } else if (currentWheelZoom < MIN_ZOOM_RATIO) {\r\n                currentWheelZoom = MIN_ZOOM_RATIO;\r\n            }\r\n            zoomChange(currentWheelZoom);\r\n            zoomNumberDomBind(currentWheelZoom);\r\n            ev.preventDefault();\r\n            ev.stopPropagation();\r\n        },\r\n        { capture: true, passive: false }\r\n    );\r\n\r\n    // 拦截系统缩放快捷键 Ctrl + +/- 0\r\n    document.addEventListener(\r\n        'keydown',\r\n        function (ev) {\r\n            if (!ev.ctrlKey) {\r\n                return;\r\n            }\r\n            let handled = false;\r\n            let zoom = Store.zoomRatio || 1;\r\n            if (ev.key === '-' || ev.which === 189) {\r\n                zoom -= ZOOM_STEP;\r\n                handled = true;\r\n            } else if (ev.key === '+' || ev.which === 187) {\r\n                zoom += ZOOM_STEP;\r\n                handled = true;\r\n            } else if (ev.key === '0' || ev.which === 48) {\r\n                zoom = 1;\r\n                handled = true;\r\n            }\r\n    \r\n            if (handled) {\r\n                ev.preventDefault();\r\n                if (zoom >= MAX_ZOOM_RATIO) {\r\n                    zoom = MAX_ZOOM_RATIO;\r\n                } else if (zoom < MIN_ZOOM_RATIO) {\r\n                    zoom = MIN_ZOOM_RATIO;\r\n                }\r\n                zoomChange(zoom);\r\n                zoomNumberDomBind(zoom);\r\n            }\r\n        },\r\n        { capture: true }\r\n    );\r\n}\r\n\r\nfunction positionToRatio(pos){\r\n    let ratio = 1;\r\n    if(pos<50){\r\n        ratio = Math.round((pos*1.8/100 + 0.1)*100)/100;\r\n    }\r\n    else if(pos>50){\r\n        ratio = Math.round(((pos-50)*6/100 + 1)*100)/100;\r\n    }\r\n\r\n    return ratio;\r\n}\r\n\r\nfunction zoomSlierDomBind(ratio){\r\n    let domPos = 50;\r\n    if(ratio<1){\r\n        domPos = Math.round((ratio - 0.1)*100 / 0.18)/10;\r\n    }\r\n    else if(ratio>1){\r\n        domPos = Math.round((ratio - 1)*100 / 0.6)/10+50;\r\n    }\r\n    $(\"#luckysheet-zoom-cursor\").css(\"left\", domPos-4);\r\n}\r\n\r\nexport function zoomNumberDomBind(ratio){\r\n    let r = Math.round(ratio*100) + \"%\";\r\n    $(\"#luckysheet-zoom-ratioText\").html(r);\r\n    zoomSlierDomBind(ratio);\r\n}\r\n\r\n"
  },
  {
    "path": "src/core.js",
    "content": "import defaultSetting from \"./config.js\";\r\nimport { common_extend } from \"./utils/util\";\r\nimport Store from \"./store\";\r\nimport { locales } from \"./locale/locale\";\r\nimport server from \"./controllers/server\";\r\nimport luckysheetConfigsetting from \"./controllers/luckysheetConfigsetting\";\r\nimport sheetmanage from \"./controllers/sheetmanage\";\r\nimport luckysheetsizeauto from \"./controllers/resize\";\r\nimport luckysheetHandler from \"./controllers/handler\";\r\nimport { initialFilterHandler } from \"./controllers/filter\";\r\nimport { initialMatrixOperation } from \"./controllers/matrixOperation\";\r\nimport { initialSheetBar } from \"./controllers/sheetBar\";\r\nimport { formulaBarInitial } from \"./controllers/formulaBar\";\r\nimport { rowColumnOperationInitial } from \"./controllers/rowColumnOperation\";\r\nimport { keyboardInitial } from \"./controllers/keyboard\";\r\nimport { orderByInitial } from \"./controllers/orderBy\";\r\nimport { initPlugins } from \"./controllers/expendPlugins\";\r\nimport { getluckysheetfile, getluckysheet_select_save, getconfig, getConditionFormatCells } from \"./methods/get\";\r\nimport { setluckysheet_select_save } from \"./methods/set\";\r\nimport { luckysheetrefreshgrid, jfrefreshgrid } from \"./global/refresh\";\r\nimport functionlist from \"./function/functionlist\";\r\nimport { luckysheetlodingHTML } from \"./controllers/constant\";\r\nimport { getcellvalue, getdatabyselection } from \"./global/getdata\";\r\nimport { setcellvalue } from \"./global/setdata\";\r\nimport { selectHightlightShow } from \"./controllers/select\";\r\nimport { zoomInitial } from \"./controllers/zoom\";\r\n// import { printInitial } from \"./controllers/print\";\r\nimport method from \"./global/method\";\r\n\r\nimport * as api from \"./global/api\";\r\n\r\nimport flatpickr from \"flatpickr\";\r\nimport Mandarin from \"flatpickr/dist/l10n/zh.js\";\r\nimport { initListener } from \"./controllers/listener\";\r\nimport { hideloading, showloading } from \"./global/loading.js\";\r\nimport { luckysheetextendData } from \"./global/extend.js\";\r\nimport { initChat } from './demoData/chat.js'\r\n\r\nlet luckysheet = {};\r\n\r\n// mount api\r\n// luckysheet.api = api;\r\n// Object.assign(luckysheet, api);\r\n\r\nluckysheet = common_extend(api, luckysheet);\r\n\r\n//创建luckysheet表格\r\nluckysheet.create = function (setting) {\r\n    method.destroy();\r\n    // Store original parameters for api: toJson\r\n    Store.toJsonOptions = {};\r\n    for (let c in setting) {\r\n        if (c !== \"data\") {\r\n            Store.toJsonOptions[c] = setting[c];\r\n        }\r\n    }\r\n\r\n    let extendsetting = common_extend(defaultSetting, setting);\r\n\r\n    let loadurl = extendsetting.loadUrl,\r\n        menu = extendsetting.menu,\r\n        title = extendsetting.title;\r\n\r\n    let container = extendsetting.container;\r\n    Store.container = container;\r\n    Store.luckysheetfile = extendsetting.data;\r\n    Store.defaultcolumnNum = extendsetting.column;\r\n    Store.defaultrowNum = extendsetting.row;\r\n    Store.defaultFontSize = extendsetting.defaultFontSize;\r\n    Store.fullscreenmode = extendsetting.fullscreenmode;\r\n    Store.lang = extendsetting.lang; //language\r\n    Store.allowEdit = extendsetting.allowEdit;\r\n    Store.limitSheetNameLength = extendsetting.limitSheetNameLength;\r\n    Store.defaultSheetNameMaxLength = extendsetting.defaultSheetNameMaxLength;\r\n    Store.fontList = extendsetting.fontList;\r\n    server.gridKey = extendsetting.gridKey;\r\n    server.loadUrl = extendsetting.loadUrl;\r\n    server.updateUrl = extendsetting.updateUrl;\r\n    server.updateImageUrl = extendsetting.updateImageUrl;\r\n    server.title = extendsetting.title;\r\n    server.loadSheetUrl = extendsetting.loadSheetUrl;\r\n    server.allowUpdate = extendsetting.allowUpdate;\r\n\r\n    luckysheetConfigsetting.autoFormatw = extendsetting.autoFormatw;\r\n    luckysheetConfigsetting.accuracy = extendsetting.accuracy;\r\n    luckysheetConfigsetting.total = extendsetting.data[0].total;\r\n\r\n    luckysheetConfigsetting.loading = extendsetting.loading;\r\n    luckysheetConfigsetting.allowCopy = extendsetting.allowCopy;\r\n    luckysheetConfigsetting.showtoolbar = extendsetting.showtoolbar;\r\n    luckysheetConfigsetting.showtoolbarConfig = extendsetting.showtoolbarConfig;\r\n    luckysheetConfigsetting.showinfobar = extendsetting.showinfobar;\r\n    luckysheetConfigsetting.showsheetbar = extendsetting.showsheetbar;\r\n    luckysheetConfigsetting.showsheetbarConfig = extendsetting.showsheetbarConfig;\r\n    luckysheetConfigsetting.showstatisticBar = extendsetting.showstatisticBar;\r\n    luckysheetConfigsetting.showstatisticBarConfig = extendsetting.showstatisticBarConfig;\r\n    luckysheetConfigsetting.sheetFormulaBar = extendsetting.sheetFormulaBar;\r\n    luckysheetConfigsetting.cellRightClickConfig = extendsetting.cellRightClickConfig;\r\n    luckysheetConfigsetting.sheetRightClickConfig = extendsetting.sheetRightClickConfig;\r\n    luckysheetConfigsetting.pointEdit = extendsetting.pointEdit;\r\n    luckysheetConfigsetting.pointEditUpdate = extendsetting.pointEditUpdate;\r\n    luckysheetConfigsetting.pointEditZoom = extendsetting.pointEditZoom;\r\n\r\n    luckysheetConfigsetting.userInfo = extendsetting.userInfo;\r\n    luckysheetConfigsetting.userMenuItem = extendsetting.userMenuItem;\r\n    luckysheetConfigsetting.myFolderUrl = extendsetting.myFolderUrl;\r\n    luckysheetConfigsetting.functionButton = extendsetting.functionButton;\r\n\r\n    luckysheetConfigsetting.showConfigWindowResize = extendsetting.showConfigWindowResize;\r\n    luckysheetConfigsetting.enableAddRow = extendsetting.enableAddRow;\r\n    luckysheetConfigsetting.enableAddBackTop = extendsetting.enableAddBackTop;\r\n    luckysheetConfigsetting.addRowCount = extendsetting.addRowCount;\r\n    luckysheetConfigsetting.enablePage = extendsetting.enablePage;\r\n    luckysheetConfigsetting.pageInfo = extendsetting.pageInfo;\r\n\r\n    luckysheetConfigsetting.editMode = extendsetting.editMode;\r\n    luckysheetConfigsetting.beforeCreateDom = extendsetting.beforeCreateDom;\r\n    luckysheetConfigsetting.workbookCreateBefore = extendsetting.workbookCreateBefore;\r\n    luckysheetConfigsetting.workbookCreateAfter = extendsetting.workbookCreateAfter;\r\n    luckysheetConfigsetting.remoteFunction = extendsetting.remoteFunction;\r\n    luckysheetConfigsetting.customFunctions = extendsetting.customFunctions;\r\n\r\n    luckysheetConfigsetting.fireMousedown = extendsetting.fireMousedown;\r\n    luckysheetConfigsetting.forceCalculation = extendsetting.forceCalculation;\r\n    luckysheetConfigsetting.plugins = extendsetting.plugins;\r\n\r\n    luckysheetConfigsetting.rowHeaderWidth = extendsetting.rowHeaderWidth;\r\n    luckysheetConfigsetting.columnHeaderHeight = extendsetting.columnHeaderHeight;\r\n\r\n    luckysheetConfigsetting.defaultColWidth = extendsetting.defaultColWidth;\r\n    luckysheetConfigsetting.defaultRowHeight = extendsetting.defaultRowHeight;\r\n\r\n    luckysheetConfigsetting.title = extendsetting.title;\r\n    luckysheetConfigsetting.container = extendsetting.container;\r\n    luckysheetConfigsetting.hook = extendsetting.hook;\r\n\r\n    luckysheetConfigsetting.pager = extendsetting.pager;\r\n\r\n    luckysheetConfigsetting.initShowsheetbarConfig = false;\r\n\r\n    luckysheetConfigsetting.imageUpdateMethodConfig = extendsetting.imageUpdateMethodConfig;\r\n\r\n    if (Store.lang === \"zh\") flatpickr.localize(Mandarin.zh);\r\n\r\n    // Store the currently used plugins for monitoring asynchronous loading\r\n    Store.asyncLoad.push(...luckysheetConfigsetting.plugins.map(plugin => plugin.name));\r\n\r\n    // Register plugins\r\n    initPlugins(extendsetting.plugins, extendsetting);\r\n    Store.plugins = extendsetting.plugins;\r\n\r\n    // Store formula information, including internationalization\r\n    functionlist(extendsetting.customFunctions);\r\n\r\n    let devicePixelRatio = extendsetting.devicePixelRatio;\r\n    if (devicePixelRatio == null) {\r\n        devicePixelRatio = 1;\r\n    }\r\n    Store.devicePixelRatio = Math.ceil(devicePixelRatio);\r\n\r\n    //loading\r\n    const loadingObj = luckysheetlodingHTML(\"#\" + container);\r\n    Store.loadingObj = loadingObj;\r\n\r\n    if (loadurl == \"\") {\r\n        sheetmanage.initialjfFile(menu, title);\r\n        // luckysheetsizeauto();\r\n        initialWorkBook();\r\n    } else {\r\n        $.post(loadurl, { gridKey: server.gridKey }, function (d) {\r\n            let data = new Function(\"return \" + d)();\r\n            Store.luckysheetfile = data;\r\n\r\n            sheetmanage.initialjfFile(menu, title);\r\n            // luckysheetsizeauto();\r\n            initialWorkBook();\r\n\r\n            //需要更新数据给后台时，建立WebSocket连接\r\n            if (server.allowUpdate) {\r\n                server.openWebSocket();\r\n            }\r\n        });\r\n    }\r\n\r\n    initChat()\r\n};\r\n\r\nfunction initialWorkBook() {\r\n    luckysheetHandler(); //Overall dom initialization\r\n    initialFilterHandler(); //Filter initialization\r\n    initialMatrixOperation(); //Right click matrix initialization\r\n    initialSheetBar(); //bottom sheet bar initialization\r\n    formulaBarInitial(); //top formula bar initialization\r\n    rowColumnOperationInitial(); //row and coloumn operate initialization\r\n    keyboardInitial(); //Keyboard operate initialization\r\n    orderByInitial(); //menu bar orderby function initialization\r\n    zoomInitial(); //zoom method initialization\r\n    // printInitial(); //print initialization\r\n    initListener();\r\n}\r\n\r\n//获取所有表格数据\r\nluckysheet.getluckysheetfile = getluckysheetfile;\r\n\r\n//获取当前表格 选区\r\nluckysheet.getluckysheet_select_save = getluckysheet_select_save;\r\n\r\n//设置当前表格 选区\r\nluckysheet.setluckysheet_select_save = setluckysheet_select_save;\r\n\r\n//获取当前表格 config配置\r\nluckysheet.getconfig = getconfig;\r\n\r\n//二维数组数据 转化成 {r, c, v}格式 一维数组 (传入参数为二维数据data)\r\nluckysheet.getGridData = sheetmanage.getGridData;\r\n\r\n//生成表格所需二维数组 （传入参数为表格数据对象file）\r\nluckysheet.buildGridData = sheetmanage.buildGridData;\r\n\r\n// Refresh the canvas display data according to scrollHeight and scrollWidth\r\nluckysheet.luckysheetrefreshgrid = luckysheetrefreshgrid;\r\n\r\n// Refresh canvas\r\nluckysheet.jfrefreshgrid = jfrefreshgrid;\r\n\r\n// Get the value of the cell\r\nluckysheet.getcellvalue = getcellvalue;\r\n\r\n// Set cell value\r\nluckysheet.setcellvalue = setcellvalue;\r\n\r\n// Get selection range value\r\nluckysheet.getdatabyselection = getdatabyselection;\r\n\r\nluckysheet.sheetmanage = sheetmanage;\r\n\r\n// Data of the current table\r\nluckysheet.flowdata = function () {\r\n    return Store.flowdata;\r\n};\r\n\r\n// Set selection highlight\r\nluckysheet.selectHightlightShow = selectHightlightShow;\r\n\r\n// Reset parameters after destroying the table\r\nluckysheet.destroy = method.destroy;\r\n\r\nluckysheet.showLoadingProgress = showloading;\r\nluckysheet.hideLoadingProgress = hideloading;\r\nluckysheet.luckysheetextendData = luckysheetextendData;\r\n\r\nluckysheet.locales = locales;\r\n\r\n// 获取条件格式渲染的单元格数量\r\nluckysheet.getConditionFormatCells = getConditionFormatCells;\r\n\r\nexport { luckysheet };\r\n"
  },
  {
    "path": "src/css/iconCustom.css",
    "content": ".luckysheet-icon-img-container.iconfont-luckysheet,\r\n.luckysheet-submenu-arrow .iconfont-luckysheet\r\n{\r\n    font-size: 24px;\r\n}\r\n\r\n.luckysheet-toolbar-menu-button .luckysheet-iconfont-xiayige,\r\n.luckysheet-toolbar-combo-button .luckysheet-iconfont-xiayige\r\n{\r\n    font-size: 12px;\r\n    top: -8px;\r\n    left: -3px;\r\n}\r\n\r\n.luckysheet-toolbar-select .luckysheet-iconfont-xiayige{\r\n    margin-right: 4px;\r\n}\r\n\r\n#luckysheet-icon-morebtn{\r\n    position: absolute;\r\n    right: 15px;\r\n    transform: translate(0,-50%);\r\n    top: 50%;\r\n}\r\n\r\n\r\n.toolbar .luckysheet-icon-text-color,\r\n.toolbar .luckysheet-icon-cell-color,\r\n.toolbar .luckysheet-icon-border-all,\r\n.toolbar .luckysheet-icon-valign,\r\n.toolbar .luckysheet-icon-textwrap\r\n{\r\n    margin-right: -3px;\r\n}\r\n\r\n.toolbar .luckysheet-icon-merge-button,\r\n.toolbar .luckysheet-icon-align,\r\n.toolbar .luckysheet-icon-rotation,\r\n.toolbar .luckysheet-icon-function,\r\n.toolbar .luckysheet-freezen-btn-horizontal\r\n{\r\n    margin-right: -4px;\r\n}\r\n\r\n#luckysheet-icon-morebtn{\r\n    padding: 2px 13px 0 5px;\r\n}\r\n#luckysheet-icon-morebtn .iconfont-luckysheet{\r\n    top:-9px;\r\n}\r\n\r\n\r\n/* custom common style */\r\n\r\n.lucky-button-custom{\r\n    cursor: pointer;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n}\r\n.lucky-button-custom:hover{\r\n    background-color: #E1E4E8;\r\n}\r\n\r\n/* more button border */\r\n#luckysheet-icon-morebtn-div{\r\n    border: 1px solid rgb(212, 212, 212);\r\n}\r\n\r\n/* sheet bar add/menu button */\r\n/* #luckysheet-sheets-add, #luckysheet-sheets-m{\r\n    padding: 1px 3px;\r\n} */\r\n.luckysheet-sheets-add .iconfont-luckysheet, .luckysheet-sheets-m .iconfont-luckysheet {\r\n    font-size: 21px;\r\n}\r\n\r\n/* sheet bar left/right scroll */\r\n#luckysheet-sheets-leftscroll , #luckysheet-sheets-rightscroll{\r\n    padding:6px 10px;\r\n}\r\n\r\ninput.luckysheet-mousedown-cancel{\r\n    border:1px solid #A1A1A1;\r\n}\r\ninput.luckysheet-mousedown-cancel:focus{\r\n    border: 1px solid rgb(1, 136, 251);\r\n    outline: none;\r\n}\r\n"
  },
  {
    "path": "src/css/luckysheet-cellFormat.css",
    "content": ".luckysheet-cellFormat-config{\r\n    display: none;\r\n}\r\n\r\n.luckysheet-cellFormat-config .luckysheet-modal-dialog-content{\r\n    position: relative;\r\n    height: 550px;\r\n    width: 600px;\r\n}\r\n\r\n.luckysheet-cellFormat-menu-c{\r\n    position: absolute;\r\n    width: 100%;\r\n    height: 30px;\r\n    border-right: 1px solid #fff;\r\n    border-bottom: 1px solid #d4d4d4;\r\n    font-size: 12px;\r\n}\r\n\r\n.luckysheet-cellFormat-menu{\r\n    position: relative;\r\n    display: inline-block;\r\n    height: 30px;\r\n    width: 80px;\r\n    text-align: center;\r\n    line-height: 30px;\r\n    border: 1px solid #d4d4d4;\r\n    border-bottom: none;\r\n    background: #F0F0F0;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-cellFormat-menu:hover{\r\n    background: #e7e7e7;\r\n}\r\n\r\n\r\n.luckysheet-cellFormat-menu-active{\r\n    background: #fff;\r\n    cursor: default;\r\n}\r\n\r\n.luckysheet-cellFormat-menu-active:hover{\r\n    background: #fff;\r\n}\r\n\r\n\r\n.luckysheet-cellFormat-content{\r\n    position: absolute;\r\n    top:30px;\r\n    bottom: 0px;\r\n    width: 100%;\r\n    border: 1px solid #d4d4d4;\r\n    border-top: none;\r\n}\r\n\r\n.luckysheet-cellFormat-protection{\r\n    position: relative;\r\n    margin-top: 30px;\r\n    margin-left: 40px;\r\n}\r\n\r\n.luckysheet-cellFormat-protection span{\r\n    font-size: 12px;\r\n    color:#ff2929;\r\n    padding-left: 12px;\r\n}"
  },
  {
    "path": "src/css/luckysheet-core.css",
    "content": "﻿/* body {\r\n    margin: 0px;\r\n    height: 100%;\r\n    overflow: hidden;\r\n}\r\n */\r\n\r\n::-webkit-scrollbar-track {\r\n    background-color: transparent;\r\n}\r\n\r\n.luckysheet-noselected-text {\r\n    -moz-user-select: -moz-test;\r\n    -khtml-user-select: none;\r\n    -webkit-user-select: none;\r\n    -ms-user-select: none;\r\n    user-select: none;\r\n}\r\n\r\n.chart-moveable {\r\n    cursor: move;\r\n}\r\n\r\n.luckysheet {\r\n    position: absolute;\r\n    /*width: 100%;\r\n    height: 100%;*/\r\n    font-size: 12px;\r\n    font-family: \"Helvetica Neue\", Helvetica, Arial, \"PingFang SC\", \"Hiragino Sans GB\", \"Heiti SC\", \"Microsoft YaHei\",\r\n        \"WenQuanYi Micro Hei\", sans-serif;\r\n    border: 1px solid #e5e5e5;\r\n    background: #fff;\r\n}\r\n\r\n.luckysheet * {\r\n    box-sizing: initial;\r\n    outline: none;\r\n}\r\n\r\n.luckysheetLoaderGif {\r\n    /*换用GIF loading*/\r\n    width: 8em;\r\n    height: 8em;\r\n    position: absolute;\r\n    top: 50%;\r\n    left: 50%;\r\n    -ms-transform: translate(-50%, -100%);\r\n    -moz-transform: translate(-50%, -100%);\r\n    -o-transform: translate(-50%, -100%);\r\n    transform: translate(-50%, -100%);\r\n\r\n    background-image: url(loading.gif);\r\n    background-repeat: no-repeat;\r\n    background-position: center;\r\n    background-size: 100% 100%;\r\n}\r\n\r\n.luckysheet-loading-mask {\r\n    position: absolute;\r\n    z-index: 1000000000;\r\n    margin: 0;\r\n    top: 0;\r\n    right: 0;\r\n    bottom: 0;\r\n    left: 0;\r\n    width: 100%;\r\n    height: 100%;\r\n    background: #fff;\r\n}\r\n\r\n.luckysheet-loading-content {\r\n    position: relative;\r\n    top: 50%;\r\n    transform: translateY(-50%);\r\n    width: 100%;\r\n    font-size: 14px;\r\n    color: #409eff;\r\n    text-align: center;\r\n}\r\n\r\n.luckysheet-loading-image {\r\n    width: 8em;\r\n    height: 8em;\r\n    margin: 0 auto;\r\n}\r\n\r\n.luckysheet-loading-text {\r\n    margin-top: 1em;\r\n}\r\n\r\n.luckysheet-loading-image .image-type {\r\n    width: 100%;\r\n    height: 100%;\r\n    background-repeat: no-repeat;\r\n    background-position: center;\r\n    background-size: 100% 100%;\r\n}\r\n\r\n.luckysheet-loading-image .path-type {\r\n    width: 100%;\r\n    height: 100%;\r\n}\r\n\r\n.luckysheet-work-area {\r\n    height: 90px;\r\n    width: 100%;\r\n    position: relative;\r\n}\r\n\r\n.luckysheet_info_detail {\r\n    position: relative;\r\n    left: 0px;\r\n    top: 0px;\r\n    margin: 0px;\r\n    padding: 0 17px;\r\n    /* width: 100%; */\r\n    height: 56px;\r\n    display: flex;\r\n    align-items: center;\r\n    background: rgba(255, 255, 255, 1);\r\n    box-shadow: 0px -1px 0px 0px rgba(230, 231, 232, 1);\r\n    border-bottom: 1px solid #d4d4d4;\r\n}\r\n\r\n.luckysheet_info_detail .sheet-name {\r\n    margin: auto;\r\n}\r\n\r\n.luckysheet_info_detail div.luckysheet_info_detail_back {\r\n    font-size: 14px;\r\n    padding: 0 8px;\r\n    margin-right: 18px;\r\n    border-radius: 3px;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet_info_detail div.luckysheet_info_detail_back:hover {\r\n    background: #eee;\r\n}\r\n\r\n.luckysheet_info_detail .luckysheet_info_detail_input {\r\n    border: 1px solid transparent;\r\n    border-radius: 3px !important;\r\n    color: #000000;\r\n    font-size: 16px;\r\n    height: 26px;\r\n    line-height: 22px;\r\n    margin: 0;\r\n    min-width: 1px;\r\n    padding: 2px 7px;\r\n    visibility: hidden;\r\n}\r\n\r\n.luckysheet_info_detail .luckysheet_info_detail_input:hover {\r\n    border: 1px solid #e5e5e5;\r\n}\r\n\r\n.luckysheet_info_detail .luckysheet_info_detail_input:focus {\r\n    -webkit-appearance: none;\r\n    -moz-appearance: none;\r\n    border: 1px solid #0188fb !important;\r\n    -webkit-box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1);\r\n    -moz-box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1);\r\n    box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.1);\r\n    color: #000;\r\n    outline: none;\r\n}\r\n\r\n.luckysheet_info_detail_update {\r\n    color: #cbcbcb;\r\n    font-size: 12px;\r\n    margin-left: 15px;\r\n}\r\n\r\n.luckysheet_info_detail_user {\r\n    /* right: 20px; */\r\n    font-size: 12px;\r\n    cursor: pointer;\r\n    margin-left: 10px;\r\n    /* position: absolute; */\r\n}\r\n#luckysheet_info_detail_user_img {\r\n    vertical-align: middle;\r\n    height: 20px;\r\n    line-height: 20px;\r\n    border-radius: 50%;\r\n    object-fit: cover;\r\n}\r\n.luckysheet_info_detail_save {\r\n    color: #828282;\r\n    font-size: 12px;\r\n    margin: 0 5px;\r\n}\r\n\r\n.luckysheet-share-logo {\r\n    height: 32px;\r\n    width: 152px;\r\n    z-index: 1;\r\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAAAgCAYAAADuW7E5AAAN7ElEQVR4Xu2be5BU1Z3Hv7/Tj2EYkEA0Uj4QTBRBZgofYFAWHzGlVLlqNGg0u6vZVKBqLVmZ7kGcvnf6dt/bDMx0D4RNYiRGd92EcmFZDRrAWl/J6ho3JJAZhELBRQTj+lgfMEhP973frdMzPdMzdM8rTFadOX/N3Ps7557zO5/zO7/f75yWKittYZBFKfXvO+oCLw6y+ki1YaABGQFsGMzy/+MQOwEj5CR4nDCgvijZRshOhczeZmv0wQHVHREeFhroAszDZMA7dyCjpuANgbwF4S9arPJfD6TuiOzw0MCfFbAqi2fQS98AJZeB0DCXtcTKKoeHqofnKIsCRsgUQIJ9qUSAoxQcE3iNLbHytaXkq2xORTa73IN3owCqQO7NlljZpL6+M/L+s6uBEoCpqRD0CRiINoAZAImd8VH/cJwaLPormVkJcDEA//FqkmdbYsGvfXbVN9LzvjQwZICdb3GCQmY9yJIAUZDYaZUZfXVy5P1nVwNDAthki6PGsk07/bN6U40ncskrVvC/+qM+a3lyukecSRfv2XXh3/WnzlDJRJzGaqGcAXCzY9Y8PVTf6a3dT0Mf+jPuIQGsMpr+OYDb++jAtpZYWa8AFtaPOMkHhFgIyFbHDM3vz+CGSsawk9sAXCSCiG2Elw/Vd3pr99PQh8L+WZalsr6x1wLeMceseTb/7oQDNsNK3yTExr6ULvSubo6XP9OXXP79CGDdNfVpA8xwkr8CMU9ElthGaPXQAKadeq9tJwRT+wDn8ZZY2Tf6C5eWGwHsUw6YndoFcNqQAlYVS99GD+t6BUewu/WT1jmvr5zw0VACVpdIft2lTBCqZsdcsrvwW7Wx5HzxyUleFtvrrdCr+XcdZv46gHNFUEHyIEU9lzBCvymsX8p6GPbqqRR3ppbV3/UHfYczmcxl+n9/ZtQvY7G7jnTf9ptmA5wixGHHDG3W75bV14/3Z4PfAvhlQEfy6k1AbXLMe/aU6kPGl7k/4AbvIL1zKXJQebLFrgtt76nfJU1N5RWt3jVCXECRLwLc58tmN8Ziyw4Umwsz3nQ+hfNEMJ1EK4AX/O7hzZZleQU7y1xAThcyBeB0QB6hYLPQ+x/HrHn+hG6RM6LpJwS4rhQ4BA9Q8LVXrFF7BwLXYCxYb1uIUWS11SZWn6o890mAFxfp2/o9zS/fvmHDBle/K9a25TTNztLbCmA8RLb6s4dvTgcnVPjctjd1QlkUvmdHwg/2gETDfQ4g9ztm6O8Mu0n7MBsAjOnRBw+g7Zg1nRcTuvogD5G8pn1yO4ogA6pFjln9cP6RYa+aRvE2Czm5e9s8pqAWx83QTwqfm05qJckwuuctIcDLPhfXWVb4PS1vOslNJP6yp85E8IxthK8+cYDtLvtR5fTMBwDHFoNHhC8CZTc1W/LOQOH6cwBm2KktAK8F+L6IzxLxXnOJWQLUgiinwEwYYacYYBEnOVeIXwI4CZQNPvfjv4rFYm0dstqi36ZXv2OG/6LTWrYD+bL+31O+i4KZj3ZkfWP0pI0H8KTn8cdK+TJCzqfC32s5Qr6aMKpzUXcesJy1FDwl4P0UNZ4eNYRnAXjP7449y7IWHV24cGHg1Enn7iAxHcDvhCpJ4cci+LpH3i26CWJ2PjqPOMlvC/EzgG2AagTkBVGcCJc1lFwbmxwzfEMOsETqTpDTSH4X0FYRz4pgG8m9jlnzE5kZbzfhrscLSDf3t1DNJTC6bxCoV7Q2lwkqbFGU13rWIfG+gAlXyn64KyY5pQ+mDNQHG4gFq0ukrvQ8PqvVLMo3x669Jzfx7RPZFAK8JIB9jhn+Sk/AfORvMpBNAlRQ8GAge2RR4RZyX7zhcp+o5wlQ4J3jmEv3ta/81PfJXAJ6u2OGL4w2NEx00+qPOZCE1yeMmifyfTCdpnrS06cr6xwztKmwDyT2v3vq2HPXLlqkE96IOKlLhXox63bcWQnj3m2GnbwbwBqA72Zbs1NXrLjvg662U40dlioHzd1r1pSN+zD9OkROI2Em6toXlS7RaMNE16+01R3jKe/i5ZGlv+/SUwkfLC8ww8pcIXRzpo6Q68HilqgEHAlRvj+A3q/a68MTyA5R8uiRo/61r6+UAflbxb4xpIDZKcsDowB2OGb4gsLva7+l/BP3HP0smGndqeHphBd42gMuE6AcQMoxw3pLOa4YduMuQKYJEbfrwtH169f7mve8eQjgqRTclTDCP8pBF0++0m4h5CiFjwqxxT/G97S1ZMmHPRst2CLX2EYoZ+F0WbBggW9q1SXHtNtHjzclojWPmfHU4xTeoLct0tctrSLizSD5fQKZV5snlU+feajS9dyc/yaUOyiqxy0ZrxHghRREE0Y43m/AqqyjZxBydq4CcR4pZSVgOu6xUurFTCDwx0DWvdQVvq2O+ne1rJDOVdLfdnqTG0rADDv1c4A6b/dvjhm+ua/+Fm5PeVkRNNhG+N7igCU1AKsp2J+IhM42nFXXAN4WDVImkDlt5bJluQUYcVJnAvypEFfr+e1oKwvgeaVkeTwSeq5rQttzcYAYjhlKFH7XsJMayHEU+VbCCP1LxEnuFuK8vsblC/jPymbdOUI+2pcsgIcdM/y3/QasHw12F1lA3/nnp6co+E7LBvyv8QjafP7M2VkVOLQnJm8NuL0+KgwlYJF48gERncTlVses6TOJWwCYJyKPkbw5t70K/saOhH7WcygdkeFBgKMB35WAqyfmrwXyiG2G7ugpH3GaTqfHa5R4VwKY3+HbuErktrgR0kFA0UCjAL5ugBl2UvttOqn9a0A9WUrVvmz2nzNKLlJKcjIiyiSRLiavhK/HjVBnvrNY4JRrY0AgWPRXeW0LPMHtArk879CL8n3TzXoHlGL+2GcvBY9lmF29J1ZxQmAbBGB6tV8BoNExw0vz47Ss5MlZH3RkNyqfs4k4qbCQjQIcrJw6afItt9ySixZ1MePJWRT5Jwg+eeeUMV/Vvk4BYKscM1xtOKkHkXNyeYziuzzviBfqNuKkHhbyTh0EQKghHiNU8+y66v/Qcpa1arKrvLkUHnHM8ONd/X1gdMZ/+EkhrhTgJdsMXzoIwB7RQJN4KlEXvrawXzXRhonlAf8cjx797pFNWd/oKYDKRfkUmXN8iqbxCiW+8Rnl7amvDe86YRZsRiz7DXHd+mJJVM9Tc7PK/99BtB3qDqy0ClnfHA8u1zv6gGDuITwIwB4C8B0Ar/jdIxdblnXMsix/1jdWR0e3tq/Q9qyzYTdqB1oraxSAascMr2qfdEtl/WPXgbxVRH5hG6Ebi03umjVryt75KP0CIDrF8RZFzU4Y1d10YcYbL6FIYT5tj2OGO7ctM95USfGa24Mmd4Zj3tuZuzMSqR/A410AfuuY4dkDByylc3s6aPCE6iq7rjrnK3fo4wkdPVPwXMIIX0VSTCelg5xZItiiModvzEfE5vKmyz3Xe0YAn0vvivq6pbl2cv1xkttBzATEcsxQLP+8TwvWcXD901JnizmHPh08WftcldG0jiJzkVa3Iuqxw/Dfvt8S7XwOqnQB1nv1AmiuAiR/FPUGgJdJVInk+qfNfkVh1tmwU3GAZi5gJ7VV2QfBLBAzALQK1Ry7rrql1ORGV6ye5GbcbQBPEeC3PveL8yzrO93Ga9iN2wFpT8SK1NhGSEennXNh2I3PIbcz4H8BPKWTm0pkKsG5ud1GieFE2v2t3qPk7j6Yljfjjf9KkZu1M68EWz3gfQDzhNB+9xG/4mVWpEYDjlqr4ULlUy/puEZEdNT4n3pcJHS+zV9sazec5D+CuAMiLgi9uBocM/TDXgHLXblhm04e9nIoLb9viQUv0h2bYaUbhKgpgcC6lljZtwdFV7ejov4BpqUiTnKZkLH85UkB3iZkEYAVxY41DDv1PYANAL7QNe3YIUrdY9e2r/reJtewG68mZKte4R0phW7j7UoXoM3v8kzLqumWE7xv+ZpTfG5mNcFb29voLB8A8mO/e9jIp0AGCtjChQ8EvnTmxxGILNV5vYK2nxfKPXZd6A+Fmq2NNsxUfqUTw7m57Sg6d5ZQmcOr81Yt/0L7jUI+BFCnuiryFwFKA6bPFZHZ2tt9rtxKVGppczTQqP+eGm09LYjAqwArimMgi1piwZI3XwcLX2/1lq5cOTaQCUzTMu8eqNi+dm17vqiXIobdOJkipwcCwf3WvYv1avyTtvcCMHPbtpAb7bqab5bqg2Wt+kJbAJN9bmYchW9/aVz5/sWLFxd1tgeqM50i2bX3wDlu1jc+6//k1fraWm3JShbLapoAP8/L0ve+3/1wn2VZOqrtdykJWGW0LQWwureWdBL1aDr45cI8V1VdOkJBZ3KuR/23ZUzwK801os+1hlVpt07pA4CMAtR8x6zWO8PnvhQFTN+hZ7ZtZ/FrzgU6Iatb4qNyDnFXoVRa2Y2gV/S2BEW+u9MK6pU8rErESRpC2AAP+N3WKYXZ/s+zIooDFs1sJLybehu4PlvMsuyqYsc/fQQGm1piZblzrOFSdLTmqjG7qY9fhPX5M83hMP7jANM/LfPY9kaPX//0sFF4QyE4u6+D68pom05e6pB1YmcDgkMtVtkZw0G5I2MskmitrDt2F0R+UFI5gt0eeH1/r9xUNbLCa83cKuQNkFxEcnILgqNhSeedopGJ+Pxq4DgLVmml14G56yXFyuOtx1rvHOhlwW4NWVQjcH1+geo5suMBi6Y7DlG7iW4TessGcod++KhwZKS9+uo9X1ZG0zpbPQ6Q1yh8iZBN/f1p2YiqRzTQUwP/ByH3mYpBTz2UAAAAAElFTkSuQmCC\");\r\n}\r\n\r\n.luckysheet-wa-editor {\r\n    height: 32px;\r\n    /* background: #f7f7f7; */\r\n    background: #fafafc;\r\n    position: relative;\r\n    /* padding-left: 15px; */\r\n    /* padding: 0px 0px 10px 15px; */\r\n    padding: 5px 0px 3px 15px;\r\n    border-bottom: 1px solid #d4d4d4;\r\n    white-space: nowrap;\r\n    transition: all 0.2s;\r\n}\r\n\r\n/* \r\n.luckysheet-wa-editor>div.luckysheetfulltoolbar {\r\n    display: inline-block;\r\n    height: 34px;\r\n    padding: 0px 5px;\r\n    line-height: 34px;\r\n    font-size: 13px;\r\n    transition: all 0.2s;\r\n    -moz-transition: all 0.2s;\r\n    -webkit-transition: all 0.2s;\r\n    -o-transition: all 0.2s;\r\n    vertical-align: middle;\r\n}\r\n\r\n.luckysheet-wa-editor>div.luckysheetfulltoolbar:hover {\r\n    background: #0188fb;\r\n    color: #FAFAFA;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-wa-editor>div.luckysheetfulltoolbar:active {\r\n    background: #FB4747;\r\n    color: #FFFFFF;\r\n    -webkit-box-shadow: inset 0 0 2px #727272;\r\n    -moz-box-shadow: inset 0 0 2px #727272;\r\n    box-shadow: inset 0 0 2px #727272;\r\n    cursor: pointer;\r\n} */\r\n\r\n/*toolbar菜单start*/\r\n\r\n.luckysheet-toolbar-left-theme {\r\n    width: 15px;\r\n    /* background: #0188fb;  */ /* 工具栏左边的蓝色背景 */\r\n    position: absolute;\r\n    left: 0px;\r\n    top: 1px;\r\n    bottom: 1px;\r\n}\r\n\r\n.luckysheet-inline-block {\r\n    position: relative;\r\n    display: -moz-inline-box;\r\n    display: inline-block;\r\n}\r\n\r\n/*分隔符*/\r\n.luckysheet-toolbar-separator {\r\n    line-height: normal;\r\n    list-style: none;\r\n    outline: none;\r\n    overflow: hidden;\r\n    padding: 0;\r\n    text-decoration: none;\r\n    width: 0;\r\n    /* height: 35px; */\r\n    height: 20px;\r\n    vertical-align: top;\r\n    border-left: 1px solid #e0e0e0;\r\n    /* margin: 0 1px; */\r\n    margin: 5px 1px;\r\n}\r\n\r\n/*combo*/\r\n.luckysheet-toolbar-combo-button {\r\n    -webkit-border-radius: 2px;\r\n    -moz-border-radius: 2px;\r\n    border-radius: 2px;\r\n    -webkit-user-select: none;\r\n    -moz-user-select: none;\r\n    -ms-user-select: none;\r\n    background: 0;\r\n    border-color: transparent;\r\n    border-style: solid;\r\n    border-width: 1px;\r\n    outline: none;\r\n    padding: 0;\r\n    color: #333;\r\n    list-style: none;\r\n    font-size: 11px;\r\n    font-weight: bold;\r\n    text-decoration: none;\r\n    cursor: default;\r\n    /* top: 2px; */\r\n    height: 26px;\r\n    line-height: 26px;\r\n    vertical-align: inherit;\r\n    margin: 0 1px;\r\n}\r\n\r\n.luckysheet-toolbar-combo-button:hover {\r\n    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\r\n    -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\r\n    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\r\n    background-color: #f8f8f8;\r\n    background-image: -webkit-linear-gradient(to bottom, #f8f8f8, #f1f1f1);\r\n    background-image: -moz-linear-gradient(to bottom, #f8f8f8, #f1f1f1);\r\n    background-image: -ms-linear-gradient(to bottom, #f8f8f8, #f1f1f1);\r\n    background-image: -o-linear-gradient(to bottom, #f8f8f8, #f1f1f1);\r\n    background-image: linear-gradient(to bottom, #f8f8f8, #f1f1f1);\r\n    border-color: #c6c6c6 !important;\r\n    color: #222;\r\n\r\n    border-width: 1px;\r\n    border-color: transparent !important;\r\n    background-color: rgba(0, 0, 0, 0.06);\r\n    background-image: none;\r\n    cursor: pointer;\r\n    -webkit-box-shadow: none;\r\n    -moz-box-shadow: none;\r\n    box-shadow: none;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-toolbar-combo-button:hover .luckysheet-toolbar-combo-button-input {\r\n    border-right-color: rgba(0, 0, 0, 0.12);\r\n}\r\n\r\n.luckysheet-toolbar-combo-button-open {\r\n    color: #222;\r\n    border-width: 1px;\r\n    border-color: transparent !important;\r\n    background-color: rgba(0, 0, 0, 0.12);\r\n    background-image: none;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-toolbar-combo-button-open .luckysheet-toolbar-combo-button-input {\r\n    background: transparent;\r\n    border-right: 1px solid transparent !important;\r\n}\r\n\r\n.luckysheet-toolbar-combo-button-outer-box,\r\n.luckysheet-toolbar-combo-button-inner-box {\r\n    border: 0;\r\n    vertical-align: top;\r\n    margin: 0;\r\n    padding: 0;\r\n}\r\n\r\n/* .luckysheet-toolbar-combo-button-inner-box {\r\n    padding: 0 2px;\r\n    margin: 0 1px;\r\n} */\r\n\r\n.luckysheet-toolbar-zoom-combobox .luckysheet-toolbar-combo-button-caption {\r\n    /* width: 48px !important; */\r\n    width: 36px !important;\r\n}\r\n\r\n.luckysheet-toolbar-combo-button-caption {\r\n    padding: 0;\r\n    margin: 0 0 0 -3px;\r\n}\r\n\r\n.luckysheet-toolbar-combo-button-input {\r\n    background: transparent;\r\n    border: 1px solid transparent !important;\r\n    color: #333;\r\n    font-family: Arial, sans-serif !important;\r\n    font-size: 11px !important;\r\n    font-weight: bold !important;\r\n    height: 20px !important;\r\n    overflow: hidden !important;\r\n    color: rgba(0, 0, 0, 0.7);\r\n    height: 22px !important;\r\n    width: 22px;\r\n}\r\n\r\n.luckysheet-toolbar-combo-button-input:focus {\r\n    box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.3);\r\n    background: #fff;\r\n    outline: none;\r\n    border: 1px solid #0188fb !important;\r\n}\r\n\r\n.luckysheet-toolbar-textinput {\r\n    -webkit-border-radius: 1px;\r\n    -moz-border-radius: 1px;\r\n    border-radius: 1px;\r\n    border: 1px solid #d9d9d9;\r\n    border-top: 1px solid #c0c0c0;\r\n    font-size: 13px;\r\n    height: 25px;\r\n    /* padding: 1px 8px; */\r\n    padding: 1px 0px 1px 8px;\r\n}\r\n\r\n.luckysheet-toolbar-combo-button-dropdown {\r\n    /* background: url(arrow-down.png) center no-repeat; */\r\n    float: right;\r\n    margin: 9px 0 0 0px;\r\n    padding: 0 0 0 1px;\r\n    min-width: 7px;\r\n    opacity: 0.8;\r\n    vertical-align: middle;\r\n    width: 5px;\r\n    height: 7px;\r\n\r\n    margin-top: 10px;\r\n}\r\n\r\n/*menubar*/\r\n.luckysheet-toolbar-color-menu-button .luckysheet-toolbar-menu-button-caption {\r\n    top: -2px;\r\n}\r\n\r\n.luckysheet-color-menu-button-indicator {\r\n    position: relative;\r\n    /* border-bottom: 4px solid #f0f0f0; */\r\n    height: 20px;\r\n    /* border-bottom-color: transparent; */\r\n}\r\n\r\n.luckysheet-color-menu-button-indicator .text-color-bar {\r\n    position: absolute;\r\n    bottom: 0px;\r\n    background-color: #0081f9;\r\n    height: 3px;\r\n    width: 55%;\r\n    left: 30%;\r\n}\r\n\r\n.luckysheet-toolbar-button-inner-box .luckysheet-icon,\r\n.luckysheet-toolbar-menu-button-caption .luckysheet-icon,\r\n.luckysheet-toolbar-menu-button-caption .luckysheet-color-menu-button-indicator .luckysheet-icon {\r\n    margin-top: 0px;\r\n}\r\n\r\n/*menubutton*/\r\n.luckysheet-toolbar-menu-button-caption {\r\n    padding: 0;\r\n    margin: 0;\r\n}\r\n\r\n.luckysheet-toolbar-menu-button-inner-box {\r\n    margin: 0px 2px;\r\n}\r\n\r\n.luckysheet-toolbar-menu-button-dropdown {\r\n    /* background: url(arrow-down.png) center no-repeat; */\r\n    float: right;\r\n    margin: 10px 2px 0 3px;\r\n    padding: 0;\r\n    opacity: 0.8;\r\n    vertical-align: middle;\r\n    width: 5px;\r\n    height: 7px;\r\n\r\n    margin-left: 4px;\r\n    margin-right: 0;\r\n\r\n    margin-top: 10px;\r\n}\r\n\r\n.luckysheet-toolbar-button-split-right .luckysheet-toolbar-menu-button-dropdown {\r\n    padding: 0px 3px;\r\n}\r\n\r\n/* .luckysheet-toolbar-select {\r\n    margin-left: 1px;\r\n} */\r\n\r\n/*split*/\r\n.luckysheet-toolbar-button-split-left,\r\n.luckysheet-toolbar-button-split-left * {\r\n    border-top-right-radius: 0 !important;\r\n    border-bottom-right-radius: 0 !important;\r\n    margin-right: 0;\r\n}\r\n\r\n.luckysheet-toolbar-button-split-right,\r\n.luckysheet-toolbar-button-split-right * {\r\n    border-top-left-radius: 0 !important;\r\n    border-bottom-left-radius: 0 !important;\r\n    min-width: 5px !important;\r\n    margin-left: 0;\r\n}\r\n\r\n#luckysheet-icon-merge-menu {\r\n    margin-right: 1px;\r\n}\r\n\r\n/*button*/\r\n.luckysheet-toolbar-button,\r\n.luckysheet-toolbar-menu-button {\r\n    -webkit-border-radius: 2px;\r\n    -moz-border-radius: 2px;\r\n    border-radius: 2px;\r\n    -webkit-user-select: none;\r\n    -moz-user-select: none;\r\n    -ms-user-select: none;\r\n    background: 0;\r\n    border: 1px solid transparent;\r\n    outline: none;\r\n    padding: 0;\r\n    list-style: none;\r\n    font-size: 11px;\r\n    /* font-weight: bold; */\r\n    text-decoration: none;\r\n    vertical-align: middle;\r\n    cursor: default;\r\n\r\n    /* margin: 3px -3px 0px 2px; */\r\n    height: 26px;\r\n    line-height: 26px;\r\n    /* color: rgba(0, 0, 0, .7); */\r\n    color: #333;\r\n}\r\n\r\n.luckysheet-toolbar-button:hover,\r\n.luckysheet-toolbar-menu-button:hover,\r\n.luckysheet-toolbar-button-hover {\r\n    border: 1px solid transparent;\r\n    background-color: rgba(0, 0, 0, 0.06);\r\n    background-image: none;\r\n    box-shadow: none;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-toolbar-button-split-right.luckysheet-toolbar-menu-button:hover {\r\n    border-left-color: rgba(0, 0, 0, 0.12) !important;\r\n}\r\n\r\n.luckysheet-toolbar-button-split-right-hover {\r\n    border-width: 1px;\r\n    border-color: transparent !important;\r\n    background-color: rgba(0, 0, 0, 0.06);\r\n    cursor: pointer;\r\n    box-shadow: none;\r\n    border-left-color: rgba(0, 0, 0, 0.12) !important;\r\n}\r\n\r\n.luckysheet-toolbar-button:active,\r\n.luckysheet-toolbar-menu-button:active {\r\n    border: 1px solid transparent;\r\n    background-color: rgba(0, 0, 0, 0.12);\r\n    background-image: none;\r\n    box-shadow: none;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-toolbar-button-outer-box,\r\n.luckysheet-toolbar-menu-button-outer-box {\r\n    border: 0;\r\n    vertical-align: top;\r\n    margin: 0;\r\n    padding: 0;\r\n}\r\n\r\n.luckysheet-toolbar-button-inner-box,\r\n.luckysheet-toolbar-menu-button-inner-box {\r\n    padding: 0 2px;\r\n    padding: 0;\r\n    text-align: center;\r\n    height: 26px;\r\n    min-width: 26px;\r\n}\r\n\r\n.luckysheet-icon {\r\n    direction: ltr;\r\n    /* text-align: left; */\r\n    text-align: center;\r\n    overflow: hidden;\r\n    vertical-align: middle;\r\n    /* height: 18px;\r\n    width: 18px; */\r\n    height: 26px;\r\n    width: 26px;\r\n    /* margin: 1px 2px 2px 1px; */\r\n    margin: 2px;\r\n    /* opacity: .54; */\r\n}\r\n\r\n#luckysheet-icon-fmt-other .luckysheet-toolbar-menu-button-caption {\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n    width: 55px;\r\n    margin-left: 1px;\r\n    text-align: center;\r\n}\r\n\r\n#luckysheet-icon-font-family .luckysheet-toolbar-menu-button-caption {\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n    width: 55px;\r\n    margin-left: 1px;\r\n    /* text-align: left; */\r\n    text-align: center;\r\n}\r\n\r\n/* .luckysheet-icon-bold {\r\n    left: -18px;\r\n    top: -186px;\r\n}\r\n\r\n.luckysheet-icon-italic {\r\n    left: -36px;\r\n    top: -1606px;\r\n}\r\n\r\n.luckysheet-icon-strikethrough {\r\n    left: -54px;\r\n    top: -442px;\r\n}\r\n\r\n.luckysheet-icon-text-color {\r\n    left: -72px;\r\n    top: -1850px;\r\n}\r\n\r\n.luckysheet-icon-cell-color {\r\n    left: 0;\r\n    top: -406px;\r\n}\r\n\r\n.luckysheet-icon-border-all {\r\n    left: -54px;\r\n    top: -1552px;\r\n}\r\n\r\n.luckysheet-icon-merge {\r\n    left: -54px;\r\n    top: -1534px;\r\n}\r\n\r\n\r\n.luckysheet-icon-align-left {\r\n    left: -18px;\r\n    top: -1426px;\r\n}\r\n\r\n.luckysheet-icon-align-center {\r\n    left: -18px;\r\n    top: -334px;\r\n}\r\n\r\n.luckysheet-icon-align-right {\r\n    left: -36px;\r\n    top: -1588px;\r\n}\r\n\r\n\r\n.luckysheet-icon-valign-middle {\r\n    left: -72px;\r\n    top: -1390px;\r\n}\r\n\r\n.luckysheet-icon-valign-top {\r\n    left: -72px;\r\n    top: -442px;\r\n}\r\n\r\n.luckysheet-icon-valign-bottom {\r\n    left: 0;\r\n    top: -316px;\r\n}\r\n\r\n.luckysheet-icon-textwrap-wrap {\r\n    left: -36px;\r\n    top: -316px;\r\n}\r\n\r\n.luckysheet-icon-textwrap-overflow {\r\n    left: -58px;\r\n    top: -1116px;\r\n}\r\n\r\n.luckysheet-icon-textwrap-clip {\r\n    left: -54px;\r\n    top: -1444px;\r\n}\r\n\r\n.luckysheet-icon-rotation-none {\r\n    left: -36px;\r\n    top: -586px;\r\n}\r\n\r\n.luckysheet-icon-rotation-angleup {\r\n    left: -72px;\r\n    top: -1134px;\r\n}\r\n\r\n.luckysheet-icon-rotation-angledown {\r\n    left: -36px;\r\n    top: -186px;\r\n}\r\n\r\n.luckysheet-icon-rotation-vertical {\r\n    left: -36px;\r\n    top: -1282px;\r\n}\r\n\r\n.luckysheet-icon-rotation-rotation-up {\r\n    left: 0;\r\n    top: -1318px;\r\n}\r\n\r\n.luckysheet-icon-rotation-rotation-down {\r\n    left: -36px;\r\n    top: -1336px;\r\n}\r\n\r\n.luckysheet-icon-function {\r\n    left: -18px;\r\n    top: -460px;\r\n}\r\n\r\n\r\n\r\n.luckysheet-material-icon .luckysheet-icon-border-all {\r\n    left: -54px;\r\n    top: -1552px;\r\n}\r\n\r\n.luckysheet-icon-border-inside {\r\n    left: -36px;\r\n    top: -806px;\r\n}\r\n\r\n.luckysheet-icon-border-horizontal {\r\n    left: -58px;\r\n    top: -168px;\r\n}\r\n\r\n.luckysheet-icon-border-vertical {\r\n    left: 0;\r\n    top: -878px;\r\n}\r\n\r\n.luckysheet-icon-border-outside {\r\n    left: -54px;\r\n    top: -1246px;\r\n}\r\n\r\n.luckysheet-icon-border-left {\r\n    left: -54px;\r\n    top: 0;\r\n}\r\n\r\n.luckysheet-icon-border-top {\r\n    left: -36px;\r\n    top: -752px;\r\n}\r\n\r\n.luckysheet-icon-border-right {\r\n    left: -18px;\r\n    top: -406px;\r\n}\r\n\r\n.luckysheet-icon-border-bottom {\r\n    left: -72px;\r\n    top: -586px;\r\n}\r\n\r\n\r\n.luckysheet-icon-border-none {\r\n    left: -18px;\r\n    top: -1072px;\r\n}\r\n\r\n\r\n.luckysheet-icon-line-color {\r\n    left: -36px;\r\n    top: -622px;\r\n}\r\n\r\n.luckysheet-icon-line-type {\r\n    left: 0;\r\n    top: -126px;\r\n} */\r\n\r\n#luckysheet-icon-function .luckysheet-toolbar-menu-button-caption {\r\n    margin-right: 5px;\r\n    margin-left: -5px;\r\n}\r\n\r\n#luckysheet-icon-function .luckysheet-icon {\r\n    margin-right: 0px;\r\n}\r\n\r\n/* .luckysheet-icon-autofilter {\r\n    left: -36px;\r\n    top: -406px;\r\n} */\r\n\r\n#luckysheet-icon-pivotTable .luckysheet-toolbar-menu-button-caption {\r\n    color: #0188fb;\r\n}\r\n\r\n#luckysheet-icon-chart .luckysheet-toolbar-menu-button-caption {\r\n    color: #0188fb;\r\n}\r\n\r\n.luckysheet-rightgclick-menu-sub .sp-container {\r\n    background-color: #ffffff;\r\n    border: solid 1px #ffffff;\r\n}\r\n\r\n#luckysheet-icon-text-color-menu-menuButton .sp-palette-container,\r\n#luckysheet-icon-cell-color-menu-menuButton .sp-palette-container {\r\n    margin-bottom: -300px;\r\n}\r\n\r\n#luckysheet-icon-text-color-menu-menuButton .sp-palette,\r\n#luckysheet-icon-cell-color-menu-menuButton .sp-palette {\r\n    margin-top: -10px;\r\n}\r\n\r\n/*toolbar菜单end*/\r\n\r\n.luckysheet-wa-calculate {\r\n    height: 28px;\r\n    /*padding: 10px 8px;*/\r\n    background: #fff;\r\n    position: relative;\r\n    padding-right: 44px;\r\n    border-bottom: 1px solid #d4d4d4;\r\n}\r\n\r\n.luckysheet-wa-calculate-help {\r\n    height: 100%;\r\n    width: 99px;\r\n    border-right: 1px solid #d4d4d4;\r\n}\r\n\r\n.luckysheet-wa-calculate-help-box {\r\n    height: 100%;\r\n    width: 85px;\r\n    position: absolute;\r\n    top: 0px;\r\n    left: 0px;\r\n}\r\n\r\n#luckysheet-helpbox {\r\n    left: 0;\r\n    position: absolute;\r\n    right: 0;\r\n    top: 50%;\r\n    transform: translateY(-50%);\r\n    resize: none;\r\n    /* border: 1px #b9b9b9 solid; */\r\n    font-family: arial, sans, sans-serif;\r\n    font-size: 14px;\r\n    line-height: 14px;\r\n    background-color: #ffffff;\r\n    padding: 2px 5px;\r\n}\r\n\r\n.luckysheet-helpbox-cell-input {\r\n    width: 100%;\r\n    height: 100%;\r\n    margin: 0;\r\n    outline: none;\r\n    cursor: text;\r\n    -webkit-user-modify: read-write-plaintext-only;\r\n    white-space: nowrap;\r\n    overflow: hidden;\r\n    -webkit-transform: translateZ(0);\r\n    background-color: white;\r\n    word-wrap: break-word;\r\n    -webkit-nbsp-mode: space;\r\n    -webkit-line-break: after-white-space;\r\n}\r\n\r\n.luckysheet-wa-calculate-help-tool {\r\n    position: absolute;\r\n    left: 85px;\r\n    text-align: center;\r\n    height: 100%;\r\n    width: 13px;\r\n    border-left: 1px solid transparent;\r\n    border-right: 1px solid transparent;\r\n}\r\n.luckysheet-wa-calculate-help-tool .fa-caret-down {\r\n    position: absolute;\r\n    top: 50%;\r\n    left: 3px;\r\n    transform: translateY(-50%);\r\n}\r\n\r\n.luckysheet-wa-calculate-help-tool:hover {\r\n    background: #efefef;\r\n    cursor: pointer;\r\n    border-left: 1px solid #e5e5e5;\r\n    border-right: 1px solid #e5e5e5;\r\n}\r\n\r\n.luckysheet-wa-calculate-size {\r\n    position: absolute;\r\n    height: 3px;\r\n    width: 100%;\r\n    left: 0px;\r\n    bottom: 0px;\r\n    z-index: 1000;\r\n}\r\n\r\n.luckysheet-wa-calculate-size:hover {\r\n    background: #5e5e5e;\r\n    cursor: ns-resize;\r\n}\r\n\r\n#luckysheet-wa-functionbox-cancel {\r\n    left: 104px;\r\n    /* font-size: 18px; */\r\n}\r\n\r\n#luckysheet-wa-functionbox-confirm {\r\n    left: 130px;\r\n    /* font-size: 18px; */\r\n}\r\n\r\n.luckysheet-wa-functionbox {\r\n    position: absolute;\r\n    top: 50%;\r\n    transform: translateY(-50%);\r\n    /*background-color: #fff;*/\r\n    text-align: center;\r\n    left: 156px;\r\n    color: #d6d6d6;\r\n}\r\n\r\n.luckysheet-wa-functionbox span {\r\n    vertical-align: middle;\r\n    width: 30px;\r\n    height: 30px;\r\n}\r\n\r\n.luckysheet-wa-functionbox i {\r\n    font-size: 24px;\r\n}\r\n\r\n.luckysheet-wa-calculate-active {\r\n    color: #585858;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-wa-calculate-active:hover {\r\n    color: #0188fb;\r\n}\r\n\r\n.luckysheet-grid-container {\r\n    width: 100%;\r\n    position: absolute;\r\n    top: 90px;\r\n    bottom: 0px;\r\n}\r\n\r\n.luckysheet-stat-area {\r\n    position: absolute;\r\n    height: 23px;\r\n    bottom: 0px;\r\n    background: #ff00dc;\r\n    width: 100%;\r\n}\r\n\r\n.luckysheet-sta-c {\r\n    height: 22px;\r\n    background-color: #fff;\r\n    border-top: 1px solid #e1e1e1;\r\n    -moz-user-select: -moz-none;\r\n    -khtml-user-select: none;\r\n    -webkit-user-select: none;\r\n    -ms-user-select: none;\r\n    user-select: none;\r\n}\r\n\r\n.luckysheet-stat-area:hover .luckysheet-sta-c {\r\n    -moz-user-select: -moz-all;\r\n    -khtml-user-select: initial;\r\n    -webkit-user-select: initial;\r\n    -ms-user-select: initial;\r\n    user-select: initial;\r\n}\r\n\r\n.luckysheet-sta-c .luckysheet-sta-content {\r\n    /* position: absolute; */\r\n    /* left: 0px; */\r\n    /* right: 358px; */\r\n    height: 22px;\r\n    line-height: 22px;\r\n    text-align: right;\r\n    white-space: nowrap;\r\n    overflow: hidden;\r\n}\r\n\r\n.luckysheet-sta-c .luckysheet-sta-content span {\r\n    margin-right: 10px;\r\n}\r\n\r\n.luckysheet-grid-window {\r\n    position: absolute;\r\n    top: 0px;\r\n    bottom: 23px;\r\n    left: 0;\r\n    right: 0px;\r\n    overflow: hidden;\r\n    background: #00ffff;\r\n}\r\n\r\n.luckysheet-sheet-area {\r\n    width: 100%;\r\n    box-sizing: border-box;\r\n    position: absolute;\r\n    right: 0;\r\n    bottom: 0;\r\n    left: 0;\r\n    /* background-color: #f6f6f6; */\r\n    background-color: #fafafc;\r\n    color: #444;\r\n    height: 31px;\r\n    padding: 0 0 0 44px;\r\n    margin: 0;\r\n    -webkit-touch-callout: none;\r\n    cursor: default;\r\n    transition: 0.3s ease all;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n}\r\n\r\n#luckysheet-sheet-content {\r\n    width: 0;\r\n    flex: 3;\r\n    display: flex;\r\n    align-items: center;\r\n}\r\n#luckysheet-sheet-content .lucky-button-custom {\r\n}\r\n\r\n#luckysheet-bottom-pager {\r\n    width: 0;\r\n    background-color: #fafafc;\r\n    z-index: 1;\r\n    flex: 2;\r\n    text-align: right;\r\n    white-space: nowrap;\r\n}\r\n\r\n.luckysheet-sheet-area > div,\r\n.luckysheet-sheet-area .luckysheet-sheets-item {\r\n    display: inline-block;\r\n    /* margin-right: 6px;\r\n    margin-top: 1px;\r\n    padding: 1px 6px; */\r\n    /* padding: 6px 10px; */\r\n}\r\n\r\n/* .luckysheet-sheet-area .luckysheet-sheets-add {\r\n    margin-left: 47px;\r\n} */\r\n\r\n/* div.luckysheet-sheets-add,\r\ndiv.luckysheet-sheets-m,\r\ndiv.luckysheet-sheets-scroll {\r\n    background: #F6F6F6;\r\n    border: 1px solid #F6F6F6;\r\n    color: #4E4E4E;\r\n} */\r\n\r\ndiv.luckysheet-sheets-scroll {\r\n    display: none;\r\n}\r\n\r\ndiv.luckysheet-sheets-add:hover,\r\ndiv.luckysheet-sheets-m:hover {\r\n    color: #2a2a2a;\r\n}\r\n\r\n.docs-sheet-fade {\r\n    position: absolute;\r\n    display: block;\r\n    top: 0;\r\n    width: 6px;\r\n    height: 100%;\r\n    /* z-index: 1005; */\r\n    z-index: 1; /*因为会覆盖右击菜单，改为1*/\r\n}\r\n\r\n.docs-sheet-fade div {\r\n    background-color: #d7d7d7;\r\n    width: 2px;\r\n    float: right;\r\n    position: relative;\r\n    height: 100%;\r\n}\r\n\r\n.docs-sheet-fade-left {\r\n    left: 0;\r\n}\r\n\r\n.docs-sheet-fade-right {\r\n    right: 0;\r\n}\r\n\r\n.docs-sheet-fade1 {\r\n    opacity: 0.82;\r\n    filter: alpha(opacity=82);\r\n}\r\n\r\n.docs-sheet-fade2 {\r\n    opacity: 0.62;\r\n    filter: alpha(opacity=62);\r\n}\r\n\r\n.docs-sheet-fade3 {\r\n    opacity: 0.4;\r\n    filter: alpha(opacity=40);\r\n}\r\n\r\n.luckysheet-sheet-area div.luckysheet-sheet-container {\r\n    padding: 0px 0px;\r\n    margin-left: 0px;\r\n    position: relative;\r\n    max-width: 70%;\r\n    vertical-align: bottom;\r\n    display: inline-block;\r\n}\r\n\r\n.luckysheet-sheet-area div.luckysheet-sheet-container div.luckysheet-sheet-container-c {\r\n    padding: 0px 0px;\r\n    margin-left: 0px;\r\n    overflow: hidden;\r\n    white-space: nowrap;\r\n    position: relative;\r\n    max-width: 100%;\r\n    vertical-align: bottom;\r\n    display: inline-block;\r\n}\r\n\r\n.luckysheet-sheet-container-menu-hide .luckysheet-sheets-item {\r\n    padding-right: 5px !important;\r\n}\r\n\r\n.luckysheet-sheet-container-menu-hide .luckysheet-sheets-item-menu {\r\n    display: none !important;\r\n}\r\n\r\n.luckysheet-sheet-area div.luckysheet-sheets-item {\r\n    padding: 2px 6px;\r\n    height: 29px;\r\n    line-height: 29px;\r\n    /* box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inset; */\r\n    /* background-color: #f7f7f7; */\r\n    background-color: #fafafc;\r\n    /* border-color: #000; */\r\n    /* border-top-color: #aaa; */\r\n    /* border-width: 0 1px 1px 1px; */\r\n    color: #676464;\r\n    min-width: 30px;\r\n    top: 0px;\r\n    position: relative;\r\n    /* border-radius: 0 0 2px 2px; */\r\n    margin-right: -1px;\r\n    cursor: pointer;\r\n    /* border-bottom: 1px solid #cacaca; */\r\n    transition: all 0.1s;\r\n    /* padding-right: 20px; */\r\n    font-size: 13px;\r\n\r\n    padding: 2px 19px 0px 5px;\r\n    box-sizing: border-box;\r\n    border-left: 1px solid #e0e0e0;\r\n    border-bottom: 1px solid #e0e0e0;\r\n    border-right: 1px solid #e0e0e0;\r\n    /* display:flex;\r\n    justify-content: center;\r\n    align-items: center;\r\n    height: 100%; */\r\n}\r\n\r\n.luckysheet-sheet-area div.luckysheet-sheets-item:last-child {\r\n    margin-right: 1px;\r\n}\r\n.luckysheet-sheet-area div.luckysheet-sheets-item:hover {\r\n    background-color: #efefef;\r\n    /* border-color: #a5a5a5; */\r\n    color: #490500;\r\n}\r\n\r\n.luckysheet-sheet-area div.luckysheet-sheets-item .luckysheet-sheets-item-menu {\r\n    margin-left: 2px;\r\n    display: inline-block;\r\n    top: -2px;\r\n    position: relative;\r\n    color: #a1a1a1;\r\n    position: absolute;\r\n    height: 100%;\r\n    width: 15px;\r\n    right: 0px;\r\n    text-align: center;\r\n}\r\n\r\n.luckysheet-sheet-area div.luckysheet-sheets-item .luckysheet-sheets-item-menu:hover {\r\n    color: #2a2a2a;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-sheet-area div.luckysheet-sheets-item .luckysheet-sheets-item-name {\r\n    padding: 0px 3px;\r\n}\r\n\r\n.luckysheet-sheet-area div.luckysheet-sheets-item .luckysheet-sheets-item-name[contenteditable=\"true\"] {\r\n    border: 1px solid #d9d9d9;\r\n    display: inline-block;\r\n    height: 18px;\r\n    line-height: 18px;\r\n    min-width: 8px;\r\n    margin: -4px -1px;\r\n    -moz-user-modify: read-write-plaintext-only;\r\n    -webkit-user-modify: read-write-plaintext-only;\r\n    -moz-user-select: text !important;\r\n    -ms-user-select: text !important;\r\n    -webkit-user-select: text !important;\r\n}\r\n\r\n.luckysheet-sheet-area div.luckysheet-sheets-item .luckysheet-sheets-item-name[contenteditable=\"true\"]:focus {\r\n    -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.3);\r\n    -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.3);\r\n    box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.3);\r\n    border: 1px solid #4d90fe;\r\n    outline: none;\r\n}\r\n\r\n.luckysheet-sheet-area div.luckysheet-sheets-item-active {\r\n    /* padding: 2px 8px; */\r\n    height: 29px;\r\n    line-height: 29px;\r\n    background-color: #efefef;\r\n    /* border-color: #aaa; */\r\n    border-top-color: #fff;\r\n    color: #222;\r\n    /* box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); */\r\n    cursor: default;\r\n    /* top: -2px; */\r\n    /* border-bottom: none; */\r\n    /* padding-right: 20px; */\r\n}\r\n\r\n.luckysheet-sheet-area div.luckysheet-sheets-item-active:hover {\r\n    background-color: #ececec;\r\n    /* border-color: #aaa; */\r\n    color: #222;\r\n}\r\n\r\n.luckysheet-grid-window-1 {\r\n    position: absolute;\r\n    top: 0;\r\n    right: 0;\r\n    bottom: 27px;\r\n    left: 0;\r\n    min-width: 200px;\r\n    background-color: #ffffff !important;\r\n    overflow: hidden;\r\n    -moz-user-select: -moz-none;\r\n    -khtml-user-select: none;\r\n    -webkit-user-select: none;\r\n    -ms-user-select: none;\r\n    user-select: none;\r\n}\r\n\r\n.luckysheetTableContent {\r\n    position: absolute;\r\n    z-index: 2;\r\n    left: 0px;\r\n    top: 0px;\r\n    width: 100%;\r\n    height: 100%;\r\n    pointer-events: none;\r\n    -moz-user-select: -moz-none;\r\n    -khtml-user-select: none;\r\n    -webkit-user-select: none;\r\n    -ms-user-select: none;\r\n    user-select: none;\r\n}\r\n\r\n.luckysheet-grid-window-2 {\r\n    /*background-color: #fff !important;*/\r\n    height: 100%;\r\n    width: 100%;\r\n    outline: none;\r\n    border-collapse: collapse;\r\n    display: table;\r\n}\r\n\r\n.luckysheet-paneswrapper {\r\n    overflow: hidden;\r\n    height: 1px;\r\n}\r\n\r\n.luckysheet-left-top {\r\n    width: 44.5px;\r\n    height: 18.5px;\r\n    border: solid 0 #dfdfdf;\r\n    position: relative;\r\n    padding-top: 0;\r\n    border-width: 0 1px 1px 0;\r\n    margin: -1px 0 0 -1px;\r\n    padding-left: 0;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-cols-h-c {\r\n    color: #5e5e5e;\r\n    overflow: hidden;\r\n    padding: 0;\r\n    cursor: default;\r\n    /*width: 1548px;*/\r\n    height: 19px;\r\n    outline-style: none;\r\n    position: relative;\r\n    -webkit-user-select: none;\r\n    background: #f3f3f2;\r\n}\r\n\r\n.luckysheet-rows-h {\r\n    position: relative;\r\n    outline-style: none;\r\n    color: #5e5e5e;\r\n    overflow: hidden;\r\n    padding: 0;\r\n    margin-top: -2px;\r\n    padding-top: 2px;\r\n    cursor: default;\r\n    /*height: 472px;*/\r\n    width: 38px;\r\n    background: #f3f3f2;\r\n}\r\n\r\n.luckysheet-cols-menu-btn {\r\n    color: #5e5e5e;\r\n    cursor: pointer;\r\n    position: absolute;\r\n    z-index: 12;\r\n    border: 1px solid #5e5e5e;\r\n    border-radius: 1px;\r\n    top: 3px;\r\n    margin-left: 0px;\r\n    display: none;\r\n    padding: 0px 2px;\r\n    font-size: 12px;\r\n    height: 12px;\r\n    opacity: 0.5;\r\n    /*transition: all 0.1s;*/\r\n}\r\n\r\n.luckysheet-cols-menu-btn:hover {\r\n    opacity: 1;\r\n}\r\n\r\n.luckysheet-cols-h-hover {\r\n    color: #5e5e5e;\r\n    cursor: default;\r\n    position: absolute;\r\n    z-index: 11;\r\n    border: 0 none;\r\n    bottom: 0;\r\n    height: 100%;\r\n    margin-left: 0px;\r\n    display: none;\r\n    /*transition: all 0.1s;*/\r\n    background-color: rgba(194, 194, 194, 0.4);\r\n}\r\n\r\n.luckysheet-cols-h-selected {\r\n    color: #5e5e5e;\r\n    cursor: default;\r\n    position: absolute;\r\n    z-index: 10;\r\n    border-bottom: 1px solid #0188fb;\r\n    bottom: 0;\r\n    height: 100%;\r\n    margin-left: 0px;\r\n    display: none;\r\n    transition: all 0.1s;\r\n    background-color: rgba(76, 76, 76, 0.1);\r\n    /*left: 2489px;\r\n             width: 863px;*/\r\n}\r\n\r\n.luckysheet-cols-h-cells {\r\n    margin: 0;\r\n    padding: 0;\r\n    border: none 0;\r\n    position: relative;\r\n    height: inherit;\r\n    /*width: 4721px;*/\r\n}\r\n\r\n.luckysheet-cols-h-cells-c {\r\n    color: #5e5e5e;\r\n    cursor: default;\r\n    width: 5000000px;\r\n    height: inherit;\r\n}\r\n\r\n.luckysheet-cols-h-cells-clip {\r\n    color: #5e5e5e;\r\n    cursor: default;\r\n    margin: 0;\r\n    padding: 0;\r\n    border: none 0;\r\n    position: relative;\r\n    float: left;\r\n    direction: ltr;\r\n    height: inherit;\r\n    width: 2561px;\r\n    color: #5e5e5e;\r\n    border-bottom: solid 1px #bbb;\r\n    position: relative;\r\n    top: -1px;\r\n}\r\n\r\n.luckysheet-cols-h-cell-nosel {\r\n    position: absolute;\r\n    cursor: pointer;\r\n    border: 0 solid;\r\n    border-color: #dfdfdf;\r\n    display: inline-block;\r\n    min-height: 19px;\r\n    touch-action: manipulation;\r\n    border-right-width: 1px;\r\n    height: inherit;\r\n}\r\n\r\n.luckysheet-cols-h-cell-sel {\r\n    direction: ltr;\r\n    height: inherit;\r\n    position: absolute;\r\n    cursor: pointer;\r\n    border: 0 solid;\r\n    border-color: #bfbfbf;\r\n    background-color: #e1e1e1;\r\n    display: inline-block;\r\n    min-height: 19px;\r\n    color: #0188fb;\r\n    font-weight: bold;\r\n    touch-action: manipulation;\r\n    border-right-width: 1px;\r\n}\r\n\r\n.luckysheet-col-flow-h {\r\n    float: left;\r\n    direction: ltr;\r\n    position: relative;\r\n    margin: 0;\r\n    padding: 0;\r\n    border: none 0;\r\n    height: inherit;\r\n    overflow: hidden;\r\n}\r\n\r\n.luckysheet-col-flow-h-sheet {\r\n    width: inherit;\r\n    height: inherit;\r\n    position: relative;\r\n    float: left;\r\n    direction: ltr;\r\n}\r\n\r\nbody:not(.ewa-ipad) .luckysheet-cols-h-cell-nosel:hover,\r\nbody:not(.ewa-ipad) .luckysheet-cols-h-cell-sel:hover,\r\nbody:not(.ewa-ipad) .luckysheet-rows-h-cell-nosel:hover,\r\nbody:not(.ewa-ipad) .luckysheet-rows-h-cell-sel:hover {\r\n    background-color: #fcc3c3;\r\n}\r\n\r\n.luckysheet-cols-h-cell-txt {\r\n    cursor: pointer;\r\n    height: inherit;\r\n    position: relative;\r\n    text-align: center;\r\n    overflow: hidden;\r\n    touch-action: manipulation;\r\n    font-size: 14px;\r\n    padding-top: 2px;\r\n}\r\n\r\n.luckysheet-rows-h {\r\n    position: relative;\r\n    outline-style: none;\r\n    color: #5e5e5e;\r\n    overflow: hidden;\r\n    padding: 0;\r\n    margin-top: -2px;\r\n    padding-top: 2px;\r\n    cursor: default;\r\n    width: 45px;\r\n}\r\n\r\n.luckysheet-rows-h-hover {\r\n    position: absolute;\r\n    z-index: 11;\r\n    border: 0 none;\r\n    right: 0;\r\n    width: 100%;\r\n    margin-top: 2px;\r\n    display: none;\r\n    /*transition: all 0.1s;*/\r\n    background-color: rgba(194, 194, 194, 0.4);\r\n}\r\n\r\n.luckysheet-rows-h-selected {\r\n    position: absolute;\r\n    z-index: 10;\r\n    border-right: 1px solid #0188fb;\r\n    right: 0;\r\n    width: 100%;\r\n    margin-top: 2px;\r\n    display: none;\r\n    transition: all 0.1s;\r\n    background-color: rgba(76, 76, 76, 0.1);\r\n    /*top: 106px;\r\n             height: 145px;*/\r\n}\r\n\r\n.luckysheet-rows-h-cells {\r\n    margin: 0;\r\n    padding: 0;\r\n    border: none 0;\r\n    position: relative;\r\n    width: 100%;\r\n}\r\n\r\n.luckysheet-rows-h-cells-c {\r\n    margin: 0;\r\n    padding: 0;\r\n    border: none 0;\r\n    position: relative;\r\n    float: left;\r\n    direction: ltr;\r\n    width: 100%;\r\n}\r\n\r\n.luckysheet-rows-h-cells-clip {\r\n    cursor: default;\r\n    color: #5e5e5e;\r\n    direction: ltr;\r\n    border-right: solid 1px #bbb;\r\n    width: inherit;\r\n    height: inherit;\r\n    position: relative;\r\n    left: -1px;\r\n    height: inherit;\r\n}\r\n\r\n.luckysheet-rows-h-cell-nosel {\r\n    direction: ltr;\r\n    width: 100%;\r\n    position: absolute;\r\n    cursor: pointer;\r\n    border: 0 solid;\r\n    border-color: #dfdfdf;\r\n    border-bottom-width: 1px;\r\n    touch-action: manipulation;\r\n}\r\n\r\n.luckysheet-rows-h-cell-sel {\r\n    direction: ltr;\r\n    width: 100%;\r\n    position: absolute;\r\n    cursor: pointer;\r\n    border: 0 solid;\r\n    border-color: #bfbfbf;\r\n    background-color: #e1e1e1;\r\n    border-bottom-width: 1px;\r\n    color: #0188fb;\r\n    font-weight: bold;\r\n    touch-action: manipulation;\r\n}\r\n\r\n.luckysheet-rows-h-cell-txt {\r\n    width: 100%;\r\n    position: absolute;\r\n    bottom: 0;\r\n    text-align: center;\r\n    padding-bottom: 1px;\r\n    max-height: 100%;\r\n    overflow: hidden;\r\n    font-size: 14px;\r\n}\r\n\r\n.luckysheet-cell-loading {\r\n    width: 100%;\r\n    height: 100%;\r\n    background-color: rgba(255, 255, 255, 0.3);\r\n    position: absolute;\r\n    overflow: hidden;\r\n    outline-style: none;\r\n    cursor: not-allowed;\r\n    font-size: 28px;\r\n    z-index: 2;\r\n    display: none;\r\n}\r\n\r\n.luckysheet-cell-loading-inner {\r\n    position: relative;\r\n    top: 40%;\r\n    width: 100%;\r\n    margin: 0 auto;\r\n    text-align: center;\r\n}\r\n\r\n.luckysheet-cell-loading-inner span {\r\n    margin-left: 10px;\r\n}\r\n\r\n.luckysheet-cell-main {\r\n    /*border: solid 1px #BEC1C4;*/\r\n    background-color: white;\r\n    width: 15px;\r\n    height: 15px;\r\n    background-color: #f3f3f2;\r\n    /*#E7E7E7;*/\r\n    border-collapse: collapse;\r\n    position: relative;\r\n    overflow: hidden;\r\n    outline-style: none;\r\n    cursor: default;\r\n}\r\n\r\n.luckysheet-scrollbars,\r\n.luckysheet-menu {\r\n    scrollbar-base-color: #ffffff;\r\n    scrollbar-track-color: #e7e7e7;\r\n    scrollbar-darkshadow-color: #ffffff;\r\n    scrollbar-3dlight-color: #ffffff;\r\n    scrollbar-arrow-color: #757778;\r\n    scrollbar-shadow-color: #bec1c4;\r\n    scrollbar-highlight-color: #bec1c4;\r\n    -ms-scroll-chaining: none;\r\n    overflow: auto;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr {\r\n    position: absolute;\r\n    overflow: hidden;\r\n    z-index: 1003;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr div {\r\n    height: 1px;\r\n    width: 1px;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button {\r\n    height: 0;\r\n    width: 0;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:start {\r\n    display: none;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:end {\r\n    display: block;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button {\r\n    border: 1px solid #d9d9d9;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal {\r\n    border-width: 1px 0 0 0;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical {\r\n    border-width: 0 0 0 1px;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical {\r\n    border-width: 0 1px 0 0;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal:increment {\r\n    background: no-repeat url(\"waffle_sprite.png\") -663px -13px;\r\n    width: 15px;\r\n    padding-left: 1px;\r\n    background-clip: border-box;\r\n    border: 1px solid #d9d9d9;\r\n    border-width: 1px 0 0 0;\r\n    box-shadow: none;\r\n    background-color: #f8f8f8;\r\n    border-bottom: 1px solid #d9d9d9;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal:increment:hover {\r\n    background: no-repeat url(\"waffle_sprite.png\") -395px -62px;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal:increment:active {\r\n    background: no-repeat url(\"waffle_sprite.png\") -679px -13px;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal:decrement {\r\n    border-left: 1px solid #d9d9d9;\r\n    border-right: 1px solid #d9d9d9;\r\n    background: no-repeat url(\"waffle_sprite.png\") -283px -62px;\r\n    width: 17px;\r\n    border-bottom: 1px solid #d9d9d9;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal:hover {\r\n    background: no-repeat url(\"waffle_sprite.png\") -145px -70px;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:horizontal:active {\r\n    background: no-repeat url(\"waffle_sprite.png\") -552px 0;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical:increment {\r\n    padding-top: 1px;\r\n    background: no-repeat url(\"waffle_sprite.png\") -531px -24px;\r\n    border-left: 1px solid #d9d9d9;\r\n    height: 15px;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical:increment:hover {\r\n    background: no-repeat url(\"waffle_sprite.png\") -570px -42px;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical:increment:active {\r\n    background: no-repeat url(\"waffle_sprite.png\") -83px -46px;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical:decrement {\r\n    border-top: 1px solid #d9d9d9;\r\n    border-bottom: 1px solid #d9d9d9;\r\n    border-left: 1px solid #d9d9d9;\r\n    background: no-repeat url(\"waffle_sprite.png\") -631px -27px;\r\n    height: 17px;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical:decrement:hover {\r\n    background: no-repeat url(\"waffle_sprite.png\") -180px -58px;\r\n}\r\n\r\n.luckysheet-scrollbar-ltr::-webkit-scrollbar-button:vertical:decrement:active {\r\n    background: no-repeat url(\"waffle_sprite.png\") -776px -28px;\r\n}\r\n\r\n.luckysheet-scrollbar-x {\r\n    bottom: 0px;\r\n    left: 44px;\r\n    overflow-x: scroll;\r\n}\r\n\r\n.luckysheet-scrollbar-y {\r\n    right: 0px;\r\n    top: 0px;\r\n    overflow-y: scroll;\r\n}\r\n\r\n.luckysheet-cell-flow {\r\n    margin: 0;\r\n    padding: 0;\r\n    border: none 0;\r\n    position: relative;\r\n    touch-action: manipulation;\r\n    overflow: hidden;\r\n    /*background: #fff;*/\r\n}\r\n\r\n.luckysheet-cell-flow-clip {\r\n    border-collapse: collapse;\r\n    cursor: default;\r\n    width: 5000000px;\r\n    touch-action: manipulation;\r\n    overflow: hidden;\r\n}\r\n\r\n.luckysheet-cell-flow-col {\r\n    margin: 0;\r\n    padding: 0;\r\n    border: none 0;\r\n    position: relative;\r\n    touch-action: manipulation;\r\n    overflow: hidden;\r\n    float: left;\r\n    direction: ltr;\r\n}\r\n\r\n.luckysheet-cell-sheettable {\r\n    position: relative;\r\n    /*background-color: #fff;*/\r\n    text-align: left;\r\n    font-size: 11pt;\r\n    color: #000000;\r\n    text-decoration: none;\r\n}\r\n\r\n.luckysheet-bottom-controll-row {\r\n    position: absolute;\r\n    height: 30px;\r\n    /*width: 400px;*/\r\n    /* background: #000; */\r\n    bottom: 38px;\r\n    left: 0px;\r\n    z-index: 1000;\r\n}\r\n\r\n#luckysheet-bottom-add-row {\r\n    padding: 5px 20px;\r\n    margin-right: 5px;\r\n    margin-top: -2px;\r\n}\r\n\r\n#luckysheet-bottom-add-row-input {\r\n    width: 40px;\r\n    min-width: 40px;\r\n}\r\n\r\n#luckysheet-bottom-return-top {\r\n    padding: 5px 6px;\r\n    margin-left: 10px;\r\n    margin-top: -2px;\r\n}\r\n\r\n.luckysheet-cell-flow-column {\r\n    position: absolute;\r\n    height: inherit;\r\n    width: inherit;\r\n    top: 0;\r\n    left: 0;\r\n    z-index: 1;\r\n    touch-action: manipulation;\r\n}\r\n\r\n.luckysheet-cell-flow-column-line {\r\n    position: absolute;\r\n    border-right: 1px solid #d4d4d4;\r\n    height: inherit;\r\n}\r\n\r\n.luckysheet-cell-flow-row {\r\n    text-align: left;\r\n    position: absolute;\r\n    height: inherit;\r\n    width: inherit;\r\n    top: 0;\r\n    left: 0;\r\n    z-index: 1;\r\n    touch-action: manipulation;\r\n}\r\n\r\n.luckysheet-cell-flow-row-line {\r\n    position: absolute;\r\n    border-bottom: 1px solid #d4d4d4;\r\n    width: inherit;\r\n}\r\n\r\n.luckysheet-cell-selected-focus {\r\n    position: absolute;\r\n    pointer-events: none;\r\n    z-index: 14;\r\n    /*border:1px solid #fff;*/\r\n    margin: 0px 0 0 0px;\r\n    background: rgba(0, 80, 208, 0.15);\r\n    display: none;\r\n    /*transition: all 0.1s;*/\r\n}\r\n\r\n.luckysheet-selection-copy {\r\n    position: absolute;\r\n    pointer-events: none;\r\n    z-index: 18;\r\n    border: none;\r\n    margin: 0px 0 0 0px;\r\n    display: none;\r\n}\r\n\r\n.luckysheet-selection-copy .luckysheet-copy {\r\n    position: absolute;\r\n    z-index: 18;\r\n    background-color: transparent;\r\n}\r\n\r\n.luckysheet-selection-copy-top {\r\n    left: 0;\r\n    right: 0;\r\n    height: 2px;\r\n    top: 0;\r\n    background-position: bottom;\r\n    background-image: url(\"EwaAntH.gif\");\r\n}\r\n\r\n.luckysheet-selection-copy-right {\r\n    top: 0;\r\n    bottom: 0;\r\n    width: 2px;\r\n    right: 0;\r\n    background-image: url(\"EwaAntV.gif\");\r\n}\r\n\r\n.luckysheet-selection-copy-bottom {\r\n    left: 0;\r\n    right: 0;\r\n    height: 2px;\r\n    bottom: 0;\r\n    background-image: url(\"EwaAntH.gif\");\r\n}\r\n\r\n.luckysheet-selection-copy-left {\r\n    top: 0;\r\n    bottom: 0;\r\n    width: 2px;\r\n    left: 0;\r\n    background-position: right;\r\n    background-image: url(\"EwaAntV.gif\");\r\n}\r\n\r\n.luckysheet-selection-copy-hc {\r\n    position: absolute;\r\n    top: 0;\r\n    right: 0;\r\n    bottom: 0;\r\n    left: 0;\r\n    border: 2px dashed #12a5ff;\r\n    z-index: 8;\r\n}\r\n\r\n.luckysheet-selection-highlight {\r\n    position: absolute;\r\n    /*pointer-events: none;*/\r\n    z-index: 14;\r\n    border: none;\r\n    margin: 0px 0 0 0px;\r\n    display: none;\r\n}\r\n\r\n.luckysheet-formula-functionrange-highlight .luckysheet-copy {\r\n    background-image: none;\r\n    background: #0188fb;\r\n    position: absolute;\r\n    z-index: 18;\r\n    cursor: move;\r\n    opacity: 0.9;\r\n    /*border: 1px solid #fff;*/\r\n}\r\n\r\n.luckysheet-formula-functionrange-highlight .luckysheet-selection-copy-top {\r\n    top: -2px;\r\n    border-top: 2px solid #fff;\r\n    border-bottom: 2px solid #fff;\r\n}\r\n\r\n.luckysheet-formula-functionrange-highlight .luckysheet-selection-copy-right {\r\n    right: -2px;\r\n    border-left: 2px solid #fff;\r\n    border-right: 2px solid #fff;\r\n}\r\n\r\n.luckysheet-formula-functionrange-highlight .luckysheet-selection-copy-bottom {\r\n    bottom: -2px;\r\n    border-top: 2px solid #fff;\r\n    border-bottom: 2px solid #fff;\r\n}\r\n\r\n.luckysheet-formula-functionrange-highlight .luckysheet-selection-copy-left {\r\n    left: -2px;\r\n    border-left: 2px solid #fff;\r\n    border-right: 2px solid #fff;\r\n}\r\n\r\n.luckysheet-formula-functionrange-highlight .luckysheet-selection-copy-hc {\r\n    border: 2px solid #5e5e5e;\r\n    opacity: 0.03;\r\n    z-index: initial;\r\n}\r\n\r\n.luckysheet-selection-highlight-topleft {\r\n    left: -3px;\r\n    top: -3px;\r\n    cursor: se-resize;\r\n}\r\n\r\n.luckysheet-selection-highlight-topright {\r\n    right: -3px;\r\n    top: -3px;\r\n    cursor: ne-resize;\r\n}\r\n\r\n.luckysheet-selection-highlight-bottomleft {\r\n    left: -3px;\r\n    bottom: -3px;\r\n    cursor: ne-resize;\r\n}\r\n\r\n.luckysheet-selection-highlight-bottomright {\r\n    right: -3px;\r\n    bottom: -3px;\r\n    cursor: se-resize;\r\n}\r\n\r\n.luckysheet-formula-functionrange-highlight .luckysheet-highlight {\r\n    position: absolute;\r\n    z-index: 19;\r\n    border: 1px solid #fff;\r\n    background: #0188fb;\r\n    width: 6px;\r\n    height: 6px;\r\n}\r\n\r\n.luckysheet-cell-selected-extend {\r\n    position: absolute;\r\n    pointer-events: none;\r\n    z-index: 16;\r\n    border: 1px dashed #0188fb;\r\n    margin: -1px 0 0 -1px;\r\n    display: none;\r\n    /*transition: all 0.1s;*/\r\n}\r\n\r\n.luckysheet-cell-selected-move {\r\n    position: absolute;\r\n    pointer-events: none;\r\n    z-index: 16;\r\n    border: 2px solid #0188fb;\r\n    margin: -1px 0 0 -1px;\r\n    display: none;\r\n    /*transition: all 0.1s;*/\r\n}\r\n\r\n.luckysheet-cell-selected {\r\n    position: absolute;\r\n    pointer-events: none;\r\n    z-index: 15;\r\n    border: 1px solid #0188fb;\r\n    margin: -1px 0 0 -1px;\r\n    background: rgba(1, 136, 251, 0.15);\r\n    display: none;\r\n    /*transition: all 0.1s;*/\r\n}\r\n\r\n.luckysheet-cs-inner-border {\r\n    pointer-events: none;\r\n    border: 1px solid #fff;\r\n    position: absolute;\r\n    top: 0;\r\n    bottom: 0;\r\n    left: 0;\r\n    right: 0;\r\n}\r\n\r\n.luckysheet-cs-fillhandle {\r\n    position: absolute;\r\n    width: 6px;\r\n    height: 6px;\r\n    bottom: -5px;\r\n    cursor: crosshair;\r\n    background-color: #0188fb;\r\n    border: solid 1px #fff;\r\n    z-index: 16;\r\n    pointer-events: auto;\r\n    right: -5px;\r\n}\r\n\r\n.luckysheet-cs-draghandle {\r\n    position: absolute;\r\n    cursor: move;\r\n    background-color: #fff;\r\n    opacity: 0.01;\r\n    z-index: 15;\r\n    pointer-events: auto;\r\n    border: 2px solid #fff;\r\n}\r\n\r\n.luckysheet-cs-draghandle-top {\r\n    top: -4px;\r\n    left: -2px;\r\n    right: -2px;\r\n    height: 2px;\r\n}\r\n\r\n.luckysheet-cs-draghandle-bottom {\r\n    right: 0;\r\n    left: -2px;\r\n    bottom: -4px;\r\n    height: 2px;\r\n}\r\n\r\n.luckysheet-cs-draghandle-left {\r\n    top: 0;\r\n    left: -4px;\r\n    bottom: 0;\r\n    width: 2px;\r\n}\r\n\r\n.luckysheet-cs-draghandle-right {\r\n    top: 0;\r\n    right: -4px;\r\n    bottom: 0;\r\n    width: 2px;\r\n}\r\n\r\n.luckysheet-cs-touchhandle {\r\n    display: none;\r\n    position: absolute;\r\n    width: 16px;\r\n    height: 16px;\r\n    padding: 5px;\r\n    z-index: 100;\r\n    pointer-events: auto;\r\n    touch-action: auto;\r\n}\r\n\r\n.luckysheet-cs-touchhandle:before {\r\n    content: \"\";\r\n    display: block;\r\n    width: 16px;\r\n    height: 16px;\r\n    border: 0.5px solid rgba(0, 0, 0, 0.15);\r\n    background-color: #ffffff;\r\n    box-sizing: border-box;\r\n    border-radius: 50%;\r\n}\r\n\r\n.luckysheet-cs-touchhandle-lt {\r\n    left: -13px;\r\n    top: -13px;\r\n}\r\n\r\n.luckysheet-cs-touchhandle-lb {\r\n    left: -13px;\r\n    bottom: -13px;\r\n}\r\n\r\n.luckysheet-cs-touchhandle-rt {\r\n    right: -13px;\r\n    top: -13px;\r\n}\r\n\r\n.luckysheet-cs-touchhandle-rb {\r\n    right: -13px;\r\n    bottom: -13px;\r\n}\r\n\r\n.luckysheet-cs-touchhandle .luckysheet-cs-touchhandle-btn {\r\n    position: absolute;\r\n    width: 10px;\r\n    height: 10px;\r\n    left: 8px;\r\n    top: 8px;\r\n    background-color: #018ffb;\r\n    background-position: center;\r\n    box-sizing: border-box;\r\n    border-radius: 50%;\r\n    z-index: 11;\r\n}\r\n\r\n#luckysheet-dynamicArray-hightShow {\r\n    position: absolute;\r\n    pointer-events: none;\r\n    z-index: 15;\r\n    border: 1px solid blue;\r\n    margin: -1px 0 0 -1px;\r\n    display: none;\r\n}\r\n\r\n.luckysheet-scrollbars::-webkit-scrollbar-track {\r\n    background-color: #ffffff;\r\n    border: 1px solid #d9d9d9;\r\n}\r\n\r\n.luckysheet-scrollbar-x::-webkit-scrollbar-track {\r\n    border-left: 1px solid #d9d9d9;\r\n    border-right: none;\r\n}\r\n\r\n.luckysheet-scrollbar-y::-webkit-scrollbar-track {\r\n    border-top: none;\r\n    border-bottom: none;\r\n}\r\n\r\n.luckysheet-scrollbars::-webkit-scrollbar {\r\n    width: 12px;\r\n    height: 12px;\r\n    background-color: #ffffff;\r\n    /*border:0 none;*/\r\n}\r\n\r\n.luckysheet-scrollbars::-webkit-scrollbar-thumb {\r\n    background-color: rgba(0, 0, 0, 0.2);\r\n    background-clip: padding-box;\r\n    border: solid transparent;\r\n    border-radius: 12px;\r\n    border-width: 2px 1px 1px 2px;\r\n    box-shadow: inset 1px 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(0, 0, 0, 0.07);\r\n}\r\n\r\n.luckysheet-scrollbars::-webkit-scrollbar-thumb:hover {\r\n    background-color: #969696;\r\n    border: 1px solid #a0a0a0;\r\n    border-radius: 12px;\r\n}\r\n\r\n.luckysheet-grdusedrange {\r\n    position: absolute;\r\n    visibility: hidden;\r\n    width: 1px;\r\n    height: 1px;\r\n}\r\n\r\n.luckysheet-grdblkflowpush {\r\n    margin: 0;\r\n    padding: 0;\r\n    border: none 0;\r\n    width: 1px;\r\n}\r\n\r\n.luckysheet-grdblkpush {\r\n    margin: 0;\r\n    padding: 0;\r\n    border: none 0;\r\n    height: 1px;\r\n    float: left;\r\n    direction: ltr;\r\n}\r\n\r\n.luckysheet-cell-flow-data {\r\n    position: absolute;\r\n    height: inherit;\r\n    width: inherit;\r\n    top: 0;\r\n    left: 0;\r\n    z-index: 1;\r\n}\r\n\r\n.luckysheet-cell-flow-data-row {\r\n    position: absolute;\r\n    width: inherit;\r\n}\r\n\r\n.luckysheet-cell-flow-data-cell {\r\n    position: absolute;\r\n    height: inherit;\r\n}\r\n\r\n.luckysheet-cell-flow-data-value {\r\n    position: absolute !important;\r\n    bottom: 0;\r\n    letter-spacing: -0.02em;\r\n    white-space: nowrap;\r\n    padding-left: 2px;\r\n    overflow: hidden;\r\n}\r\n\r\n.luckysheet canvas {\r\n    position: absolute;\r\n}\r\n\r\n.luckysheetcolumeHeader {\r\n    margin-left: -1px;\r\n}\r\n\r\n.luckysheetrowHeader {\r\n    margin-top: 1px;\r\n}\r\n\r\n.luckysheetsheettable {\r\n    margin-left: -1px;\r\n    margin-top: -1px;\r\n}\r\n\r\n.luckysheet-cols-menu {\r\n    max-height: 100%;\r\n    overflow-y: auto;\r\n    -webkit-border-radius: 0;\r\n    -moz-border-radius: 0;\r\n    border-radius: 0;\r\n    -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n    -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n    -webkit-transition: opacity 0.218s;\r\n    -moz-transition: opacity 0.218s;\r\n    -o-transition: opacity 0.218s;\r\n    transition: opacity 0.218s;\r\n    background: #fff;\r\n    border: 1px solid #ccc;\r\n    border: 1px solid rgba(0, 0, 0, 0.2);\r\n    cursor: default;\r\n    font-size: 13px;\r\n    margin: 0;\r\n    outline: none;\r\n    padding: 6px 0;\r\n    position: absolute;\r\n    z-index: 1004;\r\n    box-sizing: border-box;\r\n    user-select: none;\r\n    display: none;\r\n}\r\n\r\n.luckysheet-cols-menu .luckysheet-cols-menuitem {\r\n    position: relative;\r\n    color: #333;\r\n    cursor: pointer;\r\n    list-style: none;\r\n    margin: 0;\r\n    /*padding: 6px 8em 6px 30px;*/\r\n    padding: 1px 6em 1px 20px;\r\n    white-space: nowrap;\r\n    padding-left: 8px;\r\n    vertical-align: middle;\r\n    padding-right: 24px;\r\n    user-select: none;\r\n}\r\n\r\n/* 右击菜单项目 hover背景色 */\r\n.luckysheet-cols-menu .luckysheet-cols-menuitem:hover,\r\n.luckysheet-cols-menu .luckysheet-cols-menuitem-hover {\r\n    background: #efefef;\r\n}\r\n\r\n.luckysheet-cols-menu .luckysheet-cols-menuitem .luckysheet-cols-menuitem-content {\r\n    position: relative;\r\n    color: #333;\r\n    cursor: pointer;\r\n    list-style: none;\r\n    margin: 0;\r\n    padding: 6px 7em 6px 30px;\r\n    white-space: nowrap;\r\n    user-select: none;\r\n}\r\n\r\n.luckysheet-rightgclick-menu .luckysheet-cols-menuitem .luckysheet-cols-menuitem-content {\r\n    position: relative;\r\n    color: #333;\r\n    cursor: pointer;\r\n    list-style: none;\r\n    margin: 0;\r\n    padding: 6px 15px 6px 20px;\r\n    white-space: nowrap;\r\n    user-select: none;\r\n}\r\n\r\n#luckysheet-cols-menu .luckysheet-cols-menuitem,\r\n.luckysheet-filter-menu .luckysheet-cols-menuitem,\r\n#luckysheet-pivotTable-config-option .luckysheet-cols-menuitem {\r\n    padding-right: 10px;\r\n    padding-left: 12px;\r\n}\r\n\r\n#luckysheet-pivotTable-config-option-sumtype .luckysheet-cols-menuitem {\r\n    padding-right: 15px;\r\n    padding-left: 12px;\r\n    padding-top: 1px;\r\n    padding-bottom: 1px;\r\n}\r\n\r\n#luckysheet-cols-menu .luckysheet-cols-menuitem-content,\r\n.luckysheet-filter-menu .luckysheet-cols-menuitem .luckysheet-cols-menuitem-content {\r\n    padding-right: 10px;\r\n    padding-left: 12px;\r\n}\r\n#luckysheet-sheet-list .luckysheet-cols-menuitem .luckysheet-cols-menuitem-content {\r\n    padding-right: 0px;\r\n    max-width: 430px;\r\n    min-width: 100px;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n}\r\n.luckysheet-filter-menu div.luckysheet-cols-menuitem {\r\n    padding-top: 0px;\r\n    padding-bottom: 0px;\r\n}\r\n\r\n.luckysheet-filter-submenu div.luckysheet-cols-menuitem {\r\n    padding-top: 1px;\r\n    padding-bottom: 1px;\r\n}\r\n\r\n.luckysheet-filter-menu .luckysheet-filter-byvalue .luckysheet-cols-menuitem,\r\n.luckysheet-filter-menu .luckysheet-pivotTableFilter-byvalue .luckysheet-cols-menuitem {\r\n    padding-top: 2px;\r\n    padding-bottom: 0px;\r\n    cursor: default;\r\n}\r\n\r\n.luckysheet-filter-menu .luckysheet-filter-byvalue .luckysheet-cols-menuitem-content,\r\n.luckysheet-filter-menu .luckysheet-pivotTableFilter-byvalue .luckysheet-cols-menuitem-content {\r\n    padding-top: 2px;\r\n    padding-bottom: 0px;\r\n    cursor: default;\r\n}\r\n\r\n.luckysheet-filter-menu .luckysheet-filter-byvalue .luckysheet-cols-menuitem-content input,\r\n.luckysheet-filter-menu .luckysheet-pivotTableFilter-byvalue .luckysheet-cols-menuitem-content input {\r\n    height: 24px;\r\n    width: 191px;\r\n    padding-right: 25px;\r\n    padding-left: 3px;\r\n    -webkit-border-radius: 1px;\r\n    -moz-border-radius: 1px;\r\n    border-radius: 1px;\r\n    border: 1px solid #d9d9d9;\r\n    border-top: 1px solid #c0c0c0;\r\n    font-size: 13px;\r\n}\r\n\r\n.luckysheet-filter-menu .luckysheet-filter-byvalue .luckysheet-cols-menuitem-content input:focus,\r\n.luckysheet-filter-menu .luckysheet-pivotTableFilter-byvalue .luckysheet-cols-menuitem-content input:focus {\r\n    -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.3);\r\n    -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.3);\r\n    box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.3);\r\n    border: 1px solid #4d90fe;\r\n    outline: none;\r\n}\r\n\r\n.luckysheet-filter-menu\r\n    .luckysheet-filter-byvalue\r\n    .luckysheet-cols-menuitem-content\r\n    .luckysheet-filter-byvalue-input-icon,\r\n.luckysheet-filter-menu\r\n    .luckysheet-pivotTableFilter-byvalue\r\n    .luckysheet-cols-menuitem-content\r\n    .luckysheet-pivotTableFilter-byvalue-input-icon {\r\n    position: absolute;\r\n    right: 17px;\r\n    top: 7px;\r\n}\r\n\r\n.luckysheet-filter-menu .luckysheet-filter-byvalue .luckysheet-cols-menuitem:hover,\r\n.luckysheet-filter-menu .luckysheet-pivotTableFilter-byvalue .luckysheet-cols-menuitem:hover {\r\n    background: #fff;\r\n}\r\n\r\n.luckysheet-filter-menu .luckysheet-cols-menuitem:last-child:hover {\r\n    background: #fff;\r\n}\r\n\r\n.luckysheet-filter-menu .luckysheet-cols-menuitem:last-child,\r\n.luckysheet-filter-menu .luckysheet-cols-menuitem:last-child .luckysheet-cols-menuitem-content {\r\n    cursor: default;\r\n}\r\n\r\n#luckysheet-filter-byvalue-select,\r\n#luckysheet-pivotTableFilter-byvalue-select {\r\n    min-height: 100px;\r\n    width: 200px;\r\n}\r\n\r\n.luckysheet-filter-menu .luckysheet-mousedown-filter-byvalue-btn span,\r\n.luckysheet-filter-menu .luckysheet-mousedown-pivotTableFilter-byvalue-btn span {\r\n    color: blue;\r\n    cursor: pointer;\r\n    text-decoration: underline;\r\n}\r\n\r\n.luckysheet-filter-menu .luckysheet-mousedown-filter-byvalue-btn div,\r\n.luckysheet-filter-menu .luckysheet-mousedown-pivotTableFilter-byvalue-btn div {\r\n    position: absolute;\r\n    right: 14px;\r\n    top: 0px;\r\n    font-size: 18px;\r\n}\r\n\r\n.luckysheet-filter-menu .luckysheet-filter-bycondition .luckysheet-filter-selected-input,\r\n.luckysheet-filter-menu .luckysheet-pivotTableFilter-bycondition .luckysheet-pivotTableFilter-selected-input {\r\n    padding-left: 8px;\r\n    padding-right: 8px;\r\n    margin-top: 3px;\r\n    display: none;\r\n}\r\n\r\n.luckysheet-filter-menu .luckysheet-filter-bycondition .luckysheet-filter-selected-input input,\r\n.luckysheet-filter-menu .luckysheet-pivotTableFilter-bycondition .luckysheet-pivotTableFilter-selected-input input {\r\n    height: 24px;\r\n    width: 100%;\r\n    padding-right: 3px;\r\n    padding-left: 3px;\r\n    margin-left: -3px;\r\n    -webkit-border-radius: 1px;\r\n    -moz-border-radius: 1px;\r\n    border-radius: 1px;\r\n    border: 1px solid #d9d9d9;\r\n    border-top: 1px solid #c0c0c0;\r\n    font-size: 13px;\r\n}\r\n\r\n.luckysheet-filter-menu .luckysheet-filter-bycondition .luckysheet-filter-selected-input2 input,\r\n.luckysheet-filter-menu .luckysheet-pivotTableFilter-bycondition .luckysheet-pivotTableFilter-selected-input2 input {\r\n    height: 24px;\r\n    width: 92px;\r\n    padding-right: 3px;\r\n    padding-left: 3px;\r\n    margin-left: -3px;\r\n    -webkit-border-radius: 1px;\r\n    -moz-border-radius: 1px;\r\n    border-radius: 1px;\r\n    border: 1px solid #d9d9d9;\r\n    border-top: 1px solid #c0c0c0;\r\n    font-size: 13px;\r\n}\r\n\r\n.luckysheet-filter-menu .luckysheet-filter-bycondition .luckysheet-filter-selected-input2 span,\r\n.luckysheet-filter-menu .luckysheet-pivotTableFilter-bycondition .luckysheet-pivotTableFilter-selected-input2 span {\r\n    margin-left: 2px;\r\n    margin-right: 5px;\r\n}\r\n\r\n.luckysheet-menuseparator {\r\n    border-top: 1px solid #ebebeb;\r\n    margin-top: 6px;\r\n    margin-bottom: 6px;\r\n}\r\n\r\n.luckysheet-submenu-arrow {\r\n    -webkit-transition: all 0.218s;\r\n    -moz-transition: all 0.218s;\r\n    -o-transition: all 0.218s;\r\n    transition: all 0.218s;\r\n    font-size: 12px;\r\n    left: auto;\r\n    right: -15px;\r\n    padding-top: 1px;\r\n    padding-right: 0;\r\n    position: absolute;\r\n    text-align: right;\r\n    opacity: 0.5;\r\n    filter: alpha(opacity=50);\r\n    color: #000;\r\n    user-select: none;\r\n    font-family: Arial;\r\n    line-height: 100%;\r\n}\r\n\r\n#luckysheet-pivotTable-config-option-sumtype .luckysheet-submenu-arrow {\r\n    right: -5px;\r\n    font-size: 16px;\r\n    padding-top: 0px;\r\n    color: blue;\r\n}\r\n\r\n#luckysheet-filter-byvalue-select table,\r\n#luckysheet-pivotTableFilter-byvalue-select table {\r\n    table-layout: fixed;\r\n}\r\n\r\n#luckysheet-filter-byvalue-select tr td,\r\n#luckysheet-pivotTableFilter-byvalue-select tr td {\r\n    padding: 2px 3px;\r\n}\r\n\r\n#luckysheet-filter-byvalue-select tr:hover td,\r\n#luckysheet-pivotTableFilter-byvalue-select tr:hover td {\r\n    background: #e1e1e1;\r\n}\r\n\r\n/*筛选改 -- pan*/\r\n.luckysheet-cols-menu .cf:before,\r\n.luckysheet-cols-menu .cf:after {\r\n    content: \"\";\r\n    display: table;\r\n}\r\n\r\n.luckysheet-cols-menu .cf:after {\r\n    clear: both;\r\n}\r\n\r\n#luckysheet-filter-byvalue-select .yearBox .monthList,\r\n#luckysheet-pivotTableFilter-byvalue-select .yearBox .monthList {\r\n    padding-left: 20px;\r\n}\r\n\r\n#luckysheet-filter-byvalue-select .yearBox .dayList,\r\n#luckysheet-pivotTableFilter-byvalue-select .yearBox .dayList {\r\n    padding-left: 20px;\r\n}\r\n\r\n#luckysheet-filter-byvalue-select .yearBox .fa-caret-right,\r\n#luckysheet-pivotTableFilter-byvalue-select .yearBox .fa-caret-right {\r\n    padding: 0 2px;\r\n    float: left;\r\n    margin-top: 3px;\r\n    cursor: pointer;\r\n}\r\n\r\n#luckysheet-filter-byvalue-select .count,\r\n#luckysheet-pivotTableFilter-byvalue-select .count {\r\n    color: gray;\r\n    margin-left: 5px;\r\n}\r\n\r\n#luckysheet-filter-byvalue-select input[type=\"checkbox\"],\r\n#luckysheet-pivotTableFilter-byvalue-select input[type=\"checkbox\"] {\r\n    width: auto;\r\n    height: auto;\r\n    float: left;\r\n}\r\n\r\n/*颜色筛选 -- pan*/\r\n#luckysheet-filter-orderby-color-submenu {\r\n    font-size: 12px;\r\n}\r\n\r\n#luckysheet-filter-orderby-color-submenu .title {\r\n    padding: 10px;\r\n    font-weight: 600;\r\n    color: #333;\r\n    background-color: #f4f4f4;\r\n    text-align: center;\r\n}\r\n\r\n#luckysheet-filter-orderby-color-submenu .item {\r\n    padding: 5px 40px 5px 20px;\r\n    cursor: pointer;\r\n    position: relative;\r\n}\r\n\r\n#luckysheet-filter-orderby-color-submenu .item:hover {\r\n    background-color: #d3d3d3;\r\n}\r\n\r\n#luckysheet-filter-orderby-color-submenu .item label {\r\n    display: block;\r\n    width: 70px;\r\n    height: 20px;\r\n    border: 1px solid #d1d1d1;\r\n}\r\n\r\n#luckysheet-filter-orderby-color-submenu .item input[type=\"checkbox\"] {\r\n    position: absolute;\r\n    right: 10px;\r\n    top: 6px;\r\n}\r\n\r\n#luckysheet-copy-content {\r\n    position: fixed;\r\n    height: 0px;\r\n    width: 0px;\r\n    left: -100px;\r\n    /*overflow: hidden;*/\r\n    /*text-indent: -999999px;*/\r\n    padding-left: 999999px;\r\n}\r\n\r\n/* #luckysheet-copy-btn {\r\n    position: absolute;\r\n    visibility: hidden;\r\n} */\r\n\r\n.btn {\r\n    display: inline-block;\r\n    margin-bottom: 0;\r\n    font-weight: normal;\r\n    text-align: center;\r\n    vertical-align: middle;\r\n    -ms-touch-action: manipulation;\r\n    touch-action: manipulation;\r\n    cursor: pointer;\r\n    background-image: none;\r\n    border: 1px solid transparent;\r\n    white-space: nowrap;\r\n    padding: 4px 8px;\r\n    font-size: 14px;\r\n    line-height: 1.42857143;\r\n    border-radius: 2px;\r\n    -webkit-user-select: none;\r\n    -moz-user-select: none;\r\n    -ms-user-select: none;\r\n    user-select: none;\r\n}\r\n\r\n.btn:focus,\r\n.btn:active:focus,\r\n.btn.active:focus,\r\n.btn.focus,\r\n.btn:active.focus,\r\n.btn.active.focus {\r\n    outline: thin dotted;\r\n    outline: 5px auto -webkit-focus-ring-color;\r\n    outline-offset: -2px;\r\n}\r\n\r\n.btn:hover,\r\n.btn:focus,\r\n.btn.focus {\r\n    color: #333333;\r\n    text-decoration: none;\r\n}\r\n\r\n.btn:active,\r\n.btn.active {\r\n    outline: 0;\r\n    background-image: none;\r\n    -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\r\n    box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\r\n}\r\n\r\n.btn.disabled,\r\n.btn[disabled],\r\nfieldset[disabled] .btn {\r\n    cursor: not-allowed;\r\n    opacity: 0.65;\r\n    filter: alpha(opacity=65);\r\n    -webkit-box-shadow: none;\r\n    box-shadow: none;\r\n}\r\n\r\na.btn.disabled,\r\nfieldset[disabled] a.btn {\r\n    pointer-events: none;\r\n}\r\n\r\n.btn-default {\r\n    color: #333;\r\n    background-color: #fff;\r\n    border-color: #ccc;\r\n}\r\n\r\n.btn-default:focus,\r\n.btn-default.focus {\r\n    color: #333;\r\n    background-color: #e6e6e6;\r\n    border-color: #8c8c8c;\r\n}\r\n\r\n.btn-default:hover {\r\n    color: #333;\r\n    background-color: #e6e6e6;\r\n    border-color: #adadad;\r\n}\r\n\r\n.btn-default:active,\r\n.btn-default.active,\r\n.open > .dropdown-toggle.btn-default {\r\n    color: #333;\r\n    background-color: #e6e6e6;\r\n    border-color: #adadad;\r\n}\r\n\r\n.btn-default:active:hover,\r\n.btn-default.active:hover,\r\n.open > .dropdown-toggle.btn-default:hover,\r\n.btn-default:active:focus,\r\n.btn-default.active:focus,\r\n.open > .dropdown-toggle.btn-default:focus,\r\n.btn-default:active.focus,\r\n.btn-default.active.focus,\r\n.open > .dropdown-toggle.btn-default.focus {\r\n    color: #333;\r\n    background-color: #d4d4d4;\r\n    border-color: #8c8c8c;\r\n}\r\n\r\n.btn-default:active,\r\n.btn-default.active,\r\n.open > .dropdown-toggle.btn-default {\r\n    background-image: none;\r\n}\r\n\r\n.btn-default.disabled:hover,\r\n.btn-default[disabled]:hover,\r\nfieldset[disabled] .btn-default:hover,\r\n.btn-default.disabled:focus,\r\n.btn-default[disabled]:focus,\r\nfieldset[disabled] .btn-default:focus,\r\n.btn-default.disabled.focus,\r\n.btn-default[disabled].focus,\r\nfieldset[disabled] .btn-default.focus {\r\n    background-color: #fff;\r\n    border-color: #ccc;\r\n}\r\n\r\n.btn-default .badge {\r\n    color: #fff;\r\n    background-color: #333;\r\n}\r\n\r\n.btn-primary {\r\n    color: #ffffff;\r\n    /* background-color: #337ab7; */\r\n    background-color: #2d7ff9;\r\n    /* border-color: #2e6da4; */\r\n    border-color: transparent;\r\n}\r\n\r\n.btn-primary:focus,\r\n.btn-primary.focus {\r\n    color: #ffffff;\r\n    background-color: #286090;\r\n    /* border-color: #122b40; */\r\n    border-color: transparent;\r\n}\r\n\r\n.btn-primary:hover {\r\n    color: #ffffff;\r\n    /* background-color: #286090; */\r\n    background-color: #5391ff;\r\n    /* border-color: #204d74; */\r\n    border-color: transparent;\r\n}\r\n\r\n.btn-primary:active,\r\n.btn-primary.active,\r\n.open > .dropdown-toggle.btn-primary {\r\n    color: #ffffff;\r\n    /* background-color: #286090; */\r\n    background-color: #5391ff;\r\n    /* border-color: #204d74; */\r\n}\r\n\r\n.btn-primary:active:hover,\r\n.btn-primary.active:hover,\r\n.open > .dropdown-toggle.btn-primary:hover,\r\n.btn-primary:active:focus,\r\n.btn-primary.active:focus,\r\n.open > .dropdown-toggle.btn-primary:focus,\r\n.btn-primary:active.focus,\r\n.btn-primary.active.focus,\r\n.open > .dropdown-toggle.btn-primary.focus {\r\n    color: #ffffff;\r\n    background-color: #204d74;\r\n    /* border-color: #122b40; */\r\n    border-color: transparent;\r\n}\r\n\r\n.btn-primary:active,\r\n.btn-primary.active,\r\n.open > .dropdown-toggle.btn-primary {\r\n    background-image: none;\r\n}\r\n\r\n.btn-primary.disabled,\r\n.btn-primary[disabled],\r\nfieldset[disabled] .btn-primary,\r\n.btn-primary.disabled:hover,\r\n.btn-primary[disabled]:hover,\r\nfieldset[disabled] .btn-primary:hover,\r\n.btn-primary.disabled:focus,\r\n.btn-primary[disabled]:focus,\r\nfieldset[disabled] .btn-primary:focus,\r\n.btn-primary.disabled.focus,\r\n.btn-primary[disabled].focus,\r\nfieldset[disabled] .btn-primary.focus,\r\n.btn-primary.disabled:active,\r\n.btn-primary[disabled]:active,\r\nfieldset[disabled] .btn-primary:active,\r\n.btn-primary.disabled.active,\r\n.btn-primary[disabled].active,\r\nfieldset[disabled] .btn-primary.active {\r\n    background-color: #337ab7;\r\n    /* border-color: #2e6da4; */\r\n    border-color: transparent;\r\n}\r\n\r\n.btn-primary .badge {\r\n    color: #337ab7;\r\n    background-color: #ffffff;\r\n}\r\n\r\n.btn-primary,\r\n.label-default,\r\n.list-group-item.active,\r\n.list-group-item.active:hover,\r\n.list-group-item.active:focus {\r\n    background: #0188fb;\r\n    /* border-color: #726EFE; */\r\n    border-color: transparent;\r\n}\r\n\r\n.btn-primary:hover,\r\n.btn-primary:focus {\r\n    /* background: #388cf5; */\r\n    background: #5391ff;\r\n    /* border-color: #6864FE; */\r\n    border-color: transparent;\r\n}\r\n\r\n.btn-danger {\r\n    color: #fff;\r\n    background-color: #d9534f;\r\n    border-color: #d43f3a;\r\n}\r\n\r\n.btn-danger:focus,\r\n.btn-danger.focus {\r\n    color: #fff;\r\n    background-color: #c9302c;\r\n    border-color: #761c19;\r\n}\r\n\r\n.btn-danger:hover {\r\n    color: #fff;\r\n    background-color: #c9302c;\r\n    border-color: #ac2925;\r\n}\r\n\r\n.btn-danger:active,\r\n.btn-danger.active,\r\n.open > .dropdown-toggle.btn-danger {\r\n    color: #fff;\r\n    background-color: #c9302c;\r\n    border-color: #ac2925;\r\n}\r\n\r\n.btn-danger:active:hover,\r\n.btn-danger.active:hover,\r\n.open > .dropdown-toggle.btn-danger:hover,\r\n.btn-danger:active:focus,\r\n.btn-danger.active:focus,\r\n.open > .dropdown-toggle.btn-danger:focus,\r\n.btn-danger:active.focus,\r\n.btn-danger.active.focus,\r\n.open > .dropdown-toggle.btn-danger.focus {\r\n    color: #fff;\r\n    background-color: #ac2925;\r\n    border-color: #761c19;\r\n}\r\n\r\n.btn-danger:active,\r\n.btn-danger.active,\r\n.open > .dropdown-toggle.btn-danger {\r\n    background-image: none;\r\n}\r\n\r\n.btn-danger.disabled:hover,\r\n.btn-danger[disabled]:hover,\r\nfieldset[disabled] .btn-danger:hover,\r\n.btn-danger.disabled:focus,\r\n.btn-danger[disabled]:focus,\r\nfieldset[disabled] .btn-danger:focus,\r\n.btn-danger.disabled.focus,\r\n.btn-danger[disabled].focus,\r\nfieldset[disabled] .btn-danger.focus {\r\n    background-color: #d9534f;\r\n    border-color: #d43f3a;\r\n}\r\n\r\n.btn-danger .badge {\r\n    color: #d9534f;\r\n    background-color: #fff;\r\n}\r\n\r\n.luckysheet-cols-change-size,\r\n.luckysheet-rows-change-size,\r\n.luckysheet-change-size-line {\r\n    /*display: none;*/\r\n    position: absolute;\r\n    z-index: 12;\r\n}\r\n\r\n.luckysheet-cols-change-size {\r\n    width: 5px;\r\n    height: 100%;\r\n    background: #0188fb;\r\n    cursor: ew-resize;\r\n    opacity: 0;\r\n}\r\n\r\n.luckysheet-rows-change-size {\r\n    width: 100%;\r\n    height: 5px;\r\n    background: #0188fb;\r\n    cursor: ns-resize;\r\n    opacity: 0;\r\n}\r\n\r\n.luckysheet-change-size-line {\r\n    border-color: #0188fb;\r\n    border-style: solid;\r\n    z-index: 15;\r\n    display: none;\r\n}\r\n\r\n.luckysheet-count-show {\r\n    position: absolute;\r\n    z-index: 15;\r\n    background: rgba(76, 76, 76, 0.8);\r\n    color: #fff;\r\n    padding: 2px 3px;\r\n    border-radius: 3px;\r\n    transition: all 0.3s;\r\n    display: none;\r\n    white-space: nowrap;\r\n}\r\n\r\n.luckysheet-row-count-show {\r\n    text-align: center;\r\n}\r\n\r\n.luckysheet-row-count-show div {\r\n    /*-webkit-writing-mode: vertical-rl;*/\r\n    writing-mode: vertical-rl;\r\n    /*-ms-writing-mode: tb-rl;*/\r\n    writing-mode: vertical-rl;\r\n    -ms-writing-mode: initial;\r\n    *writing-mode: tb-rl;\r\n    /* IE 写法 */\r\n}\r\n\r\n.luckysheet-row-count-show div:last-child {\r\n    writing-mode: initial;\r\n}\r\n\r\n#luckysheet-sheet-list {\r\n    max-height: 60%;\r\n    overflow: auto;\r\n}\r\n\r\n#luckysheet-sheet-list .luckysheet-cols-menuitem {\r\n    padding-left: 0px;\r\n    padding-right: 10px;\r\n}\r\n\r\n#luckysheet-sheet-list .luckysheet-cols-menuitem .luckysheet-cols-menuitem-content {\r\n    padding-left: 5px;\r\n}\r\n/* \r\n#luckysheet-sheet-list .luckysheet-cols-menuitem .luckysheet-cols-menuitem-content {\r\n    max-width: 420px;\r\n    min-width: 190px;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n} */\r\n\r\n#luckysheet-sheet-list .icon {\r\n    width: 15px;\r\n    margin-left: 4px;\r\n    display: inline-block;\r\n}\r\n\r\n.luckysheet-input-box {\r\n    position: absolute;\r\n    font: normal normal 400 13px arial, sans, sans-serif;\r\n    text-align: left;\r\n    top: -10000px;\r\n    max-height: 9900px;\r\n    max-width: 9900px;\r\n    border: 2px #5292f7 solid;\r\n    padding: 0 2px;\r\n    margin: 0;\r\n    z-index: 15;\r\n    resize: none;\r\n    overflow: auto;\r\n    overflow: initial;\r\n    white-space: pre-wrap;\r\n    outline: none;\r\n    -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.4);\r\n    -moz-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.4);\r\n    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.4);\r\n    word-wrap: break-word;\r\n}\r\n\r\n.luckysheet-cell-input {\r\n    width: 100%;\r\n    height: 100%;\r\n    margin: 0;\r\n    outline: none;\r\n    cursor: text;\r\n    -webkit-user-modify: read-write-plaintext-only;\r\n    white-space: pre-wrap;\r\n    -webkit-transform: translateZ(0);\r\n    /*    background-color: white;*/\r\n}\r\n\r\n#luckysheet-rich-text-editor {\r\n    -webkit-user-modify: read-write;\r\n    /*    background-color: rgb(255, 255, 255); \r\n    font-size: 13px; \r\n    color: rgb(0, 0, 0); \r\n    font-weight: 400; \r\n    font-family: Arial; \r\n    font-style: normal;*/\r\n}\r\n\r\n.luckysheet-input-box-index {\r\n    display: none;\r\n    position: absolute;\r\n    /*top: -20px;\r\n    left: -3px;*/\r\n    height: 14px;\r\n    line-height: 16px;\r\n    font-size: 12px;\r\n    padding: 1px 6px;\r\n    background-color: #5292f7;\r\n    border-radius: 2px;\r\n    box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5);\r\n    color: white;\r\n}\r\n\r\n.luckysheet-modal-dialog {\r\n    -webkit-box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);\r\n    -moz-box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);\r\n    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);\r\n    background: #fff;\r\n    background-clip: padding-box;\r\n    border: 1px solid #acacac;\r\n    border: 1px solid rgba(0, 0, 0, 0.333);\r\n    outline: 0;\r\n    position: absolute;\r\n    color: #000;\r\n    padding: 30px 42px;\r\n    z-index: 100002;\r\n}\r\n\r\n.luckysheet-modal-dialog-mask {\r\n    position: absolute;\r\n    height: 100%;\r\n    width: 100%;\r\n    background: #fff;\r\n    opacity: 0.6;\r\n    display: none;\r\n    left: 0px;\r\n    top: 0px;\r\n    z-index: 1010;\r\n}\r\n\r\n.luckysheet-modal-dialog-title {\r\n    background-color: #fff;\r\n    color: #000;\r\n    cursor: default;\r\n    font-size: 16px;\r\n    font-weight: normal;\r\n    line-height: 24px;\r\n    margin: 0 0 16px;\r\n}\r\n\r\n.luckysheet-modal-dialog-title-close {\r\n    height: 11px;\r\n    opacity: 0.7;\r\n    padding: 17px;\r\n    position: absolute;\r\n    right: 0px;\r\n    top: 0px;\r\n    width: 11px;\r\n    color: #d4d4d4;\r\n    outline: 0;\r\n}\r\n\r\n.luckysheet-modal-dialog-chart {\r\n    padding: 20px 10px;\r\n    webkit-box-shadow: none;\r\n    -moz-box-shadow: none;\r\n    box-shadow: none;\r\n}\r\n\r\n/*         .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-title{\r\n             line-height:0px;\r\n             margin: 0px;\r\n             font-size: 12px;\r\n         }\r\n\r\n        .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-title-close,.luckysheet-modal-dialog-chart .luckysheet-modal-dialog-title-max,.luckysheet-modal-dialog-chart .luckysheet-modal-dialog-title-min,.luckysheet-modal-dialog-chart .luckysheet-modal-dialog-title-restore, .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-title-update {\r\n             height: 5px;\r\n             opacity: 0.7;\r\n             padding: 12px;\r\n         }\r\n\r\n         .luckysheet-modal-dialog-title-update {\r\n             right: 105px;\r\n             color:#0188fb;\r\n             font-size:14px;\r\n             padding-top: 9px;\r\n         }\r\n\r\n         .luckysheet-modal-dialog-title-min {\r\n             right: 70px;\r\n             padding-top: 9px;\r\n         }\r\n\r\n         .luckysheet-modal-dialog-title-max, .luckysheet-modal-dialog-title-restore {\r\n             right: 35px;\r\n         }\r\n\r\n         .luckysheet-modal-dialog-title-restore{\r\n             display: none;\r\n         }*/\r\n\r\n.luckysheet-modal-dialog-resize {\r\n    position: absolute;\r\n    border: 2px solid #0188fb;\r\n    margin: 0px;\r\n    padding: 0px;\r\n    top: -2px;\r\n    left: -2px;\r\n    bottom: -2px;\r\n    right: -2px;\r\n    pointer-events: none;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item {\r\n    position: absolute;\r\n    height: 6px;\r\n    width: 6px;\r\n    background: #ffffff;\r\n    border: 2px solid #0188fb;\r\n    pointer-events: all;\r\n    border-radius: 6px;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-lt {\r\n    left: -6px;\r\n    top: -6px;\r\n    cursor: se-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-mt {\r\n    left: 50%;\r\n    top: -6px;\r\n    margin-left: -4px;\r\n    cursor: s-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-rt {\r\n    right: -6px;\r\n    top: -6px;\r\n    cursor: ne-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-lm {\r\n    top: 50%;\r\n    left: -6px;\r\n    margin-top: -4px;\r\n    cursor: w-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-rm {\r\n    top: 50%;\r\n    right: -6px;\r\n    margin-top: -4px;\r\n    cursor: w-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-lb {\r\n    left: -6px;\r\n    bottom: -6px;\r\n    cursor: ne-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-mb {\r\n    left: 50%;\r\n    bottom: -6px;\r\n    margin-left: -4px;\r\n    cursor: s-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-rb {\r\n    right: -6px;\r\n    bottom: -6px;\r\n    cursor: se-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-controll {\r\n    position: absolute;\r\n    margin: 0px;\r\n    padding: 0px;\r\n    right: -35px;\r\n    /* width: 60px; */\r\n    font-size: 14px;\r\n    top: 0px;\r\n}\r\n\r\n.luckysheet-modal-controll-btn {\r\n    height: 13px;\r\n    /* opacity: 0.7; */\r\n    padding: 8px;\r\n    /* position: relative; */\r\n    /* right: 0px; */\r\n    /* top: 0px; */\r\n    width: 13px;\r\n    color: #d4d4d4;\r\n    outline: 0;\r\n    border: 1px solid #b6b6b6;\r\n    display: block;\r\n    background: #fff;\r\n    margin-bottom: 3px;\r\n    cursor: pointer;\r\n    transition: all 0.2s;\r\n    -moz-transition: all 0.2s;\r\n    -webkit-transition: all 0.2s;\r\n    -o-transition: all 0.2s;\r\n}\r\n\r\n.luckysheet-modal-controll-btn:hover {\r\n    border: 1px solid #a1a1a1;\r\n    color: #0188fb;\r\n}\r\n\r\n.luckysheet-modal-controll-btn:active {\r\n    border: 1px solid #bbbbbb;\r\n    background: #efefef;\r\n    color: #0188fb;\r\n}\r\n\r\n.luckysheet-modal-controll-del {\r\n    font-size: 16px;\r\n}\r\n\r\n.luckysheet-modal-controll-max-close {\r\n    font-size: 22px;\r\n    width: 42px;\r\n    height: 42px;\r\n    line-height: 42px;\r\n    background: #383838;\r\n    opacity: 0.7;\r\n    -moz-border-radius: 20px;\r\n    -webkit-border-radius: 20px;\r\n    border-radius: 20px;\r\n    color: #fff;\r\n    position: absolute;\r\n    right: 0px;\r\n    top: 0px;\r\n    z-index: 100000;\r\n    text-align: center;\r\n}\r\n\r\n.luckysheet-modal-controll-max-close:hover {\r\n    background: #0188fb;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-sort-item-close {\r\n    margin-right: 3px;\r\n    font-size: 14px;\r\n    color: #bbbbbb;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-sort-item-close:hover {\r\n    color: #494949;\r\n}\r\n\r\n.luckysheet-modal-dialog-title-close:hover {\r\n    color: #5e5e5e;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-modal-dialog-content {\r\n    background-color: #fff;\r\n    line-height: 1.4em;\r\n    word-wrap: break-word;\r\n}\r\n\r\n.luckysheet-modal-dialog-buttons {\r\n    margin-top: 10px;\r\n}\r\n\r\n.luckysheet-modal-dialog-buttons button {\r\n    margin-right: 10px;\r\n}\r\n\r\n.luckysheet-modal-dialog-title-text span {\r\n    font-family: Arial;\r\n}\r\n\r\n.luckysheet-sort-modal {\r\n    font-size: 12px;\r\n}\r\n\r\n.luckysheet-sort-modal label input,\r\n.luckysheet-sort-modal label span {\r\n    vertical-align: middle;\r\n}\r\n\r\n.luckysheet-sort-modal > div,\r\n.luckysheet-sort-modal table {\r\n    margin-bottom: 10px;\r\n}\r\n\r\n.luckysheet-sort-modal table tr {\r\n    margin-bottom: 10px;\r\n}\r\n\r\n.luckysheet-sort-modal table tr td {\r\n    padding: 5px;\r\n    white-space: nowrap;\r\n    border-top: 1px solid #ffc6c6;\r\n}\r\n\r\n.luckysheet-sort-modal table tr td > div:first-child {\r\n    margin-bottom: 8px;\r\n}\r\n\r\n.luckysheet-sort-modal table tr td select {\r\n    max-width: 180px;\r\n    min-width: 50px;\r\n}\r\n\r\n.luckysheet-sort-modal table tr:first-child td {\r\n    border-top: none;\r\n}\r\n\r\n.luckysheet-filter-options {\r\n    color: #897bff;\r\n    cursor: pointer;\r\n    position: absolute;\r\n    z-index: 20;\r\n    border: 1px solid #897bff;\r\n    border-radius: 3px;\r\n    top: 3px;\r\n    margin-left: 0px;\r\n    display: none;\r\n    padding: 0px 4px;\r\n    font-size: 12px;\r\n    height: 15px;\r\n    background: #fff;\r\n    /* transition: all 0.1s; */\r\n}\r\n\r\n.luckysheet-filter-options:hover {\r\n    color: #fff;\r\n    border: 1px solid #fff;\r\n    background: #897bff;\r\n}\r\n\r\n.luckysheet-filter-options-active {\r\n    color: #fff;\r\n    border: 1px solid #897bff;\r\n    background: #897bff;\r\n}\r\n\r\n.luckysheet-flat-menu-button {\r\n    -webkit-border-radius: 2px;\r\n    -moz-border-radius: 2px;\r\n    border-radius: 2px;\r\n    background-color: #f5f5f5;\r\n    background-image: -webkit-linear-gradient(to bottom, #f5f5f5, #f1f1f1);\r\n    background-image: -moz-linear-gradient(to bottom, #f5f5f5, #f1f1f1);\r\n    background-image: -ms-linear-gradient(to bottom, #f5f5f5, #f1f1f1);\r\n    background-image: -o-linear-gradient(to bottom, #f5f5f5, #f1f1f1);\r\n    background-image: linear-gradient(to bottom, #f5f5f5, #f1f1f1);\r\n    border: 1px solid #dcdcdc;\r\n    color: #333;\r\n    cursor: default;\r\n    font-size: 11px;\r\n    font-weight: bold;\r\n    line-height: 27px;\r\n    list-style: none;\r\n    margin: 0 2px;\r\n    min-width: 46px;\r\n    outline: none;\r\n    padding: 0 18px 0 6px;\r\n    text-align: left;\r\n    text-decoration: none;\r\n    position: relative;\r\n    padding-left: 15px;\r\n}\r\n\r\n.luckysheet-flat-menu-button:hover {\r\n    -webkit-border-radius: 2px;\r\n    -moz-border-radius: 2px;\r\n    border-radius: 2px;\r\n    background-color: #f5f5f5;\r\n    background-image: -webkit-linear-gradient(to bottom, #f1f1f1, #f5f5f5);\r\n    background-image: -moz-linear-gradient(to bottom, #f1f1f1, #f5f5f5);\r\n    background-image: -ms-linear-gradient(to bottom, #f1f1f1, #f5f5f5);\r\n    background-image: -o-linear-gradient(to bottom, #f1f1f1, #f5f5f5);\r\n    background-image: linear-gradient(to bottom, #f1f1f1, #f5f5f5);\r\n    border: 1px solid #d0d0d0;\r\n    color: #000;\r\n}\r\n\r\n.luckysheet-flat-menu-button div {\r\n    display: inline-block;\r\n    vertical-align: middle;\r\n    position: absolute;\r\n    right: 15px;\r\n}\r\n\r\n/*图表生成CSS*/\r\n\r\n.luckysheet-data-visualization {\r\n    width: 60%;\r\n    min-width: 860px;\r\n}\r\n\r\n.luckysheet-data-visualization-selection,\r\n.luckysheet-data-pivotTable-selection {\r\n    width: 30%;\r\n    min-width: 200px;\r\n    display: none;\r\n}\r\n\r\n.luckysheet-data-visualization-chart {\r\n    width: 50%;\r\n    /*min-width: 860px;*/\r\n    height: 50%;\r\n}\r\n\r\n.luckysheet-data-visualization-chart .luckysheet-modal-dialog-content {\r\n    width: 100%;\r\n    height: 100%;\r\n    overflow: hidden;\r\n}\r\n\r\n.luckysheet-datavisual-modal {\r\n    font-size: 12px;\r\n    /*height: 450px;*/\r\n    height: 100%;\r\n    width: 100%;\r\n}\r\n\r\n/*, .luckysheet-datavisual-right*/\r\n.luckysheet-datavisual-left {\r\n    display: inline-block;\r\n    width: 100%;\r\n    height: 100%;\r\n    position: relative;\r\n    overflow: hidden;\r\n}\r\n\r\n.luckysheet-datavisual-left {\r\n}\r\n\r\n.luckysheet-datavisual-tabs {\r\n    border-bottom: 1px solid #dedede;\r\n    width: 80%;\r\n    height: 26px;\r\n    padding-left: 20px;\r\n}\r\n\r\n.luckysheet-datavisual-tabs .luckysheet-datavisual-tab {\r\n    padding: 0px 5px;\r\n    text-align: center;\r\n    display: inline-block;\r\n    cursor: pointer;\r\n    border: 1px solid #fff;\r\n    border-bottom: none;\r\n    height: 24px;\r\n    line-height: 24px;\r\n    background: #fff;\r\n    color: #777;\r\n}\r\n\r\n.luckysheet-datavisual-tabs .luckysheet-datavisual-tab:hover {\r\n    color: #000;\r\n}\r\n\r\n.luckysheet-datavisual-tabs .luckysheet-datavisual-tab-active {\r\n    border: 1px solid #dedede;\r\n    border-bottom: none;\r\n    cursor: default;\r\n    height: 26px;\r\n    color: #000;\r\n}\r\n\r\n.luckysheet-datavisual-tab-content {\r\n    position: absolute;\r\n    top: 28px;\r\n    bottom: 0px;\r\n    width: 100%;\r\n    display: none;\r\n}\r\n\r\n.luckysheet-datavisual-quick {\r\n}\r\n\r\n.luckysheet-datavisual-quick-menu {\r\n    width: 90px;\r\n    overflow: auto;\r\n    margin-top: 5px;\r\n}\r\n\r\n.luckysheet-datavisual-quick-menu::-webkit-scrollbar {\r\n    display: none;\r\n}\r\n\r\n.luckysheet-datavisual-quick-menu > div {\r\n    text-align: left;\r\n    padding: 4px 4px;\r\n    border-right: 3px solid #fff;\r\n    color: #777;\r\n    cursor: pointer;\r\n    line-height: 1.4em;\r\n    word-wrap: break-word;\r\n    /*margin: 4px 0px;*/\r\n}\r\n\r\n.luckysheet-datavisual-quick-menu > div:hover {\r\n    color: #000;\r\n}\r\n\r\n.luckysheet-datavisual-quick-menu > div i {\r\n    width: 15px;\r\n}\r\n\r\n.luckysheet-datavisual-quick-menu > div:hover i {\r\n    color: #ff7e7e;\r\n}\r\n\r\n.luckysheet-datavisual-quick-menu > div.luckysheet-datavisual-quick-menu-active {\r\n    border-right: 3px solid #ff7e7e;\r\n    color: #000;\r\n    font-weight: bold;\r\n}\r\n\r\n.luckysheet-datavisual-quick-menu > div.luckysheet-datavisual-quick-menu-active:hover i {\r\n    color: #000;\r\n}\r\n\r\n.luckysheet-datavisual-quick-range {\r\n    padding: 5px 0px;\r\n}\r\n\r\n.luckysheet-datavisual-range-container {\r\n    background: #fff;\r\n    border: 1px solid #d9d9d9;\r\n    border-top: 1px solid #c0c0c0;\r\n    min-width: 20px;\r\n    width: 100%;\r\n    max-width: 200px;\r\n    display: inline-block;\r\n}\r\n\r\n.luckysheet-datavisual-range-container-focus {\r\n    border: 1px solid #4d90fe;\r\n    box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.3);\r\n    outline: none;\r\n}\r\n\r\n.luckysheet-datavisual-range-input,\r\n.luckysheet-datavisual-range-input:focus {\r\n    background: transparent !important;\r\n    border: none !important;\r\n    box-sizing: border-box;\r\n    -webkit-box-shadow: none;\r\n    -moz-box-shadow: none;\r\n    box-shadow: none;\r\n    height: 25px;\r\n    margin: 0;\r\n    outline: none !important;\r\n    padding: 1px 8px !important;\r\n    width: 100%;\r\n}\r\n\r\n.luckysheet-datavisual-range-button-container {\r\n    overflow: hidden;\r\n    padding: 0 0 0 8px;\r\n    text-align: right;\r\n    width: 21px;\r\n}\r\n\r\n.luckysheet-datavisual-range-button-container div {\r\n    padding: 2px 10px 0px 10px;\r\n    font-size: 18px;\r\n    cursor: pointer;\r\n    color: #6598f3;\r\n}\r\n\r\n.luckysheet-datavisual-range-button-container div:hover {\r\n    color: #ff7e7e;\r\n}\r\n\r\n.luckysheet-datavisual-range-config {\r\n    /*display: inline-block;*/\r\n}\r\n\r\n.luckysheet-datavisual-quick-m {\r\n    margin-top: 5px;\r\n}\r\n\r\n.luckysheet-datavisual-quick-list {\r\n    left: 90px;\r\n    right: 0px;\r\n    bottom: 0px;\r\n    top: 110px;\r\n    position: absolute;\r\n    overflow: auto;\r\n    border-top: 1px solid #e5e5e5;\r\n    padding: 5px 3px 35px 3px;\r\n}\r\n\r\n.luckysheet-datavisual-quick-list-title {\r\n    padding: 4px 6px;\r\n    background: #e5e5e5;\r\n    margin-top: 10px;\r\n}\r\n\r\n.luckysheet-datavisual-quick-list-ul {\r\n    overflow: hidden;\r\n}\r\n\r\n.luckysheet-datavisual-quick-list-item {\r\n    display: inline-block;\r\n    margin: 5px 8px;\r\n    border: 1px solid #dadada;\r\n    width: 100px;\r\n    height: 80px;\r\n}\r\n\r\n.luckysheet-datavisual-quick-list-item:hover {\r\n    border: 1px solid #ff7e7e;\r\n    box-shadow: 0px 0px 20px #ff7e7e;\r\n}\r\n\r\n.luckysheet-datavisual-quick-list-item img {\r\n    display: inline-block;\r\n    width: 100px;\r\n    height: 80px;\r\n}\r\n\r\n.luckysheet-datavisual-quick-list-item-active {\r\n    border: 1px solid #6598f3;\r\n    box-shadow: 0px 0px 20px #6598f3;\r\n}\r\n\r\n/*.luckysheet-datavisual-right {\r\n    background: #fff;\r\n}\r\n\r\n.luckysheet-datavisual-right-chart {\r\n    width: 100%;\r\n    height: 90%;\r\n    top: 5%;\r\n    position: relative;\r\n}*/\r\n\r\n.jfk-tooltip {\r\n    z-index: 300000;\r\n}\r\n\r\n.jfk-tooltip-hide {\r\n    -webkit-transition: visibility 0.13s, opacity 0.13s ease-out, left 0 linear 0.13s, top 0 linear 0.13s;\r\n    -moz-transition: visibility 0.13s, opacity 0.13s ease-out, left 0 linear 0.13s, top 0 linear 0.13s;\r\n    -o-transition: visibility 0.13s, opacity 0.13s ease-out, left 0 linear 0.13s, top 0 linear 0.13s;\r\n    transition: visibility 0.13s, opacity 0.13s ease-out, left 0 linear 0.13s, top 0 linear 0.13s;\r\n    opacity: 0;\r\n    left: 20px !important;\r\n    top: 20px !important;\r\n    visibility: hidden !important;\r\n}\r\n\r\n.jfk-tooltip {\r\n    -webkit-border-radius: 0;\r\n    -moz-border-radius: 0;\r\n    border-radius: 0;\r\n    -webkit-box-shadow: none;\r\n    -moz-box-shadow: none;\r\n    box-shadow: none;\r\n    -webkit-transition: visibility 0, opacity 0.13s ease-in;\r\n    -moz-transition: visibility 0, opacity 0.13s ease-in;\r\n    -o-transition: visibility 0, opacity 0.13s ease-in;\r\n    transition: visibility 0, opacity 0.13s ease-in;\r\n    background-color: #2a2a2a;\r\n    border: 1px solid #fff;\r\n    color: #fff;\r\n    cursor: default;\r\n    display: block;\r\n    font-size: 11px;\r\n    font-weight: bold;\r\n    margin-left: -1px;\r\n    opacity: 1;\r\n    padding: 7px 9px;\r\n    position: absolute;\r\n    visibility: visible;\r\n    white-space: pre-wrap;\r\n    word-break: break-all;\r\n    word-break: break-word;\r\n}\r\n\r\n.jfk-tooltip-arrowup {\r\n    top: -6px;\r\n}\r\n\r\n.jfk-tooltip-arrow {\r\n    pointer-events: none;\r\n    position: absolute;\r\n}\r\n\r\n.jfk-tooltip-arrow .jfk-tooltip-arrowimplafter {\r\n    border: 5px solid;\r\n}\r\n\r\n.jfk-tooltip-arrow .jfk-tooltip-arrowimplbefore {\r\n    border: 6px solid;\r\n}\r\n\r\n.jfk-tooltip-arrow .jfk-tooltip-arrowimplbefore,\r\n.jfk-tooltip-arrow .jfk-tooltip-arrowimplafter {\r\n    content: \"\";\r\n    display: block;\r\n    height: 0;\r\n    position: absolute;\r\n    width: 0;\r\n}\r\n\r\n.jfk-tooltip-arrowup .jfk-tooltip-arrowimplafter {\r\n    border-top-width: 0;\r\n    top: 1px;\r\n}\r\n\r\n.jfk-tooltip-arrowdown .jfk-tooltip-arrowimplafter,\r\n.jfk-tooltip-arrowup .jfk-tooltip-arrowimplafter {\r\n    border-color: #2a2a2a transparent;\r\n    left: -5px;\r\n}\r\n\r\n.jfk-tooltip-arrowup .jfk-tooltip-arrowimplbefore {\r\n    border-top-width: 0;\r\n}\r\n\r\n.jfk-tooltip-arrowdown .jfk-tooltip-arrowimplbefore,\r\n.jfk-tooltip-arrowup .jfk-tooltip-arrowimplbefore {\r\n    border-color: #fff transparent;\r\n    left: -6px;\r\n}\r\n\r\n/*图表详细设置*/\r\n.luckysheet-datavisual-config {\r\n    position: relative;\r\n    width: 100%;\r\n    height: 97%;\r\n    overflow: auto;\r\n    top: 0px;\r\n}\r\n\r\n.luckysheet-datavisual-config input {\r\n    outline: none;\r\n}\r\n\r\n.luckysheet-datavisual-config .luckysheet-datavisual-accordion-title {\r\n    position: relative;\r\n    width: 97%;\r\n    height: 33px;\r\n    background: #f5f5f5;\r\n    border: 1px solid #e5e5e5;\r\n    margin-top: 30px;\r\n    line-height: 30px;\r\n    font-weight: bold;\r\n    color: #d14836;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-datavisual-config .luckysheet-datavisual-accordion-title:hover {\r\n    background: #efefef;\r\n    border: 1px solid #e0e0e0;\r\n}\r\n\r\n.luckysheet-datavisual-config .luckysheet-datavisual-accordion-content {\r\n    position: relative;\r\n    width: 97%;\r\n    border: 1px solid #e5e5e5;\r\n    border-top: 1px solid #fff;\r\n    display: none;\r\n    color: #505050;\r\n    padding-bottom: 20px;\r\n}\r\n\r\n.luckysheet-datavisual-config-input,\r\n.luckysheet-datavisual-config-input-no {\r\n    background: #fff;\r\n    border: 1px solid #d9d9d9;\r\n    border-top: 1px solid #c0c0c0;\r\n    min-width: 50px;\r\n    width: 90%;\r\n    display: inline-block;\r\n    height: 24px;\r\n    line-height: 24px;\r\n    padding: 3px;\r\n}\r\n\r\n.luckysheet-datavisual-config-input:focus,\r\n.luckysheet-datavisual-config-input-no:focus {\r\n    border: 1px solid #4d90fe;\r\n    box-shadow: inset 0px 1px 2px rgba(0, 0, 0, 0.3);\r\n    outline: none;\r\n}\r\n\r\n.luckysheet-datavisual-content-row {\r\n    margin-left: 15px;\r\n    margin-bottom: 5px;\r\n    margin-top: 15px;\r\n    height: 30px;\r\n    line-height: 30px;\r\n}\r\n\r\n.luckysheet-datavisual-content-column {\r\n    display: inline-block;\r\n    position: relative;\r\n}\r\n\r\n.luckysheet-datavisual-content-column-title {\r\n    text-align: left;\r\n    font-size: 14px;\r\n}\r\n\r\n.luckysheet-datavisual-content-column-right {\r\n    text-align: right;\r\n}\r\n\r\n.luckysheet-datavisual-content-rowsplit {\r\n    height: 5px;\r\n    border-top: 1px solid #e5e5e5;\r\n    width: 100%;\r\n    margin-top: 25px;\r\n}\r\n\r\n.luckysheet-datavisual-content-rowsplit-sub {\r\n    height: 2px;\r\n    border-top: 1px dashed #e5e5e5;\r\n    width: 90%;\r\n    margin: 0 auto;\r\n    margin-top: 18px;\r\n    text-align: center;\r\n}\r\n\r\n.sp-replacer {\r\n    padding: 2px;\r\n    border: solid 1px #e5e5e5;\r\n    background: #f5f5f5;\r\n}\r\n\r\n.ui-visual-focus {\r\n    box-shadow: none;\r\n}\r\n\r\n.luckysheet-datavisual-config-slider,\r\n.luckysheet-datavisual-config-slider-range {\r\n    width: 70%;\r\n    display: inline-block;\r\n}\r\n\r\n.luckysheet-datavisual-config-slider-range .luckysheet-slider-handle {\r\n    width: 45px;\r\n    height: 26px;\r\n    top: 50%;\r\n    margin-top: -13px;\r\n    text-align: center;\r\n    line-height: 26px;\r\n}\r\n\r\n.luckysheet-datavisual-content-row-subtitle {\r\n    display: none;\r\n}\r\n\r\n.ui-selectmenu-button.ui-button {\r\n    text-align: left;\r\n    white-space: nowrap;\r\n    width: 48%;\r\n}\r\n\r\n.luckysheet-datavisual-content-column-italic {\r\n    font-style: italic;\r\n    font-weight: bold;\r\n    font-family: \"Times New Roman\", Times, serif;\r\n}\r\n\r\n.luckysheetChartAxisShow {\r\n    display: none;\r\n}\r\n\r\n.luckysheet-datavisual-chart-axistitle-show {\r\n    display: none;\r\n}\r\n\r\n.luckysheetChartseriesShow {\r\n    display: none;\r\n}\r\n\r\n#luckysheetswichxy-button,\r\n#piecutselect-button {\r\n    width: 70%;\r\n}\r\n\r\n.ui-selectmenu-menu .ui-menu.customicons .ui-menu-item-wrapper {\r\n    padding: 0.5em 0 0.5em 3em;\r\n}\r\n\r\n.ui-selectmenu-menu .ui-menu.customicons .ui-menu-item .ui-icon {\r\n    height: 26px;\r\n    width: 26px;\r\n    top: 0.1em;\r\n    background-image: none;\r\n}\r\n\r\n#luckysheetswichseries-menu .ui-state-active,\r\n#pie0cutselect-menu .ui-state-active,\r\n#pie1cutselect-menu .ui-state-active,\r\n#pie2cutselect-menu .ui-state-active,\r\n#luckysheetscatterselectshow-menu .ui-state-active {\r\n    border: 1px solid #f5f5f5;\r\n    background: #f5f5f5;\r\n    color: #333;\r\n}\r\n\r\n.ui-front {\r\n    z-index: 100003;\r\n}\r\n\r\n.luckysheet-datavisual-skin {\r\n}\r\n\r\n.luckysheet-datavisual-skin-menu {\r\n    top: 5px;\r\n    position: absolute;\r\n    left: 0px;\r\n    width: 90%;\r\n    height: 30px;\r\n}\r\n\r\n#luckysheet-chart-theme-content {\r\n    height: 21px;\r\n    width: 120px;\r\n}\r\n\r\n.luckysheet-datavisual-skin-c {\r\n    position: absolute;\r\n    left: 0px;\r\n    top: 38px;\r\n    bottom: 0px;\r\n    /*background: #000;*/\r\n    width: 100%;\r\n    overflow: auto;\r\n}\r\n\r\n.luckysheet-datavisual-skin-c .luckysheet-datavisual-skin-item {\r\n    display: inline-block;\r\n    width: 46%;\r\n    height: 152px;\r\n    /*background: red;*/\r\n    margin-right: 5px;\r\n    border: 4px solid #efefef;\r\n    border-radius: 4px;\r\n    position: relative;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-datavisual-skin-c .luckysheet-datavisual-skin-item-more {\r\n    display: inline-block;\r\n    width: 94%;\r\n    height: 32px;\r\n    position: relative;\r\n    cursor: pointer;\r\n    font-size: 20px;\r\n    line-height: 32px;\r\n    margin-bottom: 20px;\r\n    text-align: center;\r\n}\r\n\r\n.luckysheet-datavisual-skin-item .luckysheet-datavisual-skin-canvas,\r\n.luckysheet-datavisual-skin-item .luckysheet-datavisual-skin-cover {\r\n    position: absolute;\r\n    width: 100%;\r\n    height: 100%;\r\n    bottom: 0;\r\n}\r\n\r\n.luckysheet-datavisual-skin-item .luckysheet-datavisual-skin-canvas {\r\n    /*z-index: 1;*/\r\n}\r\n\r\n.luckysheet-datavisual-skin-item .luckysheet-datavisual-skin-cover {\r\n    background-color: rgba(0, 0, 0, 0.4);\r\n    color: #ffffff;\r\n    font-size: 14px;\r\n    height: 30%;\r\n    /*opacity: 0;*/\r\n    transition: opacity 0.15s ease;\r\n    -moz-transition: opacity 0.15s ease;\r\n    -webkit-transition: opacity 0.15s ease;\r\n    -o-transition: opacity 0.15s ease;\r\n}\r\n\r\n.luckysheet-datavisual-skin-item:hover .luckysheet-datavisual-skin-cover {\r\n    opacity: 1;\r\n    z-index: 2;\r\n}\r\n\r\n.luckysheet-datavisual-skin-cover .luckysheet-datavisual-skin-cover-txt {\r\n    position: absolute;\r\n    width: 80%;\r\n    height: 80%;\r\n    top: 10%;\r\n    left: 10%;\r\n    text-align: center;\r\n}\r\n\r\n/*图表点设置*/\r\n.luckysheet-chart-point-config {\r\n    position: relative;\r\n    width: 100%;\r\n    height: 100%;\r\n    margin: 0px;\r\n    font-size: 12px;\r\n}\r\n\r\n.luckysheet-chart-point-config-set {\r\n    position: absolute;\r\n    width: 60%;\r\n    height: 100%;\r\n    left: 0px;\r\n    top: 0px;\r\n    /*background:#ff0000;*/\r\n}\r\n\r\n.luckysheet-chart-point-config-left {\r\n    position: absolute;\r\n    height: 100%;\r\n    width: 50%;\r\n    left: 0px;\r\n    top: 0px;\r\n}\r\n\r\n.luckysheet-chart-point-config-left-top {\r\n    position: absolute;\r\n    top: 0px;\r\n    height: 120px;\r\n    width: 100%;\r\n}\r\n\r\n.luckysheet-chart-point-searchcondition {\r\n    position: absolute;\r\n    top: 10px;\r\n    bottom: 10px;\r\n    left: 10px;\r\n    right: 10px;\r\n}\r\n\r\n.luckysheet-chart-point-config-left-mid {\r\n    position: absolute;\r\n    top: 120px;\r\n    height: 25px;\r\n    width: 100%;\r\n    text-align: left;\r\n    margin-left: 20px;\r\n    line-height: 35px;\r\n}\r\n\r\n.luckysheet-chart-point-config-left-mid span {\r\n    color: blue;\r\n    cursor: pointer;\r\n    text-decoration: underline;\r\n    font-size: 12px;\r\n}\r\n\r\n.luckysheet-chart-point-config-left-bottom {\r\n    position: absolute;\r\n    top: 0px;\r\n    bottom: 0px;\r\n    margin-top: 145px;\r\n    width: 100%;\r\n}\r\n\r\n.luckysheet-chart-point-searchitem-c {\r\n    position: absolute;\r\n    width: 100%;\r\n    height: 100%;\r\n    overflow: hidden;\r\n    overflow-y: auto;\r\n    cursor: default;\r\n}\r\n\r\n.luckysheet-chart-point-searchitem {\r\n    display: inline-block;\r\n    margin-left: 5px;\r\n    margin-top: 5px;\r\n    width: 90px;\r\n    border: 2px solid #f5f5f5;\r\n    background: #fff;\r\n    text-align: center;\r\n    padding: 5px 0px;\r\n    user-select: none;\r\n    cursor: default;\r\n    position: relative;\r\n}\r\n\r\n.luckysheet-chart-point-searchitem-selected {\r\n    position: absolute;\r\n    color: #616161;\r\n    left: -6px;\r\n    top: -10px;\r\n    font-size: 20px;\r\n    display: none;\r\n    font-weight: normal;\r\n}\r\n\r\n.luckysheet-chart-point-searchitem-active {\r\n    box-shadow: 0px 0px 4px #656565;\r\n}\r\n\r\n.luckysheet-chart-point-searchitem-active .luckysheet-chart-point-searchitem-selected {\r\n    display: block;\r\n}\r\n\r\n.luckysheet-chart-point-searchitem-name {\r\n    font-size: 12px;\r\n    cursor: default;\r\n    white-space: nowrap;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n}\r\n\r\n.luckysheet-chart-point-searchitem-dim {\r\n    font-size: 12px;\r\n    opacity: 0.7;\r\n    /*color: #C1C1C1;*/\r\n    cursor: default;\r\n    white-space: nowrap;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n}\r\n\r\n#luckysheet-chart-point-selectedhelp {\r\n    pointer-events: none;\r\n    position: absolute;\r\n    border: 1px dotted #535353;\r\n}\r\n\r\n.luckysheet-chart-point-config-right {\r\n    position: absolute;\r\n    height: 100%;\r\n    width: 50%;\r\n    top: 0px;\r\n    right: 0px;\r\n}\r\n\r\n.luckysheet-chart-point-itemconfig {\r\n    position: absolute;\r\n    top: 10px;\r\n    bottom: 10px;\r\n    left: 10px;\r\n    right: 10px;\r\n    overflow: auto;\r\n}\r\n\r\n.luckysheet-chart-point-config-chart {\r\n    position: absolute;\r\n    width: 40%;\r\n    height: 100%;\r\n    right: 0px;\r\n    top: 0px;\r\n}\r\n\r\n.luckysheet-chart-point-config-chart-c {\r\n    width: 100%;\r\n    height: 80%;\r\n    top: 10%;\r\n    position: relative;\r\n}\r\n\r\n@media (max-width: 776px) {\r\n    .luckysheet-chart-point-config-set {\r\n        width: 90%;\r\n    }\r\n\r\n    .luckysheet-chart-point-config-chart {\r\n        width: 10%;\r\n    }\r\n}\r\n\r\n@media (min-width: 768px) {\r\n    .luckysheet-chart-point-config-set {\r\n        width: 80%;\r\n    }\r\n\r\n    .luckysheet-chart-point-config-chart {\r\n        width: 20%;\r\n    }\r\n}\r\n\r\n@media (min-width: 1024px) {\r\n    .luckysheet-chart-point-config-set {\r\n        width: 70%;\r\n    }\r\n\r\n    .luckysheet-chart-point-config-chart {\r\n        width: 30%;\r\n    }\r\n}\r\n\r\n@media (min-width: 1280px) {\r\n    .luckysheet-chart-point-config-set {\r\n        width: 60%;\r\n    }\r\n\r\n    .luckysheet-chart-point-config-chart {\r\n        width: 40%;\r\n    }\r\n}\r\n\r\n@media (min-width: 1680px) {\r\n    .luckysheet-chart-point-config-set {\r\n        width: 50%;\r\n    }\r\n\r\n    .luckysheet-chart-point-config-chart {\r\n        width: 50%;\r\n    }\r\n}\r\n\r\n/*边栏通用样式*/\r\n.luckysheet-modal-dialog-slider {\r\n    top: 1px;\r\n    bottom: 1px;\r\n    position: absolute;\r\n    right: 0px;\r\n    width: 260px;\r\n    border: 1px solid #e5e5e5;\r\n    z-index: 1004;\r\n    box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2);\r\n    -webkit-box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2);\r\n    -moz-box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.2);\r\n    -moz-user-select: none;\r\n    -khtml-user-select: none;\r\n    -webkit-user-select: none;\r\n    -ms-user-select: none;\r\n    user-select: none;\r\n    /*display: none;*/\r\n}\r\n\r\n.luckysheet-modal-dialog-slider .luckysheet-modal-dialog-slider-title {\r\n    background: #333;\r\n    color: #fff;\r\n    height: 39px;\r\n    width: 100%;\r\n    position: absolute;\r\n    top: 0px;\r\n    left: 0px;\r\n    line-height: 39px;\r\n    font-size: 13px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider .luckysheet-modal-dialog-slider-title > span:first-child {\r\n    margin-left: 5px;\r\n    font-weight: bold;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider .luckysheet-modal-dialog-slider-title > span:last-child {\r\n    position: relative;\r\n    float: right;\r\n    margin-right: 20px;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-content {\r\n    background: #efefef;\r\n    margin-top: 39px;\r\n    width: 100%;\r\n    position: absolute;\r\n    top: 0px;\r\n    bottom: 0px;\r\n    font-size: 12px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-range {\r\n    background: #e1e1de;\r\n    color: #1b1b19;\r\n    height: 40px;\r\n    font-size: 13px;\r\n    line-height: 40px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-range > div:first-child {\r\n    font-weight: bold;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    float: left;\r\n    max-width: 170px;\r\n    margin-right: 10px;\r\n    margin-left: 5px;\r\n    white-space: nowrap;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-range > div:last-child {\r\n    color: blue;\r\n    cursor: pointer;\r\n    float: left;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list {\r\n    width: 250px;\r\n    height: 320px;\r\n    overflow-y: scroll;\r\n    margin: 5px 0px;\r\n    margin-left: 5px;\r\n    border-top: 1px solid #e5e5e5;\r\n    border-bottom: 1px solid #e5e5e5;\r\n    background: #fff;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list-title {\r\n    height: 20px;\r\n    line-height: 25px;\r\n    padding: 0px 5px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-modal-dialog-slider-list-item {\r\n    padding: 0px 4px;\r\n    position: relative;\r\n    width: 228px;\r\n    height: 25px;\r\n    user-select: none;\r\n    border: 1px solid #fff;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-modal-dialog-slider-list-item:hover {\r\n    background: #fff6cb;\r\n    border: 1px solid #ffe463;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-name {\r\n    cursor: pointer;\r\n    height: 25px;\r\n    line-height: 25px;\r\n    cursor: move;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n    position: absolute;\r\n    left: 22px;\r\n    right: 40px;\r\n    top: 0px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-selected {\r\n    width: 20px;\r\n    cursor: pointer;\r\n    text-align: center;\r\n    position: absolute;\r\n    left: 0px;\r\n    top: 0px;\r\n    height: 25px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-selected i {\r\n    margin-top: 4px;\r\n    font-size: 16px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-selected div {\r\n    border: 1px solid #9c9c9c;\r\n    top: 4px;\r\n    left: 1px;\r\n    position: absolute;\r\n    height: 14px;\r\n    width: 14px;\r\n    -moz-box-shadow: 1px 1px 1px #dbdbdb inset;\r\n    /* For Firefox3.6+ */\r\n    -webkit-box-shadow: 1px 1px 1px #dbdbdb inset;\r\n    /* For Chrome5+, Safari5+ */\r\n    box-shadow: 1px 1px 1px #dbdbdb inset;\r\n    /* For Latest Opera */\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-selected div:hover {\r\n    border: 1px solid #5e5e5e;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filtered {\r\n    width: 20px;\r\n    cursor: pointer;\r\n    text-align: center;\r\n    position: absolute;\r\n    right: 20px;\r\n    top: 2px;\r\n    height: 25px;\r\n    display: none;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filtered i {\r\n    margin-top: 2px;\r\n    font-size: 16px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filtered:hover i {\r\n    color: #fb8686;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filtered i.fa-times {\r\n    right: 0px;\r\n    bottom: 3px;\r\n    color: red;\r\n    font-size: 9px;\r\n    position: absolute;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filter {\r\n    width: 20px;\r\n    cursor: pointer;\r\n    text-align: center;\r\n    position: absolute;\r\n    right: 0px;\r\n    top: 0px;\r\n    height: 25px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filter i {\r\n    margin-top: 2px;\r\n    font-size: 16px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-list .luckysheet-slider-list-item-filter:hover i {\r\n    color: #fb8686;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-config-c {\r\n    width: 100%;\r\n    position: absolute;\r\n    margin-top: 390px;\r\n    top: 0px;\r\n    bottom: 3px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-config {\r\n    height: 50%;\r\n    width: 50%;\r\n    position: absolute;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-config > div:first-child {\r\n    color: #1b1b19;\r\n    font-size: 13px;\r\n    height: 20px;\r\n    line-height: 20px;\r\n    padding-left: 5px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-config > div:first-child span {\r\n    font-weight: bold;\r\n    font-weight: bold;\r\n    overflow: hidden;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-config .luckysheet-modal-dialog-slider-config-list {\r\n    position: absolute;\r\n    margin-top: 22px;\r\n    margin-left: 5px;\r\n    left: 0px;\r\n    right: 5px;\r\n    top: 0px;\r\n    bottom: 3px;\r\n    border: 1px solid #e5e5e5;\r\n    user-select: none;\r\n    overflow-y: auto;\r\n    background: #fff;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-config-list .luckysheet-modal-dialog-slider-config-item {\r\n    position: relative;\r\n    height: 19px;\r\n    line-height: 19px;\r\n    font-size: 12px;\r\n    border: 1px solid #88adfd;\r\n    background: #aac1fe;\r\n    margin: 2px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-config-list .luckysheet-modal-dialog-slider-config-item:hover {\r\n    border: 1px solid #0188fb;\r\n    background: #5f9afc;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-config-item-txt {\r\n    position: absolute;\r\n    height: 100%;\r\n    left: 5px;\r\n    right: 25px;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n    cursor: move;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-config-item-icon {\r\n    position: absolute;\r\n    height: 100%;\r\n    width: 15px;\r\n    right: 0;\r\n    top: -4px;\r\n    cursor: pointer;\r\n    font-size: 14px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-config-item-icon:hover {\r\n    color: #fa7272;\r\n}\r\n\r\n.luckysheet-modal-dialog-config-filter {\r\n    top: 0;\r\n    left: 0;\r\n}\r\n\r\n.luckysheet-modal-dialog-config-column {\r\n    top: 0;\r\n    left: 50%;\r\n}\r\n\r\n.luckysheet-modal-dialog-config-row {\r\n    top: 50%;\r\n    left: 0;\r\n}\r\n\r\n.luckysheet-modal-dialog-config-value {\r\n    top: 50%;\r\n    left: 50%;\r\n}\r\n\r\n#luckysheet-modal-dialog-slider-pivot-move {\r\n    position: absolute;\r\n    max-width: 100px;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n    background: #fff;\r\n    border: 1px dotted #000;\r\n    color: #000;\r\n    font-size: 14px;\r\n    opacity: 0.6;\r\n    z-index: 1005;\r\n    padding: 3px 8px;\r\n    pointer-events: none;\r\n    user-select: none;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-chart {\r\n    width: 445px;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-chart .luckysheet-modal-dialog-slider-title {\r\n    background: #b94045;\r\n}\r\n\r\n.luckysheet-modal-dialog-slider-chart .luckysheet-modal-dialog-slider-content {\r\n    background: #fff;\r\n}\r\n\r\n#luckysheet-dialog-pivotTable-clearitem {\r\n    color: blue;\r\n    cursor: pointer;\r\n    float: right;\r\n    margin-right: 30px;\r\n}\r\n\r\n/*冻结窗口样式*/\r\n.luckysheet-freezebar-handle,\r\n.luckysheet-freezebar-drop {\r\n    position: absolute;\r\n    z-index: 999;\r\n}\r\n\r\n.luckysheet-freezebar-vertical-handle {\r\n    width: 4px;\r\n    display: none;\r\n    /*background: url(//ssl.gstatic.com/docs/spreadsheets/ritz_luckysheet-freezebar_vertical.png) no-repeat;*/\r\n}\r\n\r\n.luckysheet-freezebar-vertical-drop {\r\n    /*background: url(//ssl.gstatic.com/docs/spreadsheets/jfk_luckysheet-freezebar_active_vertical.png) no-repeat;*/\r\n    width: 4px;\r\n}\r\n\r\n.luckysheet-freezebar-active .luckysheet-freezebar-vertical-handle {\r\n    display: block;\r\n    z-index: 1003;\r\n}\r\n\r\n.luckysheet-freezebar-vertical-handle-bar {\r\n    width: 2px;\r\n    background: #dbe5f7;\r\n    border-color: #a5c6fe;\r\n    border-style: solid;\r\n    border-width: 0 1px;\r\n    opacity: 0.45;\r\n    filter: alpha(opacity=45);\r\n    margin-top: 19px;\r\n    top: 0px;\r\n    bottom: 0px;\r\n}\r\n\r\n.luckysheet-freezebar-vertical-handle-title {\r\n    width: 4px;\r\n    background: #9dbefb;\r\n    opacity: 0.8;\r\n    filter: alpha(opacity=80);\r\n    height: 19px;\r\n    top: 0px;\r\n}\r\n\r\n.luckysheet-freezebar-handle-bar,\r\n.luckysheet-freezebar-drop-bar {\r\n    position: absolute;\r\n    z-index: 7;\r\n}\r\n\r\n.luckysheet-freezebar-vertical-drop-bar {\r\n    width: 2px;\r\n    background: rgba(0, 0, 0, 0.45);\r\n    border-width: 2px 1px 2px 2px;\r\n    margin-top: 19px;\r\n    top: 0px;\r\n    bottom: 0px;\r\n}\r\n\r\n.luckysheet-freezebar-vertical-drop-title {\r\n    width: 2px;\r\n    background: #bcbdbc;\r\n    /*            opacity: 0.80;\r\n            filter: alpha(opacity=80);*/\r\n    height: 19px;\r\n    top: 0px;\r\n}\r\n\r\n.luckysheet-freezebar-hover .luckysheet-freezebar-vertical-drop-bar,\r\n.luckysheet-freezebar-active .luckysheet-freezebar-vertical-drop-bar {\r\n    background: #c1c1c1;\r\n    width: 4px;\r\n}\r\n\r\n.luckysheet-freezebar-hover .luckysheet-freezebar-vertical-drop-title,\r\n.luckysheet-freezebar-active .luckysheet-freezebar-vertical-drop-title {\r\n    background: #5d88db;\r\n    width: 4px;\r\n}\r\n\r\n.luckysheet-freezebar-horizontal-handle {\r\n    height: 4px;\r\n    display: none;\r\n    /*background: url(//ssl.gstatic.com/docs/spreadsheets/ritz_luckysheet-freezebar_horizontal.png) no-repeat;*/\r\n}\r\n\r\n.luckysheet-freezebar-horizontal-drop {\r\n    /*background: url(//ssl.gstatic.com/docs/spreadsheets/jfk_luckysheet-freezebar_active_horizontal.png) no-repeat;*/\r\n    height: 4px;\r\n}\r\n\r\n.luckysheet-freezebar-active .luckysheet-freezebar-horizontal-handle {\r\n    display: block;\r\n    z-index: 1003;\r\n}\r\n\r\n.luckysheet-freezebar-horizontal-handle-bar {\r\n    height: 2px;\r\n    background: #dbe5f7;\r\n    border-color: #a5c6fe;\r\n    border-style: solid;\r\n    border-width: 1px 0;\r\n    opacity: 0.45;\r\n    filter: alpha(opacity=45);\r\n    margin-left: 45px;\r\n    left: 0px;\r\n    right: 0px;\r\n}\r\n\r\n.luckysheet-freezebar-horizontal-handle-title {\r\n    height: 4px;\r\n    background: #9dbefb;\r\n    opacity: 0.8;\r\n    filter: alpha(opacity=80);\r\n    width: 45px;\r\n    left: 0px;\r\n}\r\n\r\n.luckysheet-freezebar-horizontal-drop-bar {\r\n    height: 2px;\r\n    overflow: hidden;\r\n    background: rgba(0, 0, 0, 0.45);\r\n    border-width: 2px 2px 1px 2px;\r\n    margin-left: 45px;\r\n    left: 0px;\r\n    right: 0px;\r\n}\r\n\r\n.luckysheet-freezebar-horizontal-drop-title {\r\n    height: 2px;\r\n    background: #bcbdbc;\r\n    /*            opacity: 0.80;\r\n            filter: alpha(opacity=80);*/\r\n    width: 45px;\r\n    left: 0px;\r\n}\r\n\r\n.luckysheet-freezebar-hover .luckysheet-freezebar-horizontal-drop-bar,\r\n.luckysheet-freezebar-active .luckysheet-freezebar-horizontal-drop-bar {\r\n    background: #c1c1c1;\r\n    height: 4px;\r\n}\r\n\r\n.luckysheet-freezebar-hover .luckysheet-freezebar-horizontal-drop-title,\r\n.luckysheet-freezebar-active .luckysheet-freezebar-horizontal-drop-title {\r\n    background: #5d88db;\r\n    height: 4px;\r\n}\r\n\r\n/*函数样式*/\r\n#luckysheet-functionbox-container {\r\n    height: 100%;\r\n    padding-left: 10px;\r\n    overflow: hidden;\r\n    position: absolute;\r\n    padding: 0;\r\n    top: 0px;\r\n    left: 185px;\r\n    right: 10px;\r\n    border-left: 1px solid #e5e5e5;\r\n}\r\n\r\n#luckysheet-functionbox-container > div {\r\n    height: 100%;\r\n    overflow-x: hidden;\r\n    overflow-y: auto;\r\n    position: relative;\r\n}\r\n\r\n#luckysheet-functionbox {\r\n    bottom: 6px;\r\n    left: 0;\r\n    position: absolute;\r\n    right: 0;\r\n    top: 6px;\r\n    resize: none;\r\n    /*border: 1px #b9b9b9 solid;*/\r\n    font-family: arial, sans, sans-serif;\r\n    font-size: 14px;\r\n    line-height: 14px;\r\n    background-color: #ffffff;\r\n    padding: 0px 5px;\r\n}\r\n\r\n#luckysheet-functionbox .luckysheet-functionbox-cell-input {\r\n    word-wrap: break-word;\r\n    -webkit-nbsp-mode: space;\r\n    -webkit-line-break: after-white-space;\r\n}\r\n\r\n.luckysheet-functionbox-cell-input {\r\n    width: 100%;\r\n    height: 100%;\r\n    margin: 0;\r\n    outline: none;\r\n    cursor: text;\r\n    -webkit-user-modify: read-write-plaintext-only;\r\n    white-space: pre-wrap;\r\n    -webkit-transform: translateZ(0);\r\n    background-color: white;\r\n}\r\n\r\n.luckysheet-formula-text-color {\r\n    color: black;\r\n}\r\n\r\n.luckysheet-formula-text-string {\r\n    color: forestgreen;\r\n}\r\n\r\n.luckysheet-formula-search-c {\r\n    position: absolute;\r\n    left: 50%;\r\n    top: 50%;\r\n    border: 1px solid rgba(0, 0, 0, 0.2);\r\n    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n    color: #535353;\r\n    font-size: 12px;\r\n    background: #fff;\r\n    z-index: 1003;\r\n    width: 300px;\r\n    display: none;\r\n}\r\n\r\n.luckysheet-formula-search-c .luckysheet-formula-search-item {\r\n    background: #fff;\r\n    padding: 5px 10px;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-formula-search-c .luckysheet-formula-search-item .luckysheet-formula-search-detail {\r\n    display: none;\r\n    color: #444;\r\n}\r\n\r\n.luckysheet-formula-search-c .luckysheet-formula-search-item .luckysheet-formula-search-func {\r\n    color: #222;\r\n    font-size: 14px;\r\n}\r\n\r\n.luckysheet-formula-search-c .luckysheet-formula-search-item-active {\r\n    display: block;\r\n    border-top: 1px solid #ebebeb;\r\n    border-bottom: 1px solid #ebebeb;\r\n    background: #f5f5f5;\r\n}\r\n\r\n.luckysheet-formula-search-c .luckysheet-formula-search-item-active .luckysheet-formula-search-detail {\r\n    display: block;\r\n}\r\n\r\n.luckysheet-formula-help-c {\r\n    display: none;\r\n    position: absolute;\r\n    left: 20%;\r\n    top: 20%;\r\n    border: 1px solid rgba(0, 0, 0, 0.2);\r\n    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n    color: #535353;\r\n    font-size: 12px;\r\n    background: #fff;\r\n    z-index: 1003;\r\n    width: 300px;\r\n}\r\n\r\n.luckysheet-formula-help-c .luckysheet-formula-help-content {\r\n    max-height: 300px;\r\n    overflow-y: scroll;\r\n}\r\n\r\n.luckysheet-formula-help-content-example {\r\n    margin-top: 5px;\r\n}\r\n\r\n.luckysheet-formula-help-title {\r\n    display: block;\r\n    border-top: 1px solid #ebebeb;\r\n    border-bottom: 1px solid #ebebeb;\r\n    background: #f5f5f5;\r\n    padding: 2px 10px;\r\n    font-size: 14px;\r\n}\r\n\r\n.luckysheet-formula-help-title-formula {\r\n    width: 250px;\r\n    word-break: break-word;\r\n}\r\n\r\n.luckysheet-arguments-help-section {\r\n    margin-top: 5px;\r\n    margin-bottom: 5px;\r\n    color: #222;\r\n}\r\n\r\n.luckysheet-arguments-help-section-title {\r\n    padding: 1px 10px;\r\n    color: #666;\r\n}\r\n\r\n.luckysheet-arguments-help-parameter-content {\r\n    padding: 1px 10px;\r\n    display: inline-block;\r\n    word-wrap: break-word;\r\n}\r\n\r\n.luckysheet-arguments-help-formula {\r\n    padding: 1px 10px;\r\n    font-size: 14px;\r\n}\r\n\r\n.luckysheet-arguments-help-parameter-active {\r\n    background-color: #fff9b2;\r\n}\r\n\r\n.luckysheet-formula-help-collapse {\r\n    position: absolute;\r\n    top: 0px;\r\n    right: 25px;\r\n    font-size: 16px;\r\n    cursor: pointer;\r\n    color: #bbb;\r\n}\r\n\r\n.luckysheet-formula-help-close {\r\n    position: absolute;\r\n    top: 0px;\r\n    right: 5px;\r\n    font-size: 16px;\r\n    cursor: pointer;\r\n    color: #bbb;\r\n}\r\n\r\n.luckysheet-formula-help-close:hover,\r\n.luckysheet-formula-help-collapse:hover {\r\n    color: #555;\r\n}\r\n\r\n.luckysheetLoader {\r\n    font-size: 20px;\r\n    width: 1em;\r\n    height: 1em;\r\n    border-radius: 50%;\r\n    text-indent: -9999em;\r\n    position: absolute;\r\n    top: 50%;\r\n    left: 50%;\r\n    animation: load-effect 1s infinite linear;\r\n}\r\n\r\n/*.luckysheetLoaderGif>img{\r\n    width:100%;\r\n    height:100%;\r\n}*/\r\n\r\n@keyframes load-effect {\r\n    0% {\r\n        box-shadow:\r\n            /*\r\n          0:左移3em\r\n          -3em:下移2em\r\n          0:模糊距离0，即纯色\r\n          .2em:外扩.2em\r\n          #FFF:白色\r\n         */ 0 -3em\r\n                0 0.2em #0188fb,\r\n            /*上*/ 2em -2em 0 0 #0188fb, /*右上*/ 3em 0 0 -0.5em #0188fb, /*右*/ 2em 2em 0 -0.5em #0188fb,\r\n            /*右下*/ 0 3em 0 -0.5em #0188fb, /*下*/ -2em 2em 0 -0.5em #0188fb, /*左下*/ -3em 0 0 -0.5em #0188fb,\r\n            /*左*/ -2em -2em 0 0 #0188fb;\r\n        /*左上*/\r\n    }\r\n\r\n    12.5% {\r\n        box-shadow: 0 -3em 0 0 #0188fb, 2em -2em 0 0.2em #0188fb, 3em 0 0 0 #0188fb, 2em 2em 0 -0.5em #0188fb,\r\n            0 3em 0 -0.5em #0188fb, -2em 2em 0 -0.5em #0188fb, -3em 0 0 -0.5em #0188fb, -2em -2em 0 -0.5em #0188fb;\r\n    }\r\n\r\n    25% {\r\n        box-shadow: 0 -3em 0 -0.5em #0188fb, 2em -2em 0 0 #0188fb, 3em 0 0 0.2em #0188fb, 2em 2em 0 0 #0188fb,\r\n            0 3em 0 -0.5em #0188fb, -2em 2em 0 -0.5em #0188fb, -3em 0 0 -0.5em #0188fb, -2em -2em 0 -0.5em #0188fb;\r\n    }\r\n\r\n    37.5% {\r\n        box-shadow: 0 -3em 0 -0.5em #0188fb, 2em -2em 0 -0.5em #0188fb, 3em 0 0 0 #0188fb, 2em 2em 0 0.2em #0188fb,\r\n            0 3em 0 0 #0188fb, -2em 2em 0 -0.5em #0188fb, -3em 0 0 -0.5em #0188fb, -2em -2em 0 -0.5em #0188fb;\r\n    }\r\n\r\n    50% {\r\n        box-shadow: 0 -3em 0 -0.5em #0188fb, 2em -2em 0 -0.5em #0188fb, 3em 0 0 -0.5em #0188fb, 2em 2em 0 0 #0188fb,\r\n            0 3em 0 0.2em #0188fb, -2em 2em 0 0 #0188fb, -3em 0 0 -0.5em #0188fb, -2em -2em 0 -0.5em #0188fb;\r\n    }\r\n\r\n    62.5% {\r\n        box-shadow: 0 -3em 0 -0.5em #0188fb, 2em -2em 0 -0.5em #0188fb, 3em 0 0 -0.5em #0188fb, 2em 2em 0 -0.5em #0188fb,\r\n            0 3em 0 0 #0188fb, -2em 2em 0 0.2em #0188fb, -3em 0 0 0 #0188fb, -2em -2em 0 -0.5em #0188fb;\r\n    }\r\n\r\n    75% {\r\n        box-shadow: 0 -3em 0 -0.5em #0188fb, 2em -2em 0 -0.5em #0188fb, 3em 0 0 -0.5em #0188fb, 2em 2em 0 -0.5em #0188fb,\r\n            0 3em 0 -0.5em #0188fb, -2em 2em 0 0 #0188fb, -3em 0 0 0.2em #0188fb, -2em -2em 0 0 #0188fb;\r\n    }\r\n\r\n    87.5% {\r\n        box-shadow: 0 -3em 0 0 #0188fb, 2em -2em 0 -0.5em #0188fb, 3em 0 0 -0.5em #0188fb, 2em 2em 0 -0.5em #0188fb,\r\n            0 3em 0 -0.5em #0188fb, -2em 2em 0 0 #0188fb, -3em 0 0 0 #0188fb, -2em -2em 0 0.2em #0188fb;\r\n    }\r\n\r\n    100% {\r\n        box-shadow: 0 -3em 0 0.2em #0188fb, 2em -2em 0 0 #0188fb, 3em 0 0 -0.5em #0188fb, 2em 2em 0 -0.5em #0188fb,\r\n            0 3em 0 -0.5em #0188fb, -2em 2em 0 -0.5em #0188fb, -3em 0 0 -0.5em #0188fb, -2em -2em 0 0 #0188fb;\r\n    }\r\n}\r\n\r\n.luckysheetpopover {\r\n    position: absolute;\r\n    /*    left: 50%; \r\n    top:20px; */\r\n    background: rgba(0, 0, 0, 0.65);\r\n    color: #fff;\r\n    font-size: 18px;\r\n    padding: 20px 100px;\r\n    text-align: center;\r\n    z-index: 10000;\r\n    border-radius: 4px;\r\n    user-select: none;\r\n    display: none;\r\n}\r\n\r\n.luckysheetpopover .luckysheetpopover-content {\r\n}\r\n\r\n.luckysheetpopover .luckysheetpopover-btn {\r\n    position: absolute;\r\n    right: 10px;\r\n    top: 50%;\r\n    margin-top: -12px;\r\n    border: 1px solid #fff;\r\n    border-radius: 4px;\r\n    padding: 2px 4px;\r\n    cursor: pointer;\r\n    font-size: 14px;\r\n}\r\n\r\n.luckysheetpopover .luckysheetpopover-btn:hover {\r\n    border: 1px solid #fea2a2;\r\n    color: #fea2a2;\r\n}\r\n\r\n.luckysheetPaintCursor {\r\n    cursor: url(paint_24px.ico), auto;\r\n}\r\n\r\n/*        input {\r\n             -webkit-appearance: textfield;\r\n             background-color: white;\r\n             -webkit-rtl-ordering: logical;\r\n             user-select: text;\r\n             cursor: auto;\r\n             padding: 1px;\r\n             border-width: 2px;\r\n             border-style: inset;\r\n             border-color: initial;\r\n             border-image: initial;\r\n         }\r\n         user agent stylesheet\r\n         input, textarea, keygen, select, button {\r\n             text-rendering: auto;\r\n             color: initial;\r\n             letter-spacing: normal;\r\n             word-spacing: normal;\r\n             text-transform: none;\r\n             text-indent: 0px;\r\n             text-shadow: none;\r\n             display: inline-block;\r\n             text-align: start;\r\n             margin: 0em 0em 0em 0em;\r\n             font: 13.3333px Arial;\r\n         }*/\r\n\r\n/*查找替换弹出框样式*/\r\n#luckysheet-search-replace .tabBox {\r\n    margin-top: 20px;\r\n    font-size: 0;\r\n}\r\n\r\n#luckysheet-search-replace .tabBox span {\r\n    display: inline-block;\r\n    text-align: center;\r\n    width: 100px;\r\n    border: 1px solid #d4d4d4;\r\n    font-size: 14px;\r\n    line-height: 2;\r\n}\r\n\r\n#luckysheet-search-replace .tabBox span.on {\r\n    background-color: #8c89fe;\r\n    border-color: #726efe;\r\n    color: #fff;\r\n}\r\n\r\n#luckysheet-search-replace .ctBox {\r\n    padding: 5px 10px;\r\n    border: solid 1px #d4d4d4;\r\n    font-size: 14px;\r\n}\r\n\r\n#luckysheet-search-replace .inputBox {\r\n    height: 90px;\r\n    position: relative;\r\n}\r\n\r\n#luckysheet-search-replace .inputBox .textboxs {\r\n    height: 30px;\r\n    line-height: 30px;\r\n}\r\n\r\n#luckysheet-search-replace .inputBox .checkboxs {\r\n    height: 90px;\r\n    position: absolute;\r\n    right: 0;\r\n    top: 0;\r\n}\r\n\r\n#luckysheet-search-replace .inputBox .checkboxs div {\r\n    height: 30px;\r\n    line-height: 30px;\r\n}\r\n\r\n#luckysheet-search-replace .inputBox .checkboxs input[type=\"checkbox\"] {\r\n    float: left;\r\n    margin-top: 9px;\r\n}\r\n\r\n#luckysheet-search-replace .btnBox {\r\n    margin-top: 10px;\r\n}\r\n\r\n#luckysheet-search-replace .btnBox button {\r\n    margin: 0 2.5px;\r\n}\r\n\r\n#luckysheet-search-replace #searchAllbox {\r\n    height: 210px;\r\n    border: 1px solid #d4d4d4;\r\n    margin-top: 10px;\r\n    overflow-y: auto;\r\n    position: relative;\r\n}\r\n\r\n#luckysheet-search-replace #searchAllbox .boxTitle {\r\n    width: 100%;\r\n    height: 30px;\r\n    line-height: 29px;\r\n    padding: 0 5px;\r\n    background-color: #fff;\r\n    border-bottom: 1px solid #d4d4d4;\r\n    box-sizing: border-box;\r\n    position: sticky;\r\n    left: 0;\r\n    top: 0;\r\n}\r\n\r\n#luckysheet-search-replace #searchAllbox .boxTitle span {\r\n    display: inline-block;\r\n    text-align: center;\r\n}\r\n\r\n#luckysheet-search-replace #searchAllbox .boxTitle span:nth-of-type(1) {\r\n    width: 25%;\r\n}\r\n\r\n#luckysheet-search-replace #searchAllbox .boxTitle span:nth-of-type(2) {\r\n    width: 25%;\r\n}\r\n\r\n#luckysheet-search-replace #searchAllbox .boxTitle span:nth-of-type(3) {\r\n    width: 50%;\r\n}\r\n\r\n#luckysheet-search-replace #searchAllbox .boxMain .boxItem {\r\n    height: 30px;\r\n    line-height: 29px;\r\n    border-bottom: 1px solid #d4d4d4;\r\n    padding: 0 5px;\r\n    box-sizing: border-box;\r\n}\r\n\r\n#luckysheet-search-replace #searchAllbox .boxMain .boxItem.on {\r\n    background-color: #8c89fe;\r\n    color: #fff;\r\n}\r\n\r\n#luckysheet-search-replace #searchAllbox .boxMain .boxItem span {\r\n    display: block;\r\n    text-align: center;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-search-replace #searchAllbox .boxMain .boxItem span:nth-of-type(1) {\r\n    width: 25%;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n}\r\n\r\n#luckysheet-search-replace #searchAllbox .boxMain .boxItem span:nth-of-type(2) {\r\n    width: 25%;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n}\r\n\r\n#luckysheet-search-replace #searchAllbox .boxMain .boxItem span:nth-of-type(3) {\r\n    width: 50%;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n}\r\n\r\n/*函数公式查找样式*/\r\n#luckysheet-search-formula {\r\n    font-size: 12px;\r\n}\r\n\r\n#luckysheet-search-formula .inpbox {\r\n    margin-bottom: 5px;\r\n}\r\n\r\n#luckysheet-search-formula .inpbox label {\r\n    display: block;\r\n    margin-bottom: 5px;\r\n}\r\n\r\n#luckysheet-search-formula .inpbox input {\r\n    width: 100%;\r\n    height: 24px;\r\n    line-height: 24px;\r\n    border: 1px solid #d4d4d4;\r\n    padding: 0 10px;\r\n    box-sizing: border-box;\r\n    font-size: 12px;\r\n}\r\n\r\n#luckysheet-search-formula .selbox {\r\n    margin-bottom: 5px;\r\n}\r\n\r\n#luckysheet-search-formula .selbox select {\r\n    width: 50%;\r\n    height: 24px;\r\n    line-height: 24px;\r\n    border: 1px solid #d4d4d4;\r\n    box-sizing: border-box;\r\n    font-size: 12px;\r\n}\r\n\r\n#luckysheet-search-formula .listbox label {\r\n    display: block;\r\n    margin-bottom: 5px;\r\n}\r\n\r\n#formulaTypeList {\r\n    width: 300px;\r\n    height: 170px;\r\n    border: 1px solid #d4d4d4;\r\n    overflow-y: scroll;\r\n}\r\n\r\n#formulaTypeList .listBox {\r\n    padding: 5px;\r\n    border-bottom: 1px solid #d4d4d4;\r\n}\r\n\r\n#formulaTypeList .listBox.on {\r\n    background-color: #8c89fe;\r\n    color: #fff;\r\n}\r\n\r\n#formulaTypeList .listBox span:nth-of-type(1) {\r\n    display: block;\r\n}\r\n\r\n#formulaTypeList .listBox span:nth-of-type(2) {\r\n    display: block;\r\n}\r\n\r\n#luckysheet-search-formula-parm {\r\n    width: 502px;\r\n    font-size: 12px;\r\n}\r\n\r\n#luckysheet-search-formula-parm .parmListBox {\r\n    width: 500px;\r\n    padding: 5px 0;\r\n    border: 1px solid #d4d4d4;\r\n}\r\n\r\n#luckysheet-search-formula-parm .parmBox {\r\n    height: 30px;\r\n    line-height: 30px;\r\n    margin-bottom: 5px;\r\n}\r\n\r\n#luckysheet-search-formula-parm .parmBox:last-child {\r\n    margin-bottom: 0;\r\n}\r\n\r\n#luckysheet-search-formula-parm .parmBox .name {\r\n    width: 90px;\r\n    height: 30px;\r\n    padding: 0 5px;\r\n    float: left;\r\n    text-align: right;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n}\r\n\r\n#luckysheet-search-formula-parm .parmBox .txt {\r\n    width: 198px;\r\n    height: 28px;\r\n    border: 1px solid #d4d4d4;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-search-formula-parm .parmBox .txt input {\r\n    width: 150px;\r\n    height: 28px;\r\n    padding: 0 10px;\r\n    border: none;\r\n    outline-style: none;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-search-formula-parm .parmBox .txt i {\r\n    float: right;\r\n    margin-top: 8px;\r\n    margin-right: 5px;\r\n}\r\n\r\n#luckysheet-search-formula-parm .fa-table {\r\n    cursor: pointer;\r\n    color: #6598f3;\r\n}\r\n\r\n#luckysheet-search-formula-parm .fa-table:hover {\r\n    color: #ff7e7e;\r\n}\r\n\r\n#luckysheet-search-formula-parm .parmBox .val {\r\n    width: 190px;\r\n    height: 30px;\r\n    line-height: 30px;\r\n    padding: 0 5px;\r\n    float: left;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n}\r\n\r\n#luckysheet-search-formula-parm .formulaDetails {\r\n    padding: 5px;\r\n}\r\n\r\n#luckysheet-search-formula-parm .parmDetailsBox {\r\n    max-height: 100px;\r\n    padding: 5px 0 5px 20px;\r\n    overflow-y: scroll;\r\n}\r\n\r\n#luckysheet-search-formula-parm .parmDetailsBox span {\r\n    display: inline-block;\r\n}\r\n\r\n#luckysheet-search-formula-parm .result {\r\n    padding: 5px;\r\n    border-top: 1px solid #d4d4d4;\r\n}\r\n\r\n/*条件格式颜色选择器*/\r\n#textCellColor {\r\n    border: 1px solid #d4d4d4;\r\n    padding: 5px 10px;\r\n}\r\n\r\n#textCellColor .colorbox {\r\n    height: 30px;\r\n    line-height: 30px;\r\n    margin-bottom: 10px;\r\n}\r\n\r\n#textCellColor .colorbox input[type=\"checkbox\"] {\r\n    float: left;\r\n    margin-top: 10px;\r\n}\r\n\r\n#textCellColor .colorbox label {\r\n    display: inline-block;\r\n    width: 80px;\r\n}\r\n\r\n/*条件格式单元格选择框*/\r\n#luckysheet-singleRange-dialog input,\r\n#luckysheet-multiRange-dialog input {\r\n    border: 1px solid #d4d4d4;\r\n    padding: 0 10px;\r\n    height: 30px;\r\n}\r\n\r\n/*条件格式弹出框*/\r\n#luckysheet-conditionformat-dialog {\r\n    font-size: 12px;\r\n}\r\n\r\n#luckysheet-conditionformat-dialog .box .boxTitleOne {\r\n    margin: 5px 0;\r\n    font-weight: 600;\r\n}\r\n\r\n#luckysheet-conditionformat-dialog .box .inpbox {\r\n    width: 198px;\r\n    height: 28px;\r\n    border: 1px solid #d4d4d4;\r\n}\r\n\r\n#luckysheet-conditionformat-dialog .box .inpbox input {\r\n    width: 150px;\r\n    height: 28px;\r\n    padding: 0 10px;\r\n    border: none;\r\n    outline-style: none;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-conditionformat-dialog .box .inpbox2 {\r\n    float: left;\r\n    width: 108px;\r\n    height: 28px;\r\n    border: 1px solid #d4d4d4;\r\n}\r\n\r\n#luckysheet-conditionformat-dialog .box .inpbox2 input {\r\n    width: 60px;\r\n    height: 28px;\r\n    padding: 0 10px;\r\n    border: none;\r\n    outline-style: none;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-conditionformat-dialog .box i.fa-table {\r\n    float: right;\r\n    margin-top: 8px;\r\n    margin-right: 5px;\r\n}\r\n\r\n#luckysheet-conditionformat-dialog .box .fa-table {\r\n    cursor: pointer;\r\n    color: #6598f3;\r\n}\r\n\r\n#luckysheet-conditionformat-dialog .box .fa-table:hover {\r\n    color: #ff7e7e;\r\n}\r\n\r\n#luckysheet-conditionformat-dialog .box #daterange-btn {\r\n    width: 188px;\r\n    height: 28px;\r\n    padding: 0 5px;\r\n    line-height: 28px;\r\n    border: 1px solid #d4d4d4;\r\n    cursor: pointer;\r\n}\r\n\r\n#luckysheet-conditionformat-dialog .box .selectbox {\r\n    width: 150px;\r\n    height: 30px;\r\n}\r\n\r\n#luckysheet-icon-dataBar-menuButton .bgImgBox {\r\n    width: 28px;\r\n    height: 26px;\r\n    background: url(../plugins/images/CFdataBar.png) no-repeat;\r\n}\r\n\r\n#luckysheet-icon-colorGradation-menuButton .bgImgBox {\r\n    width: 28px;\r\n    height: 26px;\r\n    background: url(../plugins/images/CFcolorGradation.png) no-repeat;\r\n}\r\n\r\n/*条件格式规则管理器*/\r\n#luckysheet-administerRule-dialog {\r\n    font-size: 12px;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .chooseSheet {\r\n    height: 24px;\r\n    line-height: 24px;\r\n    margin-bottom: 5px;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .chooseSheet select {\r\n    height: 24px;\r\n    padding: 0 5px;\r\n    box-sizing: border-box;\r\n    font-size: 12px;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox {\r\n    border: 1px solid #d4d4d4;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleBtn {\r\n    padding: 2.5px 5px;\r\n    border-bottom: 1px solid #d4d4d4;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleBtn button {\r\n    margin-right: 10px;\r\n    font-size: 12px;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listTitle {\r\n    height: 30px;\r\n    padding: 0 10px;\r\n    border-bottom: 1px solid #d4d4d4;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listTitle span {\r\n    display: block;\r\n    height: 100%;\r\n    line-height: 29px;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listTitle span:nth-of-type(1) {\r\n    width: 30%;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listTitle span:nth-of-type(2) {\r\n    width: 20%;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listTitle span:nth-of-type(3) {\r\n    width: 45%;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox {\r\n    height: 150px;\r\n    overflow-y: scroll;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item {\r\n    height: 24px;\r\n    padding: 2.5px 10px;\r\n    border-bottom: 1px solid #d4d4d4;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item.on {\r\n    background-color: #8c89fe;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .ruleName {\r\n    width: 30%;\r\n    height: 100%;\r\n    line-height: 24px;\r\n    padding-right: 10px;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n    float: left;\r\n    box-sizing: border-box;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item.on .ruleName {\r\n    color: #fff;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .format {\r\n    width: 20%;\r\n    height: 100%;\r\n    line-height: 24px;\r\n    float: left;\r\n    position: relative;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .format .colorbox {\r\n    display: inline-block;\r\n    width: 16px;\r\n    height: 16px;\r\n    border: solid 1px #d0d0d0;\r\n    margin: 3px 5px;\r\n    cursor: pointer;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .ruleRange {\r\n    width: 45%;\r\n    height: 100%;\r\n    border: 1px solid #d4d4d4;\r\n    float: left;\r\n    margin-left: 10px;\r\n    box-sizing: border-box;\r\n    background-color: #fff;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .ruleRange input {\r\n    width: 130px;\r\n    height: 22px;\r\n    padding: 0 5px;\r\n    border: none;\r\n    outline-style: none;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .ruleRange i.fa-table {\r\n    float: right;\r\n    cursor: pointer;\r\n    color: #6598f3;\r\n    margin-top: 6px;\r\n    margin-right: 5px;\r\n}\r\n\r\n#luckysheet-administerRule-dialog .ruleBox .ruleList .listBox .item .ruleRange i.fa-table:hover {\r\n    color: #ff7e7e;\r\n}\r\n\r\n/*新建、编辑条件格式规则*/\r\n.luckysheet-newEditorRule-dialog {\r\n    font-size: 12px;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .boxTitle {\r\n    margin-bottom: 5px;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .ruleTypeBox {\r\n    border: 1px solid #d4d4d4;\r\n    margin-bottom: 10px;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .ruleTypeBox .ruleTypeItem {\r\n    padding: 3px 5px;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .ruleTypeBox .ruleTypeItem.on {\r\n    background-color: #7c79fe;\r\n    color: #fff;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .ruleTypeBox .ruleTypeItem .icon {\r\n    font-family: Arial, Helvetica, sans-serif;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .ruleExplainBox {\r\n    border: 1px solid #d4d4d4;\r\n    padding: 10px;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .ruleExplainBox .title {\r\n    display: block;\r\n    font-weight: 600;\r\n    margin-bottom: 5px;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .ruleExplainBox select {\r\n    height: 30px;\r\n    font-size: 12px;\r\n    float: left;\r\n    margin-right: 5px;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .ruleExplainBox .inpbox {\r\n    width: 100px;\r\n    height: 30px;\r\n    border: 1px solid #d4d4d4;\r\n    box-sizing: border-box;\r\n    font-size: 12px;\r\n    float: left;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .ruleExplainBox .inpbox input {\r\n    width: 70px;\r\n    height: 100%;\r\n    border: none;\r\n    outline-style: none;\r\n    padding: 0 5px;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .ruleExplainBox .txt {\r\n    display: block;\r\n    height: 100%;\r\n    line-height: 30px;\r\n    float: left;\r\n    margin: 0 5px;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .ruleExplainBox #isPercent {\r\n    float: left;\r\n    margin: 9px 0 8px 10px;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog i.fa-table {\r\n    float: right;\r\n    margin-top: 8px;\r\n    margin-right: 5px;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .fa-table {\r\n    cursor: pointer;\r\n    color: #6598f3;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .fa-table:hover {\r\n    color: #ff7e7e;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .iconsBox {\r\n    height: 30px;\r\n    margin-bottom: 5px;\r\n    position: relative;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .iconsBox label {\r\n    display: block;\r\n    width: 80px;\r\n    height: 30px;\r\n    line-height: 30px;\r\n    float: left;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .iconsBox .showbox {\r\n    width: 150px;\r\n    height: 20px;\r\n    padding: 4px 4px 4px 10px;\r\n    border: 1px solid #e5e5e5;\r\n    background-color: #f5f5f5;\r\n    float: left;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .iconsBox .showbox .model {\r\n    width: 125px;\r\n    height: 20px;\r\n    background: url(../plugins/images/CFicons.png) no-repeat;\r\n    background-size: 256px;\r\n    float: left;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .iconsBox ul {\r\n    display: none;\r\n    width: 164px;\r\n    max-height: 150px;\r\n    overflow-y: auto;\r\n    background-color: #fff;\r\n    border: 1px solid #e5e5e5;\r\n    position: absolute;\r\n    left: 80px;\r\n    top: 30px;\r\n    list-style: none;\r\n    margin: 0;\r\n    padding: 0;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .iconsBox ul li {\r\n    padding: 5px 10px;\r\n    background-color: #fff;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .iconsBox ul li:hover {\r\n    background-color: #dfdfdf;\r\n}\r\n\r\n.luckysheet-newEditorRule-dialog .iconsBox ul li div {\r\n    width: 125px;\r\n    height: 20px;\r\n    background: url(../plugins/images/CFicons.png) no-repeat;\r\n    background-size: 256px;\r\n}\r\n\r\n/*条件格式 图标集弹框*/\r\n#luckysheet-CFicons-dialog .box {\r\n    padding: 10px;\r\n    border: 1px solid #dfdfdf;\r\n    font-size: 14px;\r\n}\r\n\r\n#luckysheet-CFicons-dialog .box .title {\r\n    height: 20px;\r\n    line-height: 20px;\r\n    padding: 0 10px;\r\n    background-color: #ebebeb;\r\n}\r\n\r\n#luckysheet-CFicons-dialog .box .list {\r\n    width: 300px;\r\n    padding: 5px 0;\r\n}\r\n\r\n#luckysheet-CFicons-dialog .box .list .left {\r\n    width: 50%;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-CFicons-dialog .box .list .right {\r\n    width: 50%;\r\n    float: right;\r\n}\r\n\r\n#luckysheet-CFicons-dialog .box .list .item {\r\n    width: 125px;\r\n    height: 20px;\r\n    padding: 2.5px 10px;\r\n    background-color: #fff;\r\n    cursor: pointer;\r\n}\r\n\r\n#luckysheet-CFicons-dialog .box .list .item:hover {\r\n    background-color: #dfdfdf;\r\n}\r\n\r\n#luckysheet-CFicons-dialog .box .list .item div {\r\n    width: 125px;\r\n    height: 20px;\r\n    background: url(../plugins/images/CFicons.png) no-repeat;\r\n    background-size: 256px;\r\n}\r\n\r\n/*交替颜色*/\r\n#luckysheet-modal-dialog-slider-alternateformat {\r\n    width: 280px;\r\n    font-size: 12px;\r\n}\r\n\r\n#luckysheet-modal-dialog-slider-alternateformat .luckysheet-modal-dialog-slider-content {\r\n    background-color: #fff;\r\n    overflow-y: scroll;\r\n}\r\n\r\n#luckysheet-modal-dialog-slider-alternateformat .textTitle {\r\n    padding: 5px 10px;\r\n    font-weight: 600;\r\n}\r\n\r\n#luckysheet-alternateformat-range {\r\n    width: 198px;\r\n    height: 28px;\r\n    border: 1px solid #d4d4d4;\r\n    margin-left: 10px;\r\n}\r\n\r\n#luckysheet-alternateformat-range input {\r\n    width: 150px;\r\n    height: 28px;\r\n    padding: 0 10px;\r\n    border: none;\r\n    outline-style: none;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-alternateformat-range .fa-table {\r\n    float: right;\r\n    margin-top: 8px;\r\n    margin-right: 5px;\r\n    cursor: pointer;\r\n    color: #6598f3;\r\n}\r\n\r\n#luckysheet-alternateformat-range .fa-table:hover {\r\n    color: #ff7e7e;\r\n}\r\n\r\n#luckysheet-alternateformat-checkbox {\r\n    padding: 5px 10px;\r\n    border-top: 1px solid #d4d4d4;\r\n    border-bottom: 1px solid #d4d4d4;\r\n    margin: 10px 0;\r\n}\r\n\r\n#luckysheet-alternateformat-checkbox div {\r\n    height: 20px;\r\n    line-height: 20px;\r\n}\r\n\r\n#luckysheet-alternateformat-checkbox div:first-child {\r\n    margin-bottom: 5px;\r\n}\r\n\r\n#luckysheet-alternateformat-checkbox input[type=\"checkbox\"] {\r\n    float: left;\r\n    cursor: pointer;\r\n    margin-top: 4px;\r\n}\r\n\r\n#luckysheet-alternateformat-modelList {\r\n    padding: 0 10px;\r\n    margin-bottom: 10px;\r\n}\r\n\r\n#luckysheet-alternateformat-modelCustom {\r\n    padding: 0 10px;\r\n    margin-bottom: 10px;\r\n}\r\n\r\n#luckysheet-modal-dialog-slider-alternateformat .modelbox {\r\n    display: inline-block;\r\n    width: 36px;\r\n    padding: 2px;\r\n    border: 2px solid #fff;\r\n    box-sizing: border-box;\r\n    margin-right: 4px;\r\n    margin-bottom: 4px;\r\n    cursor: pointer;\r\n}\r\n\r\n#luckysheet-modal-dialog-slider-alternateformat .modelbox.on {\r\n    border-color: #726efe;\r\n}\r\n\r\n#luckysheet-modal-dialog-slider-alternateformat .modelbox .box {\r\n    width: 100%;\r\n    border: 1px solid #d4d4d4;\r\n    box-sizing: border-box;\r\n}\r\n\r\n#luckysheet-modal-dialog-slider-alternateformat .modelbox .box span {\r\n    display: block;\r\n    width: 100%;\r\n    height: 10px;\r\n    line-height: 9px;\r\n    text-align: center;\r\n    border-bottom: 1px solid #d4d4d4;\r\n    box-sizing: border-box;\r\n}\r\n\r\n#luckysheet-modal-dialog-slider-alternateformat .modelbox .box span:last-child {\r\n    line-height: 10px;\r\n    border-bottom: none;\r\n}\r\n\r\n#luckysheet-alternateformat-modelToning {\r\n    padding: 10px;\r\n}\r\n\r\n#luckysheet-alternateformat-modelToning .toningbox {\r\n    height: 25px;\r\n    margin-bottom: 5px;\r\n}\r\n\r\n#luckysheet-alternateformat-modelToning .toningbox .toningShow {\r\n    width: 150px;\r\n    height: 100%;\r\n    line-height: 23px;\r\n    text-align: center;\r\n    border: 1px solid #d4d4d4;\r\n    float: left;\r\n    margin-right: 10px;\r\n}\r\n\r\n#luckysheet-alternateformat-modelToning .toningbox .luckysheet-color-menu-button-indicator {\r\n    width: 20px;\r\n    float: left;\r\n    user-select: none;\r\n    cursor: pointer;\r\n}\r\n\r\n#luckysheet-alternateformat-modelToning .toningbox .luckysheet-color-menu-button-indicator .luckysheet-icon {\r\n    user-select: none;\r\n    margin-bottom: -6px;\r\n}\r\n\r\n#luckysheet-alternateformat-colorSelect-dialog .currenColor {\r\n    font-size: 12px;\r\n    margin-bottom: 5px;\r\n}\r\n\r\n#luckysheet-alternateformat-colorSelect-dialog .currenColor span {\r\n    display: inline-block;\r\n    width: 16px;\r\n    height: 16px;\r\n    border: solid 1px #d0d0d0;\r\n    margin-left: 5px;\r\n    margin-bottom: -5px;\r\n    cursor: pointer;\r\n}\r\n\r\n#luckysheet-alternateformat-rangeDialog input {\r\n    border: 1px solid #d4d4d4;\r\n    padding: 0 10px;\r\n    height: 30px;\r\n}\r\n\r\n/*if公式生成器*/\r\n#luckysheet-ifFormulaGenerator-dialog {\r\n    font-size: 12px;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox {\r\n    height: 30px;\r\n    margin-bottom: 10px;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox label {\r\n    display: block;\r\n    width: 100px;\r\n    height: 100%;\r\n    line-height: 30px;\r\n    padding: 0 5px;\r\n    text-align: right;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox .inpBox {\r\n    width: 150px;\r\n    height: 100%;\r\n    padding: 0 10px;\r\n    border: 1px solid #d4d4d4;\r\n    box-sizing: border-box;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox .inpBox input {\r\n    width: 100px;\r\n    height: 100%;\r\n    padding: 0;\r\n    border: none;\r\n    outline-style: none;\r\n    background: transparent;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox .inpBox i.fa-table {\r\n    font-size: 14px;\r\n    color: #6598f3;\r\n    float: right;\r\n    margin-right: 0;\r\n    margin-top: 8px;\r\n    cursor: pointer;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox .inpBox i.fa-table:hover {\r\n    color: #ff7e7e;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifAttr .attrBox span.text {\r\n    height: 100%;\r\n    line-height: 30px;\r\n    padding: 0 5px;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog #smallRange,\r\n#luckysheet-ifFormulaGenerator-dialog #largeRange {\r\n    width: 100px;\r\n    height: 100%;\r\n    padding: 0 10px;\r\n    border: 1px solid #d4d4d4;\r\n    box-sizing: border-box;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog #rangeAssess {\r\n    height: 100%;\r\n    line-height: 30px;\r\n    float: left;\r\n    margin-left: 20px;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog #rangeAssess i.fa-table {\r\n    color: #6598f3;\r\n    cursor: pointer;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog #rangeAssess i.fa-table:hover {\r\n    color: #ff7e7e;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog #DivisionMethod {\r\n    width: 100px;\r\n    height: 100%;\r\n    border: 1px solid #d4d4d4;\r\n    box-sizing: border-box;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog #DivisionMethodVal {\r\n    width: 120px;\r\n    height: 100%;\r\n    border: 1px solid #d4d4d4;\r\n    padding: 0 10px;\r\n    box-sizing: border-box;\r\n    float: left;\r\n    margin-left: 10px;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog #createBtn {\r\n    width: 100px;\r\n    height: 100%;\r\n    line-height: 30px;\r\n    border-radius: 5px;\r\n    text-align: center;\r\n    font-size: 14px;\r\n    color: #fff;\r\n    background-color: #8c89fe;\r\n    float: right;\r\n    cursor: pointer;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifList {\r\n    border-top: 1px solid #d4d4d4;\r\n    height: 180px;\r\n    padding: 10px;\r\n    overflow-y: scroll;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifList .item {\r\n    height: 30px;\r\n    margin-bottom: 10px;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifList .item input {\r\n    width: 80px;\r\n    height: 100%;\r\n    border: 1px solid #d4d4d4;\r\n    padding: 0 5px;\r\n    background: transparent;\r\n    box-sizing: border-box;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifList .item input.markText {\r\n    width: 140px;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifList .item select {\r\n    width: 50px;\r\n    height: 100%;\r\n    padding: 0 5px;\r\n    border: 1px solid #d4d4d4;\r\n    box-sizing: border-box;\r\n    float: left;\r\n    margin: 0 10px;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifList .item span {\r\n    height: 100%;\r\n    line-height: 30px;\r\n    float: left;\r\n    margin: 0 10px;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifList .item i.fa-remove {\r\n    font-size: 16px;\r\n    float: left;\r\n    margin-left: 15px;\r\n    margin-top: 7px;\r\n    color: #d6d6d6;\r\n    cursor: pointer;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-dialog .ifList .item i.fa-remove:hover {\r\n    color: #333;\r\n}\r\n\r\n#luckysheet-ifFormulaGenerator-singleRange-dialog input,\r\n#luckysheet-ifFormulaGenerator-multiRange-dialog input {\r\n    border: 1px solid #d4d4d4;\r\n    padding: 0 10px;\r\n    height: 30px;\r\n}\r\n\r\n.pictorialBarUploadImg:hover {\r\n    border: 1px solid #ccc !important;\r\n    background: #efefef;\r\n}\r\n\r\n/*下拉图标*/\r\n#luckysheet-dropCell-icon #icon_dropCell {\r\n    width: 25px;\r\n    height: 15px;\r\n    background-image: url(../plugins/images/icon_dropCell.png);\r\n    background-repeat: no-repeat;\r\n    background-position: center;\r\n    background-size: 100% 100%;\r\n}\r\n\r\n/*定位*/\r\n#luckysheet-locationCell-dialog .listbox {\r\n    border: 1px solid #dfdfdf;\r\n    padding: 10px;\r\n    font-size: 14px;\r\n    color: #000;\r\n}\r\n\r\n#luckysheet-locationCell-dialog .listbox .listItem {\r\n    padding: 5px 0;\r\n}\r\n\r\n#luckysheet-locationCell-dialog .listbox .listItem input[type=\"radio\"] {\r\n    float: left;\r\n    margin-top: 5px;\r\n}\r\n\r\n#luckysheet-locationCell-dialog .listbox .listItem .subbox {\r\n    height: 30px;\r\n    padding: 0 10px;\r\n}\r\n\r\n#luckysheet-locationCell-dialog .listbox .listItem .subbox .subItem {\r\n    float: left;\r\n    margin-right: 5px;\r\n}\r\n\r\n/*更多格式*/\r\n#luckysheet-moreFormat-dialog {\r\n    font-size: 14px;\r\n    color: #000;\r\n}\r\n\r\n#luckysheet-moreFormat-dialog .decimal {\r\n    margin-bottom: 5px;\r\n    height: 30px;\r\n    line-height: 30px;\r\n}\r\n\r\n#luckysheet-moreFormat-dialog .decimal input {\r\n    width: 80px;\r\n    height: 24px;\r\n    padding: 0 5px;\r\n}\r\n\r\n#luckysheet-moreFormat-dialog .listbox {\r\n    border: 1px solid #666;\r\n    height: 240px;\r\n    overflow-y: auto;\r\n}\r\n\r\n#luckysheet-moreFormat-dialog .listbox .listItem {\r\n    height: 30px;\r\n    padding: 0 20px 0 10px;\r\n    border-bottom: 1px solid #dfdfdf;\r\n}\r\n\r\n#luckysheet-moreFormat-dialog .listbox .listItem.on {\r\n    background-color: #7c79fe;\r\n    color: #fff;\r\n}\r\n\r\n#luckysheet-moreFormat-dialog .listbox .listItem .name {\r\n    line-height: 29px;\r\n    float: left;\r\n}\r\n\r\n#luckysheet-moreFormat-dialog .listbox .listItem .value {\r\n    line-height: 30px;\r\n    float: right;\r\n    color: gray;\r\n}\r\n\r\n#luckysheet-moreFormat-dialog .listbox .listItem.on .value {\r\n    color: #fff;\r\n}\r\n\r\n/*分列*/\r\n#luckysheet-splitColumn-dialog {\r\n    -webkit-user-select: none;\r\n    -moz-user-select: none;\r\n    -ms-user-select: none;\r\n    user-select: none;\r\n}\r\n\r\n#luckysheet-splitColumn-dialog .box {\r\n    font-size: 14px;\r\n}\r\n\r\n#luckysheet-splitColumn-dialog .box .boxTitle {\r\n    padding: 5px;\r\n}\r\n\r\n#luckysheet-splitColumn-dialog .box .boxMain {\r\n    padding: 5px;\r\n    border: 1px solid #dfdfdf;\r\n}\r\n\r\n#luckysheet-splitColumn-dialog .box input[type=\"checkbox\"] {\r\n    float: left;\r\n    margin-top: 5px;\r\n}\r\n\r\n#luckysheet-splitColumn-dialog .box .boxMain input[type=\"text\"] {\r\n    margin-left: 5px;\r\n    width: 50px;\r\n    padding: 0 5px;\r\n}\r\n\r\n#luckysheet-splitColumn-dialog .box #splitColumnData {\r\n    height: 100px;\r\n    overflow-y: auto;\r\n}\r\n\r\n#luckysheet-splitColumn-dialog .box #splitColumnData table {\r\n    border-collapse: collapse;\r\n}\r\n\r\n#luckysheet-splitColumn-dialog .box #splitColumnData td {\r\n    border: 1px solid #333;\r\n}\r\n\r\n/*图表设置最下方下拉框优化*/\r\n.luckysheet-datavisual-config .luckysheet-datavisual-accordion-content:last-child {\r\n    padding-bottom: 100px;\r\n}\r\n\r\n/*批注聚焦框 移动 改变大小*/\r\n.luckysheet-postil-dialog-move {\r\n    position: absolute;\r\n    margin: 0px;\r\n    padding: 0px;\r\n    top: 0;\r\n    left: 0;\r\n    bottom: 0;\r\n    right: 0;\r\n    pointer-events: none;\r\n}\r\n\r\n.luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item {\r\n    /*background: #000;*/\r\n    position: absolute;\r\n    pointer-events: all;\r\n    cursor: move;\r\n}\r\n\r\n.luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item-t {\r\n    width: 100%;\r\n    height: 3px;\r\n    border-bottom: 1px solid #000;\r\n    left: 0;\r\n    top: -4px;\r\n}\r\n\r\n.luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item-r {\r\n    width: 3px;\r\n    height: 100%;\r\n    border-left: 1px solid #000;\r\n    right: -4px;\r\n    top: 0;\r\n}\r\n\r\n.luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item-b {\r\n    width: 100%;\r\n    height: 3px;\r\n    border-top: 1px solid #000;\r\n    left: 0;\r\n    bottom: -4px;\r\n}\r\n\r\n.luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item-l {\r\n    width: 3px;\r\n    height: 100%;\r\n    border-right: 1px solid #000;\r\n    left: -4px;\r\n    top: 0;\r\n}\r\n\r\n.luckysheet-postil-show-active .luckysheet-postil-dialog-move .luckysheet-postil-dialog-move-item {\r\n    border-color: #0188fb;\r\n}\r\n\r\n.luckysheet-postil-dialog-resize {\r\n    position: absolute;\r\n    margin: 0px;\r\n    padding: 0px;\r\n    top: -2px;\r\n    left: -2px;\r\n    bottom: -2px;\r\n    right: -2px;\r\n    pointer-events: none;\r\n}\r\n\r\n.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item {\r\n    position: absolute;\r\n    height: 6px;\r\n    width: 6px;\r\n    border: 1px solid #0188fb;\r\n    pointer-events: all;\r\n}\r\n\r\n.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-lt {\r\n    left: -6px;\r\n    top: -6px;\r\n    cursor: se-resize;\r\n}\r\n\r\n.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-mt {\r\n    left: 50%;\r\n    top: -6px;\r\n    margin-left: -4px;\r\n    cursor: s-resize;\r\n}\r\n\r\n.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-lm {\r\n    top: 50%;\r\n    left: -6px;\r\n    margin-top: -4px;\r\n    cursor: w-resize;\r\n}\r\n\r\n.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-rm {\r\n    top: 50%;\r\n    right: -6px;\r\n    margin-top: -4px;\r\n    cursor: w-resize;\r\n}\r\n\r\n.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-rt {\r\n    right: -6px;\r\n    top: -6px;\r\n    cursor: ne-resize;\r\n}\r\n\r\n.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-lb {\r\n    left: -6px;\r\n    bottom: -6px;\r\n    cursor: ne-resize;\r\n}\r\n\r\n.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-mb {\r\n    left: 50%;\r\n    bottom: -6px;\r\n    margin-left: -4px;\r\n    cursor: s-resize;\r\n}\r\n\r\n.luckysheet-postil-dialog-resize .luckysheet-postil-dialog-resize-item-rb {\r\n    right: -6px;\r\n    bottom: -6px;\r\n    cursor: se-resize;\r\n}\r\n\r\n/*图表设置最下方下拉框优化*/\r\n.luckysheet-datavisual-config .luckysheet-datavisual-accordion-content:last-child {\r\n    padding-bottom: 100px;\r\n}\r\n\r\n/*图表样式新增样式: 设置界面overflow滚动*/\r\n.luckysheet-datavisual-left .el-tabs__content {\r\n    overflow: auto;\r\n}\r\n\r\n/* .luckysheet-modal-dialog {\r\n    -webkit-box-shadow: 0 4px 16px rgba(0, 0, 0, .2);\r\n    -moz-box-shadow: 0 4px 16px rgba(0, 0, 0, .2);\r\n    box-shadow: 0 4px 16px rgba(0, 0, 0, .2);\r\n    background: #fff;\r\n    background-clip: padding-box;\r\n    border: 1px solid #acacac;\r\n    border: 1px solid rgba(0, 0, 0, .333);\r\n    outline: 0;\r\n    position: absolute;\r\n    color: #000;\r\n    padding: 30px 42px;\r\n    z-index: 100002;\r\n}\r\n\r\n.luckysheet-modal-dialog-mask {\r\n    position: absolute;\r\n    height: 100%;\r\n    width: 100%;\r\n    background: #fff;\r\n    opacity: 0.6;\r\n    display: none;\r\n    left: 0px;\r\n    top: 0px;\r\n    z-index: 1010;\r\n}\r\n\r\n\r\n\r\n.luckysheet-modal-dialog-title {\r\n    background-color: #fff;\r\n    color: #000;\r\n    cursor: default;\r\n    font-size: 16px;\r\n    font-weight: normal;\r\n    line-height: 24px;\r\n    margin: 0 0 16px;\r\n}\r\n\r\n.luckysheet-modal-dialog-title-close {\r\n    height: 11px;\r\n    opacity: 0.7;\r\n    padding: 17px;\r\n    position: absolute;\r\n    right: 0px;\r\n    top: 0px;\r\n    width: 11px;\r\n    color: #d4d4d4;\r\n    outline: 0;\r\n}\r\n\r\n.luckysheet-modal-dialog-chart {\r\n    padding: 20px 10px;\r\n    webkit-box-shadow: none;\r\n    -moz-box-shadow: none;\r\n    box-shadow: none;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize {\r\n    position: absolute;\r\n    border: 2px solid #85c0fc;\r\n    margin: 0px;\r\n    padding: 0px;\r\n    top: -2px;\r\n    left: -2px;\r\n    bottom: -2px;\r\n    right: -2px;\r\n    pointer-events: none;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item {\r\n    position: absolute;\r\n    height: 6px;\r\n    width: 6px;\r\n    background: #ffffff;\r\n    border: 2px solid #85c0fc;\r\n    pointer-events: all;\r\n    border-radius: 6px;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-lt {\r\n    left: -6px;\r\n    top: -6px;\r\n    cursor: se-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-mt {\r\n    left: 50%;\r\n    top: -6px;\r\n    margin-left: -4px;\r\n    cursor: s-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-rt {\r\n    right: -6px;\r\n    top: -6px;\r\n    cursor: ne-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-lm {\r\n    top: 50%;\r\n    left: -6px;\r\n    margin-top: -4px;\r\n    cursor: w-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-rm {\r\n    top: 50%;\r\n    right: -6px;\r\n    margin-top: -4px;\r\n    cursor: w-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-lb {\r\n    left: -6px;\r\n    bottom: -6px;\r\n    cursor: ne-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-mb {\r\n    left: 50%;\r\n    bottom: -6px;\r\n    margin-left: -4px;\r\n    cursor: s-resize;\r\n}\r\n\r\n.luckysheet-modal-dialog-resize-item-rb {\r\n    right: -6px;\r\n    bottom: -6px;\r\n    cursor: se-resize;\r\n}\r\n\r\n\r\n.luckysheet-modal-dialog-controll {\r\n    position: absolute;\r\n    margin: 0px;\r\n    padding: 0px;\r\n    right: -35px;\r\n    font-size: 14px;\r\n    top: 0px;\r\n}\r\n\r\n.luckysheet-modal-controll-btn {\r\n    height: 13px;\r\n    padding: 8px;\r\n    width: 13px;\r\n    color: #d4d4d4;\r\n    outline: 0;\r\n    border: 1px solid #B6B6B6;\r\n    display: block;\r\n    background: #fff;\r\n    margin-bottom: 3px;\r\n    cursor: pointer;\r\n    transition: all 0.2s;\r\n    -moz-transition: all 0.2s;\r\n    -webkit-transition: all 0.2s;\r\n    -o-transition: all 0.2s;\r\n}\r\n\r\n.luckysheet-modal-controll-btn:hover {\r\n    border: 1px solid #A1A1A1;\r\n    color: #85c0fc;\r\n}\r\n\r\n.luckysheet-modal-controll-btn:active {\r\n    border: 1px solid #BBBBBB;\r\n    background: #EFEFEF;\r\n    color: #85c0fc;\r\n}\r\n\r\n.luckysheet-modal-controll-del {\r\n    font-size: 16px;\r\n}\r\n\r\n.luckysheet-modal-controll-max-close {\r\n    font-size: 22px;\r\n    width: 42px;\r\n    height: 42px;\r\n    line-height: 42px;\r\n    background: #383838;\r\n    opacity: 0.7;\r\n    -moz-border-radius: 20px;\r\n    -webkit-border-radius: 20px;\r\n    border-radius: 20px;\r\n    color: #fff;\r\n    position: absolute;\r\n    right: 0px;\r\n    top: 0px;\r\n    z-index: 100000;\r\n    text-align: center;\r\n}\r\n\r\n.luckysheet-modal-controll-max-close:hover {\r\n    background: #85c0fc;\r\n    cursor: pointer;\r\n} */\r\n\r\n/* 图片 */\r\n#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content {\r\n    width: 100%;\r\n    height: 100%;\r\n    position: absolute;\r\n    left: 0;\r\n    top: 0;\r\n    cursor: move;\r\n    image-rendering: -moz-crisp-edges; /* Firefox */\r\n    image-rendering: -o-crisp-edges; /* Opera */\r\n    image-rendering: -webkit-optimize-contrast; /*Webkit (non-standard naming) */\r\n    image-rendering: crisp-edges;\r\n}\r\n\r\n#luckysheet-modal-dialog-cropping::before {\r\n    content: \"\";\r\n    outline: 1px solid #fff;\r\n    position: absolute;\r\n    left: 33.3%;\r\n    right: 33.3%;\r\n    top: 0;\r\n    bottom: 0;\r\n    z-index: 1;\r\n    pointer-events: none;\r\n}\r\n#luckysheet-modal-dialog-cropping::after {\r\n    content: \"\";\r\n    outline: 1px solid #fff;\r\n    position: absolute;\r\n    left: 0;\r\n    right: 0;\r\n    top: 33.3%;\r\n    bottom: 33.3%;\r\n    z-index: 1;\r\n    pointer-events: none;\r\n}\r\n#luckysheet-modal-dialog-cropping .cropping-mask {\r\n    filter: brightness(0.5);\r\n    position: absolute;\r\n    background-size: 100% 100%;\r\n    left: 0;\r\n    top: 0;\r\n}\r\n#luckysheet-modal-dialog-cropping .cropping-content {\r\n    position: absolute;\r\n    overflow: hidden;\r\n    background-position: 0 0;\r\n    left: 0;\r\n    top: 0;\r\n    width: 100%;\r\n    height: 100%;\r\n}\r\n#luckysheet-modal-dialog-cropping .luckysheet-modal-dialog-resize {\r\n    border: none;\r\n    position: absolute;\r\n    margin: 0px;\r\n    padding: 0px;\r\n    top: 0;\r\n    left: 0;\r\n    bottom: 0;\r\n    right: 0;\r\n    pointer-events: all;\r\n}\r\n#luckysheet-modal-dialog-cropping .resize-item {\r\n    width: 0;\r\n    height: 0;\r\n    background: none;\r\n    border: none;\r\n    position: absolute;\r\n    z-index: 3;\r\n}\r\n#luckysheet-modal-dialog-cropping .resize-item::before {\r\n    content: \"\";\r\n    display: block;\r\n    position: absolute;\r\n    background: #000;\r\n}\r\n#luckysheet-modal-dialog-cropping .resize-item::after {\r\n    content: \"\";\r\n    display: block;\r\n    position: absolute;\r\n    background: #000;\r\n}\r\n#luckysheet-modal-dialog-cropping .lt {\r\n    left: 0;\r\n    top: 0;\r\n    cursor: nwse-resize;\r\n}\r\n#luckysheet-modal-dialog-cropping .lt::before {\r\n    width: 18px;\r\n    height: 4px;\r\n    left: 0;\r\n    top: 0;\r\n    border-right: 2px solid #fff;\r\n    border-bottom: 2px solid #fff;\r\n}\r\n#luckysheet-modal-dialog-cropping .lt::after {\r\n    width: 4px;\r\n    height: 14px;\r\n    left: 0;\r\n    top: 4px;\r\n    border-right: 2px solid #fff;\r\n    border-bottom: 2px solid #fff;\r\n}\r\n#luckysheet-modal-dialog-cropping .mt {\r\n    left: 50%;\r\n    top: 0;\r\n    cursor: ns-resize;\r\n}\r\n#luckysheet-modal-dialog-cropping .mt::before {\r\n    width: 18px;\r\n    height: 4px;\r\n    left: -11px;\r\n    top: 0;\r\n    border-left: 2px solid #fff;\r\n    border-right: 2px solid #fff;\r\n    border-bottom: 2px solid #fff;\r\n}\r\n#luckysheet-modal-dialog-cropping .rt {\r\n    right: 0;\r\n    top: 0;\r\n    cursor: nesw-resize;\r\n}\r\n#luckysheet-modal-dialog-cropping .rt::before {\r\n    width: 18px;\r\n    height: 4px;\r\n    right: 0;\r\n    top: 0;\r\n    border-left: 2px solid #fff;\r\n    border-bottom: 2px solid #fff;\r\n}\r\n#luckysheet-modal-dialog-cropping .rt::after {\r\n    width: 4px;\r\n    height: 14px;\r\n    right: 0;\r\n    top: 4px;\r\n    border-left: 2px solid #fff;\r\n    border-bottom: 2px solid #fff;\r\n}\r\n#luckysheet-modal-dialog-cropping .lm {\r\n    left: 0;\r\n    top: 50%;\r\n    cursor: ew-resize;\r\n}\r\n#luckysheet-modal-dialog-cropping .lm::before {\r\n    width: 4px;\r\n    height: 18px;\r\n    left: 0;\r\n    top: -11px;\r\n    border-right: 2px solid #fff;\r\n    border-top: 2px solid #fff;\r\n    border-bottom: 2px solid #fff;\r\n}\r\n#luckysheet-modal-dialog-cropping .rm {\r\n    right: 0;\r\n    top: 50%;\r\n    cursor: ew-resize;\r\n}\r\n#luckysheet-modal-dialog-cropping .rm::before {\r\n    width: 4px;\r\n    height: 18px;\r\n    right: 0;\r\n    top: -11px;\r\n    border-left: 2px solid #fff;\r\n    border-top: 2px solid #fff;\r\n    border-bottom: 2px solid #fff;\r\n}\r\n#luckysheet-modal-dialog-cropping .lb {\r\n    left: 0;\r\n    bottom: 0;\r\n    cursor: nesw-resize;\r\n}\r\n#luckysheet-modal-dialog-cropping .lb::before {\r\n    width: 18px;\r\n    height: 4px;\r\n    left: 0;\r\n    bottom: 0;\r\n    border-right: 2px solid #fff;\r\n    border-top: 2px solid #fff;\r\n}\r\n#luckysheet-modal-dialog-cropping .lb::after {\r\n    width: 4px;\r\n    height: 14px;\r\n    left: 0;\r\n    bottom: 4px;\r\n    border-right: 2px solid #fff;\r\n    border-top: 2px solid #fff;\r\n}\r\n#luckysheet-modal-dialog-cropping .rb {\r\n    right: 0;\r\n    bottom: 0;\r\n    cursor: nwse-resize;\r\n}\r\n#luckysheet-modal-dialog-cropping .rb::before {\r\n    width: 18px;\r\n    height: 4px;\r\n    right: 0;\r\n    bottom: 0;\r\n    border-left: 2px solid #fff;\r\n    border-top: 2px solid #fff;\r\n}\r\n#luckysheet-modal-dialog-cropping .rb::after {\r\n    width: 4px;\r\n    height: 14px;\r\n    right: 0;\r\n    bottom: 4px;\r\n    border-left: 2px solid #fff;\r\n    border-top: 2px solid #fff;\r\n}\r\n#luckysheet-modal-dialog-cropping .mb {\r\n    left: 50%;\r\n    bottom: 0;\r\n    cursor: ns-resize;\r\n}\r\n#luckysheet-modal-dialog-cropping .mb::before {\r\n    width: 18px;\r\n    height: 4px;\r\n    left: -11px;\r\n    bottom: 0;\r\n    border-left: 2px solid #fff;\r\n    border-right: 2px solid #fff;\r\n    border-top: 2px solid #fff;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .luckysheet-modal-dialog-slider-content {\r\n    background-color: #fff;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box {\r\n    border-bottom: 1px solid #e1e4e8;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .slider-box-title {\r\n    padding: 10px 20px;\r\n    font-weight: 600;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .slider-box-radios {\r\n    padding: 10px 30px;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .radio-item {\r\n    margin-bottom: 10px;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .radio-item:last-child {\r\n    margin-bottom: 0;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .radio-item input {\r\n    vertical-align: sub;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .slider-box-checkbox {\r\n    padding: 10px 30px;\r\n    border-top: 1px solid #e1e4e8;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .slider-box-checkbox input {\r\n    vertical-align: middle;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .slider-box-borderConfig {\r\n    padding: 10px 30px;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .border-item {\r\n    margin-bottom: 10px;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .border-item:last-child {\r\n    margin-bottom: 0;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .border-item label {\r\n    display: inline-block;\r\n    width: 40px;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .border-item input {\r\n    width: 130px;\r\n    padding: 5px;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .border-item .imgItemBorderColor {\r\n    display: inline-block;\r\n    width: 20px;\r\n    height: 20px;\r\n    padding: 2px;\r\n    border: 1px solid #e1e4e8;\r\n    vertical-align: middle;\r\n    cursor: pointer;\r\n}\r\n#luckysheet-modal-dialog-slider-imageCtrl .slider-box .border-item .imgItemBorderColor span {\r\n    display: block;\r\n    width: 100%;\r\n    height: 100%;\r\n}\r\n#luckysheet-imageCtrl-colorSelect-dialog .currenColor {\r\n    font-size: 12px;\r\n    margin-bottom: 5px;\r\n}\r\n#luckysheet-imageCtrl-colorSelect-dialog .currenColor span {\r\n    display: inline-block;\r\n    width: 16px;\r\n    height: 16px;\r\n    border: solid 1px #d0d0d0;\r\n    margin-left: 5px;\r\n    margin-bottom: -5px;\r\n    cursor: pointer;\r\n}\r\n#luckysheet-modal-dialog-activeImage,\r\n#luckysheet-modal-dialog-cropping {\r\n    background: none;\r\n    box-shadow: none;\r\n}\r\n\r\n.luckysheet-modal-dialog-image {\r\n    border: none;\r\n    box-shadow: none;\r\n    background: none;\r\n    box-shadow: none;\r\n    image-rendering: -moz-crisp-edges; /* Firefox */\r\n    image-rendering: -o-crisp-edges; /* Opera */\r\n    image-rendering: -webkit-optimize-contrast; /*Webkit (non-standard naming) */\r\n    image-rendering: crisp-edges;\r\n}\r\n\r\n.luckysheet-modal-dialog-image .luckysheet-modal-dialog-content,\r\n#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content {\r\n    background: none;\r\n}\r\n/* 单元格日期选择 */\r\n.cell-date-picker {\r\n    position: absolute;\r\n    display: none;\r\n}\r\n/* 插入链接 */\r\n#luckysheet-insertLink-dialog {\r\n    user-select: none;\r\n}\r\n#luckysheet-insertLink-dialog .box {\r\n    font-size: 12px;\r\n}\r\n#luckysheet-insertLink-dialog .box-item {\r\n    height: 30px;\r\n    line-height: 30px;\r\n    margin-bottom: 10px;\r\n}\r\n#luckysheet-insertLink-dialog .box-item label {\r\n    display: inline-block;\r\n    width: 90px;\r\n    text-align: right;\r\n    margin-right: 10px;\r\n}\r\n#luckysheet-insertLink-dialog .box-item input {\r\n    width: 200px;\r\n    height: 30px;\r\n    padding: 0 10px;\r\n    border: 1px solid #d4d4d4;\r\n    outline-style: none;\r\n    box-sizing: border-box;\r\n}\r\n#luckysheet-insertLink-dialog .box-item select {\r\n    width: 200px;\r\n    height: 30px;\r\n    padding: 0 5px;\r\n    border: 1px solid #d4d4d4;\r\n    outline-style: none;\r\n    box-sizing: border-box;\r\n}\r\n/* 数据验证 */\r\n#luckysheet-dataVerification-dialog {\r\n    user-select: none;\r\n}\r\n#luckysheet-dataVerification-dialog .box {\r\n    font-size: 12px;\r\n}\r\n#luckysheet-dataVerification-dialog .box select {\r\n    width: 100%;\r\n    height: 30px;\r\n    border-color: #d4d4d4;\r\n    outline-style: none;\r\n}\r\n#luckysheet-dataVerification-dialog .box input::-webkit-input-placeholder {\r\n    color: #d4d4d4;\r\n}\r\n#luckysheet-dataVerification-dialog .box input:-moz-placeholder {\r\n    color: #d4d4d4;\r\n}\r\n#luckysheet-dataVerification-dialog .box input::-moz-placeholder {\r\n    color: #d4d4d4;\r\n}\r\n#luckysheet-dataVerification-dialog .box input:-ms-input-placeholder {\r\n    color: #d4d4d4;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item {\r\n    padding: 10px;\r\n    border-bottom: 1px solid #e1e4e8;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .box-item-title {\r\n    font-size: 14px;\r\n    font-weight: 600;\r\n    margin-bottom: 10px;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .range {\r\n    width: 100%;\r\n    height: 30px;\r\n    border: 1px solid #d4d4d4;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .range input {\r\n    width: calc(100% - 30px);\r\n    height: 30px;\r\n    padding: 0 10px;\r\n    float: left;\r\n    border: none;\r\n    outline-style: none;\r\n    box-sizing: border-box;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .range i.fa-table {\r\n    float: right;\r\n    margin-top: 9px;\r\n    margin-right: 5px;\r\n    cursor: pointer;\r\n    color: #6598f3;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .multi {\r\n    margin-top: 10px;\r\n    line-height: 30px;\r\n    font-size: 12px;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .multi input {\r\n    vertical-align: text-top;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .show-box {\r\n    margin-top: 10px;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .check-box {\r\n    height: 30px;\r\n    line-height: 30px;\r\n    margin-bottom: 10px;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .check-box:last-child {\r\n    margin-bottom: 0;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .check-box input {\r\n    height: 30px;\r\n    padding: 0 10px;\r\n    border: 1px solid #d4d4d4;\r\n    box-sizing: border-box;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .check {\r\n    line-height: 30px;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .check input {\r\n    vertical-align: text-top;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .input {\r\n    height: 30px;\r\n    line-height: 30px;\r\n    margin-top: 10px;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .input input {\r\n    height: 30px;\r\n    padding: 4px 10px 4px 10px;\r\n    border: 1px solid #d4d4d4;\r\n    box-sizing: border-box;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .input1 input {\r\n    width: 150px;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .input2 input {\r\n    width: 100%;\r\n}\r\n#luckysheet-dataVerification-dialog .box-item .input span {\r\n    display: inline-block;\r\n    width: 30px;\r\n    text-align: center;\r\n}\r\n#luckysheet-dataVerification-dialog .data-verification-hint-text {\r\n    width: 100%;\r\n    height: 30px;\r\n    border: 1px solid #d4d4d4;\r\n    margin-top: 10px;\r\n}\r\n#luckysheet-dataVerification-dialog .data-verification-hint-text input {\r\n    display: block;\r\n    width: 100%;\r\n    height: 100%;\r\n    padding: 0 10px;\r\n    border: none;\r\n    outline-style: none;\r\n    box-sizing: border-box;\r\n}\r\n#luckysheet-dataVerification-dialog .show-box .show-box-item {\r\n    display: none;\r\n}\r\n#luckysheet-dataVerificationRange-dialog input {\r\n    height: 30px;\r\n    padding: 0 10px;\r\n    border: 1px solid #d4d4d4;\r\n    outline-style: none;\r\n}\r\n#luckysheet-dataVerification-dropdown-btn {\r\n    display: none;\r\n    width: 20px;\r\n    height: 20px;\r\n    background-color: #fff;\r\n    position: absolute;\r\n    z-index: 10;\r\n    overflow: hidden;\r\n}\r\n#luckysheet-formula-refresh {\r\n    display: none;\r\n    position: absolute;\r\n    z-index: 10;\r\n}\r\n#luckysheet-dataVerification-dropdown-btn::after {\r\n    content: \"\";\r\n    width: 10px;\r\n    height: 10px;\r\n    background: url(arrow-down.png) center no-repeat;\r\n    position: absolute;\r\n    left: 50%;\r\n    top: 50%;\r\n    margin-left: -5px;\r\n    margin-top: -5px;\r\n}\r\n#luckysheet-dataVerification-dropdown-List {\r\n    display: none;\r\n    background-color: #fff;\r\n    border: 1px solid #ccc;\r\n    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n    position: absolute;\r\n    z-index: 10000;\r\n    box-sizing: border-box;\r\n}\r\n#luckysheet-dataVerification-dropdown-List .dropdown-List-item {\r\n    padding: 5px 10px;\r\n    box-sizing: border-box;\r\n    cursor: pointer;\r\n}\r\n\r\n#luckysheet-dataVerification-dropdown-List .dropdown-List-item.multi {\r\n    padding-left: 0;\r\n}\r\n#luckysheet-dataVerification-dropdown-List .dropdown-List-item.multi:before {\r\n    content: \"\";\r\n    width: 14px;\r\n    font-family: \"iconfont\" !important;\r\n    font-size: 12px;\r\n    font-style: normal;\r\n    -webkit-font-smoothing: antialiased;\r\n    -moz-osx-font-smoothing: grayscale;\r\n    display: inline-block;\r\n    margin-right: 2px;\r\n}\r\n#luckysheet-dataVerification-dropdown-List .dropdown-List-item.multi.checked:before {\r\n    content: \"\\e7c8\";\r\n}\r\n#luckysheet-dataVerification-dropdown-List .dropdown-List-item:hover {\r\n    background-color: #e1e1e1;\r\n}\r\n#luckysheet-dataVerification-showHintBox {\r\n    display: none;\r\n    padding: 10px;\r\n    background-color: #fff;\r\n    border: 1px solid #ccc;\r\n    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n    position: absolute;\r\n    z-index: 1000;\r\n    user-select: none;\r\n    cursor: default;\r\n    white-space: nowrap;\r\n}\r\n\r\n#luckysheet-icon-undo.disabled,\r\n#luckysheet-icon-redo.disabled {\r\n    cursor: default;\r\n    opacity: 0.4;\r\n}\r\n"
  },
  {
    "path": "src/css/luckysheet-protection.css",
    "content": "\r\n#luckysheet-modal-dialog-slider-protection .luckysheet-modal-dialog-slider-content{\r\n    background: #fff;\r\n}\r\n\r\n.luckysheet-slider-protection-config{\r\n    position: absolute;\r\n    width: 100%;\r\n}\r\n\r\n.luckysheet-slider-protection-row{\r\n    position: relative;\r\n    width: 98%;\r\n    height: 35px;\r\n    left: 1%;\r\n}\r\n\r\n.luckysheet-slider-protection-column{\r\n    position: absolute;\r\n    height: 100%;\r\n}\r\n\r\n\r\n.luckysheet-slider-protection-config input, .luckysheet-slider-protection-config textarea, .luckysheet-protection-rangeItem-dialog input, .luckysheet-protection-rangeItem-dialog textarea, .luckysheet-protection-sheet-validation input{\r\n    border: 1px solid #d4d4d4;\r\n    outline: none;\r\n}\r\n\r\n.luckysheet-slider-protection-config input:focus, .luckysheet-slider-protection-config textarea:focus, .luckysheet-protection-rangeItem-dialog input:focus, .luckysheet-protection-rangeItem-dialog textarea:focus,.luckysheet-protection-sheet-validation input:focus{\r\n    border: 1px solid #0389FB;\r\n    outline: none;\r\n}\r\n\r\n.luckysheet-protection-input{\r\n    width: 100%;\r\n    height: 19px;\r\n    position: relative;\r\n}\r\n\r\n.luckysheet-protection-textarea{\r\n    width: 100%;\r\n    height: 47px;\r\n    position: relative;\r\n    resize:none;\r\n}\r\n\r\n.luckysheet-protection-column-2x{\r\n    width: 20%;\r\n}\r\n\r\n.luckysheet-protection-column-3x{\r\n    width: 30%;\r\n}\r\n\r\n.luckysheet-protection-column-4x{\r\n    width: 40%;\r\n}\r\n\r\n.luckysheet-protection-column-5x{\r\n    width: 50%;\r\n}\r\n\r\n.luckysheet-protection-column-6x{\r\n    width: 60%;\r\n}\r\n\r\n.luckysheet-protection-column-7x{\r\n    width: 70%;\r\n}\r\n\r\n.luckysheet-protection-column-8x{\r\n    width: 80%;\r\n}\r\n\r\n.luckysheet-protection-column-9x{\r\n    width: 90%;\r\n}\r\n\r\n.luckysheet-protection-column-10x{\r\n    width: 100%;\r\n}\r\n\r\n.luckysheet-protection-column-left{\r\n    text-align: left;\r\n}\r\n\r\n.luckysheet-protection-column-center{\r\n    text-align: center;\r\n}\r\n\r\n.luckysheet-protection-column-right{\r\n    text-align: right;\r\n}\r\n\r\n.luckysheet-slider-protection-ok{\r\n    position: absolute;\r\n    width: 100%;\r\n    height: 100%;\r\n    background: #0188fb;\r\n    color: #fff;\r\n    text-align: center;\r\n    line-height: 45px;\r\n    font-size: 16px;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-slider-protection-ok:hover{\r\n    background: #0181EE;\r\n}\r\n\r\n.luckysheet-slider-protection-ok:active{\r\n    background: #0074da;\r\n}\r\n\r\n.luckysheet-slider-protection-cancel{\r\n    position: absolute;\r\n    width: 100%;\r\n    height: 100%;\r\n    background: #e6e6e6;\r\n    color: #353535;\r\n    text-align: center;\r\n    line-height: 45px;\r\n    font-size: 16px;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-slider-protection-cancel:hover{\r\n    background: #d6d6d6;\r\n}\r\n\r\n.luckysheet-slider-protection-cancel:active{\r\n    background: #c7c7c7;\r\n}\r\n\r\n.luckysheet-slider-protection-addRange{\r\n    line-height: 23px;\r\n    font-size: 12px;\r\n    top: 2px;\r\n    height: 23px;\r\n}\r\n\r\n\r\n.luckysheet-protection-rangeItem{\r\n    position: relative;\r\n    width: 100%;\r\n    height: 30px;\r\n    line-height: 30px;\r\n    font-size: 12px;\r\n    overflow: hidden;\r\n}\r\n\r\n.luckysheet-protection-rangeItem:hover{\r\n    background: #D5D5D5;\r\n}\r\n\r\n.luckysheet-protection-rangeItem > div{\r\n    position: absolute;\r\n    height: 100%;\r\n    text-align: center;\r\n    overflow: hidden;\r\n}\r\n\r\n.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-del{\r\n    left: 5px;\r\n    top:5px;\r\n    height: 20px;\r\n    width: 20px;\r\n    font-size: 14px;\r\n    line-height: 20px;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-name{\r\n    left: 30px;\r\n    width: 80px;\r\n    text-align: left;\r\n}\r\n\r\n.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-range{\r\n    left: 110px;\r\n    width: 120px;\r\n}\r\n\r\n.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-update{\r\n    left: 230px;\r\n    width: 30px;\r\n    font-size: 14px;\r\n    top: 5px;\r\n    height: 20px;\r\n    width: 20px;\r\n    line-height: 20px;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-del:hover, .luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-update:hover{\r\n    background: #0181EE;\r\n    color: #fff;\r\n}\r\n\r\n.luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-del:active, .luckysheet-protection-rangeItem .luckysheet-protection-rangeItem-update:active{\r\n    background: #0074da;\r\n    color: #fff;\r\n}\r\n\r\n\r\n.luckysheet-protection-rangeItem-content{\r\n    position: relative;\r\n    width: 350px;\r\n    height: 270px;\r\n}\r\n\r\n\r\n#luckysheet-protection-rangeItem-dialog .luckysheet-slider-protection-column .range {\r\n    width: 100%;\r\n    height: 30px;\r\n    border: 1px solid #d4d4d4;\r\n}\r\n\r\n#luckysheet-protection-rangeItem-dialog .luckysheet-slider-protection-column .range input {\r\n    width: calc(100% - 30px);\r\n    height: 30px;\r\n    padding: 0 10px;\r\n    float: left;\r\n    border: none;\r\n    outline-style: none;\r\n    box-sizing: border-box;\r\n}\r\n\r\n#luckysheet-protection-rangeItem-dialog .luckysheet-slider-protection-column .range i.fa-table {\r\n    float: right;\r\n    margin-top: 9px;\r\n    margin-right: 5px;\r\n    cursor: pointer;\r\n    color: #6598F3;\r\n}\r\n\r\n.luckysheet-protection-rangeItemTextarea{\r\n    width: 100%;\r\n    height: 120px;\r\n    position: relative;\r\n    resize:none;\r\n}\r\n\r\n.luckysheet-protection-rangeItemiInput{\r\n    width: 100%;\r\n    height: 23px;\r\n    position: relative;\r\n}\r\n\r\n\r\n.luckysheet-protection-sheet-validation{\r\n    width: 390px;\r\n    height: 180px;\r\n    display: none;\r\n}"
  },
  {
    "path": "src/css/luckysheet-zoom.css",
    "content": ".luckysheet-zoom-content{\r\n    position: relative;\r\n    float: right;\r\n    width:210px;\r\n    /* right: 0px; */\r\n    height: 22px;\r\n    line-height: 22px;\r\n    text-align: right;\r\n    padding-right: 10px;\r\n    white-space: nowrap;\r\n    overflow: hidden;\r\n    display: flex;\r\n    align-items: center;\r\n    user-select: none;\r\n}\r\n\r\n.luckysheet-zoom-content .luckysheet-zoom-minus{\r\n    position: absolute;\r\n    top: 0;\r\n    left: 0px;\r\n    width: 20px;\r\n    height:20px;\r\n    cursor: pointer;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n}\r\n\r\n.luckysheet-zoom-content .luckysheet-zoom-minus-icon{\r\n    background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIycHgiIHZpZXdCb3g9IjAgMCAxNCAyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA2MyAoOTI0NDUpIC0gaHR0cHM6Ly9za2V0Y2guY29tIC0tPgogICAgPHRpdGxlPnJpcWlxdWppYW7lpIfku70gNDU8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iMjAyMC8wOC8xNCIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9IueUu+adv+Wkh+S7vS0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTcwNC4wMDAwMDAsIC0xMDY0LjAwMDAwMCkiIGZpbGw9IiM0NDRENUEiPgogICAgICAgICAgICA8ZyBpZD0icmlxaXF1amlhbuWkh+S7vS0xMjYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2OTkuMDAwMDAwLCAxMDUzLjAwMDAwMCkiPgogICAgICAgICAgICAgICAgPGcgaWQ9Iue8lue7hCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS4wMDAwMDAsIDExLjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxyZWN0IGlkPSLnn6nlvaIiIHg9IjAiIHk9IjAiIHdpZHRoPSIxNCIgaGVpZ2h0PSIyIj48L3JlY3Q+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==');\r\n    width: 14px;\r\n    height: 2px;\r\n}\r\n\r\n.luckysheet-zoom-content .luckysheet-zoom-minus:hover{\r\n    background-color: #E1E4E8;\r\n}\r\n\r\n.luckysheet-zoom-content .luckysheet-zoom-slider{\r\n    position: absolute;\r\n    top: 0;\r\n    left: 25px;\r\n    width: 100px;\r\n    height: 100%;\r\n    display: flex;\r\n    align-items: center;\r\n}\r\n\r\n\r\n.luckysheet-zoom-content .luckysheet-zoom-slider .luckysheet-zoom-line{\r\n    position: absolute;\r\n    top: 10px;\r\n    width: 100px;\r\n    height: 2px;\r\n    background: #E1E4E8;\r\n}\r\n\r\n.luckysheet-zoom-content .luckysheet-zoom-slider .luckysheet-zoom-cursor{\r\n    position: absolute;\r\n    top: 7px;\r\n    width: 8px;\r\n    height: 8px;\r\n    border-radius: 8px;\r\n    background: #B5BDB8;\r\n    cursor: pointer;\r\n    z-index: 2;\r\n    transition: all 0.3s;\r\n}\r\n\r\n.luckysheet-zoom-content .luckysheet-zoom-slider .luckysheet-zoom-cursor:hover{\r\n    transform: scale(1.2);\r\n    transform-origin: center center;\r\n    background: rgb(160, 160, 160);\r\n}\r\n\r\n.luckysheet-zoom-content .luckysheet-zoom-slider .luckysheet-zoom-hundred{\r\n    position: absolute;\r\n    top: 9px;\r\n    width: 2px;\r\n    height: 4px;\r\n    left: 49px;\r\n    background: #1E1E1F;\r\n}\r\n\r\n\r\n.luckysheet-zoom-content .luckysheet-zoom-plus{\r\n    position: absolute;\r\n    top: 0;\r\n    left: 130px;\r\n    width: 20px;\r\n    height:20px;\r\n    cursor: pointer;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n}\r\n\r\n.luckysheet-zoom-content .luckysheet-zoom-plus .luckysheet-zoom-plus-icon{\r\n    background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNHB4IiB2aWV3Qm94PSIwIDAgMTQgMTQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDYzICg5MjQ0NSkgLSBodHRwczovL3NrZXRjaC5jb20gLS0+CiAgICA8dGl0bGU+cmlxaXF1amlhbuWkh+S7vSA0NjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSIyMDIwLzA4LzE0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i55S75p2/5aSH5Lu9LTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xODQ4LjAwMDAwMCwgLTEwNTguMDAwMDAwKSIgZmlsbD0iIzQ0NEQ1QSI+CiAgICAgICAgICAgIDxnIGlkPSJyaXFpcXVqaWFu5aSH5Lu9LTExOSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTg0My4wMDAwMDAsIDEwNTMuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0i57yW57uEIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1LjAwMDAwMCwgNS4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8cmVjdCBpZD0i55+p5b2iIiB4PSIwIiB5PSI2IiB3aWR0aD0iMTQiIGhlaWdodD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgICAgICAgIDxyZWN0IGlkPSLnn6nlvaLlpIfku70iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcuMDAwMDAwLCA3LjAwMDAwMCkgcm90YXRlKC0yNzAuMDAwMDAwKSB0cmFuc2xhdGUoLTcuMDAwMDAwLCAtNy4wMDAwMDApICIgeD0iMCIgeT0iNiIgd2lkdGg9IjE0IiBoZWlnaHQ9IjIiPjwvcmVjdD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+');\r\n    width: 14px;\r\n    height: 14px;\r\n}\r\n\r\n.luckysheet-zoom-content .luckysheet-zoom-plus:hover{\r\n    background-color: #E1E4E8;\r\n}\r\n\r\n.luckysheet-zoom-content .luckysheet-zoom-ratioText{\r\n    position: absolute;\r\n    top: 0;\r\n    left: 155px;\r\n    width: 60px;\r\n    color: #1E1E1F;\r\n    font-size: 12px;\r\n    text-align: left;\r\n    cursor: pointer;\r\n}\r\n\r\n.luckysheet-zoom-content .luckysheet-zoom-ratioText:hover{\r\n    background-color: #E1E4E8;\r\n}"
  },
  {
    "path": "src/data/chartJson.js",
    "content": "/**\r\n * 图表的样式结构: 为chartOptions.defaultOption下的所有属性,应该是所有图表类型的并集\r\n * DOM的结构与此对应: DOM操作后修改此处参数,直接存储后台, 渲染图表时候经过一层引擎转换才能使用各个图表插件渲染; 后台拿到此参数,可对应绑定到DOM上\r\n *\r\n * 设计细节:\r\n * 1. 各个图表类型之间的设置项不同,有交集和并集,此处设置统一存储并集参数\r\n * 2. 切换图表类型时,亦应保留所具有的设置参数,为切换回上一个图表类型保留设置\r\n */\r\nimport { deepCopy } from '../utils/chartUtil';\r\nconst baseComponent = {\r\n    label: {\r\n        fontSize: 12, //字体大小 //fontSize为'custom'时,取cusFontSize的值\r\n        color: '#333', //颜色\r\n        fontFamily: 'sans-serif', //字体\r\n        fontGroup: [], //字体, 加粗:选中:'bold',无:'normal'; 斜体: 选中:'italic',无:'normal';方向:选中:'vertical',无:'horizen'\r\n        cusFontSize: 12, //自定义文字大小\r\n    },\r\n    formatter: {\r\n        prefix: '', //前缀\r\n        suffix: '', //后缀\r\n        ratio: 1, //数值比例\r\n        digit: 'auto', //小数位数\r\n    },\r\n};\r\nconst chartComponent = {\r\n    //标题设置\r\n    title: {\r\n        show: false, //是否显示\r\n        text: '默认标题', //标题内容\r\n        label: deepCopy(baseComponent.label),\r\n        position: {\r\n            value: 'left-top', //custom:自定义 //left-top  为custom的时候,取offsetX, offsetY\r\n            offsetX: 40, //自定义的X位置,单位百分比\r\n            offsetY: 50, //自定义的Y位置,单位百分比\r\n        },\r\n    },\r\n    //副标题\r\n    subtitle: {\r\n        show: false, //是否显示\r\n        text: '', //标题内容\r\n        label: deepCopy(baseComponent.label),\r\n        distance: {\r\n            value: 'auto', //'auto': 默认, 'far': 远 // 'normal': 一般 'close':近 custom :取cusGap作为距离\r\n            cusGap: 40, //自定义距离\r\n        },\r\n    },\r\n    // 图表设置\r\n    config: {\r\n        color: 'transparent', //默认颜色//'#333'\r\n        fontFamily: 'Sans-serif',\r\n        grid: {\r\n            value: 'normal', //''normal':正常 'wide':宽 // 'narrow':窄 // 'slender':瘦长 'flat':扁平\r\n            top: 5,\r\n            left: 10,\r\n            right: 20,\r\n            bottom: 10,\r\n        },\r\n    },\r\n    //图例设置\r\n    legend: {\r\n        show: true,\r\n        selectMode: 'multiple', //'single':单选 //'多选':multiple //'禁用':'disable'\r\n        selected: [\r\n            //图例显示选择 //动态数据渲染 //分:初始化图表+后台加载使用数据结构中数据 /编辑时根据系列实时变化\r\n            {\r\n                seriesName: '衣服', //\r\n                isShow: true,\r\n            },\r\n            {\r\n                seriesName: '食材', //\r\n                isShow: true,\r\n            },\r\n            {\r\n                seriesName: '图书', //\r\n                isShow: true,\r\n            },\r\n        ],\r\n        label: deepCopy(baseComponent.label), //图例文字样式\r\n        position: {\r\n            value: 'left-top', //custom:自定义 //left-top  为custom的时候,取offsetX, offsetY\r\n            offsetX: 40, //自定义的X位置,单位百分比\r\n            offsetY: 50, //自定义的Y位置,单位百分比\r\n            direction: 'horizontal', //图例位置水平或者垂直 horizontal(水平)/vertical(垂直)\r\n        },\r\n        width: {\r\n            //图例图标大小\r\n            value: 'auto', //'auto':默认/ 'big':大/'medium':中/'small':小/'custom':自定义\r\n            cusSize: 25, //图例自定义宽度 ,单位px\r\n        },\r\n        height: {\r\n            //图例图标大小\r\n            value: 'auto', //'auto':默认/ 'big':大/'medium':中/'small':小/'custom':自定义\r\n            cusSize: 14, //图例自定义宽度 ,单位px\r\n        },\r\n        distance: {\r\n            value: 'auto', //'auto':默认 /far':远 / 'general':一般 / 'near':近 /'custom':自定义\r\n            cusGap: 10, //自定义距离\r\n        },\r\n        itemGap: 10,\r\n    },\r\n    //提示设置\r\n    tooltip: {\r\n        show: true, //鼠标提示显示\r\n        label: deepCopy(baseComponent.label), //文字样式\r\n        backgroundColor: 'rgba(50,50,50,0.7)', // 鼠标提示框背景色\r\n        triggerOn: 'mousemove', // 'mousemove':鼠标滑过 click':单击 触发条件\r\n        triggerType: 'item', //触发类型 //'axis':坐标轴触发 'item':数据项图形触发\r\n        axisPointer: {\r\n            // 指示器配置\r\n            type: 'line', // 'line':默认直线指示器 //'cross': 十字指示器配置 //'shadow': 阴影指示器配置\r\n            style: {\r\n                // 指示器样式\r\n                color: '#555',\r\n                width: 'normal', //宽度:'normal':正常 'bold': 粗 'bolder':加粗\r\n                type: 'solid', //'solid': 实线 'dash': 虚线 'dot':点线\r\n            },\r\n        },\r\n        format: [\r\n            //鼠标提示后缀\r\n            {\r\n                seriesName: '衣服',\r\n                prefix: '', //前缀\r\n                suffix: '', //后缀 (自定义单位)\r\n                ratio: 1, //除以的数 // 1为默认, 0.1 /0.001 /...\r\n                digit: 'auto', //小数位数 'auto' :不处理 // 数值:0 , 1 ,2 ...\r\n            },\r\n            {\r\n                seriesName: '食材',\r\n                prefix: '', //前缀\r\n                suffix: '', //后缀\r\n                ratio: 1,\r\n                digit: 'auto',\r\n            },\r\n            {\r\n                seriesName: '图书',\r\n                prefix: '', //前缀\r\n                suffix: '', //后缀\r\n                ratio: 1,\r\n                digit: 'auto',\r\n            },\r\n        ],\r\n        position: 'auto', // 鼠标提示位置 //'inside':中心位置 //'left'/'top'/'right'/'top'\r\n    },\r\n    // XY轴\r\n    axis: {\r\n        axisType: 'xAxisDown', //要显示的坐标轴类型\r\n        xAxisUp: {\r\n            show: false, //显示X轴\r\n            title: {\r\n                showTitle: false, //显示X轴\r\n                text: '', //标题内容\r\n                nameGap: 15, //标题与轴线距离\r\n                rotate: 0, //标题倾斜角度\r\n                label: deepCopy(baseComponent.label),\r\n                fzPosition: 'end', //标题对齐方式,end: 尾部, middle: 中间\r\n            },\r\n            name: '显示X轴',\r\n            inverse: false, //反向坐标轴 (echarts有)\r\n            //刻度线\r\n            tickLine: {\r\n                show: true, //显示刻度线\r\n                width: 1, //刻度线宽度\r\n                color: 'auto', //刻度线颜色\r\n            },\r\n            //刻度\r\n            tick: {\r\n                show: true, //显示刻度\r\n                position: 'outside', //刻度位置,默认: outside朝外 / inside: 朝内\r\n                length: 5, //刻度长度\r\n                width: 1, //刻度宽度\r\n                color: 'auto', //刻度颜色\r\n            },\r\n            //标签\r\n            tickLabel: {\r\n                show: true, //显示刻度标签\r\n                label: deepCopy(baseComponent.label),\r\n                rotate: 0, //倾斜标签角度\r\n                prefix: '', //标签前缀\r\n                suffix: '', //标签后缀\r\n                optimize: 0,\r\n                distance: 0, //标签与轴线距离\r\n                min: 'auto', //最小值\r\n                max: 'auto', //最大值\r\n                ratio: 1,\r\n                digit: 'auto',\r\n            },\r\n            //网格线\r\n            netLine: {\r\n                show: false, //显示网格线\r\n                width: 1, //网格线宽度\r\n                type: 'solid', //网格线类型\r\n                color: 'auto', //网格线颜色\r\n                interval: {\r\n                    //网格分割间隔数\r\n                    value: 'auto',\r\n                    cusNumber: 0,\r\n                },\r\n            },\r\n            //网格区域\r\n            netArea: {\r\n                show: false, //显示网格区域\r\n                interval: {\r\n                    //网格分割间隔数\r\n                    value: 'auto',\r\n                    cusNumber: 0,\r\n                },\r\n                colorOne: 'auto', //网格第一颜色\r\n                colorTwo: 'auto', //网格第二颜色\r\n            },\r\n            axisLine: {\r\n                //第二根X轴必需\r\n                onZero: false,\r\n            },\r\n        },\r\n        xAxisDown: {\r\n            show: true, //显示X轴\r\n            title: {\r\n                showTitle: false, //显示X轴\r\n                text: '', //标题内容\r\n                nameGap: 15, //标题与轴线距离\r\n                rotate: 0, //标题倾斜角度\r\n                label: deepCopy(baseComponent.label),\r\n                fzPosition: 'end', //标题对齐方式,end: 尾部, middle: 中间\r\n            },\r\n            name: '显示X轴',\r\n            inverse: false, //反向坐标轴 (echarts有)\r\n            //刻度线\r\n            tickLine: {\r\n                show: true, //显示刻度线\r\n                width: 1, //刻度线宽度\r\n                color: 'auto', //刻度线颜色\r\n            },\r\n            //刻度\r\n            tick: {\r\n                show: true, //显示刻度\r\n                position: 'outside', //刻度位置,默认: outside朝外 / inside: 朝内\r\n                length: 5, //刻度长度\r\n                width: 1, //刻度宽度\r\n                color: 'auto', //刻度颜色\r\n            },\r\n            //标签\r\n            tickLabel: {\r\n                show: true, //显示刻度标签\r\n                label: deepCopy(baseComponent.label),\r\n                rotate: 0, //倾斜标签角度\r\n                prefix: '', //标签前缀\r\n                suffix: '', //标签后缀\r\n                optimize: 0, //标签间隔个数\r\n                distance: 0, //标签与轴线距离\r\n                min: null, //最小值\r\n                max: null, //最大值\r\n                ratio: 1,\r\n                digit: 'auto',\r\n            },\r\n            //网格线\r\n            netLine: {\r\n                show: false, //显示网格线\r\n                width: 1, //网格线宽度\r\n                type: 'solid', //网格线类型\r\n                color: 'auto', //网格线颜色\r\n                interval: {\r\n                    //网格分割间隔数\r\n                    value: 'auto',\r\n                    cusNumber: 0,\r\n                },\r\n            },\r\n            //网格区域\r\n            netArea: {\r\n                show: false, //显示网格区域\r\n                interval: {\r\n                    //网格分割间隔数\r\n                    value: 'auto',\r\n                    cusNumber: 0,\r\n                },\r\n                colorOne: 'auto', //网格第一颜色\r\n                colorTwo: 'auto', //网格第二颜色\r\n            },\r\n        },\r\n        yAxisLeft: {\r\n            show: true, //显示X轴\r\n            title: {\r\n                showTitle: false, //显示X轴\r\n                text: '', //标题内容\r\n                nameGap: 15, //标题与轴线距离\r\n                rotate: 0, //标题倾斜角度\r\n                label: deepCopy(baseComponent.label),\r\n                fzPosition: 'end', //标题对齐方式,end: 尾部, middle: 中间\r\n            },\r\n            name: '显示Y轴',\r\n            inverse: false, //反向坐标轴 (echarts有)\r\n            //刻度线\r\n            tickLine: {\r\n                show: true, //显示刻度线\r\n                width: 1, //刻度线宽度\r\n                color: 'auto', //刻度线颜色\r\n            },\r\n            //刻度\r\n            tick: {\r\n                show: true, //显示刻度\r\n                position: 'outside', //刻度位置,默认: outside朝外 / inside: 朝内\r\n                length: 5, //刻度长度\r\n                width: 1, //刻度宽度\r\n                color: 'auto', //刻度颜色\r\n            },\r\n            //标签\r\n            tickLabel: {\r\n                show: true, //显示刻度标签\r\n                label: deepCopy(baseComponent.label),\r\n                rotate: 0, //倾斜标签角度\r\n                formatter: deepCopy(baseComponent.formatter),\r\n                split: 5, //分割段数\r\n                min: null, //最小值\r\n                max: null, //最大值\r\n                prefix: '', //标签前缀\r\n                suffix: '', //标签后缀\r\n                ratio: 1,\r\n                digit: 'auto',\r\n                distance: 0, //标签与轴线距离\r\n            },\r\n            //网格线\r\n            netLine: {\r\n                show: false, //显示网格线\r\n                width: 1, //网格线宽度\r\n                type: 'solid', //网格线类型\r\n                color: 'auto', //网格线颜色\r\n                interval: {\r\n                    //网格分割间隔数\r\n                    value: 'auto',\r\n                    cusNumber: 0,\r\n                },\r\n            },\r\n            //网格区域\r\n            netArea: {\r\n                show: false, //显示网格区域\r\n                interval: {\r\n                    //网格分割间隔数\r\n                    value: 'auto',\r\n                    cusNumber: 0,\r\n                },\r\n                colorOne: 'auto', //网格第一颜色\r\n                colorTwo: 'auto', //网格第二颜色\r\n            },\r\n        },\r\n        yAxisRight: {\r\n            show: false, //显示X轴\r\n            title: {\r\n                showTitle: false, //显示X轴\r\n                text: '', //标题内容\r\n                nameGap: 15, //标题与轴线距离\r\n                rotate: 0, //标题倾斜角度\r\n                label: deepCopy(baseComponent.label),\r\n                fzPosition: 'end', //标题对齐方式,end: 尾部, middle: 中间\r\n            },\r\n            name: '显示Y轴',\r\n            inverse: false, //反向坐标轴 (echarts有)\r\n            //刻度线\r\n            tickLine: {\r\n                show: true, //显示刻度线\r\n                width: 1, //刻度线宽度\r\n                color: 'auto', //刻度线颜色\r\n            },\r\n            //刻度\r\n            tick: {\r\n                show: true, //显示刻度\r\n                position: 'outside', //刻度位置,默认: outside朝外 / inside: 朝内\r\n                length: 5, //刻度长度\r\n                width: 1, //刻度宽度\r\n                color: 'auto', //刻度颜色\r\n            },\r\n            //标签\r\n            tickLabel: {\r\n                show: true, //显示刻度标签\r\n                label: deepCopy(baseComponent.label),\r\n                rotate: 0, //倾斜标签角度\r\n                formatter: deepCopy(baseComponent.formatter),\r\n                split: 5, //分割段数\r\n                min: null, //最小值\r\n                max: null, //最大值\r\n                prefix: '', //标签前缀\r\n                suffix: '', //标签后缀\r\n                ratio: 1,\r\n                digit: 'auto',\r\n                distance: 0, //标签与轴线距离\r\n            },\r\n            //网格线\r\n            netLine: {\r\n                show: false, //显示网格线\r\n                width: 1, //网格线宽度\r\n                type: 'solid', //网格线类型\r\n                color: 'auto', //网格线颜色\r\n                interval: {\r\n                    //网格分割间隔数\r\n                    value: 'auto',\r\n                    cusNumber: 0,\r\n                },\r\n            },\r\n            //网格区域\r\n            netArea: {\r\n                show: false, //显示网格区域\r\n                interval: {\r\n                    //网格分割间隔数\r\n                    value: 'auto',\r\n                    cusNumber: 0,\r\n                },\r\n                colorOne: 'auto', //网格第一颜色\r\n                colorTwo: 'auto', //网格第二颜色\r\n            },\r\n        },\r\n    },\r\n};\r\n\r\n//此类数据抽出来作为模板数据,每次使用deepCopy一份即可\r\n//注: 若页面展示的是语义化的参数,则此处也只定义语义化的参数,具体数值在引擎里做转换\r\n//若界面选择的直接是用户期望的数值,则直接采用数值即可\r\n/**\r\n *  位置信息\r\n *\r\n */\r\nconst positionOption = [\r\n    { value: 'left-top', label: '左上' },\r\n    { value: 'left-middle', label: '左中' },\r\n    { value: 'left-bottom', label: '左下' },\r\n    { value: 'right-top', label: '右上' },\r\n    { value: 'right-middle', label: '右中' },\r\n    { value: 'right-bottom', label: '右下' },\r\n    { value: 'center-top', label: '中上' },\r\n    { value: 'center-middle', label: '居中' },\r\n    { value: 'center-bottom', label: '中下' },\r\n    { value: 'custom', label: '自定义' },\r\n];\r\n\r\n//距离\r\nconst distanceOption = [\r\n    { value: 'auto', label: '默认' },\r\n    { value: 'far', label: '远' },\r\n    { value: 'normal', label: '一般' },\r\n    { value: 'close', label: '近' },\r\n    { value: 'custom', label: '自定义' },\r\n];\r\n\r\n// 字体大小集合\r\nconst fontSizeOption = [\r\n    { value: 6, label: '6px' },\r\n    { value: 8, label: '8px' },\r\n    { value: 10, label: '10px' },\r\n    { value: 12, label: '12px' },\r\n    { value: 14, label: '14px' },\r\n    { value: 16, label: '16px' },\r\n    { value: 18, label: '18px' },\r\n    { value: 20, label: '20px' },\r\n    { value: 22, label: '22px' },\r\n    { value: 24, label: '24px' },\r\n    { value: 30, label: '30x' },\r\n    { value: 36, label: '36px' },\r\n    { value: 'custom', label: '自定义' },\r\n];\r\n\r\n// 线样式\r\nconst lineStyleOption = [\r\n    { value: 'solid', label: '实线' },\r\n    { value: 'dashed', label: '虚线' },\r\n    { value: 'dotted', label: '点线' },\r\n];\r\n\r\n// 线宽度\r\nconst lineWeightOption = [\r\n    { value: 'normal', label: '正常' },\r\n    { value: 'bold', label: '粗' },\r\n    { value: 'bolder', label: '加粗' },\r\n];\r\n\r\n// 普通位置集合\r\nconst posOption = [\r\n    { value: 'auto', label: '默认' },\r\n    { value: 'inside', label: '中心位置' },\r\n    { value: 'top', label: '上侧' },\r\n    { value: 'left', label: '左侧' },\r\n    { value: 'right', label: '右侧' },\r\n    { value: 'bottom', label: '底侧' },\r\n];\r\n\r\n// 数值比例集合\r\nconst ratioOption = [\r\n    { value: 100, label: '乘以100' },\r\n    { value: 10, label: '乘以10' },\r\n    { value: 1, label: '默认' },\r\n    { value: 0.1, label: '除以10' },\r\n    { value: 0.01, label: '除以100' },\r\n    { value: 0.001, label: '除以1000' },\r\n    { value: 0.0001, label: '除以一万' },\r\n    { value: 0.00001, label: '除以10万' },\r\n    { value: 0.000001, label: '除以一百万' },\r\n    { value: 0.0000001, label: '除以一千万' },\r\n    { value: 0.00000001, label: '除以一亿' },\r\n    { value: 0.000000001, label: '除以十亿' },\r\n];\r\n\r\n// 数值位数集合\r\nconst digitOption = [\r\n    { value: 'auto', label: '自动显示' },\r\n    { value: 0, label: '整数' },\r\n    { value: 1, label: '1位小数' },\r\n    { value: 2, label: '2位小数' },\r\n    { value: 3, label: '3位小数' },\r\n    { value: 4, label: '4位小数' },\r\n    { value: 5, label: '5位小数' },\r\n    { value: 6, label: '6位小数' },\r\n    { value: 7, label: '7位小数' },\r\n    { value: 8, label: '8位小数' },\r\n];\r\n\r\n// (图例)大小集合\r\nconst sizeOption = [\r\n    { value: 'auto', label: '默认' },\r\n    { value: 'big', label: '大' },\r\n    { value: 'medium', label: '中' },\r\n    { value: 'small', label: '小' },\r\n    { value: 'custom', label: '自定义' },\r\n];\r\n\r\n// 间隔集合\r\nconst intervalOption = [\r\n    { value: 'auto', label: '默认' },\r\n    { value: 0, label: '每个刻度' },\r\n    { value: 1, label: '间隔1个' },\r\n    { value: 2, label: '间隔2个' },\r\n    { value: 3, label: '间隔3个' },\r\n    { value: 'custom', label: '自定义' },\r\n];\r\n\r\n//字体大小\r\nconst fontSizeList = [\r\n    { label: '默认', value: 'auto' },\r\n    { label: '6px', value: 6 },\r\n    { label: '8px', value: 8 },\r\n    { label: '10px', value: 10 },\r\n    { label: '12px', value: 12 },\r\n    { label: '14px', value: 14 },\r\n    { label: '16px', value: 16 },\r\n    { label: '18px', value: 18 },\r\n    { label: '24px', value: 24 },\r\n    { label: '28px', value: 28 },\r\n    { label: '36px', value: 36 },\r\n    { label: '自定义', value: 'custom' },\r\n];\r\n\r\n//label字体样式 1 // 'bold','italic','vertical'\r\nconst fontStyleIBV = {\r\n    bold: {\r\n        des: '加粗',\r\n        text: 'B',\r\n    },\r\n    italic: {\r\n        des: '斜体',\r\n        text: 'I',\r\n    },\r\n    vertical: {\r\n        des: '文字方向',\r\n        text: '垂直',\r\n    },\r\n};\r\n//label字体样式 2 // 'italic','bold'\r\nconst fontStyleIB = {\r\n    bold: {\r\n        des: '加粗',\r\n        text: 'B',\r\n    },\r\n    italic: {\r\n        des: '斜体',\r\n        text: 'I',\r\n    },\r\n};\r\n\r\n// model data\r\nconst chartModelData = [[\"地区\", \"衣服\", \"食材\", \"图书\"], [\"上海\", 134, 345, 51], [\"北京\", 345, 421, 234], [\"广州\", 453, 224, 156], [\"杭州\", 321, 634, 213], [\"南京\", 654, 542, 231]];\r\n\r\n// base chart option\r\nconst chartOptions = {\r\n    //图表类型设置集合\r\n    chartAllType: 'echarts|line|default',\r\n\r\n    //图表配置\r\n    defaultOption: deepCopy(chartComponent),\r\n\r\n    //图表数据\r\n    chartData: deepCopy(chartModelData),\r\n} //图表设置项\r\n\r\nexport {\r\n    chartComponent,\r\n    positionOption,\r\n    distanceOption,\r\n    fontSizeOption,\r\n    lineStyleOption,\r\n    lineWeightOption,\r\n    posOption,\r\n    ratioOption,\r\n    digitOption,\r\n    sizeOption,\r\n    fontSizeList,\r\n    intervalOption,\r\n    fontStyleIBV,\r\n    fontStyleIB,\r\n    chartOptions\r\n};\r\n"
  },
  {
    "path": "src/demoData/chat.js",
    "content": "export function initChat() {\n    if (!isNeedChat()) {\n        return\n    }\n\n    // Your CSS as text\n    let styles = `\nbody {\n    background-color: #f5f5f5;\n}\n\n#chat-assistant-container {\n    position: fixed;\n    right: 40px;\n    bottom: 86px;\n    z-index:9990;\n}\n\n#chat-assistant-button {\n    width: 50px;\n    height: 50px;\n    border-radius: 50%;\n    border: none;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    cursor: pointer;\n    background: linear-gradient(135deg, rgb(215 98 150 / 55%),rgb(34 78 139 / 71%), rgb(114 222 172));\n    box-shadow: 0px 0px 8px 1px rgb(0 0 0 / 22%);\n    color: #fff;\n    text-shadow: 1px 1px 3px rgb(0 0 0 / 56%);\n}\n\n\n#chat-container {\n    position: fixed;\n    padding: 10px;\n    top: 45%;\n    left: 50%;\n    z-index:9990;\n    transform: translate(-50%, -50%);\n    display: none;\n    border-radius: 5px;\n    width: 40%;\n    background: linear-gradient(135deg, rgb(215 98 150 / 92%),rgb(34 78 139 / 93%), rgb(114 222 172 / 94%));\n    box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.2);\n}\n\n\n\n#chat-header {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding: 0 10px 10px 0;\n    border-radius: 5px 5px 0 0;\n    cursor: move;\n}\n\n#loading-indicator {\n    width: 14px;\n    height: 14px;\n    margin: 0 10px 0 10px;\n    border: 2px solid #ccc;\n    border-top-color: #4caf50;\n    border-radius: 50%;\n    animation: spin 2s linear infinite;\n    visibility: hidden;\n}\n\n@keyframes spin {\n    0% {\n        transform: rotate(0deg);\n    }\n\n    100% {\n        transform: rotate(360deg);\n    }\n}\n\n#chat-header .show-loading {\n    visibility: visible;\n}\n\n#chat-header .hide-loading {\n    visibility: hidden;\n}\n\n\n#circle-button {\n    padding: 0;\n    border: none;\n    background-color: transparent;\n    font-size: 16px;\n    user-select: none;\n    display: flex;\n    align-items: center;\n    color: #fff; \n    text-shadow: 1px 1px 3px black;\n}\n\n#close-button {\n    cursor: pointer;\n    padding: 0;\n    border: none;\n    background-color: transparent;\n    font-size: 24px;\n    color: #fff; \n    text-shadow: 1px 1px 3px black;\n}\n#send-button {\n    cursor: pointer;\n    padding: 0;\n    border: none;\n    background-color: transparent;\n    font-size: 16px;\n}\n\n#close-button:hover,\n#send-button:hover {\n    color: #888;\n}\n\n#chat-input-container,\n#chat-input {\n    border: none;\n}\n\n#chat-input-container {\n    display: flex;\n    align-items: center;\n    border-radius: 5px;\n    background-color: #fff;\n    padding: 10px;\n}\n\n#chat-input {\n    flex: 1;\n    padding: 0;\n    margin-right: 5px;\n    border-radius: 5px;\n    overflow-y: auto;\n    height: 24px;\n    font-size: 1rem;\n    outline: none;\n    resize: none;\n    background: transparent;\n}\n\n#send-button {\n    background-color: transparent;\n    border: none;\n    border-radius: 5px;\n    cursor: pointer;\n    padding: 5px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    height: 32px;\n    width: 32px;\n}\n\n#send-button>span {\n    height: 16px;\n    width: 16px;\n}\n\n#send-button:enabled {\n    background-color: rgb(120,198,174);\n}\n\n#send-button:enabled svg path {\n    fill: #fff;\n}\n`\n\n    let styleSheet = document.createElement(\"style\")\n    styleSheet.innerText = styles\n    document.head.appendChild(styleSheet)\n\n\n    const html = `<div id=\"chat-assistant-container\">\n            <button id=\"chat-assistant-button\">🤖AI</button>\n        </div>\n    \n        <div id=\"chat-container\">\n            <div id=\"chat-header\">\n                <span id=\"circle-button\">Univer AI 助手<div id=\"loading-indicator\"></div></span>\n    \n                <button id=\"close-button\">×</button>\n            </div>\n            <div id=\"chat-input-container\">\n                <textarea id=\"chat-input\" placeholder=\"请输入问题\"></textarea>\n                <!-- <textarea id=\"chat-input\" placeholder=\"请输入问题\"></textarea> -->\n                <button id=\"send-button\" disabled>\n                    <span><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"none\" class=\"h-4 w-4 m-1 md:m-0\"\n                            stroke-width=\"2\">\n                            <path\n                                d=\"M.5 1.163A1 1 0 0 1 1.97.28l12.868 6.837a1 1 0 0 1 0 1.766L1.969 15.72A1 1 0 0 1 .5 14.836V10.33a1 1 0 0 1 .816-.983L8.5 8 1.316 6.653A1 1 0 0 1 .5 5.67V1.163Z\"\n                                fill=\"currentColor\"></path>\n                        </svg></span>\n                </button>\n            </div>\n    \n        </div>`;\n    document.body.insertAdjacentHTML('beforeend', html)\n\n\n    const assistantButton = document.getElementById('chat-assistant-button');\n    const chatContainer = document.getElementById('chat-container');\n    const closeButton = document.getElementById('close-button');\n    const chatInput = document.getElementById('chat-input');\n    const sendButton = document.getElementById('send-button');\n    const loadingIndicator = document.getElementById('loading-indicator');\n\n    assistantButton.addEventListener('click', function () {\n        chatContainer.style.display = 'block';\n    });\n\n    closeButton.addEventListener('click', function () {\n        chatContainer.style.display = 'none';\n    });\n\n    sendButton.addEventListener('click', function () {\n        const message = chatInput.value;\n        if (message.trim() !== '') {\n            // 处理发送消息的逻辑\n\n            chatInput.value = '';\n            resetButton(chatInput)\n\n            // 显示 Loading\n            loadingIndicator.classList.add('show-loading');\n            setTimeout(() => {\n                setFormuala(message);\n                // 隐藏 Loading\n                loadingIndicator.classList.remove('show-loading');\n            }, 1000);\n        }\n\n\n    });\n\n    chatInput.addEventListener('input', function () {\n        inputHandler(this)\n    });\n\n    function inputHandler(input) {\n        if (input.scrollHeight > 24) {\n            input.style.height = 'auto'\n        }\n        input.style.height = input.scrollHeight + 'px'; // 根据内容高度设置 textarea 高度\n        if (input.scrollHeight > 200) {\n            input.style.overflowY = 'scroll'\n        } else {\n            input.style.overflowY = 'hidden'\n        }\n\n        resetButton(input)\n\n    }\n\n    function resetButton(input) {\n        if (input.value.trim() !== '') {\n            sendButton.disabled = false;\n            sendButton.classList.add('enabled');\n        } else {\n            input.style.height = '24px'; // 重置高度为一行\n            sendButton.disabled = true;\n            sendButton.classList.remove('enabled');\n        }\n    }\n\n    // 快捷键\n    let isComposing = false;\n\n    chatInput.addEventListener('compositionstart', function () {\n        isComposing = true;\n    });\n\n    chatInput.addEventListener('compositionend', function () {\n        isComposing = false;\n    });\n\n    chatInput.addEventListener('keydown', function (event) {\n        const isWindows = navigator.platform.includes('Win');\n        const isMac = navigator.platform.includes('Mac');\n\n        const key = event.key;\n\n        if (isWindows && event.key === 'Enter' && !isComposing && !event.altKey) {\n            // Windows 上的 Enter 键触发发送\n            event.preventDefault();\n            sendButton.click();\n        } else if (isWindows && event.key === 'Enter' && !isComposing && event.altKey) {\n            // Windows 上的 Alt+Enter 键触发换行\n            event.preventDefault();\n            this.value += '\\n';\n        } else if (isMac && event.key === 'Enter' && !isComposing && !event.metaKey) {\n            // Mac 上的 Enter 键触发发送\n            event.preventDefault();\n            sendButton.click();\n        } else if (isMac && event.key === 'Enter' && !isComposing && event.metaKey) {\n            // Mac 上的 Command+Enter 键触发换行\n            event.preventDefault();\n            this.value += '\\n';\n        } else if (!isComposing && (key === \"Backspace\" || key === \"Delete\")) {\n\n        }\n\n        inputHandler(this)\n    });\n\n\n    // 添加拖拽功能\n    let isDragging = false;\n    let offset = { x: 0, y: 0 };\n\n    const chatHeader = document.getElementById('chat-header');\n\n    chatHeader.addEventListener('mousedown', function (event) {\n        isDragging = true;\n        offset.x = event.clientX - chatContainer.offsetLeft;\n        offset.y = event.clientY - chatContainer.offsetTop;\n    });\n\n    document.addEventListener('mousemove', function (event) {\n        if (isDragging) {\n            chatContainer.style.left = `${event.clientX - offset.x}px`;\n            chatContainer.style.top = `${event.clientY - offset.y}px`;\n        }\n    });\n\n    document.addEventListener('mouseup', function () {\n        isDragging = false;\n    });\n}\n\nconst needChatHosts = [\n    'crm.lashuju.com',\n    'localhost:3000'\n]\nfunction isNeedChat() {\n    const host = location.host;\n    if (needChatHosts.includes(host)) {\n        return true\n    }\n\n    return false\n}\n\n\nfunction setFormuala(sentence = '') {\n\n    let link = getLink(sentence)\n\n    if (link !== '') {\n        setGET_AIRTABLE(link)\n    } else {\n        setASK_AI(sentence)\n    }\n\n}\n\nfunction setASK_AI(sentence = '') {\n\n    let range = getRange(sentence);\n\n    range = range === '' ? '' : ',' + range\n    const data = [\n        [\n            {\n                \"f\": \"=ASK_AI(\\\"\" + sentence + \"\\\"\" + range + \")\"\n            }\n        ]\n    ]\n    luckysheet.setRangeValue(data)\n}\n\nfunction setGET_AIRTABLE(link) {\n    const data = [\n        [\n            {\n                \"f\": \"=GET_AIRTABLE_DATA(\\\"\" + link + \"\\\")\"\n            }\n        ]\n    ]\n    luckysheet.setRangeValue(data)\n}\n\nfunction getLink(sentence = '') {\n    const regex = /(https?:\\/\\/(?:www\\.)?airtable\\.com\\/\\S+)/gi;\n    const matches = sentence.match(regex);\n\n    if (matches) {\n        return matches[0];\n    }\n\n    return ''\n\n}\n\nfunction getRange(text) {\n    const regex = /([A-Z]+[0-9]*):([A-Z]+[0-9]*)/g;\n    const matche = text.match(regex);\n    if (matche) {\n        return matche[0]\n    }\n    return ''\n}"
  },
  {
    "path": "src/demoData/demoFeature.js",
    "content": "\r\n// Features specially written for demo\r\n\r\n(function () {\r\n\r\n    // language\r\n    function language(params) {\r\n\r\n        var lang = navigator.language || navigator.userLanguage;//常规浏览器语言和IE浏览器\r\n        lang = lang.substr(0, 2);//截取lang前2位字符\r\n\r\n        return lang;\r\n\r\n    }\r\n    // Tencent Forum Link Button\r\n    function supportButton() {\r\n        const text = language() === 'zh' ? '反馈' : 'Forum';\r\n        const link = language() === 'zh' ? 'https://support.qq.com/product/288322' : 'https://groups.google.com/g/luckysheet';\r\n\r\n        document.querySelector(\"body\").insertAdjacentHTML('beforeend', '<a id=\"container\" href=\"' + link + '\" target=\"_blank\" style=\"z-index:2;width:50px;height:50px;line-height:50px;position:fixed;right:40px;bottom:86px;border-radius:50px;cursor:pointer;background:rgb(71,133,249);color:#fff;text-align:center;text-decoration:none;font-size: 12px;\">' + text + '</a>');\r\n    }\r\n\r\n    supportButton()\r\n\r\n    /**\r\n     * Get url parameters\r\n     */\r\n    function getRequest() {\r\n        var vars = {};\r\n        var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,\r\n            function (m, key, value) {\r\n                vars[key] = value;\r\n            });\r\n        return vars;\r\n    }\r\n\r\n    window.luckysheetDemoUtil = {\r\n        language: language,\r\n        getRequest: getRequest\r\n    }\r\n\r\n})()"
  },
  {
    "path": "src/demoData/getTargetData.js",
    "content": "export const sourceData2 = `分公司\t中支名称\t业务员代码\t出生日期\t性别\t入司日期\t学历\t销售额\t客户数\r\n福建\t福建泉州\t187565152\t8/12/72\t男\t2007/12/5\t高中\t20163451.32\t40\r\n山东\t山东烟台\t25271172\t7/20/65\t女\t2004/12/2\t高中\t18373103.35\t11\r\n湖北\t湖北襄阳\t210950662\t6/21/62\t女\t2008/3/25\t大专\t15385947.09\t13\r\n北京\t北京海淀\t365721352\t1/3/82\t男\t2010/4/1\t本科\t14402647.34\t2\r\n苏州\t苏州张家港\t372374712\t12/27/64\t女\t2010/4/28\t大专\t9735815.7\t6\r\n云南\t云南昆明\t5063494292\t12/29/83\t男\t2016/1/28\t高中\t5379570.2\t3\r\n四川\t四川青羊\t328012912\t5/21/84\t女\t2009/8/29\t大专\t5141381.55\t11\r\n山东\t山东济南\t21455372\t5/26/74\t男\t2004/10/25\t大专\t4029490.88\t5\r\n四川\t四川高新\t1702542\t11/9/71\t女\t2002/8/15\t硕士\t3864554.45\t19\r\n`\r\nconst remoteT1 = atob('cGF0b0h0bFlqMlJGWThhZks=')\r\nconst remoteT2 = atob('M2Y1ZThmNjNlMWM3OTRjN2Y1YjExOWFmNWJlMTg5MjRkOTIzZjc3YTQ3YjZhYWY5OTk2Y2E3NWMyZDU3YWRjNQ==')\r\n\r\nexport const sourceData = `分公司\t中支名称\t业务员代码\t出生日期\t性别\t入司日期\t学历\t销售额\t客户数\r\n福建\t福建泉州\t187565152\t8/12/72\t男\t2007/12/5\t高中\t20163451.32\t40\r\n山东\t山东烟台\t25271172\t7/20/65\t女\t2004/12/2\t高中\t18373103.35\t11\r\n湖北\t湖北襄阳\t210950662\t6/21/62\t女\t2008/3/25\t大专\t15385947.09\t13\r\n北京\t北京海淀\t365721352\t1/3/82\t男\t2010/4/1\t本科\t14402647.34\t2\r\n苏州\t苏州张家港\t372374712\t12/27/64\t女\t2010/4/28\t大专\t9735815.7\t6\r\n云南\t云南昆明\t5063494292\t12/29/83\t男\t2016/1/28\t高中\t5379570.2\t3\r\n四川\t四川青羊\t328012912\t5/21/84\t女\t2009/8/29\t大专\t5141381.55\t11\r\n山东\t山东济南\t21455372\t5/26/74\t男\t2004/10/25\t大专\t4029490.88\t5\r\n四川\t四川高新\t1702542\t11/9/71\t女\t2002/8/15\t硕士\t3864554.45\t19\r\n北京\t北京东城\t5185447802\t6/2/79\t女\t2016/6/29\t大专\t3670000\t0\r\n北京\t北京海淀\t481509622\t5/31/82\t女\t2012/11/1\t硕士\t3625797.4\t11\r\n云南\t云南昆明\t732645692\t9/29/81\t女\t2015/3/31\t高中\t3596281.2\t0\r\n安徽\t安徽阜阳\t881266442\t8/15/79\t女\t2015/10/1\t本科\t3560000\t0\r\n上海\t上海陆家嘴\t229180522\t9/21/78\t女\t2008/6/5\t大专\t3242806\t10\r\n辽宁\t辽宁沈阳\t749820832\t12/17/79\t女\t2015/4/28\t大专\t2850542.26\t7\r\n北京\t北京海淀\t388122212\t1/21/87\t男\t2010/8/1\t本科\t2601133.65\t0\r\n山西\t山西阳泉\t5026090372\t12/12/81\t男\t2015/11/21\t本科\t2435016\t6\r\n河北\t河北唐山\t34038712\t1/7/74\t男\t2005/3/16\t本科\t2219823.41\t6\r\n北京\t北京良乡\t648409082\t3/8/88\t女\t2014/7/28\t本科\t2131949.88\t4\r\n江苏\t江苏扬州\t670430452\t4/13/68\t女\t2014/9/19\t大专\t2118555.34\t0\r\n黑龙江\t黑龙江双鸭山\t5048017842\t1/20/76\t女\t2015/12/18\t本科\t2057665\t0\r\n宁波\t宁波宁海\t853590042\t9/14/74\t女\t2015/8/10\t高中\t2054726.1\t7\r\n浙江\t浙江金华\t666137192\t6/13/92\t女\t2014/9/2\t高中\t2036110\t3\r\n江苏\t江苏扬州\t754872372\t8/8/75\t女\t2015/5/18\t大专\t2029270\t5\r\n北京\t北京平谷\t526210572\t7/8/90\t女\t2013/6/1\t大专\t2027352.14\t5\r\n广西\t广西南宁\t664312612\t3/17/90\t男\t2014/8/29\t大专\t2012266\t4\r\n北京\t北京良乡\t347612\t11/15/73\t男\t2002/1/18\t大专\t2011441.52\t0\r\n北京\t北京东城\t879871872\t1/27/75\t女\t2015/9/29\t本科\t2000000\t0\r\n佛山\t佛山禅城\t5125907942\t1/7/77\t女\t2016/4/21\t大专\t2000000\t0\r\n四川\t四川绵阳\t655505432\t4/11/73\t男\t2014/8/12\t大专\t1953453.7\t2\r\n辽宁\t辽宁沈阳\t866310022\t8/7/77\t女\t2015/9/2\t中专\t1920726.49\t2\r\n四川\t四川成都\t5242692\t1/17/78\t男\t2003/6/30\t本科\t1893405.52\t3\r\n辽宁\t辽宁沈阳\t434225542\t12/19/76\t女\t2011/8/15\t大专\t1881350.76\t9\r\n黑龙江\t黑龙江哈尔滨\t799646732\t9/7/66\t女\t2015/7/23\t中专\t1857990.76\t4\r\n青岛\t青岛一支\t61985322\t3/28/73\t女\t2005/10/14\t大专\t1710726.1\t1\r\n北京\t北京东城\t526611552\t6/10/87\t女\t2013/6/3\t大专\t1705048.1\t1\r\n山东\t山东烟台\t95669582\t8/26/71\t女\t2006/9/1\t大专\t1690131.9\t10\r\n贵州\t贵州黔东南\t738764232\t11/17/65\t女\t2015/4/9\t中专\t1608153.5\t4\r\n福建\t福建福州\t84739982\t4/11/48\t女\t2006/5/17\t高中\t1558914.59\t4\r\n黑龙江\t黑龙江牡丹江\t245540722\t7/21/77\t男\t2008/8/11\t本科\t1542130\t11\r\n江苏\t江苏无锡\t102036412\t12/23/69\t女\t2006/10/25\t高中\t1378616.22\t4\r\n四川\t四川成都\t158559082\t10/27/62\t女\t2007/8/21\t高中\t1368403.12\t2\r\n四川\t四川高新\t80506182\t10/20/79\t男\t2006/3/29\t大专\t1361781.44\t7\r\n北京\t北京东城\t473511242\t8/17/80\t女\t2012/8/3\t大专\t1355572.33\t13\r\n北京\t北京东城\t3649382\t8/10/80\t男\t2003/5/1\t大专\t1341996.3\t4\r\n北京\t北京良乡\t51498712\t10/16/79\t女\t2005/7/13\t大专\t1283734.55\t5\r\n浙江\t浙江杭州\t684166212\t6/10/80\t女\t2014/11/19\t中专\t1275636\t5\r\n北京\t北京海淀\t369271412\t10/7/88\t女\t2010/4/8\t大专\t1256157.7\t144\r\n四川\t四川绵阳\t595314212\t11/17/86\t女\t2013/12/23\t大专\t1244411.43\t0\r\n山东\t山东菏泽\t398851942\t1/20/83\t女\t2010/10/4\t大专\t1236442.04\t4\r\n山东\t山东日照\t63825252\t9/1/76\t女\t2005/10/31\t中专\t1179056.29\t27\r\n深圳\t深圳福田第二\t375464062\t10/13/79\t男\t2010/5/17\t本科\t1177775.16\t5\r\n北京\t北京平谷\t481850172\t6/7/80\t女\t2012/11/1\t本科\t1153168\t4\r\n宁波\t宁波慈溪\t69825572\t7/15/53\t男\t2005/12/20\t高中\t1141200.31\t11\r\n上海\t上海陆家嘴\t8009912\t8/30/63\t女\t2003/9/23\t高中\t1133340.46\t21\r\n四川\t四川高新\t531276762\t12/25/84\t男\t2013/6/9\t本科\t1120548.51\t7\r\n云南\t云南昆明\t148699552\t10/30/72\t女\t2007/7/1\t大专\t1109034.8\t18\r\n湖北\t湖北武汉\t757213352\t3/19/76\t女\t2015/5/25\t大专\t1106842\t17\r\n湖北\t湖北十堰\t112072492\t9/25/70\t女\t2007/1/1\t大专\t1101132.13\t19\r\n深圳\t深圳福田\t19326812\t4/24/66\t男\t2004/9/20\t本科\t1096309.08\t6\r\n浙江\t浙江杭州\t357516962\t8/10/80\t女\t2010/1/18\t本科\t1090662.61\t8\r\n山东\t山东烟台\t558795732\t11/29/84\t女\t2013/6/28\t大专\t1071717.5\t7\r\n黑龙江\t黑龙江佳木斯\t663685532\t12/7/68\t女\t2014/8/28\t高中\t1069233\t4\r\n深圳\t深圳福田第二\t92594612\t7/22/74\t男\t2006/8/1\t大专\t1067440.54\t15\r\n苏州\t苏州张家港\t5171153422\t3/15/86\t女\t2016/6/14\t本科\t1062086\t3\r\n山西\t山西长治\t721783092\t3/2/82\t女\t2015/3/25\t高中\t1050000\t0\r\n湖北\t湖北武汉\t864694792\t6/29/84\t女\t2015/8/28\t高中\t1047450\t3\r\n深圳\t深圳福田\t546437792\t10/6/85\t女\t2013/6/26\t本科\t1047254.29\t4\r\n福建\t福建厦门\t647887512\t11/10/73\t男\t2014/7/28\t高中\t1046574.03\t1\r\n河南\t河南三门峡\t316289592\t5/7/71\t女\t2009/7/21\t高中\t1044516\t4\r\n湖北\t湖北随州\t193264562\t12/27/62\t女\t2007/12/10\t高中\t1039192.8\t6\r\n江西\t江西新余\t726776842\t9/25/74\t女\t2015/3/25\t高中\t1030000\t0\r\n四川\t四川青羊\t106951312\t11/20/77\t女\t2006/12/11\t高中\t1022207.14\t1\r\n辽宁\t辽宁葫芦岛\t510968592\t9/20/78\t女\t2013/3/26\t高中\t1013132.79\t0\r\n云南\t云南昆明\t490030272\t1/19/63\t女\t2012/12/14\t大专\t1010800\t2\r\n黑龙江\t黑龙江齐齐哈尔\t188260202\t12/13/66\t女\t2007/12/10\t大专\t1010000\t0\r\n山西\t山西吕梁\t496639252\t4/7/74\t女\t2012/12/31\t大专\t1009963\t3\r\n青岛\t青岛开发区\t738596192\t1/26/68\t女\t2015/4/9\t高中\t1005065\t2\r\n四川\t四川高新\t165229192\t7/14/72\t女\t2007/9/24\t本科\t1003146.52\t6\r\n四川\t四川高新\t249542982\t7/31/74\t女\t2008/9/3\t大专\t949303.75\t10\r\n山东\t山东烟台\t478144352\t1/2/80\t女\t2012/9/17\t大专\t892268.19\t8\r\n福建\t福建福州\t797998432\t4/27/73\t女\t2015/7/21\t高中\t871458\t1\r\n上海\t上海陆家嘴\t179572\t4/26/67\t女\t2002/1/1\t高中\t860489.68\t20\r\n山东\t山东潍坊\t653862572\t5/13/86\t男\t2014/8/8\t高中\t835882\t5\r\n湖北\t湖北襄阳\t630902602\t3/31/79\t女\t2014/5/25\t本科\t834871.1\t10\r\n天津\t天津市区一支\t5026121182\t4/7/81\t女\t2015/11/21\t本科\t801412.5\t1\r\n辽宁\t辽宁盘锦\t476824592\t4/15/73\t女\t2012/9/1\t本科\t793434.16\t0\r\n四川\t四川青羊\t88712\t2/28/67\t女\t2001/12/30\t大专\t789733.64\t14\r\n四川\t四川雅安\t83743052\t9/30/79\t女\t2006/4/30\t大专\t774043.06\t4\r\n四川\t四川青羊\t241332182\t11/17/84\t女\t2008/7/22\t本科\t766154.85\t7\r\n湖北\t湖北武汉\t5184341822\t2/18/72\t女\t2016/6/27\t本科\t757864\t1\r\n四川\t四川青羊\t9143212\t8/23/67\t女\t2003/11/28\t高中\t756171.9\t5\r\n山东\t山东烟台\t751034382\t11/6/89\t女\t2015/4/30\t中专\t751794\t18\r\n山东\t山东德州\t440278482\t4/1/72\t男\t2011/9/28\t大专\t740054.01\t22\r\n深圳\t深圳福田第二\t5100761332\t12/17/72\t女\t2016/3/21\t本科\t724693\t9\r\n四川\t四川绵阳\t7790652\t9/21/76\t女\t2003/9/17\t大专\t717472.95\t4\r\n深圳\t深圳罗湖\t127574072\t2/22/67\t女\t2007/4/1\t本科\t716770.64\t9\r\n青岛\t青岛一支\t4675072\t4/4/73\t女\t2003/6/18\t大专\t700000\t0\r\n陕西\t陕西西安\t370425502\t8/24/75\t女\t2010/4/19\t大专\t676587.35\t6\r\n辽宁\t辽宁葫芦岛\t517063542\t8/3/64\t男\t2013/4/25\t大专\t672312.58\t0\r\n广西\t广西南宁\t484638882\t6/8/82\t女\t2012/11/23\t高中\t666031.7\t12\r\n吉林\t吉林辽源\t661150552\t3/23/63\t女\t2014/8/25\t大专\t660164.8\t4\r\n山东\t山东烟台\t504193942\t10/21/75\t女\t2013/2/25\t本科\t657509.88\t2\r\n四川\t四川青羊\t37126662\t7/9/63\t女\t2005/3/31\t大专\t656166\t3\r\n北京\t北京平谷\t783513332\t10/1/77\t女\t2015/7/7\t大专\t650000\t0\r\n北京\t北京平谷\t113524422\t4/15/68\t男\t2007/1/5\t大专\t645205\t5\r\n江西\t江西南昌\t213406092\t8/31/63\t女\t2008/4/1\t大专\t643087.8\t6\r\n北京\t北京海淀\t324551342\t4/27/87\t男\t2009/9/1\t本科\t638417.19\t3\r\n河南\t河南郑州\t5105796262\t10/8/71\t女\t2016/3/22\t高中\t638300\t4\r\n四川\t四川青羊\t5455812\t10/17/77\t女\t2003/7/4\t本科\t633698.3\t11\r\n辽宁\t辽宁盘锦\t5127859712\t5/20/69\t男\t2016/4/25\t大专\t631937.5\t4\r\n四川\t四川青羊\t14224752\t10/25/71\t女\t2004/6/3\t中专\t627782.85\t3\r\n广西\t广西南宁\t412331872\t3/30/71\t女\t2010/12/31\t本科\t627304.43\t16\r\n苏州\t苏州张家港\t394090432\t7/18/65\t女\t2010/9/2\t高中\t623493.54\t3\r\n青岛\t青岛一支\t692879462\t10/7/81\t女\t2014/12/19\t本科\t622260.7\t3\r\n福建\t福建厦门\t195500032\t6/8/73\t女\t2008/1/1\t大专\t617899.48\t13\r\n苏州\t苏州常熟\t783220932\t1/15/63\t女\t2015/7/7\t高中\t610432.77\t2\r\n辽宁\t辽宁本溪\t5012640952\t10/3/70\t女\t2015/11/8\t大专\t610020\t1\r\n山东\t山东临沂\t454857512\t4/17/71\t男\t2012/3/6\t初中\t586953\t6\r\n浙江\t浙江温州\t636529302\t1/17/79\t女\t2014/6/13\t高中\t576026.22\t0\r\n四川\t四川青羊\t2286912\t9/19/70\t女\t2002/12/2\t大专\t574443.59\t6\r\n山东\t山东潍坊\t169909752\t6/3/66\t女\t2007/10/18\t中专\t574042.09\t13\r\n云南\t云南昆明\t292559762\t12/27/49\t女\t2009/4/14\t大专\t573701.21\t7\r\n佛山\t佛山顺德龙江\t512186882\t11/12/79\t女\t2013/3/29\t大专\t569506.1\t8\r\n山东\t山东日照\t92676262\t1/8/72\t女\t2006/8/2\t本科\t569348.72\t24\r\n上海\t上海黄浦\t37606222\t10/15/77\t女\t2005/3/31\t大专\t562473.36\t10\r\n四川\t四川高新\t650982302\t5/31/79\t女\t2014/8/4\t大专\t556883\t4\r\n宁波\t宁波城区\t385719402\t11/30/72\t女\t2010/7/9\t大专\t554467.91\t18\r\n安徽\t安徽合肥\t36354432\t11/8/76\t男\t2005/3/1\t大专\t549712.05\t4\r\n吉林\t吉林长春\t153032452\t6/9/73\t女\t2007/8/1\t大专\t549488.53\t39\r\n山东\t山东济南\t18716482\t10/9/69\t女\t2004/9/1\t中专\t548464.52\t12\r\n辽宁\t辽宁沈阳\t6909142\t7/13/75\t女\t2003/8/29\t大专\t545963.7\t6\r\n四川\t四川高新\t455066862\t3/20/90\t女\t2012/3/7\t高中\t542358.44\t9\r\n浙江\t浙江绍兴\t31489082\t4/10/75\t女\t2005/2/7\t高中\t540681.86\t33\r\n江苏\t江苏无锡\t325579402\t8/17/60\t女\t2009/8/24\t高中\t540229.19\t4\r\n山西\t山西吕梁\t548331042\t3/16/84\t女\t2013/6/25\t大专\t532490\t2\r\n北京\t北京东城\t361292\t12/28/67\t女\t2002/1/18\t大专\t532300.2\t5\r\n四川\t四川高新\t647489602\t5/11/72\t女\t2014/7/25\t大专\t529688.23\t17\r\n河北\t河北唐山\t5013521152\t11/27/85\t女\t2015/11/8\t大专\t529464\t6\r\n黑龙江\t黑龙江双鸭山\t338323942\t2/8/67\t女\t2009/10/25\t本科\t526188.74\t5\r\n黑龙江\t黑龙江双鸭山\t742403752\t2/20/63\t女\t2015/4/10\t大专\t526000\t0\r\n黑龙江\t黑龙江哈尔滨\t208725802\t1/3/71\t女\t2008/3/20\t大专\t525063.06\t10\r\n北京\t北京平谷\t593039802\t10/28/69\t女\t2013/12/18\t高中\t523318.64\t3\r\n云南\t云南昆明\t610997782\t9/23/66\t女\t2014/3/4\t大专\t523224.89\t3\r\n辽宁\t辽宁沈阳\t878107452\t3/15/80\t女\t2015/9/25\t本科\t523142\t5\r\n重庆\t重庆渝中\t637133492\t5/13/84\t女\t2014/6/16\t高中\t522822.54\t6\r\n北京\t北京海淀\t200127972\t1/27/85\t女\t2008/1/14\t本科\t522563.45\t1\r\n黑龙江\t黑龙江牡丹江\t618937132\t2/25/78\t女\t2014/3/26\t高中\t522219.5\t8\r\n辽宁\t辽宁丹东\t561215292\t11/20/67\t女\t2013/6/28\t大专\t522022\t7\r\n山东\t山东济南\t65614932\t9/1/79\t女\t2005/11/17\t高中\t520573.55\t9\r\n山西\t山西长治\t5217556602\t9/22/84\t女\t2016/8/16\t本科\t517171.5\t17\r\n大连\t大连海川\t576789582\t9/10/78\t女\t2013/9/5\t本科\t517064.25\t2\r\n黑龙江\t黑龙江哈尔滨\t28114872\t1/8/69\t女\t2005/1/4\t本科\t516217.09\t20\r\n深圳\t深圳福田第二\t423741032\t4/15/79\t女\t2011/5/12\t中专\t512000\t0\r\n浙江\t浙江嘉兴\t134827852\t3/5/73\t男\t2007/5/11\t中专\t511424.65\t5\r\n四川\t四川高新\t631453202\t10/12/84\t女\t2014/5/28\t大专\t511272.79\t3\r\n山东\t山东莱芜\t401608282\t12/23/69\t男\t2010/10/25\t本科\t510288\t4\r\n江西\t江西鹰潭\t5049942402\t1/29/75\t女\t2015/12/22\t高中\t508840\t1\r\n江西\t江西赣州\t708747822\t11/14/84\t女\t2015/2/10\t大专\t507832.21\t4\r\n黑龙江\t黑龙江牡丹江\t490373192\t9/3/73\t男\t2012/12/17\t初中\t506595\t1\r\n四川\t四川青羊\t484269032\t10/12/79\t女\t2012/11/22\t大专\t506026.58\t0\r\n黑龙江\t黑龙江哈尔滨\t881947812\t9/9/72\t女\t2015/10/8\t本科\t505748.6\t1\r\n广东\t广东东莞\t805797372\t11/7/78\t男\t2015/7/27\t大专\t504882\t1\r\n浙江\t浙江杭州\t672484202\t4/6/78\t女\t2014/9/24\t中专\t503000\t0\r\n山东\t山东济南\t126133722\t8/20/71\t女\t2007/3/24\t中专\t502616\t2\r\n福建\t福建龙岩\t862955632\t12/15/84\t女\t2015/8/25\t大专\t502182.7\t1\r\n北京\t北京东城\t633474152\t6/8/83\t女\t2014/6/5\t大专\t493763.6\t13\r\n浙江\t浙江杭州\t89872472\t7/29/70\t女\t2006/6/30\t本科\t490590.94\t5\r\n四川\t四川高新\t5044961892\t3/14/77\t女\t2015/12/12\t本科\t485991.5\t51\r\n山西\t山西太原\t230510192\t5/1/75\t男\t2008/6/2\t高中\t485240\t2\r\n四川\t四川青羊\t7948782\t1/11/71\t女\t2003/9/19\t硕士\t476347.94\t20\r\n浙江\t浙江温州\t15657562\t8/10/63\t女\t2004/7/6\t中专\t474437.64\t10\r\n河南\t河南郑州\t6897832\t3/9/65\t女\t2003/8/29\t大专\t471640.47\t26\r\n四川\t四川青羊\t153392122\t9/23/75\t女\t2007/7/25\t高中\t470760\t9\r\n湖北\t湖北武汉\t539292592\t2/22/90\t男\t2013/6/18\t大专\t470522.65\t0\r\n浙江\t浙江金华\t504972042\t12/8/76\t女\t2013/2/28\t初中\t469475.1\t13\r\n山西\t山西忻州\t562987252\t10/8/88\t男\t2013/6/29\t本科\t463851.3\t12\r\n辽宁\t辽宁丹东\t5057524742\t2/5/70\t女\t2016/1/6\t本科\t462886.8\t9\r\n湖北\t湖北武汉\t5198919932\t2/12/69\t女\t2016/8/1\t大专\t461667\t10\r\n四川\t四川乐山\t757799122\t4/22/67\t女\t2015/5/27\t高中\t461098\t4\r\n广东\t广东广州\t503068882\t6/11/78\t女\t2013/2/6\t大专\t460553.6\t12\r\n河南\t河南郑州\t458746722\t4/16/90\t女\t2012/3/23\t本科\t459525.86\t4\r\n吉林\t吉林长春\t437303582\t6/7/75\t女\t2011/9/9\t大专\t454799.81\t11\r\n四川\t四川高新\t447324312\t9/12/84\t女\t2011/12/16\t大专\t454660.6\t15\r\n四川\t四川乐山\t31761932\t9/24/56\t女\t2005/2/21\t大专\t453791.74\t4\r\n河南\t河南南阳\t100328652\t3/8/79\t女\t2006/10/8\t大专\t453463.08\t5\r\n宁波\t宁波宁海\t718754872\t10/26/80\t女\t2015/3/24\t大专\t451335\t23\r\n四川\t四川高新\t5061666732\t11/19/81\t女\t2016/1/18\t本科\t449761.2\t17\r\n四川\t四川青羊\t100022\t3/21/75\t女\t2001/12/31\t大专\t449308.28\t9\r\n广东\t广东珠海\t626089172\t8/30/87\t女\t2014/4/30\t本科\t449280.05\t6\r\n辽宁\t辽宁沈阳\t308615982\t11/5/69\t女\t2009/6/25\t中专\t447876.48\t4\r\n佛山\t佛山顺德龙江\t742192032\t4/4/73\t女\t2015/4/10\t大专\t447663.2\t5\r\n浙江\t浙江杭州\t248891342\t8/19/74\t女\t2008/9/1\t高中\t446192.86\t8\r\n四川\t四川青羊\t133792\t12/13/68\t女\t2001/12/30\t大专\t445609.73\t6\r\n北京\t北京东城\t21732692\t10/29/63\t女\t2004/11/1\t大专\t442811.38\t22\r\n四川\t四川高新\t1659832\t5/6/74\t男\t2002/8/12\t大专\t442490.46\t16\r\n新疆\t新疆昌吉\t581999252\t7/20/67\t男\t2013/10/25\t高中\t440450.27\t3\r\n大连\t大连明锐\t5003000772\t1/30/86\t女\t2015/10/21\t硕士\t439430.6\t6\r\n山西\t山西太原\t235208202\t9/14/69\t女\t2008/6/25\t大专\t439355.66\t7\r\n山东\t山东济南\t243986352\t6/15/79\t女\t2008/8/1\t本科\t438131.2\t9\r\n四川\t四川绵阳\t5096785232\t7/7/85\t女\t2016/3/16\t中专\t436198.8\t10\r\n青岛\t青岛一支\t518815682\t11/2/81\t男\t2013/5/3\t本科\t434074.05\t11\r\n天津\t天津市区二支\t684050092\t9/24/72\t女\t2014/11/18\t高中\t430467\t7\r\n江西\t江西赣州\t628288072\t10/17/66\t女\t2014/5/13\t高中\t430332\t3\r\n青岛\t青岛即墨\t5044645482\t12/22/74\t女\t2015/12/11\t大专\t428549\t4\r\n福建\t福建泉州\t793627292\t4/10/88 1:00\t男\t2015/7/17\t高中\t426948\t4\r\n苏州\t苏州常熟\t5047615302\t3/18/83\t男\t2015/12/17\t高中\t424839.9\t36\r\n四川\t四川高新\t705304672\t12/11/77\t女\t2015/1/21\t中专\t423249.81\t4\r\n四川\t四川青羊\t9349492\t11/11/78\t女\t2003/12/11\t本科\t422445.61\t5\r\n深圳\t深圳福田\t387940492\t3/6/75\t女\t2010/7/26\t本科\t420831.67\t1\r\n山东\t山东日照\t63982682\t2/17/72\t女\t2005/10/31\t中专\t419975.7\t49\r\n浙江\t浙江嘉兴\t146927592\t5/31/73\t男\t2007/7/1\t初中\t414410.24\t3\r\n广西\t广西北海\t421465922\t10/18/74\t男\t2011/4/15\t大专\t412363.49\t12\r\n黑龙江\t黑龙江哈尔滨\t5047715972\t6/15/74\t女\t2015/12/17\t大专\t410720\t2\r\n黑龙江\t黑龙江齐齐哈尔\t707377542\t2/6/80\t女\t2015/1/30\t大专\t410393\t2\r\n佛山\t佛山禅城\t258523372\t9/8/72\t女\t2008/10/23\t高中\t407188.77\t10\r\n江西\t江西宜春\t657473762\t9/5/76\t男\t2014/8/18\t本科\t406026.22\t0\r\n陕西\t陕西西安\t534591512\t6/13/78\t女\t2013/6/14\t大专\t404659\t2\r\n黑龙江\t黑龙江牡丹江\t5026123952\t8/12/65\t女\t2015/11/21\t高中\t403645\t1\r\n湖南\t湖南永州\t5142349892\t2/2/86\t男\t2016/5/19\t高中\t400000\t0\r\n黑龙江\t黑龙江齐齐哈尔\t676451292\t12/14/68\t女\t2014/10/10\t中专\t398498\t2\r\n江苏\t江苏南京\t5063640242\t11/12/82\t女\t2016/1/29\t大专\t396111\t3\r\n湖南\t湖南郴州\t516759562\t10/6/86\t女\t2013/4/24\t大专\t388338\t2\r\n湖北\t湖北武汉\t20893192\t2/20/69\t女\t2004/10/17\t大专\t388127.05\t16\r\n四川\t四川青羊\t98008192\t3/28/73\t女\t2006/9/22\t高中\t384521.42\t8\r\n黑龙江\t黑龙江鹤岗\t472360222\t5/31/80\t女\t2012/7/19\t中专\t383991.44\t0\r\n山东\t山东东营\t154460792\t11/12/76\t女\t2007/7/25\t初中\t380204.31\t13\r\n山东\t山东淄博\t532106082\t10/13/68\t女\t2013/6/9\t大专\t378387.55\t4\r\n四川\t四川青羊\t6706902\t2/8/71\t女\t2003/8/20\t高中\t377997.11\t5\r\n苏州\t苏州新区\t466142312\t8/13/62\t男\t2012/5/28\t本科\t377387.46\t0\r\n大连\t大连明锐\t6648842\t1/1/69\t女\t2003/8/15\t大专\t377237.7\t7\r\n河北\t河北沧州\t634625172\t4/16/77\t女\t2014/6/9\t高中\t376894\t3\r\n四川\t四川成都\t5046782182\t8/18/64\t女\t2015/12/15\t中专\t376723\t4\r\n四川\t四川青羊\t760872\t7/15/63\t男\t2002/3/8\t中专\t376002.35\t6\r\n河南\t河南南阳\t28755632\t12/26/63\t男\t2005/1/8\t大专\t375897.23\t5\r\n天津\t天津市区二支\t394910812\t9/9/78\t女\t2010/9/9\t本科\t375258.3\t17\r\n浙江\t浙江杭州\t4836272\t10/20/76\t女\t2003/6/20\t大专\t375079.4\t19\r\n天津\t天津市区一支\t135160862\t2/25/73\t女\t2007/5/15\t高中\t373318.34\t4\r\n浙江\t浙江杭州\t86567632\t8/15/78\t女\t2006/5/31\t大专\t365789.15\t6\r\n浙江\t浙江温州\t437464782\t9/28/82\t女\t2011/9/13\t高中\t362119.39\t7\r\n黑龙江\t黑龙江哈尔滨\t19379432\t12/18/68\t男\t2004/10/1\t大专\t360184.42\t15\r\n四川\t四川内江\t357111242\t7/27/76\t女\t2010/1/13\t大专\t359709.69\t8\r\n苏州\t苏州新区\t785830722\t6/12/77\t女\t2015/7/10\t大专\t358975\t1\r\n四川\t四川青羊\t337223172\t6/8/71\t女\t2009/10/20\t大专\t356079.78\t5\r\n山西\t山西朔州\t5182689152\t6/20/91\t男\t2016/6/24\t高中\t355170.9\t4\r\n北京\t北京良乡\t621212512\t1/9/76\t女\t2014/4/1\t大专\t354332.08\t0\r\n福建\t福建南平\t636154282\t1/20/74\t女\t2014/6/13\t高中\t353013.62\t0\r\n陕西\t陕西西安\t361663402\t3/13/70\t女\t2010/2/24\t高中\t352603.01\t7\r\n黑龙江\t黑龙江哈尔滨\t201643132\t6/30/63\t女\t2008/1/22\t大专\t350464.62\t21\r\n苏州\t苏州张家港\t360119912\t12/1/67\t女\t2010/2/3\t高中\t350264\t3\r\n湖北\t湖北襄阳\t595199762\t8/8/80\t男\t2013/12/23\t高中\t350093\t16\r\n广东\t广东惠州\t425891082\t12/18/70\t男\t2011/6/3\t大专\t350000\t0\r\n北京\t北京海淀\t3202622\t3/20/69\t女\t2003/3/19\t大专\t346989\t9\r\n湖南\t湖南长沙\t140374302\t11/9/67\t女\t2007/7/1\t大专\t346772.67\t15\r\n佛山\t佛山顺德龙江\t8517802\t1/20/66\t女\t2003/10/1\t高中\t344637.97\t22\r\n北京\t北京海淀\t242148792\t3/6/83\t女\t2008/8/1\t本科\t344243.01\t22\r\n青岛\t青岛城阳\t453026792\t3/27/83\t女\t2012/2/24\t高中\t343435.24\t9\r\n山东\t山东烟台\t128038552\t3/19/75\t女\t2007/4/1\t中专\t342908.03\t2\r\n北京\t北京海淀\t393257072\t8/27/87\t女\t2010/9/1\t大专\t342500.29\t9\r\n河北\t河北石家庄\t6968872\t11/21/75\t女\t2003/9/1\t大专\t341734.7\t15\r\n浙江\t浙江绍兴\t20416702\t6/1/68\t女\t2004/10/8\t本科\t340756.98\t7\r\n四川\t四川青羊\t582694302\t6/8/84\t男\t2013/11/1\t本科\t340369.46\t4\r\n辽宁\t辽宁鞍山\t829339342\t3/21/75\t女\t2015/8/5\t大专\t340353.31\t7\r\n湖南\t湖南湘潭\t275795512\t12/25/60\t女\t2009/1/6\t大专\t340074.71\t3\r\n广西\t广西柳州\t5161683702\t6/5/81\t女\t2016/6/4\t高中\t340026.3\t7\r\n黑龙江\t黑龙江齐齐哈尔\t58169522\t10/10/69\t女\t2005/9/13\t本科\t338386.4\t6\r\n福建\t福建福州\t362689092\t1/25/78\t女\t2010/3/3\t高中\t337892.34\t3\r\n山东\t山东济南\t5193842\t12/20/71\t女\t2003/7/1\t本科\t337478.29\t10\r\n黑龙江\t黑龙江哈尔滨\t5129432552\t4/22/72\t女\t2016/4/27\t高中\t337360\t1\r\n浙江\t浙江杭州\t261887942\t7/15/79\t女\t2008/11/7\t中技\t334369.78\t8\r\n山西\t山西忻州\t613788592\t11/13/68\t女\t2014/3/15\t高中\t332811.73\t5\r\n北京\t北京海淀\t394652612\t11/14/83\t女\t2010/9/7\t本科\t331539\t1\r\n天津\t天津市区一支\t296532022\t4/17/73\t女\t2009/5/4\t本科\t330000\t0\r\n吉林\t吉林吉林\t244760952\t2/2/69\t男\t2008/8/6\t中专\t329721.73\t16\r\n青岛\t青岛即墨\t148514762\t9/30/56\t女\t2007/7/10\t高中\t328482.32\t3\r\n广东\t广东汕头\t831591832\t7/11/73\t女\t2015/8/6\t高中\t327453\t2\r\n辽宁\t辽宁鞍山\t29480412\t10/31/61\t女\t2005/1/20\t高中\t326761\t6\r\n湖北\t湖北武汉\t627323512\t5/23/88\t女\t2014/5/8\t大专\t325581.2\t10\r\n大连\t大连海川\t5531322\t9/6/65\t男\t2003/7/1\t高中\t323898.5\t7\r\n陕西\t陕西西安\t209498732\t12/10/83\t女\t2008/3/22\t本科\t323704\t3\r\n四川\t四川绵阳\t74963502\t10/19/64\t女\t2006/2/8\t高中\t321628.86\t4\r\n辽宁\t辽宁盘锦\t600543972\t5/27/69\t女\t2013/12/30\t本科\t321392.05\t3\r\n山东\t山东济南\t55022812\t9/18/76\t女\t2005/8/17\t大专\t321145.1\t21\r\n内蒙古\t内蒙古通辽\t5201365772\t5/14/70\t女\t2016/8/2\t高中\t321001.82\t17\r\n重庆\t重庆渝中\t445548582\t10/7/76\t女\t2011/11/29\t大专\t320608.47\t14\r\n广西\t广西梧州\t5035400572\t12/4/73\t女\t2015/11/29\t高中\t320536\t5\r\n北京\t北京东城\t2944422\t1/20/68\t女\t2003/3/3\t硕士\t320444.8\t2\r\n云南\t云南昆明\t372441982\t7/29/75\t女\t2010/5/1\t大专\t320242.61\t1\r\n四川\t四川青羊\t96500572\t12/21/81\t女\t2006/9/7\t高中\t320032\t3\r\n黑龙江\t黑龙江双鸭山\t5157798232\t5/3/84\t女\t2016/6/1\t中专\t319160\t2\r\n四川\t四川雅安\t713140182\t11/3/72\t女\t2015/3/17\t中专\t315129.3\t4\r\n青岛\t青岛一支\t738621452\t3/27/79\t女\t2015/4/9\t本科\t315000\t0\r\n广东\t广东东莞\t290588362\t10/7/84\t男\t2009/4/2\t大专\t314918.01\t3\r\n湖南\t湖南永州\t5074259492\t4/16/60\t女\t2016/3/4\t高中\t314534\t4\r\n深圳\t深圳宝安\t190397272\t8/24/62\t女\t2007/12/17\t大专\t312908.21\t3\r\n北京\t北京海淀\t240066712\t9/5/86\t男\t2008/7/14\t本科\t312529.77\t10\r\n青岛\t青岛开发区\t5167513672\t10/30/74\t女\t2016/6/9\t本科\t312130.5\t4\r\n山东\t山东淄博\t108817202\t7/25/69\t女\t2006/12/20\t中专\t312000.62\t17\r\n辽宁\t辽宁本溪\t5079028832\t12/1/68\t女\t2016/3/7\t本科\t311780.5\t4\r\n江西\t江西吉安\t807237022\t10/25/74\t女\t2015/7/27\t大专\t311730\t4\r\n山东\t山东济南\t503809712\t4/24/76\t女\t2013/2/21\t大专\t310994.41\t7\r\n山东\t山东济南\t5202082\t6/29/73\t女\t2003/7/1\t大专\t310737.94\t8\r\n黑龙江\t黑龙江牡丹江\t717770222\t8/28/70\t女\t2015/3/23\t大专\t310405.7\t6\r\n黑龙江\t黑龙江哈尔滨\t528429292\t11/29/78\t女\t2013/6/6\t中专\t309747\t4\r\n河北\t河北石家庄\t9266172\t11/14/67\t女\t2003/12/1\t大专\t309553.97\t4\r\n广东\t广东梅州\t5786684612\t11/7/73\t女\t2018/6/27\t本科\t308983.28\t9\r\n山东\t山东淄博\t431141362\t2/27/73\t女\t2011/7/22\t中专\t308948.79\t6\r\n四川\t四川青羊\t5042737192\t10/15/65\t女\t2015/12/7\t高中\t308688\t3\r\n浙江\t浙江杭州\t315406682\t3/6/76\t男\t2009/7/17\t中专\t308472.21\t3\r\n辽宁\t辽宁沈阳\t5024692492\t6/25/86\t男\t2015/11/20\t本科\t308073\t2\r\n天津\t天津蓟州\t829842762\t2/2/86\t男\t2015/8/5\t高中\t307350\t1\r\n四川\t四川青羊\t24960352\t6/14/70\t女\t2004/11/30\t本科\t306821\t2\r\n湖南\t湖南株洲\t5059520962\t12/16/87\t男\t2016/1/9\t本科\t306522.6\t3\r\n四川\t四川青羊\t684395382\t12/19/82\t男\t2014/11/19\t本科\t306119\t3\r\n北京\t北京海淀\t204895352\t9/17/84\t女\t2008/2/25\t本科\t305926.06\t32\r\n深圳\t深圳福田第二\t590525342\t11/8/81\t女\t2013/12/11\t本科\t305642\t1\r\n苏州\t苏州昆山\t61854822\t1/25/66\t女\t2005/7/12\t中专\t305295.94\t7\r\n四川\t四川青羊\t61629422\t6/10/80\t女\t2005/10/11\t大专\t304971.85\t11\r\n深圳\t深圳福田第二\t8486402\t2/10/76\t男\t2003/10/21\t本科\t304947.65\t6\r\n北京\t北京东城\t5109171322\t2/12/79\t女\t2016/3/24\t本科\t304730\t2\r\n青岛\t青岛一支\t177857612\t11/14/74\t女\t2007/11/8\t大专\t304220.97\t23\r\n北京\t北京东城\t5184336352\t5/24/74\t女\t2016/6/27\t本科\t303750\t6\r\n四川\t四川绵阳\t413808092\t1/26/70\t女\t2011/1/10\t高中\t303600.43\t1\r\n山东\t山东淄博\t346920102\t8/19/64\t女\t2009/11/30\t大专\t303499.32\t10\r\n山东\t山东烟台\t5049889852\t8/27/86\t女\t2015/12/22\t中专\t303136.9\t1\r\n陕西\t陕西渭南\t820800272\t10/12/83\t女\t2015/7/31\t本科\t303000\t0\r\n江西\t江西南昌\t395786882\t5/5/63\t女\t2010/9/15\t本科\t302050.48\t9\r\n苏州\t苏州新区\t5121170312\t5/30/62\t男\t2016/4/14\t博士\t301756.58\t10\r\n浙江\t浙江绍兴\t442406342\t10/21/76\t女\t2011/10/24\t中专\t300344.24\t14\r\n重庆\t重庆巴南\t5087706212\t5/3/70\t女\t2016/3/10\t大专\t300000\t0\r\n广东\t广东惠州\t605756712\t9/6/84\t女\t2014/1/15\t本科\t300000\t0\r\n福建\t福建福州\t5036561872\t6/1/82\t女\t2015/11/30\t大专\t300000\t0\r\n北京\t北京东城\t43573742\t9/16/74\t男\t2005/5/19\t大专\t299053.09\t16\r\n北京\t北京东城\t1212102\t5/28/77\t女\t2002/6/1\t大专\t298390.47\t11\r\n四川\t四川高新\t3544842\t5/23/77\t女\t2003/4/11\t本科\t297530.33\t9\r\n大连\t大连海川\t5377932\t12/15/64\t女\t2003/7/1\t大专\t297452.57\t7\r\n湖北\t湖北荆州\t86081932\t8/8/60\t男\t2006/5/31\t大专\t297284.78\t9\r\n湖南\t湖南郴州\t5168244322\t11/4/83\t男\t2016/6/12\t高中\t297000\t0\r\n山东\t山东烟台\t252955432\t12/15/70\t女\t2008/9/23\t大专\t296316.91\t27\r\n大连\t大连明锐\t51418462\t3/26/73\t女\t2005/7/12\t中专\t295552.49\t7\r\n浙江\t浙江金华\t118077282\t3/4/71\t女\t2007/1/25\t高中\t295102.4\t6\r\n甘肃\t甘肃金昌\t827565982\t10/8/87\t男\t2015/8/4\t大专\t293000\t0\r\n黑龙江\t黑龙江哈尔滨\t253072252\t12/25/78\t女\t2008/9/24\t大专\t290631\t1\r\n江苏\t江苏泰州\t360453622\t1/6/77\t男\t2010/2/8\t高中\t290000\t0\r\n四川\t四川高新\t65822\t3/13/67\t男\t2001/12/30\t本科\t289414.66\t18\r\n北京\t北京东城\t133221562\t12/30/76\t男\t2007/5/1\t本科\t288562.64\t6\r\n山西\t山西太原\t155777482\t9/24/78\t女\t2007/8/1\t大专\t288489.24\t15\r\n苏州\t苏州昆山\t630330512\t6/1/81\t女\t2014/5/23\t大专\t288227.82\t5\r\n北京\t北京东城\t489343732\t10/28/76\t男\t2012/12/12\t硕士\t285416.8\t12\r\n山西\t山西太原\t185739872\t9/1/83\t女\t2007/12/1\t大专\t283659.81\t12\r\n苏州\t苏州新区\t502265252\t10/7/74\t男\t2013/1/31\t初中\t282341.84\t4\r\n四川\t四川青羊\t25344582\t1/27/76\t女\t2004/12/6\t高中\t282211.53\t21\r\n湖北\t湖北十堰\t387847262\t4/17/66\t女\t2010/8/1\t大专\t282079.82\t29\r\n河北\t河北承德\t784344322\t10/26/85\t男\t2015/7/9\t大专\t280500\t0\r\n吉林\t吉林长春\t716707962\t11/17/67\t女\t2015/3/23\t高中\t279775\t8\r\n河南\t河南濮阳\t383467882\t4/4/86\t男\t2010/6/25\t本科\t277688\t9\r\n湖南\t湖南长沙\t450505492\t10/12/69\t女\t2012/1/1\t大专\t277411.68\t14\r\n深圳\t深圳福田\t674672492\t4/25/78\t女\t2014/9/26\t本科\t277402.47\t5\r\n辽宁\t辽宁沈阳\t418256412\t10/25/62\t女\t2011/3/18\t大专\t277235.18\t3\r\n湖北\t湖北十堰\t263655162\t6/9/68\t女\t2008/11/18\t大专\t275569.57\t6\r\n江西\t江西新余\t614903742\t1/6/78\t女\t2014/3/18\t高中\t275464.08\t4\r\n黑龙江\t黑龙江哈尔滨\t19380132\t10/1/65\t女\t2004/10/1\t大专\t274503.24\t9\r\n北京\t北京海淀\t1356552\t4/11/69\t男\t2002/6/21\t大专\t273866.04\t0\r\n青岛\t青岛即墨\t76091632\t4/20/64\t女\t2006/2/25\t高中\t273229.98\t8\r\n苏州\t苏州张家港\t5038314172\t12/28/52\t男\t2015/11/30\t本科\t273044.24\t42\r\n四川\t四川高新\t75429382\t11/26/74\t女\t2006/2/22\t本科\t272455.4\t25\r\n福建\t福建福州\t422463282\t12/20/83\t女\t2011/4/27\t大专\t272270.53\t6\r\n贵州\t贵州贵阳\t282912382\t10/7/81\t男\t2009/3/6\t本科\t270824.61\t9\r\n北京\t北京东城\t5157125602\t2/14/69\t女\t2016/6/1\t硕士\t270000\t0\r\n山东\t山东烟台\t5178863572\t10/3/76\t女\t2016/6/21\t中专\t270000\t0\r\n四川\t四川青羊\t2264722\t1/9/65\t女\t2002/11/27\t本科\t269251.15\t5\r\n大连\t大连明锐\t635157622\t6/1/76\t女\t2014/6/10\t本科\t269160.5\t14\r\n山东\t山东德州\t240401122\t1/28/73\t女\t2008/7/15\t大专\t268935.19\t5\r\n大连\t大连明锐\t6649542\t8/4/73\t女\t2003/8/15\t大专\t268827.64\t17\r\n山东\t山东烟台\t13392092\t1/7/61\t女\t2004/5/1\t高中\t267666.51\t12\r\n四川\t四川青羊\t61365082\t11/20/74\t女\t2005/10/8\t中专\t267461.48\t4\r\n浙江\t浙江嘉兴\t40234432\t10/24/70\t女\t2005/4/26\t高中\t267144.84\t5\r\n四川\t四川青羊\t611267292\t5/19/85\t女\t2014/3/5\t大专\t266292.11\t18\r\n河北\t河北保定\t670587882\t8/15/86\t女\t2014/9/20\t本科\t265760\t4\r\n山东\t山东威海\t16320512\t8/14/71\t女\t2004/7/1\t大专\t265318.92\t26\r\n广西\t广西柳州\t421195442\t9/23/79\t女\t2011/4/12\t大专\t264450.71\t15\r\n安徽\t安徽芜湖\t5196640882\t10/3/62\t男\t2016/7/29\t大专\t264000\t2\r\n深圳\t深圳罗湖\t591581732\t2/6/78\t女\t2013/12/13\t本科\t263854.05\t5\r\n浙江\t浙江杭州\t4846182\t1/13/75\t女\t2003/6/20\t大专\t262773.65\t9\r\n天津\t天津蓟州\t117095972\t1/25/78\t女\t2007/1/24\t中专\t262300.84\t10\r\n辽宁\t辽宁沈阳\t741611702\t5/12/64\t女\t2015/4/10\t高中\t262059.2\t12\r\n云南\t云南昆明\t711593622\t6/15/78\t女\t2015/3/10\t本科\t261387.19\t2\r\n黑龙江\t黑龙江双鸭山\t740197042\t7/12/70\t女\t2015/4/10\t高中\t261148\t4\r\n北京\t北京海淀\t530049262\t8/23/82\t女\t2013/6/8\t大专\t260392\t31\r\n深圳\t深圳福田\t851721082\t11/26/71\t男\t2015/8/10\t本科\t260000\t0\r\n福建\t福建宁德\t5003120412\t5/15/72\t男\t2015/10/21\t高中\t259260\t2\r\n佛山\t佛山南海\t571002382\t1/11/79\t男\t2013/7/26\t大专\t259086.1\t7\r\n山西\t山西阳泉\t5068738662\t2/2/72\t女\t2016/2/25\t大专\t258165.92\t6\r\n浙江\t浙江温州\t340935132\t10/22/75\t女\t2009/11/6\t高中\t258111.23\t13\r\n山东\t山东济南\t402465232\t9/15/81\t女\t2010/10/28\t大专\t257788.34\t4\r\n湖北\t湖北襄阳\t58055772\t8/25/57\t女\t2005/9/12\t大专\t257740.61\t10\r\n四川\t四川青羊\t4357412\t8/2/80\t女\t2003/5/23\t本科\t257499.35\t2\r\n山东\t山东淄博\t12874292\t2/4/59\t女\t2004/4/26\t本科\t256531.6\t22\r\n四川\t四川高新\t5107959272\t7/17/80\t男\t2016/3/23\t本科\t256492\t17\r\n江西\t江西南昌\t189850442\t7/26/79\t女\t2007/12/14\t大专\t256227.28\t13\r\n四川\t四川青羊\t251977892\t5/24/84\t女\t2008/9/18\t大专\t256131\t2\r\n河南\t河南南阳\t218952812\t2/26/65\t女\t2008/4/25\t中专\t255984.54\t4\r\n安徽\t安徽合肥\t22642262\t7/6/65\t女\t2004/11/1\t大专\t255805.03\t13\r\n广东\t广东中山\t81274642\t11/14/75\t女\t2006/4/4\t大专\t255624.7\t6\r\n深圳\t深圳福田第二\t39379852\t9/1/73\t女\t2005/4/20\t大专\t254546.97\t12\r\n青岛\t青岛一支\t603439322\t2/27/70\t女\t2014/1/1\t本科\t254275.78\t6\r\n重庆\t重庆永川\t413255122\t11/25/68\t男\t2011/1/4\t高中\t253923.65\t4\r\n深圳\t深圳宝安\t49682372\t6/28/73\t女\t2005/6/29\t中专\t253873.92\t26\r\n安徽\t安徽合肥\t188864392\t12/4/78\t男\t2007/12/1\t中专\t253864.19\t16\r\n浙江\t浙江嘉兴\t18759192\t12/26/69\t女\t2004/9/1\t大专\t252685.44\t2\r\n黑龙江\t黑龙江鹤岗\t496895082\t7/14/72\t女\t2012/12/31\t中专\t252632.69\t4\r\n山西\t山西长治\t874769812\t4/17/76\t女\t2015/9/20\t大专\t252135\t0\r\n山东\t山东淄博\t362774782\t2/5/71\t女\t2010/3/5\t中专\t252041.93\t16\r\n辽宁\t辽宁丹东\t34998802\t10/7/62\t男\t2005/3/23\t大专\t251629.18\t5\r\n山东\t山东烟台\t823357442\t10/22/73\t女\t2015/8/1\t中专\t251048\t33\r\n宁波\t宁波宁海\t5106873232\t12/15/82\t男\t2016/3/23\t高中\t250000\t0\r\n吉林\t吉林延边\t5121343472\t11/3/80\t女\t2016/4/14\t中专\t249461.7\t7\r\n苏州\t苏州张家港\t135586132\t1/27/78\t女\t2007/5/18\t大专\t249299.94\t34\r\n安徽\t安徽滁州\t217132702\t5/16/72\t女\t2008/4/1\t高中\t248385.18\t7\r\n上海\t上海陆家嘴\t2456352\t7/29/73\t女\t2003/1/3\t高中\t246990.75\t8\r\n北京\t北京东城\t268156102\t5/29/81\t女\t2008/12/3\t本科\t246304.57\t20\r\n福建\t福建漳州\t195513982\t11/6/73\t女\t2008/1/1\t大专\t245799.79\t8\r\n江苏\t江苏南京\t119793552\t2/1/76\t女\t2007/2/12\t大专\t245474.37\t3\r\n河北\t河北石家庄\t6965802\t4/5/76\t女\t2003/9/1\t大专\t244748.17\t30\r\n苏州\t苏州新区\t5060853552\t1/11/80\t女\t2016/1/13\t高中\t244721.5\t11\r\n黑龙江\t黑龙江牡丹江\t775316482\t4/22/73\t女\t2015/6/26\t高中\t244233\t2\r\n广西\t广西柳州\t605549732\t2/24/71\t女\t2014/1/14\t中专\t244177.8\t7\r\n河北\t河北邢台\t5031277622\t3/13/81\t男\t2015/11/25\t高中\t243473.6\t3\r\n重庆\t重庆渝中\t5072386582\t4/20/81\t男\t2016/3/3\t大专\t243299\t3\r\n河南\t河南郑州\t5058533722\t8/19/81\t女\t2016/1/8\t大专\t243157.5\t6\r\n四川\t四川青羊\t3833472\t9/26/68\t女\t2003/4/21\t大专\t242900.64\t11\r\n四川\t四川青羊\t119577362\t9/27/67\t女\t2007/2/9\t本科\t242454.55\t3\r\n深圳\t深圳福田\t561205382\t3/10/80\t女\t2013/6/28\t本科\t242440.41\t1\r\n苏州\t苏州新区\t140242132\t4/30/56\t女\t2007/6/15\t高中\t242227.52\t19\r\n四川\t四川雅安\t5175568272\t10/31/63\t女\t2016/6/20\t大专\t241350\t1\r\n湖北\t湖北荆州\t50629482\t10/20/73\t女\t2005/7/1\t本科\t241101.99\t16\r\n浙江\t浙江杭州\t4742342\t2/3/65\t女\t2003/6/20\t本科\t240961.44\t7\r\n湖北\t湖北十堰\t388059682\t4/7/71\t女\t2010/8/1\t高中\t240502.3\t11\r\n四川\t四川绵阳\t182829872\t4/5/76\t女\t2007/11/23\t大专\t240229.2\t10\r\n深圳\t深圳福田第二\t692102762\t8/7/68\t女\t2014/12/18\t中专\t240000\t0\r\n四川\t四川青羊\t44332\t9/26/73\t女\t2001/12/30\t本科\t239103.04\t12\r\n福建\t福建福州\t429636812\t12/7/78\t女\t2011/6/29\t本科\t238625.17\t3\r\n辽宁\t辽宁阜新\t33165712\t2/2/63\t女\t2005/3/7\t高中\t237833.71\t14\r\n广东\t广东东莞\t639239162\t10/8/74\t女\t2014/6/20\t高中\t237365.3\t5\r\n辽宁\t辽宁朝阳\t708478042\t6/25/75\t女\t2015/2/6\t大专\t236789\t2\r\n湖北\t湖北襄阳\t289649762\t2/4/65\t女\t2009/3/25\t大专\t236174.23\t11\r\n云南\t云南昆明\t593308612\t9/20/83\t女\t2013/12/19\t本科\t236023.75\t7\r\n福建\t福建龙岩\t299802662\t6/4/70\t女\t2009/5/15\t中专\t235529.25\t26\r\n北京\t北京良乡\t452769292\t12/21/75\t女\t2012/3/1\t大专\t235502.49\t16\r\n河南\t河南郑州\t7044382\t7/13/68\t男\t2003/9/3\t本科\t235011.86\t0\r\n广东\t广东中山\t121095862\t11/20/73\t女\t2007/3/1\t大专\t234819.46\t10\r\n青岛\t青岛一支\t5184281032\t5/29/78\t女\t2016/6/27\t大专\t234772.3\t3\r\n云南\t云南昆明\t829943532\t9/8/85\t女\t2015/8/5\t大专\t234259\t5\r\n河北\t河北廊坊\t5017144632\t3/20/63\t女\t2015/11/12\t中专\t234078\t8\r\n四川\t四川青羊\t12612322\t10/30/69\t女\t2004/4/16\t本科\t233882.89\t18\r\n湖北\t湖北宜昌\t5048264392\t3/13/77\t女\t2015/12/18\t高中\t233547.5\t7\r\n黑龙江\t黑龙江哈尔滨\t5046768612\t4/10/77\t男\t2015/12/15\t本科\t233534.3\t7\r\n四川\t四川青羊\t1875052\t12/16/63\t女\t2002/9/13\t高中\t233060.03\t9\r\n四川\t四川青羊\t474306362\t12/22/73\t女\t2012/8/10\t高中\t232088\t3\r\n山东\t山东日照\t182481512\t11/26/65\t女\t2007/11/23\t高中\t231989.81\t11\r\n重庆\t重庆渝中\t599311032\t11/15/74\t女\t2013/12/27\t中专\t231008.02\t12\r\n山东\t山东济宁\t444068322\t12/13/71\t女\t2011/11/17\t高中\t230968.94\t3\r\n苏州\t苏州新区\t360794172\t10/26/69\t男\t2010/2/9\t大专\t230612.9\t1\r\n山东\t山东滨州\t647773762\t1/4/77\t男\t2014/7/26\t中专\t229091.05\t12\r\n辽宁\t辽宁沈阳\t6177522\t11/17/67\t男\t2003/7/30\t大专\t228830.09\t12\r\n北京\t北京平谷\t784670492\t10/15/81\t女\t2015/7/9\t本科\t228700\t2\r\n四川\t四川高新\t564812802\t9/23/73\t女\t2013/6/29\t中专\t228452.65\t16\r\n广东\t广东东莞\t365548842\t4/2/77\t女\t2010/3/23\t高中\t228121.61\t13\r\n江西\t江西南昌\t51424602\t8/12/77\t女\t2005/7/12\t大专\t227756.45\t9\r\n四川\t四川绵阳\t213644472\t3/30/69\t女\t2008/4/1\t高中\t227626.96\t7\r\n吉林\t吉林延边\t5144131202\t1/8/63\t女\t2016/5/23\t大专\t227600\t1\r\n浙江\t浙江杭州\t554642182\t4/28/86\t女\t2013/6/27\t高中\t226292.9\t4\r\n辽宁\t辽宁铁岭\t71475272\t1/18/78\t女\t2005/12/30\t高中\t225872.58\t3\r\n四川\t四川青羊\t95692472\t2/5/80\t女\t2006/9/1\t本科\t225424.7\t1\r\n云南\t云南昆明\t147409522\t12/4/68\t女\t2007/7/1\t本科\t225373.25\t7\r\n四川\t四川雅安\t30703172\t6/17/72\t男\t2005/1/1\t大专\t225316.82\t5\r\n四川\t四川雅安\t12009802\t11/22/65\t女\t2004/4/1\t高中\t225078.58\t5\r\n广东\t广东广州\t524946502\t8/29/74\t女\t2013/5/30\t大专\t224992.74\t7\r\n青岛\t青岛一支\t87695762\t5/12/79\t男\t2006/6/22\t本科\t224852.5\t27\r\n黑龙江\t黑龙江大庆\t5124248972\t7/18/70\t女\t2016/4/18\t大专\t223838.8\t8\r\n北京\t北京海淀\t417289482\t1/19/86\t女\t2011/3/9\t大专\t223571.02\t11\r\n辽宁\t辽宁阜新\t82212542\t12/12/75\t女\t2006/4/21\t高中\t223421.59\t4\r\n重庆\t重庆渝中\t708102322\t3/9/81\t女\t2015/2/4\t本科\t223190\t6\r\n山东\t山东济南\t82226222\t11/3/81\t女\t2006/4/21\t大专\t223089.55\t37\r\n山东\t山东淄博\t57257582\t5/26/60\t女\t2005/8/31\t高中\t222323.51\t26\r\n四川\t四川高新\t479715472\t9/25/90\t女\t2012/9/29\t大专\t222205.75\t9\r\n山东\t山东威海\t169573672\t3/17/71\t女\t2007/10/16\t大专\t222069.6\t18\r\n浙江\t浙江温州\t500270262\t10/24/71\t男\t2013/1/21\t本科\t221274.79\t8\r\n江苏\t江苏徐州\t122380452\t1/20/70\t男\t2007/3/12\t高中\t221261.2\t6\r\n安徽\t安徽合肥\t22508692\t10/5/69\t女\t2004/11/1\t大专\t221210.67\t8\r\n北京\t北京东城\t5143073272\t8/17/82\t女\t2016/5/20\t硕士\t220635\t10\r\n江苏\t江苏连云港\t591094362\t11/29/72\t男\t2013/12/13\t大专\t220603.46\t0\r\n北京\t北京良乡\t803841322\t4/9/74\t男\t2015/7/26\t大专\t220530\t2\r\n河南\t河南洛阳\t141324482\t12/13/77\t女\t2007/6/19\t高中\t220214.36\t23\r\n河南\t河南郑州\t4992032\t4/7/75\t女\t2003/6/27\t大专\t220204.04\t20\r\n湖南\t湖南娄底\t770093832\t5/23/74\t女\t2015/6/24\t高中\t220000\t0\r\n山西\t山西长治\t5005739412\t1/26/90\t男\t2015/10/26\t大专\t220000\t0\r\n贵州\t贵州贵阳\t376945022\t1/5/77\t女\t2010/5/25\t大专\t219969\t4\r\n湖南\t湖南永州\t437367782\t10/20/62\t女\t2011/9/10\t高中\t219821.53\t5\r\n辽宁\t辽宁沈阳\t423116322\t7/30/80\t女\t2011/5/4\t大专\t219544.1\t4\r\n甘肃\t甘肃武威\t676062592\t3/5/74\t男\t2014/10/8\t大专\t219440.42\t3\r\n四川\t四川青羊\t327608862\t10/23/82\t女\t2009/8/28\t大专\t219034.13\t9\r\n浙江\t浙江金华\t873340772\t10/18/64\t男\t2015/9/18\t高中\t218863.2\t12\r\n北京\t北京平谷\t2711482\t4/19/70\t女\t2003/2/1\t大专\t218577.22\t11\r\n河北\t河北邯郸\t232565612\t5/20/66\t女\t2008/6/20\t本科\t218558.11\t15\r\n甘肃\t甘肃兰州\t279640342\t4/16/68\t女\t2009/2/18\t大专\t218285.92\t26\r\n江苏\t江苏镇江\t179496702\t8/23/79\t女\t2007/11/13\t高中\t218126.02\t3\r\n浙江\t浙江金华\t46781582\t12/24/71\t女\t2005/6/10\t高中\t218027.71\t12\r\n四川\t四川乐山\t5051505272\t4/11/79\t女\t2015/12/23\t大专\t217551\t2\r\n江西\t江西南昌\t433721422\t4/6/67\t女\t2011/8/10\t高中\t217387.86\t3\r\n山东\t山东日照\t491275222\t4/20/70\t女\t2012/12/19\t中专\t217339.68\t9\r\n佛山\t佛山禅城\t391864872\t4/30/85\t男\t2010/8/23\t本科\t217243.64\t3\r\n山东\t山东济宁\t442351352\t8/4/71\t女\t2011/10/22\t大专\t217182.74\t15\r\n江苏\t江苏泰州\t592669252\t3/28/68\t女\t2013/12/18\t高中\t217140.99\t20\r\n北京\t北京东城\t656062\t8/11/70\t女\t2002/2/22\t大专\t216946.08\t0\r\n江西\t江西南昌\t5194660032\t5/26/85\t女\t2016/7/28\t高中\t216717.5\t30\r\n深圳\t深圳福田\t851351502\t5/29/80\t女\t2015/8/10\t大专\t216398\t5\r\n四川\t四川高新\t776922\t9/10/77\t女\t2002/3/11\t大专\t216381.8\t9\r\n山东\t山东淄博\t648254022\t8/15/71\t女\t2014/7/28\t高中\t216357.77\t6\r\n河北\t河北唐山\t414022882\t7/19/58\t女\t2011/1/13\t高中\t216226\t4\r\n山西\t山西太原\t5004977952\t10/1/77\t女\t2015/10/24\t本科\t216166.5\t2\r\n黑龙江\t黑龙江哈尔滨\t5178723022\t1/23/88\t女\t2016/6/21\t高中\t216094\t3\r\n湖南\t湖南永州\t467419362\t10/22/73\t女\t2012/6/7\t高中\t215968.93\t8\r\n安徽\t安徽阜阳\t5039441962\t2/18/81\t女\t2015/11/30\t大专\t215854.5\t3\r\n深圳\t深圳宝安\t588021762\t12/19/86\t女\t2013/12/3\t大专\t215834.5\t13\r\n黑龙江\t黑龙江双鸭山\t5010154262\t6/29/59\t女\t2015/11/5\t大专\t215667.5\t4\r\n江西\t江西南昌\t5039314082\t6/4/79\t女\t2015/11/30\t高中\t215604.2\t7\r\n江西\t江西南昌\t5090524682\t2/26/78\t女\t2016/3/12\t高中\t215218.7\t6\r\n山东\t山东烟台\t444211102\t3/23/71\t女\t2011/11/19\t中专\t214670.76\t9\r\n浙江\t浙江台州\t58871412\t1/23/73\t女\t2005/9/19\t高中\t214510.39\t11\r\n宁波\t宁波宁海\t670831432\t3/21/83\t女\t2014/9/22\t大专\t214280\t2\r\n山东\t山东淄博\t656865802\t12/10/76\t男\t2014/8/15\t大专\t214200.65\t9\r\n四川\t四川青羊\t5135733952\t10/26/82\t男\t2016/5/9\t大专\t214081\t2\r\n深圳\t深圳福田第二\t131105982\t9/16/79\t女\t2007/4/20\t本科\t213902.16\t4\r\n贵州\t贵州贵阳\t5153587352\t12/25/74\t男\t2016/5/30\t高中\t213692.5\t2\r\n湖北\t湖北武汉\t344482122\t2/17/80\t女\t2009/11/23\t大专\t213675.06\t16\r\n河南\t河南南阳\t224949092\t11/5/70\t女\t2008/5/21\t高中\t213334.06\t1\r\n北京\t北京东城\t75259942\t9/2/70\t女\t2006/2/17\t大专\t212726\t15\r\n浙江\t浙江杭州\t690792912\t2/17/79\t女\t2014/12/15\t本科\t212459.8\t26\r\n贵州\t贵州贵阳\t5104206182\t9/15/89\t女\t2016/3/22\t大专\t212160\t3\r\n陕西\t陕西汉中\t686435452\t7/29/67\t女\t2014/11/20\t高中\t212080\t7\r\n青岛\t青岛一支\t103467822\t10/6/74\t女\t2006/11/14\t本科\t211771.35\t3\r\n四川\t四川高新\t690520062\t4/19/76\t男\t2014/12/12\t大专\t211665\t5\r\n吉林\t吉林延边\t5104120052\t11/10/69\t女\t2016/3/22\t高中\t210710\t2\r\n广西\t广西南宁\t872232462\t8/9/88\t女\t2015/9/16\t中专\t210478.2\t5\r\n浙江\t浙江温州\t765560792\t12/2/85\t女\t2015/6/17\t高中\t210272\t3\r\n山东\t山东烟台\t262805052\t11/13/78\t男\t2008/11/12\t中专\t210203.13\t12\r\n湖北\t湖北武汉\t129339192\t10/29/64\t女\t2007/4/7\t高中\t210075.61\t18\r\n云南\t云南昆明\t452354632\t11/7/72\t女\t2012/2/13\t中专\t210047.5\t0\r\n青岛\t青岛一支\t507672962\t10/31/76\t女\t2013/3/19\t大专\t209487\t3\r\n青岛\t青岛开发区\t642464722\t2/18/65\t男\t2014/6/25\t本科\t209477.78\t1\r\n黑龙江\t黑龙江牡丹江\t214166042\t3/23/73\t女\t2008/4/2\t大专\t209280.99\t6\r\n新疆\t新疆乌鲁木齐\t230366712\t12/19/72\t女\t2008/6/1\t中专\t208903.85\t41\r\n福建\t福建福州\t732029222\t2/17/72\t女\t2015/3/31\t中专\t208080\t2\r\n佛山\t佛山顺德龙江\t444463162\t6/20/77\t女\t2011/11/22\t大专\t207774.89\t5\r\n北京\t北京海淀\t631844272\t10/31/84\t女\t2014/5/30\t本科\t207532.63\t0\r\n河北\t河北邢台\t340063802\t5/10/73\t女\t2009/11/2\t中专\t207511.3\t4\r\n云南\t云南昆明\t279600702\t11/14/70\t女\t2009/2/18\t中专\t207376.55\t1\r\n广东\t广东广州\t503372\t8/26/61\t女\t2002/1/1\t大专\t207246.6\t6\r\n湖南\t湖南永州\t421451272\t1/17/67\t女\t2011/4/15\t大专\t206785.09\t12\r\n湖北\t湖北十堰\t810018892\t7/26/70\t女\t2015/7/28\t高中\t206758.23\t5\r\n贵州\t贵州六盘水\t746755772\t7/21/69\t女\t2015/4/17\t大专\t206579\t4\r\n湖北\t湖北十堰\t167971152\t4/17/69\t女\t2007/10/5\t大专\t206343.69\t21\r\n广西\t广西玉林\t701557542\t8/20/77\t男\t2014/12/31\t大专\t206118\t2\r\n佛山\t佛山顺德龙江\t8902732\t4/18/64\t女\t2003/10/1\t高中\t205955.5\t8\r\n青岛\t青岛一支\t427164362\t2/14/76\t女\t2011/6/17\t大专\t205949.17\t14\r\n湖南\t湖南郴州\t5064986472\t9/28/79\t女\t2016/2/4\t大专\t205783.5\t4\r\n河南\t河南周口\t356331472\t11/10/63\t女\t2010/1/5\t本科\t205441.64\t15\r\n山西\t山西临汾\t760544152\t8/24/83\t女\t2015/6/3\t高中\t205437.9\t2\r\n山西\t山西运城\t749179102\t3/20/70\t女\t2015/4/25\t高中\t205346\t2\r\n安徽\t安徽合肥\t691343512\t10/8/80\t男\t2014/12/16\t中专\t205000\t0\r\n四川\t四川青羊\t80865152\t4/6/84\t女\t2006/3/31\t大专\t204967\t1\r\n河南\t河南郑州\t697913552\t7/21/91\t女\t2014/12/24\t高中\t204637\t1\r\n大连\t大连海川\t818999282\t3/5/66\t女\t2015/7/31\t硕士\t204596\t1\r\n江苏\t江苏盐城\t660680902\t12/26/65\t男\t2014/8/23\t大专\t204426.54\t2\r\n湖南\t湖南长沙\t5098499522\t4/6/79\t女\t2016/3/18\t中专\t204318\t1\r\n江西\t江西新余\t399866052\t7/28/70\t女\t2010/10/11\t高中\t204043.26\t0\r\n辽宁\t辽宁沈阳\t280058072\t7/26/70\t女\t2009/2/20\t高中\t204034.3\t3\r\n广西\t广西南宁\t149007302\t3/26/72\t男\t2007/7/11\t大专\t203966\t10\r\n黑龙江\t黑龙江七台河\t241399452\t3/29/74\t女\t2008/7/22\t高中\t203542\t1\r\n湖南\t湖南株洲\t669826262\t3/26/78\t女\t2014/9/17\t高中\t203490.2\t2\r\n大连\t大连明锐\t868815272\t8/9/79\t女\t2015/9/9\t大专\t203417\t1\r\n河南\t河南郑州\t646920582\t3/3/91\t男\t2014/7/22\t本科\t203246.68\t6\r\n陕西\t陕西咸阳\t681992572\t4/30/73\t女\t2014/11/13\t高中\t203100\t0\r\n陕西\t陕西汉中\t620876432\t2/28/78\t女\t2014/3/31\t大专\t203000\t0\r\n福建\t福建厦门\t603707432\t8/27/71\t女\t2014/1/1\t大专\t202901.1\t7\r\n苏州\t苏州张家港\t284842472\t11/1/68\t女\t2009/3/16\t高中\t202769.45\t3\r\n四川\t四川高新\t1628432\t11/5/72\t女\t2002/8/9\t硕士\t202729\t11\r\n湖南\t湖南永州\t5147892462\t1/9/77\t女\t2016/5/26\t中专\t201790.5\t2\r\n黑龙江\t黑龙江哈尔滨\t336753522\t2/21/73\t女\t2009/10/15\t大专\t201458\t1\r\n辽宁\t辽宁本溪\t5134673252\t3/18/79\t男\t2016/5/6\t本科\t201394\t1\r\n河北\t河北石家庄\t5161155152\t1/16/70\t女\t2016/6/3\t本科\t201350\t1\r\n苏州\t苏州张家港\t444115772\t1/4/71\t男\t2011/11/18\t初中\t201094\t1\r\n黑龙江\t黑龙江鸡西\t164415922\t4/25/65\t女\t2007/9/21\t中专\t200702.1\t0\r\n安徽\t安徽马鞍山\t295853022\t2/27/65\t男\t2009/5/1\t高中\t200647.59\t5\r\n河南\t河南郑州\t452027762\t9/10/81\t女\t2012/2/1\t大专\t200042.13\t9\r\n江苏\t江苏南京\t5043156972\t10/30/65\t男\t2015/12/8\t大专\t200000\t0\r\n江西\t江西赣州\t740288872\t8/15/86\t女\t2015/4/10\t大专\t200000\t0\r\n天津\t天津蓟州\t480848072\t11/20/87\t女\t2012/10/22\t大专\t200000\t0\r\n江西\t江西南昌\t5150658312\t5/9/75\t男\t2016/5/27\t高中\t200000\t0\r\n山西\t山西朔州\t5152996282\t5/7/78\t女\t2016/5/30\t高中\t200000\t0\r\n山东\t山东济宁\t615887422\t12/31/94\t男\t2014/3/20\t高中\t199563.15\t6\r\n四川\t四川内江\t739684682\t8/9/66\t女\t2015/4/9\t大专\t199390.31\t20\r\n山东\t山东济宁\t5077549322\t3/29/89\t男\t2016/3/7\t中专\t199240.5\t6\r\n山东\t山东济南\t55025882\t3/23/78\t女\t2005/8/17\t中专\t199179.14\t14\r\n重庆\t重庆渝中\t163377952\t8/27/71\t男\t2007/9/17\t大专\t198637.26\t18\r\n山东\t山东滨州\t274660542\t2/16/71\t女\t2009/1/1\t中专\t198285.97\t7\r\n广东\t广东广州\t321769742\t12/23/72\t男\t2009/8/3\t高中\t198153.4\t3\r\n四川\t四川青羊\t623831512\t8/19/69\t女\t2014/4/18\t本科\t197178.72\t0\r\n四川\t四川青羊\t168962\t6/22/73\t女\t2001/12/31\t大专\t195772.16\t5\r\n山东\t山东菏泽\t323785252\t2/29/64\t女\t2009/8/12\t大专\t195480.24\t12\r\n山东\t山东威海\t305414982\t7/9/72\t女\t2009/6/9\t高中\t195408.35\t7\r\n山东\t山东临沂\t33842342\t4/13/71\t男\t2005/3/15\t大专\t195101.07\t13\r\n北京\t北京海淀\t390176932\t6/4/88\t女\t2010/8/10\t本科\t195083.1\t6\r\n辽宁\t辽宁盘锦\t521720242\t10/24/53\t女\t2013/5/22\t大专\t194849.53\t7\r\n浙江\t浙江温州\t222138462\t7/19/75\t女\t2008/5/8\t高中\t194737.49\t4\r\n江西\t江西赣州\t65237542\t10/2/75\t女\t2005/10/20\t本科\t194465.63\t11\r\n山东\t山东日照\t833723462\t2/15/70\t女\t2015/8/7\t中专\t194447.5\t11\r\n四川\t四川绵阳\t23643662\t3/3/78\t女\t2004/11/23\t大专\t193894.11\t19\r\n四川\t四川青羊\t89620412\t11/2/72\t女\t2006/6/30\t大专\t193520.22\t12\r\n北京\t北京良乡\t690243712\t3/8/64\t女\t2014/12/11\t高中\t193216.84\t6\r\n山东\t山东烟台\t482136702\t11/26/78\t男\t2012/11/2\t初中\t193142.87\t4\r\n浙江\t浙江杭州\t645606962\t2/24/88\t男\t2014/7/7\t大专\t192903\t4\r\n山东\t山东烟台\t612010492\t8/13/73\t女\t2014/3/10\t中专\t192877.01\t34\r\n浙江\t浙江湖州\t422951352\t5/19/71\t女\t2011/5/3\t高中\t192505.59\t8\r\n山东\t山东烟台\t733196292\t12/20/75\t女\t2015/4/1\t本科\t192253\t9\r\n辽宁\t辽宁营口\t5012937352\t3/6/76\t女\t2015/11/8\t大专\t192243.2\t3\r\n吉林\t吉林长春\t610843422\t4/12/61\t女\t2014/3/3\t大专\t191762.41\t2\r\n山东\t山东东营\t237638642\t10/6/77\t女\t2008/7/1\t中专\t191700.71\t7\r\n四川\t四川高新\t5036621692\t3/6/83\t女\t2015/11/30\t本科\t191347\t5\r\n四川\t四川高新\t299728552\t9/13/71\t男\t2009/5/15\t本科\t190760.51\t10\r\n山东\t山东烟台\t24424132\t9/22/62\t女\t2004/11/29\t本科\t190664.41\t37\r\n黑龙江\t黑龙江齐齐哈尔\t73058672\t6/23/68\t女\t2006/1/4\t大专\t190601.81\t13\r\n浙江\t浙江杭州\t4766902\t12/5/64\t女\t2003/6/20\t本科\t189699.41\t10\r\n山东\t山东淄博\t782305922\t10/2/77\t女\t2015/7/6\t高中\t189673\t11\r\n苏州\t苏州新区\t522595612\t10/5/80\t男\t2013/5/24\t中专\t189662.09\t0\r\n四川\t四川青羊\t8298542\t7/11/72\t女\t2003/10/9\t大专\t189388.37\t8\r\n北京\t北京海淀\t124798612\t12/14/83\t女\t2007/4/1\t本科\t189182.07\t13\r\n重庆\t重庆永川\t5154737782\t6/2/66\t女\t2016/5/31\t大专\t188680\t1\r\n云南\t云南昆明\t485776922\t3/3/80\t女\t2012/11/26\t大专\t188654.24\t9\r\n黑龙江\t黑龙江哈尔滨\t57414042\t12/18/65\t女\t2005/9/5\t本科\t188538.25\t31\r\n江西\t江西南昌\t18892062\t10/29/76\t女\t2004/9/16\t高中\t188509.34\t26\r\n河南\t河南郑州\t672055862\t4/30/86\t男\t2014/9/24\t本科\t188159\t21\r\n四川\t四川高新\t478702762\t3/20/86\t女\t2012/9/24\t大专\t188036.5\t12\r\n湖北\t湖北宜昌\t561103912\t4/17/85\t女\t2013/6/28\t中专\t187801.35\t0\r\n四川\t四川青羊\t707804482\t2/16/74\t女\t2015/2/2\t大专\t187759.04\t0\r\n辽宁\t辽宁沈阳\t5471862\t11/11/64\t男\t2003/7/1\t大专\t187727.4\t0\r\n山东\t山东滨州\t273901292\t2/23/76\t女\t2009/1/1\t中专\t187529.69\t2\r\n河南\t河南洛阳\t197601232\t9/7/70\t女\t2008/1/2\t大专\t186825.84\t13\r\n四川\t四川高新\t34336552\t12/7/81\t女\t2005/3/18\t大专\t186810.96\t0\r\n新疆\t新疆库尔勒\t427336172\t8/26/81\t男\t2011/6/20\t大专\t186544.19\t2\r\n四川\t四川高新\t117964232\t5/30/81\t女\t2007/1/25\t大专\t186456.2\t11\r\n浙江\t浙江嘉兴\t498604512\t6/12/89\t女\t2013/1/6\t中专\t186384.03\t11\r\n山西\t山西临汾\t5094428222\t8/31/87\t女\t2016/3/15\t大专\t186000\t0\r\n深圳\t深圳福田第二\t275539682\t8/15/63\t女\t2009/1/4\t大专\t185215.88\t9\r\n青岛\t青岛开发区\t527128652\t8/2/84\t女\t2013/6/4\t大专\t185147.4\t8\r\n四川\t四川成都\t76051022\t12/3/70\t女\t2006/2/24\t高中\t184946.06\t7\r\n深圳\t深圳福田\t505000372\t5/25/70\t女\t2013/2/28\t大专\t184889.36\t5\r\n四川\t四川青羊\t275266132\t6/2/74\t女\t2009/1/3\t本科\t184766.69\t6\r\n广东\t广东中山\t430894742\t6/9/74\t女\t2011/7/19\t大专\t184725.5\t4\r\n四川\t四川高新\t604197872\t10/28/79\t女\t2014/1/3\t本科\t184689.45\t5\r\n湖北\t湖北武汉\t70093682\t7/3/72\t女\t2005/12/20\t本科\t184366.54\t29\r\n苏州\t苏州张家港\t627273962\t12/20/82\t女\t2014/5/8\t大专\t184160\t6\r\n大连\t大连银洲\t622464302\t4/23/75\t女\t2014/4/8\t大专\t183761.42\t14\r\n河南\t河南平顶山\t777172462\t8/24/73\t女\t2015/6/29\t高中\t183742.78\t5\r\n山东\t山东济宁\t43107862\t8/28/69\t女\t2005/5/16\t大专\t182633.43\t6\r\n山西\t山西太原\t209789732\t11/2/72\t女\t2008/3/24\t本科\t182609.15\t9\r\n深圳\t深圳罗湖\t400030322\t4/11/57\t女\t2010/10/13\t本科\t182600.19\t2\r\n湖南\t湖南郴州\t338866032\t9/25/75\t男\t2009/10/1\t大专\t182282.73\t6\r\n辽宁\t辽宁辽阳\t399543922\t2/19/70\t女\t2010/10/9\t本科\t182040.58\t17\r\n福建\t福建福州\t556590692\t6/23/76\t女\t2013/6/27\t高中\t181970.26\t9\r\n山东\t山东淄博\t143328682\t9/23/67\t女\t2007/6/23\t大专\t181329.39\t10\r\n山东\t山东日照\t63723782\t8/19/74\t女\t2005/10/31\t大专\t181182.06\t7\r\n佛山\t佛山顺德龙江\t389479512\t7/22/79\t女\t2010/8/4\t高中\t181114.54\t15\r\n浙江\t浙江温州\t204678462\t3/10/78\t女\t2008/2/23\t本科\t180896.67\t17\r\n山东\t山东淄博\t505173852\t2/11/77\t女\t2013/3/2\t高中\t180820.79\t22\r\n河南\t河南郑州\t5042552\t10/25/68\t男\t2003/6/27\t本科\t180655.72\t14\r\n四川\t四川绵阳\t360031152\t5/16/75\t女\t2010/2/2\t大专\t180557.33\t6\r\n河南\t河南郑州\t185892562\t2/14/61\t女\t2007/12/1\t大专\t180551.48\t9\r\n北京\t北京平谷\t9425972\t7/19/66\t女\t2003/12/18\t大专\t180543.1\t10\r\n辽宁\t辽宁丹东\t502420312\t3/29/66\t女\t2013/2/1\t中专\t180422.3\t4\r\n陕西\t陕西西安\t659708532\t12/30/77\t女\t2014/8/21\t大专\t180160.26\t4\r\n四川\t四川高新\t5095919502\t1/26/84\t女\t2016/3/16\t本科\t180014\t4\r\n湖北\t湖北武汉\t136826612\t2/3/74\t男\t2007/5/24\t大专\t180001.53\t6\r\n四川\t四川成都\t5214302082\t9/16/78\t女\t2016/8/12\t高中\t179908\t3\r\n山东\t山东济南\t5126081032\t4/26/68\t女\t2016/4/21\t中专\t179874.5\t7\r\n湖北\t湖北武汉\t20883282\t4/25/70\t男\t2004/10/16\t本科\t179394.99\t13\r\n浙江\t浙江杭州\t227645272\t4/24/74\t女\t2008/6/2\t高中\t179348.22\t10\r\n重庆\t重庆巴南\t812741732\t3/17/87\t女\t2015/7/30\t高中\t179066\t6\r\n安徽\t安徽淮南\t51231302\t9/24/73\t女\t2005/6/1\t大专\t179049.43\t8\r\n河北\t河北石家庄\t73290912\t2/18/70\t女\t2006/1/6\t大专\t179044.32\t29\r\n深圳\t深圳罗湖\t284674432\t4/1/64\t女\t2009/3/13\t大专\t178535.33\t2\r\n广西\t广西南宁\t5167368622\t3/5/69\t女\t2016/6/8\t大专\t178444.6\t23\r\n山东\t山东德州\t479804932\t1/21/81\t女\t2012/9/29\t中专\t178438.07\t5\r\n湖北\t湖北襄阳\t845875122\t10/4/78\t女\t2015/8/10\t大专\t178183\t42\r\n山东\t山东潍坊\t39215582\t3/8/71\t男\t2005/4/1\t中专\t178118.1\t7\r\n北京\t北京海淀\t824267982\t2/21/69\t女\t2015/8/2\t本科\t178000\t0\r\n广东\t广东江门\t227872072\t5/24/75\t女\t2008/6/2\t大专\t177859.45\t15\r\n福建\t福建厦门\t193141602\t9/13/72\t女\t2007/12/24\t高中\t177725.56\t13\r\n山东\t山东济南\t316281082\t7/5/79\t女\t2009/7/21\t大专\t177508.3\t16\r\n上海\t上海陆家嘴\t638960442\t1/1/70\t\t2014/6/20\t本科\t177470.5\t1954\r\n河北\t河北唐山\t329311182\t3/27/74\t女\t2009/9/7\t高中\t176894.17\t9\r\n浙江\t浙江杭州\t19708672\t11/7/67\t女\t2004/9/27\t大专\t176587.8\t17\r\n四川\t四川高新\t190775362\t8/20/82\t女\t2007/12/18\t大专\t176063.63\t11\r\n山西\t山西太原\t215364512\t1/10/64\t女\t2008/4/9\t中专\t175483.48\t5\r\n江苏\t江苏泰州\t53144642\t9/5/65\t女\t2005/7/28\t大专\t175373.22\t13\r\n四川\t四川绵阳\t7799862\t8/27/76\t女\t2003/9/17\t本科\t175136\t9\r\n湖北\t湖北武汉\t20825222\t6/1/74\t男\t2004/10/14\t大专\t174923.19\t2\r\n河南\t河南郑州\t134457302\t9/9/69\t女\t2007/5/9\t大专\t174740.17\t6\r\n河南\t河南安阳\t207515052\t2/27/70\t女\t2008/3/14\t高中\t174542.24\t9\r\n大连\t大连银洲\t633369612\t9/17/70\t女\t2014/6/5\t本科\t174473.01\t8\r\n江苏\t江苏无锡\t866320902\t2/9/85\t女\t2015/9/2\t大专\t174158\t2\r\n佛山\t佛山禅城\t446184872\t4/29/72\t女\t2011/12/6\t高中\t174128.94\t11\r\n江西\t江西南昌\t605982812\t6/15/66\t女\t2014/1/17\t高中\t174050\t3\r\n浙江\t浙江杭州\t611520052\t1/16/73\t女\t2014/3/6\t大专\t173745.91\t6\r\n新疆\t新疆乌鲁木齐\t238822462\t4/24/58\t女\t2008/6/1\t高中\t173521.7\t1\r\n江苏\t江苏泰州\t151291892\t4/4/70\t女\t2007/7/20\t高中\t173397.83\t7\r\n河南\t河南安阳\t214626752\t5/18/66\t女\t2008/4/3\t高中\t173051\t11\r\n云南\t云南昆明\t372409882\t2/16/78\t男\t2010/5/1\t中专\t172835.75\t3\r\n山东\t山东枣庄\t5160153442\t8/19/74\t女\t2016/6/3\t中专\t172488.73\t2\r\n湖北\t湖北武汉\t591237142\t10/1/79\t女\t2013/12/13\t中专\t171972.56\t12\r\n甘肃\t甘肃酒泉\t516905412\t2/5/73\t女\t2013/4/24\t高中\t171845.87\t6\r\n浙江\t浙江温州\t133466782\t8/30/87\t女\t2007/5/1\t高中\t171635.95\t16\r\n四川\t四川青羊\t1604842\t8/29/71\t女\t2002/8/7\t大专\t171632.96\t5\r\n四川\t四川青羊\t623414482\t6/2/75\t女\t2014/4/15\t本科\t171574.74\t18\r\n北京\t北京海淀\t425099032\t10/23/89\t女\t2011/6/1\t高中\t171406.9\t15\r\n大连\t大连海川\t193584592\t7/13/75\t女\t2007/12/25\t大专\t170982.33\t21\r\n佛山\t佛山顺德龙江\t290026182\t11/27/80\t女\t2009/4/1\t大专\t170950.95\t6\r\n四川\t四川高新\t464585842\t1/6/70\t女\t2012/5/14\t高中\t170664.79\t5\r\n佛山\t佛山顺德龙江\t562366312\t4/15/71\t女\t2013/6/29\t中专\t170501.99\t9\r\n北京\t北京海淀\t130002142\t4/27/81\t女\t2007/4/13\t本科\t170360.74\t17\r\n天津\t天津蓟州\t5064781602\t5/25/88\t女\t2016/2/3\t大专\t170000\t0\r\n深圳\t深圳福田第二\t468023552\t10/25/74\t女\t2012/6/14\t本科\t170000\t0\r\n四川\t四川青羊\t3130882\t1/9/74\t女\t2003/3/17\t大专\t169903.43\t7\r\n四川\t四川青羊\t554641482\t1/7/77\t女\t2013/6/27\t本科\t169544.42\t6\r\n上海\t上海黄浦\t1072392\t6/4/69\t男\t2002/4/28\t大专\t169532.27\t1\r\n四川\t四川青羊\t32293412\t2/22/64\t女\t2005/2/28\t大专\t169475.8\t7\r\n江苏\t江苏南京\t5063683792\t8/1/78\t女\t2016/1/29\t高中\t169384.8\t2\r\n四川\t四川内江\t9383962\t4/15/71\t女\t2003/12/15\t大专\t169251.23\t11\r\n辽宁\t辽宁盘锦\t5067462222\t11/13/78\t男\t2016/2/23\t中专\t169176\t3\r\n黑龙江\t黑龙江哈尔滨\t30221242\t2/5/74\t女\t2005/1/28\t本科\t168872.77\t12\r\n黑龙江\t黑龙江牡丹江\t5046024322\t6/11/71\t女\t2015/12/14\t本科\t168784\t15\r\n河南\t河南郑州\t319756332\t7/7/66\t女\t2009/7/29\t大专\t168695.49\t12\r\n四川\t四川青羊\t97922\t2/14/68\t女\t2001/12/31\t大专\t168613.16\t9\r\n浙江\t浙江杭州\t465805532\t10/3/73\t女\t2012/5/25\t中专\t168594.67\t27\r\n江苏\t江苏徐州\t613600732\t1/20/71\t男\t2014/3/14\t大专\t168510.17\t18\r\n江苏\t江苏无锡\t38938262\t8/21/69\t女\t2005/4/18\t高中\t168377.81\t8\r\n四川\t四川高新\t5199463852\t5/29/84\t女\t2016/8/1\t本科\t167799\t3\r\n福建\t福建厦门\t116492482\t4/5/71\t女\t2007/1/21\t本科\t167784.71\t8\r\n北京\t北京海淀\t3187272\t1/24/73\t男\t2003/4/1\t本科\t167767\t9\r\n陕西\t陕西西安\t157108822\t12/7/73\t女\t2007/8/1\t大专\t167512.52\t10\r\n湖北\t湖北十堰\t487182102\t5/12/74\t女\t2012/12/3\t高中\t167305.9\t23\r\n上海\t上海陆家嘴\t8407822\t10/16/78\t女\t2003/10/16\t大专\t167304\t21\r\n安徽\t安徽合肥\t5126611382\t6/1/80\t女\t2016/4/22\t中专\t167300\t13\r\n云南\t云南昆明\t658174952\t11/24/82\t男\t2014/8/19\t大专\t167287.37\t1\r\n四川\t四川高新\t5005569922\t11/21/75\t女\t2015/10/26\t大专\t167261\t3\r\n黑龙江\t黑龙江哈尔滨\t25970962\t2/26/72\t女\t2004/12/14\t大专\t167250.92\t21\r\n黑龙江\t黑龙江哈尔滨\t846128852\t8/14/74\t女\t2015/8/10\t大专\t167207\t3\r\n江西\t江西新余\t122029022\t12/18/72\t女\t2007/3/7\t中专\t167163.05\t9\r\n大连\t大连明锐\t5350302\t2/22/75\t女\t2003/7/1\t本科\t167047.49\t6\r\n北京\t北京东城\t704333972\t9/26/77\t女\t2015/1/15\t硕士\t166476\t4\r\n山东\t山东济宁\t43140662\t2/18/68\t女\t2005/5/16\t中专\t166342.4\t15\r\n山东\t山东日照\t184337492\t4/25/71\t女\t2007/11/25\t高中\t166090.54\t10\r\n浙江\t浙江嘉兴\t668743212\t12/19/77\t女\t2014/9/12\t大专\t166088.37\t14\r\n广东\t广东珠海\t396866862\t9/18/72\t女\t2010/9/21\t大专\t165754.33\t4\r\n浙江\t浙江杭州\t454378652\t1/6/81\t女\t2012/3/5\t本科\t165684.34\t2\r\n广东\t广东汕头\t169794332\t2/24/73\t女\t2007/10/18\t大专\t165628.34\t11\r\n四川\t四川高新\t40925712\t3/30/82\t女\t2005/4/29\t本科\t165520.83\t21\r\n北京\t北京良乡\t194234562\t6/22/72\t女\t2007/12/25\t高中\t165350.41\t10\r\n山东\t山东济南\t443833982\t3/31/77\t女\t2011/11/14\t本科\t165321.59\t9\r\n浙江\t浙江嘉兴\t5145995042\t12/25/70\t女\t2016/5/25\t高中\t165196\t17\r\n云南\t云南昆明\t269826592\t3/13/83\t女\t2008/12/1\t本科\t164991\t3\r\n四川\t四川高新\t2554052\t11/29/65\t女\t2003/1/21\t大专\t164911.15\t24\r\n河南\t河南郑州\t300307482\t5/26/74\t女\t2009/5/18\t中专\t164658.57\t1\r\n山东\t山东威海\t696698332\t7/2/87\t女\t2014/12/23\t大专\t164640\t17\r\n湖北\t湖北荆州\t664052042\t10/5/76\t女\t2014/8/29\t大专\t164419\t4\r\n青岛\t青岛一支\t465397712\t11/20/81\t女\t2012/5/22\t本科\t164112.63\t8\r\n北京\t北京海淀\t365640402\t10/24/85\t男\t2010/4/1\t本科\t163403.4\t9\r\n四川\t四川高新\t738613912\t6/26/80\t女\t2015/4/9\t大专\t163200\t2\r\n广东\t广东茂名\t412636552\t7/11/55\t女\t2011/1/1\t大专\t163168.13\t5\r\n广东\t广东广州\t575322302\t9/18/86\t女\t2013/8/30\t大专\t163144.4\t10\r\n山东\t山东烟台\t127071622\t6/14/71\t女\t2007/3/25\t高中\t163140.64\t16\r\n山东\t山东烟台\t172711172\t7/27/75\t女\t2007/10/25\t大专\t163135.03\t12\r\n北京\t北京东城\t46504262\t2/6/75\t女\t2005/6/7\t大专\t162841.22\t13\r\n山东\t山东威海\t707217042\t8/1/83\t女\t2015/1/29\t高中\t162816.1\t17\r\n四川\t四川高新\t708763872\t5/26/75\t女\t2015/2/10\t大专\t162799.5\t16\r\n辽宁\t辽宁铁岭\t449945682\t8/16/75\t女\t2012/1/1\t高中\t162747.13\t16\r\n湖南\t湖南长沙\t178809192\t9/12/75\t女\t2007/11/9\t大专\t162706.2\t7\r\n四川\t四川眉山\t151069562\t10/30/73\t女\t2007/7/19\t高中\t162616\t2\r\n山东\t山东德州\t286107242\t5/2/77\t女\t2009/3/20\t中专\t162615.45\t11\r\n黑龙江\t黑龙江哈尔滨\t363753022\t11/12/62\t女\t2010/3/15\t本科\t162456\t10\r\n广西\t广西玉林\t612526892\t1/24/84\t女\t2014/3/11\t本科\t162435.5\t12\r\n北京\t北京海淀\t452905232\t9/22/86\t男\t2012/3/1\t本科\t162372\t2\r\n浙江\t浙江杭州\t5192817032\t5/11/86\t女\t2016/7/26\t大专\t162346.8\t13\r\n四川\t四川青羊\t69005192\t9/7/73\t女\t2005/12/10\t大专\t162304.97\t3\r\n四川\t四川高新\t570028612\t7/19/64\t男\t2013/7/22\t本科\t162285.88\t3\r\n江苏\t江苏扬州\t26936222\t11/22/72\t女\t2004/12/24\t中专\t162277.32\t6\r\n四川\t四川高新\t432554352\t12/23/74\t女\t2011/8/2\t本科\t162073.71\t20\r\n四川\t四川高新\t5033972782\t4/14/72\t女\t2015/11/27\t本科\t161935\t8\r\n大连\t大连明锐\t5152821322\t8/9/76\t男\t2016/5/30\t大专\t161931\t4\r\n浙江\t浙江杭州\t412401242\t3/4/69\t女\t2010/12/31\t大专\t161817.04\t5\r\n河北\t河北唐山\t461938512\t5/2/79\t女\t2012/4/12\t高中\t161552.65\t10\r\n黑龙江\t黑龙江牡丹江\t45061542\t5/1/71\t女\t2005/6/1\t大专\t161247.36\t10\r\n四川\t四川青羊\t76704062\t10/17/81\t男\t2006/2/28\t大专\t160879\t2\r\n山东\t山东济南\t15855332\t3/29/73\t女\t2004/7/1\t大专\t160428.83\t3\r\n湖南\t湖南长沙\t733915902\t12/10/90\t男\t2015/4/2\t本科\t160340.7\t0\r\n山西\t山西太原\t196026342\t4/22/72\t女\t2008/1/1\t高中\t160313.3\t14\r\n北京\t北京海淀\t492049822\t6/10/88\t女\t2013/1/1\t本科\t160177.74\t9\r\n广东\t广东广州\t258104942\t11/15/84\t女\t2008/10/21\t大专\t159980.41\t16\r\n陕西\t陕西咸阳\t456040632\t4/30/70\t女\t2012/3/12\t高中\t159925.5\t1\r\n辽宁\t辽宁阜新\t175178182\t12/4/65\t女\t2007/11/3\t高中\t159718.73\t3\r\n浙江\t浙江杭州\t5360212\t3/11/69\t女\t2003/7/3\t高中\t159708.21\t10\r\n吉林\t吉林四平\t572130512\t4/14/72\t男\t2013/8/2\t大专\t159687\t6\r\n辽宁\t辽宁营口\t675897622\t12/14/73\t男\t2014/10/7\t本科\t159247.13\t10\r\n广东\t广东广州\t731123422\t12/16/80\t女\t2015/3/31\t本科\t159174.5\t39\r\n四川\t四川青羊\t250612\t8/10/75\t女\t2001/12/31\t本科\t159112.12\t11\r\n山东\t山东济南\t143691422\t3/21/79\t女\t2007/6/25\t中专\t158754.47\t16\r\n山东\t山东威海\t855916642\t5/17/69\t女\t2015/8/10\t中专\t158747.5\t6\r\n广东\t广东惠州\t18389612\t3/6/63\t男\t2004/9/2\t本科\t158309.9\t6\r\n湖北\t湖北武汉\t5072089212\t9/14/76\t女\t2016/3/2\t硕士\t158303\t3\r\n黑龙江\t黑龙江牡丹江\t5220151092\t4/15/64\t女\t2016/8/19\t大专\t158211\t2\r\n湖北\t湖北武汉\t20877142\t3/15/72\t男\t2004/10/16\t大专\t158195.33\t11\r\n江西\t江西南昌\t455535812\t12/30/74\t女\t2012/3/9\t高中\t158035\t11\r\n四川\t四川青羊\t882399042\t6/12/80\t女\t2015/10/9\t本科\t157465\t8\r\n深圳\t深圳福田\t106574892\t11/12/69\t女\t2006/12/7\t大专\t157291.21\t10\r\n河南\t河南洛阳\t57468332\t6/8/67\t女\t2005/9/5\t大专\t157216.98\t5\r\n浙江\t浙江湖州\t249478782\t1/29/70\t女\t2008/9/2\t大专\t156926.74\t8\r\n辽宁\t辽宁阜新\t714669292\t11/28/71\t女\t2015/3/20\t大专\t156832\t3\r\n山东\t山东威海\t199895732\t9/21/67\t女\t2008/1/13\t大专\t156699.05\t7\r\n黑龙江\t黑龙江哈尔滨\t429856772\t9/6/71\t女\t2011/6/30\t本科\t156377.2\t8\r\n浙江\t浙江嘉兴\t576959022\t9/20/79\t女\t2013/9/6\t大专\t156279.35\t12\r\n山西\t山西朔州\t583789632\t9/5/63\t女\t2013/11/12\t大专\t156224.5\t5\r\n吉林\t吉林吉林\t5201252432\t12/28/71\t男\t2016/8/2\t大专\t155762.8\t2\r\n北京\t北京东城\t120998862\t11/23/76\t女\t2007/3/1\t大专\t155596.08\t15\r\n山东\t山东济南\t235984202\t12/18/79\t女\t2008/6/25\t本科\t155537.21\t12\r\n云南\t云南昆明\t343298302\t7/10/75\t女\t2009/11/16\t大专\t155521.82\t0\r\n山东\t山东威海\t514048032\t4/22/72\t女\t2013/4/3\t中专\t155406.14\t10\r\n山东\t山东威海\t429915532\t4/28/81\t女\t2011/6/30\t高中\t155158.19\t3\r\n江苏\t江苏泰州\t375723932\t12/17/68\t男\t2010/5/18\t高中\t154971.36\t3\r\n佛山\t佛山顺德龙江\t281572802\t3/13/79\t女\t2009/3/1\t中专\t154889.69\t13\r\n辽宁\t辽宁营口\t9995692\t11/15/67\t女\t2004/1/30\t本科\t154882.47\t10\r\n四川\t四川高新\t5101017922\t1/4/72\t男\t2016/3/21\t本科\t154832.5\t13\r\n苏州\t苏州张家港\t457800312\t5/10/63\t女\t2012/3/21\t初中\t154819.73\t7\r\n北京\t北京良乡\t466952782\t8/26/76\t女\t2012/6/4\t大专\t154800.78\t27\r\n大连\t大连明锐\t608956042\t7/10/67\t女\t2014/2/8\t本科\t154785\t4\r\n陕西\t陕西西安\t5019027512\t10/23/68\t女\t2015/11/15\t本科\t154703\t3\r\n黑龙江\t黑龙江七台河\t847957202\t12/24/77\t女\t2015/8/10\t高中\t154590\t1\r\n深圳\t深圳南山\t523794782\t5/7/69\t女\t2013/5/27\t大专\t154554.55\t0\r\n湖北\t湖北襄阳\t340669392\t9/5/82\t男\t2009/11/5\t大专\t154500.91\t13\r\n福建\t福建福州\t362702072\t12/31/79\t女\t2010/3/4\t中专\t154444.52\t16\r\n山东\t山东烟台\t772574522\t9/5/80\t女\t2015/6/25\t大专\t154252\t3\r\n佛山\t佛山顺德龙江\t115370492\t12/1/70\t女\t2007/1/15\t高中\t154209.64\t2\r\n陕西\t陕西宝鸡\t717631212\t3/1/71\t女\t2015/3/23\t高中\t154155.2\t8\r\n黑龙江\t黑龙江齐齐哈尔\t57456052\t4/4/68\t女\t2005/9/5\t大专\t153903.46\t8\r\n四川\t四川青羊\t496122152\t10/21/70\t男\t2012/12/29\t本科\t153839.67\t10\r\n山西\t山西忻州\t591152422\t11/21/66\t女\t2013/12/13\t大专\t153579.82\t9\r\n北京\t北京海淀\t523528072\t3/20/89\t女\t2013/5/31\t本科\t153567.5\t10\r\n山东\t山东威海\t127250272\t10/25/68\t女\t2007/3/25\t大专\t153489.14\t14\r\n浙江\t浙江台州\t77977342\t10/19/73\t女\t2006/3/1\t高中\t153452.46\t21\r\n深圳\t深圳罗湖\t5785201502\t4/23/74\t女\t2018/6/26\t本科\t153440.69\t0\r\n山东\t山东烟台\t438457672\t8/16/77\t女\t2011/9/20\t中专\t153217.1\t36\r\n黑龙江\t黑龙江佳木斯\t5176421332\t8/20/67\t男\t2016/6/20\t本科\t153205\t1\r\n四川\t四川青羊\t61608902\t7/17/72\t女\t2005/10/11\t高中\t153066.6\t4\r\n苏州\t苏州张家港\t261870222\t10/5/70\t女\t2008/11/7\t大专\t152957.93\t7\r\n湖北\t湖北武汉\t230505722\t7/8/76\t女\t2008/6/11\t大专\t152658.1\t14\r\n湖北\t湖北襄阳\t570100352\t7/26/86\t男\t2013/7/22\t中专\t152549\t11\r\n浙江\t浙江杭州\t216639192\t2/16/74\t女\t2008/4/16\t中专\t152548.68\t8\r\n湖北\t湖北荆门\t381426142\t2/8/68\t女\t2010/6/1\t大专\t152126.01\t7\r\n陕西\t陕西西安\t398132332\t3/15/75\t女\t2010/10/1\t本科\t152049.43\t5\r\n四川\t四川高新\t13414282\t3/3/75\t女\t2004/5/9\t高中\t152024.86\t11\r\n湖北\t湖北武汉\t5044868492\t6/12/79\t女\t2015/12/11\t本科\t151900.2\t16\r\n宁波\t宁波象山\t365205922\t11/19/69\t女\t2010/3/22\t高中\t151779.52\t7\r\n河南\t河南南阳\t92585402\t3/30/59\t女\t2006/8/1\t高中\t151752.25\t11\r\n福建\t福建龙岩\t319383682\t9/12/69\t女\t2009/7/28\t高中\t151742.9\t1\r\n河南\t河南郑州\t139919032\t8/8/74\t女\t2007/6/14\t大专\t151654.35\t8\r\n四川\t四川绵阳\t7768462\t4/2/70\t女\t2003/9/17\t本科\t151582.82\t7\r\n山东\t山东济南\t5200682\t4/20/76\t女\t2003/7/1\t大专\t151498.33\t12\r\n青岛\t青岛一支\t4665162\t9/17/61\t女\t2003/6/18\t大专\t151447.35\t12\r\n青岛\t青岛即墨\t5123801082\t1/10/77\t男\t2016/4/18\t大专\t151350\t1\r\n辽宁\t辽宁盘锦\t9736792\t3/3/78\t女\t2004/1/9\t本科\t151253.88\t13\r\n浙江\t浙江杭州\t848360552\t9/6/74\t女\t2015/8/10\t高中\t151109.69\t7\r\n青岛\t青岛一支\t4639202\t1/27/65\t女\t2003/6/18\t大专\t151004.53\t15\r\n安徽\t安徽淮南\t51108342\t6/15/57\t女\t2005/6/1\t高中\t150924.05\t8\r\n云南\t云南昆明\t282270922\t5/18/77\t男\t2009/3/3\t大专\t150876.03\t8\r\n福建\t福建龙岩\t714879342\t4/5/78\t女\t2015/3/20\t高中\t150791.2\t28\r\n河北\t河北沧州\t176395772\t7/9/55\t女\t2007/11/5\t大专\t150603.91\t0\r\n苏州\t苏州张家港\t731636752\t4/14/78\t女\t2015/3/31\t高中\t150511\t5\r\n黑龙江\t黑龙江哈尔滨\t317233632\t5/2/71\t女\t2009/7/24\t大专\t150484.8\t11\r\n北京\t北京平谷\t133090092\t11/18/74\t男\t2007/5/1\t中专\t150270.78\t18\r\n四川\t四川青羊\t336343332\t8/17/57\t女\t2009/10/12\t高中\t150213.8\t15\r\n辽宁\t辽宁葫芦岛\t808196412\t3/9/87\t男\t2015/7/28\t大专\t150000\t0\r\n北京\t北京海淀\t361522022\t8/30/88\t女\t2010/3/1\t本科\t149994.77\t10\r\n山西\t山西吕梁\t456839522\t10/13/84\t女\t2012/3/15\t初中\t149987.97\t0\r\n浙江\t浙江杭州\t18468192\t4/30/81\t女\t2004/9/6\t大专\t149963.83\t10\r\n广西\t广西南宁\t494119622\t7/10/84\t女\t2012/12/25\t大专\t149902.93\t7\r\n深圳\t深圳龙岗\t212723322\t5/20/75\t女\t2008/3/25\t高中\t149518.51\t0\r\n山东\t山东济宁\t569117372\t11/2/70\t女\t2013/7/9\t中专\t149032.01\t7\r\n北京\t北京海淀\t430443242\t9/11/89\t女\t2011/7/12\t高中\t148965.5\t18\r\n河南\t河南郑州\t135311182\t5/9/81\t男\t2007/5/17\t大专\t148768.15\t4\r\n四川\t四川青羊\t208716592\t10/19/86\t女\t2008/3/20\t大专\t148697.77\t4\r\n湖北\t湖北襄阳\t77773432\t6/15/77\t女\t2006/3/11\t高中\t148574.62\t29\r\n山东\t山东烟台\t171747312\t4/9/69\t女\t2007/10/25\t大专\t148380.15\t7\r\n江西\t江西抚州\t298012282\t11/10/72\t女\t2009/5/7\t高中\t147884.63\t3\r\n北京\t北京海淀\t5147908802\t11/19/89\t女\t2016/5/26\t大专\t147867.3\t2\r\n北京\t北京东城\t583250342\t8/10/83\t女\t2013/11/6\t本科\t147836.16\t13\r\n山东\t山东烟台\t142868942\t1/22/71\t女\t2007/6/22\t高中\t147750.19\t5\r\n四川\t四川高新\t71962\t3/21/76\t女\t2001/12/30\t大专\t147708.21\t16\r\n北京\t北京东城\t445444742\t1/14/90\t女\t2011/12/1\t大专\t147573.81\t5\r\n山东\t山东淄博\t295287072\t2/21/77\t女\t2009/4/25\t大专\t147551.38\t9\r\n山东\t山东东营\t270555142\t3/29/66\t女\t2008/12/16\t大专\t147398.64\t5\r\n浙江\t浙江金华\t650098692\t7/19/73\t女\t2014/8/1\t高中\t147357.35\t17\r\n福建\t福建宁德\t477414132\t9/30/85\t女\t2012/9/6\t本科\t147309.04\t10\r\n山东\t山东烟台\t435444532\t6/10/73\t女\t2011/8/25\t中专\t147203.45\t9\r\n江苏\t江苏盐城\t417956202\t4/8/77\t男\t2011/3/16\t初中\t146980.22\t12\r\n江苏\t江苏南京\t626031112\t3/31/77\t女\t2014/4/29\t本科\t146942.98\t16\r\n湖南\t湖南常德\t585798302\t4/11/65\t男\t2013/11/25\t大专\t146908.34\t12\r\n北京\t北京海淀\t370252022\t11/12/86\t女\t2010/5/1\t本科\t146850.73\t6\r\n四川\t四川青羊\t7667692\t6/11/78\t女\t2003/9/17\t大专\t146692.02\t6\r\n陕西\t陕西西安\t354324202\t5/16/72\t女\t2010/1/1\t大专\t146563.36\t3\r\n苏州\t苏州昆山\t5160332972\t2/1/74\t男\t2016/6/3\t中专\t146394\t2\r\n浙江\t浙江杭州\t41048672\t10/3/71\t女\t2005/4/29\t高中\t146354.86\t15\r\n山西\t山西忻州\t656974112\t7/21/64\t女\t2014/8/15\t高中\t146334.81\t7\r\n黑龙江\t黑龙江哈尔滨\t435587312\t3/13/77\t女\t2011/8/25\t大专\t146247\t3\r\n广东\t广东中山\t162817172\t2/26/75\t女\t2007/9/12\t本科\t146142.54\t6\r\n山东\t山东济南\t593156622\t1/29/81\t女\t2013/12/19\t本科\t146112.31\t12\r\n北京\t北京东城\t2619922\t4/9/72\t女\t2003/2/1\t大专\t146018.45\t12\r\n山西\t山西太原\t191130562\t11/21/71\t女\t2007/12/19\t大专\t145492.66\t3\r\n广东\t广东江门\t324357342\t4/18/83\t女\t2009/8/17\t大专\t145481.06\t21\r\n山东\t山东威海\t31855862\t1/28/67\t女\t2005/2/23\t本科\t145469.11\t7\r\n山东\t山东临沂\t221480952\t3/23/71\t女\t2008/5/5\t大专\t145455.6\t10\r\n四川\t四川绵阳\t277876892\t1/1/83\t女\t2009/1/20\t大专\t145422.99\t12\r\n黑龙江\t黑龙江哈尔滨\t117159202\t7/2/80\t女\t2007/1/24\t本科\t145022.88\t15\r\n青岛\t青岛一支\t720521392\t4/9/79\t男\t2015/3/24\t本科\t144950\t9\r\n山东\t山东枣庄\t196519852\t4/2/76\t女\t2008/1/1\t中专\t144824.02\t7\r\n辽宁\t辽宁铁岭\t5077234782\t11/12/74\t女\t2016/3/7\t大专\t144721.6\t1\r\n四川\t四川青羊\t108039802\t9/5/77\t女\t2006/12/18\t大专\t144632.14\t5\r\n宁波\t宁波城区\t5183709972\t7/28/79\t女\t2016/6/26\t大专\t144202.5\t25\r\n天津\t天津市区一支\t619230502\t3/7/86\t女\t2014/3/27\t本科\t144086.05\t14\r\n陕西\t陕西安康\t486139662\t2/19/72\t女\t2012/12/1\t大专\t144082.14\t9\r\n大连\t大连开发区\t134110612\t3/15/76\t女\t2007/5/8\t初中\t143941.1\t9\r\n浙江\t浙江嘉兴\t5198625262\t12/31/69\t女\t2016/8/1\t高中\t143936\t15\r\n四川\t四川绵阳\t181627632\t8/30/75\t女\t2007/11/21\t中专\t143802.84\t8\r\n河北\t河北保定\t379605332\t3/16/65\t女\t2010/6/8\t高中\t143730.32\t15\r\n四川\t四川青羊\t144197912\t7/3/78\t女\t2007/6/25\t大专\t143687.05\t1\r\n广东\t广东中山\t600144392\t2/20/75\t女\t2013/12/30\t大专\t143675.01\t11\r\n天津\t天津市区二支\t312391172\t9/9/71\t女\t2009/7/1\t大专\t143540.13\t4\r\n河南\t河南周口\t214669462\t9/4/70\t女\t2008/4/4\t高中\t143481.58\t6\r\n深圳\t深圳罗湖\t556976322\t10/21/77\t女\t2013/6/27\t本科\t143394.42\t19\r\n青岛\t青岛一支\t191408582\t6/10/73\t男\t2007/12/19\t高中\t143150.31\t15\r\n黑龙江\t黑龙江哈尔滨\t5157795532\t9/30/74\t女\t2016/6/1\t高中\t143115.7\t4\r\n四川\t四川内江\t87053332\t9/5/71\t女\t2006/6/13\t中专\t143038.56\t24\r\n苏州\t苏州常熟\t5165157562\t9/10/94\t女\t2016/6/7\t大专\t142917\t9\r\n深圳\t深圳南山\t399999892\t3/13/76\t女\t2010/10/12\t本科\t142681.65\t1\r\n广西\t广西南宁\t230399512\t10/4/73\t女\t2008/6/11\t高中\t142677.54\t7\r\n广西\t广西南宁\t227187902\t8/20/61\t女\t2008/5/27\t大专\t142512.78\t10\r\n云南\t云南玉溪\t817816162\t11/15/80\t女\t2015/7/31\t大专\t142483.1\t10\r\n黑龙江\t黑龙江牡丹江\t45034882\t4/7/68\t女\t2005/6/1\t高中\t142124.86\t7\r\n山东\t山东济南\t747900652\t5/13/78\t女\t2015/4/22\t大专\t142071.3\t4\r\n云南\t云南昆明\t304332632\t8/20/83\t女\t2009/6/1\t高中\t141997.93\t7\r\n湖北\t湖北荆州\t5142796812\t7/29/68\t女\t2016/5/19\t大专\t141830.5\t11\r\n北京\t北京海淀\t507629282\t9/25/85\t女\t2013/3/19\t大专\t141807.43\t13\r\n广东\t广东惠州\t7197072\t3/8/71\t女\t2003/9/5\t大专\t141792.03\t11\r\n广东\t广东惠州\t7183392\t9/7/70\t女\t2003/8/31\t高中\t141673.06\t1\r\n陕西\t陕西西安\t244200172\t4/12/80\t女\t2008/8/1\t高中\t141616.15\t4\r\n北京\t北京东城\t328776632\t10/23/73\t女\t2009/9/1\t本科\t141591.95\t4\r\n浙江\t浙江杭州\t505016422\t12/4/80\t女\t2013/2/28\t硕士\t141526.39\t10\r\n云南\t云南昆明\t583595632\t2/22/74\t女\t2013/11/11\t本科\t141448.73\t6\r\n吉林\t吉林吉林\t240843412\t7/20/74\t女\t2008/7/18\t本科\t141447.22\t11\r\n辽宁\t辽宁营口\t90755382\t11/11/59\t男\t2006/7/7\t高中\t141393.15\t4\r\n山东\t山东烟台\t446548312\t11/15/74\t女\t2011/12/9\t初中\t141237.47\t8\r\n青岛\t青岛一支\t877183232\t2/3/76\t男\t2015/9/24\t大专\t141000\t0\r\n江西\t江西南昌\t5173171382\t8/16/69\t女\t2016/6/16\t高中\t140835.5\t3\r\n河南\t河南郑州\t187494112\t8/15/68\t女\t2007/12/5\t大专\t140772.22\t21\r\n湖北\t湖北武汉\t132338652\t1/9/74\t男\t2007/4/25\t中专\t140757.2\t5\r\n浙江\t浙江杭州\t12270102\t3/16/69\t女\t2004/4/9\t本科\t140699.39\t7\r\n河南\t河南驻马店\t12336672\t8/3/62\t女\t2004/4/11\t大专\t140524.12\t19\r\n苏州\t苏州张家港\t66952142\t1/11/63\t女\t2005/11/28\t高中\t140427.27\t3\r\n四川\t四川青羊\t702920982\t5/28/72\t女\t2015/1/7\t本科\t140000\t0\r\n苏州\t苏州新区\t882704692\t9/3/74\t男\t2015/10/10\t中专\t140000\t0\r\n江西\t江西宜春\t805145032\t2/23/72\t女\t2015/7/27\t大专\t140000\t0\r\n苏州\t苏州昆山\t731127192\t6/1/77\t女\t2015/3/31\t高中\t139916\t8\r\n福建\t福建龙岩\t5193718142\t11/26/77\t男\t2016/7/27\t高中\t139817.5\t30\r\n四川\t四川巴中\t331383352\t2/18/63\t女\t2009/9/22\t高中\t139602.43\t7\r\n宁波\t宁波宁海\t192653532\t2/11/79\t女\t2007/12/23\t初中\t139559.86\t11\r\n四川\t四川成都\t482626172\t4/13/83\t女\t2012/11/9\t大专\t139494.05\t22\r\n辽宁\t辽宁沈阳\t392867672\t4/27/75\t女\t2010/8/25\t高中\t139408.32\t11\r\n辽宁\t辽宁沈阳\t433451912\t7/4/80\t女\t2011/8/9\t本科\t139011.95\t5\r\n浙江\t浙江金华\t188412192\t4/26/75\t女\t2007/12/10\t高中\t138952.4\t8\r\n陕西\t陕西西安\t579971462\t1/26/83\t女\t2013/9/29\t中专\t138937.6\t6\r\n江西\t江西赣州\t658108382\t11/15/75\t女\t2014/8/18\t本科\t138880.49\t8\r\n山西\t山西太原\t5067538382\t1/16/78\t女\t2016/2/23\t本科\t138863.9\t4\r\n四川\t四川青羊\t272792282\t10/28/79\t男\t2008/12/25\t本科\t138860.3\t17\r\n佛山\t佛山禅城\t508611562\t8/15/84\t男\t2013/3/22\t本科\t138688\t3\r\n湖北\t湖北襄阳\t532456812\t3/29/67\t女\t2013/6/10\t高中\t138422.58\t11\r\n江苏\t江苏泰州\t451562582\t3/30/72\t女\t2012/1/17\t初中\t138395.61\t12\r\n吉林\t吉林长春\t451206682\t7/31/73\t女\t2012/1/11\t本科\t138229.73\t13\r\n广西\t广西南宁\t149123422\t12/30/74\t女\t2007/7/11\t大专\t138222.15\t13\r\n四川\t四川泸州\t689908332\t11/19/75\t女\t2014/12/10\t中专\t138010\t3\r\n浙江\t浙江金华\t686858622\t5/24/79\t女\t2014/11/24\t高中\t137916.8\t9\r\n江西\t江西南昌\t19112022\t12/8/68\t女\t2004/9/19\t高中\t137874.12\t7\r\n黑龙江\t黑龙江哈尔滨\t300794852\t4/17/68\t女\t2009/5/19\t高中\t137807\t13\r\n四川\t四川高新\t67222\t8/20/70\t男\t2001/12/30\t大专\t137763.32\t5\r\n陕西\t陕西西安\t146237982\t6/23/64\t女\t2007/6/25\t高中\t137687.66\t4\r\n山东\t山东东营\t134300842\t10/18/75\t女\t2007/5/8\t初中\t137409.3\t8\r\n湖北\t湖北十堰\t5069710462\t2/9/68\t男\t2016/2/29\t高中\t137406\t6\r\n山东\t山东烟台\t729135272\t2/13/84\t女\t2015/3/27\t本科\t137273\t12\r\n河北\t河北唐山\t414015072\t10/19/71\t女\t2011/1/13\t大专\t137207.46\t13\r\n福建\t福建福州\t653135422\t2/6/78\t女\t2014/8/7\t本科\t137062.11\t7\r\n浙江\t浙江金华\t5108741642\t8/23/65\t女\t2016/3/24\t高中\t136935\t12\r\n陕西\t陕西西安\t325350232\t9/23/70\t女\t2009/8/21\t中技\t136827.68\t5\r\n吉林\t吉林长春\t153754162\t5/29/78\t女\t2007/8/1\t大专\t136775.6\t8\r\n河南\t河南郑州\t4994402\t6/13/74\t女\t2003/6/27\t大专\t136700.11\t18\r\n山东\t山东烟台\t773128192\t10/11/81\t女\t2015/6/25\t高中\t136605\t5\r\n广西\t广西玉林\t284999902\t7/14/71\t女\t2009/3/16\t大专\t136532.59\t13\r\n安徽\t安徽滁州\t169505702\t2/10/71\t女\t2007/10/1\t高中\t136163\t10\r\n辽宁\t辽宁辽阳\t5137963082\t2/15/63\t女\t2016/5/12\t本科\t136162.8\t1\r\n北京\t北京海淀\t488328652\t11/28/87\t女\t2012/12/10\t本科\t136089.2\t16\r\n山东\t山东烟台\t438482932\t1/1/82\t女\t2011/9/20\t本科\t136075.28\t20\r\n江西\t江西抚州\t613783152\t4/6/62\t女\t2014/3/15\t高中\t136044.44\t12\r\n山东\t山东威海\t182661832\t10/2/73\t女\t2007/11/23\t初中\t136001.02\t18\r\n深圳\t深圳福田第二\t433007252\t10/10/80\t男\t2011/8/4\t大专\t135966\t11\r\n佛山\t佛山禅城\t5814782\t11/26/71\t男\t2003/7/29\t本科\t135893.53\t2\r\n黑龙江\t黑龙江哈尔滨\t5028774662\t5/19/73\t女\t2015/11/24\t高中\t135785\t4\r\n天津\t天津市区二支\t830683662\t1/17/83\t女\t2015/8/5\t本科\t135743.5\t12\r\n浙江\t浙江杭州\t5057025202\t5/7/80\t女\t2016/1/5\t大专\t135542\t16\r\n湖北\t湖北十堰\t853700022\t9/27/86\t男\t2015/8/10\t高中\t135516\t7\r\n重庆\t重庆永川\t516259212\t10/31/69\t女\t2013/4/23\t大专\t135496.5\t4\r\n四川\t四川青羊\t5171835122\t2/10/81\t女\t2016/6/15\t大专\t135466\t16\r\n广东\t广东中山\t5096136142\t7/13/81\t女\t2016/3/16\t大专\t135450\t4\r\n辽宁\t辽宁锦州\t741457342\t7/25/82\t男\t2015/4/10\t大专\t135225.4\t4\r\n上海\t上海黄浦\t452252192\t11/15/76\t女\t2012/2/9\t大专\t135208.5\t16\r\n河南\t河南开封\t872369102\t2/12/84\t女\t2015/9/16\t中专\t135000\t0\r\n浙江\t浙江杭州\t34030202\t9/9/72\t女\t2005/3/15\t大专\t134973.14\t11\r\n河南\t河南郑州\t342275682\t12/3/72\t女\t2009/11/11\t大专\t134608.38\t14\r\n苏州\t苏州姑苏\t5192552342\t8/28/74\t女\t2016/7/26\t高中\t134546.7\t10\r\n四川\t四川高新\t87158842\t9/29/81\t女\t2006/6/14\t本科\t134519.1\t35\r\n四川\t四川青羊\t197968712\t11/2/71\t女\t2008/1/4\t大专\t134220\t7\r\n黑龙江\t黑龙江哈尔滨\t32701232\t9/24/71\t男\t2005/3/1\t大专\t134129.16\t13\r\n苏州\t苏州张家港\t414506212\t10/6/68\t女\t2011/1/21\t高中\t134123.53\t3\r\n山东\t山东烟台\t92899292\t10/15/68\t女\t2006/8/4\t高中\t134101.5\t10\r\n湖南\t湖南长沙\t685345562\t10/28/77\t男\t2014/11/20\t大专\t134061.8\t39\r\n青岛\t青岛一支\t26287922\t11/24/55\t女\t2004/12/17\t本科\t134047.38\t7\r\n湖北\t湖北武汉\t101238222\t5/2/77\t女\t2006/10/20\t高中\t134008.3\t30\r\n深圳\t深圳宝安\t633335142\t9/14/73\t男\t2014/6/5\t硕士\t133861.56\t9\r\n青岛\t青岛一支\t240004882\t9/10/71\t女\t2008/7/14\t大专\t133804.42\t12\r\n云南\t云南昆明\t566755872\t5/17/79\t女\t2013/6/30\t大专\t133761.36\t6\r\n黑龙江\t黑龙江牡丹江\t468002062\t2/10/63\t男\t2012/6/14\t大专\t133693\t7\r\n青岛\t青岛一支\t5050606932\t3/25/77\t女\t2015/12/22\t本科\t133623.31\t6\r\n佛山\t佛山顺德龙江\t193004962\t8/11/66\t女\t2007/12/24\t高中\t133616.4\t14\r\n四川\t四川高新\t756013482\t7/20/91\t男\t2015/5/22\t本科\t133597\t13\r\n云南\t云南昆明\t269327912\t12/4/83\t女\t2008/12/10\t高中\t133492.69\t5\r\n河北\t河北邢台\t802569712\t12/19/85\t男\t2015/7/25\t大专\t133319.6\t3\r\n山西\t山西长治\t5078663472\t5/15/75\t女\t2016/3/7\t高中\t133159\t2\r\n北京\t北京东城\t77360172\t4/9/72\t女\t2006/3/6\t本科\t133137.4\t3\r\n山东\t山东日照\t593677492\t1/19/66\t女\t2013/12/20\t中专\t132920\t8\r\n安徽\t安徽合肥\t37062462\t9/23/61\t女\t2005/3/1\t大专\t132895.08\t10\r\n湖北\t湖北武汉\t838941642\t8/11/66\t女\t2015/8/8\t本科\t132872\t26\r\n重庆\t重庆渝中\t163551162\t7/14/84\t男\t2007/9/17\t本科\t132841.49\t18\r\n四川\t四川青羊\t615906542\t1/5/77\t女\t2014/3/20\t大专\t132670\t8\r\n吉林\t吉林白山\t531229312\t3/17/74\t女\t2013/6/9\t本科\t132513\t12\r\n深圳\t深圳福田第二\t492552272\t2/29/72\t女\t2012/12/21\t本科\t132212.65\t10\r\n江西\t江西抚州\t807611342\t8/12/67\t女\t2015/7/28\t高中\t132020\t3\r\n北京\t北京良乡\t758812802\t11/12/71\t女\t2015/5/29\t大专\t131933\t9\r\n四川\t四川德阳\t740746242\t3/8/76\t男\t2015/4/10\t高中\t131918\t8\r\n山东\t山东烟台\t13165292\t5/14/70\t女\t2004/5/1\t本科\t131728.6\t14\r\n四川\t四川高新\t260541252\t8/28/70\t女\t2008/11/3\t高中\t131618.43\t13\r\n湖南\t湖南常德\t527683022\t8/28/77\t女\t2013/6/5\t大专\t131494.53\t2\r\n安徽\t安徽合肥\t503742442\t8/19/72\t女\t2013/2/20\t大专\t131403.75\t0\r\n江苏\t江苏南京\t5027403022\t5/7/78\t女\t2015/11/23\t大专\t131399\t4\r\n四川\t四川绵阳\t637289252\t6/25/67\t女\t2014/6/16\t本科\t131301.65\t4\r\n辽宁\t辽宁营口\t734978162\t7/9/54\t男\t2015/4/3\t大专\t131287.83\t5\r\n重庆\t重庆渝中\t270849212\t4/25/64\t女\t2008/12/18\t中专\t131244.18\t14\r\n四川\t四川青羊\t663038632\t12/31/80\t女\t2014/8/27\t大专\t130862.96\t4\r\n浙江\t浙江嘉兴\t292061782\t8/27/70\t女\t2009/4/10\t高中\t130748.1\t16\r\n湖北\t湖北十堰\t361695502\t11/6/64\t女\t2010/2/24\t高中\t130676\t3\r\n安徽\t安徽亳州\t363068852\t2/10/70\t女\t2010/3/1\t大专\t130661.09\t31\r\n黑龙江\t黑龙江哈尔滨\t429921672\t8/2/77\t女\t2011/7/1\t大专\t130577.3\t4\r\n甘肃\t甘肃酒泉\t5086736212\t7/30/69\t女\t2016/3/10\t高中\t130419\t6\r\n河南\t河南郑州\t5185456872\t5/19/80\t女\t2016/6/29\t大专\t130343.5\t9\r\n山东\t山东潍坊\t831205232\t7/19/82\t女\t2015/8/6\t本科\t130274.4\t0\r\n青岛\t青岛一支\t252241262\t6/18/85\t女\t2008/9/19\t本科\t130257.5\t31\r\n四川\t四川高新\t73362\t5/23/76\t男\t2001/12/30\t大专\t130125.14\t11\r\n山东\t山东德州\t858349182\t10/8/74\t男\t2015/8/12\t高中\t130119.8\t43\r\n辽宁\t辽宁沈阳\t746569312\t2/8/78\t女\t2015/4/17\t大专\t130000\t0\r\n山东\t山东东营\t417197922\t11/6/69\t女\t2011/3/8\t小学\t129955.68\t3\r\n四川\t四川成都\t602178322\t3/14/73\t女\t2013/12/31\t高中\t129840\t3\r\n四川\t四川绵阳\t294856362\t3/8/85\t女\t2009/4/24\t大专\t129759.58\t5\r\n广西\t广西梧州\t350670302\t12/24/71\t女\t2009/12/20\t大专\t129639.41\t11\r\n四川\t四川乐山\t5159255032\t1/12/88\t女\t2016/6/2\t高中\t129611\t16\r\n青岛\t青岛一支\t5037056842\t2/10/81\t男\t2015/11/30\t本科\t129430\t7\r\n山东\t山东烟台\t366840272\t12/22/74\t女\t2010/3/25\t初中\t129323.9\t4\r\n深圳\t深圳南山\t5215022832\t4/19/68\t女\t2016/8/13\t大专\t129299\t5\r\n湖北\t湖北十堰\t699989492\t11/18/68\t男\t2014/12/30\t高中\t129191\t21\r\n山东\t山东威海\t200506762\t4/1/78\t女\t2008/1/15\t大专\t129061.43\t12\r\n宁波\t宁波城区\t829307242\t7/27/79\t女\t2015/8/5\t本科\t128939\t9\r\n山东\t山东淄博\t198284972\t3/15/70\t男\t2008/1/5\t大专\t128918.8\t14\r\n湖北\t湖北十堰\t427018512\t4/13/56\t女\t2011/6/15\t高中\t128810.5\t7\r\n山西\t山西太原\t195927942\t10/4/72\t女\t2008/1/1\t中专\t128573.57\t7\r\n四川\t四川高新\t1595632\t4/28/80\t女\t2002/8/6\t本科\t128559.44\t4\r\n宁波\t宁波城区\t375864342\t4/6/78\t女\t2010/5/19\t高中\t128508\t7\r\n深圳\t深圳福田第二\t49341822\t12/1/75\t女\t2005/6/29\t本科\t128471.44\t6\r\n云南\t云南昆明\t148598782\t1/3/78\t女\t2007/7/1\t大专\t128355.52\t10\r\n新疆\t新疆乌鲁木齐\t621087182\t9/27/78\t女\t2014/3/31\t高中\t128257.4\t14\r\n河南\t河南南阳\t370225362\t12/18/69\t女\t2010/4/16\t本科\t128168.02\t10\r\n山东\t山东滨州\t407501692\t10/28/75\t女\t2010/12/3\t大专\t128154.05\t9\r\n河北\t河北石家庄\t5144121232\t7/16/79\t女\t2016/5/23\t本科\t128056.2\t1\r\n陕西\t陕西西安\t544425082\t6/25/84\t女\t2013/6/21\t高中\t127970.05\t1\r\n湖北\t湖北宜昌\t810141852\t11/13/75\t女\t2015/7/29\t高中\t127923\t7\r\n山东\t山东淄博\t12915602\t3/1/74\t女\t2004/4/26\t大专\t127639.25\t22\r\n山东\t山东济南\t5199090322\t5/26/84\t女\t2016/8/1\t大专\t127609.5\t5\r\n浙江\t浙江杭州\t4748482\t6/15/71\t女\t2003/6/20\t本科\t127606.6\t7\r\n四川\t四川高新\t271617672\t10/24/74\t女\t2008/12/23\t大专\t127536.68\t9\r\n四川\t四川高新\t5217597382\t11/4/76\t男\t2016/8/17\t硕士\t127488.5\t16\r\n重庆\t重庆永川\t759031092\t11/9/77\t女\t2015/5/29\t高中\t127486\t8\r\n北京\t北京海淀\t507236812\t12/10/90\t女\t2013/3/18\t本科\t127485.11\t1\r\n青岛\t青岛开发区\t397596112\t5/14/80\t女\t2010/9/25\t大专\t127442.96\t5\r\n浙江\t浙江金华\t425466512\t4/19/80\t女\t2011/5/30\t高中\t127441.17\t13\r\n湖南\t湖南益阳\t843975732\t1/9/93\t女\t2015/8/10\t大专\t127282.24\t1\r\n四川\t四川绵阳\t168378272\t5/9/75\t女\t2007/10/8\t高中\t127233.59\t14\r\n辽宁\t辽宁营口\t698204552\t7/19/67\t女\t2014/12/25\t大专\t127209.84\t1\r\n黑龙江\t黑龙江佳木斯\t216967732\t10/1/77\t女\t2008/4/18\t大专\t127183.64\t6\r\n广西\t广西玉林\t606489032\t5/17/85\t女\t2014/1/20\t大专\t127070.4\t12\r\n福建\t福建泉州\t229916882\t8/12/66\t女\t2008/6/1\t高中\t127016.8\t5\r\n山东\t山东临沂\t5154395062\t12/13/79\t男\t2016/5/31\t高中\t126964\t30\r\n辽宁\t辽宁铁岭\t5009232312\t2/9/82\t女\t2015/11/4\t高中\t126900\t1\r\n江西\t江西南昌\t336650382\t5/12/63\t女\t2009/10/14\t本科\t126881.31\t11\r\n青岛\t青岛一支\t9461842\t5/3/70\t女\t2003/12/22\t大专\t126794.29\t3\r\n深圳\t深圳龙岗\t537312952\t1/9/94\t女\t2013/6/17\t高中\t126739.87\t0\r\n吉林\t吉林四平\t663159222\t6/19/72\t女\t2014/8/27\t大专\t126722.05\t8\r\n北京\t北京海淀\t422520642\t1/8/84\t男\t2011/5/1\t大专\t126650.86\t6\r\n湖北\t湖北襄阳\t58097782\t2/2/68\t女\t2005/9/12\t大专\t126569.42\t14\r\n重庆\t重庆渝中\t5159506152\t2/12/95\t男\t2016/6/2\t大专\t126453\t6\r\n湖北\t湖北荆州\t5176370582\t9/30/79\t女\t2016/6/20\t本科\t126435\t20\r\n山东\t山东济南\t756989622\t3/2/88\t女\t2015/5/25\t中专\t126408\t12\r\n浙江\t浙江金华\t380200312\t8/11/80\t男\t2010/6/12\t大专\t126323.22\t13\r\n辽宁\t辽宁铁岭\t5076841312\t4/22/79\t女\t2016/3/6\t本科\t126210\t2\r\n辽宁\t辽宁沈阳\t398146982\t11/24/68\t女\t2010/9/26\t本科\t126198.49\t10\r\n四川\t四川青羊\t661322362\t7/16/77\t女\t2014/8/25\t高中\t126106.2\t9\r\n山东\t山东济南\t617663152\t1/3/70\t女\t2014/3/25\t本科\t125931.8\t6\r\n北京\t北京海淀\t492426242\t12/4/80\t男\t2012/12/21\t本科\t125921.27\t0\r\n辽宁\t辽宁沈阳\t370805962\t5/21/78\t女\t2010/4/21\t大专\t125911.16\t7\r\n福建\t福建泉州\t421138082\t11/2/71\t男\t2011/4/12\t高中\t125898.3\t4\r\n深圳\t深圳福田\t495732752\t9/15/77\t女\t2012/12/28\t本科\t125808.32\t2\r\n黑龙江\t黑龙江哈尔滨\t444201192\t5/12/68\t女\t2011/11/18\t大专\t125787.6\t8\r\n江苏\t江苏常州\t5206244782\t7/17/81\t女\t2016/8/5\t高中\t125723.4\t7\r\n四川\t四川青羊\t579690372\t9/21/76\t女\t2013/9/26\t本科\t125669.32\t4\r\n浙江\t浙江温州\t5049657772\t9/17/67\t男\t2015/12/22\t高中\t125631.5\t12\r\n山东\t山东烟台\t594893412\t3/13/71\t女\t2013/12/23\t本科\t125454\t2\r\n佛山\t佛山顺德龙江\t8076212\t11/7/74\t女\t2003/9/25\t大专\t125405.39\t14\r\n浙江\t浙江杭州\t865168212\t9/1/87\t女\t2015/8/31\t大专\t125276\t11\r\n贵州\t贵州贵阳\t5084058292\t1/21/78\t女\t2016/3/10\t本科\t125212\t18\r\n四川\t四川绵阳\t506895292\t11/28/85\t男\t2013/3/15\t高中\t125058.66\t0\r\n广东\t广东东莞\t117754182\t9/6/72\t女\t2007/1/25\t大专\t124828.43\t6\r\n青岛\t青岛一支\t24708292\t7/23/72\t女\t2004/11/30\t大专\t124810.67\t9\r\n湖北\t湖北黄石\t246838292\t6/7/75\t女\t2008/8/20\t高中\t124713.9\t23\r\n吉林\t吉林延边\t440471782\t4/20/76\t女\t2011/9/29\t高中\t124648.65\t7\r\n福建\t福建福州\t617733492\t4/18/79\t女\t2014/3/25\t中专\t124590\t1\r\n陕西\t陕西咸阳\t5075772512\t2/6/76\t女\t2016/3/5\t高中\t124552\t2\r\n山东\t山东烟台\t508782672\t3/7/82\t女\t2013/3/22\t大专\t124531.25\t17\r\n北京\t北京海淀\t808836472\t9/11/81\t女\t2015/7/28\t本科\t124510\t1\r\n江西\t江西赣州\t614782182\t10/8/64\t男\t2014/3/17\t大专\t124505.59\t2\r\n苏州\t苏州太仓\t368455772\t10/12/66\t女\t2010/4/1\t高中\t124468.43\t2\r\n四川\t四川高新\t835161712\t3/10/86\t女\t2015/8/7\t高中\t124394\t2\r\n河北\t河北保定\t449890692\t2/19/73\t女\t2012/1/1\t大专\t124389.86\t2\r\n陕西\t陕西安康\t663410582\t12/22/78\t女\t2014/8/27\t大专\t124328.79\t4\r\n天津\t天津滨海新区\t335814922\t1/20/70\t女\t2009/10/9\t高中\t124220.82\t7\r\n大连\t大连明锐\t242941542\t10/10/83\t男\t2008/7/25\t大专\t124210.14\t13\r\n四川\t四川高新\t638771882\t11/29/77\t男\t2014/6/20\t大专\t124207.88\t8\r\n辽宁\t辽宁鞍山\t545958932\t3/6/87\t女\t2013/6/24\t大专\t124094\t2\r\n河南\t河南南阳\t277866982\t10/17/60\t女\t2009/1/20\t大专\t124000\t0\r\n湖北\t湖北武汉\t68814262\t10/28/78\t女\t2005/12/7\t大专\t123963.3\t5\r\n黑龙江\t黑龙江伊春\t430755732\t3/4/69\t女\t2011/7/18\t中专\t123949\t3\r\n四川\t四川青羊\t5204856872\t1/20/87\t女\t2016/8/4\t大专\t123948\t22\r\n四川\t四川青羊\t98622\t11/3/63\t女\t2001/12/30\t大专\t123731.22\t10\r\n云南\t云南昆明\t147469952\t11/23/67\t女\t2007/7/1\t本科\t123724.02\t4\r\n四川\t四川青羊\t338606432\t12/8/85\t女\t2009/10/25\t高中\t123703.85\t12\r\n四川\t四川青羊\t151110872\t7/9/79\t女\t2007/7/20\t大专\t123698.3\t9\r\n黑龙江\t黑龙江牡丹江\t537686302\t3/22/87\t男\t2013/6/17\t初中\t123616.03\t0\r\n湖南\t湖南长沙\t141246602\t11/28/67\t女\t2007/7/1\t大专\t123614.78\t6\r\n辽宁\t辽宁营口\t585925032\t10/5/75\t女\t2013/11/25\t大专\t123583.9\t9\r\n江西\t江西南昌\t275395232\t9/23/60\t女\t2009/1/3\t高中\t123536.48\t5\r\n新疆\t新疆石河子\t568929512\t12/26/62\t女\t2013/7/5\t大专\t123516.43\t9\r\n北京\t北京海淀\t129431722\t2/22/85\t女\t2007/7/1\t本科\t123514.61\t11\r\n黑龙江\t黑龙江哈尔滨\t313953082\t5/27/80\t女\t2009/7/10\t大专\t123482\t15\r\n佛山\t佛山禅城\t6438792\t10/18/74\t女\t2003/8/11\t中专\t123457.67\t11\r\n河北\t河北秦皇岛\t564170372\t5/10/72\t女\t2013/6/29\t大专\t123404.92\t2\r\n青岛\t青岛开发区\t46686952\t3/26/76\t女\t2005/6/8\t高中\t123387.65\t6\r\n佛山\t佛山顺德龙江\t86880822\t12/3/79\t女\t2006/6/9\t本科\t123296.67\t10\r\n四川\t四川青羊\t917332\t8/14/70\t女\t2002/4/2\t大专\t123129.59\t6\r\n江西\t江西新余\t807811482\t6/27/64\t女\t2015/7/28\t高中\t123082.19\t1\r\n山西\t山西太原\t155330722\t12/8/75\t女\t2007/8/1\t大专\t123059.55\t9\r\n大连\t大连银洲\t629864632\t4/20/74\t女\t2014/5/22\t大专\t123046.05\t12\r\n辽宁\t辽宁本溪\t701961592\t7/26/72\t女\t2014/12/31\t中专\t122871.03\t5\r\n四川\t四川青羊\t593491032\t9/9/75\t女\t2013/12/19\t大专\t122756.66\t1\r\n辽宁\t辽宁沈阳\t468874362\t5/16/70\t女\t2012/6/21\t本科\t122744\t6\r\n浙江\t浙江杭州\t249375642\t7/2/63\t女\t2008/9/1\t本科\t122679.14\t6\r\n苏州\t苏州新区\t628306492\t1/22/85\t女\t2014/5/13\t高中\t122660\t7\r\n陕西\t陕西汉中\t5175896452\t2/5/85\t女\t2016/6/20\t本科\t122601.5\t17\r\n河北\t河北沧州\t516546442\t3/1/62\t男\t2013/4/24\t高中\t122567.2\t13\r\n大连\t大连海川\t5376262\t2/9/63\t男\t2003/7/1\t本科\t122396.61\t3\r\n青岛\t青岛城阳\t838170112\t11/5/85\t女\t2015/8/8\t大专\t122350\t1\r\n山东\t山东济南\t154026042\t12/2/79\t女\t2007/7/25\t中专\t122255.61\t15\r\n四川\t四川乐山\t701436952\t2/27/78\t女\t2014/12/31\t大专\t122195.8\t1\r\n北京\t北京东城\t96592132\t10/2/66\t女\t2006/9/8\t大专\t122187.12\t11\r\n深圳\t深圳福田第二\t314128932\t3/8/81\t男\t2009/7/10\t大专\t122153.9\t8\r\n四川\t四川高新\t98609312\t6/17/73\t女\t2006/9/25\t本科\t122053.93\t13\r\n辽宁\t辽宁葫芦岛\t5077622782\t10/12/83\t男\t2016/3/7\t大专\t121996.8\t3\r\n浙江\t浙江绍兴\t5199166482\t10/23/76\t男\t2016/8/1\t高中\t121841.5\t21\r\n广东\t广东广州\t101004582\t8/21/80\t男\t2006/10/18\t中专\t121672.97\t28\r\n四川\t四川青羊\t500302\t5/22/63\t女\t2001/12/31\t高中\t121583.04\t6\r\n广西\t广西北海\t378004482\t8/11/78\t女\t2010/5/28\t大专\t121578.93\t17\r\n广东\t广东广州\t468368842\t4/20/82\t女\t2012/6/18\t高中\t121397.91\t9\r\n浙江\t浙江温州\t759932422\t4/7/75\t女\t2015/6/2\t高中\t121387.29\t7\r\n天津\t天津市区一支\t554003792\t8/28/85\t女\t2013/6/26\t大专\t121370.9\t3\r\n山东\t山东济南\t438908202\t8/28/76\t女\t2011/9/22\t中专\t121307.38\t3\r\n苏州\t苏州张家港\t5029172632\t12/14/79\t女\t2015/11/24\t中专\t121264\t2\r\n浙江\t浙江金华\t321644412\t4/4/73\t女\t2009/8/3\t高中\t121204.04\t7\r\n山西\t山西阳泉\t322728162\t10/18/73\t女\t2009/8/6\t中专\t121194.95\t4\r\n福建\t福建漳州\t5178546262\t2/27/67\t女\t2016/6/21\t中专\t121112.1\t5\r\n河南\t河南洛阳\t378470362\t8/29/73\t女\t2010/5/31\t高中\t121105.68\t5\r\n河南\t河南南阳\t5209635212\t6/16/86\t女\t2016/8/8\t本科\t120969.1\t5\r\n山东\t山东淄博\t15830072\t3/11/72\t男\t2004/6/1\t中专\t120942.43\t6\r\n四川\t四川高新\t5205980022\t8/13/77\t女\t2016/8/5\t硕士\t120914\t11\r\n吉林\t吉林延边\t5106746322\t10/13/68\t男\t2016/3/23\t本科\t120747.5\t6\r\n河北\t河北秦皇岛\t5060898902\t8/17/78\t男\t2016/1/14\t大专\t120610\t1\r\n辽宁\t辽宁阜新\t5079832942\t7/22/75\t男\t2016/3/7\t大专\t120540\t2\r\n深圳\t深圳罗湖\t5046280912\t10/31/76\t女\t2015/12/14\t本科\t120530\t5\r\n四川\t四川青羊\t264292\t3/17/65\t女\t2001/12/31\t硕士\t120512.1\t9\r\n河南\t河南驻马店\t5144515602\t7/9/78\t女\t2016/5/23\t大专\t120506\t17\r\n辽宁\t辽宁沈阳\t824900232\t4/3/73\t女\t2015/8/3\t大专\t120471\t6\r\n苏州\t苏州昆山\t586992032\t8/3/87\t女\t2013/11/29\t大专\t120443.76\t7\r\n浙江\t浙江杭州\t522446692\t4/16/72\t女\t2013/5/24\t高中\t120436.22\t3\r\n上海\t上海黄浦\t515279302\t2/27/89\t女\t2013/4/16\t大专\t120405.5\t13\r\n广东\t广东江门\t239711512\t4/12/66\t女\t2008/7/10\t初中\t120285.23\t3\r\n湖南\t湖南岳阳\t412580862\t3/21/78\t女\t2011/1/1\t大专\t120155.75\t19\r\n浙江\t浙江嘉兴\t269895262\t6/14/74\t女\t2008/12/12\t大专\t120026.35\t7\r\n吉林\t吉林吉林\t830121482\t4/3/70\t男\t2015/8/5\t大专\t120017.5\t6\r\n辽宁\t辽宁盘锦\t449985322\t4/9/79\t女\t2012/1/1\t大专\t120000\t0\r\n北京\t北京海淀\t5171876872\t9/6/86\t女\t2016/6/15\t本科\t119975\t7\r\n苏州\t苏州张家港\t181629032\t7/11/75\t女\t2007/11/21\t高中\t119915.16\t9\r\n北京\t北京东城\t710327182\t4/11/71\t女\t2015/2/27\t本科\t119901\t19\r\n河北\t河北廊坊\t304996282\t3/20/64\t女\t2009/6/1\t高中\t119676.62\t6\r\n山东\t山东潍坊\t24927552\t1/19/70\t男\t2004/11/30\t大专\t119650.8\t37\r\n青岛\t青岛一支\t756701692\t4/17/75\t女\t2015/5/25\t大专\t119589\t7\r\n浙江\t浙江杭州\t5123665102\t1/5/77\t女\t2016/4/18\t大专\t119530.5\t7\r\n辽宁\t辽宁锦州\t5013000842\t6/5/81\t男\t2015/11/8\t中专\t119487.1\t3\r\n江西\t江西景德镇\t400221252\t9/14/71\t女\t2010/10/12\t高中\t119461.75\t3\r\n四川\t四川高新\t192289122\t7/27/80\t女\t2007/12/21\t本科\t119399.47\t10\r\n黑龙江\t黑龙江哈尔滨\t224188442\t3/28/74\t女\t2008/5/19\t高中\t119263.24\t4\r\n贵州\t贵州六盘水\t503203152\t2/21/79\t女\t2013/2/6\t高中\t119142.06\t16\r\n北京\t北京海淀\t97662202\t11/24/82\t男\t2006/10/1\t本科\t119101.82\t10\r\n山东\t山东东营\t5100195672\t7/2/78\t女\t2016/3/19\t中专\t119052.9\t29\r\n大连\t大连开发区\t578664682\t9/15/62\t女\t2013/9/23\t高中\t119000\t0\r\n福建\t福建厦门\t323552312\t9/16/74\t女\t2009/8/11\t本科\t118960.7\t33\r\n安徽\t安徽阜阳\t660929892\t12/23/93\t女\t2014/8/25\t高中\t118874\t26\r\n四川\t四川高新\t11717132\t2/9/63\t女\t2004/3/31\t本科\t118839.4\t5\r\n陕西\t陕西西安\t448403592\t12/27/88\t女\t2011/12/23\t本科\t118782.78\t3\r\n佛山\t佛山南海\t626802642\t6/25/82\t女\t2014/5/5\t大专\t118736.49\t6\r\n辽宁\t辽宁营口\t5059305152\t5/20/80\t女\t2016/1/8\t本科\t118704\t3\r\n四川\t四川高新\t279445642\t12/10/83\t女\t2009/2/17\t大专\t118554.94\t23\r\n辽宁\t辽宁铁岭\t725052062\t9/20/69\t女\t2015/3/25\t大专\t118497.65\t18\r\n四川\t四川青羊\t75431752\t7/13/67\t女\t2006/2/22\t中专\t118433.89\t9\r\n山东\t山东烟台\t13177572\t12/6/64\t女\t2004/5/1\t大专\t118417.28\t14\r\n山东\t山东威海\t756037072\t11/29/82\t女\t2015/5/22\t中专\t118365.9\t7\r\n四川\t四川高新\t416925072\t5/30/90\t女\t2011/3/5\t高中\t118292.77\t3\r\n山东\t山东济南\t302534712\t8/13/77\t女\t2009/5/21\t高中\t118061.3\t1\r\n河南\t河南安阳\t129017762\t7/2/66\t女\t2007/4/5\t高中\t117971.74\t3\r\n河北\t河北唐山\t432345972\t3/16/75\t女\t2011/8/1\t初中\t117921.67\t6\r\n辽宁\t辽宁营口\t695117302\t9/15/75\t女\t2014/12/22\t大专\t117907\t8\r\n黑龙江\t黑龙江哈尔滨\t499223082\t3/14/68\t女\t2013/1/11\t中专\t117898.3\t9\r\n北京\t北京东城\t5117783482\t11/2/72\t男\t2016/4/7\t本科\t117897.4\t14\r\n四川\t四川高新\t121481492\t6/30/70\t女\t2007/3/6\t大专\t117884.52\t10\r\n四川\t四川内江\t7652342\t3/5/63\t女\t2003/9/17\t大专\t117865.42\t3\r\n陕西\t陕西渭南\t555204362\t3/27/58\t女\t2013/6/27\t中专\t117861.36\t0\r\n青岛\t青岛一支\t548554072\t10/9/81\t女\t2013/6/25\t本科\t117825.5\t12\r\n湖北\t湖北宜昌\t5019721952\t11/10/62\t女\t2015/11/16\t高中\t117752\t5\r\n深圳\t深圳福田第二\t353482602\t6/21/70\t女\t2009/12/30\t大专\t117697.48\t5\r\n河南\t河南驻马店\t15007592\t3/18/72\t女\t2004/6/28\t大专\t117693.12\t18\r\n天津\t天津市区二支\t5172990052\t1/31/74\t女\t2016/6/15\t大专\t117693\t15\r\n北京\t北京东城\t5113247122\t6/18/79\t男\t2016/3/28\t大专\t117674\t12\r\n河南\t河南郑州\t252926402\t9/29/74\t女\t2008/9/23\t大专\t117591.5\t12\r\n河北\t河北石家庄\t258247722\t9/5/77\t男\t2008/10/22\t大专\t117576.56\t16\r\n苏州\t苏州新区\t20446432\t8/10/68\t女\t2004/10/8\t高中\t117321.4\t2\r\n山东\t山东枣庄\t362968782\t6/20/73\t女\t2010/3/8\t中专\t117176.97\t14\r\n广东\t广东广州\t617810672\t7/28/75\t女\t2014/3/25\t大专\t117142.8\t20\r\n四川\t四川绵阳\t513333162\t12/4/73\t女\t2013/4/1\t高中\t117104.3\t7\r\n天津\t天津市区二支\t275442682\t4/22/84\t女\t2009/1/4\t本科\t116975.14\t10\r\n深圳\t深圳福田第二\t613156072\t10/14/80\t女\t2014/3/13\t大专\t116880.38\t12\r\n山东\t山东淄博\t184641472\t6/5/73\t女\t2007/11/25\t高中\t116832.24\t13\r\n广西\t广西南宁\t393798732\t8/23/77\t女\t2010/9/1\t本科\t116821.08\t5\r\n北京\t北京海淀\t390076862\t9/17/79\t男\t2010/8/10\t本科\t116820.59\t10\r\n苏州\t苏州张家港\t776940222\t12/18/68\t女\t2015/6/29\t高中\t116686\t2\r\n河北\t河北唐山\t475549912\t4/7/77\t男\t2012/8/24\t高中\t116665.97\t11\r\n广东\t广东珠海\t115948722\t10/5/69\t女\t2007/1/17\t大专\t116649.01\t3\r\n苏州\t苏州昆山\t5206229342\t8/5/81\t女\t2016/8/5\t本科\t116429.5\t12\r\n福建\t福建宁德\t426054652\t4/17/64\t女\t2011/6/3\t大专\t116350.2\t18\r\n山东\t山东威海\t467064162\t1/12/66\t女\t2012/6/4\t高中\t116261.97\t3\r\n青岛\t青岛一支\t163237272\t2/3/73\t女\t2007/9/17\t大专\t116159.72\t1\r\n北京\t北京平谷\t7539292\t10/20/57\t女\t2003/9/11\t大专\t116105.54\t3\r\n吉林\t吉林吉林\t416110132\t11/12/76\t男\t2011/2/25\t大专\t116067.88\t9\r\n北京\t北京海淀\t250532802\t1/2/87\t女\t2008/9/9\t大专\t115996.82\t25\r\n广西\t广西南宁\t711303322\t4/5/82\t女\t2015/3/6\t大专\t115990\t3\r\n河北\t河北沧州\t327033702\t4/5/89\t男\t2009/8/25\t高中\t115879.4\t18\r\n黑龙江\t黑龙江哈尔滨\t299973772\t10/1/73\t女\t2009/5/15\t高中\t115869.13\t11\r\n青岛\t青岛一支\t27345712\t2/8/63\t女\t2004/12/29\t大专\t115847.93\t6\r\n四川\t四川高新\t755757652\t10/25/69\t女\t2015/5/21\t大专\t115785.52\t15\r\n青岛\t青岛一支\t357117382\t10/23/80\t女\t2010/1/13\t本科\t115770.27\t19\r\n苏州\t苏州张家港\t70478612\t9/19/64\t女\t2005/12/23\t高中\t115629.53\t3\r\n黑龙江\t黑龙江鹤岗\t118691382\t9/27/59\t女\t2007/2/1\t大专\t115588.44\t7\r\n山东\t山东烟台\t851288972\t11/7/75\t女\t2015/8/10\t大专\t115525\t4\r\n苏州\t苏州新区\t464456742\t5/25/71\t女\t2012/5/11\t本科\t115413.03\t6\r\n湖北\t湖北荆州\t251653122\t5/15/77\t女\t2008/9/17\t中专\t115386.93\t10\r\n江苏\t江苏泰州\t162457502\t11/1/58\t女\t2007/9/10\t高中\t115315.54\t4\r\n河北\t河北唐山\t304664942\t3/19/60\t男\t2009/5/31\t高中\t115231.25\t3\r\n辽宁\t辽宁沈阳\t5013738762\t10/10/77\t女\t2015/11/9\t大专\t115221\t4\r\n湖北\t湖北襄阳\t242083892\t12/23/79\t女\t2008/7/24\t大专\t115149.03\t16\r\n青岛\t青岛一支\t322679312\t8/6/75\t女\t2009/8/6\t本科\t115134.99\t9\r\n河南\t河南南阳\t12555932\t5/27/71\t女\t2004/4/15\t中专\t115101.6\t2\r\n山东\t山东济南\t5088630932\t9/14/79\t男\t2016/3/11\t本科\t115000\t19\r\n四川\t四川高新\t116611672\t10/5/70\t男\t2007/1/22\t大专\t114965.9\t11\r\n湖北\t湖北十堰\t5194118882\t1/21/88\t女\t2016/7/27\t高中\t114960.9\t24\r\n湖北\t湖北襄阳\t5126069262\t2/29/84\t女\t2016/4/21\t高中\t114871.5\t4\r\n辽宁\t辽宁盘锦\t5079899062\t9/16/69\t女\t2016/3/7\t大专\t114866.9\t18\r\n佛山\t佛山顺德龙江\t185701632\t11/7/69\t女\t2007/12/1\t高中\t114819.34\t7\r\n江苏\t江苏泰州\t65132032\t5/10/58\t女\t2005/11/11\t高中\t114800.52\t8\r\n湖北\t湖北武汉\t334930342\t4/16/76\t女\t2009/10/1\t大专\t114734.55\t10\r\n浙江\t浙江绍兴\t5143414122\t6/17/88\t女\t2016/5/20\t本科\t114734.5\t2\r\n山东\t山东烟台\t5160400962\t5/3/81\t女\t2016/6/3\t中专\t114561\t9\r\n上海\t上海陆家嘴\t504625352\t3/23/80\t女\t2013/2/26\t大专\t114420.01\t11\r\n山东\t山东济宁\t5163305492\t4/20/82\t男\t2016/6/6\t高中\t114406.1\t2\r\n深圳\t深圳南山\t713445832\t10/18/74\t女\t2015/3/18\t中专\t114025\t11\r\n黑龙江\t黑龙江哈尔滨\t264689362\t12/5/71\t男\t2008/11/21\t本科\t114019.9\t11\r\n江苏\t江苏南京\t18620182\t6/14/64\t女\t2004/9/9\t高中\t113860.63\t3\r\n广西\t广西南宁\t5160062812\t9/10/79\t女\t2016/6/2\t本科\t113717\t10\r\n四川\t四川南充\t285563482\t10/22/81\t男\t2009/3/18\t本科\t113700\t2\r\n山东\t山东烟台\t43331592\t12/13/73\t女\t2005/5/17\t中专\t113669.32\t19\r\n四川\t四川高新\t663763412\t8/19/81\t女\t2014/8/28\t本科\t113621.66\t8\r\n北京\t北京平谷\t703275212\t6/27/75\t女\t2015/1/8\t中专\t113608\t4\r\n山东\t山东潍坊\t336470062\t8/7/72\t女\t2009/10/13\t高中\t113558.83\t27\r\n江西\t江西赣州\t810862862\t4/17/84\t女\t2015/7/29\t大专\t113505.13\t23\r\n深圳\t深圳宝安\t93040672\t7/2/68\t女\t2006/8/8\t大专\t113463.16\t4\r\n浙江\t浙江杭州\t6751982\t11/27/70\t女\t2003/8/22\t大专\t113447.63\t6\r\n广西\t广西桂林\t477409662\t8/26/63\t女\t2012/9/6\t大专\t113420.3\t15\r\n广东\t广东广州\t505128772\t6/30/69\t女\t2013/3/1\t高中\t113305.92\t15\r\n江苏\t江苏无锡\t659387802\t8/7/72\t女\t2014/8/21\t大专\t113259.42\t1\r\n宁波\t宁波城区\t5157707602\t9/15/70\t女\t2016/6/1\t大专\t113243\t8\r\n北京\t北京良乡\t251858702\t3/28/86\t男\t2008/10/1\t本科\t113241.55\t4\r\n山东\t山东枣庄\t250488422\t8/29/67\t女\t2008/9/10\t大专\t113076.61\t8\r\n湖北\t湖北武汉\t470917502\t4/6/82\t女\t2012/6/28\t本科\t113040.08\t10\r\n青岛\t青岛即墨\t583620892\t5/15/78\t男\t2013/11/11\t高中\t113013.05\t0\r\n辽宁\t辽宁铁岭\t5058818352\t12/8/71\t女\t2016/1/8\t高中\t112759\t4\r\n福建\t福建福州\t5002276422\t11/4/71\t女\t2015/10/17\t高中\t112754.3\t25\r\n吉林\t吉林吉林\t5137617732\t4/15/72\t女\t2016/5/12\t高中\t112750\t3\r\n黑龙江\t黑龙江七台河\t221284582\t5/26/69\t女\t2008/5/5\t大专\t112708.37\t3\r\n四川\t四川青羊\t370385862\t1/29/76\t女\t2010/4/19\t本科\t112708.06\t13\r\n河南\t河南南阳\t533556612\t7/24/82\t女\t2013/6/13\t高中\t112702.96\t0\r\n四川\t四川青羊\t16892602\t10/10/75\t女\t2004/8/4\t高中\t112692.04\t3\r\n四川\t四川高新\t157076722\t4/15/75\t女\t2007/8/10\t大专\t112680.56\t13\r\n北京\t北京良乡\t37858282\t7/25/76\t女\t2005/4/4\t大专\t112668\t2\r\n湖北\t湖北武汉\t838152662\t12/19/74\t女\t2015/8/8\t大专\t112570\t19\r\n上海\t上海陆家嘴\t5132689772\t8/19/82\t女\t2016/5/4\t本科\t112449\t16\r\n福建\t福建厦门\t218254692\t4/13/63\t女\t2008/4/23\t高中\t112385.02\t11\r\n四川\t四川高新\t5027434802\t10/23/82\t女\t2015/11/23\t大专\t112320\t7\r\n安徽\t安徽合肥\t206267032\t3/2/62\t女\t2008/3/1\t本科\t112250.77\t10\r\n福建\t福建福州\t92683102\t11/15/69\t女\t2006/8/2\t大专\t112187.01\t29\r\n湖北\t湖北十堰\t590788982\t11/24/76\t女\t2013/12/12\t高中\t112143\t6\r\n山西\t山西晋中\t669865202\t11/7/66\t女\t2014/9/17\t高中\t112100\t2\r\n青岛\t青岛一支\t875811552\t10/27/76\t女\t2015/9/22\t大专\t112075.9\t5\r\n福建\t福建福州\t631175182\t8/3/76\t女\t2014/5/26\t中专\t112058.88\t9\r\n辽宁\t辽宁沈阳\t482442082\t3/26/81\t女\t2012/11/7\t本科\t112043\t10\r\n江西\t江西南昌\t816538412\t12/8/90\t女\t2015/7/30\t大专\t112025\t16\r\n山东\t山东枣庄\t302881402\t2/22/62\t女\t2009/5/24\t中专\t111838.58\t1\r\n苏州\t苏州园区\t788728442\t6/8/80\t女\t2015/7/14\t大专\t111832\t12\r\n苏州\t苏州吴江\t434891562\t7/13/62\t女\t2011/8/22\t大专\t111826.05\t11\r\n山西\t山西吕梁\t5043858612\t11/4/86\t女\t2015/12/10\t中专\t111783.6\t3\r\n重庆\t重庆渝中\t5172203182\t11/15/83\t女\t2016/6/15\t本科\t111744.8\t17\r\n山东\t山东烟台\t750405902\t4/10/83\t女\t2015/4/29\t大专\t111627.3\t6\r\n山西\t山西朔州\t850148562\t11/24/73\t女\t2015/8/10\t本科\t111607\t4\r\n山东\t山东东营\t145756752\t11/19/68\t女\t2007/6/25\t本科\t111504.32\t15\r\n山东\t山东威海\t207748962\t1/5/60\t女\t2008/3/17\t中专\t111388\t10\r\n湖北\t湖北武汉\t5217393412\t8/31/75\t女\t2016/8/16\t本科\t111355.4\t15\r\n四川\t四川青羊\t77035672\t1/19/77\t女\t2006/3/1\t大专\t111340.62\t1\r\n云南\t云南昆明\t346055612\t5/21/57\t女\t2009/11/26\t大专\t111324.62\t13\r\n吉林\t吉林辽源\t548145552\t1/1/63\t女\t2013/6/24\t大专\t111301.19\t2\r\n四川\t四川高新\t153316612\t9/2/71\t女\t2007/7/25\t大专\t111286.1\t10\r\n陕西\t陕西宝鸡\t500675982\t12/23/68\t女\t2013/1/23\t大专\t111272.71\t9\r\n四川\t四川青羊\t1511612\t2/26/63\t女\t2002/7/23\t大专\t111137.63\t3\r\n江苏\t江苏泰州\t549008642\t12/23/78\t女\t2013/6/25\t中专\t111114.04\t4\r\n吉林\t吉林长春\t572624722\t12/5/76\t女\t2013/8/7\t大专\t111072.88\t1\r\n北京\t北京东城\t11565142\t5/4/72\t女\t2004/4/1\t大专\t111005.53\t15\r\n江苏\t江苏泰州\t757105742\t4/7/79\t女\t2015/5/25\t高中\t111000\t2\r\n湖南\t湖南永州\t499297192\t4/9/66\t女\t2013/1/14\t高中\t110996.95\t8\r\n福建\t福建漳州\t195533802\t3/31/79\t女\t2008/1/1\t本科\t110918.48\t38\r\n新疆\t新疆库尔勒\t407267082\t2/25/65\t女\t2010/12/2\t大专\t110898.78\t16\r\n北京\t北京海淀\t1902682\t4/11/71\t女\t2002/9/6\t硕士\t110861.86\t1\r\n上海\t上海黄浦\t430923772\t12/8/71\t女\t2011/7/20\t本科\t110840.03\t1\r\n北京\t北京海淀\t216382662\t10/3/85\t女\t2008/4/14\t高中\t110774.87\t16\r\n四川\t四川高新\t754930432\t3/2/74\t女\t2015/5/19\t本科\t110691.7\t11\r\n北京\t北京海淀\t587594822\t10/3/83\t女\t2013/12/2\t硕士\t110614\t1\r\n深圳\t深圳福田第二\t590897292\t11/3/84\t女\t2013/12/12\t本科\t110611\t9\r\n深圳\t深圳福田第二\t446183202\t1/30/77\t女\t2011/12/6\t大专\t110532.92\t8\r\n浙江\t浙江衢州\t806829202\t7/23/81\t女\t2015/7/27\t高中\t110520\t1\r\n河北\t河北保定\t5073952152\t9/11/80\t女\t2016/3/4\t中专\t110476.2\t3\r\n四川\t四川青羊\t839452\t6/28/73\t女\t2002/3/21\t中专\t110409.58\t11\r\n河南\t河南三门峡\t203772662\t3/28/66\t女\t2008/2/10\t高中\t110374.33\t3\r\n四川\t四川青羊\t5028789132\t7/30/81\t女\t2015/11/24\t大专\t110367\t20\r\n新疆\t新疆乌鲁木齐\t251991572\t2/10/71\t女\t2008/9/18\t大专\t110280.5\t32\r\n湖北\t湖北荆州\t216740932\t8/29/71\t女\t2008/4/17\t大专\t110229.4\t7\r\n四川\t四川青羊\t346132792\t6/12/66\t女\t2009/11/26\t中专\t110126.02\t12\r\n青岛\t青岛一支\t881393172\t9/4/73\t女\t2015/10/4\t大专\t110072.8\t3\r\n黑龙江\t黑龙江牡丹江\t45725192\t8/24/79\t男\t2005/6/1\t大专\t110058\t4\r\n佛山\t佛山顺德龙江\t818578482\t1/31/91\t男\t2015/7/31\t大专\t110040\t3\r\n广东\t广东中山\t7239082\t8/14/73\t女\t2003/8/31\t中专\t110014.67\t11\r\n河南\t河南南阳\t260606152\t9/13/66\t男\t2008/11/3\t高中\t110002.13\t15\r\n天津\t天津市区二支\t5074564062\t8/4/66\t女\t2016/3/4\t大专\t110000\t0\r\n青岛\t青岛即墨\t200769432\t10/9/71\t女\t2008/1/16\t大专\t109956.1\t6\r\n天津\t天津市区一支\t24772492\t9/9/75\t男\t2004/11/30\t大专\t109888.86\t13\r\n山东\t山东枣庄\t858116242\t11/8/83\t女\t2015/8/11\t中专\t109822\t2\r\n重庆\t重庆渝中\t766677342\t11/12/78\t男\t2015/6/19\t中专\t109782.9\t2\r\n吉林\t吉林长春\t763437402\t11/10/70\t女\t2015/6/11\t本科\t109712\t3\r\n新疆\t新疆库尔勒\t5198654272\t8/22/64\t女\t2016/8/1\t大专\t109697\t20\r\n山东\t山东烟台\t723457352\t7/7/82\t女\t2015/3/25\t大专\t109687.5\t6\r\n山东\t山东烟台\t829712962\t3/11/71\t女\t2015/8/5\t中专\t109665\t16\r\n辽宁\t辽宁鞍山\t585733402\t10/14/77\t女\t2013/11/25\t大专\t109620.09\t13\r\n青岛\t青岛开发区\t202435182\t8/19/68\t女\t2008/1/25\t中专\t109573.74\t5\r\n上海\t上海黄浦\t484499872\t9/30/66\t女\t2009/1/12\t高中\t109560.2\t10\r\n重庆\t重庆渝中\t5079032432\t1/14/86\t女\t2016/3/7\t本科\t109559.5\t8\r\n辽宁\t辽宁沈阳\t450152662\t4/4/79\t女\t2012/1/1\t本科\t109498.7\t14\r\n黑龙江\t黑龙江双鸭山\t377039922\t12/25/57\t男\t2010/5/25\t高中\t109477.96\t0\r\n黑龙江\t黑龙江牡丹江\t5064313842\t8/18/71\t男\t2016/2/1\t高中\t109419\t4\r\n浙江\t浙江温州\t208714222\t3/15/82\t女\t2008/3/20\t大专\t109410\t5\r\n辽宁\t辽宁营口\t754398952\t12/4/86\t女\t2015/5/15\t中专\t109353.22\t0\r\n青岛\t青岛即墨\t26359662\t10/20/76\t女\t2004/12/17\t高中\t109351.51\t5\r\n辽宁\t辽宁沈阳\t9165402\t7/13/66\t女\t2003/11/28\t大专\t109349.33\t13\r\n四川\t四川成都\t3289712\t10/10/71\t女\t2003/3/25\t本科\t109300.68\t5\r\n河南\t河南南阳\t627531192\t7/4/78\t女\t2014/5/9\t高中\t109300\t0\r\n广西\t广西钦州\t871876562\t1/1/85\t女\t2015/9/15\t中专\t109270\t1\r\n宁波\t宁波城区\t5115497162\t2/17/77\t女\t2016/4/1\t大专\t109141\t8\r\n吉林\t吉林吉林\t669111392\t2/22/81\t男\t2014/9/15\t高中\t109060\t1\r\n佛山\t佛山禅城\t658256602\t2/23/69\t女\t2014/8/19\t大专\t109039.27\t0\r\n北京\t北京东城\t868741162\t1/17/79\t女\t2015/9/9\t大专\t109000\t0\r\n山东\t山东济南\t713605362\t2/6/82\t女\t2015/3/18\t硕士\t108910\t2\r\n深圳\t深圳宝安\t350445872\t8/13/72\t女\t2009/12/18\t高中\t108881.11\t15\r\n深圳\t深圳南山\t5718068432\t1/27/74\t男\t2018/5/15\t高中\t108840.07\t1\r\n深圳\t深圳宝安\t830091752\t1/17/87\t女\t2015/8/5\t高中\t108831.3\t3\r\n青岛\t青岛一支\t5214180642\t10/10/92\t女\t2016/8/12\t本科\t108696.5\t20\r\n苏州\t苏州张家港\t5203446252\t12/8/65\t女\t2016/8/3\t中专\t108606\t15\r\n辽宁\t辽宁阜新\t472929242\t12/27/72\t女\t2012/7/27\t大专\t108570.14\t2\r\n福建\t福建泉州\t180284982\t2/10/69\t女\t2007/11/17\t中专\t108564.6\t14\r\n辽宁\t辽宁葫芦岛\t72833272\t11/12/70\t女\t2005/12/31\t大专\t108427.75\t19\r\n河南\t河南三门峡\t170579542\t2/14/76\t女\t2007/10/22\t大专\t108416.25\t6\r\n四川\t四川乐山\t7654712\t3/16/69\t女\t2003/9/17\t大专\t108406.78\t3\r\n四川\t四川内江\t7783812\t4/10/72\t女\t2003/9/17\t大专\t108391.73\t3\r\n浙江\t浙江杭州\t273777632\t3/25/75\t女\t2008/12/30\t本科\t108366.45\t7\r\n北京\t北京良乡\t708159682\t12/21/69\t女\t2015/2/4\t大专\t108315.94\t2\r\n浙江\t浙江嘉兴\t547521542\t3/7/72\t女\t2013/6/24\t初中\t108284.44\t1\r\n上海\t上海黄浦\t486035822\t2/20/78\t男\t2012/11/27\t本科\t108261.46\t2\r\n湖南\t湖南长沙\t5113140152\t4/4/75\t男\t2016/3/28\t大专\t108236\t3\r\n浙江\t浙江温州\t498758872\t8/10/81\t女\t2013/1/7\t高中\t108232.64\t7\r\n黑龙江\t黑龙江哈尔滨\t655825462\t2/3/79\t女\t2014/8/13\t大专\t108207.02\t2\r\n湖北\t湖北武汉\t81850502\t4/13/76\t女\t2006/4/14\t高中\t108122.68\t18\r\n青海\t西宁\t5193011032\t5/17/77\t女\t2016/7/26\t高中\t108078.7\t7\r\n安徽\t安徽芜湖\t391489852\t11/30/81\t女\t2010/8/1\t大专\t108043.63\t7\r\n辽宁\t辽宁盘锦\t335956032\t3/15/61\t女\t2009/10/5\t本科\t107825.86\t4\r\n重庆\t重庆渝中\t481706692\t7/31/79\t女\t2012/10/30\t大专\t107787.04\t9\r\n宁波\t宁波城区\t643443932\t5/12/79\t女\t2014/6/27\t高中\t107712.5\t17\r\n河北\t河北沧州\t149788742\t10/1/58\t女\t2007/7/16\t高中\t107667.85\t4\r\n辽宁\t辽宁阜新\t98866812\t11/22/71\t女\t2006/9/25\t本科\t107657.28\t15\r\n山东\t山东烟台\t270959192\t4/24/67\t女\t2008/12/18\t高中\t107644.39\t14\r\n山西\t山西长治\t622943162\t3/6/90\t女\t2014/4/10\t高中\t107622.7\t2\r\n浙江\t浙江温州\t511523932\t10/23/78\t女\t2013/3/28\t大专\t107585.15\t2\r\n深圳\t深圳福田\t276043802\t6/5/68\t男\t2009/1/6\t硕士\t107545.11\t4\r\n辽宁\t辽宁本溪\t708549082\t11/18/78\t女\t2015/2/7\t大专\t107470.9\t4\r\n河南\t河南许昌\t238263352\t10/24/64\t男\t2008/7/2\t大专\t107394.5\t16\r\n深圳\t深圳南山\t508111212\t1/12/73\t男\t2013/3/20\t本科\t107365.48\t6\r\n福建\t福建福州\t83177102\t12/7/74\t女\t2006/4/27\t本科\t107363.85\t17\r\n浙江\t浙江杭州\t142648982\t11/19/75\t女\t2007/6/22\t高中\t107316.42\t10\r\n黑龙江\t黑龙江佳木斯\t63367882\t9/5/70\t女\t2005/11/1\t本科\t107265.38\t15\r\n河南\t河南周口\t218263902\t9/13/77\t女\t2008/4/23\t大专\t107235.7\t14\r\n重庆\t重庆渝中\t879381432\t1/17/82\t男\t2015/9/28\t中专\t107231.5\t19\r\n辽宁\t辽宁沈阳\t692160822\t12/26/80\t女\t2014/12/18\t大专\t107179.53\t4\r\n四川\t四川乐山\t5051446352\t5/16/70\t女\t2015/12/23\t高中\t107173\t1\r\n广东\t广东肇庆\t643590482\t10/15/82\t女\t2014/6/27\t大专\t107152.09\t2\r\n四川\t四川青羊\t203164702\t8/11/66\t女\t2008/2/1\t大专\t107109.82\t7\r\n山西\t山西阳泉\t327465112\t11/26/73\t女\t2009/8/26\t中专\t107103.43\t3\r\n苏州\t苏州新区\t255808072\t8/21/79\t男\t2008/10/8\t大专\t107054.16\t10\r\n山东\t山东日照\t540434402\t3/1/76\t男\t2013/6/19\t中专\t107000.73\t1\r\n吉林\t吉林长春\t497471912\t12/17/64\t女\t2012/12/31\t高中\t106971.05\t6\r\n河南\t河南南阳\t803343342\t10/6/81\t女\t2015/7/26\t高中\t106961\t2\r\n辽宁\t辽宁盘锦\t864202952\t9/20/69\t男\t2015/8/27\t高中\t106914.43\t1\r\n大连\t大连明锐\t321558022\t9/15/71\t女\t2009/8/3\t初中\t106874.2\t4\r\n辽宁\t辽宁朝阳\t5203055552\t7/2/75\t男\t2016/8/2\t高中\t106841.1\t8\r\n吉林\t吉林延边\t412054552\t7/26/77\t女\t2010/12/29\t高中\t106742.05\t2\r\n山东\t山东烟台\t460199352\t1/7/71\t女\t2012/3/28\t高中\t106658.7\t3\r\n山西\t山西临汾\t736348442\t2/9/65\t女\t2015/4/7\t高中\t106650.5\t5\r\n山东\t山东烟台\t5112361452\t4/8/64\t女\t2016/3/25\t高中\t106644\t3\r\n大连\t大连开发区\t167488522\t3/3/74\t女\t2007/10/5\t大专\t106597.71\t10\r\n青岛\t青岛一支\t826919782\t2/16/75\t女\t2015/8/4\t博士\t106475\t8\r\n山东\t山东烟台\t408320402\t3/4/81\t女\t2010/12/9\t中专\t106386\t13\r\n深圳\t深圳宝安\t46164412\t2/4/65\t女\t2005/6/3\t本科\t106347.87\t6\r\n山东\t山东淄博\t198264182\t10/22/61\t女\t2008/1/5\t中专\t106309.21\t18\r\n辽宁\t辽宁沈阳\t5008248742\t11/12/93\t男\t2015/11/2\t本科\t106306.4\t16\r\n重庆\t重庆永川\t498960412\t5/22/72\t女\t2013/1/9\t本科\t106254.92\t30\r\n四川\t四川高新\t741251062\t2/16/81\t女\t2015/4/10\t本科\t106222.1\t19\r\n辽宁\t辽宁丹东\t831637612\t9/28/58\t女\t2015/8/6\t大专\t106200\t6\r\n四川\t四川青羊\t2265422\t2/28/80\t女\t2002/11/27\t中专\t106159.62\t4\r\n辽宁\t辽宁铁岭\t104004742\t12/15/69\t女\t2006/11/20\t大专\t106136.2\t10\r\n上海\t上海陆家嘴\t622541482\t1/6/85\t男\t2014/4/8\t高中\t106116.39\t14\r\n辽宁\t辽宁盘锦\t877177092\t10/25/71\t女\t2015/9/24\t大专\t106101.8\t13\r\n重庆\t重庆永川\t815980972\t12/13/65\t女\t2015/7/30\t高中\t106075.54\t30\r\n贵州\t贵州贵阳\t5193953892\t10/9/65\t女\t2016/7/27\t大专\t106001\t13\r\n北京\t北京海淀\t363176462\t4/9/79\t女\t2010/3/10\t大专\t105918.9\t9\r\n云南\t云南昆明\t506605962\t4/8/57\t女\t2013/3/13\t大专\t105902.86\t2\r\n河南\t河南郑州\t104812842\t5/30/69\t女\t2006/11/24\t中专\t105894\t2\r\n江苏\t江苏镇江\t854093462\t9/18/72\t女\t2015/8/10\t高中\t105835\t1\r\n福建\t福建福州\t746320322\t5/1/65\t女\t2015/4/16\t高中\t105780\t1\r\n湖北\t湖北武汉\t61245192\t5/4/70\t女\t2005/10/7\t高中\t105749.43\t9\r\n四川\t四川青羊\t5113250792\t7/21/91\t女\t2016/3/28\t本科\t105746\t1\r\n河北\t河北唐山\t532940142\t4/10/83\t男\t2013/6/12\t大专\t105714.17\t1\r\n天津\t天津市区二支\t79390332\t9/30/84\t女\t2006/3/24\t大专\t105586.41\t15\r\n山东\t山东泰安\t652192082\t5/4/74\t女\t2014/8/6\t大专\t105564.8\t12\r\n北京\t北京良乡\t394605162\t9/16/76\t女\t2010/9/7\t初中\t105491.46\t5\r\n黑龙江\t黑龙江哈尔滨\t363810382\t11/15/76\t男\t2010/3/15\t本科\t105452.94\t3\r\n重庆\t重庆永川\t500052672\t5/20/71\t女\t2013/1/18\t高中\t105449.28\t22\r\n安徽\t安徽合肥\t5121413262\t2/21/75\t女\t2016/4/14\t大专\t105393.1\t15\r\n浙江\t浙江嘉兴\t137803452\t3/25/72\t女\t2007/6/1\t大专\t105353.73\t4\r\n浙江\t浙江杭州\t258732722\t2/17/70\t女\t2008/10/24\t高中\t105346.07\t8\r\n云南\t云南昆明\t212685082\t12/26/68\t女\t2008/4/1\t高中\t105309.19\t11\r\n苏州\t苏州新区\t20683142\t6/23/61\t女\t2004/10/12\t大专\t105246.84\t1\r\n江苏\t江苏南京\t701351262\t5/15/82\t男\t2014/12/31\t硕士\t105241\t9\r\n青岛\t青岛一支\t4659022\t4/22/48\t女\t2003/6/18\t大专\t105220.91\t14\r\n新疆\t新疆乌鲁木齐\t5088289112\t3/21/84\t女\t2016/3/11\t本科\t105211\t17\r\n四川\t四川高新\t230457572\t8/19/75\t女\t2008/6/11\t大专\t105194.26\t21\r\n云南\t云南昆明\t680336732\t10/27/81\t女\t2014/11/5\t大专\t105157\t1\r\n青岛\t青岛一支\t752502362\t7/18/81\t女\t2015/5/7\t大专\t105075.5\t11\r\n青岛\t青岛一支\t5097001942\t2/26/84\t女\t2016/3/16\t本科\t105000.5\t3\r\n浙江\t浙江温州\t759647562\t10/8/80\t女\t2015/6/1\t高中\t104868.51\t5\r\n宁波\t宁波宁海\t5072071072\t11/25/81\t女\t2016/3/2\t中专\t104866\t3\r\n湖北\t湖北黄冈\t457593332\t1/13/72\t女\t2012/3/20\t高中\t104863.51\t12\r\n湖南\t湖南郴州\t5092193622\t3/11/97\t男\t2016/3/14\t高中\t104850\t2\r\n黑龙江\t黑龙江哈尔滨\t5178792882\t6/7/68\t女\t2016/6/21\t高中\t104758\t3\r\n山东\t山东威海\t181515282\t1/28/70\t男\t2007/11/21\t本科\t104737.02\t4\r\n广西\t广西南宁\t293880222\t7/14/78\t女\t2009/4/21\t中专\t104712.77\t1\r\n四川\t四川高新\t330413352\t3/4/80\t女\t2009/9/14\t大专\t104677.75\t10\r\n北京\t北京东城\t804417182\t2/2/81\t女\t2015/7/26\t本科\t104614\t1\r\n四川\t四川青羊\t336743612\t6/16/54\t女\t2009/10/15\t本科\t104488.77\t2\r\n吉林\t吉林辽源\t5010357332\t7/11/83\t女\t2015/11/5\t大专\t104486.5\t2\r\n北京\t北京海淀\t547132842\t11/24/91\t女\t2013/6/30\t本科\t104479.48\t7\r\n浙江\t浙江金华\t379169182\t2/24/73\t女\t2010/6/5\t高中\t104398.05\t7\r\n大连\t大连海川\t5154270922\t2/14/68\t女\t2016/5/31\t本科\t104277\t2\r\n深圳\t深圳福田\t613855862\t5/17/86\t女\t2014/3/15\t本科\t104268.05\t5\r\n安徽\t安徽滁州\t5139672872\t8/4/68\t女\t2016/5/16\t大专\t104208.8\t10\r\n山西\t山西长治\t273416292\t8/11/74\t女\t2009/1/1\t大专\t104203.6\t10\r\n青岛\t青岛一支\t681109662\t2/8/67\t女\t2014/11/10\t本科\t104190\t2\r\n苏州\t苏州昆山\t61580572\t12/3/71\t女\t2005/10/10\t高中\t104153.1\t3\r\n辽宁\t辽宁阜新\t71510442\t10/28/69\t女\t2005/12/30\t大专\t104151.32\t8\r\n北京\t北京海淀\t394760222\t10/23/87\t男\t2010/9/8\t本科\t104140.11\t13\r\n山东\t山东菏泽\t491738032\t10/20/77\t女\t2012/12/20\t本科\t104121.5\t6\r\n北京\t北京良乡\t460874582\t12/4/84\t女\t2012/4/1\t中专\t104092.34\t15\r\n河南\t河南南阳\t574691452\t3/19/80\t女\t2013/8/26\t中专\t104000\t0\r\n江苏\t江苏泰州\t5143823932\t11/16/78\t女\t2016/5/21\t高中\t103993\t13\r\n苏州\t苏州新区\t485193252\t8/14/69\t女\t2012/11/25\t大专\t103775.9\t4\r\n四川\t四川高新\t206082242\t12/19/78\t女\t2008/3/6\t大专\t103703.6\t7\r\n宁波\t宁波慈溪\t634496072\t2/20/68\t女\t2014/6/9\t高中\t103669.22\t4\r\n河北\t河北唐山\t61391042\t3/28/75\t女\t2005/10/8\t大专\t103642\t19\r\n河南\t河南郑州\t540946062\t2/8/71\t女\t2013/6/19\t大专\t103639.52\t2\r\n河南\t河南洛阳\t696591422\t2/7/70\t女\t2014/12/23\t高中\t103591\t1\r\n山东\t山东临沂\t18346902\t4/8/63\t男\t2004/9/1\t大专\t103589.75\t12\r\n山东\t山东济宁\t442349952\t10/22/63\t女\t2011/10/21\t大专\t103569.35\t10\r\n重庆\t重庆渝中\t5024636272\t2/12/80\t女\t2015/11/20\t大专\t103555\t3\r\n安徽\t安徽合肥\t670525082\t6/1/81\t女\t2014/9/19\t大专\t103541.5\t7\r\n大连\t大连明锐\t708995142\t6/1/81\t女\t2015/2/11\t大专\t103522\t9\r\n山东\t山东济南\t5195594722\t2/28/81\t女\t2016/7/28\t博士\t103514\t9\r\n吉林\t吉林辽源\t739348602\t8/8/55\t男\t2015/4/9\t中专\t103498.5\t1\r\n重庆\t重庆渝中\t451314292\t7/9/75\t女\t2012/1/13\t大专\t103428\t15\r\n山西\t山西太原\t325457142\t7/27/77\t女\t2009/8/24\t本科\t103363.06\t7\r\n青岛\t青岛一支\t742065302\t9/20/82\t男\t2015/4/10\t高中\t103276.5\t6\r\n广西\t广西柳州\t348891502\t1/16/71\t女\t2009/12/10\t高中\t103214\t3\r\n四川\t四川雅安\t5141825912\t12/31/73\t女\t2016/5/18\t大专\t103152.7\t6\r\n山东\t山东枣庄\t208136962\t11/30/74\t女\t2008/3/17\t大专\t103128.63\t8\r\n北京\t北京平谷\t5032257592\t3/27/86\t女\t2015/11/26\t大专\t103114\t5\r\n青岛\t青岛一支\t881385632\t4/7/69\t男\t2015/10/4\t大专\t103095\t2\r\n青岛\t青岛即墨\t586063342\t3/30/71\t女\t2013/11/25\t高中\t103013.11\t0\r\n河南\t河南濮阳\t600220872\t11/8/79\t女\t2013/12/30\t本科\t103000\t0\r\n广东\t广东东莞\t814186822\t10/25/81\t女\t2015/7/30\t高中\t103000\t0\r\n山东\t山东临沂\t378277062\t3/10/68\t女\t2010/5/31\t大专\t102994.68\t7\r\n湖北\t湖北武汉\t101938712\t12/3/69\t女\t2006/10/25\t大专\t102966.96\t6\r\n四川\t四川高新\t5177226342\t8/5/75\t女\t2016/6/21\t中专\t102928\t27\r\n山东\t山东济南\t5107083572\t10/29/81\t女\t2016/3/23\t本科\t102874\t3\r\n四川\t四川宜宾\t5081232622\t11/16/87\t男\t2016/3/8\t大专\t102860\t2\r\n山东\t山东烟台\t285215122\t11/5/71\t女\t2009/3/17\t高中\t102856.19\t9\r\n浙江\t浙江嘉兴\t870665112\t6/16/85\t女\t2015/9/10\t高中\t102816.5\t8\r\n辽宁\t辽宁葫芦岛\t564557672\t9/13/79\t女\t2013/6/29\t大专\t102782.4\t17\r\n广西\t广西桂林\t665997482\t10/4/86\t女\t2014/9/2\t中专\t102778\t12\r\n四川\t四川青羊\t5124936072\t8/18/83\t女\t2016/4/19\t大专\t102700\t2\r\n山西\t山西太原\t861276902\t9/21/76\t女\t2015/8/19\t大专\t102627\t7\r\n江苏\t江苏南京\t13842892\t9/18/74\t男\t2004/5/25\t本科\t102472.67\t2\r\n辽宁\t辽宁沈阳\t44110662\t11/6/73\t女\t2005/5/25\t大专\t102472.01\t15\r\n四川\t四川乐山\t5047811102\t10/24/81\t女\t2015/12/17\t高中\t102433.59\t0\r\n四川\t四川高新\t414961482\t8/6/85\t女\t2011/1/26\t大专\t102410.4\t22\r\n福建\t福建福州\t5063372852\t3/19/84\t女\t2016/1/28\t大专\t102368.13\t22\r\n山东\t山东威海\t199065442\t4/13/81\t女\t2008/1/8\t高中\t102350.5\t25\r\n四川\t四川内江\t158450772\t9/8/69\t女\t2007/8/21\t大专\t102329\t21\r\n青岛\t青岛一支\t583701842\t9/24/76\t女\t2013/11/11\t大专\t102270.25\t12\r\n江西\t江西南昌\t456539312\t3/2/78\t女\t2012/3/14\t本科\t102270\t4\r\n上海\t上海黄浦\t680202192\t8/29/89\t女\t2014/11/4\t本科\t102256.2\t24\r\n湖北\t湖北十堰\t5017890722\t10/29/84\t男\t2015/11/13\t高中\t102186\t1\r\n湖北\t湖北荆州\t782853452\t10/13/74\t女\t2015/7/7\t高中\t102182\t18\r\n山东\t山东枣庄\t250193652\t9/28/68\t女\t2008/9/8\t中专\t102093.77\t10\r\n湖北\t湖北黄冈\t509003332\t11/6/68\t女\t2013/3/22\t中专\t102077.67\t12\r\n山东\t山东临沂\t531058202\t3/1/78\t女\t2013/6/9\t高中\t101984.67\t7\r\n山东\t山东济宁\t271482432\t10/20/62\t女\t2008/12/22\t大专\t101974.47\t7\r\n浙江\t浙江湖州\t5014913632\t10/25/89\t男\t2015/11/10\t本科\t101954.6\t12\r\n湖北\t湖北十堰\t716066232\t8/26/83\t女\t2015/3/21\t中专\t101909\t1\r\n大连\t大连开发区\t42111902\t3/20/65\t女\t2005/5/6\t本科\t101907.69\t6\r\n福建\t福建泉州\t480989452\t8/4/66\t女\t2012/10/23\t高中\t101897.41\t7\r\n辽宁\t辽宁沈阳\t535180352\t10/27/78\t女\t2013/6/14\t本科\t101881.79\t8\r\n云南\t云南昆明\t527623562\t9/2/88\t女\t2013/6/5\t大专\t101856.27\t1\r\n湖北\t湖北武汉\t32686852\t10/11/77\t女\t2005/3/1\t大专\t101776.39\t14\r\n河南\t河南南阳\t12554262\t1/16/75\t女\t2004/4/15\t高中\t101763.71\t14\r\n黑龙江\t黑龙江佳木斯\t314869762\t6/9/77\t女\t2009/7/15\t中专\t101749.3\t13\r\n吉林\t吉林四平\t439640792\t6/25/65\t女\t2011/9/26\t大专\t101710.29\t15\r\n江西\t江西赣州\t816605682\t3/14/81\t女\t2015/7/30\t中专\t101702.57\t0\r\n山东\t山东德州\t238018132\t9/2/71\t女\t2008/7/2\t高中\t101694.09\t7\r\n山东\t山东菏泽\t421201582\t7/6/64\t男\t2011/4/12\t高中\t101688.28\t6\r\n黑龙江\t黑龙江鹤岗\t273967862\t6/18/60\t女\t2009/1/1\t大专\t101685.1\t9\r\n湖北\t湖北荆州\t378425282\t11/3/62\t男\t2010/6/1\t大专\t101668.49\t12\r\n广东\t广东江门\t51680432\t4/9/65\t女\t2005/7/15\t高中\t101598.03\t10\r\n黑龙江\t黑龙江黑河\t5031848752\t4/29/65\t女\t2015/11/26\t中专\t101558\t1\r\n广西\t广西桂林\t377728832\t4/2/72\t男\t2010/5/26\t大专\t101546.84\t10\r\n浙江\t浙江台州\t412730482\t6/22/73\t女\t2011/1/1\t高中\t101522.84\t14\r\n浙江\t浙江杭州\t235763542\t5/23/62\t女\t2008/6/25\t高中\t101499.73\t4\r\n佛山\t佛山顺德龙江\t683312332\t12/30/88\t女\t2014/11/17\t高中\t101485.42\t9\r\n河南\t河南南阳\t730605622\t6/24/72\t女\t2015/3/30\t高中\t101350\t1\r\n河南\t河南开封\t5008158042\t12/27/91\t男\t2015/11/2\t本科\t101350\t1\r\n四川\t四川高新\t687482632\t4/16/78\t女\t2014/11/26\t大专\t101350\t1\r\n四川\t四川高新\t449170382\t10/25/76\t女\t2011/12/26\t大专\t101328.73\t9\r\n山东\t山东滨州\t5197310812\t12/2/68\t女\t2016/7/30\t大专\t101300.9\t13\r\n山东\t山东淄博\t5158733822\t12/27/79\t男\t2016/6/1\t中专\t101239.5\t7\r\n黑龙江\t黑龙江牡丹江\t272340082\t12/10/52\t女\t2009/1/1\t高中\t101189\t1\r\n云南\t云南昆明\t410700322\t1/25/74\t女\t2010/12/23\t大专\t101182.96\t1\r\n青岛\t青岛一支\t11510152\t9/27/73\t男\t2004/3/27\t大专\t101132\t6\r\n深圳\t深圳宝安\t5175297212\t9/10/79\t女\t2016/6/18\t中专\t101110\t7\r\n广东\t广东广州\t605816172\t11/11/74\t女\t2014/1/16\t中专\t101078\t1\r\n浙江\t浙江杭州\t390844352\t10/19/81\t女\t2010/8/16\t高中\t101064.28\t11\r\n山东\t山东济南\t9966662\t8/27/69\t女\t2004/2/1\t大专\t101050.02\t4\r\n浙江\t浙江杭州\t881510962\t5/6/82\t女\t2015/10/6\t高中\t101027.6\t6\r\n四川\t四川高新\t5077567462\t4/15/75\t女\t2016/3/7\t本科\t101000\t0\r\n山东\t山东济南\t5203463492\t10/17/78\t男\t2016/8/3\t本科\t100972\t11\r\n苏州\t苏州新区\t716769792\t12/1/66\t女\t2015/3/23\t本科\t100947.16\t11\r\n四川\t四川高新\t4153502\t1/8/78\t女\t2003/5/20\t大专\t100845.99\t12\r\n山东\t山东威海\t516520482\t3/2/71\t女\t2013/4/24\t高中\t100761.89\t25\r\n重庆\t重庆渝中\t447542872\t9/28/78\t女\t2011/12/19\t大专\t100758.57\t15\r\n辽宁\t辽宁丹东\t36292602\t12/27/67\t男\t2005/3/30\t本科\t100738.55\t4\r\n福建\t福建福州\t5150163342\t2/20/76\t女\t2016/5/27\t高中\t100704\t10\r\n山东\t山东临沂\t5158820852\t11/12/78\t女\t2016/6/2\t中专\t100610.4\t11\r\n浙江\t浙江杭州\t128256142\t5/9/72\t男\t2007/4/2\t高中\t100598.36\t4\r\n北京\t北京良乡\t105363442\t1/8/64\t女\t2006/12/1\t大专\t100598.31\t1\r\n浙江\t浙江嘉兴\t771765722\t1/3/76\t女\t2015/6/24\t高中\t100508.5\t2\r\n陕西\t陕西西安\t627520582\t4/19/75\t男\t2014/5/9\t大专\t100466.61\t19\r\n四川\t四川乐山\t104357572\t1/23/69\t女\t2006/11/23\t大专\t100438.38\t10\r\n大连\t大连明锐\t735132522\t6/25/79\t男\t2015/4/3\t本科\t100378.1\t7\r\n福建\t福建福州\t424286462\t4/4/72\t女\t2011/5/17\t高中\t100368.25\t9\r\n广西\t广西南宁\t766007552\t2/18/86\t男\t2015/6/18\t大专\t100332.5\t1\r\n山东\t山东烟台\t486451182\t7/22/65\t女\t2012/11/29\t大专\t100302.02\t12\r\n辽宁\t辽宁鞍山\t750884762\t7/16/77\t男\t2015/4/30\t高中\t100204\t1\r\n北京\t北京海淀\t667183672\t10/7/71\t男\t2014/9/5\t大专\t100188.17\t3\r\n河北\t河北廊坊\t80743862\t8/25/53\t女\t2006/3/30\t中专\t100130.25\t4\r\n黑龙江\t黑龙江齐齐哈尔\t5079040602\t5/12/64\t女\t2016/3/7\t本科\t100060\t6\r\n浙江\t浙江杭州\t17451712\t3/21/77\t男\t2004/8/18\t大专\t100028.49\t4\r\n山东\t山东烟台\t272740362\t6/26/65\t女\t2008/12/25\t大专\t100013\t5\r\n辽宁\t辽宁鞍山\t5012221172\t5/22/66\t女\t2015/11/7\t高中\t100000\t0\r\n江西\t江西上饶\t5084345692\t11/15/92\t男\t2016/3/10\t高中\t100000\t0\r\n山东\t山东烟台\t711815952\t7/29/74\t女\t2015/3/11\t中专\t100000\t0\r\n苏州\t苏州张家港\t454346552\t2/21/77\t女\t2012/3/5\t初中\t100000\t0\r\n湖南\t湖南长沙\t824684042\t6/8/81\t女\t2015/8/3\t高中\t100000\t0\r\n苏州\t苏州张家港\t788590132\t11/13/84\t男\t2015/7/14\t硕士\t100000\t0\r\n广东\t广东广州\t739385172\t9/19/88\t女\t2015/4/9\t高中\t100000\t0\r\n广东\t广东广州\t825439522\t7/10/76\t女\t2015/8/3\t大专\t100000\t0\r\n天津\t天津滨海新区\t5120805922\t10/8/85\t女\t2016/4/13\t中专\t100000\t0\r\n黑龙江\t黑龙江哈尔滨\t677205102\t10/5/84\t女\t2014/10/16\t中专\t100000\t0\r\n苏州\t苏州张家港\t5130221222\t9/5/70\t女\t2016/4/29\t高中\t100000\t0\r\n青岛\t青岛一支\t5084474402\t10/31/81\t女\t2016/3/10\t本科\t100000\t0\r\n广西\t广西百色\t5157119232\t8/13/84\t女\t2016/6/1\t高中\t100000\t0\r\n山西\t山西运城\t5068218282\t9/5/93\t男\t2016/2/25\t高中\t100000\t0\r\n福建\t福建龙岩\t5007522592\t2/11/94\t男\t2015/10/30\t本科\t100000\t0\r\n湖南\t湖南益阳\t5068602682\t4/16/82\t女\t2016/2/25\t中专\t100000\t0\r\n山西\t山西朔州\t5005257112\t8/30/81\t女\t2015/10/25\t高中\t100000\t0\r\n江苏\t江苏镇江\t790091882\t10/28/59\t女\t2015/7/15\t大专\t100000\t0\r\n广东\t广东珠海\t787721872\t1/4/80\t女\t2015/7/13\t高中\t100000\t0\r\n河北\t河北秦皇岛\t477007982\t2/5/83\t男\t2012/9/3\t大专\t100000\t0\r\n广西\t广西南宁\t619091492\t7/13/86\t女\t2014/3/27\t本科\t100000\t0\r\n四川\t四川高新\t544863602\t1/11/81\t女\t2013/6/22\t本科\t100000\t0\r\n山东\t山东日照\t870103902\t9/27/79\t男\t2015/9/10\t大专\t100000\t0\r\n黑龙江\t黑龙江鸡西\t741606262\t11/11/72\t女\t2015/4/10\t大专\t100000\t0\r\n苏州\t苏州张家港\t5066721602\t11/4/75\t女\t2016/2/18\t大专\t100000\t0\r\n江西\t江西新余\t5150028262\t11/26/72\t女\t2016/5/27\t本科\t100000\t0\r\n湖北\t湖北鄂州\t738425082\t7/12/86\t女\t2015/4/9\t本科\t100000\t0\r\n辽宁\t辽宁本溪\t5137243302\t1/23/78\t女\t2016/5/12\t高中\t100000\t0\r\n广西\t广西南宁\t760167732\t9/2/76\t女\t2015/6/3\t中专\t100000\t0\r\n辽宁\t辽宁本溪\t695719122\t11/10/63\t男\t2014/12/22\t高中\t100000\t0\r\n广西\t广西北海\t873819632\t4/22/89\t女\t2015/9/18\t中专\t100000\t0\r\n四川\t四川乐山\t682619652\t2/1/77\t女\t2014/11/14\t中专\t100000\t0\r\n陕西\t陕西西安\t237249942\t1/19/64\t女\t2008/7/1\t高中\t99804.59\t5\r\n河北\t河北保定\t5207285472\t5/6/70\t女\t2016/8/6\t大专\t99781\t19\r\n四川\t四川青羊\t3623422\t9/21/79\t女\t2003/4/14\t本科\t99673.06\t11\r\n黑龙江\t黑龙江牡丹江\t342895922\t6/5/71\t男\t2009/11/14\t中专\t99611.7\t1\r\n重庆\t重庆渝中\t5179357642\t2/3/83\t女\t2016/6/21\t大专\t99584.1\t15\r\n四川\t四川高新\t4860832\t3/22/78\t女\t2003/6/23\t大专\t99566.68\t13\r\n深圳\t深圳宝安\t554190952\t1/27/82\t女\t2013/6/26\t大专\t99530.08\t9\r\n四川\t四川高新\t517031442\t11/28/74\t女\t2013/4/25\t大专\t99529.19\t17\r\n内蒙古\t内蒙古包头\t593070232\t11/3/77\t男\t2013/12/19\t高中\t99444\t3\r\n广东\t广东广州\t415488492\t2/9/87\t女\t2011/2/14\t大专\t99409.37\t10\r\n浙江\t浙江杭州\t4808912\t12/11/70\t女\t2003/6/20\t大专\t99306.36\t4\r\n山东\t山东威海\t26398602\t7/9/69\t女\t2004/12/18\t高中\t99204.15\t12\r\n山东\t山东潍坊\t132806902\t10/26/70\t女\t2007/4/25\t高中\t99174.8\t23\r\n浙江\t浙江杭州\t506074212\t9/19/69\t女\t2013/3/11\t高中\t99143.5\t7\r\n黑龙江\t黑龙江哈尔滨\t71578412\t1/27/68\t女\t2005/12/30\t大专\t99125.38\t13\r\n深圳\t深圳宝安\t5005955152\t5/29/82\t女\t2015/10/26\t本科\t99069.76\t10\r\n辽宁\t辽宁铁岭\t517219302\t10/17/80\t女\t2013/4/25\t中专\t99003.41\t7\r\n四川\t四川内江\t290108802\t3/5/72\t女\t2009/4/1\t高中\t98999.2\t9\r\n新疆\t新疆库尔勒\t516093542\t11/1/80\t女\t2013/4/22\t本科\t98972.98\t12\r\n四川\t四川高新\t447248802\t5/24/80\t女\t2011/12/16\t高中\t98965.05\t14\r\n北京\t北京海淀\t819587422\t1/19/78\t男\t2015/7/31\t硕士\t98889\t17\r\n江苏\t江苏常州\t484964082\t2/29/64\t女\t2012/11/24\t高中\t98876.2\t6\r\n陕西\t陕西咸阳\t548466282\t1/15/81\t男\t2013/6/25\t高中\t98771\t10\r\n深圳\t深圳宝安\t5004716862\t11/28/75\t女\t2015/10/24\t高中\t98721\t7\r\n浙江\t浙江杭州\t795940912\t4/8/70\t女\t2015/7/20\t高中\t98705\t17\r\n上海\t上海黄浦\t499778422\t2/12/80\t女\t2013/1/15\t本科\t98599\t7\r\n大连\t大连明锐\t135751102\t3/29/83\t女\t2007/5/21\t大专\t98538.68\t3\r\n四川\t四川青羊\t144947952\t12/8/65\t女\t2007/6/25\t初中\t98499.63\t10\r\n北京\t北京海淀\t390068352\t2/22/83\t女\t2010/8/10\t大专\t98481.86\t7\r\n黑龙江\t黑龙江哈尔滨\t135527372\t9/17/77\t女\t2007/5/18\t本科\t98420.85\t19\r\n四川\t四川青羊\t36107812\t11/23/78\t女\t2005/3/29\t大专\t98401.8\t9\r\n山东\t山东济南\t87583412\t10/27/78\t女\t2006/6/21\t大专\t98305.83\t13\r\n黑龙江\t黑龙江牡丹江\t443346612\t12/25/72\t女\t2011/11/4\t中专\t98225\t4\r\n山东\t山东济南\t153760302\t10/20/78\t女\t2007/7/25\t本科\t98218.69\t9\r\n北京\t北京东城\t319840352\t9/10/89\t男\t2009/8/1\t中专\t98169.1\t2\r\n广东\t广东中山\t223070222\t8/24/74\t女\t2008/5/13\t中专\t98114.68\t13\r\n佛山\t佛山顺德龙江\t5191142692\t2/20/74\t男\t2016/7/22\t高中\t98081\t6\r\n安徽\t安徽合肥\t638251712\t12/19/80\t女\t2014/6/18\t高中\t98047.05\t12\r\n浙江\t浙江温州\t5029416482\t10/20/70\t女\t2015/11/24\t高中\t97976.7\t8\r\n山东\t山东烟台\t147737092\t10/16/64\t女\t2007/7/4\t高中\t97890\t6\r\n四川\t四川成都\t588863362\t12/18/76\t女\t2013/12/5\t高中\t97870.67\t12\r\n重庆\t重庆渝中\t163286122\t12/30/75\t女\t2007/9/17\t本科\t97837.06\t9\r\n山东\t山东德州\t352413232\t5/27/79\t女\t2009/12/25\t初中\t97730.62\t18\r\n北京\t北京东城\t5033551202\t2/15/74\t男\t2015/11/27\t本科\t97657\t5\r\n山东\t山东烟台\t78641962\t1/26/73\t女\t2006/3/22\t中专\t97638.85\t24\r\n湖北\t湖北十堰\t5227545802\t11/8/88\t女\t2016/8/31\t大专\t97633\t9\r\n浙江\t浙江金华\t96543282\t8/16/77\t女\t2006/9/7\t高中\t97604.35\t18\r\n河南\t河南洛阳\t16789462\t9/18/68\t女\t2004/8/2\t高中\t97576.98\t4\r\n贵州\t贵州贵阳\t276847162\t11/1/73\t女\t2009/1/13\t本科\t97530.44\t11\r\n江西\t江西南昌\t507063332\t3/27/76\t女\t2013/3/15\t大专\t97526.61\t9\r\n青岛\t青岛即墨\t151794342\t6/25/70\t女\t2007/7/23\t中专\t97495.91\t1\r\n山东\t山东东营\t64554772\t9/13/76\t女\t2005/11/3\t大专\t97494.9\t3\r\n青岛\t青岛一支\t5142622\t5/22/70\t男\t2003/6/28\t大专\t97432\t5\r\n山东\t山东济南\t4971512\t4/23/70\t女\t2003/7/1\t大专\t97312.81\t6\r\n深圳\t深圳南山\t726207822\t6/2/65\t女\t2015/3/25\t高中\t97291.96\t12\r\n宁波\t宁波城区\t243628082\t5/6/71\t女\t2008/8/1\t大专\t97267.04\t6\r\n辽宁\t辽宁沈阳\t5183067182\t10/2/82\t男\t2016/6/25\t硕士\t97249\t15\r\n湖南\t湖南永州\t431968582\t6/28/68\t女\t2011/7/28\t高中\t97209.62\t8\r\n湖南\t湖南长沙\t5032996412\t7/23/76\t女\t2015/11/27\t高中\t97151.6\t12\r\n四川\t四川成都\t3338562\t4/27/69\t女\t2003/3/27\t高中\t97122.65\t5\r\n海南\t海南海口\t446654522\t1/18/83\t女\t2011/12/12\t高中\t97074.89\t0\r\n四川\t四川高新\t477749512\t8/15/72\t女\t2012/9/11\t大专\t97048\t6\r\n广西\t广西玉林\t5168807282\t9/1/83\t女\t2016/6/12\t大专\t97015.4\t15\r\n黑龙江\t黑龙江哈尔滨\t338913482\t5/26/72\t女\t2009/10/26\t大专\t96932.4\t9\r\n湖南\t湖南株洲\t845298562\t10/12/80\t女\t2015/8/10\t中专\t96879.5\t3\r\n深圳\t深圳福田\t548682472\t9/29/86\t女\t2013/6/25\t大专\t96814.14\t10\r\n山东\t山东潍坊\t20426612\t1/24/58\t女\t2004/10/8\t高中\t96805.89\t18\r\n山东\t山东威海\t5201885182\t7/16/85\t女\t2016/8/2\t中专\t96581.5\t12\r\n四川\t四川高新\t5203846022\t7/27/75\t男\t2016/8/3\t硕士\t96358\t11\r\n江苏\t江苏泰州\t329168402\t4/30/64\t女\t2009/9/4\t高中\t96353.12\t9\r\n湖北\t湖北襄阳\t5200646892\t10/24/81\t男\t2016/8/2\t高中\t96219.9\t18\r\n黑龙江\t黑龙江哈尔滨\t559981922\t1/27/60\t女\t2013/6/28\t大专\t96186.63\t11\r\n湖北\t湖北襄阳\t639633302\t9/23/68\t女\t2014/6/22\t高中\t96175.83\t15\r\n上海\t上海黄浦\t681514412\t10/19/76\t女\t2014/11/11\t高中\t96160.3\t17\r\n苏州\t苏州新区\t497412182\t2/28/70\t女\t2012/12/31\t本科\t96150.58\t5\r\n山东\t山东烟台\t475028072\t5/2/65\t男\t2012/8/18\t本科\t96148.09\t5\r\n浙江\t浙江杭州\t269198812\t8/10/71\t女\t2008/12/10\t高中\t96053.47\t4\r\n新疆\t新疆石河子\t351640302\t3/14/80\t女\t2009/12/24\t大专\t96046.52\t11\r\n大连\t大连明锐\t5209345112\t4/18/61\t女\t2016/8/8\t大专\t96021\t12\r\n上海\t上海黄浦\t655760562\t2/5/92\t男\t2014/8/13\t高中\t95894.04\t3\r\n四川\t四川青羊\t650428632\t11/14/72\t女\t2014/8/1\t大专\t95818.6\t15\r\n辽宁\t辽宁营口\t596035222\t6/24/67\t女\t2013/12/24\t中专\t95817\t4\r\n苏州\t苏州昆山\t473952832\t12/15/79\t女\t2012/8/7\t高中\t95747.6\t6\r\n广东\t广东广州\t638737412\t10/24/82\t女\t2014/6/20\t大专\t95740.23\t7\r\n吉林\t吉林四平\t487337162\t10/31/67\t女\t2012/12/4\t大专\t95630.1\t4\r\n河北\t河北衡水\t375831542\t9/26/68\t女\t2010/5/19\t大专\t95592.7\t9\r\n四川\t四川高新\t5096543182\t1/9/82\t女\t2016/3/16\t高中\t95569\t7\r\n山东\t山东菏泽\t364142692\t4/17/70\t女\t2010/3/15\t大专\t95557.77\t13\r\n深圳\t深圳宝安\t5231282552\t3/1/77\t女\t2016/9/8\t高中\t95526.5\t8\r\n江苏\t江苏南京\t455447052\t6/8/79\t女\t2012/3/8\t本科\t95469.9\t12\r\n浙江\t浙江绍兴\t736120942\t8/25/86\t女\t2015/4/7\t本科\t95447.5\t8\r\n山西\t山西运城\t481106272\t8/16/78\t女\t2012/10/24\t大专\t95426.29\t1\r\n河北\t河北唐山\t51922582\t10/5/54\t女\t2005/7/18\t高中\t95421.73\t9\r\n云南\t云南昆明\t378657522\t2/1/82\t男\t2010/6/1\t大专\t95393.7\t7\r\n浙江\t浙江金华\t650882232\t3/27/72\t女\t2014/8/4\t大专\t95374.55\t9\r\n青岛\t青岛一支\t103518072\t5/12/60\t女\t2006/11/15\t本科\t95373.96\t9\r\n辽宁\t辽宁鞍山\t600708942\t2/11/75\t女\t2013/12/30\t高中\t95342.9\t12\r\n大连\t大连海川\t551412152\t10/21/55\t女\t2013/6/25\t本科\t95321.3\t3\r\n青岛\t青岛一支\t5125018602\t11/12/78\t男\t2016/4/19\t硕士\t95319.7\t16\r\n湖南\t湖南衡阳\t5205793292\t3/18/68\t男\t2016/8/5\t高中\t95287.3\t16\r\n河南\t河南焦作\t362609812\t5/19/71\t女\t2010/3/2\t高中\t95257.82\t4\r\n云南\t云南昆明\t469996352\t6/20/70\t女\t2012/6/25\t高中\t95256.42\t11\r\n四川\t四川青羊\t753338792\t11/26/71\t女\t2015/5/11\t大专\t95106.83\t13\r\n北京\t北京海淀\t456621932\t5/23/88\t女\t2012/3/14\t本科\t95096.47\t5\r\n四川\t四川高新\t459468432\t8/22/85\t女\t2012/3/25\t高中\t95085.5\t9\r\n山东\t山东烟台\t5220037822\t11/8/85\t女\t2016/8/19\t中专\t95057.5\t16\r\n上海\t上海陆家嘴\t5203570462\t12/10/87\t男\t2016/8/3\t高中\t95023.5\t13\r\n四川\t四川青羊\t4844782\t12/19/73\t女\t2003/6/23\t大专\t95019.67\t5\r\n浙江\t浙江杭州\t25036832\t1/23/75\t女\t2004/11/30\t高中\t94987.05\t13\r\n四川\t四川高新\t8675932\t12/8/70\t女\t2003/10/29\t大专\t94928.42\t2\r\n河南\t河南南阳\t507040442\t4/25/70\t女\t2013/3/15\t大专\t94910.29\t5\r\n黑龙江\t黑龙江哈尔滨\t763221212\t6/3/75\t女\t2015/6/10\t本科\t94887.41\t11\r\n山东\t山东烟台\t506767862\t1/16/79\t女\t2013/3/14\t大专\t94880.2\t9\r\n山东\t山东淄博\t464700292\t4/26/81\t女\t2012/5/14\t大专\t94785.91\t17\r\n四川\t四川青羊\t5218597292\t5/20/88\t男\t2016/8/18\t本科\t94734\t14\r\n浙江\t浙江绍兴\t5154556452\t11/10/60\t女\t2016/5/31\t大专\t94732.6\t16\r\n四川\t四川高新\t674932092\t5/24/73\t女\t2014/9/29\t本科\t94690.5\t15\r\n湖南\t湖南长沙\t623500872\t7/13/76\t女\t2014/4/15\t本科\t94663.45\t8\r\n江西\t江西上饶\t803194422\t6/30/73\t女\t2015/7/26\t大专\t94621\t2\r\n山东\t山东威海\t5097559432\t8/5/80\t女\t2016/3/17\t大专\t94593.8\t14\r\n山东\t山东烟台\t64658612\t4/17/74\t女\t2005/11/4\t中专\t94590.65\t19\r\n山东\t山东烟台\t345866082\t3/23/71\t男\t2009/11/25\t大专\t94577.62\t14\r\n广东\t广东珠海\t87243562\t1/10/73\t女\t2006/6/16\t大专\t94572.05\t10\r\n四川\t四川青羊\t657561552\t7/8/78\t女\t2014/8/18\t本科\t94520.96\t22\r\n浙江\t浙江绍兴\t464707132\t9/26/67\t女\t2012/5/15\t初中\t94505.57\t11\r\n河北\t河北沧州\t5153855712\t10/23/63\t女\t2016/5/30\t高中\t94428.7\t21\r\n山东\t山东烟台\t675805092\t9/19/82\t女\t2014/10/5\t大专\t94387\t13\r\n湖南\t湖南长沙\t427070432\t4/19/72\t男\t2011/6/16\t本科\t94323.82\t5\r\n上海\t上海黄浦\t5117294882\t4/21/79\t女\t2016/4/6\t本科\t94269\t10\r\n北京\t北京海淀\t324269552\t5/15/85\t女\t2009/8/17\t本科\t94185.97\t16\r\n湖北\t湖北武汉\t20867232\t8/31/68\t女\t2004/10/15\t本科\t94160.08\t11\r\n湖北\t湖北武汉\t85274532\t2/19/75\t女\t2006/5/24\t中专\t94149.9\t5\r\n山东\t山东威海\t344538782\t9/13/74\t女\t2009/11/23\t中专\t94133.9\t11\r\n苏州\t苏州昆山\t659999532\t7/23/73\t女\t2014/8/22\t高中\t94105.9\t7\r\n青岛\t青岛一支\t5032034582\t3/21/79\t女\t2015/11/26\t大专\t94064.5\t5\r\n佛山\t佛山顺德龙江\t476289072\t12/23/76\t女\t2012/8/30\t初中\t94059.37\t9\r\n辽宁\t辽宁阜新\t472876622\t5/20/71\t女\t2012/7/26\t本科\t94058.64\t6\r\n四川\t四川高新\t131792522\t12/27/84\t女\t2007/4/24\t大专\t94040.36\t17\r\n广东\t广东湛江\t702191462\t6/29/88\t女\t2015/1/2\t本科\t93992.8\t4\r\n北京\t北京海淀\t527336332\t6/25/90\t女\t2013/6/3\t大专\t93953.05\t9\r\n河北\t河北保定\t144027502\t2/4/70\t男\t2007/6/25\t高中\t93945.7\t7\r\n山西\t山西临汾\t5191599582\t7/1/68\t女\t2016/7/24\t大专\t93939.2\t23\r\n山东\t山东泰安\t281850822\t4/11/75\t女\t2009/3/2\t大专\t93930.28\t14\r\n浙江\t浙江杭州\t12249582\t11/18/80\t男\t2004/4/8\t大专\t93923.35\t10\r\n湖北\t湖北武汉\t488880922\t2/11/91\t男\t2012/12/10\t本科\t93919.13\t0\r\n辽宁\t辽宁葫芦岛\t544102952\t6/2/61\t女\t2013/6/21\t大专\t93886.8\t0\r\n北京\t北京东城\t557197952\t10/8/86\t男\t2013/6/27\t本科\t93875.02\t0\r\n佛山\t佛山禅城\t5080375962\t5/24/81\t女\t2016/3/8\t高中\t93802\t18\r\n河北\t河北唐山\t334361322\t3/5/67\t女\t2009/9/26\t大专\t93751.23\t5\r\n广东\t广东东莞\t735061482\t12/10/80\t女\t2015/4/3\t大专\t93732.4\t16\r\n云南\t云南昆明\t228354972\t12/15/70\t女\t2008/6/1\t中专\t93700.53\t6\r\n深圳\t深圳南山\t5188369572\t12/7/79\t男\t2016/7/12\t高中\t93605.6\t17\r\n浙江\t浙江衢州\t5199211832\t5/29/74\t女\t2016/8/1\t高中\t93562.3\t7\r\n北京\t北京东城\t74730562\t3/10/79\t女\t2006/2/5\t大专\t93546.29\t11\r\n河南\t河南郑州\t5160008392\t8/1/80\t男\t2016/6/2\t大专\t93545.5\t17\r\n福建\t福建厦门\t141435162\t8/4/75\t女\t2007/6/19\t高中\t93486.36\t24\r\n湖北\t湖北宜昌\t768699962\t7/19/76\t女\t2015/6/23\t本科\t93477\t13\r\n北京\t北京良乡\t5207101442\t2/11/85\t女\t2016/8/6\t大专\t93463\t16\r\n山西\t山西阳泉\t322746582\t4/18/62\t女\t2009/8/6\t大专\t93452.88\t4\r\n江苏\t江苏徐州\t767181462\t3/5/77\t女\t2015/6/19\t高中\t93427\t2\r\n福建\t福建泉州\t91697052\t7/12/72\t女\t2006/7/24\t高中\t93392.69\t8\r\n北京\t北京东城\t569442842\t9/13/85\t女\t2013/7/15\t本科\t93330.44\t19\r\n大连\t大连海川\t5367052\t4/8/63\t女\t2003/7/1\t大专\t93323.98\t4\r\n浙江\t浙江杭州\t398293532\t11/20/89\t男\t2010/9/28\t大专\t93234.42\t5\r\n福建\t福建漳州\t5032428952\t1/4/60\t男\t2015/11/26\t高中\t93171\t11\r\n大连\t大连明锐\t5111716932\t12/22/87\t女\t2016/3/25\t本科\t93131.5\t20\r\n四川\t四川高新\t655901942\t9/24/74\t女\t2014/8/13\t本科\t93123.11\t5\r\n佛山\t佛山顺德龙江\t473792332\t1/5/83\t女\t2012/8/6\t高中\t93121.24\t6\r\n江西\t江西上饶\t5148744622\t11/8/75\t女\t2016/5/26\t高中\t93120\t1\r\n甘肃\t甘肃兰州\t243823752\t7/11/74\t女\t2008/8/1\t本科\t93108.1\t8\r\n新疆\t新疆库尔勒\t629744742\t8/12/69\t女\t2014/5/21\t中专\t93094.09\t12\r\n黑龙江\t黑龙江佳木斯\t501825332\t9/21/61\t女\t2013/1/29\t高中\t93056\t6\r\n云南\t云南昆明\t5188833732\t5/26/78\t女\t2016/7/14\t高中\t93053\t10\r\n湖北\t湖北武汉\t5030019322\t11/5/83\t女\t2015/11/25\t大专\t92982\t10\r\n辽宁\t辽宁丹东\t465895692\t11/30/72\t女\t2012/5/25\t大专\t92973\t5\r\n福建\t福建厦门\t869942702\t6/1/77\t男\t2015/9/10\t高中\t92946\t12\r\n浙江\t浙江杭州\t391283572\t11/11/67\t女\t2010/8/18\t大专\t92923.22\t2\r\n广东\t广东珠海\t7107882\t3/17/66\t女\t2003/9/5\t大专\t92852.91\t9\r\n佛山\t佛山顺德龙江\t637009832\t10/2/86\t女\t2014/6/16\t高中\t92844.5\t4\r\n青岛\t青岛开发区\t508306882\t8/3/76\t女\t2013/3/21\t大专\t92837.66\t14\r\n湖北\t湖北十堰\t309086332\t12/14/81\t女\t2009/6/25\t本科\t92752.03\t13\r\n辽宁\t辽宁丹东\t432215202\t10/3/65\t女\t2011/8/1\t高中\t92698.99\t3\r\n山东\t山东日照\t172617242\t12/2/79\t女\t2007/10/25\t本科\t92656.6\t14\r\n重庆\t重庆渝中\t5201038492\t2/27/75\t男\t2016/8/2\t大专\t92654\t21\r\n山东\t山东淄博\t629855422\t12/15/70\t女\t2014/5/22\t高中\t92610.18\t7\r\n四川\t四川青羊\t292768142\t9/23/83\t女\t2009/4/15\t本科\t92589.49\t17\r\n福建\t福建泉州\t91538222\t8/15/74\t女\t2006/7/24\t大专\t92581.29\t6\r\n黑龙江\t黑龙江牡丹江\t120111212\t1/16/79\t男\t2007/2/14\t中专\t92569.53\t2\r\n浙江\t浙江温州\t637962112\t7/5/80\t女\t2014/6/18\t本科\t92483.88\t2\r\n重庆\t重庆渝中\t426365472\t8/18/81\t女\t2011/6/8\t本科\t92441\t14\r\n福建\t福建龙岩\t589269782\t5/24/79\t女\t2013/12/7\t大专\t92347.97\t18\r\n陕西\t陕西西安\t669299252\t3/22/81\t女\t2014/9/16\t本科\t92346.5\t10\r\n重庆\t重庆渝中\t227137382\t12/21/72\t男\t2008/6/1\t大专\t92309.94\t17\r\n北京\t北京海淀\t1918732\t6/27/66\t男\t2002/9/17\t大专\t92247.46\t2\r\n四川\t四川青羊\t599340062\t3/7/83\t女\t2013/12/27\t大专\t92242.4\t6\r\n宁波\t宁波象山\t5196663522\t3/27/86\t女\t2016/7/29\t本科\t92237\t14\r\n湖北\t湖北宜昌\t5031497932\t11/19/79\t女\t2015/11/25\t中专\t92225.5\t17\r\n辽宁\t辽宁沈阳\t5177257152\t9/10/79\t女\t2016/6/21\t中技\t92217\t11\r\n四川\t四川绵阳\t82790772\t9/11/74\t女\t2006/4/25\t大专\t92183.97\t4\r\n深圳\t深圳福田第二\t5228670822\t3/3/74\t女\t2016/9/2\t本科\t92176\t8\r\n浙江\t浙江杭州\t727719212\t10/30/79\t男\t2015/3/25\t本科\t92102.5\t9\r\n青岛\t青岛一支\t265418882\t6/16/80\t女\t2008/11/24\t大专\t92100.37\t10\r\n天津\t天津市区一支\t727509162\t11/1/92\t女\t2015/3/25\t本科\t92000\t0\r\n四川\t四川青羊\t9289062\t8/16/67\t女\t2003/12/5\t大专\t91984.11\t11\r\n辽宁\t辽宁本溪\t625705912\t2/9/72\t女\t2014/4/28\t大专\t91872.03\t11\r\n浙江\t浙江金华\t50410222\t7/17/72\t女\t2005/6/30\t大专\t91862.85\t6\r\n重庆\t重庆永川\t5098238432\t1/20/69\t女\t2016/3/17\t高中\t91857.5\t25\r\n湖北\t湖北黄冈\t545442532\t9/12/77\t女\t2013/6/23\t高中\t91831.11\t7\r\n湖北\t湖北武汉\t633934862\t7/24/79\t女\t2014/6/6\t本科\t91829\t14\r\n山东\t山东济南\t465902532\t2/1/86\t女\t2012/5/25\t本科\t91752.3\t25\r\n黑龙江\t黑龙江哈尔滨\t523551932\t1/2/74\t女\t2013/5/27\t本科\t91710.01\t0\r\n青岛\t青岛一支\t718702952\t1/5/77\t男\t2015/3/24\t大专\t91691.02\t13\r\n四川\t四川高新\t359755502\t2/28/89\t男\t2010/1/29\t高中\t91580.37\t3\r\n北京\t北京东城\t334473672\t6/3/82\t女\t2009/10/1\t本科\t91525.1\t4\r\n山东\t山东淄博\t235809322\t10/19/71\t女\t2008/6/25\t高中\t91504.74\t10\r\n陕西\t陕西汉中\t778112732\t11/29/85\t女\t2015/6/30\t大专\t91494\t7\r\n佛山\t佛山顺德龙江\t653737242\t3/9/78\t女\t2014/8/8\t中专\t91478.55\t6\r\n河北\t河北唐山\t519962932\t11/7/79\t女\t2013/5/13\t中专\t91458.27\t2\r\n辽宁\t辽宁营口\t70415112\t12/2/78\t女\t2005/12/23\t初中\t91450.32\t9\r\n山东\t山东济南\t811464682\t12/16/87\t女\t2015/7/29\t本科\t91415.2\t18\r\n江西\t江西南昌\t514131352\t4/4/63\t女\t2013/4/3\t本科\t91406.55\t2\r\n四川\t四川青羊\t15583452\t7/2/69\t女\t2004/7/1\t大专\t91406.5\t20\r\n深圳\t深圳南山\t572200852\t4/10/89\t女\t2013/8/4\t中专\t91278.09\t6\r\n海南\t海南海口\t498577852\t9/21/81\t女\t2013/1/6\t本科\t91277.63\t14\r\n山东\t山东烟台\t5129839592\t1/22/75\t女\t2016/4/28\t中专\t91233.9\t9\r\n四川\t四川高新\t5196345312\t2/10/82\t女\t2016/7/29\t本科\t91187\t16\r\n山西\t山西长治\t429633742\t12/5/82\t女\t2011/6/29\t本科\t91177.2\t4\r\n四川\t四川青羊\t584077562\t11/1/90\t男\t2013/11/14\t大专\t91159.45\t6\r\n江苏\t江苏连云港\t241982152\t6/2/72\t女\t2008/7/24\t高中\t91114.57\t1\r\n深圳\t深圳福田第二\t790523292\t7/14/81\t女\t2015/7/15\t大专\t91091\t8\r\n辽宁\t辽宁沈阳\t374739282\t8/20/71\t女\t2010/5/12\t本科\t91089.16\t7\r\n宁波\t宁波宁海\t707703712\t4/3/77\t女\t2015/2/2\t高中\t91000\t0\r\n福建\t福建莆田\t383636622\t4/14/80\t女\t2010/6/25\t高中\t90949.85\t5\r\n四川\t四川绵阳\t5211370342\t5/30/71\t女\t2016/8/9\t高中\t90934.3\t10\r\n江西\t江西赣州\t5171226882\t3/6/73\t女\t2016/6/15\t大专\t90916.7\t14\r\n福建\t福建福州\t730666752\t8/10/82\t女\t2015/3/30\t中专\t90854.4\t13\r\n宁波\t宁波城区\t5069851912\t1/15/93\t女\t2016/3/1\t大专\t90836\t9\r\n河南\t河南郑州\t540622262\t10/21/83\t女\t2013/6/19\t本科\t90831.26\t18\r\n辽宁\t辽宁沈阳\t6736632\t10/14/58\t女\t2003/8/21\t大专\t90811.91\t12\r\n北京\t北京东城\t54242\t7/20/68\t男\t2001/12/20\t大专\t90774.4\t1\r\n青海\t西宁\t652403802\t9/1/78\t女\t2014/8/6\t中专\t90746.99\t6\r\n黑龙江\t黑龙江佳木斯\t699047822\t3/29/62\t女\t2014/12/26\t大专\t90729.7\t4\r\n四川\t四川青羊\t3528792\t3/18/71\t女\t2003/4/10\t大专\t90724.54\t2\r\n湖北\t湖北武汉\t5734793212\t5/12/78\t女\t2018/5/28\t大专\t90678.24\t4\r\n山东\t山东日照\t5205520432\t11/13/80\t女\t2016/8/4\t中专\t90666\t10\r\n深圳\t深圳福田\t4342062\t7/7/66\t男\t2003/5/22\t本科\t90640.14\t2\r\n辽宁\t辽宁营口\t710040922\t5/12/83\t女\t2015/2/25\t本科\t90577.25\t5\r\n四川\t四川青羊\t569343472\t5/25/85\t男\t2013/7/12\t大专\t90514.58\t0\r\n四川\t四川青羊\t626756862\t7/25/83\t女\t2014/5/5\t大专\t90506.31\t8\r\n江苏\t江苏无锡\t736483682\t9/17/79\t女\t2015/4/7\t高中\t90502.5\t9\r\n苏州\t苏州张家港\t482494972\t4/13/62\t女\t2012/11/8\t高中\t90490.08\t25\r\n河北\t河北邯郸\t5172713592\t2/18/67\t女\t2016/6/15\t中专\t90490\t4\r\n辽宁\t辽宁沈阳\t96343142\t3/18/63\t女\t2006/9/6\t大专\t90489.07\t7\r\n山东\t山东菏泽\t679873922\t10/1/83\t女\t2014/11/3\t大专\t90476.5\t21\r\n浙江\t浙江杭州\t5027552642\t6/29/75\t女\t2015/11/23\t高中\t90465.6\t13\r\n河南\t河南郑州\t150147712\t8/18/78\t男\t2007/7/17\t大专\t90416.36\t8\r\n河南\t河南洛阳\t316101732\t3/16/65\t女\t2009/7/20\t高中\t90398.7\t0\r\n四川\t四川青羊\t416859472\t5/1/74\t女\t2011/3/4\t大专\t90393.3\t0\r\n山西\t山西长治\t273291932\t7/14/66\t女\t2009/1/1\t本科\t90356.34\t4\r\n安徽\t安徽合肥\t418718522\t9/18/63\t女\t2011/3/1\t高中\t90245.28\t5\r\n浙江\t浙江杭州\t311507562\t9/3/81\t男\t2009/6/29\t大专\t90180.7\t10\r\n辽宁\t辽宁盘锦\t607784502\t4/5/69\t女\t2014/1/26\t本科\t90143.62\t14\r\n山东\t山东烟台\t543396322\t11/14/81\t女\t2013/6/21\t初中\t90140\t14\r\n黑龙江\t黑龙江七台河\t5035937222\t8/31/72\t女\t2015/11/30\t高中\t90139.9\t3\r\n黑龙江\t黑龙江哈尔滨\t805420952\t5/5/81\t男\t2015/7/27\t本科\t90139\t1\r\n广东\t广东东莞\t260774192\t10/29/76\t女\t2008/11/3\t大专\t90022.24\t9\r\n山东\t山东潍坊\t524510352\t2/5/82\t女\t2013/5/29\t大专\t90000\t0\r\n黑龙江\t黑龙江佳木斯\t5066351742\t3/3/65\t男\t2016/2/16\t大专\t90000\t0\r\n辽宁\t辽宁沈阳\t880929662\t6/9/76\t女\t2015/9/30\t本科\t90000\t0\r\n湖南\t湖南衡阳\t833682152\t10/4/68\t女\t2015/8/7\t中专\t89993\t14\r\n河南\t河南三门峡\t462401322\t10/13/68\t女\t2012/4/21\t高中\t89985.27\t5\r\n四川\t四川青羊\t5219831082\t12/11/88\t女\t2016/8/19\t大专\t89938\t13\r\n宁波\t宁波宁海\t731220422\t11/30/75\t女\t2015/3/31\t高中\t89936\t2\r\n北京\t北京东城\t569286112\t9/9/82\t女\t2013/7/11\t大专\t89890\t10\r\n辽宁\t辽宁盘锦\t295230682\t6/26/76\t女\t2009/4/25\t大专\t89862.82\t11\r\n四川\t四川高新\t14944092\t4/29/68\t女\t2004/6/25\t本科\t89859.71\t4\r\n河南\t河南南阳\t213697092\t12/27/82\t女\t2008/4/1\t高中\t89813.6\t14\r\n山东\t山东德州\t264780222\t2/25/64\t女\t2008/11/21\t中专\t89776.79\t11\r\n广东\t广东中山\t691604782\t12/4/73\t女\t2014/12/17\t大专\t89654.7\t10\r\n重庆\t重庆渝中\t879069912\t7/23/87\t男\t2015/9/26\t本科\t89649\t13\r\n四川\t四川高新\t573224172\t3/16/82\t女\t2013/8/12\t大专\t89647.08\t11\r\n天津\t天津市区一支\t5206507672\t9/8/81\t男\t2016/8/5\t本科\t89635\t7\r\n苏州\t苏州张家港\t417483482\t1/27/65\t女\t2011/3/11\t初中\t89628.61\t4\r\n重庆\t重庆江津\t497202132\t8/10/76\t女\t2012/12/31\t高中\t89617\t19\r\n山东\t山东莱芜\t433655822\t5/27/80\t男\t2011/8/10\t大专\t89579.7\t11\r\n河南\t河南南阳\t513928142\t10/31/69\t女\t2013/4/3\t本科\t89550.66\t2\r\n四川\t四川高新\t216688042\t9/14/78\t女\t2008/4/17\t大专\t89548.56\t10\r\n山东\t山东东营\t422305152\t8/8/83\t女\t2011/4/25\t初中\t89539.9\t8\r\n吉林\t吉林长春\t720964382\t1/9/86\t女\t2015/3/24\t本科\t89489.5\t7\r\n黑龙江\t黑龙江佳木斯\t343933892\t5/16/78\t女\t2009/11/19\t高中\t89464.95\t21\r\n浙江\t浙江金华\t379127172\t4/2/68\t男\t2010/6/4\t高中\t89463.38\t6\r\n山东\t山东临沂\t90727052\t11/13/77\t女\t2006/7/6\t中专\t89454.62\t13\r\n新疆\t新疆昌吉\t584126412\t9/3/70\t男\t2013/11/14\t高中\t89377.99\t13\r\n黑龙江\t黑龙江哈尔滨\t174668892\t5/29/55\t女\t2007/11/2\t本科\t89343.96\t2\r\n河北\t河北唐山\t5008806232\t11/8/87\t女\t2015/11/3\t大专\t89330\t8\r\n北京\t北京东城\t511351152\t8/7/78\t女\t2013/4/1\t大专\t89322.5\t4\r\n广东\t广东汕头\t148474152\t11/7/78\t女\t2007/7/6\t高中\t89301.56\t8\r\n辽宁\t辽宁丹东\t543759062\t3/21/65\t女\t2013/6/21\t本科\t89270\t2\r\n北京\t北京东城\t12510852\t5/31/69\t男\t2004/4/15\t大专\t89269.13\t3\r\n广东\t广东广州\t583091512\t8/25/73\t女\t2013/11/5\t大专\t89261.33\t5\r\n云南\t云南昆明\t282365552\t9/24/81\t女\t2009/3/4\t大专\t89160.81\t8\r\n辽宁\t辽宁铁岭\t468277982\t2/27/69\t女\t2012/6/18\t高中\t89102.08\t8\r\n浙江\t浙江台州\t47387172\t12/2/58\t女\t2005/6/18\t大专\t89094.92\t1\r\n大连\t大连明锐\t637143402\t6/28/80\t女\t2014/6/16\t本科\t89082.61\t5\r\n广西\t广西贵港\t483375512\t12/15/84\t女\t2012/11/17\t本科\t89073\t8\r\n湖北\t湖北荆州\t694713252\t10/8/76\t女\t2014/12/22\t大专\t89012.5\t15\r\n四川\t四川雅安\t5107785212\t1/9/82\t女\t2016/3/23\t高中\t89000\t0\r\n广西\t广西柳州\t5205188652\t10/18/81\t女\t2016/8/4\t中专\t88986.2\t25\r\n北京\t北京平谷\t22262772\t9/4/68\t女\t2004/11/4\t大专\t88974.85\t18\r\n上海\t上海陆家嘴\t185781882\t7/22/70\t女\t2007/12/1\t高中\t88941.5\t5\r\n山东\t山东滨州\t5066430602\t9/10/86\t女\t2016/2/16\t大专\t88921.1\t4\r\n四川\t四川青羊\t21408892\t8/1/75\t女\t2004/10/25\t高中\t88870.9\t3\r\n山西\t山西吕梁\t496661442\t12/26/72\t女\t2012/12/31\t大专\t88829.36\t9\r\n四川\t四川成都\t5182542302\t10/11/77\t女\t2016/6/24\t大专\t88799.6\t3\r\n青岛\t青岛一支\t279633502\t5/23/78\t女\t2009/2/18\t大专\t88799.1\t13\r\n四川\t四川泸州\t5187898142\t3/6/79\t女\t2016/7/8\t高中\t88783.2\t53\r\n福建\t福建福州\t5148003032\t10/16/75\t女\t2016/5/26\t本科\t88743.9\t15\r\n山东\t山东济南\t249557362\t3/26/81\t女\t2008/9/3\t中专\t88731.69\t15\r\n苏州\t苏州常熟\t426936862\t10/14/65\t女\t2011/6/15\t高中\t88715.48\t4\r\n黑龙江\t黑龙江佳木斯\t136670852\t3/12/72\t女\t2007/5/24\t大专\t88672.07\t8\r\n福建\t福建福州\t113741312\t4/30/68\t女\t2007/1/8\t高中\t88612.49\t13\r\n山东\t山东淄博\t5187942592\t3/16/81\t女\t2016/7/8\t大专\t88541\t12\r\n北京\t北京海淀\t515395422\t9/8/89\t男\t2013/4/16\t本科\t88530\t5\r\n山东\t山东烟台\t648559672\t8/4/78\t女\t2014/7/29\t大专\t88505\t12\r\n辽宁\t辽宁丹东\t5124698592\t7/14/73\t男\t2016/4/19\t高中\t88486.5\t20\r\n北京\t北京东城\t375025812\t2/7/73\t女\t2010/5/14\t大专\t88470.1\t5\r\n湖北\t湖北襄阳\t286999362\t10/30/79\t女\t2009/3/23\t高中\t88450.99\t24\r\n佛山\t佛山禅城\t706912362\t11/23/87\t女\t2015/1/27\t大专\t88348.28\t4\r\n山东\t山东烟台\t162600282\t10/29/62\t女\t2007/9/11\t高中\t88232.16\t6\r\n陕西\t陕西西安\t381075682\t4/9/80\t女\t2010/6/21\t大专\t88203.27\t5\r\n河南\t河南三门峡\t686045082\t10/24/65\t女\t2014/11/20\t大专\t88202\t12\r\n山东\t山东济南\t651870652\t7/17/76\t女\t2014/8/5\t高中\t88180.69\t13\r\n山东\t山东烟台\t5076462382\t5/28/79\t女\t2016/3/5\t大专\t88175.4\t17\r\n山东\t山东泰安\t140462092\t9/2/73\t女\t2007/6/17\t大专\t88135.98\t8\r\n黑龙江\t黑龙江鹤岗\t118314962\t12/16/70\t女\t2007/2/1\t大专\t88129.38\t8\r\n广东\t广东中山\t454891982\t9/4/72\t女\t2012/3/7\t高中\t88088.82\t12\r\n苏州\t苏州张家港\t346991142\t5/20/65\t女\t2009/12/1\t高中\t87923.45\t5\r\n北京\t北京海淀\t130507932\t1/19/85\t男\t2007/7/1\t本科\t87921.47\t7\r\n北京\t北京平谷\t391607372\t10/20/74\t女\t2010/9/1\t本科\t87918\t-1\r\n四川\t四川高新\t708050402\t4/12/77\t男\t2015/2/4\t大专\t87859.4\t14\r\n广东\t广东广州\t467456902\t8/5/79\t女\t2012/6/7\t本科\t87853.79\t2\r\n山西\t山西长治\t5128024702\t4/28/90\t男\t2016/4/25\t高中\t87804.4\t19\r\n北京\t北京海淀\t335678982\t12/26/80\t女\t2009/10/7\t大专\t87650.39\t6\r\n福建\t福建厦门\t116382502\t8/17/69\t女\t2007/1/20\t中专\t87592.12\t11\r\n陕西\t陕西西安\t220180042\t6/5/77\t女\t2008/5/1\t本科\t87572.31\t5\r\n湖北\t湖北武汉\t21193402\t5/3/70\t女\t2004/10/20\t大专\t87540.92\t7\r\n福建\t福建漳州\t404537402\t9/20/76\t女\t2010/11/17\t高中\t87539.24\t14\r\n浙江\t浙江杭州\t27471742\t9/15/77\t女\t2004/12/30\t本科\t87536.06\t10\r\n深圳\t深圳宝安\t5163641842\t2/14/63\t女\t2016/6/6\t中专\t87480\t11\r\n河北\t河北廊坊\t5165678842\t10/30/69\t男\t2016/6/8\t中专\t87476\t2\r\n山东\t山东威海\t5061706612\t8/18/81\t女\t2016/1/18\t中专\t87460\t13\r\n福建\t福建福州\t434981722\t2/17/73\t女\t2011/8/22\t高中\t87441.29\t2\r\n江西\t江西南昌\t337947252\t8/23/83\t女\t2009/10/23\t大专\t87432.85\t8\r\n浙江\t浙江温州\t377105522\t2/28/76\t女\t2010/5/25\t中专\t87376.14\t9\r\n新疆\t新疆库尔勒\t374423022\t10/8/70\t女\t2010/5/10\t本科\t87360.09\t8\r\n云南\t云南昆明\t5228155912\t2/23/79\t女\t2016/9/1\t大专\t87353.5\t19\r\n四川\t四川青羊\t318466302\t3/30/86\t女\t2009/7/25\t高中\t87323.57\t6\r\n北京\t北京海淀\t840927422\t5/22/93\t男\t2015/8/9\t本科\t87212\t8\r\n黑龙江\t黑龙江大庆\t173224502\t5/12/72\t女\t2007/10/25\t大专\t87144.82\t8\r\n福建\t福建泉州\t169103052\t1/30/77\t女\t2007/10/11\t高中\t87095.7\t10\r\n江苏\t江苏常州\t457879862\t8/2/62\t女\t2012/3/21\t高中\t87043.32\t13\r\n深圳\t深圳福田\t158597322\t1/17/62\t男\t2007/8/21\t大专\t87011\t10\r\n山东\t山东烟台\t684344162\t7/11/73\t女\t2014/11/19\t中专\t86986.4\t8\r\n山东\t山东威海\t708066452\t12/21/77\t女\t2015/2/4\t高中\t86969.2\t4\r\n江西\t江西南昌\t18919692\t12/28/71\t男\t2004/9/16\t中专\t86915.78\t10\r\n江苏\t江苏无锡\t62851482\t5/8/74\t女\t2005/10/26\t大专\t86912\t9\r\n陕西\t陕西西安\t146375322\t1/12/70\t女\t2007/6/26\t中专\t86819.42\t6\r\n黑龙江\t黑龙江黑河\t482949272\t4/14/72\t女\t2012/11/13\t高中\t86803.26\t6\r\n天津\t天津市区二支\t323737102\t12/8/84\t女\t2009/8/12\t大专\t86770.04\t11\r\n山西\t山西临汾\t233200232\t4/24/69\t女\t2008/6/23\t高中\t86763.74\t9\r\n上海\t上海黄浦\t379537362\t11/23/70\t女\t2010/6/8\t本科\t86759.52\t7\r\n浙江\t浙江温州\t5210890812\t8/1/88\t男\t2016/8/9\t本科\t86702.9\t13\r\n湖北\t湖北武汉\t370432342\t3/15/80\t女\t2010/4/19\t大专\t86692.59\t22\r\n大连\t大连海川\t481491202\t10/28/77\t女\t2012/10/26\t本科\t86661.35\t9\r\n山东\t山东济南\t452638792\t1/14/76\t女\t2012/2/17\t大专\t86602.92\t13\r\n山东\t山东德州\t5206589232\t10/9/66\t男\t2016/8/5\t中专\t86586.3\t16\r\n山东\t山东临沂\t536370312\t7/21/74\t女\t2013/6/15\t初中\t86551.35\t11\r\n四川\t四川自贡\t5196632712\t1/26/76\t男\t2016/7/29\t高中\t86516\t18\r\n深圳\t深圳罗湖\t284942542\t3/19/75\t女\t2009/3/16\t大专\t86497.53\t3\r\n辽宁\t辽宁沈阳\t5048954262\t6/16/66\t女\t2015/12/21\t大专\t86495\t10\r\n山东\t山东威海\t79360602\t7/6/82\t男\t2006/3/24\t大专\t86488.19\t8\r\n甘肃\t甘肃金昌\t801294062\t12/24/78\t男\t2015/7/24\t大专\t86481.5\t2\r\n黑龙江\t黑龙江哈尔滨\t253105052\t12/30/69\t女\t2008/9/24\t大专\t86470.8\t6\r\n吉林\t吉林白城\t5032130682\t3/8/64\t女\t2015/11/26\t大专\t86458\t19\r\n湖北\t湖北荆州\t237624962\t8/9/75\t女\t2008/7/1\t高中\t86448.48\t10\r\n北京\t北京良乡\t118334782\t4/8/66\t女\t2007/2/1\t大专\t86413.17\t2\r\n浙江\t浙江杭州\t364349672\t10/4/87\t男\t2010/3/16\t大专\t86403\t12\r\n四川\t四川青羊\t38528072\t7/5/75\t女\t2005/4/14\t大专\t86395.8\t7\r\n北京\t北京良乡\t115745512\t1/15/78\t女\t2007/1/12\t大专\t86376.36\t3\r\n黑龙江\t黑龙江黑河\t5149999252\t4/17/70\t女\t2016/5/27\t本科\t86346\t16\r\n北京\t北京海淀\t528953232\t3/10/90\t女\t2013/6/6\t本科\t86309.65\t3\r\n山东\t山东济宁\t476947552\t9/27/80\t女\t2012/9/1\t中专\t86302.77\t7\r\n山东\t山东威海\t424795052\t9/29/73\t女\t2011/5/24\t中专\t86300.08\t15\r\n河南\t河南郑州\t138741352\t12/16/71\t女\t2007/6/6\t大专\t86297.52\t18\r\n四川\t四川乐山\t7641732\t8/11/70\t女\t2003/9/17\t本科\t86224.09\t5\r\n福建\t福建莆田\t196114132\t4/11/77\t女\t2008/1/1\t大专\t86181.49\t13\r\n浙江\t浙江杭州\t650854872\t7/9/74\t女\t2014/8/4\t中专\t86179.51\t4\r\n四川\t四川高新\t5211046732\t12/20/77\t男\t2016/8/9\t本科\t86159\t11\r\n黑龙江\t黑龙江佳木斯\t81620632\t4/12/55\t女\t2006/4/11\t大专\t86133.31\t3\r\n四川\t四川高新\t5066380752\t11/28/67\t女\t2016/2/16\t大专\t86115\t10\r\n广西\t广西桂林\t291372872\t12/4/63\t女\t2009/4/7\t大专\t86036.36\t12\r\n山东\t山东淄博\t96054512\t9/30/66\t女\t2006/9/4\t中专\t85960.37\t7\r\n广东\t广东广州\t500354282\t11/25/64\t女\t2013/1/21\t大专\t85902.48\t8\r\n四川\t四川绵阳\t5208730502\t9/23/78\t男\t2016/8/8\t高中\t85879.5\t14\r\n苏州\t苏州张家港\t598507672\t12/17/75\t男\t2013/12/26\t高中\t85773.2\t12\r\n四川\t四川青羊\t104413262\t6/4/78\t女\t2006/11/23\t大专\t85758.14\t2\r\n四川\t四川高新\t290605112\t7/22/80\t女\t2009/4/2\t大专\t85729.5\t33\r\n辽宁\t辽宁营口\t485573712\t7/9/68\t女\t2012/11/25\t中专\t85710.19\t24\r\n河南\t河南郑州\t762636142\t3/29/80\t女\t2015/6/9\t高中\t85647.9\t19\r\n四川\t四川高新\t5125753822\t2/28/86\t女\t2016/4/21\t大专\t85642\t7\r\n陕西\t陕西西安\t398561642\t11/2/76\t男\t2010/10/1\t本科\t85623.03\t5\r\n辽宁\t辽宁营口\t792054772\t5/29/82\t女\t2015/7/16\t大专\t85579.45\t16\r\n四川\t四川成都\t105791082\t9/5/75\t女\t2006/12/1\t中专\t85542.37\t7\r\n四川\t四川成都\t3297252\t4/22/66\t女\t2003/3/25\t高中\t85528.31\t5\r\n湖北\t湖北武汉\t115294982\t11/14/70\t女\t2007/1/12\t大专\t85514.95\t18\r\n山东\t山东临沂\t5165026082\t3/3/74\t女\t2016/6/7\t中专\t85494.5\t16\r\n安徽\t安徽合肥\t517726492\t7/27/83\t女\t2013/4/26\t大专\t85490.64\t16\r\n福建\t福建厦门\t609176972\t6/23/79\t女\t2014/2/13\t大专\t85452.53\t18\r\n山东\t山东济南\t5329782\t1/18/57\t女\t2003/7/1\t高中\t85448.44\t9\r\n青岛\t青岛一支\t292486352\t4/1/78\t女\t2009/4/14\t大专\t85375.66\t13\r\n山东\t山东济南\t5017564342\t2/13/71\t男\t2015/11/13\t大专\t85361.16\t8\r\n辽宁\t辽宁沈阳\t608428332\t3/19/77\t女\t2014/1/28\t高中\t85349\t7\r\n辽宁\t辽宁沈阳\t516576172\t5/9/70\t女\t2013/4/24\t大专\t85270\t8\r\n浙江\t浙江金华\t506542462\t1/31/80\t男\t2013/3/13\t中专\t85235.92\t5\r\n苏州\t苏州张家港\t76463582\t9/29/62\t女\t2006/2/27\t高中\t85135.19\t3\r\n河南\t河南洛阳\t226160542\t8/27/70\t女\t2008/5/24\t高中\t85117.77\t11\r\n山东\t山东烟台\t581207202\t5/11/82\t女\t2013/10/21\t中专\t85051.14\t17\r\n内蒙古\t内蒙古通辽\t696660092\t7/30/76\t女\t2014/12/23\t大专\t85018\t6\r\n江苏\t江苏南京\t515550482\t7/7/67\t女\t2013/4/18\t大专\t85010\t8\r\n青岛\t青岛一支\t5214177942\t2/28/68\t男\t2016/8/12\t本科\t84981.5\t11\r\n山东\t山东淄博\t73488682\t3/8/64\t女\t2006/1/13\t高中\t84967.11\t16\r\n湖北\t湖北恩施\t5215824172\t2/9/71\t女\t2016/8/15\t高中\t84945.8\t17\r\n山东\t山东淄博\t651863812\t2/19/76\t女\t2014/8/5\t中专\t84910.11\t4\r\n福建\t福建福州\t138947632\t10/31/78\t女\t2007/6/6\t本科\t84891.72\t6\r\n广西\t广西桂林\t526287752\t1/29/68\t女\t2013/6/3\t大专\t84872.29\t9\r\n广东\t广东东莞\t5204225922\t4/9/79\t男\t2016/8/3\t中专\t84859.7\t16\r\n浙江\t浙江杭州\t18588082\t2/21/70\t女\t2004/9/8\t高中\t84801.45\t9\r\n湖南\t湖南邵阳\t260130362\t5/5/61\t女\t2008/11/1\t高中\t84780.93\t3\r\n河北\t河北保定\t497959982\t8/12/57\t女\t2013/1/1\t大专\t84773.41\t20\r\n云南\t云南昆明\t213530722\t6/20/68\t女\t2008/4/1\t高中\t84765.29\t7\r\n福建\t福建龙岩\t758061092\t1/22/85\t男\t2015/5/27\t中专\t84764.5\t18\r\n黑龙江\t黑龙江哈尔滨\t370518732\t10/5/76\t男\t2010/4/19\t高中\t84725.56\t2\r\n辽宁\t辽宁朝阳\t385081712\t11/27/56\t女\t2010/7/1\t大专\t84719.86\t12\r\n安徽\t安徽合肥\t5194875842\t9/20/78\t男\t2016/7/28\t高中\t84638.3\t6\r\n山东\t山东淄博\t143307192\t2/13/60\t女\t2007/6/23\t本科\t84594.36\t9\r\n河南\t河南周口\t293069052\t8/14/66\t男\t2009/4/17\t高中\t84590\t16\r\n福建\t福建福州\t83636142\t12/21/77\t女\t2006/4/30\t大专\t84577.48\t9\r\n苏州\t苏州昆山\t5204654702\t10/4/71\t女\t2016/8/4\t大专\t84539.5\t17\r\n广西\t广西梧州\t599970212\t12/10/76\t女\t2013/12/29\t中专\t84501.1\t3\r\n苏州\t苏州昆山\t159223702\t1/6/75\t女\t2007/8/24\t高中\t84477.69\t10\r\n山东\t山东临沂\t5198984252\t7/3/74\t男\t2016/8/1\t高中\t84430\t15\r\n深圳\t深圳南山\t5205017292\t7/30/87\t男\t2016/8/4\t大专\t84339.4\t11\r\n山东\t山东烟台\t5205215862\t12/20/81\t女\t2016/8/4\t中专\t84323.6\t12\r\n佛山\t佛山顺德龙江\t8566652\t3/30/74\t女\t2003/10/1\t中专\t84309.26\t13\r\n苏州\t苏州常熟\t425260232\t8/15/62\t女\t2011/5/26\t高中\t84122.89\t6\r\n黑龙江\t黑龙江七台河\t586579742\t2/24/75\t男\t2013/11/27\t本科\t84099.2\t1\r\n湖北\t湖北武汉\t5072203452\t1/15/80\t女\t2016/3/2\t本科\t84094\t8\r\n四川\t四川青羊\t533201412\t5/9/83\t女\t2013/6/13\t大专\t84048.15\t16\r\n北京\t北京海淀\t317176272\t6/29/86\t男\t2009/8/1\t本科\t84041.51\t5\r\n山东\t山东威海\t5145992342\t6/25/78\t女\t2016/5/25\t中专\t84040.1\t12\r\n佛山\t佛山顺德龙江\t179787702\t12/26/74\t女\t2007/11/14\t高中\t84004.48\t10\r\n重庆\t重庆江津\t440587902\t10/10/68\t女\t2011/9/30\t大专\t84001.64\t11\r\n大连\t大连开发区\t236359222\t8/25/71\t女\t2008/6/25\t大专\t83965.77\t0\r\n辽宁\t辽宁葫芦岛\t739928232\t8/22/84\t男\t2015/4/9\t本科\t83930.64\t1\r\n湖北\t湖北武汉\t5110850232\t7/2/79\t女\t2016/3/25\t大专\t83904\t9\r\n四川\t四川青羊\t14720362\t1/14/82\t女\t2004/6/21\t本科\t83880.52\t9\r\n苏州\t苏州张家港\t5095297622\t8/3/74\t女\t2016/3/15\t高中\t83831\t9\r\n浙江\t浙江杭州\t430301162\t6/2/76\t女\t2011/7/8\t高中\t83822.97\t4\r\n辽宁\t辽宁本溪\t5064674632\t8/9/77\t女\t2016/2/2\t中专\t83800\t1\r\n四川\t四川青羊\t660802\t12/16/64\t女\t2002/2/25\t本科\t83790.82\t5\r\n北京\t北京东城\t3933542\t7/15/68\t女\t2003/5/1\t本科\t83768.08\t1\r\n天津\t天津滨海新区\t576804932\t1/25/71\t女\t2013/9/5\t大专\t83749\t5\r\n北京\t北京海淀\t291572042\t6/15/84\t女\t2009/4/8\t本科\t83698.19\t1\r\n山东\t山东临沂\t18819622\t3/27/72\t女\t2004/9/1\t高中\t83689.26\t7\r\n河南\t河南周口\t5198026022\t10/17/80\t女\t2016/8/1\t大专\t83673.4\t14\r\n广东\t广东珠海\t296632092\t7/4/67\t女\t2009/5/4\t大专\t83666.46\t12\r\n云南\t云南昆明\t753989462\t10/30/71\t女\t2015/5/14\t本科\t83663\t15\r\n湖北\t湖北武汉\t876387412\t9/8/84\t男\t2015/9/22\t大专\t83653\t8\r\n云南\t云南昆明\t5151106132\t4/26/84\t女\t2016/5/28\t大专\t83600\t14\r\n苏州\t苏州张家港\t134709362\t9/30/75\t女\t2007/5/11\t大专\t83565.76\t2\r\n北京\t北京良乡\t286171442\t9/7/59\t女\t2009/4/1\t高中\t83512.32\t9\r\n苏州\t苏州昆山\t658261072\t9/26/79\t女\t2014/8/19\t中专\t83476.05\t2\r\n辽宁\t辽宁沈阳\t761351552\t2/5/80\t女\t2015/6/5\t大专\t83451.46\t10\r\n浙江\t浙江金华\t638446412\t9/23/69\t女\t2014/6/19\t高中\t83413.9\t6\r\n青岛\t青岛开发区\t349898072\t10/3/63\t女\t2009/12/15\t大专\t83394.27\t11\r\n山东\t山东滨州\t328005102\t3/17/76\t女\t2009/8/29\t大专\t83375.3\t13\r\n江西\t江西南昌\t5032389972\t7/1/83\t女\t2015/11/26\t高中\t83367.5\t11\r\n安徽\t安徽淮南\t51103872\t1/1/59\t女\t2005/6/1\t大专\t83358.5\t9\r\n辽宁\t辽宁沈阳\t5008957652\t2/11/79\t女\t2015/11/3\t本科\t83344.5\t13\r\n福建\t福建福州\t71069822\t11/14/62\t女\t2005/12/29\t大专\t83313.13\t5\r\n青岛\t青岛一支\t58947892\t9/4/75\t女\t2005/9/19\t本科\t83303.66\t17\r\n北京\t北京海淀\t526893342\t1/13/90\t女\t2013/6/3\t本科\t83290\t8\r\n江西\t江西南昌\t425134202\t12/19/58\t女\t2011/5/25\t高中\t83289.3\t5\r\n湖北\t湖北武汉\t207326492\t10/29/81\t女\t2008/3/14\t中专\t83244.85\t6\r\n福建\t福建福州\t362559292\t6/19/82\t女\t2010/3/2\t大专\t83233.44\t6\r\n河南\t河南三门峡\t449008482\t9/29/73\t女\t2011/12/25\t高中\t83222.07\t7\r\n辽宁\t辽宁沈阳\t5449672\t6/20/54\t女\t2003/7/1\t大专\t83151\t7\r\n江西\t江西南昌\t532971542\t8/9/67\t女\t2013/6/13\t大专\t83146.75\t4\r\n黑龙江\t黑龙江哈尔滨\t210968112\t7/23/70\t女\t2008/3/25\t大专\t83097.83\t4\r\n青岛\t青岛一支\t807662562\t8/1/72\t女\t2015/7/28\t硕士\t83063.2\t20\r\n安徽\t安徽合肥\t77666522\t10/8/71\t女\t2006/3/1\t大专\t83055.39\t10\r\n陕西\t陕西汉中\t486527662\t9/22/75\t女\t2012/12/1\t本科\t83037.87\t10\r\n北京\t北京海淀\t571932742\t8/21/90\t男\t2013/8/1\t大专\t82990\t1\r\n湖北\t湖北十堰\t611285712\t9/5/79\t女\t2014/3/5\t本科\t82890.38\t13\r\n四川\t四川巴中\t758929622\t3/9/78\t女\t2015/5/29\t中专\t82837\t16\r\n苏州\t苏州常熟\t495202672\t6/18/78\t男\t2012/12/26\t初中\t82824.91\t3\r\n江西\t江西赣州\t812711032\t4/1/77\t女\t2015/7/29\t高中\t82809\t14\r\n四川\t四川高新\t141660562\t10/24/80\t男\t2007/6/20\t本科\t82778.3\t19\r\n北京\t北京平谷\t373519592\t11/7/68\t女\t2010/5/5\t高中\t82752\t12\r\n河南\t河南平顶山\t16158612\t3/21/56\t男\t2004/7/20\t大专\t82723.52\t9\r\n湖北\t湖北荆州\t588067542\t7/8/64\t男\t2013/12/3\t高中\t82719.4\t23\r\n四川\t四川青羊\t672201712\t7/11/76\t女\t2014/9/24\t高中\t82687\t14\r\n山西\t山西太原\t731760412\t11/20/76\t女\t2015/3/31\t中专\t82649.5\t5\r\n四川\t四川青羊\t553333032\t10/10/86\t女\t2013/6/26\t高中\t82618.1\t8\r\n宁波\t宁波象山\t226053632\t1/15/70\t女\t2008/5/23\t中专\t82501.64\t7\r\n苏州\t苏州姑苏\t29084872\t2/21/78\t女\t2005/1/14\t中专\t82447.02\t8\r\n四川\t四川高新\t432285542\t8/26/80\t女\t2011/8/1\t大专\t82416.36\t16\r\n苏州\t苏州昆山\t5217735162\t12/14/87\t女\t2016/8/17\t大专\t82354.3\t15\r\n辽宁\t辽宁丹东\t634685602\t6/23/72\t女\t2014/6/10\t大专\t82351.58\t8\r\n浙江\t浙江杭州\t313628582\t1/12/83\t女\t2009/7/8\t大专\t82325.45\t7\r\n四川\t四川高新\t833939652\t10/30/87\t男\t2015/8/7\t硕士\t82240.5\t9\r\n四川\t四川高新\t28950332\t7/9/79\t女\t2005/1/12\t大专\t82220.09\t7\r\n四川\t四川高新\t312375122\t12/6/84\t男\t2009/7/1\t本科\t82218.93\t23\r\n苏州\t苏州吴江\t714683942\t4/5/82\t女\t2015/3/20\t中专\t82217\t5\r\n上海\t上海陆家嘴\t710167652\t2/9/77\t女\t2015/2/26\t本科\t82206\t9\r\n青岛\t青岛一支\t684892662\t2/12/86\t女\t2014/11/19\t本科\t82160\t8\r\n山东\t山东日照\t518810242\t8/15/85\t女\t2013/5/3\t中专\t82126.5\t16\r\n安徽\t安徽合肥\t260756742\t1/28/81\t女\t2008/11/1\t大专\t82080.25\t2\r\n山东\t山东烟台\t71284342\t1/13/80\t女\t2005/12/29\t大专\t82056.32\t4\r\n安徽\t安徽池州\t860540542\t6/15/76\t女\t2015/8/17\t高中\t82046.9\t10\r\n重庆\t重庆永川\t5154484862\t12/20/85\t女\t2016/5/31\t中专\t81998\t21\r\n湖北\t湖北武汉\t5198642502\t5/6/85\t男\t2016/8/1\t高中\t81981\t19\r\n苏州\t苏州昆山\t5098822232\t4/24/75\t女\t2016/3/18\t高中\t81951\t19\r\n山东\t山东济南\t679256752\t9/12/82\t女\t2014/10/29\t大专\t81941\t15\r\n青岛\t青岛城阳\t5171303942\t6/23/64\t女\t2016/6/15\t大专\t81940.5\t10\r\n河北\t河北廊坊\t646585202\t5/20/64\t女\t2014/7/18\t高中\t81936\t2\r\n河北\t河北廊坊\t47145022\t12/24/61\t女\t2005/6/13\t高中\t81835.1\t10\r\n广西\t广西南宁\t506982382\t4/2/77\t女\t2013/3/15\t大专\t81820.68\t6\r\n广东\t广东中山\t251226182\t7/17/73\t女\t2008/9/12\t大专\t81808.69\t14\r\n辽宁\t辽宁辽阳\t5042009242\t12/29/57\t女\t2015/12/5\t中专\t81798.33\t4\r\n浙江\t浙江杭州\t556349242\t12/16/77\t女\t2013/6/27\t高中\t81786.64\t16\r\n天津\t天津蓟州\t124511382\t6/6/73\t女\t2007/3/21\t高中\t81785.41\t15\r\n江苏\t江苏镇江\t85113332\t6/14/70\t女\t2006/5/23\t初中\t81784.85\t10\r\n青岛\t青岛一支\t5218728772\t12/26/69\t女\t2016/8/18\t大专\t81722.5\t8\r\n福建\t福建福州\t401724402\t11/16/68\t女\t2010/10/25\t高中\t81710\t13\r\n贵州\t贵州贵阳\t5159069202\t10/31/77\t女\t2016/6/2\t大专\t81663.13\t11\r\n苏州\t苏州张家港\t5164847522\t10/7/83\t女\t2016/6/7\t高中\t81651.5\t18\r\n四川\t四川青羊\t119985182\t4/16/79\t女\t2007/2/14\t本科\t81627.71\t13\r\n深圳\t深圳宝安\t107488232\t2/27/71\t女\t2006/12/14\t大专\t81609.11\t2\r\n湖北\t湖北武汉\t35567822\t8/2/74\t男\t2005/3/25\t大专\t81557.21\t16\r\n辽宁\t辽宁本溪\t625710382\t9/28/69\t男\t2014/4/28\t大专\t81549\t2\r\n山东\t山东临沂\t831941592\t12/25/75\t女\t2015/8/6\t中专\t81536.98\t13\r\n苏州\t苏州姑苏\t256264042\t12/21/79\t女\t2008/10/10\t初中\t81504.95\t2\r\n天津\t天津市区一支\t23964392\t9/25/66\t女\t2004/11/26\t大专\t81499.53\t9\r\n山东\t山东泰安\t431115402\t5/4/81\t女\t2011/7/22\t高中\t81414.09\t9\r\n重庆\t重庆渝中\t5207523922\t5/18/76\t女\t2016/8/6\t高中\t81403\t22\r\n天津\t天津市区二支\t22560612\t5/29/57\t男\t2004/11/10\t大专\t81402.98\t7\r\n山东\t山东济南\t5164319942\t3/16/76\t男\t2016/6/7\t本科\t81401\t6\r\n深圳\t深圳宝安\t729246922\t6/22/82\t女\t2015/3/27\t高中\t81395.04\t9\r\n河北\t河北石家庄\t5162798752\t8/21/68\t男\t2016/6/6\t大专\t81366\t8\r\n湖北\t湖北襄阳\t5018123702\t4/2/72\t女\t2015/11/13\t高中\t81350\t1\r\n黑龙江\t黑龙江牡丹江\t684299082\t11/7/79\t女\t2014/11/19\t大专\t81341\t1\r\n重庆\t重庆渝中\t498771852\t10/11/83\t女\t2013/1/7\t本科\t81337.77\t9\r\n山东\t山东泰安\t5168318682\t11/19/77\t女\t2016/6/12\t高中\t81336\t10\r\n黑龙江\t黑龙江大庆\t458210502\t5/27/82\t女\t2012/3/22\t大专\t81325\t8\r\n深圳\t深圳南山\t321757462\t4/12/81\t女\t2009/8/3\t本科\t81303.63\t7\r\n北京\t北京东城\t572473432\t9/16/89\t男\t2013/8/6\t本科\t81299.83\t0\r\n四川\t四川高新\t5144102192\t12/11/76\t女\t2016/5/23\t大专\t81270\t6\r\n安徽\t安徽合肥\t23242682\t1/4/64\t女\t2004/11/1\t高中\t81193.59\t16\r\n青岛\t青岛一支\t558812482\t10/8/77\t女\t2013/6/28\t中专\t81137.73\t8\r\n上海\t上海黄浦\t5063362882\t10/21/84\t女\t2016/1/28\t本科\t81094\t8\r\n四川\t四川青羊\t5113053122\t10/17/72\t女\t2016/3/28\t大专\t81092\t6\r\n宁波\t宁波象山\t5199675022\t11/18/75\t男\t2016/8/1\t高中\t81071.5\t12\r\n湖北\t湖北武汉\t262519492\t8/7/79\t女\t2008/11/11\t大专\t81049.14\t9\r\n河南\t河南郑州\t491457912\t10/28/69\t女\t2012/12/19\t本科\t81044.06\t14\r\n广西\t广西南宁\t281158842\t8/3/75\t男\t2009/2/25\t大专\t81010.43\t13\r\n四川\t四川内江\t65945572\t10/7/76\t女\t2005/11/21\t中专\t81001.1\t13\r\n云南\t云南昆明\t380083492\t10/23/68\t女\t2010/6/11\t大专\t80975.45\t12\r\n山东\t山东枣庄\t285233542\t5/10/73\t女\t2009/3/17\t大专\t80925.91\t14\r\n山东\t山东淄博\t5209643382\t7/19/70\t女\t2016/8/8\t高中\t80913\t10\r\n广东\t广东广州\t5187777602\t12/20/86\t女\t2016/7/7\t中专\t80883.9\t12\r\n吉林\t吉林长春\t164004062\t10/3/66\t女\t2007/9/19\t大专\t80874.5\t12\r\n黑龙江\t黑龙江齐齐哈尔\t45508302\t10/16/57\t女\t2005/6/1\t大专\t80869.8\t7\r\n河南\t河南开封\t290177472\t5/27/66\t女\t2009/4/1\t大专\t80851.12\t10\r\n黑龙江\t黑龙江哈尔滨\t625665302\t5/15/85\t女\t2014/4/28\t本科\t80845.83\t1\r\n云南\t云南昆明\t148656842\t8/8/76\t女\t2007/7/1\t本科\t80840.18\t2\r\n福建\t福建龙岩\t5003223782\t12/13/77\t女\t2015/10/21\t大专\t80833.5\t9\r\n湖北\t湖北十堰\t5172695452\t8/14/82\t女\t2016/6/15\t大专\t80823\t4\r\n四川\t四川绵阳\t5180735582\t5/12/86\t女\t2016/6/23\t高中\t80796.5\t17\r\n山西\t山西长治\t273298772\t9/29/54\t男\t2009/1/1\t大专\t80779\t7\r\n重庆\t重庆渝中\t749833812\t11/21/78\t女\t2015/4/28\t本科\t80763.8\t10\r\n深圳\t深圳福田\t17716752\t4/26/67\t女\t2004/8/24\t本科\t80729.13\t5\r\n安徽\t安徽芜湖\t337625822\t10/3/66\t女\t2009/10/1\t高中\t80701.61\t7\r\n云南\t云南昆明\t5234543372\t11/5/81\t女\t2016/9/18\t本科\t80701\t8\r\n河南\t河南商丘\t717922212\t7/8/75\t男\t2015/3/23\t高中\t80693.8\t9\r\n四川\t四川南充\t76362812\t12/29/70\t女\t2006/2/25\t高中\t80646.84\t5\r\n湖南\t湖南长沙\t5154642582\t8/3/63\t男\t2016/5/31\t本科\t80627\t7\r\n福建\t福建泉州\t239149332\t5/19/76\t女\t2008/7/6\t高中\t80621.11\t13\r\n浙江\t浙江温州\t703644092\t4/6/82\t男\t2015/1/10\t高中\t80606.1\t5\r\n青岛\t青岛一支\t5031736312\t12/11/78\t女\t2015/11/26\t本科\t80539\t11\r\n深圳\t深圳宝安\t72851692\t11/22/80\t女\t2006/1/4\t高中\t80497.39\t11\r\n江苏\t江苏泰州\t99538972\t1/17/65\t女\t2006/10/1\t大专\t80478.01\t5\r\n山西\t山西临汾\t255753082\t11/20/68\t女\t2008/10/7\t高中\t80462.3\t8\r\n山东\t山东烟台\t538978702\t4/21/83\t女\t2013/6/18\t中专\t80432.53\t7\r\n辽宁\t辽宁本溪\t187279592\t8/4/56\t女\t2007/12/5\t大专\t80379.41\t3\r\n江西\t江西南昌\t451034872\t1/6/80\t女\t2012/1/8\t高中\t80349.61\t4\r\n山东\t山东菏泽\t5215158812\t6/8/78\t女\t2016/8/14\t高中\t80326\t5\r\n江苏\t江苏南京\t664935922\t12/10/75\t男\t2014/8/30\t大专\t80259\t3\r\n山东\t山东济南\t10792212\t11/22/76\t女\t2004/3/1\t中专\t80226.59\t10\r\n山东\t山东济宁\t183896872\t9/16/77\t女\t2007/11/24\t中专\t80210.45\t12\r\n深圳\t深圳宝安\t5115086522\t2/20/78\t女\t2016/3/31\t大专\t80168\t6\r\n江西\t江西南昌\t103656382\t8/4/65\t男\t2006/11/1\t大专\t80167.22\t5\r\n黑龙江\t黑龙江牡丹江\t427167432\t10/5/73\t女\t2011/6/17\t大专\t80085.18\t9\r\n北京\t北京东城\t5113955132\t4/15/77\t女\t2016/3/29\t本科\t80043.91\t10\r\n重庆\t重庆巴南\t580140202\t1/15/72\t女\t2013/9/30\t高中\t80011\t8\r\n广东\t广东广州\t5210926122\t10/17/83\t女\t2016/8/9\t高中\t80008\t5\r\n湖南\t湖南郴州\t829705152\t3/16/89\t女\t2015/8/5\t高中\t80000\t0\r\n北京\t北京良乡\t5099597332\t8/24/63\t女\t2016/3/18\t大专\t80000\t0\r\n辽宁\t辽宁本溪\t5069695022\t4/16/70\t女\t2016/2/29\t大专\t80000\t0\r\n四川\t四川高新\t751202422\t3/2/92\t女\t2015/4/30\t本科\t80000\t0\r\n河南\t河南濮阳\t546681342\t1/3/87\t女\t2013/6/24\t高中\t80000\t0\r\n天津\t天津蓟州\t5096151582\t3/10/80\t女\t2016/3/16\t大专\t79950\t1\r\n广西\t广西南宁\t346020442\t4/12/81\t女\t2009/11/26\t大专\t79802.11\t7\r\n山东\t山东烟台\t597047232\t10/18/63\t女\t2013/12/25\t大专\t79798.83\t3\r\n山东\t山东德州\t627042422\t4/20/67\t女\t2014/5/6\t高中\t79795\t4\r\n山西\t山西运城\t5110141322\t3/1/77\t女\t2016/3/24\t高中\t79778.5\t7\r\n大连\t大连明锐\t550371112\t5/6/53\t男\t2013/6/25\t大专\t79765.5\t1\r\n福建\t福建泉州\t5007210752\t3/22/78\t女\t2015/10/30\t高中\t79762\t10\r\n山东\t山东临沂\t831544382\t4/2/88\t女\t2015/8/6\t中专\t79758.5\t26\r\n四川\t四川青羊\t116746912\t1/12/82\t男\t2007/1/22\t本科\t79747.55\t9\r\n上海\t上海陆家嘴\t249123582\t5/15/78\t女\t2008/9/1\t高中\t79729.2\t4\r\n广东\t广东中山\t696141592\t8/18/79\t女\t2014/12/23\t大专\t79727.3\t7\r\n北京\t北京海淀\t571230852\t8/8/91\t女\t2013/7/31\t高中\t79701.6\t2\r\n天津\t天津市区二支\t848338362\t4/12/80\t女\t2015/8/10\t本科\t79653.5\t17\r\n深圳\t深圳福田第二\t409943442\t6/3/92\t女\t2010/12/20\t中专\t79621.43\t12\r\n广东\t广东中山\t681551952\t1/30/82\t女\t2014/11/12\t硕士\t79610\t4\r\n佛山\t佛山禅城\t95383052\t6/4/71\t男\t2006/8/30\t大专\t79594.74\t6\r\n山东\t山东潍坊\t671575332\t3/29/87\t女\t2014/9/23\t中专\t79584\t13\r\n重庆\t重庆渝中\t522765052\t12/22/89\t女\t2013/5/24\t大专\t79571.02\t10\r\n陕西\t陕西西安\t237233892\t11/28/69\t男\t2008/7/1\t高中\t79547.85\t1\r\n青岛\t青岛一支\t550452062\t6/28/81\t女\t2013/6/25\t本科\t79507.86\t9\r\n黑龙江\t黑龙江哈尔滨\t412034732\t4/20/76\t女\t2010/12/29\t大专\t79479.73\t11\r\n湖北\t湖北武汉\t498487692\t11/8/77\t男\t2013/1/5\t本科\t79471.05\t5\r\n山东\t山东济南\t5144038772\t7/16/81\t女\t2016/5/23\t中专\t79463.3\t10\r\n山东\t山东日照\t769109182\t3/2/76\t女\t2015/6/23\t中专\t79440\t8\r\n广东\t广东惠州\t9361772\t8/10/70\t女\t2003/12/12\t大专\t79398.95\t4\r\n四川\t四川内江\t262475112\t7/15/68\t女\t2008/11/10\t中专\t79349.88\t8\r\n四川\t四川青羊\t151147442\t3/1/70\t女\t2007/7/20\t本科\t79300.94\t8\r\n北京\t北京海淀\t689035332\t11/30/77\t女\t2014/12/5\t大专\t79290.5\t19\r\n重庆\t重庆永川\t755094702\t12/15/76\t女\t2015/5/19\t大专\t79286\t17\r\n黑龙江\t黑龙江哈尔滨\t492165942\t9/26/66\t女\t2012/12/20\t大专\t79273\t4\r\n湖北\t湖北武汉\t5015286192\t10/10/73\t女\t2015/11/10\t高中\t79272.8\t20\r\n云南\t云南昆明\t380085862\t12/17/66\t女\t2010/6/11\t本科\t79240.57\t6\r\n北京\t北京平谷\t5205904832\t8/31/86\t男\t2016/8/5\t本科\t79221\t21\r\n上海\t上海陆家嘴\t5120820392\t6/8/76\t男\t2016/4/13\t高中\t79215.3\t10\r\n山东\t山东淄博\t5177680532\t3/22/86\t男\t2016/6/21\t大专\t79182.3\t10\r\n广东\t广东惠州\t5203392802\t2/1/57\t女\t2016/8/3\t大专\t79168.5\t6\r\n安徽\t安徽合肥\t483169232\t8/17/81\t男\t2012/11/15\t大专\t79153.55\t25\r\n河南\t河南郑州\t866071912\t7/16/77\t女\t2015/9/2\t本科\t79145.6\t11\r\n辽宁\t辽宁沈阳\t605350292\t7/21/73\t女\t2014/1/11\t高中\t79144.14\t3\r\n浙江\t浙江绍兴\t5146242562\t4/12/62\t女\t2016/5/25\t大专\t79117\t5\r\n云南\t云南昆明\t5002202062\t5/20/78\t女\t2015/10/16\t大专\t79090\t1\r\n四川\t四川德阳\t26726172\t11/12/73\t女\t2004/12/22\t高中\t79060.53\t8\r\n四川\t四川高新\t5044923812\t2/5/86\t女\t2015/12/12\t大专\t79050.3\t7\r\n山东\t山东淄博\t272907702\t11/8/72\t女\t2008/12/25\t高中\t79041.29\t6\r\n四川\t四川雅安\t5189152842\t6/7/77\t男\t2016/7/15\t大专\t79024.2\t13\r\n大连\t大连海川\t496005332\t1/7/79\t男\t2012/12/28\t本科\t79020\t2\r\n广西\t广西南宁\t5114339532\t11/6/80\t女\t2016/3/30\t中专\t79009.4\t6\r\n陕西\t陕西汉中\t818778622\t4/24/86\t女\t2015/7/31\t大专\t79000\t0\r\n湖北\t湖北孝感\t556773112\t7/8/76\t男\t2013/6/27\t大专\t78910\t7\r\n山东\t山东临沂\t268142422\t5/7/63\t女\t2008/12/3\t大专\t78870.65\t9\r\n山东\t山东枣庄\t395903702\t5/4/66\t男\t2010/9/16\t高中\t78869.44\t7\r\n湖北\t湖北襄阳\t5078972612\t12/3/76\t女\t2016/3/7\t高中\t78867\t2\r\n福建\t福建龙岩\t257358672\t6/2/76\t女\t2008/10/17\t高中\t78837.38\t9\r\n辽宁\t辽宁沈阳\t5008257812\t8/22/80\t男\t2015/11/2\t本科\t78833\t21\r\n江西\t江西萍乡\t708229052\t10/1/74\t女\t2015/2/5\t本科\t78829.5\t8\r\n浙江\t浙江台州\t251086472\t3/13/68\t女\t2008/9/11\t高中\t78828.48\t9\r\n四川\t四川青羊\t483775792\t9/13/79\t女\t2012/11/20\t中专\t78815.79\t6\r\n四川\t四川青羊\t177734652\t9/13/69\t女\t2007/11/8\t大专\t78803.29\t8\r\n江苏\t江苏常州\t18111592\t10/13/67\t女\t2004/8/31\t高中\t78794.07\t8\r\n湖北\t湖北黄冈\t836632762\t5/10/69\t女\t2015/8/8\t高中\t78770\t3\r\n四川\t四川青羊\t5196424172\t5/29/80\t女\t2016/7/29\t大专\t78754\t9\r\n湖南\t湖南长沙\t5174719782\t5/22/64\t男\t2016/6/17\t本科\t78747.7\t15\r\n四川\t四川高新\t192911732\t2/14/79\t女\t2007/12/24\t高中\t78707.57\t1\r\n北京\t北京良乡\t5205790592\t5/6/88\t男\t2016/8/5\t大专\t78698\t6\r\n深圳\t深圳福田\t4510102\t3/22/69\t女\t2003/6/3\t本科\t78689.77\t5\r\n湖北\t湖北十堰\t5019741892\t3/20/73\t女\t2015/11/16\t高中\t78619.5\t15\r\n黑龙江\t黑龙江绥化\t432504802\t1/9/74\t女\t2011/8/2\t高中\t78612.93\t3\r\n山东\t山东烟台\t5216530382\t9/22/88\t男\t2016/8/15\t大专\t78612\t8\r\n湖北\t湖北黄石\t93041372\t4/27/79\t女\t2006/8/8\t高中\t78504.4\t17\r\n黑龙江\t黑龙江大庆\t593889912\t2/25/78\t女\t2013/12/20\t本科\t78504\t9\r\n浙江\t浙江杭州\t790390422\t10/27/94\t男\t2015/7/15\t大专\t78485\t3\r\n重庆\t重庆渝中\t225213432\t1/6/77\t女\t2008/5/22\t本科\t78460.41\t18\r\n福建\t福建厦门\t5103836322\t9/30/90\t女\t2016/3/22\t本科\t78448\t6\r\n江西\t江西赣州\t363688122\t5/1/71\t女\t2010/3/15\t初中\t78442.91\t6\r\n辽宁\t辽宁沈阳\t668446072\t3/3/83\t女\t2014/9/11\t大专\t78436.4\t11\r\n辽宁\t辽宁丹东\t21817412\t10/31/58\t女\t2004/10/29\t中专\t78405.33\t4\r\n湖北\t湖北宜昌\t467908132\t2/5/80\t女\t2012/6/13\t大专\t78402.69\t14\r\n云南\t云南昆明\t864513772\t10/6/83\t女\t2015/8/28\t高中\t78384.1\t2\r\n大连\t大连银洲\t623450352\t6/3/87\t男\t2014/4/15\t本科\t78339.3\t0\r\n浙江\t浙江湖州\t327233842\t10/30/70\t女\t2009/8/27\t初中\t78316.71\t2\r\n黑龙江\t黑龙江黑河\t629790522\t11/1/78\t女\t2014/5/22\t大专\t78309.45\t0\r\n四川\t四川青羊\t380722852\t6/9/84\t女\t2010/6/18\t本科\t78264.6\t12\r\n辽宁\t辽宁沈阳\t311844342\t12/12/70\t女\t2009/6/30\t大专\t78262.86\t3\r\n佛山\t佛山顺德龙江\t443345912\t5/1/76\t女\t2011/11/4\t大专\t78254.59\t6\r\n河南\t河南郑州\t5207142222\t6/2/78\t男\t2016/8/6\t大专\t78250.5\t9\r\n山东\t山东临沂\t709363322\t9/20/92\t男\t2015/2/13\t大专\t78205.1\t28\r\n黑龙江\t黑龙江齐齐哈尔\t353766762\t10/25/60\t女\t2010/1/1\t大专\t78183.36\t4\r\n湖北\t湖北襄阳\t625553922\t7/10/86\t女\t2014/4/28\t中专\t78170.2\t23\r\n黑龙江\t黑龙江齐齐哈尔\t712706402\t6/23/72\t女\t2015/3/17\t高中\t78153\t2\r\n重庆\t重庆渝中\t5161288432\t9/10/74\t女\t2016/6/3\t高中\t78149.5\t23\r\n深圳\t深圳宝安\t588087362\t5/5/74\t女\t2013/12/3\t大专\t78072.75\t14\r\n山东\t山东济南\t5074011072\t4/29/82\t女\t2016/3/4\t大专\t78063.1\t7\r\n浙江\t浙江杭州\t710678612\t8/31/81\t女\t2015/2/28\t大专\t78063\t8\r\n重庆\t重庆江津\t5092333202\t9/14/72\t女\t2016/3/14\t高中\t78047\t8\r\n深圳\t深圳福田\t5005515502\t8/29/78\t女\t2015/10/26\t大专\t78034.29\t4\r\n上海\t上海黄浦\t4176392\t6/26/60\t女\t2003/5/31\t大专\t78020.21\t7\r\n山东\t山东潍坊\t651018172\t2/18/70\t女\t2014/8/4\t中专\t78013.17\t11\r\n深圳\t深圳福田\t5153977152\t10/12/69\t女\t2016/5/30\t高中\t78000\t0\r\n深圳\t深圳福田第二\t299224432\t4/17/82\t女\t2009/5/13\t本科\t77896\t10\r\n天津\t天津滨海新区\t580086882\t7/13/80\t女\t2013/9/30\t大专\t77850.62\t7\r\n河南\t河南郑州\t28916832\t11/17/72\t女\t2005/1/11\t大专\t77840.2\t13\r\n北京\t北京良乡\t462612072\t6/7/77\t女\t2012/5/1\t高中\t77829.74\t0\r\n山东\t山东潍坊\t5228488592\t6/10/64\t女\t2016/9/2\t高中\t77820\t2\r\n湖北\t湖北武汉\t417178802\t6/12/86\t女\t2011/3/8\t高中\t77794.28\t16\r\n安徽\t安徽合肥\t392992032\t3/12/77\t女\t2010/9/1\t中专\t77767.5\t5\r\n山东\t山东威海\t722385882\t6/26/78\t男\t2015/3/25\t大专\t77767\t11\r\n青岛\t青岛一支\t421885052\t10/26/69\t女\t2011/4/22\t大专\t77754.95\t18\r\n河南\t河南南阳\t201170412\t10/25/76\t女\t2008/1/18\t大专\t77749.61\t9\r\n北京\t北京良乡\t655715482\t11/11/82\t女\t2014/8/13\t大专\t77744.05\t0\r\n云南\t云南昆明\t149885742\t4/12/76\t女\t2007/7/1\t大专\t77736.87\t4\r\n浙江\t浙江绍兴\t5198578112\t11/8/71\t女\t2016/8/1\t大专\t77678\t13\r\n吉林\t吉林吉林\t527713722\t1/8/69\t男\t2013/6/5\t大专\t77674.84\t5\r\n山东\t山东淄博\t263262692\t6/14/81\t女\t2008/11/14\t中专\t77672.07\t4\r\n广东\t广东广州\t697727092\t10/8/70\t女\t2014/12/24\t本科\t77648.69\t8\r\n广东\t广东惠州\t373448552\t10/11/80\t女\t2010/5/5\t大专\t77628.02\t14\r\n山东\t山东济南\t5227989052\t12/24/75\t女\t2016/9/1\t大专\t77614.5\t9\r\n山东\t山东滨州\t273892082\t12/3/69\t女\t2009/1/1\t中专\t77609.02\t9\r\n江苏\t江苏南京\t8462812\t3/22/71\t女\t2003/10/20\t本科\t77607.84\t11\r\n辽宁\t辽宁铁岭\t5192684722\t3/18/84\t女\t2016/7/26\t大专\t77604.7\t13\r\n浙江\t浙江杭州\t158272822\t10/23/70\t女\t2007/8/20\t大专\t77603.53\t5\r\n湖北\t湖北十堰\t137215312\t3/15/63\t女\t2007/5/25\t大专\t77593.69\t14\r\n广东\t广东广州\t265672342\t4/12/75\t女\t2008/11/24\t大专\t77593.61\t9\r\n天津\t天津市区二支\t396236712\t1/5/69\t女\t2010/9/18\t大专\t77575.58\t11\r\n江西\t江西南昌\t5153987122\t12/4/81\t女\t2016/5/30\t高中\t77545.5\t5\r\n四川\t四川青羊\t5222875262\t11/23/84\t女\t2016/8/24\t本科\t77511\t16\r\n广东\t广东广州\t738630662\t3/11/68\t女\t2015/4/9\t高中\t77503.33\t5\r\n北京\t北京东城\t769112\t10/2/67\t女\t2002/3/8\t本科\t77502.12\t2\r\n北京\t北京海淀\t509067532\t2/26/91\t男\t2013/4/1\t本科\t77500\t2\r\n山东\t山东滨州\t5194107042\t5/11/77\t女\t2016/7/27\t大专\t77492\t22\r\n湖北\t湖北十堰\t472408372\t6/5/90\t女\t2012/7/19\t大专\t77435\t10\r\n深圳\t深圳罗湖\t127551182\t4/24/64\t男\t2007/4/1\t本科\t77428.78\t5\r\n北京\t北京海淀\t213232882\t1/3/82\t女\t2008/4/1\t高中\t77343.2\t6\r\n山东\t山东烟台\t174004272\t1/3/79\t女\t2007/11/1\t大专\t77316.89\t15\r\n河北\t河北石家庄\t608142772\t5/12/67\t女\t2014/1/27\t高中\t77315\t3\r\n四川\t四川高新\t462062\t11/27/73\t女\t2001/12/31\t本科\t77288.05\t7\r\n广东\t广东阳江\t5006028612\t11/4/88\t女\t2015/10/27\t高中\t77224.9\t11\r\n四川\t四川青羊\t714263842\t9/10/79\t女\t2015/3/19\t大专\t77212.7\t8\r\n河北\t河北石家庄\t680822432\t5/1/84\t女\t2014/11/8\t大专\t77154.5\t13\r\n陕西\t陕西西安\t702202072\t10/10/82\t男\t2015/1/3\t大专\t77131.5\t4\r\n北京\t北京海淀\t295953092\t11/29/81\t男\t2009/5/1\t硕士\t77102.35\t5\r\n青岛\t青岛一支\t5187406842\t4/24/68\t女\t2016/7/5\t本科\t77091.5\t6\r\n湖北\t湖北襄阳\t5126149022\t7/2/77\t女\t2016/4/21\t高中\t77080\t7\r\n河北\t河北石家庄\t657527082\t9/6/77\t女\t2014/8/18\t本科\t77063.67\t12\r\n浙江\t浙江嘉兴\t422774102\t4/1/90\t女\t2011/4/29\t大专\t77054.2\t9\r\n河南\t河南南阳\t588108852\t3/25/81\t女\t2013/12/3\t大专\t77012\t11\r\n重庆\t重庆渝中\t764761902\t10/11/78\t女\t2015/6/15\t中专\t76926.5\t10\r\n青岛\t青岛一支\t386684932\t3/4/73\t女\t2010/7/20\t本科\t76919.01\t12\r\n四川\t四川高新\t616208152\t4/8/67\t男\t2014/3/21\t硕士\t76916.31\t1\r\n四川\t四川高新\t876729632\t12/21/78\t女\t2015/9/23\t本科\t76890.5\t17\r\n黑龙江\t黑龙江哈尔滨\t292599402\t10/25/73\t女\t2009/4/14\t高中\t76821.32\t15\r\n深圳\t深圳福田第二\t334723362\t2/16/77\t女\t2009/9/29\t大专\t76793.36\t10\r\n四川\t四川高新\t572126742\t5/17/75\t女\t2013/8/2\t大专\t76791.21\t13\r\n北京\t北京平谷\t192873492\t6/10/75\t男\t2007/12/24\t高中\t76775.61\t9\r\n河南\t河南开封\t667325752\t12/31/85\t女\t2014/9/5\t大专\t76732.46\t15\r\n湖北\t湖北武汉\t177157122\t11/12/61\t女\t2007/11/7\t中专\t76723.82\t7\r\n青岛\t青岛一支\t265958872\t11/30/72\t女\t2008/11/25\t本科\t76723.63\t11\r\n深圳\t深圳宝安\t691375612\t7/23/73\t女\t2014/12/16\t大专\t76716.22\t6\r\n重庆\t重庆渝中\t760135632\t5/26/91\t男\t2015/6/3\t本科\t76701\t23\r\n福建\t福建泉州\t5163578352\t9/4/74\t女\t2016/6/6\t中专\t76693\t15\r\n广东\t广东珠海\t61682042\t9/23/74\t女\t2005/10/12\t大专\t76669.24\t15\r\n大连\t大连银洲\t680191582\t3/12/69\t男\t2014/11/4\t本科\t76650\t7\r\n贵州\t贵州贵阳\t694282542\t2/10/68\t女\t2014/12/22\t本科\t76638.9\t17\r\n黑龙江\t黑龙江哈尔滨\t217392302\t11/30/74\t女\t2008/4/21\t大专\t76633.97\t11\r\n重庆\t重庆渝中\t437078182\t9/5/79\t女\t2011/9/8\t大专\t76615.83\t12\r\n广东\t广东惠州\t150916872\t10/19/68\t女\t2007/7/19\t中专\t76586.03\t3\r\n四川\t四川青羊\t862666032\t9/14/86\t男\t2015/8/24\t本科\t76537\t7\r\n河北\t河北衡水\t524330032\t9/20/83\t女\t2013/5/29\t中专\t76536.57\t3\r\n宁波\t宁波城区\t397357032\t12/1/74\t女\t2010/9/25\t中专\t76535.08\t9\r\n北京\t北京海淀\t52053082\t10/31/59\t女\t2005/7/20\t大专\t76489.52\t4\r\n湖北\t湖北武汉\t5155231852\t10/22/84\t女\t2016/5/31\t大专\t76473\t3\r\n辽宁\t辽宁鞍山\t590629182\t3/24/70\t男\t2013/12/12\t高中\t76464.64\t11\r\n四川\t四川高新\t613109592\t5/9/84\t女\t2014/3/13\t大专\t76430.77\t10\r\n四川\t四川高新\t757789212\t5/10/83\t女\t2015/5/27\t本科\t76421.6\t15\r\n重庆\t重庆渝中\t5032044552\t2/18/84\t女\t2015/11/26\t本科\t76316\t15\r\n贵州\t贵州遵义\t5196847552\t3/2/82\t女\t2016/7/29\t中专\t76314.1\t24\r\n湖北\t湖北十堰\t5043997292\t1/2/80\t女\t2015/12/10\t高中\t76306\t3\r\n四川\t四川青羊\t330740222\t12/15/82\t女\t2009/9/17\t大专\t76301.1\t3\r\n北京\t北京海淀\t28205732\t1/5/79\t男\t2005/1/4\t本科\t76291.49\t3\r\n上海\t上海黄浦\t452033902\t8/21/86\t女\t2012/2/1\t大专\t76249.49\t0\r\n山东\t山东济宁\t718916772\t8/9/83\t女\t2015/3/24\t高中\t76238.7\t8\r\n广东\t广东惠州\t203145582\t4/8/81\t男\t2008/2/1\t中专\t76227.52\t13\r\n四川\t四川高新\t5084877842\t8/12/80\t男\t2016/3/10\t本科\t76221.6\t13\r\n福建\t福建福州\t166761372\t1/1/78\t女\t2007/9/25\t高中\t76217.3\t10\r\n福建\t福建漳州\t507146652\t1/2/75\t女\t2013/3/16\t本科\t76212.84\t17\r\n四川\t四川乐山\t684496152\t8/1/66\t女\t2014/11/19\t高中\t76193\t3\r\n黑龙江\t黑龙江哈尔滨\t307553452\t9/28/73\t女\t2009/6/22\t大专\t76187.97\t5\r\n安徽\t安徽亳州\t5186739612\t3/28/89\t女\t2016/7/1\t高中\t76155\t18\r\n湖北\t湖北武汉\t417022072\t2/4/77\t女\t2011/3/7\t大专\t76145.22\t12\r\n江西\t江西赣州\t5190426512\t5/2/70\t男\t2016/7/20\t高中\t76134\t9\r\n重庆\t重庆永川\t5186742312\t10/20/84\t女\t2016/7/1\t本科\t76111.9\t23\r\n四川\t四川高新\t5101742202\t6/14/82\t女\t2016/3/21\t大专\t76073\t7\r\n佛山\t佛山顺德龙江\t841630982\t12/22/85\t女\t2015/8/9\t高中\t76000\t0\r\n湖北\t湖北十堰\t651677352\t3/29/75\t女\t2014/8/5\t大专\t75970.17\t8\r\n深圳\t深圳南山\t5204928462\t1/20/94\t男\t2016/8/4\t高中\t75960.5\t9\r\n山东\t山东烟台\t5023361702\t5/5/80\t男\t2015/11/19\t高中\t75909.7\t9\r\n江西\t江西南昌\t5176593592\t3/10/89\t女\t2016/6/20\t高中\t75902\t9\r\n四川\t四川成都\t713580102\t8/19/72\t女\t2015/3/18\t大专\t75831.5\t12\r\n江苏\t江苏扬州\t295329082\t1/13/70\t女\t2009/4/25\t高中\t75813.05\t11\r\n广西\t广西南宁\t5199600732\t11/29/78\t女\t2016/8/1\t本科\t75796.9\t12\r\n江西\t江西南昌\t288502512\t9/21/82\t男\t2009/3/25\t本科\t75774.47\t5\r\n青岛\t青岛城阳\t686352132\t2/12/82\t男\t2014/11/20\t大专\t75759.5\t6\r\n河北\t河北沧州\t688071472\t7/10/69\t男\t2014/11/30\t高中\t75752\t7\r\n陕西\t陕西汉中\t5063610332\t12/10/76\t女\t2016/1/29\t大专\t75749.5\t7\r\n四川\t四川青羊\t249912\t1/18/69\t女\t2001/12/31\t大专\t75743.48\t11\r\n辽宁\t辽宁沈阳\t5203189732\t9/4/76\t女\t2016/8/3\t大专\t75742.5\t17\r\n河北\t河北保定\t5196158582\t5/21/63\t男\t2016/7/29\t中专\t75740.2\t19\r\n山东\t山东济南\t582221582\t11/4/80\t女\t2013/10/28\t本科\t75731.91\t18\r\n吉林\t吉林长春\t449531722\t5/30/80\t女\t2011/12/31\t大专\t75694.13\t1\r\n湖南\t湖南永州\t429669612\t9/5/73\t女\t2011/6/28\t中专\t75674.12\t12\r\n河北\t河北石家庄\t865017892\t10/1/74\t女\t2015/8/31\t高中\t75670.5\t21\r\n福建\t福建南平\t5023928262\t8/4/69\t男\t2015/11/19\t中专\t75668.6\t7\r\n四川\t四川高新\t24807662\t1/21/69\t男\t2004/11/30\t本科\t75644.99\t4\r\n四川\t四川高新\t5047913572\t7/7/87\t女\t2015/12/18\t大专\t75640.4\t8\r\n广东\t广东珠海\t7152962\t9/16/70\t女\t2003/8/31\t中专\t75608.96\t16\r\n北京\t北京海淀\t322665632\t9/27/86\t男\t2009/8/6\t本科\t75525.63\t12\r\n湖北\t湖北荆州\t228016522\t9/15/73\t男\t2008/6/2\t中专\t75496.86\t15\r\n四川\t四川青羊\t659531282\t4/14/87\t男\t2014/8/21\t本科\t75492.45\t0\r\n四川\t四川青羊\t5094589612\t1/1/76\t女\t2016/3/15\t大专\t75457.3\t14\r\n山东\t山东临沂\t5110288172\t1/28/76\t女\t2016/3/24\t中专\t75455\t20\r\n山东\t山东济南\t30299122\t2/16/69\t女\t2005/1/28\t高中\t75446.77\t6\r\n陕西\t陕西西安\t146162202\t2/26/70\t女\t2007/6/25\t本科\t75443.76\t5\r\n青岛\t青岛一支\t5213610412\t3/21/84\t女\t2016/8/11\t本科\t75437.5\t21\r\n天津\t天津市区一支\t471565102\t12/12/89\t女\t2012/7/2\t本科\t75422.26\t7\r\n山西\t山西太原\t828824612\t1/17/73\t女\t2015/8/5\t高中\t75389.9\t9\r\n黑龙江\t黑龙江鹤岗\t844981602\t4/22/65\t男\t2015/8/10\t大专\t75369\t2\r\n四川\t四川青羊\t663239472\t1/4/82\t女\t2014/8/27\t高中\t75326.85\t0\r\n浙江\t浙江嘉兴\t280326182\t2/6/84\t女\t2009/2/23\t大专\t75320.05\t2\r\n广东\t广东汕头\t492134542\t2/7/74\t男\t2012/12/20\t高中\t75221.65\t12\r\n青岛\t青岛一支\t430777922\t11/23/74\t女\t2011/7/18\t本科\t75174.96\t7\r\n广西\t广西南宁\t605023422\t8/13/79\t女\t2014/1/9\t本科\t75171.97\t4\r\n河北\t河北保定\t5101469342\t10/24/69\t女\t2016/3/21\t大专\t75163.1\t14\r\n广东\t广东中山\t96214042\t10/9/79\t女\t2006/9/5\t大专\t75162.36\t3\r\n四川\t四川青羊\t521615702\t5/30/88\t男\t2013/5/22\t本科\t75114.7\t21\r\n浙江\t浙江温州\t5192196052\t7/28/76\t女\t2016/7/25\t本科\t75100.8\t9\r\n佛山\t佛山顺德龙江\t722833342\t1/4/89\t女\t2015/3/25\t本科\t75098.74\t0\r\n四川\t四川内江\t292110632\t11/3/81\t男\t2009/4/10\t大专\t75094.4\t16\r\n福建\t福建厦门\t116459682\t11/1/73\t女\t2007/1/21\t高中\t75088.17\t13\r\n云南\t云南昆明\t609147942\t6/9/68\t女\t2014/2/13\t大专\t75086.73\t10\r\n广西\t广西南宁\t312354602\t1/16/75\t女\t2009/7/1\t大专\t75083.95\t2\r\n苏州\t苏州新区\t77324302\t10/22/64\t女\t2006/3/6\t高中\t75080.85\t2\r\n四川\t四川青羊\t461115062\t6/27/70\t女\t2012/3/31\t中专\t75078.72\t0\r\n苏州\t苏州昆山\t5185320892\t4/11/82\t女\t2016/6/29\t高中\t75068.5\t13\r\n湖北\t湖北十堰\t279322682\t2/15/67\t女\t2009/2/13\t大专\t75065\t6\r\n佛山\t佛山顺德龙江\t723209062\t12/24/84\t女\t2015/3/25\t高中\t75001.4\t12\r\n四川\t四川青羊\t158684412\t11/16/82\t女\t2007/8/22\t本科\t74976.85\t8\r\n广西\t广西南宁\t222291152\t12/28/67\t男\t2008/5/9\t大专\t74965.56\t15\r\n河南\t河南焦作\t255860962\t1/9/57\t男\t2008/4/25\t高中\t74936.22\t3\r\n山东\t山东东营\t75236082\t8/17/57\t女\t2006/2/16\t中专\t74931.83\t3\r\n黑龙江\t黑龙江牡丹江\t200541932\t7/15/62\t女\t2008/1/15\t大专\t74928.04\t10\r\n黑龙江\t黑龙江哈尔滨\t50344622\t6/29/53\t女\t2005/6/30\t中专\t74919.55\t1\r\n四川\t四川高新\t660311052\t6/20/90\t女\t2014/8/22\t本科\t74905.7\t14\r\n天津\t天津蓟州\t487806112\t4/22/71\t女\t2012/12/6\t高中\t74890\t5\r\n广东\t广东惠州\t77030232\t5/5/78\t女\t2006/3/1\t大专\t74887.3\t11\r\n四川\t四川高新\t27102862\t4/1/73\t女\t2004/12/27\t本科\t74842.32\t10\r\n湖南\t湖南长沙\t5186713302\t8/6/93\t男\t2016/7/1\t本科\t74842\t7\r\n四川\t四川德阳\t7825822\t11/20/71\t女\t2003/9/18\t大专\t74833.52\t3\r\n浙江\t浙江金华\t340317262\t7/3/75\t女\t2009/11/3\t高中\t74833.43\t6\r\n广东\t广东韶关\t486446712\t11/3/78\t女\t2012/11/29\t大专\t74792.04\t18\r\n黑龙江\t黑龙江哈尔滨\t54803552\t8/1/66\t女\t2005/8/15\t中专\t74784.8\t10\r\n四川\t四川雅安\t5138760892\t10/28/81\t女\t2016/5/13\t本科\t74767.9\t22\r\n四川\t四川高新\t5199170082\t10/3/85\t女\t2016/8/1\t大专\t74759.5\t13\r\n北京\t北京海淀\t509954212\t1/7/88\t女\t2013/4/1\t本科\t74756.58\t3\r\n青岛\t青岛一支\t639451582\t11/2/78\t女\t2014/6/21\t大专\t74751.46\t4\r\n山东\t山东临沂\t651969052\t12/30/71\t女\t2014/8/5\t高中\t74737\t8\r\n四川\t四川成都\t592167502\t3/5/68\t女\t2013/12/16\t高中\t74728.39\t9\r\n青岛\t青岛一支\t288425332\t1/16/72\t女\t2009/3/25\t大专\t74719.73\t10\r\n辽宁\t辽宁本溪\t5058855532\t11/20/70\t女\t2016/1/8\t本科\t74700\t1\r\n深圳\t深圳福田\t158696692\t10/17/80\t女\t2007/8/22\t本科\t74698.27\t9\r\n浙江\t浙江温州\t765883892\t11/19/74\t女\t2015/6/18\t高中\t74690\t5\r\n浙江\t浙江绍兴\t5148240582\t10/11/68\t女\t2016/5/26\t中专\t74629.5\t9\r\n云南\t云南昆明\t5117669242\t8/14/82\t女\t2016/4/7\t大专\t74598.3\t6\r\n山东\t山东济南\t5145858162\t3/19/88\t男\t2016/5/25\t大专\t74580\t2\r\n广东\t广东广州\t342446792\t1/5/75\t女\t2009/11/12\t高中\t74557.13\t3\r\n湖北\t湖北武汉\t465228972\t1/14/71\t女\t2012/5/21\t大专\t74523\t15\r\n山东\t山东济宁\t505457042\t11/21/67\t男\t2013/3/5\t大专\t74492.34\t10\r\n重庆\t重庆永川\t869698182\t3/8/88\t女\t2015/9/10\t中专\t74471\t21\r\n四川\t四川青羊\t354664052\t2/17/90\t女\t2009/12/31\t本科\t74437.13\t8\r\n湖北\t湖北襄阳\t112569772\t4/8/66\t女\t2007/1/1\t中专\t74418\t12\r\n山东\t山东烟台\t334927272\t11/3/71\t女\t2009/9/30\t高中\t74407.56\t6\r\n河北\t河北石家庄\t520404252\t3/9/63\t女\t2013/5/15\t高中\t74405.74\t5\r\n四川\t四川高新\t611177132\t3/16/86\t女\t2014/3/5\t大专\t74361.8\t13\r\n浙江\t浙江金华\t702526842\t2/19/79\t女\t2015/1/5\t高中\t74340\t8\r\n广东\t广东广州\t756326672\t8/9/65\t女\t2015/5/23\t高中\t74330\t6\r\n辽宁\t辽宁铁岭\t5135829082\t10/10/77\t女\t2016/5/9\t本科\t74256.3\t16\r\n深圳\t深圳罗湖\t128754122\t6/25/72\t女\t2007/4/3\t本科\t74208.36\t3\r\n江苏\t江苏连云港\t302280282\t1/17/85\t女\t2009/5/20\t高中\t74207.2\t8\r\n北京\t北京海淀\t5221414862\t5/5/71\t女\t2016/8/22\t本科\t74200\t7\r\n青岛\t青岛一支\t93347722\t7/6/70\t女\t2006/8/14\t高中\t74176.61\t9\r\n浙江\t浙江杭州\t5191682042\t11/10/70\t女\t2016/7/25\t高中\t74153\t9\r\n四川\t四川高新\t5001065272\t10/11/79\t男\t2015/10/13\t本科\t74130\t8\r\n山东\t山东淄博\t5048982372\t5/29/81\t女\t2015/12/21\t中专\t74120.3\t12\r\n吉林\t吉林延边\t866695922\t8/25/73\t男\t2015/9/5\t高中\t74118\t1\r\n浙江\t浙江金华\t276515822\t12/5/69\t女\t2009/1/9\t大专\t74097.16\t3\r\n山东\t山东威海\t5100321682\t8/14/72\t女\t2016/3/19\t大专\t74092\t4\r\n山西\t山西临汾\t232364772\t6/13/70\t女\t2008/6/19\t大专\t74089.9\t2\r\n山东\t山东聊城\t164707622\t12/16/67\t女\t2007/9/22\t中专\t74082.73\t9\r\n河北\t河北唐山\t435021362\t10/27/72\t男\t2011/8/23\t本科\t74078.94\t13\r\n青岛\t青岛一支\t183466862\t7/14/77\t女\t2007/11/24\t大专\t74074.24\t17\r\n湖北\t湖北武汉\t418551182\t8/4/76\t女\t2011/3/22\t大专\t74070.32\t13\r\n福建\t福建泉州\t91658112\t9/8/69\t女\t2006/7/24\t高中\t74057.81\t9\r\n北京\t北京良乡\t5114446502\t1/26/84\t男\t2016/3/30\t大专\t74055.6\t15\r\n重庆\t重庆江津\t433111092\t3/18/70\t女\t2011/8/8\t大专\t74053.3\t20\r\n江西\t江西上饶\t606456232\t1/9/71\t女\t2014/1/20\t大专\t74046\t2\r\n湖北\t湖北随州\t483588632\t6/18/69\t女\t2012/11/19\t高中\t74033.57\t11\r\n山东\t山东威海\t531011722\t9/15/83\t女\t2013/6/9\t中专\t74017.05\t14\r\n浙江\t浙江杭州\t5191115482\t1/28/71\t女\t2016/7/22\t高中\t74016.5\t9\r\n四川\t四川高新\t5199779292\t7/8/80\t女\t2016/8/1\t大专\t74014.6\t10\r\n青岛\t青岛一支\t675624072\t8/13/82\t女\t2014/10/2\t大专\t74010\t3\r\n四川\t四川青羊\t271147052\t8/26/79\t女\t2008/12/19\t大专\t74007.8\t7\r\n四川\t四川乐山\t640032882\t5/1/74\t女\t2014/6/23\t大专\t73999.15\t3\r\n山东\t山东德州\t238108292\t11/5/70\t女\t2008/7/2\t高中\t73974.82\t1\r\n陕西\t陕西汉中\t625333962\t3/21/70\t女\t2014/4/25\t高中\t73955.84\t10\r\n云南\t云南昆明\t482194762\t5/18/68\t女\t2012/11/5\t大专\t73950.69\t5\r\n辽宁\t辽宁铁岭\t5066898362\t12/19/80\t女\t2016/2/19\t本科\t73935.2\t12\r\n四川\t四川青羊\t5020692852\t11/24/72\t女\t2015/11/17\t大专\t73924\t8\r\n山东\t山东威海\t62849112\t11/11/65\t女\t2005/10/26\t高中\t73893.47\t13\r\n江苏\t江苏无锡\t592493672\t7/16/75\t女\t2013/12/17\t大专\t73881.35\t7\r\n湖北\t湖北武汉\t20884952\t10/27/63\t女\t2004/10/16\t大专\t73873.55\t9\r\n北京\t北京海淀\t389295422\t11/11/86\t男\t2010/8/4\t本科\t73839.85\t0\r\n北京\t北京平谷\t372381552\t7/20/71\t女\t2010/5/1\t高中\t73838.88\t11\r\n四川\t四川高新\t189942972\t11/7/78\t女\t2007/12/14\t大专\t73832.08\t9\r\n山东\t山东淄博\t592581462\t2/13/78\t女\t2013/12/17\t中专\t73830.28\t6\r\n辽宁\t辽宁沈阳\t665623162\t3/20/56\t女\t2014/9/1\t本科\t73789.09\t6\r\n天津\t天津滨海新区\t668492822\t7/22/57\t女\t2014/9/11\t大专\t73775.18\t5\r\n大连\t大连开发区\t19415302\t8/16/72\t男\t2004/9/23\t大专\t73774.87\t10\r\n苏州\t苏州昆山\t440608422\t12/2/79\t女\t2011/9/30\t中专\t73773.06\t6\r\n四川\t四川青羊\t5178399412\t8/3/74\t女\t2016/6/21\t大专\t73771\t9\r\n河南\t河南洛阳\t253246432\t12/6/69\t女\t2008/9/24\t高中\t73767.16\t11\r\n安徽\t安徽合肥\t449872272\t4/3/82\t女\t2012/1/1\t大专\t73747.17\t10\r\n吉林\t吉林长春\t166875122\t10/24/78\t女\t2007/9/25\t大专\t73743\t6\r\n山东\t山东枣庄\t395943342\t10/12/63\t女\t2010/9/16\t大专\t73732.49\t4\r\n广东\t广东广州\t369477692\t1/2/79\t女\t2010/4/11\t大专\t73724.73\t3\r\n青岛\t青岛开发区\t831956942\t5/3/78\t男\t2015/8/6\t高中\t73703\t6\r\n广西\t广西桂林\t582207902\t9/29/76\t女\t2013/10/28\t大专\t73670.73\t4\r\n江苏\t江苏南京\t5149197912\t12/5/80\t女\t2016/5/27\t本科\t73645.1\t8\r\n四川\t四川青羊\t5204299312\t4/27/74\t女\t2016/8/3\t大专\t73628\t3\r\n广东\t广东广州\t5208876452\t3/30/73\t女\t2016/8/8\t大专\t73612\t8\r\n广东\t广东广州\t477412\t4/18/70\t女\t2002/1/23\t本科\t73599.91\t7\r\n湖北\t湖北武汉\t126018302\t12/14/78\t女\t2007/3/24\t中专\t73570.19\t11\r\n云南\t云南昆明\t407073082\t8/13/72\t女\t2010/12/1\t大专\t73564.51\t7\r\n浙江\t浙江杭州\t640821862\t6/23/88\t女\t2014/6/24\t本科\t73561.55\t11\r\n广东\t广东广州\t5161354622\t12/13/87\t女\t2016/6/3\t本科\t73559.3\t1\r\n陕西\t陕西安康\t486176232\t10/18/75\t女\t2012/12/1\t高中\t73521.5\t9\r\n黑龙江\t黑龙江哈尔滨\t424571322\t10/16/81\t女\t2011/5/20\t本科\t73506.95\t2\r\n四川\t四川德阳\t7883882\t12/7/68\t女\t2003/9/18\t大专\t73490.66\t2\r\n重庆\t重庆渝中\t474282772\t5/31/82\t女\t2012/8/10\t大专\t73489.76\t7\r\n苏州\t苏州新区\t189979542\t10/25/83\t女\t2007/12/14\t大专\t73480.98\t8\r\n广东\t广东江门\t298691282\t12/15/80\t女\t2009/5/11\t中专\t73438.36\t16\r\n吉林\t吉林吉林\t265051402\t12/13/65\t女\t2008/11/23\t高中\t73425.11\t8\r\n甘肃\t甘肃金昌\t574527182\t11/15/66\t女\t2013/8/25\t大专\t73417.6\t6\r\n天津\t天津市区二支\t5204312952\t7/7/87\t女\t2016/8/3\t本科\t73416.5\t16\r\n天津\t天津市区一支\t580386122\t12/29/69\t女\t2013/10/8\t高中\t73398.11\t14\r\n浙江\t浙江杭州\t364480172\t3/9/67\t女\t2010/3/17\t高中\t73367.76\t7\r\n四川\t四川乐山\t5007835332\t7/29/65\t男\t2015/10/31\t中专\t73336\t11\r\n广东\t广东中山\t5167511872\t1/26/77\t女\t2016/6/9\t中专\t73323.8\t9\r\n北京\t北京海淀\t568982132\t4/11/90\t女\t2013/7/8\t大专\t73323\t9\r\n江苏\t江苏南京\t513740282\t10/13/67\t女\t2013/4/2\t大专\t73302.86\t6\r\n黑龙江\t黑龙江哈尔滨\t5143200182\t5/20/71\t女\t2016/5/20\t本科\t73293.5\t13\r\n北京\t北京海淀\t46131612\t11/3/62\t男\t2005/6/3\t大专\t73231.57\t5\r\n陕西\t陕西渭南\t413918072\t9/10/62\t男\t2011/1/11\t高中\t73216\t1\r\n吉林\t吉林吉林\t243586072\t2/27/55\t女\t2008/8/1\t大专\t73179.79\t6\r\n山东\t山东威海\t405048362\t10/27/73\t女\t2010/11/22\t初中\t73172.52\t12\r\n广东\t广东韶关\t507858452\t4/6/82\t女\t2013/3/19\t大专\t73172.19\t16\r\n浙江\t浙江杭州\t5137402892\t2/6/78\t女\t2016/5/12\t大专\t73157\t5\r\n浙江\t浙江金华\t591395272\t4/10/79\t女\t2013/12/13\t高中\t73124\t7\r\n山东\t山东东营\t460556922\t12/25/72\t女\t2012/3/30\t大专\t73122.63\t3\r\n贵州\t贵州遵义\t625940252\t10/30/73\t女\t2014/4/29\t高中\t73120.93\t11\r\n河南\t河南郑州\t75473762\t10/2/78\t男\t2006/2/22\t大专\t73100.67\t12\r\n江苏\t江苏无锡\t5202221532\t12/13/76\t女\t2016/8/2\t高中\t73095.4\t11\r\n湖北\t湖北荆州\t344220152\t7/25/72\t女\t2009/11/20\t高中\t73058.84\t15\r\n大连\t大连明锐\t729626412\t1/22/61\t女\t2015/3/27\t高中\t73050\t4\r\n山东\t山东潍坊\t281018162\t6/27/80\t女\t2009/2/25\t中专\t73030.52\t13\r\n山东\t山东临沂\t715147452\t11/14/77\t女\t2015/3/20\t高中\t73018.6\t16\r\n四川\t四川青羊\t619335042\t9/27/76\t女\t2014/3/27\t大专\t72982.51\t14\r\n山东\t山东烟台\t849218202\t4/28/68\t女\t2015/8/10\t中专\t72911.5\t5\r\n湖北\t湖北襄阳\t75595052\t9/22/73\t女\t2006/2/23\t中技\t72910.5\t18\r\n安徽\t安徽合肥\t5159959442\t3/18/76\t女\t2016/6/2\t本科\t72904\t10\r\n四川\t四川绵阳\t733754702\t3/22/84\t女\t2015/4/1\t大专\t72900\t5\r\n四川\t四川高新\t5160390022\t6/16/78\t女\t2016/6/3\t中专\t72880\t4\r\n四川\t四川青羊\t309372\t4/27/69\t女\t2001/12/31\t大专\t72875.84\t6\r\n北京\t北京海淀\t368922352\t5/10/88\t女\t2010/4/6\t本科\t72868.05\t7\r\n湖北\t湖北武汉\t251844052\t11/23/72\t女\t2008/9/17\t本科\t72852.74\t9\r\n浙江\t浙江衢州\t5144745882\t5/1/90\t男\t2016/5/24\t高中\t72843\t9\r\n江苏\t江苏镇江\t70634372\t5/7/69\t女\t2005/12/26\t高中\t72836.78\t10\r\n湖北\t湖北十堰\t167995712\t12/11/78\t女\t2007/10/5\t中专\t72833.03\t7\r\n安徽\t安徽亳州\t338405592\t8/15/57\t男\t2009/10/1\t高中\t72763.55\t5\r\n浙江\t浙江衢州\t625846322\t9/24/81\t女\t2014/4/29\t高中\t72763.11\t4\r\n湖南\t湖南长沙\t783959392\t2/1/64\t女\t2015/7/8\t高中\t72762.5\t2\r\n四川\t四川高新\t877428452\t5/19/77\t男\t2015/9/24\t大专\t72740\t33\r\n广东\t广东珠海\t110037862\t7/28/71\t女\t2006/12/24\t大专\t72730.2\t6\r\n四川\t四川绵阳\t609763442\t7/1/85\t女\t2014/2/24\t本科\t72712.11\t4\r\n四川\t四川青羊\t5096767092\t8/9/85\t女\t2016/3/16\t本科\t72708.7\t15\r\n湖北\t湖北武汉\t5176050572\t1/10/84\t女\t2016/6/20\t中专\t72703\t9\r\n山东\t山东淄博\t823567492\t10/28/81\t男\t2015/8/1\t大专\t72699.5\t7\r\n深圳\t深圳南山\t5185845772\t10/6/95\t女\t2016/6/30\t高中\t72686\t7\r\n河北\t河北承德\t5166232732\t11/22/76\t女\t2016/6/8\t高中\t72672\t8\r\n黑龙江\t黑龙江哈尔滨\t145229742\t1/6/77\t女\t2007/6/25\t本科\t72633.52\t9\r\n山东\t山东日照\t536033532\t7/22/75\t女\t2013/6/15\t大专\t72598.91\t9\r\n贵州\t贵州遵义\t497220552\t3/13/79\t女\t2012/12/31\t大专\t72575\t5\r\n广东\t广东东莞\t384700552\t3/10/73\t女\t2010/6/29\t大专\t72561.8\t3\r\n辽宁\t辽宁营口\t855905062\t10/17/83\t女\t2015/8/10\t大专\t72554.79\t5\r\n佛山\t佛山顺德龙江\t673233542\t11/18/84\t女\t2014/9/25\t高中\t72553\t4\r\n陕西\t陕西渭南\t402156782\t11/29/73\t女\t2010/10/25\t高中\t72544.36\t4\r\n辽宁\t辽宁辽阳\t618815842\t5/28/58\t女\t2014/3/26\t大专\t72520.07\t6\r\n重庆\t重庆渝中\t5002778662\t10/1/79\t女\t2015/10/20\t本科\t72511.7\t7\r\n辽宁\t辽宁抚顺\t5077533952\t1/6/60\t男\t2016/3/7\t大专\t72503.4\t3\r\n河南\t河南郑州\t6761892\t9/21/71\t男\t2003/8/25\t大专\t72498.95\t13\r\n四川\t四川高新\t5080197332\t1/6/81\t女\t2016/3/8\t大专\t72493\t23\r\n浙江\t浙江杭州\t240654852\t1/18/76\t女\t2008/7/16\t大专\t72441.3\t17\r\n山东\t山东淄博\t155881322\t12/22/69\t女\t2007/8/2\t大专\t72440.57\t12\r\n天津\t天津市区二支\t5049157332\t3/18/76\t女\t2015/12/21\t大专\t72418.5\t9\r\n江西\t江西南昌\t476398352\t7/17/76\t女\t2012/8/30\t高中\t72391.7\t7\r\n山东\t山东德州\t330725842\t7/1/73\t女\t2009/9/16\t大专\t72382.96\t12\r\n湖北\t湖北恩施\t572930102\t12/21/70\t女\t2013/8/9\t大专\t72339.31\t5\r\n四川\t四川青羊\t160709132\t1/2/80\t女\t2007/9/1\t本科\t72323.28\t0\r\n河北\t河北衡水\t562195202\t10/10/77\t女\t2013/6/29\t高中\t72307.4\t1\r\n陕西\t陕西西安\t237227752\t2/27/77\t女\t2008/7/1\t大专\t72301.41\t9\r\n四川\t四川绵阳\t266886862\t9/29/86\t男\t2008/11/25\t中专\t72285.02\t2\r\n广西\t广西南宁\t149144912\t8/24/68\t女\t2007/7/11\t大专\t72250.84\t2\r\n辽宁\t辽宁营口\t485557662\t3/15/65\t女\t2012/11/25\t高中\t72247.2\t9\r\n四川\t四川青羊\t76490242\t3/17/71\t女\t2006/2/27\t大专\t72236.14\t10\r\n四川\t四川高新\t845352852\t7/8/86\t女\t2015/8/10\t大专\t72235.5\t20\r\n河北\t河北石家庄\t5123978812\t12/13/82\t女\t2016/4/18\t本科\t72211\t9\r\n广东\t广东广州\t75370622\t1/10/62\t女\t2006/2/21\t大专\t72195.01\t12\r\n浙江\t浙江金华\t487589222\t9/13/66\t女\t2012/12/5\t高中\t72177.29\t4\r\n辽宁\t辽宁盘锦\t283047622\t4/6/79\t女\t2009/3/6\t大专\t72165.82\t12\r\n上海\t上海黄浦\t322185102\t11/5/81\t男\t2009/8/4\t本科\t72156\t19\r\n天津\t天津市区一支\t5125167252\t2/9/83\t女\t2016/4/20\t中专\t72150\t5\r\n浙江\t浙江金华\t5076136972\t5/15/70\t男\t2016/3/5\t大专\t72140.8\t7\r\n湖北\t湖北武汉\t90890622\t4/9/76\t女\t2006/7/12\t中专\t72091.5\t1\r\n辽宁\t辽宁营口\t291932682\t3/11/76\t女\t2009/4/9\t高中\t72081.6\t5\r\n贵州\t贵州贵阳\t235926142\t12/2/68\t男\t2008/6/25\t大专\t72038.3\t17\r\n辽宁\t辽宁沈阳\t504860662\t12/28/80\t女\t2013/2/28\t高中\t72021\t15\r\n安徽\t安徽芜湖\t532255972\t12/6/79\t女\t2013/6/10\t中专\t72016.8\t14\r\n新疆\t新疆伊犁\t5167771092\t12/5/83\t女\t2016/6/10\t高中\t72015\t4\r\n天津\t天津市区二支\t672361242\t1/28/91\t男\t2014/9/24\t本科\t72000\t0\r\n重庆\t重庆永川\t5149357432\t5/5/71\t女\t2016/5/27\t大专\t71988\t20\r\n河南\t河南驻马店\t115036782\t11/24/71\t男\t2007/1/10\t大专\t71959\t14\r\n湖北\t湖北十堰\t5193877732\t11/24/76\t女\t2016/7/27\t高中\t71941\t15\r\n浙江\t浙江金华\t732123152\t9/27/75\t女\t2015/3/31\t高中\t71935.8\t5\r\n四川\t四川高新\t5019599542\t10/29/78\t女\t2015/11/16\t本科\t71884.2\t17\r\n吉林\t吉林长春\t478537792\t8/29/78\t女\t2012/9/21\t本科\t71857\t5\r\n湖北\t湖北荆州\t141545142\t2/15/79\t女\t2007/6/20\t大专\t71809.69\t12\r\n四川\t四川高新\t461296082\t8/7/87\t女\t2012/3/31\t大专\t71809.5\t15\r\n重庆\t重庆渝中\t163445922\t1/6/77\t男\t2007/9/17\t本科\t71791.13\t12\r\n广西\t广西南宁\t749266192\t5/23/82\t女\t2015/4/25\t本科\t71775.2\t10\r\n山东\t山东烟台\t533414532\t6/21/81\t女\t2013/6/13\t中专\t71755.21\t7\r\n苏州\t苏州昆山\t5222780062\t10/6/76\t女\t2016/8/24\t高中\t71744.5\t7\r\n云南\t云南昆明\t228563352\t10/1/83\t男\t2008/6/1\t本科\t71718.76\t3\r\n四川\t四川成都\t5213919552\t7/17/82\t女\t2016/8/12\t高中\t71706.5\t14\r\n山东\t山东济南\t18703502\t3/5/65\t女\t2004/9/1\t中专\t71682.72\t11\r\n广东\t广东惠州\t162799722\t4/26/77\t女\t2007/9/12\t高中\t71676.53\t14\r\n四川\t四川青羊\t180289452\t7/17/74\t女\t2007/11/17\t中专\t71666.28\t4\r\n深圳\t深圳福田\t5103645022\t4/20/80\t女\t2016/3/22\t高中\t71589\t9\r\n湖北\t湖北咸宁\t422086862\t10/29/81\t女\t2011/4/25\t本科\t71588.61\t10\r\n苏州\t苏州张家港\t164563172\t8/18/48\t女\t2007/9/21\t大专\t71578.63\t2\r\n北京\t北京良乡\t5063345642\t3/23/72\t女\t2016/1/27\t大专\t71573\t4\r\n黑龙江\t黑龙江佳木斯\t151692872\t8/19/62\t女\t2007/7/23\t中专\t71570.27\t1\r\n福建\t福建福州\t5123870942\t10/27/84\t女\t2016/4/18\t高中\t71564\t12\r\n江苏\t江苏徐州\t5072047532\t3/2/66\t女\t2016/3/2\t高中\t71563.5\t5\r\n四川\t四川高新\t515147132\t9/12/73\t女\t2013/4/15\t大专\t71555.05\t11\r\n天津\t天津武清\t5177551822\t1/5/76\t男\t2016/6/21\t高中\t71548\t7\r\n四川\t四川雅安\t679998282\t5/9/83\t女\t2014/11/3\t高中\t71537.9\t6\r\n深圳\t深圳福田第二\t576915612\t12/17/86\t女\t2013/9/6\t中专\t71510.14\t5\r\n辽宁\t辽宁本溪\t5012960962\t12/10/76\t女\t2015/11/8\t本科\t71504\t1\r\n四川\t四川青羊\t881964562\t10/4/87\t女\t2015/10/8\t大专\t71491.5\t4\r\n黑龙江\t黑龙江绥化\t404101252\t6/26/71\t女\t2010/11/12\t大专\t71483.74\t11\r\n贵州\t贵州贵阳\t480922182\t12/13/89\t男\t2012/10/23\t本科\t71466.49\t14\r\n江西\t江西上饶\t345612622\t12/18/75\t女\t2009/11/25\t高中\t71462.17\t10\r\n河南\t河南南阳\t742820782\t10/20/81\t男\t2015/4/10\t大专\t71460.2\t17\r\n广东\t广东广州\t344400472\t10/17/79\t女\t2009/11/23\t大专\t71459.7\t7\r\n北京\t北京海淀\t65950042\t10/26/77\t女\t2005/11/21\t大专\t71433.13\t4\r\n天津\t天津市区二支\t398323262\t12/6/61\t女\t2010/9/28\t高中\t71422.98\t7\r\n内蒙古\t内蒙呼和浩特\t824871202\t3/11/70\t女\t2015/8/3\t高中\t71408.9\t8\r\n河北\t河北保定\t5141210332\t10/25/77\t女\t2016/5/18\t大专\t71408\t2\r\n河南\t河南南阳\t168644982\t11/19/64\t女\t2007/10/8\t高中\t71396.63\t18\r\n安徽\t安徽合肥\t5137871552\t2/14/78\t女\t2016/5/12\t中专\t71379.1\t9\r\n福建\t福建福州\t322014962\t10/13/76\t女\t2009/8/3\t中专\t71357.93\t7\r\n浙江\t浙江温州\t21839602\t10/17/77\t男\t2004/10/29\t大专\t71356.78\t8\r\n四川\t四川高新\t678252\t1/13/76\t女\t2002/3/1\t大专\t71353.4\t5\r\n青岛\t青岛一支\t5168584272\t3/21/66\t女\t2016/6/12\t大专\t71350\t1\r\n河南\t河南南阳\t606075072\t9/5/80\t女\t2014/1/18\t本科\t71229\t4\r\n广东\t广东东莞\t239651082\t12/15/81\t男\t2008/7/10\t中专\t71228.61\t7\r\n浙江\t浙江湖州\t494387732\t2/10/70\t女\t2012/12/25\t大专\t71216.21\t12\r\n山西\t山西临汾\t561741602\t12/3/90\t男\t2013/6/28\t大专\t71192.33\t3\r\n吉林\t吉林延边\t5171914952\t2/22/68\t男\t2016/6/15\t大专\t71152.6\t41\r\n山东\t山东济南\t712654482\t4/6/80\t女\t2015/3/17\t本科\t71145.6\t11\r\n河北\t河北邢台\t5198964312\t4/3/64\t男\t2016/8/1\t高中\t71143.9\t8\r\n四川\t四川高新\t5199536342\t1/15/91\t男\t2016/8/1\t本科\t71109\t7\r\n山东\t山东烟台\t5221795592\t12/8/80\t女\t2016/8/23\t本科\t71079\t13\r\n甘肃\t甘肃酒泉\t547752112\t7/15/78\t男\t2013/6/24\t高中\t71069\t1\r\n四川\t四川青羊\t5230212852\t7/1/92\t女\t2016/9/5\t本科\t71053\t3\r\n辽宁\t辽宁沈阳\t721676182\t3/5/65\t男\t2015/3/25\t高中\t71019.8\t7\r\n青岛\t青岛一支\t5129216812\t4/6/78\t女\t2016/4/27\t本科\t71000\t0\r\n山东\t山东淄博\t235831512\t10/22/62\t女\t2008/6/25\t高中\t70983.5\t8\r\n广东\t广东广州\t736839582\t11/15/72\t男\t2015/4/7\t高中\t70941.5\t15\r\n青岛\t青岛一支\t5069968852\t11/2/79\t男\t2016/3/1\t大专\t70930\t13\r\n湖北\t湖北荆州\t5122675162\t8/13/72\t男\t2016/4/16\t大专\t70921.2\t18\r\n海南\t海南海口\t555648052\t5/3/73\t女\t2013/6/27\t大专\t70916.19\t4\r\n安徽\t安徽合肥\t463144522\t5/2/79\t女\t2012/5/2\t本科\t70912.89\t4\r\n大连\t大连开发区\t333092782\t2/25/65\t女\t2009/9/25\t高中\t70832.17\t9\r\n内蒙古\t内蒙古通辽\t569491692\t3/28/65\t女\t2013/7/16\t本科\t70831.12\t5\r\n山东\t山东威海\t719178742\t2/21/69\t女\t2015/3/24\t大专\t70819.5\t12\r\n北京\t北京海淀\t659744402\t8/18/93\t男\t2014/8/21\t大专\t70807.5\t4\r\n河南\t河南郑州\t824854452\t1/15/75\t女\t2015/8/3\t本科\t70791.58\t1\r\n河北\t河北石家庄\t610926742\t8/22/65\t女\t2014/3/4\t高中\t70780\t2\r\n四川\t四川高新\t425454232\t12/4/90\t女\t2011/5/30\t中专\t70774.2\t8\r\n福建\t福建福州\t543747752\t9/4/68\t女\t2013/6/21\t高中\t70747.08\t5\r\n广东\t广东广州\t38374682\t11/5/69\t女\t2005/4/11\t本科\t70738.6\t16\r\n北京\t北京平谷\t729994592\t1/12/81\t女\t2015/3/30\t大专\t70720\t1\r\n安徽\t安徽合肥\t573004212\t8/13/84\t女\t2013/8/9\t大专\t70719.67\t6\r\n青岛\t青岛开发区\t242666592\t11/11/81\t女\t2008/7/25\t初中\t70698.14\t4\r\n天津\t天津市区一支\t796951252\t2/2/80\t女\t2015/7/21\t中专\t70692\t5\r\n上海\t上海黄浦\t462979552\t11/1/79\t女\t2012/4/28\t本科\t70685.52\t8\r\n北京\t北京东城\t519030202\t9/24/86\t女\t2013/5/3\t大专\t70657.32\t7\r\n四川\t四川青羊\t480514362\t9/9/79\t女\t2012/10/16\t中专\t70611.7\t4\r\n四川\t四川青羊\t808092572\t10/10/81\t女\t2015/7/28\t大专\t70611.36\t12\r\n云南\t云南昆明\t5193379092\t12/12/67\t女\t2016/7/27\t本科\t70609\t8\r\n河南\t河南郑州\t14355252\t3/15/64\t女\t2004/6/8\t大专\t70603\t15\r\n山东\t山东临沂\t5165304412\t8/10/77\t女\t2016/6/7\t中专\t70591\t24\r\n大连\t大连海川\t18030642\t3/27/55\t女\t2004/8/30\t大专\t70568\t3\r\n四川\t四川青羊\t398317122\t3/20/70\t女\t2010/9/28\t高中\t70561.62\t11\r\n辽宁\t辽宁营口\t695069152\t2/4/76\t女\t2014/12/22\t大专\t70537.93\t13\r\n新疆\t鄯善\t5040324932\t7/14/75\t女\t2015/12/1\t高中\t70522\t8\r\n江苏\t江苏南京\t426824512\t6/18/75\t女\t2011/6/14\t中专\t70506\t12\r\n北京\t北京海淀\t555030182\t12/23/88\t女\t2013/6/30\t大专\t70496.3\t6\r\n上海\t上海黄浦\t3010022\t6/26/65\t女\t2003/3/10\t中专\t70493.83\t10\r\n辽宁\t辽宁沈阳\t880387302\t1/24/72\t女\t2015/9/30\t高中\t70483\t7\r\n山东\t山东德州\t705393162\t9/15/76\t女\t2015/1/21\t中专\t70475.5\t16\r\n安徽\t安徽合肥\t243579232\t12/1/73\t女\t2008/8/1\t高中\t70462.19\t4\r\n北京\t北京良乡\t412068232\t7/29/62\t女\t2011/1/1\t高中\t70456.41\t4\r\n湖北\t湖北宜昌\t544729062\t2/20/87\t女\t2013/6/22\t大专\t70447.18\t9\r\n黑龙江\t黑龙江佳木斯\t311987122\t10/12/67\t女\t2009/6/30\t初中\t70435.5\t10\r\n陕西\t陕西西安\t809507932\t12/28/76\t女\t2015/7/28\t本科\t70389.48\t8\r\n山东\t山东烟台\t583860672\t1/10/80\t女\t2013/11/12\t高中\t70383.48\t11\r\n福建\t福建福州\t5111744072\t1/11/74\t男\t2016/3/25\t大专\t70358\t7\r\n河南\t河南信阳\t75460782\t5/4/62\t女\t2006/2/22\t大专\t70347.39\t9\r\n浙江\t浙江嘉兴\t871392262\t10/2/56\t女\t2015/9/14\t中专\t70300\t1\r\n浙江\t浙江金华\t5061714782\t12/17/90\t女\t2016/1/18\t高中\t70277.5\t16\r\n黑龙江\t黑龙江黑河\t455150882\t8/31/57\t男\t2012/3/7\t本科\t70267.42\t0\r\n湖北\t湖北武汉\t167496062\t11/14/67\t女\t2007/10/1\t本科\t70254.9\t18\r\n四川\t四川高新\t8960792\t9/15/64\t女\t2003/11/17\t大专\t70252.83\t10\r\n辽宁\t辽宁本溪\t874095282\t3/8/70\t女\t2015/9/19\t大专\t70248\t9\r\n辽宁\t辽宁本溪\t285708632\t1/5/85\t女\t2009/3/18\t中专\t70237.28\t1\r\n浙江\t浙江温州\t5191678442\t1/24/79\t女\t2016/7/25\t高中\t70189\t14\r\n河南\t河南郑州\t84786462\t2/23/70\t女\t2006/5/18\t本科\t70174.12\t20\r\n上海\t上海黄浦\t689776162\t10/14/77\t女\t2014/12/9\t大专\t70160.2\t16\r\n安徽\t安徽合肥\t25126022\t8/17/71\t女\t2004/11/1\t大专\t70158.96\t3\r\n浙江\t浙江金华\t612756762\t8/28/74\t女\t2014/3/12\t高中\t70144.5\t9\r\n山东\t山东临沂\t335615482\t9/18/64\t女\t2009/10/6\t中专\t70125.7\t4\r\n深圳\t深圳福田第二\t29825702\t4/3/71\t女\t2005/1/26\t大专\t70087.94\t1\r\n甘肃\t甘肃陇南\t5207852032\t7/11/65\t女\t2016/8/6\t高中\t70087.5\t10\r\n北京\t北京海淀\t702485532\t5/6/95\t女\t2015/1/5\t高中\t70067\t7\r\n深圳\t深圳宝安\t83757702\t1/6/72\t女\t2006/4/30\t高中\t70061.74\t7\r\n山东\t山东威海\t559363082\t5/13/80\t男\t2013/6/28\t初中\t70061.46\t16\r\n北京\t北京海淀\t862557722\t3/11/94\t男\t2015/8/24\t大专\t70030.2\t6\r\n湖北\t湖北黄石\t62597052\t4/6/75\t女\t2005/10/25\t中专\t70022.97\t19\r\n江西\t江西宜春\t241521712\t9/23/73\t女\t2008/7/22\t中专\t70018.38\t4\r\n广西\t广西桂林\t880398882\t9/20/89\t女\t2015/9/30\t高中\t70000\t0\r\n江西\t江西九江\t5086705402\t4/14/90\t女\t2016/3/10\t高中\t70000\t0\r\n河北\t河北秦皇岛\t696915222\t12/23/68\t女\t2014/12/23\t大专\t70000\t0\r\n大连\t大连明锐\t709634502\t4/8/74\t女\t2015/2/15\t中专\t70000\t0\r\n四川\t四川绵阳\t5039392042\t7/14/67\t女\t2015/11/30\t高中\t69971.3\t8\r\n辽宁\t辽宁本溪\t876876182\t7/27/64\t男\t2015/9/23\t大专\t69960.6\t4\r\n湖南\t湖南郴州\t628509702\t11/11/74\t女\t2014/5/14\t大专\t69949.37\t11\r\n四川\t四川绵阳\t5197355192\t9/15/77\t女\t2016/7/30\t高中\t69949.3\t14\r\n深圳\t深圳福田第二\t445910622\t5/23/72\t女\t2011/12/2\t硕士\t69927.14\t2\r\n广东\t广东茂名\t372952942\t10/7/75\t女\t2010/4/30\t大专\t69914.01\t6\r\n四川\t四川绵阳\t552333302\t4/13/75\t女\t2013/6/26\t高中\t69899.3\t16\r\n安徽\t安徽合肥\t473761902\t7/29/83\t女\t2012/8/6\t大专\t69885.07\t27\r\n江西\t江西南昌\t5173975492\t10/15/83\t女\t2016/6/16\t高中\t69873.8\t11\r\n江苏\t江苏连云港\t241092402\t3/23/66\t女\t2008/7/21\t高中\t69861.19\t8\r\n山东\t山东淄博\t627909282\t7/29/79\t女\t2014/5/12\t中专\t69860.21\t10\r\n河北\t河北秦皇岛\t5113995982\t4/12/80\t女\t2016/3/29\t高中\t69858.8\t8\r\n浙江\t浙江绍兴\t5069696892\t11/21/82\t女\t2016/2/29\t大专\t69822\t10\r\n甘肃\t甘肃张掖\t369387532\t10/5/75\t女\t2010/4/9\t大专\t69820.19\t8\r\n江苏\t江苏无锡\t5190839922\t9/15/92\t男\t2016/7/22\t大专\t69807.8\t6\r\n江苏\t江苏扬州\t91772832\t8/24/68\t女\t2006/7/24\t高中\t69792.57\t5\r\n山东\t山东济南\t5169038462\t12/2/81\t女\t2016/6/13\t本科\t69787\t7\r\n苏州\t苏州昆山\t5126176232\t12/19/70\t女\t2016/4/22\t高中\t69767.5\t6\r\n广东\t广东广州\t209417782\t10/22/77\t男\t2008/3/21\t大专\t69759.51\t3\r\n浙江\t浙江金华\t474654722\t1/9/75\t女\t2012/8/15\t大专\t69736.55\t8\r\n苏州\t苏州张家港\t5193687332\t3/3/85\t女\t2016/7/27\t本科\t69724.32\t10\r\n福建\t福建厦门\t5064852292\t1/4/78\t女\t2016/2/3\t本科\t69723\t8\r\n山东\t山东烟台\t548725182\t12/22/80\t女\t2013/6/25\t初中\t69708.29\t7\r\n河北\t河北唐山\t636339072\t3/17/86\t男\t2014/6/13\t大专\t69703.9\t10\r\n吉林\t吉林长春\t343635082\t8/15/76\t男\t2009/11/17\t大专\t69699.81\t0\r\n江苏\t江苏南京\t789699142\t11/29/81\t女\t2015/7/14\t大专\t69695\t9\r\n山东\t山东烟台\t5155627052\t11/16/71\t女\t2016/5/31\t中专\t69693.4\t12\r\n河南\t河南三门峡\t5088807692\t4/7/74\t男\t2016/3/11\t大专\t69680\t8\r\n安徽\t安徽合肥\t5069130262\t9/12/77\t女\t2016/2/27\t大专\t69652.5\t20\r\n四川\t四川成都\t683688052\t2/5/78\t女\t2014/11/18\t大专\t69650\t13\r\n重庆\t重庆永川\t656406762\t11/30/77\t女\t2014/8/14\t高中\t69649.27\t10\r\n湖北\t湖北襄阳\t58125142\t6/24/67\t女\t2005/9/12\t高中\t69627.76\t17\r\n浙江\t浙江金华\t5199898032\t8/31/93\t女\t2016/8/1\t高中\t69621.5\t6\r\n青岛\t青岛开发区\t148036602\t6/21/74\t女\t2007/7/10\t高中\t69604.99\t6\r\n福建\t福建福州\t336196782\t1/17/73\t女\t2009/10/10\t大专\t69591.75\t10\r\n湖北\t湖北恩施\t5216805042\t3/20/76\t女\t2016/8/16\t高中\t69573.9\t15\r\n江苏\t江苏常州\t274547492\t8/15/64\t女\t2009/1/1\t高中\t69514.73\t2\r\n海南\t海南三亚\t585329352\t5/1/88\t男\t2013/11/21\t大专\t69512.3\t2\r\n大连\t大连明锐\t336570132\t2/22/76\t女\t2009/10/14\t大专\t69498.32\t3\r\n湖北\t湖北武汉\t5152718922\t12/1/82\t女\t2016/5/30\t大专\t69498\t13\r\n天津\t天津蓟州\t296601662\t6/21/68\t女\t2009/5/4\t高中\t69442.4\t2\r\n江西\t江西南昌\t69121312\t1/31/78\t男\t2005/12/12\t高中\t69440.34\t7\r\n黑龙江\t黑龙江哈尔滨\t627419812\t2/28/74\t女\t2014/5/8\t大专\t69428\t3\r\n四川\t四川青羊\t650486692\t5/21/82\t女\t2014/8/1\t本科\t69416.81\t7\r\n四川\t四川高新\t676036632\t8/21/79\t女\t2014/10/8\t中专\t69414.4\t10\r\n北京\t北京海淀\t590470352\t4/14/88\t女\t2013/12/11\t大专\t69408.95\t4\r\n湖北\t湖北武汉\t45973482\t10/23/69\t男\t2005/6/1\t大专\t69335.09\t8\r\n贵州\t贵州遵义\t5197289972\t6/18/66\t女\t2016/7/30\t大专\t69316\t9\r\n浙江\t浙江温州\t874645182\t9/21/84\t女\t2015/9/20\t高中\t69304\t7\r\n山东\t山东菏泽\t342376452\t10/30/78\t男\t2009/11/11\t大专\t69298.91\t13\r\n辽宁\t辽宁盘锦\t5137331232\t6/16/78\t女\t2016/5/12\t本科\t69272\t5\r\n四川\t四川青羊\t87003782\t7/27/79\t女\t2006/6/12\t高中\t69268.9\t18\r\n山东\t山东济南\t5126282302\t11/9/80\t女\t2016/4/22\t大专\t69251.5\t15\r\n江西\t江西南昌\t5029682072\t10/13/76\t女\t2015/11/24\t高中\t69240.5\t18\r\n云南\t云南曲靖\t5163656312\t9/8/74\t女\t2016/6/6\t高中\t69195\t7\r\n上海\t上海黄浦\t5173749782\t11/13/77\t女\t2016/6/16\t本科\t69191\t6\r\n青岛\t青岛一支\t141774312\t3/10/79\t女\t2007/6/20\t中专\t69152.45\t12\r\n吉林\t吉林四平\t5189012292\t5/31/75\t男\t2016/7/15\t高中\t69132.5\t7\r\n山东\t山东东营\t107298972\t10/25/79\t女\t2006/12/13\t中专\t69078.01\t13\r\n佛山\t佛山禅城\t298780742\t9/12/75\t女\t2009/5/11\t高中\t69070.48\t8\r\n四川\t四川高新\t160898662\t2/7/83\t女\t2007/9/3\t大专\t69040.8\t8\r\n四川\t四川德阳\t18949422\t10/4/54\t女\t2004/9/16\t中专\t69026.55\t9\r\n江苏\t江苏泰州\t5147684892\t7/10/65\t女\t2016/5/26\t高中\t68981\t5\r\n山东\t山东威海\t5179257942\t1/26/66\t女\t2016/6/21\t高中\t68980\t7\r\n山西\t山西阳泉\t628804472\t10/16/64\t女\t2014/5/16\t高中\t68931.74\t6\r\n四川\t四川青羊\t3582112\t2/13/69\t女\t2003/4/14\t高中\t68930.83\t14\r\n甘肃\t甘肃武威\t5041209702\t12/11/73\t女\t2015/12/3\t高中\t68899.9\t3\r\n江苏\t江苏南京\t680639042\t8/5/78\t女\t2014/11/7\t中专\t68899.4\t15\r\n浙江\t浙江嘉兴\t318494632\t4/30/70\t男\t2009/7/25\t中专\t68872.33\t5\r\n山东\t山东济宁\t442350652\t1/2/76\t女\t2011/10/22\t中专\t68862.29\t8\r\n山西\t山西阳泉\t340883212\t1/12/72\t女\t2009/11/6\t大专\t68859.36\t2\r\n北京\t北京海淀\t651248042\t8/8/91\t女\t2014/8/4\t本科\t68848.45\t3\r\n苏州\t苏州张家港\t61805972\t5/6/71\t女\t2005/7/26\t高中\t68838.96\t9\r\n福建\t福建福州\t644956022\t9/6/88\t女\t2014/6/30\t大专\t68836.2\t6\r\n福建\t福建漳州\t615105282\t7/8/79\t女\t2014/3/18\t本科\t68823\t6\r\n四川\t四川高新\t745462672\t8/16/80\t女\t2015/4/14\t大专\t68810\t21\r\n四川\t四川雅安\t488389782\t2/4/82\t女\t2012/12/7\t大专\t68800.29\t9\r\n北京\t北京东城\t499290352\t6/3/86\t女\t2013/1/13\t大专\t68800.09\t0\r\n山东\t山东威海\t517199482\t11/23/76\t女\t2013/4/25\t初中\t68790.9\t15\r\n内蒙古\t内蒙呼和浩特\t5140709962\t1/17/82\t女\t2016/5/17\t高中\t68767\t5\r\n河南\t河南驻马店\t5125874362\t11/12/80\t男\t2016/4/21\t本科\t68758\t4\r\n四川\t四川青羊\t660156962\t6/1/85\t女\t2014/8/22\t本科\t68754.15\t15\r\n浙江\t浙江温州\t5188817392\t10/30/81\t男\t2016/7/14\t高中\t68750\t17\r\n河北\t河北廊坊\t5158253322\t9/1/83\t女\t2016/6/1\t高中\t68746\t10\r\n四川\t四川青羊\t5134659682\t6/20/72\t女\t2016/5/6\t大专\t68738.5\t6\r\n四川\t四川青羊\t380164442\t9/19/74\t女\t2010/6/12\t大专\t68724.09\t5\r\n四川\t四川绵阳\t457078602\t5/5/76\t男\t2012/3/16\t大专\t68714.51\t5\r\n上海\t上海黄浦\t5219011602\t12/24/73\t女\t2016/8/18\t大专\t68710\t4\r\n青岛\t青岛一支\t94361132\t1/1/78\t女\t2006/8/24\t本科\t68700.16\t14\r\n天津\t天津蓟州\t5178762972\t10/26/73\t男\t2016/6/21\t中专\t68700\t2\r\n青岛\t青岛一支\t614746312\t10/8/82\t男\t2014/3/17\t本科\t68668.78\t6\r\n山西\t山西忻州\t825576162\t2/20/73\t女\t2015/8/3\t大专\t68663.6\t3\r\n浙江\t浙江绍兴\t5092136502\t6/30/78\t女\t2016/3/14\t本科\t68658.5\t11\r\n江苏\t江苏南京\t5070045912\t4/27/84\t男\t2016/3/1\t本科\t68652\t8\r\n大连\t大连明锐\t761478282\t2/27/67\t女\t2015/6/5\t本科\t68646.4\t19\r\n北京\t北京海淀\t489677442\t5/23/85\t男\t2012/12/13\t大专\t68618.8\t0\r\n湖北\t湖北武汉\t5072176242\t3/5/87\t男\t2016/3/2\t本科\t68615.7\t10\r\n浙江\t浙江金华\t34976612\t9/4/58\t女\t2005/3/25\t高中\t68609.87\t10\r\n辽宁\t辽宁沈阳\t103952822\t3/10/76\t男\t2006/11/20\t大专\t68599.3\t18\r\n甘肃\t甘肃金昌\t576422102\t1/16/78\t女\t2013/9/4\t中专\t68582.68\t5\r\n大连\t大连海川\t5387842\t2/9/69\t女\t2003/7/1\t大专\t68576.95\t11\r\n湖北\t湖北襄阳\t429806252\t5/15/72\t女\t2011/7/1\t大专\t68565.68\t16\r\n福建\t福建宁德\t5105661182\t8/7/75\t男\t2016/3/22\t高中\t68558.2\t6\r\n深圳\t深圳宝安\t533363312\t6/15/67\t女\t2013/6/13\t大专\t68552.17\t10\r\n福建\t福建南平\t5159498952\t3/5/63\t女\t2016/6/2\t高中\t68529.3\t3\r\n黑龙江\t黑龙江绥化\t385650732\t8/13/64\t女\t2010/7/8\t中专\t68512.23\t4\r\n湖北\t湖北荆州\t215384332\t7/15/66\t女\t2008/4/8\t高中\t68512.01\t11\r\n宁波\t宁波城区\t108072602\t6/27/80\t女\t2006/12/18\t大专\t68507.25\t3\r\n苏州\t苏州昆山\t5194793312\t2/24/73\t女\t2016/7/28\t高中\t68475\t10\r\n广西\t广西南宁\t5087663632\t1/23/84\t男\t2016/3/10\t本科\t68466.3\t9\r\n苏州\t苏州张家港\t5225896802\t4/19/82\t女\t2016/8/30\t高中\t68454\t20\r\n深圳\t深圳福田\t591964292\t9/16/76\t男\t2013/12/15\t大专\t68442.19\t7\r\n江西\t江西赣州\t440829082\t1/24/71\t女\t2011/9/30\t高中\t68442.03\t3\r\n北京\t北京海淀\t453005302\t4/2/91\t女\t2012/3/1\t高中\t68441.3\t7\r\n湖南\t湖南长沙\t825075112\t2/12/74\t男\t2015/8/3\t中专\t68421\t1\r\n浙江\t浙江金华\t552344882\t8/28/71\t女\t2013/6/26\t大专\t68412.08\t5\r\n四川\t四川高新\t5190636852\t10/26/71\t女\t2016/7/21\t高中\t68411.2\t13\r\n江苏\t江苏泰州\t699746642\t10/8/68\t女\t2014/12/29\t初中\t68411.1\t9\r\n四川\t四川青羊\t141383242\t3/13/83\t女\t2007/6/19\t本科\t68410.11\t17\r\n福建\t福建泉州\t420076522\t5/17/77\t女\t2011/3/29\t大专\t68355.73\t1\r\n内蒙古\t内蒙呼和浩特\t5199995032\t8/16/75\t女\t2016/8/1\t大专\t68346.2\t10\r\n浙江\t浙江杭州\t850921492\t12/8/72\t女\t2015/8/10\t高中\t68337\t4\r\n上海\t上海黄浦\t5028588832\t3/8/76\t女\t2015/11/24\t中专\t68310.68\t9\r\n大连\t大连开发区\t74031742\t2/8/69\t女\t2006/1/23\t初中\t68302.26\t1\r\n大连\t大连海川\t597099152\t6/20/77\t女\t2013/12/25\t大专\t68294.55\t12\r\n青岛\t青岛一支\t300166102\t11/23/80\t女\t2009/5/16\t大专\t68288.51\t9\r\n苏州\t苏州新区\t22288732\t2/2/64\t女\t2004/11/5\t本科\t68280.16\t4\r\n辽宁\t辽宁沈阳\t472721562\t4/24/77\t男\t2012/7/25\t本科\t68262.75\t9\r\n青岛\t青岛一支\t5213390102\t6/9/71\t男\t2016/8/11\t大专\t68254.5\t7\r\n北京\t北京海淀\t352082\t3/4/78\t男\t2002/1/18\t大专\t68250.29\t4\r\n广西\t广西南宁\t603824252\t10/26/74\t男\t2014/1/1\t大专\t68232.9\t14\r\n湖北\t湖北襄阳\t5022333682\t5/6/73\t男\t2015/11/18\t高中\t68224.3\t11\r\n河北\t河北唐山\t759811832\t10/3/81\t女\t2015/6/2\t中专\t68220\t8\r\n广东\t广东广州\t353597052\t9/18/82\t女\t2009/12/30\t大专\t68200.34\t18\r\n吉林\t吉林通化\t5136276972\t5/15/80\t女\t2016/5/10\t高中\t68174\t7\r\n四川\t四川高新\t488216302\t12/15/88\t女\t2012/12/7\t高中\t68169.5\t11\r\n江西\t江西南昌\t5147089252\t1/30/84\t女\t2016/5/26\t高中\t68155.6\t12\r\n广东\t广东惠州\t622542182\t7/13/74\t女\t2014/4/8\t大专\t68143.5\t3\r\n河南\t河南周口\t93572152\t4/14/63\t女\t2006/8/16\t高中\t68123\t10\r\n广西\t广西南宁\t856451192\t8/5/77\t女\t2015/8/10\t中专\t68120.5\t20\r\n天津\t天津滨海新区\t408504492\t10/16/53\t女\t2010/12/10\t大专\t68114.26\t4\r\n重庆\t重庆永川\t5130403452\t12/14/78\t女\t2016/4/29\t中专\t68112\t13\r\n青岛\t青岛一支\t757800792\t10/13/81\t女\t2015/5/27\t大专\t68107\t7\r\n浙江\t浙江绍兴\t5145107572\t8/28/82\t女\t2016/5/24\t大专\t68086.9\t4\r\n广东\t广东惠州\t23035702\t5/17/72\t男\t2004/11/16\t大专\t68084.22\t1\r\n河南\t河南三门峡\t162540822\t12/15/67\t男\t2007/9/11\t高中\t68081\t10\r\n四川\t四川高新\t394977112\t10/14/87\t女\t2010/9/9\t大专\t68072\t8\r\n辽宁\t辽宁本溪\t749084472\t6/17/69\t女\t2015/4/25\t高中\t68063.5\t4\r\n云南\t云南昆明\t695434262\t8/10/70\t男\t2014/12/22\t大专\t68058\t4\r\n辽宁\t辽宁营口\t544258712\t10/26/84\t女\t2013/6/21\t中专\t68044\t11\r\n天津\t天津市区二支\t631582302\t11/4/82\t女\t2014/5/28\t大专\t68014.5\t11\r\n湖北\t湖北武汉\t337667832\t2/12/71\t女\t2009/10/22\t高中\t68011\t8\r\n江西\t江西南昌\t534460042\t8/16/79\t女\t2013/6/14\t高中\t68010.6\t7\r\n辽宁\t辽宁营口\t408893192\t11/25/67\t女\t2010/12/14\t高中\t68000.43\t3\r\n四川\t四川青羊\t605380022\t6/26/79\t男\t2014/1/13\t大专\t67977.1\t6\r\n广西\t广西南宁\t5211435632\t5/8/81\t女\t2016/8/9\t高中\t67974\t13\r\n新疆\t新疆昌吉\t296154902\t12/25/72\t女\t2009/5/1\t本科\t67971.35\t8\r\n湖北\t湖北襄阳\t403181772\t10/4/78\t女\t2010/11/4\t高中\t67944.8\t21\r\n辽宁\t辽宁沈阳\t543729332\t7/19/82\t女\t2013/6/21\t本科\t67933\t3\r\n四川\t四川高新\t327257432\t4/26/72\t女\t2009/8/27\t大专\t67915.69\t21\r\n山东\t山东枣庄\t285698722\t10/8/75\t女\t2009/3/18\t大专\t67910.99\t10\r\n重庆\t重庆永川\t645374722\t6/4/73\t男\t2014/7/2\t中专\t67874.5\t19\r\n湖南\t湖南长沙\t173516202\t5/23/68\t女\t2007/11/1\t大专\t67863.17\t9\r\n大连\t大连开发区\t745798752\t6/22/63\t女\t2015/4/15\t初中\t67862.5\t14\r\n大连\t大连开发区\t80657472\t5/2/69\t女\t2006/3/30\t高中\t67856.45\t4\r\n湖北\t湖北宜昌\t5122375092\t9/30/74\t女\t2016/4/15\t高中\t67846.5\t16\r\n山东\t山东泰安\t184860732\t11/11/69\t女\t2007/11/25\t高中\t67840.63\t12\r\n山东\t山东济南\t378458082\t10/16/75\t女\t2010/5/31\t大专\t67838.89\t10\r\n山东\t山东潍坊\t849929302\t4/22/66\t女\t2015/8/10\t中专\t67836.5\t12\r\n深圳\t深圳南山\t5143443132\t2/7/87\t男\t2016/5/20\t高中\t67830.7\t7\r\n四川\t四川高新\t1643782\t12/29/70\t女\t2002/8/9\t本科\t67824.15\t0\r\n山东\t山东济南\t55072362\t3/15/71\t女\t2005/8/17\t大专\t67815.55\t14\r\n湖北\t湖北武汉\t46426382\t9/30/71\t女\t2005/6/7\t大专\t67804.11\t18\r\n苏州\t苏州新区\t260054852\t10/29/82\t女\t2008/11/1\t大专\t67803.46\t3\r\n福建\t福建龙岩\t260067832\t6/8/77\t女\t2008/11/1\t大专\t67800.05\t2\r\n北京\t北京良乡\t5223224282\t4/14/72\t女\t2016/8/25\t大专\t67790\t10\r\n山东\t山东济南\t5175595482\t6/7/77\t女\t2016/6/20\t大专\t67783\t12\r\n湖北\t湖北襄阳\t590399312\t7/16/80\t女\t2013/12/11\t中专\t67758.88\t18\r\n四川\t四川高新\t247528872\t5/11/74\t女\t2008/8/25\t大专\t67756.25\t14\r\n河北\t河北邢台\t801397202\t6/16/72\t男\t2015/7/24\t高中\t67750\t6\r\n深圳\t深圳罗湖\t5216945592\t12/28/63\t女\t2016/8/16\t本科\t67750\t1\r\n山东\t山东烟台\t307950662\t7/20/80\t女\t2009/6/24\t大专\t67735.64\t17\r\n山东\t山东滨州\t311378462\t3/26/80\t女\t2009/6/27\t中专\t67718.53\t14\r\n青岛\t青岛一支\t566854272\t10/11/55\t女\t2013/6/30\t大专\t67713.05\t3\r\n山西\t山西太原\t230519402\t4/8/76\t女\t2008/6/10\t高中\t67711.34\t8\r\n山东\t山东济南\t621806792\t3/11/84\t女\t2014/4/2\t本科\t67693\t16\r\n宁波\t宁波城区\t279767072\t4/28/63\t女\t2009/2/19\t高中\t67684.61\t2\r\n青岛\t青岛一支\t615001442\t11/16/82\t女\t2014/3/18\t大专\t67663.45\t13\r\n湖南\t湖南郴州\t5020628462\t7/20/74\t女\t2015/11/17\t大专\t67660\t8\r\n湖北\t湖北荆门\t244809802\t4/18/75\t女\t2008/8/6\t大专\t67627.1\t7\r\n云南\t云南昆明\t527937452\t7/9/83\t女\t2013/6/5\t大专\t67625.04\t9\r\n四川\t四川成都\t9333442\t11/24/64\t女\t2003/12/9\t高中\t67608.9\t7\r\n湖北\t湖北襄阳\t5140901192\t4/4/80\t女\t2016/5/17\t高中\t67608\t8\r\n浙江\t浙江杭州\t5117169772\t6/23/84\t男\t2016/4/6\t大专\t67592\t14\r\n新疆\t新疆乌鲁木齐\t230445292\t5/17/70\t女\t2008/6/1\t大专\t67560.88\t4\r\n河南\t河南三门峡\t649030022\t7/3/72\t女\t2014/7/30\t大专\t67553.4\t11\r\n四川\t四川青羊\t420679042\t3/27/85\t男\t2011/4/1\t本科\t67551.57\t3\r\n浙江\t浙江杭州\t234939392\t6/1/79\t女\t2008/6/25\t大专\t67550.69\t7\r\n山东\t山东济南\t281921862\t8/1/77\t女\t2009/3/2\t大专\t67544\t10\r\n山西\t山西太原\t286090492\t9/11/69\t男\t2009/3/20\t大专\t67488.4\t5\r\n大连\t大连明锐\t694877522\t11/22/72\t女\t2014/12/22\t大专\t67464.5\t5\r\n辽宁\t辽宁铁岭\t5019880572\t10/19/71\t女\t2015/11/16\t大专\t67462\t6\r\n四川\t四川青羊\t7865462\t2/16/69\t女\t2003/9/18\t大专\t67460.15\t15\r\n四川\t四川高新\t345464402\t12/4/77\t女\t2009/11/25\t本科\t67447.5\t9\r\n浙江\t浙江杭州\t399487262\t10/18/87\t女\t2010/10/9\t本科\t67419.95\t3\r\n山西\t山西忻州\t660530312\t12/25/64\t女\t2014/8/23\t高中\t67395.91\t3\r\n四川\t四川青羊\t3635702\t8/1/72\t女\t2003/4/15\t大专\t67395.62\t13\r\n贵州\t贵州六盘水\t5153217492\t7/19/81\t女\t2016/5/30\t本科\t67385.9\t14\r\n辽宁\t辽宁盘锦\t94846132\t8/7/74\t女\t2006/8/25\t本科\t67366.73\t5\r\n广西\t广西南宁\t614149932\t9/5/88\t女\t2014/3/17\t大专\t67363.75\t15\r\n河南\t河南郑州\t604427742\t9/27/81\t女\t2014/1/6\t大专\t67353.8\t2\r\n广东\t广东东莞\t739832902\t12/22/76\t女\t2015/4/9\t高中\t67351.5\t7\r\n湖北\t湖北武汉\t20901702\t3/16/63\t女\t2004/10/17\t大专\t67342.96\t14\r\n大连\t大连海川\t233173572\t12/26/62\t女\t2008/6/23\t大专\t67342.25\t7\r\n湖北\t湖北荆州\t340768762\t12/23/83\t女\t2009/11/5\t高中\t67320.59\t10\r\n江苏\t江苏南京\t710493822\t8/3/88\t女\t2015/2/28\t本科\t67284.6\t15\r\n甘肃\t甘肃兰州\t338655282\t9/17/71\t女\t2009/10/25\t大专\t67274.87\t10\r\n湖北\t湖北武汉\t131156232\t4/12/76\t女\t2007/4/20\t本科\t67269\t14\r\n甘肃\t甘肃兰州\t312381262\t10/19/70\t女\t2009/7/1\t中专\t67254\t6\r\n四川\t四川高新\t5088222022\t8/3/92\t男\t2016/3/11\t大专\t67240.1\t14\r\n宁波\t宁波象山\t818026212\t3/9/79\t男\t2015/7/31\t大专\t67229.21\t6\r\n深圳\t深圳南山\t5181677472\t9/10/91\t男\t2016/6/24\t高中\t67215.4\t11\r\n浙江\t浙江杭州\t571426252\t10/26/84\t女\t2013/7/30\t大专\t67212.5\t4\r\n深圳\t深圳罗湖\t5175253732\t10/26/73\t女\t2016/6/18\t高中\t67190\t10\r\n云南\t云南昆明\t5075618392\t12/9/82\t女\t2016/3/4\t本科\t67189\t10\r\n黑龙江\t黑龙江绥化\t778735072\t6/12/83\t女\t2015/6/30\t大专\t67189\t1\r\n天津\t天津市区一支\t25397202\t9/29/72\t女\t2004/12/6\t中专\t67179.38\t10\r\n云南\t云南昆明\t471548352\t4/9/78\t女\t2012/7/2\t大专\t67174.33\t4\r\n山东\t山东滨州\t754252132\t8/1/70\t女\t2015/5/15\t大专\t67162\t6\r\n四川\t四川高新\t130213862\t10/27/77\t女\t2007/4/17\t大专\t67148.23\t9\r\n云南\t云南昆明\t264420552\t3/9/72\t女\t2008/11/1\t大专\t67135.51\t7\r\n福建\t福建南平\t537208142\t6/13/65\t女\t2013/6/16\t初中\t67130.55\t12\r\n湖北\t湖北襄阳\t450083022\t6/12/80\t女\t2012/1/1\t高中\t67127.51\t15\r\n青海\t西宁\t5098904762\t5/6/70\t女\t2016/3/18\t大专\t67125\t7\r\n内蒙古\t内蒙古赤峰\t358194292\t12/5/70\t女\t2010/1/22\t本科\t67121\t2\r\n青岛\t青岛即墨\t24184352\t12/22/68\t女\t2004/11/28\t高中\t67106.35\t1\r\n黑龙江\t黑龙江哈尔滨\t75538662\t4/26/77\t女\t2006/2/23\t本科\t67099.29\t8\r\n四川\t四川绵阳\t701779872\t4/1/83\t男\t2014/12/31\t大专\t67098\t3\r\n河南\t河南驻马店\t556218742\t1/5/66\t女\t2013/6/27\t高中\t67091\t12\r\n北京\t北京东城\t5147451912\t10/18/92\t男\t2016/5/26\t本科\t67031\t4\r\n山东\t山东威海\t532025132\t3/24/78\t女\t2013/6/9\t大专\t67013.24\t15\r\n内蒙古\t内蒙呼和浩特\t347128752\t2/15/74\t女\t2009/12/1\t高中\t66994.61\t10\r\n山东\t山东烟台\t5209435812\t3/16/87\t女\t2016/8/8\t大专\t66960.5\t23\r\n苏州\t苏州新区\t5199467452\t4/2/71\t男\t2016/8/1\t本科\t66931.5\t15\r\n陕西\t陕西渭南\t375209902\t8/8/69\t女\t2010/5/15\t大专\t66925.89\t4\r\n山东\t山东泰安\t616010382\t7/11/85\t女\t2014/3/20\t中专\t66920.22\t14\r\n湖北\t湖北武汉\t299431412\t1/14/69\t女\t2009/5/14\t高中\t66890.6\t13\r\n北京\t北京东城\t5163567482\t10/26/66\t女\t2016/6/6\t本科\t66878\t8\r\n山东\t山东烟台\t95538112\t12/22/68\t女\t2006/9/1\t中专\t66868.36\t16\r\n四川\t四川青羊\t555226552\t7/24/86\t女\t2013/6/27\t本科\t66866.59\t6\r\n河南\t河南洛阳\t355971802\t10/2/78\t女\t2010/1/4\t大专\t66839.24\t2\r\n重庆\t重庆渝中\t5136673072\t9/28/88\t女\t2016/5/11\t本科\t66820.3\t16\r\n云南\t云南昆明\t484041532\t12/19/76\t女\t2012/11/21\t高中\t66816.9\t4\r\n河南\t河南周口\t37738392\t2/3/66\t女\t2005/4/1\t大专\t66806.31\t12\r\n海南\t海南海口\t415730642\t8/18/75\t女\t2011/3/1\t本科\t66775.61\t0\r\n浙江\t浙江台州\t667787862\t8/20/71\t女\t2014/9/9\t高中\t66759.75\t1\r\n辽宁\t辽宁沈阳\t212163512\t10/2/70\t女\t2008/3/25\t硕士\t66748.27\t4\r\n河北\t河北石家庄\t647603352\t8/20/76\t女\t2014/7/25\t中专\t66719\t5\r\n湖南\t湖南长沙\t140481212\t10/21/77\t女\t2007/7/1\t大专\t66708.41\t6\r\n四川\t四川成都\t71763202\t4/6/69\t男\t2005/12/30\t高中\t66693.38\t5\r\n浙江\t浙江杭州\t5137422832\t5/30/70\t男\t2016/5/12\t本科\t66672\t8\r\n浙江\t浙江杭州\t752302222\t3/14/65\t女\t2015/5/6\t高中\t66665.5\t9\r\n青岛\t青岛一支\t690415522\t5/26/72\t男\t2014/12/12\t大专\t66651.8\t3\r\n苏州\t苏州昆山\t700745672\t1/25/79\t女\t2014/12/30\t大专\t66635.3\t18\r\n广东\t广东广州\t5213635822\t7/27/81\t女\t2016/8/11\t大专\t66627.5\t25\r\n山东\t山东烟台\t730019852\t10/20/81\t女\t2015/3/30\t本科\t66622\t13\r\n湖北\t湖北荆州\t5188786582\t8/21/70\t女\t2016/7/14\t高中\t66615.3\t18\r\n山东\t山东烟台\t272810702\t12/1/82\t女\t2008/12/25\t大专\t66600.61\t21\r\n北京\t北京良乡\t795585712\t3/24/71\t女\t2015/7/20\t大专\t66570.5\t2\r\n湖北\t湖北武汉\t5123694112\t8/17/55\t女\t2016/4/18\t硕士\t66563.7\t6\r\n四川\t四川成都\t882424302\t2/4/71\t女\t2015/10/9\t高中\t66563.2\t21\r\n上海\t上海陆家嘴\t616519942\t2/21/83\t女\t2014/3/21\t本科\t66555\t1\r\n江苏\t江苏徐州\t5140012822\t4/6/77\t女\t2016/5/16\t本科\t66554.1\t8\r\n山东\t山东烟台\t95547322\t1/8/80\t女\t2006/9/1\t中专\t66537\t7\r\n贵州\t贵州贵阳\t492603492\t3/21/69\t女\t2012/12/21\t高中\t66527.19\t11\r\n广东\t广东惠州\t364520782\t6/13/83\t女\t2010/3/17\t大专\t66521.03\t12\r\n福建\t福建厦门\t515912522\t10/22/77\t女\t2013/4/22\t中专\t66512\t6\r\n福建\t福建漳州\t5122351552\t1/23/65\t女\t2016/4/15\t高中\t66509.6\t10\r\n北京\t北京平谷\t673972972\t3/6/77\t女\t2014/9/25\t大专\t66496\t2\r\n苏州\t苏州张家港\t484596872\t9/22/65\t女\t2012/11/23\t高中\t66495.07\t4\r\n浙江\t浙江湖州\t5199797432\t3/14/85\t女\t2016/8/1\t大专\t66494\t11\r\n苏州\t苏州新区\t5003513882\t8/24/87\t男\t2015/10/22\t本科\t66492\t5\r\n北京\t北京平谷\t65956182\t10/13/70\t女\t2005/11/21\t大专\t66452.29\t12\r\n四川\t四川成都\t301793882\t10/21/81\t女\t2009/5/20\t高中\t66435.87\t5\r\n深圳\t深圳宝安\t303121182\t5/16/70\t女\t2009/5/25\t大专\t66400.37\t4\r\n福建\t福建福州\t5218007122\t5/15/72\t男\t2016/8/17\t高中\t66398.9\t9\r\n山西\t山西运城\t5200731152\t7/1/73\t女\t2016/8/2\t高中\t66383.5\t9\r\n苏州\t苏州昆山\t798463612\t7/8/74\t女\t2015/7/22\t大专\t66355.81\t6\r\n黑龙江\t黑龙江哈尔滨\t28138462\t2/27/68\t男\t2005/1/4\t大专\t66355.03\t14\r\n广东\t广东广州\t184692692\t11/14/76\t女\t2007/11/25\t大专\t66351.54\t10\r\n山西\t山西大同\t5173599262\t8/23/70\t女\t2016/6/16\t高中\t66344\t2\r\n重庆\t重庆巴南\t5129373632\t4/25/84\t女\t2016/4/27\t大专\t66340.7\t18\r\n浙江\t浙江杭州\t5199507332\t9/19/78\t女\t2016/8/1\t大专\t66339\t5\r\n四川\t四川青羊\t23300742\t10/15/73\t女\t2004/11/19\t大专\t66326.45\t8\r\n上海\t上海黄浦\t576244152\t2/5/87\t女\t2013/9/3\t中专\t66326\t6\r\n陕西\t陕西汉中\t5043085312\t1/26/76\t女\t2015/12/8\t高中\t66304.5\t5\r\n北京\t北京良乡\t5088423292\t2/10/74\t女\t2016/3/11\t大专\t66298.11\t1\r\n陕西\t陕西西安\t420726492\t6/7/78\t女\t2011/4/2\t大专\t66297.5\t6\r\n四川\t四川青羊\t391027742\t5/2/80\t女\t2010/8/17\t本科\t66279\t6\r\n江西\t江西赣州\t5063769922\t2/6/80\t女\t2016/1/29\t中专\t66260.36\t4\r\n江苏\t江苏扬州\t5214234092\t8/20/64\t女\t2016/8/12\t高中\t66260\t2\r\n佛山\t佛山南海\t5122722312\t1/27/76\t女\t2016/4/16\t大专\t66259.5\t12\r\n山东\t山东威海\t5209028772\t11/29/82\t女\t2016/8/8\t中专\t66259\t6\r\n江西\t江西南昌\t5195757912\t8/17/78\t女\t2016/7/28\t高中\t66241\t7\r\n辽宁\t辽宁本溪\t660843502\t10/16/77\t女\t2014/8/24\t中专\t66238.32\t11\r\n浙江\t浙江温州\t5214791652\t8/17/78\t女\t2016/8/12\t中专\t66229\t8\r\n四川\t四川青羊\t134492\t7/16/63\t女\t2001/12/30\t高中\t66213.29\t5\r\n湖南\t湖南益阳\t450007512\t8/8/68\t女\t2012/1/1\t中专\t66211\t13\r\n江苏\t江苏无锡\t5143964412\t4/30/76\t女\t2016/5/22\t高中\t66202.5\t5\r\n辽宁\t辽宁本溪\t38896252\t5/22/64\t女\t2005/4/17\t高中\t66199.51\t17\r\n福建\t福建泉州\t431271162\t12/1/82\t男\t2011/7/25\t大专\t66179.8\t5\r\n河南\t河南安阳\t147356902\t7/13/62\t男\t2007/7/2\t高中\t66166.46\t4\r\n浙江\t浙江金华\t673337382\t1/7/91\t女\t2014/9/25\t中专\t66151\t6\r\n重庆\t重庆万州\t591461842\t7/14/81\t女\t2013/12/13\t大专\t66138.47\t8\r\n河北\t河北沧州\t851115492\t3/21/82\t男\t2015/8/10\t大专\t66060\t2\r\n黑龙江\t黑龙江牡丹江\t129792092\t4/19/71\t女\t2007/4/11\t大专\t66026.5\t20\r\n江西\t江西上饶\t399419292\t10/5/85\t女\t2010/10/8\t大专\t66018.08\t1\r\n辽宁\t辽宁鞍山\t433138722\t9/25/73\t女\t2011/8/8\t大专\t66004.21\t13\r\n河南\t河南周口\t507868362\t2/25/76\t女\t2013/3/19\t高中\t66002\t4\r\n河南\t河南濮阳\t482030492\t9/15/84\t女\t2012/11/1\t高中\t66000\t0\r\n吉林\t吉林长春\t312506592\t10/8/56\t女\t2009/7/1\t大专\t65996.1\t2\r\n广东\t广东广州\t636347582\t1/22/82\t女\t2014/6/13\t高中\t65995\t3\r\n吉林\t吉林长春\t290353052\t5/17/73\t男\t2009/4/1\t本科\t65981.93\t8\r\n浙江\t浙江杭州\t5150354642\t12/17/93\t女\t2016/5/27\t本科\t65979\t8\r\n云南\t云南昆明\t468470312\t3/2/71\t男\t2012/6/19\t高中\t65939.5\t10\r\n吉林\t吉林辽源\t5175325322\t8/4/67\t女\t2016/6/19\t高中\t65936\t14\r\n四川\t四川德阳\t136928082\t2/28/82\t男\t2007/5/25\t本科\t65921.02\t4\r\n青岛\t青岛一支\t150574652\t10/13/79\t女\t2007/7/18\t大专\t65919.04\t7\r\n重庆\t重庆涪陵\t591744332\t8/23/70\t女\t2013/12/14\t本科\t65869.45\t12\r\n山西\t山西临汾\t613901642\t12/8/63\t女\t2014/3/15\t高中\t65748.02\t14\r\n辽宁\t辽宁营口\t88838272\t12/25/65\t女\t2006/6/25\t大专\t65736.98\t9\r\n四川\t四川青羊\t5175714222\t9/7/70\t男\t2016/6/20\t本科\t65717\t8\r\n广西\t广西玉林\t541031752\t3/8/72\t女\t2013/6/18\t高中\t65714.11\t1\r\n云南\t云南大理\t5090788472\t12/21/72\t女\t2016/3/12\t中专\t65680\t2\r\n湖北\t湖北随州\t769950082\t8/10/64\t男\t2015/6/24\t大专\t65676\t8\r\n四川\t四川德阳\t5088873882\t9/1/89\t女\t2016/3/11\t中专\t65655\t6\r\n上海\t上海黄浦\t400006732\t10/7/77\t女\t2010/10/12\t大专\t65646.91\t8\r\n北京\t北京海淀\t649491432\t6/13/89\t男\t2014/7/31\t本科\t65640\t3\r\n辽宁\t辽宁朝阳\t50706662\t11/3/68\t男\t2005/7/1\t大专\t65636.72\t4\r\n四川\t四川泸州\t522278652\t4/7/72\t女\t2013/5/26\t大专\t65636.07\t11\r\n福建\t福建漳州\t324065642\t8/18/81\t女\t2009/8/14\t中专\t65631.73\t9\r\n浙江\t浙江嘉兴\t134275582\t5/16/77\t女\t2007/5/8\t大专\t65621.21\t2\r\n湖北\t湖北荆州\t822633362\t11/5/84\t女\t2015/8/1\t本科\t65619.3\t3\r\n大连\t大连开发区\t5152750632\t9/4/76\t女\t2016/5/30\t初中\t65610\t3\r\n陕西\t陕西安康\t486320682\t5/17/73\t女\t2012/12/1\t高中\t65604.5\t10\r\n吉林\t吉林松原\t864041752\t2/9/72\t女\t2015/8/27\t大专\t65561\t6\r\n广西\t广西百色\t603402752\t7/26/69\t男\t2014/1/1\t本科\t65550.1\t14\r\n湖北\t湖北荆州\t69753832\t8/24/66\t女\t2005/12/20\t中专\t65536.98\t18\r\n四川\t四川绵阳\t5154222872\t1/6/76\t女\t2016/5/30\t大专\t65531\t8\r\n大连\t大连开发区\t23689442\t4/8/61\t女\t2004/11/23\t初中\t65523.43\t4\r\n山东\t山东淄博\t745979772\t7/23/62\t男\t2015/4/15\t本科\t65523\t1\r\n江苏\t江苏无锡\t789850432\t10/26/81\t男\t2015/7/15\t高中\t65520\t8\r\n深圳\t深圳南山\t407325142\t9/7/86\t女\t2010/12/2\t高中\t65520\t2\r\n四川\t四川眉山\t835851322\t12/27/77\t女\t2015/8/7\t中专\t65498\t4\r\n湖北\t湖北随州\t192389192\t7/8/78\t女\t2007/12/10\t高中\t65488.68\t8\r\n浙江\t浙江绍兴\t488487482\t9/26/74\t女\t2012/12/10\t高中\t65476.36\t8\r\n河北\t河北邢台\t423891622\t8/1/67\t男\t2011/5/13\t本科\t65436.5\t7\r\n四川\t四川绵阳\t667026242\t10/27/80\t女\t2014/9/5\t大专\t65433.11\t1\r\n青岛\t青岛城阳\t377418712\t5/20/79\t女\t2010/5/25\t本科\t65406.92\t12\r\n河南\t河南商丘\t214365482\t4/14/71\t女\t2008/4/2\t大专\t65398.89\t14\r\n青岛\t青岛城阳\t641294582\t3/28/87\t女\t2014/6/24\t大专\t65397.03\t10\r\n辽宁\t辽宁盘锦\t777953902\t5/1/73\t女\t2015/6/30\t大专\t65390\t4\r\n安徽\t安徽合肥\t764004052\t11/2/77\t女\t2015/6/12\t高中\t65385.5\t2\r\n深圳\t深圳龙岗\t5097351862\t4/26/96\t女\t2016/3/17\t高中\t65385\t6\r\n四川\t四川高新\t5108264812\t9/4/83\t女\t2016/3/24\t大专\t65382.99\t9\r\n安徽\t安徽合肥\t62495582\t7/4/71\t女\t2005/10/1\t高中\t65377.11\t9\r\n四川\t四川成都\t503889962\t2/26/72\t女\t2013/2/22\t高中\t65373\t4\r\n重庆\t重庆江津\t5158070192\t10/9/77\t女\t2016/6/1\t大专\t65339.2\t19\r\n山西\t山西太原\t5117173372\t7/6/81\t女\t2016/4/6\t大专\t65287.5\t12\r\n四川\t四川绵阳\t299948512\t8/2/82\t女\t2009/5/15\t本科\t65281.26\t19\r\n浙江\t浙江嘉兴\t135625072\t11/8/83\t男\t2007/5/18\t高中\t65271\t7\r\n湖北\t湖北武汉\t20890122\t3/5/61\t女\t2004/10/16\t大专\t65261.65\t23\r\n四川\t四川青羊\t5073909572\t6/10/83\t女\t2016/3/4\t大专\t65212.55\t1\r\n浙江\t浙江温州\t5015840082\t3/27/80\t女\t2015/11/11\t高中\t65143.82\t4\r\n山东\t山东日照\t502323312\t6/18/70\t男\t2013/1/31\t中专\t65141.5\t8\r\n四川\t四川高新\t5165946232\t3/10/84\t女\t2016/6/8\t本科\t65127.7\t15\r\n山东\t山东济宁\t830890642\t3/21/63\t女\t2015/8/5\t高中\t65120\t0\r\n吉林\t吉林长春\t629110822\t1/17/68\t男\t2014/5/19\t大专\t65118.38\t6\r\n福建\t福建泉州\t420529422\t5/11/71\t女\t2011/3/31\t高中\t65115.67\t6\r\n辽宁\t辽宁盘锦\t286255462\t3/19/79\t女\t2009/3/20\t大专\t65115.4\t3\r\n山东\t山东淄博\t675604252\t4/18/70\t女\t2014/10/1\t大专\t65099\t3\r\n浙江\t浙江金华\t871633712\t3/30/79\t男\t2015/9/15\t高中\t65081.8\t3\r\n安徽\t安徽合肥\t61167312\t4/19/66\t女\t2005/10/1\t高中\t65076.55\t11\r\n苏州\t苏州昆山\t5187919952\t1/8/82\t女\t2016/7/8\t硕士\t65027.5\t14\r\n青岛\t青岛一支\t5171937592\t7/3/81\t女\t2016/6/15\t大专\t65023\t6\r\n苏州\t苏州常熟\t284645402\t10/26/72\t女\t2009/3/13\t高中\t65012.49\t3\r\n青岛\t青岛开发区\t184966942\t12/20/70\t女\t2007/11/25\t高中\t64982.54\t10\r\n四川\t四川高新\t838311492\t8/4/83\t女\t2015/8/8\t大专\t64944.21\t25\r\n山东\t山东淄博\t5185786852\t4/16/71\t女\t2016/6/30\t中专\t64913.5\t17\r\n四川\t四川高新\t416880962\t6/24/87\t女\t2011/3/5\t大专\t64908.1\t0\r\n湖北\t湖北荆州\t50632552\t9/2/72\t女\t2005/7/1\t大专\t64905.2\t14\r\n河北\t河北石家庄\t5158032112\t11/10/70\t女\t2016/6/1\t大专\t64895\t6\r\n山东\t山东济南\t330848802\t5/16/81\t女\t2009/9/16\t大专\t64884.7\t10\r\n黑龙江\t黑龙江牡丹江\t477833532\t11/8/72\t女\t2012/9/12\t高中\t64874.61\t6\r\n河南\t河南三门峡\t5207342592\t6/26/65\t女\t2016/8/6\t高中\t64857.8\t15\r\n重庆\t重庆巴南\t5192808932\t1/11/87\t女\t2016/7/26\t本科\t64856\t8\r\n河北\t河北邢台\t5147301392\t8/23/64\t女\t2016/5/26\t高中\t64853.54\t1\r\n黑龙江\t黑龙江牡丹江\t5141433342\t7/17/98\t男\t2016/5/18\t高中\t64849\t14\r\n大连\t大连明锐\t811695252\t4/7/69\t女\t2015/7/29\t高中\t64840\t1\r\n黑龙江\t黑龙江哈尔滨\t153718292\t9/8/78\t女\t2007/7/25\t大专\t64828.93\t2\r\n四川\t四川成都\t52690072\t7/9/70\t女\t2005/7/26\t大专\t64823.58\t7\r\n广东\t广东清远\t636037462\t2/2/71\t女\t2014/6/12\t高中\t64818.9\t21\r\n青岛\t青岛即墨\t292438202\t12/2/75\t女\t2009/4/14\t初中\t64803.2\t13\r\n黑龙江\t黑龙江哈尔滨\t795573432\t10/22/80\t女\t2015/7/20\t本科\t64801.9\t8\r\n河南\t河南郑州\t99037922\t10/28/65\t女\t2006/10/1\t大专\t64782.92\t8\r\n天津\t天津市区二支\t708617052\t3/23/64\t男\t2015/2/9\t中专\t64769\t11\r\n宁波\t宁波宁海\t5167079422\t1/4/71\t女\t2016/6/8\t初中\t64754.5\t9\r\n云南\t云南昆明\t420509602\t1/6/77\t女\t2011/4/1\t高中\t64749.95\t2\r\n山东\t山东淄博\t800489032\t10/30/79\t女\t2015/7/24\t中专\t64745.9\t14\r\n江西\t江西南昌\t428705752\t8/12/83\t女\t2011/6/25\t高中\t64745.15\t5\r\n江苏\t江苏南京\t583309102\t5/29/88\t女\t2013/11/7\t大专\t64742.05\t6\r\n山西\t山西临汾\t370872262\t9/27/60\t女\t2010/4/21\t大专\t64735.24\t5\r\n浙江\t浙江嘉兴\t507551402\t3/19/70\t男\t2013/3/18\t高中\t64730.44\t3\r\n辽宁\t辽宁辽阳\t5200614212\t9/1/80\t女\t2016/8/2\t大专\t64721\t15\r\n广西\t广西南宁\t5039843532\t2/18/76\t男\t2015/11/30\t高中\t64703\t6\r\n山东\t山东济宁\t5208184782\t9/3/74\t男\t2016/8/7\t大专\t64698\t10\r\n黑龙江\t黑龙江哈尔滨\t376230152\t10/25/71\t女\t2010/5/21\t大专\t64696.48\t9\r\n浙江\t浙江杭州\t378179362\t3/18/74\t女\t2010/5/31\t本科\t64659.34\t3\r\n重庆\t重庆永川\t347343272\t1/2/80\t女\t2009/12/2\t高中\t64651.4\t0\r\n湖北\t湖北武汉\t838914982\t8/28/74\t女\t2015/8/8\t高中\t64645\t4\r\n吉林\t吉林通化\t553070362\t12/27/76\t男\t2013/6/26\t大专\t64642.38\t2\r\n北京\t北京平谷\t5142666232\t5/19/87\t女\t2016/5/19\t大专\t64639\t8\r\n浙江\t浙江杭州\t5013853902\t10/28/69\t女\t2015/11/9\t中专\t64635\t4\r\n湖南\t湖南郴州\t5205858582\t10/5/79\t女\t2016/8/5\t本科\t64628.4\t18\r\n云南\t云南昆明\t5176233702\t1/12/88\t女\t2016/6/20\t大专\t64624\t5\r\n宁波\t宁波城区\t385725542\t11/26/81\t女\t2010/7/9\t大专\t64617.26\t2\r\n北京\t北京海淀\t452122392\t7/12/91\t男\t2012/2/3\t大专\t64610\t8\r\n浙江\t浙江金华\t425305312\t1/28/74\t男\t2011/5/26\t高中\t64607.11\t7\r\n湖北\t湖北荆州\t5061651292\t12/12/72\t女\t2016/1/16\t高中\t64605\t11\r\n福建\t福建福州\t5101944372\t11/9/84\t女\t2016/3/21\t大专\t64604.5\t10\r\n四川\t四川高新\t363198652\t2/17/74\t男\t2010/3/10\t大专\t64603.9\t10\r\n四川\t四川成都\t3511072\t5/30/74\t女\t2003/4/8\t中专\t64583.56\t9\r\n广东\t广东韶关\t847324952\t12/9/76\t女\t2015/8/10\t高中\t64564\t17\r\n浙江\t浙江杭州\t498759572\t6/7/76\t女\t2013/1/7\t大专\t64552.49\t5\r\n黑龙江\t黑龙江哈尔滨\t859074932\t12/7/72\t女\t2015/8/13\t大专\t64549.5\t4\r\n山东\t山东威海\t506337852\t9/16/79\t女\t2013/3/12\t大专\t64508.24\t4\r\n四川\t四川绵阳\t158344562\t10/25/77\t女\t2007/8/20\t大专\t64504.13\t7\r\n深圳\t深圳南山\t5233643162\t1/5/95\t男\t2016/9/14\t中专\t64502.7\t3\r\n北京\t北京平谷\t579904192\t9/22/56\t女\t2013/9/30\t大专\t64501.89\t13\r\n青岛\t青岛一支\t640814052\t9/8/87\t女\t2014/6/24\t本科\t64481.05\t9\r\n河南\t河南周口\t73400892\t4/5/78\t女\t2006/1/10\t大专\t64464.8\t13\r\n河南\t河南驻马店\t322620552\t9/1/73\t女\t2009/8/6\t高中\t64436.77\t14\r\n青岛\t青岛即墨\t204877902\t1/29/58\t女\t2008/2/25\t高中\t64430.34\t4\r\n四川\t四川青羊\t682324882\t11/17/88\t女\t2014/11/14\t大专\t64428\t2\r\n广东\t广东东莞\t701609462\t12/4/77\t男\t2014/12/31\t本科\t64425.5\t8\r\n山东\t山东烟台\t5008061042\t8/19/78\t男\t2015/11/2\t本科\t64424\t14\r\n深圳\t深圳福田\t255879112\t1/5/78\t女\t2008/10/8\t本科\t64421.4\t4\r\n湖南\t湖南长沙\t521108512\t7/18/86\t男\t2013/5/20\t本科\t64397.62\t3\r\n北京\t北京东城\t394680942\t7/26/86\t女\t2010/9/7\t大专\t64387.6\t5\r\n四川\t四川青羊\t5184378032\t8/25/76\t女\t2016/6/27\t大专\t64382.5\t9\r\n山东\t山东淄博\t227376462\t5/29/74\t女\t2008/6/1\t大专\t64373.1\t9\r\n浙江\t浙江温州\t546841842\t1/2/84\t女\t2013/6/24\t本科\t64365.72\t5\r\n黑龙江\t黑龙江哈尔滨\t89830462\t5/24/70\t女\t2006/6/30\t大专\t64347.91\t3\r\n江西\t江西抚州\t5189605162\t12/10/72\t女\t2016/7/19\t高中\t64344\t18\r\n宁波\t宁波宁海\t5015709572\t10/4/79\t女\t2015/11/11\t中专\t64338.4\t10\r\n四川\t四川德阳\t728772532\t3/5/86\t男\t2015/3/26\t大专\t64321.22\t6\r\n山东\t山东日照\t287437882\t1/2/66\t男\t2009/3/24\t高中\t64272.97\t8\r\n河北\t河北石家庄\t229074312\t8/15/75\t女\t2008/6/5\t本科\t64267.23\t8\r\n安徽\t安徽合肥\t350944552\t4/23/64\t男\t2009/12/1\t高中\t64250.2\t11\r\n北京\t北京海淀\t648866722\t2/9/90\t男\t2014/7/29\t高中\t64240\t6\r\n湖南\t湖南永州\t5129247622\t5/20/68\t女\t2016/4/27\t高中\t64207\t8\r\n山东\t山东淄博\t422851282\t11/3/76\t女\t2011/5/2\t大专\t64206.41\t14\r\n四川\t四川青羊\t16010392\t11/18/72\t女\t2004/7/19\t本科\t64205.11\t3\r\n四川\t四川青羊\t5194771572\t4/28/93\t女\t2016/7/28\t本科\t64196\t4\r\n辽宁\t辽宁沈阳\t134659812\t2/17/68\t男\t2007/5/10\t本科\t64186.11\t4\r\n江苏\t江苏无锡\t633597112\t12/7/91\t男\t2014/6/6\t大专\t64178.78\t0\r\n湖南\t湖南长沙\t566011972\t10/3/74\t女\t2013/6/29\t高中\t64174\t8\r\n江西\t江西赣州\t5063707332\t8/9/72\t女\t2016/1/29\t大专\t64160\t3\r\n黑龙江\t黑龙江哈尔滨\t19471962\t4/30/76\t女\t2004/10/1\t大专\t64136.65\t10\r\n福建\t福建福州\t5138734582\t7/5/91\t女\t2016/5/13\t大专\t64136\t12\r\n浙江\t浙江温州\t725601262\t9/19/79\t女\t2015/3/25\t大专\t64122\t4\r\n河北\t河北唐山\t261073702\t6/24/73\t女\t2008/11/4\t高中\t64119.73\t18\r\n青岛\t青岛一支\t272590742\t11/3/69\t女\t2008/12/25\t大专\t64093.02\t3\r\n辽宁\t辽宁盘锦\t53557902\t3/27/77\t女\t2005/7/29\t高中\t64071.86\t10\r\n福建\t福建莆田\t542187242\t9/22/72\t女\t2013/6/20\t初中\t64032.81\t3\r\n江苏\t江苏无锡\t5152423352\t2/6/61\t女\t2016/5/30\t高中\t64030\t11\r\n陕西\t陕西渭南\t633787342\t4/16/74\t女\t2014/6/6\t高中\t64014\t1\r\n四川\t四川高新\t735246272\t12/18/75\t女\t2015/4/3\t高中\t63997.5\t10\r\n云南\t云南昆明\t5224702892\t3/17/71\t女\t2016/8/26\t本科\t63980\t7\r\n深圳\t深圳福田\t590569722\t7/10/79\t女\t2013/12/11\t本科\t63944.01\t1\r\n浙江\t浙江嘉兴\t510012272\t3/29/51\t男\t2013/3/25\t初中\t63926.22\t5\r\n深圳\t深圳福田\t390395222\t6/21/79\t女\t2010/8/11\t大专\t63901.42\t5\r\n辽宁\t辽宁沈阳\t5149242292\t12/10/66\t女\t2016/5/27\t大专\t63898.8\t8\r\n江苏\t江苏无锡\t5105871522\t11/30/87\t女\t2016/3/23\t大专\t63881.6\t9\r\n云南\t云南昆明\t5169987622\t5/25/71\t女\t2016/6/14\t本科\t63870\t12\r\n江苏\t江苏常州\t664170532\t10/3/71\t女\t2014/8/29\t高中\t63861\t12\r\n辽宁\t辽宁营口\t5189570752\t12/22/80\t男\t2016/7/19\t本科\t63860\t16\r\n浙江\t浙江嘉兴\t5234732872\t7/3/75\t女\t2016/9/18\t高中\t63850\t3\r\n黑龙江\t黑龙江哈尔滨\t520525812\t4/3/77\t女\t2013/5/15\t本科\t63836\t4\r\n黑龙江\t黑龙江哈尔滨\t5091959742\t10/24/88\t女\t2016/3/14\t高中\t63834\t10\r\n苏州\t苏州新区\t409145252\t3/2/75\t女\t2010/12/15\t大专\t63802\t6\r\n湖北\t湖北宜昌\t5195005452\t8/19/76\t女\t2016/7/28\t中专\t63768.5\t15\r\n北京\t北京东城\t828070802\t8/22/65\t男\t2015/8/4\t大专\t63750\t2\r\n江苏\t江苏扬州\t492286532\t6/18/86\t女\t2012/12/20\t高中\t63740\t7\r\n四川\t四川青羊\t5140668212\t3/19/84\t女\t2016/5/17\t本科\t63732.9\t16\r\n北京\t北京东城\t4058872\t4/23/77\t女\t2003/5/13\t大专\t63728.03\t4\r\n上海\t上海黄浦\t66339712\t6/14/78\t女\t2005/11/24\t本科\t63719.66\t9\r\n四川\t四川高新\t5147149072\t5/8/72\t女\t2016/5/26\t大专\t63712.6\t16\r\n山东\t山东临沂\t5051113672\t4/16/78\t女\t2015/12/23\t中专\t63689.26\t8\r\n深圳\t深圳宝安\t5205412562\t10/10/74\t女\t2016/8/4\t大专\t63685.5\t11\r\n北京\t北京东城\t1196052\t2/25/67\t女\t2002/5/23\t大专\t63682.6\t6\r\n云南\t云南曲靖\t247389862\t4/16/75\t女\t2008/8/24\t大专\t63678.54\t9\r\n福建\t福建福州\t722964812\t1/27/82\t女\t2015/3/25\t高中\t63660.5\t10\r\n四川\t四川高新\t5110542962\t6/3/82\t男\t2016/3/25\t大专\t63660\t18\r\n山西\t山西长治\t375513882\t5/1/57\t女\t2010/5/17\t硕士\t63641\t5\r\n宁波\t宁波城区\t5078148562\t10/4/73\t女\t2016/3/7\t大专\t63631.5\t10\r\n北京\t北京海淀\t803358692\t7/13/87\t女\t2015/7/26\t本科\t63618\t9\r\n山东\t山东济南\t587442832\t10/20/85\t女\t2013/11/30\t大专\t63598.31\t12\r\n内蒙古\t内蒙呼和浩特\t249501672\t1/31/74\t男\t2008/9/1\t大专\t63591.05\t2\r\n浙江\t浙江杭州\t5203516042\t11/9/69\t男\t2016/8/3\t中专\t63590\t12\r\n山东\t山东济南\t356189392\t4/5/68\t女\t2010/1/5\t中专\t63588.25\t13\r\n深圳\t深圳福田第二\t517703602\t2/7/81\t女\t2013/4/26\t大专\t63583.32\t1\r\n陕西\t陕西西安\t395176552\t10/20/73\t女\t2010/9/13\t高中\t63577.44\t0\r\n江苏\t江苏南京\t196020202\t3/23/77\t女\t2008/1/1\t高中\t63520.25\t10\r\n浙江\t浙江杭州\t499735712\t7/11/79\t女\t2013/1/16\t大专\t63519.13\t11\r\n吉林\t吉林吉林\t243595282\t10/27/62\t女\t2008/8/1\t大专\t63517.33\t6\r\n安徽\t安徽芜湖\t5146516322\t6/17/69\t女\t2016/5/25\t高中\t63511\t9\r\n重庆\t重庆永川\t799052452\t6/18/73\t女\t2015/7/22\t高中\t63441.23\t17\r\n江苏\t江苏南京\t445467632\t9/3/81\t女\t2011/11/28\t大专\t63428.22\t7\r\n贵州\t贵州贵阳\t248407042\t8/25/84\t女\t2008/8/26\t本科\t63426.79\t0\r\n河南\t河南郑州\t544648112\t6/3/82\t男\t2013/6/22\t本科\t63420\t8\r\n山东\t山东济南\t651641482\t8/27/72\t男\t2014/8/5\t本科\t63401.11\t8\r\n山东\t山东德州\t535335412\t10/10/76\t女\t2013/6/14\t中专\t63397.44\t10\r\n黑龙江\t黑龙江齐齐哈尔\t718932822\t5/24/83\t女\t2015/3/24\t大专\t63380.56\t10\r\n浙江\t浙江温州\t5190684902\t11/29/82\t女\t2016/7/21\t高中\t63380\t16\r\n青岛\t青岛一支\t784341252\t10/4/86\t女\t2015/7/9\t大专\t63353.3\t8\r\n山东\t山东济南\t183261282\t7/27/77\t女\t2007/11/23\t大专\t63333\t3\r\n上海\t上海陆家嘴\t308592122\t9/2/81\t女\t2009/6/25\t中专\t63331.12\t13\r\n山东\t山东日照\t5160597662\t8/1/76\t男\t2016/6/3\t中专\t63324.2\t12\r\n重庆\t重庆永川\t5201624092\t3/5/93\t女\t2016/8/2\t大专\t63319\t28\r\n湖北\t湖北襄阳\t5122405972\t6/10/73\t女\t2016/4/15\t本科\t63318\t13\r\n江苏\t江苏无锡\t324470392\t4/5/65\t女\t2009/8/18\t高中\t63316.41\t7\r\n辽宁\t辽宁丹东\t432449812\t3/31/57\t男\t2011/8/2\t高中\t63303.96\t15\r\n吉林\t吉林长春\t492352132\t8/11/67\t女\t2012/12/21\t高中\t63295.78\t7\r\n佛山\t佛山顺德龙江\t5206858492\t1/1/85\t女\t2016/8/5\t高中\t63277.7\t13\r\n陕西\t陕西渭南\t5082873452\t2/25/64\t男\t2016/3/9\t高中\t63256.5\t17\r\n辽宁\t辽宁铁岭\t5192788022\t10/26/67\t女\t2016/7/26\t本科\t63254.9\t14\r\n四川\t四川青羊\t700202612\t11/3/82\t女\t2014/12/30\t本科\t63220\t7\r\n甘肃\t甘肃兰州\t611981462\t7/1/90\t男\t2014/3/10\t本科\t63218.81\t29\r\n山东\t山东淄博\t168730402\t2/2/69\t女\t2007/10/9\t初中\t63215\t11\r\n黑龙江\t黑龙江佳木斯\t5149729092\t4/8/70\t女\t2016/5/27\t中专\t63191.5\t3\r\n四川\t四川巴中\t5145594372\t9/5/71\t男\t2016/5/24\t高中\t63182\t11\r\n浙江\t浙江杭州\t574665492\t10/17/87\t女\t2013/8/26\t大专\t63173.71\t4\r\n宁波\t宁波象山\t828197532\t6/21/80\t男\t2015/8/4\t高中\t63161\t4\r\n北京\t北京平谷\t866793622\t8/4/81\t女\t2015/9/6\t本科\t63161\t2\r\n安徽\t安徽滁州\t5156023222\t8/4/71\t女\t2016/5/31\t大专\t63156\t13\r\n广东\t广东湛江\t306742282\t7/11/55\t女\t2009/6/22\t大专\t63155.91\t1\r\n湖北\t湖北荆州\t853406922\t12/19/71\t女\t2015/8/10\t高中\t63151.5\t12\r\n黑龙江\t黑龙江七台河\t5190343082\t1/10/87\t男\t2016/7/20\t大专\t63136\t1\r\n四川\t四川高新\t460012192\t12/8/87\t女\t2012/3/27\t本科\t63133.32\t14\r\n北京\t北京海淀\t437497582\t1/20/88\t男\t2011/9/13\t本科\t63130.65\t7\r\n安徽\t安徽合肥\t864417472\t4/23/86\t女\t2015/8/28\t大专\t63103.7\t7\r\n四川\t四川高新\t5108181382\t1/7/72\t女\t2016/3/24\t大专\t63102.4\t12\r\n广西\t广西南宁\t539523162\t8/2/76\t女\t2013/6/18\t高中\t63094.3\t7\r\n四川\t四川高新\t5142389772\t3/26/83\t女\t2016/5/19\t硕士\t63083.4\t9\r\n重庆\t重庆渝中\t388385852\t5/10/71\t女\t2010/7/29\t大专\t63045.43\t5\r\n宁波\t宁波城区\t363765302\t7/3/71\t女\t2010/3/15\t中专\t63037.17\t2\r\n浙江\t浙江金华\t323293412\t5/23/80\t女\t2009/8/10\t中专\t63020.37\t6\r\n山东\t山东淄博\t105946142\t4/10/67\t女\t2006/12/4\t大专\t63017.77\t9\r\n山东\t山东威海\t92587772\t4/20/76\t女\t2006/8/1\t中专\t63013.4\t9\r\n山西\t山西忻州\t596695102\t10/11/80\t女\t2013/12/24\t高中\t63013.26\t0\r\n山东\t山东滨州\t374875222\t12/2/68\t女\t2010/5/13\t中专\t63009.9\t14\r\n山西\t山西临汾\t694438302\t10/13/87\t女\t2014/12/22\t大专\t63000\t0\r\n河南\t河南周口\t530137052\t2/11/69\t女\t2013/6/8\t高中\t63000\t0\r\n山西\t山西临汾\t871907962\t7/5/77\t男\t2015/9/15\t大专\t63000\t0\r\n辽宁\t辽宁阜新\t48199042\t10/1/70\t女\t2005/6/23\t大专\t62993.07\t4\r\n江苏\t江苏盐城\t16693162\t6/6/67\t女\t2004/7/31\t大专\t62984.98\t10\r\n重庆\t重庆渝中\t5201392982\t4/12/82\t女\t2016/8/2\t大专\t62961.1\t12\r\n江西\t江西抚州\t397204342\t1/4/83\t女\t2010/9/25\t中专\t62954.56\t8\r\n苏州\t苏州张家港\t497352722\t5/4/71\t女\t2012/12/31\t初中\t62946\t4\r\n湖北\t湖北襄阳\t82321822\t10/26/67\t女\t2006/4/22\t高中\t62924.53\t21\r\n四川\t四川成都\t5224289482\t7/2/81\t女\t2016/8/26\t中专\t62919.9\t11\r\n青岛\t青岛一支\t5213555092\t2/16/84\t女\t2016/8/11\t大专\t62899.5\t14\r\n江苏\t江苏徐州\t5071005942\t9/29/83\t女\t2016/3/2\t高中\t62899.5\t4\r\n深圳\t深圳宝安\t508977372\t1/13/80\t男\t2013/3/22\t大专\t62875.31\t5\r\n北京\t北京海淀\t122583662\t10/3/72\t女\t2007/3/13\t大专\t62864.17\t4\r\n湖南\t湖南长沙\t216173312\t1/29/73\t女\t2008/4/14\t高中\t62848.78\t13\r\n四川\t四川青羊\t520282962\t7/8/83\t男\t2013/5/14\t大专\t62837.47\t3\r\n广西\t广西柳州\t5204606652\t7/2/75\t女\t2016/8/3\t高中\t62824\t16\r\n福建\t福建厦门\t339030302\t3/17/78\t女\t2009/10/27\t中专\t62803.3\t21\r\n青岛\t青岛一支\t516797802\t2/27/81\t女\t2013/4/24\t大专\t62787.55\t6\r\n辽宁\t辽宁丹东\t231868192\t5/31/66\t男\t2008/6/18\t本科\t62779.01\t7\r\n安徽\t安徽马鞍山\t689072872\t10/25/73\t女\t2014/12/5\t中专\t62773\t7\r\n广西\t广西南宁\t5210347792\t6/13/82\t女\t2016/8/9\t中专\t62772.7\t11\r\n重庆\t重庆渝中\t541543412\t1/21/88\t男\t2013/6/20\t本科\t62755.93\t12\r\n湖北\t湖北武汉\t788948402\t8/29/70\t男\t2015/7/14\t高中\t62744.2\t13\r\n湖南\t湖南长沙\t456754802\t2/21/63\t女\t2012/3/15\t大专\t62710.5\t7\r\n山东\t山东威海\t414104532\t4/16/74\t女\t2011/1/14\t高中\t62708.85\t8\r\n湖北\t湖北十堰\t5142841192\t1/15/76\t女\t2016/5/19\t高中\t62700\t2\r\n吉林\t吉林长春\t284690482\t11/11/76\t男\t2009/3/13\t大专\t62699.5\t6\r\n山东\t山东济南\t450766762\t8/12/77\t女\t2012/1/4\t本科\t62696\t3\r\n湖北\t湖北襄阳\t5145593472\t1/9/74\t男\t2016/5/24\t高中\t62695.5\t16\r\n江西\t江西赣州\t5151926582\t6/18/83\t女\t2016/5/29\t高中\t62694.8\t6\r\n辽宁\t辽宁沈阳\t5125900672\t3/1/82\t男\t2016/4/21\t本科\t62689\t1\r\n山东\t山东济南\t5205152\t8/16/65\t女\t2003/7/1\t本科\t62664.98\t7\r\n河北\t河北唐山\t254469192\t3/9/71\t女\t2008/9/25\t高中\t62660.11\t11\r\n浙江\t浙江金华\t5067913712\t4/12/72\t男\t2016/2/24\t高中\t62655.6\t8\r\n四川\t四川高新\t491800832\t11/23/70\t女\t2012/12/20\t大专\t62645.3\t10\r\n北京\t北京海淀\t167728302\t10/2/82\t女\t2007/10/1\t本科\t62634.71\t7\r\n山东\t山东淄博\t724831402\t4/4/85\t女\t2015/3/25\t大专\t62631.3\t14\r\n湖南\t湖南长沙\t5152466902\t2/26/92\t女\t2016/5/30\t本科\t62626\t5\r\n福建\t福建福州\t821930772\t6/16/71\t男\t2015/7/31\t高中\t62618\t3\r\n北京\t北京海淀\t511557432\t6/11/90\t男\t2013/4/1\t大专\t62612.15\t0\r\n河南\t河南平顶山\t545987962\t9/2/59\t男\t2013/6/24\t高中\t62594.75\t0\r\n山东\t山东济宁\t5207725122\t12/24/68\t男\t2016/8/6\t大专\t62589.4\t17\r\n湖北\t湖北黄石\t297037812\t9/12/73\t男\t2009/5/4\t大专\t62583.83\t15\r\n深圳\t深圳宝安\t637268732\t6/9/81\t女\t2014/6/16\t高中\t62579.38\t2\r\n内蒙古\t内蒙古通辽\t569503972\t2/23/76\t女\t2013/7/16\t大专\t62578.54\t0\r\n四川\t四川绵阳\t580988912\t7/1/78\t女\t2013/10/16\t大专\t62552.55\t8\r\n北京\t北京平谷\t621671552\t6/15/89\t女\t2014/4/1\t高中\t62548.5\t2\r\n苏州\t苏州太仓\t5223277802\t3/25/86\t女\t2016/8/25\t大专\t62543\t9\r\n广东\t广东广州\t833017802\t10/26/79\t女\t2015/8/6\t大专\t62511.5\t4\r\n江西\t江西新余\t173901132\t11/30/64\t女\t2007/11/1\t高中\t62509.34\t3\r\n山西\t山西临汾\t559117162\t7/29/70\t女\t2013/6/28\t本科\t62489.61\t2\r\n江西\t江西南昌\t727506092\t9/13/87\t女\t2015/3/25\t高中\t62479.9\t27\r\n黑龙江\t黑龙江佳木斯\t5169558842\t7/29/76\t女\t2016/6/13\t中专\t62474.4\t8\r\n四川\t四川青羊\t99322\t8/7/69\t女\t2001/12/30\t大专\t62462.25\t2\r\n贵州\t贵州贵阳\t665939422\t4/23/85\t女\t2014/9/2\t本科\t62461\t17\r\n福建\t福建厦门\t682842682\t8/27/78\t女\t2014/11/17\t中专\t62449\t16\r\n北京\t北京海淀\t648788842\t7/15/91\t男\t2014/7/29\t大专\t62433\t5\r\n广东\t广东珠海\t572478872\t1/11/81\t女\t2013/8/6\t本科\t62432.97\t8\r\n北京\t北京海淀\t556514212\t9/25/87\t女\t2013/6/30\t本科\t62432.8\t5\r\n广东\t广东惠州\t18670702\t12/14/64\t女\t2004/9/10\t大专\t62428.28\t5\r\n山西\t山西太原\t173836232\t8/1/62\t女\t2007/11/1\t大专\t62419.88\t13\r\n河南\t河南南阳\t15769912\t10/15/71\t男\t2004/7/1\t大专\t62356.75\t0\r\n湖北\t湖北黄石\t123065592\t3/8/60\t女\t2007/3/18\t中专\t62316.88\t12\r\n上海\t上海陆家嘴\t250418082\t5/1/73\t男\t2008/9/9\t大专\t62314.11\t12\r\n四川\t四川高新\t5033760642\t6/18/71\t男\t2015/11/27\t大专\t62313.7\t9\r\n四川\t四川高新\t5013833962\t6/7/77\t男\t2015/11/9\t大专\t62288\t4\r\n湖北\t湖北武汉\t5058572702\t1/28/74\t女\t2016/1/8\t大专\t62282\t13\r\n云南\t云南昆明\t5227800522\t3/29/79\t女\t2016/8/31\t中专\t62256.5\t8\r\n佛山\t佛山顺德龙江\t402608982\t5/11/88\t女\t2010/10/29\t中专\t62253.05\t6\r\n甘肃\t甘肃金昌\t408130172\t11/15/68\t女\t2010/12/8\t本科\t62248.65\t6\r\n湖北\t湖北荆州\t47394982\t11/26/75\t女\t2005/6/18\t大专\t62229.55\t14\r\n浙江\t浙江杭州\t5074307542\t1/26/91\t女\t2016/3/4\t本科\t62220\t4\r\n湖南\t湖南株洲\t5146617892\t7/13/79\t男\t2016/5/25\t大专\t62215.5\t6\r\n贵州\t贵州贵阳\t5196496732\t1/20/82\t女\t2016/7/29\t本科\t62212\t11\r\n四川\t四川高新\t5203867832\t6/26/72\t女\t2016/8/3\t大专\t62206\t8\r\n四川\t四川高新\t246149382\t10/17/85\t女\t2008/8/15\t本科\t62202.85\t14\r\n浙江\t浙江湖州\t18811112\t11/7/71\t女\t2004/9/17\t高中\t62177.52\t8\r\n湖北\t湖北武汉\t206603112\t3/14/82\t女\t2008/3/10\t大专\t62177.29\t13\r\n黑龙江\t黑龙江哈尔滨\t505289972\t2/27/74\t女\t2013/3/4\t大专\t62173\t12\r\n山东\t山东烟台\t745057922\t3/3/83\t女\t2015/4/13\t高中\t62163.2\t5\r\n陕西\t陕西安康\t572356612\t6/24/67\t女\t2013/8/6\t高中\t62147.15\t3\r\n陕西\t陕西宝鸡\t5163612832\t6/12/66\t男\t2016/6/6\t高中\t62146.44\t4\r\n河北\t河北保定\t853648102\t8/10/69\t女\t2015/8/10\t高中\t62135.6\t13\r\n河北\t河北石家庄\t681191312\t1/20/77\t女\t2014/11/10\t高中\t62132.5\t12\r\n四川\t四川高新\t5205831372\t10/10/71\t女\t2016/8/5\t高中\t62129\t9\r\n河北\t河北承德\t665352952\t8/25/72\t男\t2014/8/31\t中专\t62128.24\t8\r\n北京\t北京海淀\t281605602\t7/24/86\t女\t2009/3/1\t本科\t62098.94\t4\r\n云南\t云南昆明\t152482552\t12/10/71\t女\t2007/7/24\t中专\t62098.53\t9\r\n湖北\t湖北武汉\t623736882\t1/24/83\t女\t2014/4/17\t大专\t62089.5\t7\r\n湖北\t湖北襄阳\t58648382\t10/14/69\t女\t2005/9/15\t大专\t62073.96\t15\r\n上海\t上海黄浦\t5157854452\t1/12/85\t女\t2016/6/1\t硕士\t62071.5\t13\r\n深圳\t深圳福田第二\t621098762\t1/6/82\t女\t2014/3/31\t本科\t62052.22\t14\r\n四川\t四川高新\t5188908022\t4/11/84\t女\t2016/7/15\t本科\t62047\t19\r\n山东\t山东威海\t16431192\t7/27/74\t女\t2004/7/1\t高中\t62046.39\t9\r\n四川\t四川青羊\t663375412\t7/31/84\t女\t2014/8/27\t硕士\t62039\t3\r\n山东\t山东临沂\t251418782\t12/31/66\t女\t2008/9/12\t高中\t61989.9\t8\r\n河北\t河北石家庄\t668394152\t9/30/71\t男\t2014/9/11\t中专\t61979.6\t12\r\n湖南\t湖南长沙\t390584752\t11/5/73\t女\t2010/8/12\t高中\t61977.71\t10\r\n北京\t北京海淀\t426929052\t7/21/88\t女\t2011/6/15\t大专\t61960\t5\r\n云南\t云南昆明\t317680392\t5/11/77\t女\t2009/7/24\t大专\t61954.5\t7\r\n贵州\t贵州黔南\t5155561832\t5/4/83\t女\t2016/5/31\t中专\t61953.2\t20\r\n山东\t山东潍坊\t5214739032\t4/10/65\t男\t2016/8/12\t高中\t61947\t16\r\n广西\t广西南宁\t5205225832\t6/15/71\t女\t2016/8/4\t本科\t61909.1\t23\r\n山东\t山东临沂\t271364912\t10/14/78\t女\t2008/12/21\t大专\t61882.9\t5\r\n湖北\t湖北武汉\t678175102\t8/8/83\t女\t2014/10/23\t本科\t61881.7\t11\r\n大连\t大连海川\t554165692\t10/30/79\t男\t2013/6/26\t中专\t61880.66\t0\r\n青岛\t青岛一支\t5150355542\t3/26/70\t女\t2016/5/27\t本科\t61872\t11\r\n广东\t广东惠州\t533285432\t10/29/77\t女\t2013/6/13\t大专\t61860.23\t0\r\n湖南\t湖南常德\t558725392\t12/28/67\t女\t2013/6/28\t高中\t61851.22\t0\r\n苏州\t苏州新区\t254813782\t2/9/84\t女\t2008/10/1\t中专\t61849\t13\r\n江西\t江西景德镇\t400260192\t11/21/75\t女\t2010/10/12\t大专\t61848.74\t12\r\n山东\t山东淄博\t695150102\t9/2/73\t男\t2014/12/22\t高中\t61844.2\t10\r\n江西\t江西南昌\t871316752\t4/5/88\t女\t2015/9/14\t高中\t61826\t14\r\n辽宁\t辽宁阜新\t113180802\t3/11/63\t女\t2007/1/4\t高中\t61821.14\t6\r\n山东\t山东威海\t293613782\t5/23/79\t女\t2009/4/20\t大专\t61816.18\t6\r\n山西\t山西临汾\t5199941582\t11/4/70\t女\t2016/8/1\t高中\t61815.1\t15\r\n河南\t河南三门峡\t95574952\t2/22/69\t女\t2006/9/1\t本科\t61812.22\t0\r\n河南\t河南商丘\t406004682\t5/22/74\t女\t2010/11/25\t高中\t61808.7\t5\r\n云南\t云南昆明\t503586682\t1/22/78\t女\t2013/2/18\t大专\t61802.02\t6\r\n广东\t广东广州\t5104405652\t1/20/73\t女\t2016/3/22\t高中\t61793\t5\r\n四川\t四川青羊\t609117242\t1/21/72\t女\t2014/2/12\t大专\t61786.25\t8\r\n辽宁\t辽宁沈阳\t694867612\t7/17/85\t男\t2014/12/22\t大专\t61783.2\t16\r\n河北\t河北唐山\t189668722\t5/1/75\t女\t2007/12/13\t高中\t61772.76\t7\r\n云南\t云南昆明\t437171412\t10/3/80\t女\t2011/9/9\t中专\t61770.38\t4\r\n湖南\t湖南长沙\t731992652\t4/18/79\t女\t2015/3/31\t本科\t61762.5\t11\r\n湖南\t湖南郴州\t5185012652\t10/9/65\t女\t2016/6/29\t高中\t61762\t7\r\n河南\t河南商丘\t483064692\t3/4/67\t女\t2012/11/14\t高中\t61756.92\t9\r\n山东\t山东临沂\t5221029562\t3/11/87\t女\t2016/8/22\t中专\t61733\t7\r\n山东\t山东菏泽\t536942402\t12/2/72\t女\t2013/6/15\t中专\t61730.75\t11\r\n四川\t四川青羊\t592554802\t1/27/88\t男\t2013/12/17\t硕士\t61727\t3\r\n安徽\t安徽宿州\t477439392\t10/2/61\t女\t2012/9/7\t大专\t61715.7\t16\r\n江苏\t江苏南京\t774842092\t3/12/84\t女\t2015/6/26\t大专\t61697.7\t6\r\n黑龙江\t黑龙江佳木斯\t132804532\t10/13/62\t女\t2007/4/25\t本科\t61675\t2\r\n青岛\t青岛一支\t616276122\t4/12/81\t女\t2014/3/21\t本科\t61674\t12\r\n湖北\t湖北荆门\t838016722\t10/28/66\t女\t2015/8/8\t高中\t61670.5\t6\r\n四川\t四川青羊\t575698022\t3/23/82\t女\t2013/8/30\t大专\t61670.05\t7\r\n四川\t四川高新\t737974552\t8/21/86\t女\t2015/4/8\t本科\t61640.1\t9\r\n浙江\t浙江杭州\t585867942\t11/20/82\t男\t2013/11/25\t高中\t61630.76\t3\r\n陕西\t陕西西安\t516469262\t10/11/68\t男\t2013/4/24\t大专\t61622.91\t4\r\n福建\t福建福州\t269085762\t10/30/87\t女\t2008/12/9\t高中\t61598.99\t7\r\n四川\t四川德阳\t582231492\t9/27/90\t女\t2013/10/28\t高中\t61595.81\t15\r\n湖北\t湖北黄冈\t5021515032\t11/10/73\t女\t2015/11/18\t中专\t61595.7\t7\r\n河北\t河北承德\t5157378522\t5/6/63\t女\t2016/6/1\t高中\t61595\t5\r\n深圳\t深圳南山\t824944612\t3/2/92\t男\t2015/8/3\t本科\t61578\t7\r\n湖北\t湖北十堰\t810007312\t2/1/80\t女\t2015/7/28\t高中\t61573.8\t3\r\n安徽\t安徽阜阳\t682186572\t9/16/81\t女\t2014/11/13\t高中\t61568.4\t7\r\n山东\t山东滨州\t446478942\t3/27/83\t女\t2011/12/8\t中专\t61565.05\t4\r\n江西\t江西新余\t5084925892\t1/8/79\t女\t2016/3/10\t高中\t61549.3\t1\r\n黑龙江\t黑龙江哈尔滨\t32702902\t11/18/74\t男\t2005/3/1\t大专\t61526.18\t7\r\n浙江\t浙江杭州\t5150242202\t9/9/71\t女\t2016/5/27\t大专\t61508.35\t9\r\n江西\t江西南昌\t44666702\t10/10/63\t女\t2005/5/27\t高中\t61501.96\t5\r\n四川\t四川绵阳\t350972882\t10/20/81\t女\t2009/12/21\t大专\t61491.13\t7\r\n山东\t山东临沂\t274424532\t6/6/69\t女\t2009/1/1\t中专\t61455.25\t9\r\n湖北\t湖北武汉\t613374632\t11/7/86\t女\t2014/3/13\t高中\t61439.2\t17\r\n四川\t四川高新\t673681972\t11/11/83\t女\t2014/9/25\t大专\t61433.1\t8\r\n浙江\t浙江杭州\t5175351632\t6/26/78\t女\t2016/6/19\t大专\t61423.5\t12\r\n青岛\t青岛一支\t862526322\t12/19/80\t女\t2015/8/24\t本科\t61416\t1\r\n广东\t广东广州\t5173493192\t5/13/80\t男\t2016/6/16\t高中\t61412\t9\r\n河南\t河南郑州\t690662142\t2/18/93\t男\t2014/12/13\t本科\t61396\t11\r\n江西\t江西南昌\t5193607572\t9/20/64\t男\t2016/7/27\t高中\t61382.2\t11\r\n江苏\t江苏南京\t602170782\t10/19/80\t女\t2013/12/31\t大专\t61378.5\t8\r\n河南\t河南三门峡\t41772752\t8/22/72\t女\t2005/5/1\t大专\t61376.65\t10\r\n福建\t福建福州\t5116731922\t11/20/74\t女\t2016/4/5\t本科\t61349\t10\r\n四川\t四川高新\t347622962\t1/3/75\t女\t2009/12/4\t大专\t61305.77\t11\r\n山东\t山东淄博\t866125232\t10/9/85\t男\t2015/9/2\t高中\t61301.4\t18\r\n河北\t河北石家庄\t609362462\t4/16/75\t女\t2014/2/18\t大专\t61299.02\t7\r\n广西\t广西梧州\t5118258512\t6/8/77\t女\t2016/4/8\t高中\t61280.5\t24\r\n天津\t天津市区二支\t504543702\t8/1/74\t男\t2013/2/26\t本科\t61278.05\t2\r\n江苏\t江苏镇江\t496888242\t10/17/63\t女\t2012/12/31\t本科\t61269.47\t3\r\n浙江\t浙江嘉兴\t422928462\t1/10/89\t女\t2011/5/3\t大专\t61260.64\t10\r\n河南\t河南郑州\t808903742\t11/2/75\t女\t2015/7/28\t高中\t61252\t12\r\n内蒙古\t内蒙呼和浩特\t249499302\t6/9/69\t女\t2008/9/1\t高中\t61248.56\t4\r\n广西\t广西南宁\t230444592\t4/25/77\t女\t2008/6/11\t本科\t61241.08\t10\r\n云南\t云南昆明\t691712392\t7/8/72\t女\t2014/12/17\t大专\t61233.5\t11\r\n北京\t北京海淀\t529890432\t8/28/88\t男\t2013/6/8\t本科\t61230.82\t0\r\n青岛\t青岛一支\t32453912\t10/17/78\t女\t2005/2/28\t大专\t61219.7\t10\r\n四川\t四川青羊\t380744072\t5/2/76\t男\t2010/6/18\t大专\t61216.52\t10\r\n河北\t河北石家庄\t9282222\t6/2/76\t女\t2003/12/1\t大专\t61214.81\t9\r\n山东\t山东威海\t327440822\t9/12/78\t女\t2009/8/28\t大专\t61194.81\t11\r\n辽宁\t辽宁沈阳\t5136281472\t11/8/78\t女\t2016/5/10\t硕士\t61189.89\t10\r\n江苏\t江苏泰州\t5190308672\t12/25/77\t男\t2016/7/20\t高中\t61184.2\t16\r\n上海\t上海陆家嘴\t363805912\t4/11/79\t男\t2010/3/15\t大专\t61182.29\t5\r\n黑龙江\t黑龙江哈尔滨\t226239122\t7/15/77\t女\t2008/5/24\t大专\t61162.6\t9\r\n深圳\t深圳福田\t5030302152\t2/11/87\t女\t2015/11/25\t大专\t61160\t5\r\n河南\t河南南阳\t462325812\t11/2/78\t女\t2012/4/19\t本科\t61145.66\t7\r\n山西\t山西朔州\t5152933762\t9/8/72\t男\t2016/5/30\t高中\t61144.7\t3\r\n天津\t天津市区二支\t649632812\t7/27/74\t女\t2014/7/31\t高中\t61137.52\t5\r\n江苏\t江苏宿迁\t521843202\t3/10/80\t女\t2013/5/22\t高中\t61134.63\t7\r\n河北\t河北保定\t157810712\t12/11/64\t女\t2007/8/16\t高中\t61134\t3\r\n广西\t广西桂林\t433908582\t10/2/79\t男\t2011/8/11\t大专\t61120.83\t10\r\n四川\t四川青羊\t659625212\t2/3/70\t女\t2014/8/21\t本科\t61111.94\t3\r\n四川\t四川高新\t277266562\t2/5/79\t女\t2009/1/17\t本科\t61096.6\t3\r\n新疆\t新疆昌吉\t297484572\t5/11/68\t女\t2009/5/5\t大专\t61095.54\t12\r\n四川\t四川高新\t5041134442\t3/15/72\t女\t2015/12/3\t大专\t61079.5\t10\r\n浙江\t浙江杭州\t289933922\t4/8/73\t男\t2009/3/30\t高中\t61054\t3\r\n河北\t河北石家庄\t451818412\t8/28/69\t男\t2012/1/1\t中专\t61053.71\t2\r\n江西\t江西南昌\t5148950392\t12/24/81\t女\t2016/5/26\t高中\t61050\t12\r\n深圳\t深圳宝安\t15259652\t4/15/71\t女\t2004/6/30\t高中\t61046.53\t2\r\n青岛\t青岛开发区\t564412522\t11/20/79\t女\t2013/6/29\t中专\t61034.95\t15\r\n大连\t大连海川\t75955692\t3/28/63\t女\t2006/2/24\t大专\t61021.82\t7\r\n福建\t福建泉州\t5146283342\t6/10/66\t女\t2016/5/25\t高中\t61001\t9\r\n湖北\t湖北黄石\t654010792\t10/13/70\t女\t2014/8/9\t高中\t60981.75\t9\r\n安徽\t安徽芜湖\t5027201822\t12/24/76\t女\t2015/11/23\t高中\t60976.76\t6\r\n重庆\t重庆永川\t5203159822\t10/29/82\t女\t2016/8/2\t本科\t60964.6\t13\r\n山东\t山东淄博\t415713892\t3/21/71\t女\t2011/2/17\t大专\t60964.54\t8\r\n湖南\t湖南长沙\t141245902\t10/2/61\t女\t2007/7/1\t高中\t60959.92\t3\r\n山东\t山东烟台\t5134752112\t12/7/81\t女\t2016/5/6\t本科\t60937.6\t15\r\n上海\t上海黄浦\t5096695502\t8/24/72\t女\t2016/3/16\t中专\t60915\t5\r\n广东\t广东广州\t5049827262\t1/15/69\t女\t2015/12/22\t高中\t60910\t6\r\n黑龙江\t黑龙江牡丹江\t500572842\t5/13/76\t女\t2013/1/23\t高中\t60905.97\t3\r\n深圳\t深圳福田\t5031878662\t6/14/72\t女\t2015/11/26\t大专\t60881\t11\r\n湖北\t湖北襄阳\t207828242\t4/26/82\t男\t2008/3/18\t高中\t60861.5\t17\r\n黑龙江\t黑龙江哈尔滨\t5066885692\t2/26/88\t男\t2016/2/19\t中专\t60857\t5\r\n山西\t山西太原\t155254242\t3/12/68\t女\t2007/8/1\t高中\t60839.85\t13\r\n广东\t广东江门\t5182029192\t12/1/66\t男\t2016/6/24\t高中\t60816\t4\r\n山东\t山东日照\t72119102\t4/7/73\t女\t2005/12/31\t高中\t60815.19\t2\r\n黑龙江\t黑龙江牡丹江\t817986572\t5/20/77\t女\t2015/7/31\t大专\t60814\t4\r\n甘肃\t甘肃武威\t736267492\t1/12/87\t女\t2015/4/7\t中专\t60810.2\t4\r\n青岛\t青岛一支\t5021683692\t10/28/81\t女\t2015/11/18\t大专\t60799\t20\r\n北京\t北京东城\t93290362\t11/21/76\t女\t2006/8/11\t大专\t60798.24\t12\r\n江西\t江西南昌\t5194422552\t2/27/70\t男\t2016/7/28\t高中\t60762.5\t10\r\n内蒙古\t内蒙古通辽\t569478712\t5/18/67\t女\t2013/7/16\t中专\t60738.57\t1\r\n陕西\t陕西西安\t705657502\t8/28/74\t女\t2015/1/22\t本科\t60738.5\t2\r\n山东\t山东德州\t343891882\t6/25/72\t女\t2009/11/19\t本科\t60702.35\t6\r\n贵州\t贵州贵阳\t622223822\t3/9/76\t女\t2014/4/4\t本科\t60689.7\t10\r\n湖北\t湖北恩施\t5217141392\t10/5/67\t女\t2016/8/16\t高中\t60687.6\t13\r\n安徽\t安徽宿州\t379153132\t1/1/64\t女\t2010/6/1\t本科\t60681.14\t10\r\n四川\t四川青羊\t211214032\t10/14/83\t女\t2008/3/25\t大专\t60678.36\t6\r\n湖南\t湖南长沙\t433163982\t9/5/73\t女\t2011/8/8\t大专\t60673.46\t5\r\n山东\t山东威海\t385862182\t3/3/82\t女\t2010/7/12\t中专\t60672.73\t17\r\n广西\t广西梧州\t353449802\t4/24/68\t女\t2009/12/30\t中专\t60660.41\t13\r\n北京\t北京平谷\t550754642\t10/16/67\t女\t2013/6/30\t高中\t60658.24\t15\r\n四川\t四川高新\t380627252\t10/15/87\t女\t2010/6/17\t高中\t60644\t21\r\n广东\t广东广州\t353606262\t7/22/66\t女\t2009/12/30\t中专\t60639.75\t12\r\n青岛\t青岛一支\t326216392\t7/14/71\t女\t2009/8/25\t大专\t60629.84\t15\r\n广西\t广西玉林\t408047822\t12/22/77\t女\t2010/12/8\t高中\t60624.64\t8\r\n四川\t四川青羊\t250446412\t2/3/64\t女\t2008/9/9\t高中\t60620.2\t5\r\n福建\t福建福州\t5225005662\t5/13/94\t女\t2016/8/29\t高中\t60608.6\t2\r\n河南\t河南周口\t40527802\t9/11/71\t女\t2005/4/28\t高中\t60600\t3\r\n山东\t山东日照\t468732282\t6/16/78\t男\t2012/6/20\t大专\t60599.1\t9\r\n云南\t云南昆明\t168535702\t11/11/73\t女\t2007/10/8\t中专\t60593.52\t2\r\n湖北\t湖北武汉\t168057542\t1/1/79\t男\t2007/10/6\t大专\t60572.36\t6\r\n河南\t河南郑州\t5161194132\t9/20/68\t女\t2016/6/3\t大专\t60557.83\t16\r\n广东\t广东惠州\t471679822\t12/1/88\t女\t2012/7/4\t大专\t60546.3\t9\r\n山东\t山东淄博\t551595542\t10/9/79\t女\t2013/6/25\t高中\t60530\t7\r\n苏州\t苏州新区\t5124784722\t4/18/78\t女\t2016/4/19\t本科\t60524.88\t4\r\n河南\t河南郑州\t649928282\t8/10/63\t女\t2014/7/31\t本科\t60513.6\t10\r\n浙江\t浙江金华\t5028753822\t2/18/78\t女\t2015/11/24\t大专\t60502.5\t8\r\n辽宁\t辽宁沈阳\t829641922\t9/26/65\t女\t2015/8/5\t大专\t60500.51\t1\r\n黑龙江\t黑龙江哈尔滨\t627668802\t2/14/72\t男\t2014/5/9\t本科\t60475.84\t5\r\n北京\t北京海淀\t213474062\t11/1/81\t男\t2008/4/1\t高中\t60468.41\t5\r\n云南\t云南昆明\t5103979572\t11/17/72\t男\t2016/3/22\t本科\t60457.5\t7\r\n苏州\t苏州吴江\t5048870902\t10/7/73\t女\t2015/12/21\t高中\t60444.37\t3\r\n四川\t四川青羊\t21091932\t3/21/73\t男\t2004/10/19\t高中\t60423.99\t10\r\n浙江\t浙江温州\t691144072\t11/27/72\t女\t2014/12/16\t大专\t60419.5\t12\r\n浙江\t浙江杭州\t335096982\t5/18/74\t女\t2009/9/30\t中专\t60414.93\t5\r\n广东\t广东广州\t5783628662\t6/5/84\t女\t2018/6/25\t大专\t60389.05\t3\r\n深圳\t深圳罗湖\t385247382\t8/26/67\t女\t2010/7/5\t本科\t60378.35\t4\r\n四川\t四川雅安\t689364572\t1/18/95\t女\t2014/12/8\t高中\t60374.85\t5\r\n苏州\t苏州姑苏\t575203112\t6/13/82\t女\t2013/8/29\t大专\t60366.64\t6\r\n河北\t河北唐山\t633271912\t5/28/78\t女\t2014/6/5\t大专\t60346.34\t14\r\n海南\t海南海口\t464620042\t10/11/79\t女\t2012/5/14\t大专\t60345.88\t10\r\n山东\t山东淄博\t5156955142\t6/8/88\t女\t2016/6/1\t本科\t60333\t5\r\n重庆\t重庆巴南\t258975572\t3/1/66\t女\t2008/10/24\t大专\t60314.9\t8\r\n安徽\t安徽合肥\t244249022\t1/1/62\t女\t2008/8/1\t高中\t60304.57\t11\r\n广西\t广西北海\t539101662\t7/7/81\t女\t2013/6/18\t中专\t60293.05\t3\r\n云南\t云南昆明\t394157702\t8/15/77\t女\t2010/9/2\t本科\t60287.89\t5\r\n四川\t四川高新\t407844612\t2/11/81\t女\t2010/12/7\t高中\t60263\t11\r\n广西\t广西南宁\t441638852\t6/5/84\t男\t2011/10/10\t大专\t60252.26\t5\r\n青岛\t青岛一支\t480833692\t4/15/79\t女\t2012/10/22\t大专\t60246.68\t8\r\n四川\t四川成都\t228265512\t10/21/66\t女\t2008/6/3\t高中\t60235.87\t16\r\n湖北\t湖北襄阳\t284506392\t3/20/72\t女\t2009/3/12\t大专\t60234.44\t10\r\n辽宁\t辽宁丹东\t372355592\t6/28/78\t女\t2010/4/28\t大专\t60231.11\t9\r\n浙江\t浙江温州\t20365482\t2/14/75\t女\t2004/9/30\t大专\t60227.58\t4\r\n浙江\t浙江金华\t5015136642\t4/30/74\t男\t2015/11/10\t高中\t60218.5\t10\r\n辽宁\t辽宁营口\t198206122\t6/26/69\t女\t2008/1/4\t大专\t60214\t16\r\n山西\t山西临汾\t5189845412\t5/10/76\t女\t2016/7/19\t高中\t60207.1\t9\r\n青岛\t青岛一支\t5218750512\t12/13/78\t女\t2016/8/18\t大专\t60205.9\t12\r\n山东\t山东泰安\t5168372132\t8/29/78\t女\t2016/6/12\t大专\t60190.65\t6\r\n苏州\t苏州新区\t5028979532\t9/16/67\t女\t2015/11/24\t高中\t60184\t7\r\n福建\t福建福州\t304677922\t12/23/81\t女\t2009/6/1\t本科\t60175.47\t8\r\n湖北\t湖北荆州\t5062975782\t3/17/87\t女\t2016/1/25\t高中\t60174.2\t10\r\n北京\t北京海淀\t311460112\t7/29/86\t男\t2009/7/1\t本科\t60171.02\t7\r\n陕西\t陕西西安\t5194133352\t9/11/82\t女\t2016/7/27\t本科\t60163.3\t14\r\n福建\t福建福州\t765512642\t7/14/79\t女\t2015/6/17\t高中\t60131.2\t19\r\n四川\t四川高新\t5170290392\t7/30/85\t男\t2016/6/14\t大专\t60130\t14\r\n福建\t福建三明\t731692442\t12/12/64\t女\t2015/3/31\t高中\t60130\t1\r\n四川\t四川高新\t5084851532\t2/7/79\t女\t2016/3/10\t高中\t60127\t9\r\n江苏\t江苏徐州\t787780632\t11/6/69\t女\t2015/7/13\t大专\t60115.5\t3\r\n四川\t四川高新\t457888102\t2/6/88\t女\t2012/3/21\t本科\t60114.17\t8\r\n江西\t江西南昌\t5150901262\t6/9/91\t女\t2016/5/27\t高中\t60104.4\t11\r\n四川\t四川高新\t5132683402\t9/10/80\t女\t2016/5/4\t本科\t60100\t3\r\n重庆\t重庆渝中\t163306912\t2/24/68\t女\t2007/9/17\t大专\t60077.37\t10\r\n山东\t山东滨州\t454648162\t10/15/75\t女\t2012/3/6\t中专\t60076.78\t7\r\n大连\t大连海川\t701136742\t3/3/75\t女\t2014/12/31\t本科\t60075.5\t9\r\n广西\t广西南宁\t346091482\t12/3/73\t女\t2009/11/26\t本科\t60072.7\t0\r\n青岛\t青岛一支\t5015907172\t9/12/76\t女\t2015/11/11\t大专\t60071\t8\r\n重庆\t重庆永川\t704066562\t11/8/71\t女\t2015/1/13\t高中\t60066.5\t13\r\n福建\t福建龙岩\t257653442\t9/25/71\t女\t2008/10/20\t大专\t60064.07\t1\r\n湖北\t湖北武汉\t582237632\t6/21/86\t女\t2013/10/28\t高中\t60035\t14\r\n宁波\t宁波宁海\t5193725412\t7/26/87\t女\t2016/7/27\t高中\t60032.5\t9\r\n福建\t福建福州\t429619092\t5/5/79\t女\t2011/6/29\t中专\t60022.5\t14\r\n四川\t四川青羊\t582251312\t9/12/71\t女\t2013/10/29\t大专\t60012.36\t5\r\n山西\t山西长治\t325429782\t5/26/75\t女\t2009/8/24\t本科\t60011.44\t2\r\n四川\t四川高新\t513561632\t12/10/75\t男\t2013/4/2\t大专\t60004.15\t6\r\n黑龙江\t黑龙江佳木斯\t5104468172\t10/24/84\t男\t2016/3/22\t大专\t60000\t0\r\n佛山\t佛山禅城\t648554232\t1/16/70\t女\t2014/7/29\t高中\t60000\t0\r\n云南\t云南昆明\t5075497852\t8/1/76\t男\t2016/3/4\t中技\t60000\t0\r\n黑龙江\t黑龙江黑河\t484472242\t4/11/81\t女\t2012/11/22\t高中\t60000\t0\r\n广东\t广东中山\t522535182\t6/16/81\t女\t2013/5/24\t大专\t60000\t0\r\n四川\t四川高新\t752059372\t11/24/70\t男\t2015/5/5\t大专\t60000\t0\r\n湖北\t湖北十堰\t577259232\t10/12/85\t女\t2013/9/7\t大专\t60000\t0\r\n广东\t广东惠州\t452448562\t9/7/72\t女\t2012/2/14\t高中\t60000\t0\r\n黑龙江\t黑龙江伊春\t875374702\t11/24/83\t女\t2015/9/21\t本科\t60000\t0\r\n山东\t山东济南\t603606662\t5/15/69\t女\t2014/1/1\t中专\t60000\t0\r\n黑龙江\t黑龙江哈尔滨\t729159832\t3/25/75\t男\t2015/3/27\t大专\t60000\t0\r\n大连\t大连银洲\t5048094902\t6/11/78\t女\t2015/12/18\t中专\t60000\t0\r\n河北\t河北沧州\t328308382\t8/23/64\t女\t2009/8/31\t高中\t59972.6\t17\r\n四川\t四川高新\t5033391682\t9/12/85\t男\t2015/11/27\t大专\t59969\t5\r\n宁波\t宁波宁海\t813247252\t8/19/76\t女\t2015/7/30\t高中\t59968\t9\r\n山东\t山东日照\t286044712\t10/17/84\t女\t2009/3/19\t中专\t59958.65\t3\r\n四川\t四川高新\t427694442\t4/10/71\t女\t2011/6/22\t中专\t59949\t3\r\n浙江\t浙江温州\t873215442\t9/1/77\t男\t2015/9/17\t高中\t59945\t4\r\n浙江\t浙江温州\t82040732\t6/12/81\t女\t2006/4/19\t大专\t59940.74\t3\r\n河南\t河南郑州\t868281422\t5/14/72\t女\t2015/9/8\t大专\t59917.12\t17\r\n山东\t山东淄博\t716654372\t9/26/86\t男\t2015/3/23\t本科\t59906\t19\r\n广东\t广东惠州\t7351432\t12/8/80\t女\t2003/8/31\t中专\t59895.15\t9\r\n黑龙江\t黑龙江哈尔滨\t96603712\t6/7/72\t女\t2006/9/8\t本科\t59887.72\t0\r\n四川\t四川高新\t132314092\t6/21/82\t女\t2007/4/25\t中专\t59881.58\t18\r\n四川\t四川高新\t745049412\t4/19/79\t女\t2015/4/13\t本科\t59869.83\t10\r\n湖北\t湖北荆门\t5146129222\t10/31/59\t女\t2016/5/25\t大专\t59850\t10\r\n湖北\t湖北武汉\t5015122102\t5/12/79\t女\t2015/11/10\t大专\t59847.8\t7\r\n甘肃\t甘肃酒泉\t426598412\t11/1/67\t女\t2011/6/10\t高中\t59846.87\t1\r\n湖北\t湖北十堰\t5197980742\t7/2/62\t男\t2016/8/1\t高中\t59846.5\t8\r\n宁波\t宁波宁海\t520111852\t2/17/68\t女\t2013/5/13\t高中\t59841\t7\r\n黑龙江\t黑龙江哈尔滨\t317251082\t9/27/63\t女\t2009/7/24\t大专\t59831.05\t10\r\n浙江\t浙江湖州\t106065332\t2/19/77\t女\t2006/12/4\t大专\t59830.34\t6\r\n重庆\t重庆渝中\t676596442\t2/15/91\t女\t2014/10/10\t大专\t59829\t10\r\n贵州\t贵州遵义\t5158659462\t4/25/84\t女\t2016/6/1\t高中\t59827.4\t17\r\n黑龙江\t黑龙江牡丹江\t143438662\t7/12/70\t女\t2007/6/24\t大专\t59800.9\t2\r\n云南\t云南昆明\t441095792\t7/3/70\t女\t2011/10/8\t高中\t59800.13\t3\r\n山东\t山东烟台\t408803032\t6/30/79\t女\t2010/12/13\t初中\t59799\t6\r\n大连\t大连海川\t482248082\t1/2/79\t女\t2012/11/5\t本科\t59790\t3\r\n山东\t山东济南\t653623492\t9/10/86\t女\t2014/8/8\t本科\t59789.66\t4\r\n陕西\t陕西西安\t5036105882\t6/16/80\t女\t2015/11/30\t中专\t59788.7\t12\r\n山东\t山东威海\t728557042\t10/18/83\t男\t2015/3/26\t中专\t59783\t5\r\n河南\t河南焦作\t397762752\t12/27/64\t女\t2010/9/25\t高中\t59749.81\t4\r\n青岛\t青岛一支\t404466362\t7/20/81\t女\t2010/11/16\t本科\t59746.46\t17\r\n重庆\t重庆巴南\t5193249482\t9/18/87\t男\t2016/7/26\t大专\t59728\t7\r\n云南\t云南昆明\t528145132\t10/7/76\t女\t2013/6/5\t中技\t59727.12\t7\r\n宁波\t宁波宁海\t620669452\t10/30/72\t女\t2014/3/31\t高中\t59702.57\t5\r\n山东\t山东烟台\t546677572\t3/1/65\t女\t2013/6/24\t初中\t59700.1\t4\r\n广西\t广西南宁\t484221852\t12/29/74\t女\t2012/11/22\t大专\t59695.64\t3\r\n辽宁\t辽宁沈阳\t5143799422\t7/26/79\t女\t2016/5/21\t中专\t59694.69\t9\r\n青岛\t青岛一支\t5014771282\t8/29/54\t男\t2015/11/10\t本科\t59688\t1\r\n四川\t四川高新\t5222470022\t3/24/91\t男\t2016/8/24\t本科\t59686\t7\r\n江苏\t江苏无锡\t323692022\t9/20/67\t女\t2009/8/12\t高中\t59685.92\t5\r\n湖南\t湖南永州\t5113097572\t1/30/93\t男\t2016/3/28\t高中\t59674.16\t13\r\n江西\t江西鹰潭\t676665112\t1/4/76\t女\t2014/10/10\t高中\t59670.22\t11\r\n青岛\t青岛即墨\t370467512\t4/24/69\t女\t2010/4/19\t高中\t59649.72\t5\r\n广西\t广西南宁\t577262302\t11/26/78\t女\t2013/9/7\t大专\t59635.54\t13\r\n山东\t山东日照\t441593772\t8/25/77\t女\t2011/10/10\t中专\t59596.91\t11\r\n重庆\t重庆永川\t5203393702\t12/3/73\t男\t2016/8/3\t高中\t59582.5\t16\r\n重庆\t重庆渝中\t5128760822\t4/22/82\t男\t2016/4/26\t本科\t59549.5\t5\r\n山东\t山东济宁\t5211319592\t4/15/73\t女\t2016/8/9\t高中\t59548\t14\r\n青岛\t青岛开发区\t186069812\t8/24/69\t男\t2007/12/1\t大专\t59541.16\t6\r\n山西\t山西临汾\t5034256512\t1/2/75\t男\t2015/11/27\t中专\t59540\t4\r\n北京\t北京海淀\t475168752\t8/14/91\t男\t2012/9/1\t大专\t59528.2\t2\r\n河南\t河南周口\t102876612\t12/15/70\t女\t2006/11/7\t大专\t59492.65\t7\r\n四川\t四川绵阳\t448342462\t2/22/81\t女\t2011/12/23\t大专\t59482.93\t3\r\n北京\t北京海淀\t221560232\t11/22/85\t女\t2008/6/1\t本科\t59481.53\t9\r\n广东\t广东广州\t5088840302\t4/1/83\t女\t2016/3/11\t高中\t59474.3\t11\r\n山东\t山东威海\t413769152\t9/15/71\t女\t2011/1/10\t高中\t59468.95\t10\r\n贵州\t贵州贵阳\t334767742\t5/7/89\t女\t2009/9/29\t大专\t59467.8\t10\r\n江苏\t江苏泰州\t5204647432\t9/26/88\t女\t2016/8/4\t高中\t59459\t9\r\n山西\t山西太原\t796282162\t1/8/79\t女\t2015/7/20\t中专\t59457\t7\r\n山东\t山东威海\t181018972\t10/27/77\t女\t2007/11/20\t高中\t59452\t7\r\n山东\t山东菏泽\t374576682\t12/15/73\t女\t2010/5/10\t中专\t59451.94\t0\r\n湖北\t湖北武汉\t734417652\t8/21/82\t女\t2015/4/2\t大专\t59438.8\t4\r\n山东\t山东烟台\t60382102\t8/8/76\t女\t2005/9/29\t大专\t59417.18\t9\r\n浙江\t浙江杭州\t5047343342\t10/21/84\t女\t2015/12/16\t本科\t59416.1\t3\r\n山东\t山东临沂\t625873952\t1/2/72\t女\t2014/4/29\t中专\t59410.9\t11\r\n北京\t北京海淀\t5181662032\t1/17/94\t女\t2016/6/24\t大专\t59410.6\t26\r\n北京\t北京海淀\t785614532\t10/16/92\t男\t2015/7/10\t本科\t59410\t7\r\n山东\t山东烟台\t142568732\t7/31/73\t女\t2007/6/22\t高中\t59397.7\t22\r\n青岛\t青岛一支\t551678862\t10/30/81\t男\t2013/6/25\t大专\t59389.8\t6\r\n广东\t广东惠州\t7149892\t10/12/77\t男\t2003/9/5\t大专\t59382.67\t1\r\n江西\t江西南昌\t534345592\t12/9/89\t女\t2013/6/14\t大专\t59374.56\t13\r\n湖北\t湖北十堰\t813457302\t7/1/78\t女\t2015/7/30\t大专\t59354.5\t11\r\n湖北\t湖北襄阳\t5087160492\t1/8/81\t女\t2016/3/10\t高中\t59350\t2\r\n苏州\t苏州昆山\t5027162842\t3/11/74\t女\t2015/11/23\t高中\t59321\t5\r\n山西\t山西太原\t5154548282\t11/26/71\t女\t2016/5/31\t大专\t59319\t4\r\n重庆\t重庆江津\t554575882\t7/8/75\t女\t2013/6/27\t中专\t59309.3\t15\r\n江西\t江西宜春\t493345022\t7/14/60\t女\t2012/12/24\t高中\t59305.4\t4\r\n重庆\t重庆永川\t596721062\t4/26/85\t男\t2013/12/24\t本科\t59290\t16\r\n陕西\t陕西宝鸡\t573030172\t11/9/70\t女\t2013/8/9\t中专\t59284.65\t6\r\n佛山\t佛山顺德龙江\t482590302\t5/9/76\t女\t2012/11/9\t中专\t59269.45\t15\r\n河北\t河北唐山\t5148638552\t11/2/69\t男\t2016/5/26\t中专\t59262\t4\r\n山东\t山东烟台\t5231139302\t4/26/67\t女\t2016/9/7\t大专\t59255\t6\r\n陕西\t陕西西安\t260867422\t9/24/69\t女\t2008/11/1\t大专\t59245.98\t8\r\n黑龙江\t黑龙江哈尔滨\t5198583582\t12/4/93\t女\t2016/8/1\t本科\t59237.3\t9\r\n湖北\t湖北武汉\t5176783022\t1/18/80\t男\t2016/6/20\t本科\t59227.7\t6\r\n湖北\t湖北武汉\t20881882\t11/11/53\t男\t2004/10/16\t本科\t59220.64\t3\r\n重庆\t重庆巴南\t5222765592\t9/20/85\t女\t2016/8/24\t大专\t59212.2\t12\r\n辽宁\t辽宁葫芦岛\t453704122\t8/10/78\t女\t2012/3/1\t大专\t59195.05\t2\r\n北京\t北京海淀\t508269342\t10/14/91\t女\t2013/4/1\t大专\t59192\t1\r\n辽宁\t辽宁营口\t532630022\t6/9/74\t女\t2013/6/10\t初中\t59189.88\t9\r\n江苏\t江苏镇江\t5203353822\t12/26/83\t女\t2016/8/3\t中专\t59186\t12\r\n辽宁\t辽宁朝阳\t364346602\t6/19/59\t女\t2010/3/16\t大专\t59173.2\t1\r\n山东\t山东烟台\t5216030912\t11/8/88\t女\t2016/8/15\t本科\t59172.7\t5\r\n广东\t广东茂名\t728736662\t8/26/88\t女\t2015/3/26\t本科\t59171\t17\r\n大连\t大连海川\t5107128922\t5/12/82\t女\t2016/3/23\t本科\t59155\t11\r\n湖北\t湖北黄石\t58693462\t8/12/60\t女\t2005/9/16\t高中\t59142.93\t10\r\n北京\t北京东城\t678399802\t8/20/85\t女\t2014/10/24\t本科\t59129\t10\r\n广东\t广东广州\t79655372\t4/11/76\t女\t2006/3/24\t大专\t59128.2\t4\r\n重庆\t重庆渝中\t5184330952\t2/23/90\t女\t2016/6/27\t硕士\t59124.4\t16\r\n辽宁\t辽宁沈阳\t482659942\t5/2/66\t女\t2012/11/9\t高中\t59106.62\t1\r\n浙江\t浙江湖州\t5163610062\t10/28/68\t女\t2016/6/6\t高中\t59095\t14\r\n湖北\t湖北十堰\t5176941712\t10/10/70\t女\t2016/6/20\t中专\t59081\t5\r\n湖北\t湖北黄石\t5112335142\t10/6/68\t女\t2016/3/25\t高中\t59064\t9\r\n四川\t四川高新\t5216967332\t2/8/80\t女\t2016/8/16\t高中\t59061\t18\r\n辽宁\t辽宁沈阳\t9692412\t10/13/71\t女\t2004/1/5\t大专\t59059.5\t6\r\n安徽\t安徽合肥\t133262872\t1/11/69\t女\t2007/5/1\t高中\t59057.86\t8\r\n浙江\t浙江金华\t5202515232\t6/19/64\t男\t2016/8/2\t中专\t59049.5\t9\r\n吉林\t吉林辽源\t480408152\t4/16/64\t女\t2012/10/12\t高中\t59039.9\t14\r\n四川\t四川青羊\t190706692\t10/14/73\t女\t2007/12/18\t大专\t59039.7\t4\r\n四川\t四川绵阳\t434885422\t8/22/74\t女\t2011/8/22\t高中\t59021.4\t9\r\n辽宁\t辽宁朝阳\t209344372\t3/28/77\t女\t2008/3/21\t大专\t59020.97\t11\r\n湖北\t湖北恩施\t858805152\t8/21/78\t女\t2015/8/12\t高中\t59010.2\t22\r\n湖北\t湖北武汉\t569876622\t7/12/83\t女\t2013/7/19\t本科\t59003.71\t6\r\n山东\t山东日照\t63734392\t9/12/72\t女\t2005/10/31\t高中\t59001.85\t8\r\n四川\t四川绵阳\t5205173212\t5/3/73\t男\t2016/8/4\t中专\t59001\t10\r\n山东\t山东泰安\t822943482\t9/11/82\t男\t2015/8/1\t高中\t58996.97\t8\r\n深圳\t深圳福田第二\t693898312\t11/27/82\t女\t2014/12/20\t本科\t58995.6\t8\r\n辽宁\t辽宁沈阳\t279425822\t2/2/68\t女\t2009/2/16\t高中\t58957.94\t6\r\n湖北\t湖北武汉\t5164565592\t10/27/74\t女\t2016/6/7\t大专\t58950\t9\r\n青岛\t青岛一支\t8033502\t9/1/56\t女\t2003/9/23\t大专\t58941.98\t6\r\n广东\t广东广州\t5176073212\t3/6/77\t女\t2016/6/20\t大专\t58907.5\t8\r\n湖北\t湖北襄阳\t388281042\t1/10/81\t女\t2010/8/1\t中专\t58900.51\t13\r\n山东\t山东威海\t5102170082\t12/19/76\t男\t2016/3/21\t中专\t58897\t14\r\n山东\t山东德州\t287314922\t5/30/77\t女\t2009/3/24\t本科\t58864.38\t11\r\n山东\t山东威海\t5202045672\t1/24/79\t女\t2016/8/2\t中专\t58863.1\t10\r\n四川\t四川高新\t5069526432\t8/3/84\t男\t2016/2/29\t本科\t58862\t7\r\n安徽\t安徽安庆\t780389512\t10/23/81\t女\t2015/7/1\t高中\t58861.5\t12\r\n湖北\t湖北荆门\t532874542\t5/1/62\t女\t2013/6/11\t高中\t58858.64\t8\r\n贵州\t贵州黔东南\t736339232\t10/4/63\t女\t2015/4/7\t中专\t58834.1\t17\r\n江西\t江西赣州\t5151954692\t9/27/76\t女\t2016/5/29\t高中\t58815\t15\r\n北京\t北京良乡\t670739872\t5/20/84\t女\t2014/9/22\t高中\t58791.5\t13\r\n安徽\t安徽合肥\t468245882\t7/26/80\t女\t2012/6/18\t中专\t58790.43\t12\r\n佛山\t佛山顺德龙江\t797123062\t9/21/82\t女\t2015/7/21\t高中\t58781.6\t12\r\n湖北\t湖北襄阳\t95835252\t12/8/54\t女\t2006/9/1\t大专\t58764.01\t10\r\n四川\t四川成都\t207866482\t7/23/70\t女\t2008/3/17\t中专\t58759.4\t10\r\n四川\t四川绵阳\t332089982\t7/29/79\t男\t2009/9/23\t中专\t58748.03\t6\r\n云南\t云南昆明\t836245462\t2/1/75\t女\t2015/8/7\t大专\t58729.22\t6\r\n四川\t四川巴中\t486141062\t6/9/73\t男\t2012/11/28\t高中\t58710\t8\r\n重庆\t重庆江津\t689760112\t3/19/71\t女\t2014/12/9\t高中\t58705.6\t10\r\n苏州\t苏州新区\t180407942\t11/11/62\t女\t2007/11/16\t高中\t58685.56\t0\r\n浙江\t浙江温州\t5784388322\t7/31/86\t女\t2018/6/25\t高中\t58683.8\t7\r\n河南\t河南许昌\t325758052\t12/1/70\t男\t2009/8/24\t大专\t58680.7\t8\r\n广东\t广东广州\t5219240982\t6/25/92\t女\t2016/8/18\t本科\t58670\t25\r\n北京\t北京良乡\t859425392\t9/6/80\t男\t2015/8/14\t大专\t58669\t13\r\n河北\t河北唐山\t513521022\t11/11/80\t女\t2013/4/2\t高中\t58668\t5\r\n湖北\t湖北恩施\t5196911942\t10/24/87\t女\t2016/7/29\t高中\t58650.4\t13\r\n湖北\t湖北鄂州\t502503632\t1/15/82\t女\t2013/2/1\t高中\t58628.42\t5\r\n陕西\t陕西西安\t645732022\t8/25/76\t女\t2014/7/9\t大专\t58627.74\t8\r\n湖北\t湖北荆州\t84485552\t11/9/75\t女\t2006/5/12\t高中\t58606.64\t11\r\n浙江\t浙江温州\t576114352\t10/17/85\t男\t2013/9/2\t本科\t58601.98\t4\r\n山东\t山东威海\t823244392\t8/5/67\t女\t2015/8/1\t本科\t58591.5\t13\r\n苏州\t苏州太仓\t244736392\t1/11/64\t女\t2008/8/6\t高中\t58590.41\t5\r\n黑龙江\t黑龙江绥化\t881900362\t7/2/78\t女\t2015/10/8\t大专\t58540.2\t13\r\n四川\t四川高新\t188346592\t8/16/77\t男\t2007/12/10\t大专\t58535.06\t15\r\n辽宁\t辽宁沈阳\t5201453702\t6/16/75\t男\t2016/8/2\t本科\t58529\t11\r\n广东\t广东惠州\t432718622\t4/7/71\t女\t2011/8/3\t高中\t58524.51\t6\r\n苏州\t苏州张家港\t617907672\t8/25/89\t女\t2014/3/25\t本科\t58512.42\t0\r\n河北\t河北唐山\t34046252\t8/25/68\t女\t2005/3/16\t中专\t58510\t9\r\n湖南\t湖南邵阳\t5130345432\t4/15/62\t女\t2016/4/29\t高中\t58506.33\t9\r\n山东\t山东烟台\t472001252\t8/29/80\t女\t2012/7/11\t本科\t58484.8\t9\r\n山东\t山东临沂\t274372612\t7/8/70\t女\t2009/1/1\t高中\t58479.1\t11\r\n浙江\t浙江杭州\t5199096692\t8/2/62\t男\t2016/8/1\t大专\t58478\t11\r\n江苏\t江苏南京\t789697742\t10/6/83\t女\t2015/7/14\t中专\t58460.8\t2\r\n湖北\t湖北武汉\t767209792\t8/7/76\t女\t2015/6/19\t中专\t58459.86\t3\r\n山西\t山西临汾\t692490762\t2/14/69\t女\t2014/12/18\t大专\t58456.5\t6\r\n宁波\t宁波象山\t31601432\t9/28/68\t女\t2005/2/16\t本科\t58445.41\t4\r\n北京\t北京东城\t261564842\t7/2/82\t女\t2008/11/6\t高中\t58442.06\t11\r\n四川\t四川绵阳\t97609582\t3/3/74\t女\t2006/9/19\t本科\t58441.67\t3\r\n四川\t四川青羊\t76976912\t1/23/70\t男\t2006/3/1\t大专\t58430.6\t5\r\n河北\t河北廊坊\t369436382\t10/17/62\t男\t2010/4/10\t本科\t58429.71\t2\r\n福建\t福建南平\t454884172\t10/16/82\t女\t2012/3/7\t中专\t58398\t2\r\n山东\t山东潍坊\t669272592\t10/27/79\t女\t2014/9/16\t中专\t58374.52\t13\r\n山东\t山东烟台\t123752132\t10/2/69\t女\t2007/3/19\t高中\t58372.99\t10\r\n山东\t山东济南\t877971512\t7/19/88\t女\t2015/9/24\t中专\t58343\t6\r\n四川\t四川成都\t22370382\t5/28/62\t女\t2004/11/8\t高中\t58332.2\t8\r\n福建\t福建福州\t502263852\t9/30/75\t女\t2013/1/31\t高中\t58314.7\t7\r\n青岛\t青岛一支\t5187405942\t9/1/68\t女\t2016/7/5\t大专\t58310.5\t5\r\n广西\t广西柳州\t839212822\t11/27/82\t女\t2015/8/8\t高中\t58309\t3\r\n山东\t山东日照\t347105862\t3/21/78\t女\t2009/12/1\t高中\t58308.25\t23\r\n青岛\t青岛一支\t404596162\t5/17/62\t女\t2010/11/18\t大专\t58299.86\t5\r\n安徽\t安徽六安\t5191963072\t5/11/92\t女\t2016/7/25\t高中\t58278.93\t8\r\n山东\t山东烟台\t664214912\t4/8/84\t女\t2014/8/29\t本科\t58273.05\t8\r\n深圳\t深圳福田\t613825162\t12/5/80\t女\t2014/3/15\t中专\t58262.26\t7\r\n江苏\t江苏扬州\t5042651062\t6/27/63\t女\t2015/12/7\t高中\t58248\t3\r\n福建\t福建厦门\t250015702\t1/16/84\t女\t2008/9/8\t中专\t58246.73\t22\r\n四川\t四川绵阳\t5197397842\t9/6/88\t女\t2016/7/30\t本科\t58246\t13\r\n四川\t四川高新\t646518902\t1/9/86\t男\t2014/7/18\t本科\t58235.14\t7\r\n湖北\t湖北十堰\t203786342\t4/13/69\t男\t2008/2/12\t本科\t58234.8\t14\r\n辽宁\t辽宁沈阳\t404556522\t11/16/81\t男\t2010/11/17\t大专\t58222.5\t15\r\n江西\t江西南昌\t430985602\t5/3/87\t女\t2011/7/21\t高中\t58202.29\t8\r\n四川\t四川高新\t538989312\t1/7/74\t女\t2013/6/18\t大专\t58179.27\t7\r\n湖北\t湖北武汉\t121739692\t1/24/71\t女\t2007/3/7\t大专\t58175\t6\r\n青岛\t青岛一支\t5213974872\t11/4/75\t女\t2016/8/12\t大专\t58170.5\t12\r\n山东\t山东济南\t418713082\t7/17/80\t女\t2011/3/23\t大专\t58166.36\t14\r\n河南\t河南南阳\t739572332\t3/11/77\t女\t2015/4/9\t中专\t58157.5\t8\r\n山东\t山东临沂\t458163052\t12/2/68\t男\t2012/3/22\t初中\t58121\t5\r\n河南\t河南郑州\t618047382\t9/24/89\t女\t2014/3/25\t大专\t58119.34\t12\r\n浙江\t浙江金华\t691245812\t2/12/84\t女\t2014/12/16\t本科\t58090.5\t2\r\n天津\t天津市区一支\t541973422\t1/9/84\t女\t2013/6/20\t本科\t58074.8\t5\r\n辽宁\t辽宁营口\t5115266952\t9/19/70\t女\t2016/3/31\t本科\t58070\t1\r\n山东\t山东威海\t39260662\t7/25/73\t女\t2005/4/19\t中专\t58064.47\t10\r\n湖北\t湖北恩施\t5197695142\t4/15/66\t女\t2016/7/31\t大专\t58062\t9\r\n山东\t山东日照\t496191792\t10/6/73\t男\t2012/12/29\t中专\t58060.95\t5\r\n广东\t广东肇庆\t825276922\t8/4/85\t女\t2015/8/3\t本科\t58056.6\t9\r\n辽宁\t辽宁沈阳\t628093372\t7/29/71\t女\t2014/5/12\t本科\t58055.3\t13\r\n湖南\t湖南株洲\t5198348802\t8/21/86\t女\t2016/8/1\t中专\t58054.3\t11\r\n福建\t福建福州\t5211230762\t7/13/77\t女\t2016/8/9\t初中\t58029\t10\r\n苏州\t苏州新区\t578999092\t11/22/80\t男\t2013/9/24\t本科\t58028.7\t10\r\n山东\t山东烟台\t531153802\t11/12/86\t女\t2013/6/9\t中专\t58019.23\t10\r\n广西\t广西玉林\t285102072\t11/1/63\t女\t2009/3/16\t大专\t58013.71\t10\r\n山东\t山东临沂\t477154532\t11/29/85\t女\t2012/9/4\t中专\t58001.6\t21\r\n山东\t山东济宁\t5125697602\t3/19/92\t女\t2016/4/21\t中专\t58000\t0\r\n深圳\t深圳福田\t292631502\t7/19/78\t女\t2009/4/15\t本科\t57993.45\t6\r\n黑龙江\t黑龙江绥化\t732816802\t11/7/78\t女\t2015/3/31\t本科\t57992.2\t2\r\n山东\t山东东营\t105947812\t10/17/75\t男\t2006/12/4\t大专\t57989.69\t8\r\n广东\t广东广州\t408575532\t2/26/76\t女\t2010/12/10\t中专\t57988.5\t1\r\n宁波\t宁波宁海\t495604352\t12/21/79\t女\t2012/12/28\t高中\t57986.6\t1\r\n辽宁\t辽宁沈阳\t628083462\t10/19/78\t男\t2014/5/12\t本科\t57986.02\t3\r\n湖南\t湖南常德\t428477282\t7/27/71\t男\t2011/6/24\t大专\t57976.39\t8\r\n湖南\t湖南长沙\t206226692\t11/28/63\t女\t2008/3/7\t大专\t57962.65\t7\r\n四川\t四川青羊\t296729092\t11/30/71\t女\t2009/5/4\t大专\t57955.96\t3\r\n山东\t山东济南\t640785022\t3/6/82\t女\t2014/6/24\t大专\t57938.56\t11\r\n河北\t河北石家庄\t5175864742\t6/24/77\t女\t2016/6/20\t本科\t57910\t12\r\n四川\t四川眉山\t415223452\t10/29/71\t女\t2011/1/30\t本科\t57887\t11\r\n四川\t四川高新\t5202677522\t9/6/66\t女\t2016/8/2\t本科\t57857\t16\r\n北京\t北京海淀\t648608522\t9/10/88\t男\t2014/7/29\t本科\t57850\t1\r\n浙江\t浙江金华\t635729712\t11/19/80\t女\t2014/6/12\t高中\t57833.97\t9\r\n四川\t四川高新\t752185402\t1/29/88\t女\t2015/5/6\t本科\t57827.3\t4\r\n浙江\t浙江绍兴\t874687192\t8/6/76\t女\t2015/9/20\t中专\t57825\t6\r\n山西\t山西大同\t385783602\t1/10/75\t女\t2010/7/9\t高中\t57820.7\t5\r\n四川\t四川青羊\t5174342652\t3/23/73\t女\t2016/6/17\t大专\t57805\t8\r\n湖北\t湖北武汉\t257617572\t4/23/79\t女\t2008/10/20\t中专\t57798.93\t8\r\n广西\t广西梧州\t5177779332\t5/25/72\t女\t2016/6/21\t高中\t57795.1\t16\r\n深圳\t深圳罗湖\t770215122\t12/23/82\t女\t2015/6/24\t本科\t57784.95\t6\r\n江西\t江西南昌\t5193464322\t9/6/94\t女\t2016/7/27\t高中\t57782\t7\r\n贵州\t贵州贵阳\t660103372\t3/27/78\t女\t2014/8/22\t中专\t57771\t8\r\n北京\t北京良乡\t554834782\t2/21/73\t女\t2013/6/30\t本科\t57767.66\t9\r\n黑龙江\t黑龙江绥化\t273556972\t1/21/69\t女\t2009/1/1\t大专\t57762.06\t6\r\n山东\t山东济南\t577030062\t11/22/77\t女\t2013/9/6\t大专\t57743\t13\r\n广东\t广东东莞\t669953962\t4/10/79\t男\t2014/9/18\t高中\t57740.5\t6\r\n湖北\t湖北荆州\t5198192882\t11/1/74\t男\t2016/8/1\t高中\t57736.6\t16\r\n山东\t山东德州\t832440272\t10/27/68\t女\t2015/8/6\t大专\t57728\t1\r\n江西\t江西南昌\t652913092\t2/23/87\t女\t2014/8/7\t大专\t57708.94\t12\r\n河南\t河南驻马店\t155965342\t1/6/63\t男\t2007/8/3\t高中\t57702.6\t15\r\n陕西\t陕西西安\t582670712\t9/24/70\t女\t2013/11/1\t大专\t57696\t2\r\n云南\t云南昆明\t435714042\t2/10/78\t女\t2011/9/1\t大专\t57690.72\t4\r\n吉林\t吉林吉林\t5148081962\t2/5/82\t女\t2016/5/26\t大专\t57686\t3\r\n浙江\t浙江绍兴\t31482242\t11/11/62\t女\t2005/2/7\t高中\t57674.4\t4\r\n河北\t河北邢台\t449459982\t1/29/75\t女\t2011/12/30\t高中\t57664.93\t7\r\n河北\t河北唐山\t5011953782\t11/4/63\t女\t2015/11/7\t大专\t57661\t14\r\n苏州\t苏州新区\t870908932\t11/2/63\t女\t2015/9/11\t高中\t57654\t8\r\n安徽\t安徽蚌埠\t91667322\t7/14/60\t女\t2006/7/1\t大专\t57652.38\t11\r\n黑龙江\t黑龙江齐齐哈尔\t5159386512\t3/20/74\t女\t2016/6/2\t大专\t57628\t7\r\n四川\t四川青羊\t5124849042\t12/21/80\t女\t2016/4/19\t本科\t57610\t9\r\n河南\t河南南阳\t252785022\t2/28/75\t女\t2008/9/23\t中专\t57608.11\t6\r\n广东\t广东惠州\t241164142\t9/3/81\t男\t2008/7/21\t高中\t57593\t7\r\n山东\t山东济南\t490897132\t2/12/76\t女\t2012/12/18\t本科\t57588.39\t10\r\n苏州\t苏州昆山\t5189689492\t3/21/70\t女\t2016/7/19\t中专\t57587\t10\r\n浙江\t浙江温州\t455731212\t3/30/82\t女\t2012/3/9\t本科\t57579.3\t8\r\n山东\t山东淄博\t475884322\t12/30/68\t男\t2012/8/27\t高中\t57569.72\t10\r\n新疆\t新疆石河子\t478486572\t6/21/75\t女\t2012/9/21\t高中\t57531.16\t4\r\n四川\t四川高新\t776215442\t10/18/88\t女\t2015/6/29\t本科\t57525.71\t13\r\n山东\t山东临沂\t516837442\t11/28/73\t女\t2013/4/24\t初中\t57519.4\t7\r\n青岛\t青岛即墨\t467406382\t10/19/67\t女\t2012/6/7\t中专\t57466.36\t9\r\n江西\t江西南昌\t751283372\t1/29/83\t女\t2015/4/30\t大专\t57448\t6\r\n辽宁\t辽宁营口\t283561652\t6/21/70\t女\t2009/3/10\t中专\t57442.4\t14\r\n北京\t北京良乡\t455611322\t8/4/80\t女\t2012/3/9\t大专\t57402.09\t0\r\n北京\t北京东城\t167663402\t3/15/82\t男\t2007/10/1\t本科\t57396.75\t4\r\n山东\t山东济宁\t492898262\t3/20/73\t男\t2012/12/22\t本科\t57360\t4\r\n云南\t云南昆明\t384925952\t4/14/70\t女\t2010/6/30\t高中\t57358.59\t1\r\n青岛\t青岛一支\t357071602\t4/19/65\t女\t2010/1/12\t大专\t57358.48\t4\r\n安徽\t安徽滁州\t5192382852\t3/21/69\t男\t2016/7/26\t高中\t57348.5\t8\r\n湖南\t湖南衡阳\t5060799132\t12/5/75\t女\t2016/1/13\t高中\t57339.7\t15\r\n江西\t江西赣州\t5019261392\t1/8/76\t男\t2015/11/15\t大专\t57330\t3\r\n重庆\t重庆渝中\t607965522\t6/22/74\t女\t2014/1/27\t大专\t57329.54\t5\r\n四川\t四川青羊\t5196384292\t6/13/86\t女\t2016/7/29\t大专\t57314\t15\r\n四川\t四川成都\t5217352632\t11/20/78\t女\t2016/8/16\t高中\t57313\t11\r\n湖北\t湖北宜昌\t38752772\t7/22/68\t女\t2005/4/15\t大专\t57308.73\t2\r\n山东\t山东临沂\t55796442\t2/8/66\t女\t2005/8/25\t高中\t57274\t9\r\n湖北\t湖北荆州\t620071402\t5/13/78\t女\t2014/3/29\t高中\t57272\t15\r\n苏州\t苏州常熟\t872928212\t1/27/66\t女\t2015/9/17\t高中\t57259.11\t3\r\n福建\t福建厦门\t601969942\t8/31/81\t女\t2013/12/31\t大专\t57257.08\t17\r\n新疆\t新疆库尔勒\t374722532\t12/25/66\t女\t2010/5/12\t大专\t57249.16\t4\r\n四川\t四川青羊\t5106084562\t12/17/75\t女\t2016/3/23\t大专\t57241\t6\r\n四川\t四川宜宾\t232128762\t11/14/69\t女\t2008/6/19\t中技\t57231.05\t4\r\n黑龙江\t黑龙江齐齐哈尔\t676285622\t11/26/62\t女\t2014/10/9\t高中\t57220.7\t6\r\n湖北\t湖北武汉\t282142522\t6/3/75\t女\t2009/3/3\t本科\t57217.66\t7\r\n四川\t四川高新\t521068872\t5/11/72\t女\t2013/5/20\t高中\t57217.5\t11\r\n山西\t山西阳泉\t680943022\t6/14/72\t女\t2014/11/10\t高中\t57217\t9\r\n黑龙江\t黑龙江绥化\t385645292\t6/26/72\t女\t2010/7/8\t本科\t57207.66\t15\r\n吉林\t吉林长春\t5124677752\t12/23/62\t女\t2016/4/19\t中专\t57200\t1\r\n山西\t山西太原\t466303512\t8/10/79\t女\t2012/5/29\t大专\t57194.17\t3\r\n山东\t山东威海\t181987302\t4/16/73\t女\t2007/11/22\t高中\t57192.62\t8\r\n重庆\t重庆江津\t5091430292\t1/18/75\t女\t2016/3/14\t高中\t57180\t12\r\n四川\t四川高新\t817427462\t2/14/82\t男\t2015/7/31\t大专\t57177\t10\r\n湖南\t湖南益阳\t540540612\t4/11/79\t女\t2013/6/19\t高中\t57158.07\t8\r\n佛山\t佛山顺德龙江\t508707862\t5/23/88\t女\t2013/3/22\t大专\t57156.07\t12\r\n湖北\t湖北荆州\t404358752\t2/28/74\t男\t2010/11/15\t大专\t57149.5\t12\r\n青岛\t青岛开发区\t366968672\t4/21/76\t女\t2010/3/25\t高中\t57147.41\t8\r\n湖北\t湖北襄阳\t5211341332\t11/20/74\t男\t2016/8/9\t高中\t57129.5\t12\r\n河南\t河南周口\t5211849942\t4/1/69\t女\t2016/8/10\t大专\t57125\t7\r\n山东\t山东济南\t10701352\t11/5/72\t女\t2004/3/1\t大专\t57104.96\t11\r\n山东\t山东济南\t71246102\t4/26/66\t女\t2005/12/29\t大专\t57096.3\t9\r\n佛山\t佛山顺德龙江\t5079638942\t11/19/72\t女\t2016/3/7\t高中\t57083.5\t7\r\n黑龙江\t黑龙江哈尔滨\t489763832\t12/16/78\t女\t2012/12/13\t高中\t57081.73\t14\r\n辽宁\t辽宁沈阳\t496357462\t10/6/75\t女\t2012/12/30\t大专\t57078.74\t6\r\n广东\t广东广州\t529426922\t8/25/63\t女\t2013/6/7\t中专\t57072.67\t4\r\n山东\t山东济宁\t536352862\t8/23/83\t女\t2013/6/15\t大专\t57067.9\t24\r\n云南\t云南昆明\t148194732\t6/18/78\t女\t2007/7/1\t本科\t57060.99\t8\r\n山东\t山东济南\t8183122\t9/22/69\t女\t2003/3/1\t中专\t57056.29\t10\r\n河南\t河南驻马店\t798314692\t11/18/74\t男\t2015/7/22\t高中\t57053.5\t6\r\n青岛\t青岛一支\t5214259502\t10/28/80\t女\t2016/8/12\t大专\t57053\t13\r\n吉林\t吉林延边\t602520542\t3/5/73\t女\t2013/12/31\t高中\t57002.62\t8\r\n青岛\t青岛城阳\t740324742\t2/9/92\t男\t2015/4/10\t大专\t56994\t12\r\n浙江\t浙江嘉兴\t636195592\t1/25/82\t女\t2014/6/13\t本科\t56987\t8\r\n山东\t山东济南\t365818352\t5/27/78\t女\t2010/3/24\t大专\t56971.65\t9\r\n浙江\t浙江金华\t5120403382\t11/17/82\t女\t2016/4/12\t高中\t56951\t12\r\n浙江\t浙江金华\t276583792\t5/8/64\t女\t2009/1/9\t高中\t56948.96\t3\r\n四川\t四川青羊\t134477122\t9/3/78\t女\t2007/5/9\t大专\t56944.6\t2\r\n贵州\t贵州贵阳\t5126569702\t4/10/80\t女\t2016/4/22\t大专\t56934.4\t9\r\n浙江\t浙江温州\t615965302\t7/13/89\t女\t2014/3/20\t高中\t56931.68\t7\r\n福建\t福建福州\t5199789262\t4/1/84\t女\t2016/8/1\t高中\t56931.5\t9\r\n云南\t云南昆明\t265182872\t6/30/70\t女\t2008/11/24\t本科\t56931.46\t2\r\n青岛\t青岛一支\t5154384192\t8/12/71\t女\t2016/5/31\t大专\t56926\t15\r\n江苏\t江苏泰州\t864996402\t12/25/78\t女\t2015/8/31\t大专\t56860\t4\r\n湖南\t湖南长沙\t537510722\t11/25/75\t女\t2013/6/17\t本科\t56838.81\t9\r\n四川\t四川乐山\t827526072\t10/3/75\t女\t2015/8/4\t本科\t56810\t2\r\n宁波\t宁波慈溪\t101966072\t2/8/59\t女\t2006/10/25\t高中\t56807.58\t5\r\n湖北\t湖北武汉\t20876442\t1/19/76\t男\t2004/10/16\t中专\t56800.14\t11\r\n广东\t广东广州\t695343402\t8/11/76\t女\t2014/12/22\t本科\t56791.3\t6\r\n四川\t四川高新\t5192494322\t2/7/90\t女\t2016/7/26\t大专\t56790.1\t11\r\n北京\t北京良乡\t5207094172\t9/19/75\t女\t2016/8/6\t大专\t56786.5\t12\r\n山东\t山东威海\t430642682\t11/10/82\t女\t2011/7/15\t中专\t56775.14\t11\r\n浙江\t浙江杭州\t814722072\t6/30/95\t女\t2015/7/30\t高中\t56775\t5\r\n湖北\t湖北武汉\t158649242\t7/21/82\t男\t2007/8/22\t大专\t56768.42\t6\r\n苏州\t苏州昆山\t5106187932\t9/10/84\t女\t2016/3/23\t大专\t56767.5\t9\r\n四川\t四川绵阳\t5197350692\t8/1/85\t女\t2016/7/30\t高中\t56761.8\t11\r\n浙江\t浙江杭州\t5199126602\t3/20/77\t女\t2016/8/1\t中专\t56745.5\t13\r\n山东\t山东济南\t5123666972\t7/29/84\t女\t2016/4/18\t大专\t56744\t14\r\n北京\t北京海淀\t806687122\t2/27/84\t女\t2015/7/27\t大专\t56743.5\t9\r\n山东\t山东济南\t709573372\t11/3/72\t女\t2015/2/15\t大专\t56739.7\t13\r\n重庆\t重庆江津\t5034783192\t2/12/73\t女\t2015/11/28\t高中\t56721\t2\r\n广东\t广东中山\t123198462\t11/30/83\t女\t2007/3/19\t高中\t56720.55\t2\r\n天津\t天津滨海新区\t862317942\t4/2/80\t男\t2015/8/21\t本科\t56694.4\t2\r\n佛山\t佛山顺德龙江\t519783312\t11/12/84\t女\t2013/5/10\t高中\t56672.04\t11\r\n新疆\t新疆哈密\t5165766772\t2/14/84\t女\t2016/6/8\t中专\t56670\t8\r\n四川\t四川南充\t688198202\t4/23/88\t女\t2014/12/1\t本科\t56665.2\t11\r\n辽宁\t辽宁沈阳\t5188834632\t11/18/76\t女\t2016/7/14\t大专\t56661\t1\r\n江西\t江西上饶\t5190232512\t3/11/69\t男\t2016/7/20\t本科\t56656.5\t10\r\n辽宁\t辽宁朝阳\t442732512\t6/5/61\t女\t2011/10/26\t大专\t56653.19\t6\r\n浙江\t浙江杭州\t375318212\t11/14/87\t女\t2010/5/17\t本科\t56652.6\t0\r\n山东\t山东烟台\t202230572\t5/28/72\t女\t2008/1/25\t大专\t56650.73\t5\r\n黑龙江\t黑龙江绥化\t5042630222\t2/21/86\t男\t2015/12/7\t大专\t56641\t2\r\n辽宁\t辽宁锦州\t43041292\t10/25/63\t男\t2005/5/16\t大专\t56633.23\t14\r\n山东\t山东东营\t497652932\t11/7/70\t男\t2012/12/31\t大专\t56628.91\t0\r\n安徽\t安徽滁州\t5178247092\t2/28/72\t女\t2016/6/21\t高中\t56620\t3\r\n贵州\t贵州贵阳\t5089210162\t7/11/84\t女\t2016/3/11\t大专\t56616\t3\r\n浙江\t浙江嘉兴\t82054412\t2/13/72\t女\t2006/4/19\t高中\t56612.92\t4\r\n湖北\t湖北武汉\t457924942\t8/3/68\t女\t2012/3/21\t大专\t56605.7\t10\r\n大连\t大连明锐\t5126194372\t4/28/73\t男\t2016/4/22\t大专\t56579\t6\r\n广东\t广东广州\t677675722\t6/20/75\t女\t2014/10/21\t大专\t56574\t8\r\n重庆\t重庆渝中\t5154272722\t9/13/79\t女\t2016/5/31\t大专\t56565\t16\r\n山东\t山东东营\t514422352\t3/17/85\t女\t2013/4/8\t大专\t56555.02\t7\r\n湖北\t湖北武汉\t336840612\t9/21/64\t女\t2009/10/16\t高中\t56551.94\t5\r\n苏州\t苏州姑苏\t454409082\t6/21/82\t女\t2012/3/5\t高中\t56545.81\t6\r\n湖北\t湖北黄石\t5139158862\t12/15/80\t女\t2016/5/14\t高中\t56543.5\t6\r\n四川\t四川青羊\t214779442\t10/14/85\t女\t2008/4/7\t大专\t56541.5\t9\r\n上海\t上海陆家嘴\t147838832\t1/4/60\t女\t2007/7/4\t高中\t56539.52\t5\r\n北京\t北京东城\t320085572\t8/9/88\t男\t2009/8/1\t高中\t56535.17\t5\r\n湖北\t湖北恩施\t763026512\t6/14/69\t男\t2015/6/10\t高中\t56534\t3\r\n湖南\t湖南娄底\t750906952\t5/5/73\t女\t2015/4/30\t高中\t56519.3\t4\r\n宁波\t宁波宁海\t43299492\t1/15/75\t女\t2005/5/17\t中专\t56500.71\t6\r\n山东\t山东临沂\t780100882\t6/28/85\t女\t2015/6/30\t高中\t56498.6\t23\r\n天津\t天津市区二支\t423523442\t3/17/68\t女\t2011/5/9\t高中\t56491.35\t9\r\n北京\t北京海淀\t473760232\t10/10/89\t女\t2012/8/7\t本科\t56487\t7\r\n四川\t四川高新\t192273072\t5/18/65\t男\t2007/12/21\t本科\t56465.99\t8\r\n吉林\t吉林四平\t440195162\t7/18/67\t女\t2011/9/26\t中专\t56461.4\t7\r\n浙江\t浙江杭州\t5145278932\t11/19/76\t女\t2016/5/24\t中专\t56452.2\t7\r\n湖南\t湖南益阳\t5146028622\t8/17/77\t女\t2016/5/25\t高中\t56442.2\t6\r\n北京\t北京海淀\t248572982\t9/18/88\t男\t2008/9/1\t大专\t56425.3\t5\r\n河北\t河北石家庄\t584857332\t5/9/82\t女\t2013/11/19\t本科\t56421.6\t16\r\n辽宁\t辽宁沈阳\t754629522\t4/10/66\t女\t2015/5/18\t大专\t56420\t1\r\n河南\t河南三门峡\t522035802\t7/24/66\t男\t2013/5/23\t大专\t56415\t3\r\n江西\t江西南昌\t5177592602\t12/3/68\t女\t2016/6/21\t高中\t56399.5\t7\r\n北京\t北京海淀\t544225912\t12/1/88\t女\t2013/6/30\t大专\t56391.37\t6\r\n河南\t河南郑州\t5208510192\t4/19/83\t女\t2016/8/8\t本科\t56391\t16\r\n苏州\t苏州新区\t5171273062\t3/4/70\t女\t2016/6/15\t高中\t56375.88\t2\r\n江苏\t江苏泰州\t486688862\t8/24/58\t女\t2012/11/30\t大专\t56374.88\t8\r\n广东\t广东广州\t8333712\t11/10/84\t女\t2003/10/10\t中专\t56373.33\t13\r\n四川\t四川青羊\t192788772\t2/12/73\t女\t2007/12/24\t大专\t56372.94\t11\r\n四川\t四川青羊\t818085942\t1/8/86\t女\t2015/7/31\t本科\t56362.67\t2\r\n新疆\t新疆昌吉\t474547812\t5/22/63\t女\t2012/8/14\t大专\t56355.16\t20\r\n四川\t四川内江\t5123675072\t8/28/71\t男\t2016/4/18\t高中\t56350\t1\r\n浙江\t浙江温州\t5177646052\t8/1/77\t女\t2016/6/21\t高中\t56330\t12\r\n浙江\t浙江金华\t568912762\t8/3/76\t女\t2013/7/4\t高中\t56320.68\t0\r\n北京\t北京海淀\t5143058802\t4/18/66\t女\t2016/5/20\t本科\t56318\t3\r\n湖北\t湖北武汉\t241261142\t10/1/69\t女\t2008/7/21\t中专\t56307.88\t9\r\n辽宁\t辽宁沈阳\t477510432\t3/14/53\t女\t2012/9/7\t高中\t56261.22\t0\r\n江西\t江西赣州\t582570642\t9/24/70\t男\t2013/10/31\t高中\t56230.5\t1\r\n河南\t河南郑州\t202006842\t11/30/76\t女\t2008/1/24\t大专\t56227.18\t9\r\n浙江\t浙江金华\t5189023162\t9/25/82\t女\t2016/7/15\t高中\t56226.8\t12\r\n深圳\t深圳福田第二\t49332612\t12/30/71\t女\t2005/6/29\t大专\t56226.02\t6\r\n山东\t山东滨州\t277265862\t8/27/67\t男\t2009/1/1\t中专\t56224.48\t1\r\n广东\t广东广州\t5048359592\t2/2/78\t女\t2015/12/18\t高中\t56219.5\t15\r\n山东\t山东烟台\t366906842\t11/28/78\t女\t2010/3/25\t中专\t56210.5\t5\r\n山东\t山东威海\t453425402\t10/11/82\t女\t2012/2/28\t中专\t56208\t12\r\n云南\t云南昆明\t5075614792\t6/11/71\t女\t2016/3/4\t高中\t56200\t16\r\n湖北\t湖北荆州\t486476442\t3/8/72\t女\t2012/11/29\t大专\t56194.72\t14\r\n广东\t广东珠海\t5047649782\t1/26/76\t女\t2015/12/17\t大专\t56176.4\t9\r\n四川\t四川青羊\t464380262\t11/10/73\t女\t2012/5/11\t大专\t56167.38\t3\r\n陕西\t陕西西安\t5019140852\t8/25/79\t女\t2015/11/15\t本科\t56166\t6\r\n黑龙江\t黑龙江齐齐哈尔\t764835042\t3/21/66\t女\t2015/6/15\t高中\t56161\t2\r\n四川\t四川高新\t5031756252\t7/5/84\t男\t2015/11/26\t本科\t56158\t10\r\n湖北\t湖北黄冈\t5193960192\t5/13/79\t女\t2016/7/27\t高中\t56150.5\t10\r\n山东\t山东日照\t451820782\t1/16/62\t女\t2012/1/20\t高中\t56136.18\t8\r\n黑龙江\t黑龙江齐齐哈尔\t176200102\t2/16/64\t女\t2007/11/5\t高中\t56135.97\t3\r\n四川\t四川青羊\t666882762\t11/22/78\t女\t2014/9/4\t大专\t56119.05\t8\r\n黑龙江\t黑龙江佳木斯\t617311022\t8/28/87\t女\t2014/3/24\t高中\t56114.76\t6\r\n上海\t上海陆家嘴\t10093392\t10/17/60\t女\t2004/2/23\t大专\t56112.89\t1\r\n浙江\t浙江湖州\t28228622\t9/13/69\t女\t2005/1/5\t高中\t56106.76\t2\r\n深圳\t深圳福田第二\t657346062\t11/6/78\t女\t2014/8/17\t大专\t56091.13\t6\r\n四川\t四川内江\t738488582\t2/18/82\t女\t2015/4/9\t本科\t56090.2\t10\r\n云南\t云南玉溪\t325650442\t10/2/72\t女\t2009/8/24\t高中\t56087.26\t5\r\n上海\t上海黄浦\t585030812\t8/31/69\t女\t2013/11/19\t大专\t56083.17\t6\r\n大连\t大连开发区\t179658602\t9/14/70\t男\t2007/11/14\t大专\t56082.78\t1\r\n山东\t山东烟台\t5047921742\t11/1/73\t男\t2015/12/18\t本科\t56081\t5\r\n北京\t北京东城\t346912\t5/16/48\t女\t2002/1/18\t中专\t56069.1\t9\r\n湖南\t湖南长沙\t5217666272\t7/24/68\t男\t2016/8/17\t大专\t56058.1\t14\r\n青岛\t青岛一支\t705498672\t7/21/64\t女\t2015/1/22\t大专\t56036.5\t8\r\n苏州\t苏州张家港\t5226408042\t11/21/65\t女\t2016/8/30\t高中\t56033.4\t6\r\n江苏\t江苏南京\t9399042\t8/19/75\t女\t2003/12/16\t大专\t56033.02\t3\r\n甘肃\t甘肃张掖\t665857772\t6/26/77\t男\t2014/9/1\t大专\t56026.1\t0\r\n甘肃\t甘肃酒泉\t608978232\t6/7/63\t男\t2014/2/9\t大专\t56011.59\t0\r\n河南\t河南周口\t5165523822\t8/19/78\t女\t2016/6/8\t大专\t56004\t6\r\n湖南\t湖南岳阳\t5043470612\t5/5/69\t女\t2015/12/9\t高中\t56001\t9\r\n北京\t北京海淀\t702465712\t11/7/90\t女\t2015/1/5\t高中\t56000\t0\r\n天津\t天津武清\t425924852\t4/28/82\t女\t2011/6/3\t高中\t56000\t0\r\n天津\t天津市区一支\t5144661552\t4/20/82\t女\t2016/5/24\t大专\t56000\t0\r\n湖南\t湖南岳阳\t687595682\t10/19/90\t男\t2014/11/27\t本科\t56000\t0\r\n北京\t北京良乡\t792732102\t10/25/72\t女\t2015/7/17\t大专\t56000\t0\r\n青岛\t青岛开发区\t356830152\t9/2/67\t女\t2010/1/11\t高中\t55999.68\t6\r\n广东\t广东广州\t664056782\t5/22/77\t女\t2014/8/29\t大专\t55998.21\t13\r\n山东\t山东枣庄\t5200052152\t9/3/80\t女\t2016/8/1\t中专\t55994.5\t9\r\n北京\t北京海淀\t5086879462\t8/25/90\t男\t2016/3/10\t大专\t55992\t4\r\n辽宁\t辽宁沈阳\t5166508292\t3/31/89\t男\t2016/6/8\t大专\t55977\t2\r\n安徽\t安徽滁州\t5132212942\t9/4/71\t女\t2016/5/3\t大专\t55973\t7\r\n江西\t江西南昌\t433093642\t10/22/82\t女\t2011/8/8\t中专\t55969.72\t10\r\n贵州\t贵州遵义\t308558622\t9/2/64\t女\t2009/6/26\t大专\t55965.17\t2\r\n湖南\t湖南株洲\t5198302552\t12/24/77\t女\t2016/8/1\t高中\t55946.6\t12\r\n北京\t北京海淀\t127793332\t6/1/81\t男\t2007/4/1\t本科\t55941.11\t6\r\n浙江\t浙江温州\t126291852\t1/22/79\t女\t2007/3/25\t大专\t55935.93\t6\r\n重庆\t重庆渝中\t734618492\t12/15/78\t女\t2015/4/3\t本科\t55926\t16\r\n陕西\t陕西西安\t5177842822\t5/8/70\t女\t2016/6/21\t高中\t55926\t13\r\n河北\t河北保定\t161820512\t10/1/68\t女\t2007/9/6\t高中\t55921.73\t7\r\n四川\t四川青羊\t477460882\t10/19/87\t女\t2012/9/7\t本科\t55917.2\t13\r\n四川\t四川高新\t5216887572\t3/24/81\t女\t2016/8/16\t本科\t55910.8\t16\r\n山东\t山东潍坊\t284565152\t4/20/76\t女\t2009/3/13\t高中\t55890.73\t16\r\n河北\t河北保定\t498529702\t5/20/85\t女\t2013/1/5\t大专\t55879.55\t3\r\n北京\t北京海淀\t425758212\t9/30/87\t男\t2011/6/1\t大专\t55879\t7\r\n湖北\t湖北黄冈\t5143898222\t2/6/89\t女\t2016/5/21\t高中\t55858\t17\r\n福建\t福建泉州\t570051502\t1/20/84\t男\t2013/7/22\t大专\t55854.06\t7\r\n四川\t四川成都\t5048193702\t6/4/77\t女\t2015/12/18\t大专\t55853.6\t9\r\n广东\t广东湛江\t271798692\t11/30/66\t女\t2008/12/24\t高中\t55851.25\t11\r\n江苏\t江苏南京\t539417922\t6/27/85\t女\t2013/6/18\t大专\t55848\t5\r\n湖北\t湖北十堰\t294339262\t12/1/73\t女\t2009/4/23\t高中\t55847.21\t12\r\n苏州\t苏州新区\t870847802\t9/15/80\t女\t2015/9/11\t大专\t55834\t7\r\n福建\t福建福州\t517028372\t10/7/71\t男\t2013/4/25\t高中\t55829.23\t10\r\n苏州\t苏州姑苏\t5172672812\t12/23/78\t女\t2016/6/15\t中专\t55826\t4\r\n湖北\t湖北襄阳\t58276432\t7/28/64\t女\t2005/9/13\t高中\t55825.12\t11\r\n云南\t云南大理\t586928802\t10/8/79\t女\t2013/11/28\t中专\t55822.14\t7\r\n北京\t北京海淀\t473099652\t11/3/89\t男\t2012/8/1\t本科\t55822.11\t4\r\n山东\t山东潍坊\t541845022\t12/24/74\t男\t2013/6/20\t中专\t55815.39\t8\r\n佛山\t佛山禅城\t883069802\t5/15/85\t女\t2015/10/10\t高中\t55811\t4\r\n山东\t山东烟台\t335848422\t4/8/74\t女\t2009/10/9\t高中\t55808.13\t7\r\n苏州\t苏州太仓\t255988392\t6/29/70\t女\t2008/10/9\t高中\t55787.54\t4\r\n广东\t广东广州\t2314272\t9/4/68\t女\t2002/12/9\t大专\t55784.71\t9\r\n广西\t广西柳州\t746761912\t9/10/74\t男\t2015/4/17\t中专\t55775.59\t11\r\n苏州\t苏州常熟\t5086707202\t9/11/81\t女\t2016/3/10\t大专\t55765\t2\r\n四川\t四川高新\t189502082\t11/19/84\t女\t2007/12/12\t大专\t55762.6\t29\r\n山东\t山东淄博\t5228247442\t2/18/87\t女\t2016/9/1\t本科\t55759\t2\r\n辽宁\t辽宁营口\t5188897152\t2/13/72\t女\t2016/7/15\t本科\t55748\t8\r\n安徽\t安徽马鞍山\t150197262\t8/21/72\t男\t2007/7/1\t高中\t55745.73\t2\r\n广东\t广东肇庆\t534296742\t8/4/69\t女\t2013/6/14\t中专\t55715.07\t6\r\n山东\t山东济南\t569136492\t3/12/80\t女\t2013/7/10\t大专\t55691.3\t7\r\n广东\t广东广州\t5046275442\t2/5/80\t女\t2015/12/14\t本科\t55685\t2\r\n苏州\t苏州昆山\t95931552\t9/9/76\t女\t2006/9/4\t高中\t55679.5\t8\r\n四川\t四川青羊\t5188396782\t6/9/94\t女\t2016/7/12\t本科\t55670.4\t6\r\n北京\t北京海淀\t661689842\t5/30/83\t男\t2014/8/25\t本科\t55662.5\t5\r\n江苏\t江苏南通\t395223032\t12/30/64\t女\t2010/9/13\t高中\t55652.63\t4\r\n大连\t大连开发区\t273467512\t3/25/69\t女\t2009/1/1\t高中\t55645.98\t9\r\n安徽\t安徽滁州\t781718482\t2/23/95\t男\t2015/7/3\t高中\t55641.46\t3\r\n江苏\t江苏无锡\t5190835352\t1/17/82\t女\t2016/7/22\t高中\t55636.5\t9\r\n山东\t山东烟台\t602783212\t6/20/70\t女\t2013/12/31\t中专\t55631.32\t7\r\n广东\t广东清远\t755317732\t7/7/70\t女\t2015/5/20\t大专\t55630.1\t2\r\n山东\t山东济宁\t378142792\t2/11/72\t男\t2010/5/31\t大专\t55619.42\t4\r\n黑龙江\t黑龙江大庆\t48756752\t7/6/73\t女\t2005/6/3\t大专\t55615.22\t6\r\n四川\t四川高新\t718516492\t1/23/83\t女\t2015/3/24\t大专\t55611.5\t2\r\n黑龙江\t黑龙江牡丹江\t5162329122\t3/26/83\t女\t2016/6/6\t高中\t55610\t3\r\n云南\t云南昆明\t387874892\t8/10/57\t女\t2010/7/26\t大专\t55591.3\t9\r\n湖北\t湖北十堰\t5141661822\t10/30/74\t女\t2016/5/18\t高中\t55588\t8\r\n青岛\t青岛城阳\t5111698792\t5/15/87\t女\t2016/3/25\t大专\t55580\t3\r\n云南\t云南昆明\t622666812\t11/27/75\t女\t2014/4/9\t中专\t55578.72\t3\r\n广西\t广西梧州\t350657322\t8/27/70\t女\t2009/12/20\t大专\t55573.87\t7\r\n河北\t河北保定\t5196175822\t4/2/63\t男\t2016/7/29\t高中\t55566.1\t13\r\n江西\t江西赣州\t214040982\t3/21/73\t女\t2008/4/1\t大专\t55561.11\t2\r\n佛山\t佛山顺德龙江\t85324082\t1/29/66\t女\t2006/5/24\t高中\t55556.01\t12\r\n大连\t大连海川\t645651072\t7/22/80\t女\t2014/7/8\t大专\t55552.64\t7\r\n山东\t山东淄博\t505161572\t6/19/77\t女\t2013/3/2\t初中\t55535\t8\r\n浙江\t浙江温州\t477838972\t11/21/85\t女\t2012/9/12\t高中\t55530.7\t11\r\n四川\t四川乐山\t841148082\t1/9/83\t女\t2015/8/9\t大专\t55527.33\t3\r\n天津\t天津市区二支\t827813302\t4/18/80\t女\t2015/8/4\t大专\t55520.59\t0\r\n陕西\t陕西西安\t279678582\t6/14/60\t男\t2009/2/18\t大专\t55515.68\t2\r\n广东\t广东广州\t489265852\t8/2/79\t女\t2012/12/11\t大专\t55509.35\t7\r\n四川\t四川内江\t233735752\t10/5/67\t男\t2008/6/24\t大专\t55507.46\t8\r\n苏州\t苏州昆山\t870683532\t2/10/82\t女\t2015/9/11\t大专\t55506\t9\r\n河南\t河南平顶山\t5208039732\t10/20/66\t男\t2016/8/7\t高中\t55501\t16\r\n湖北\t湖北武汉\t511326862\t10/22/76\t男\t2013/3/27\t中专\t55499.14\t10\r\n江苏\t江苏南京\t5191889682\t8/27/85\t女\t2016/7/25\t大专\t55486.5\t13\r\n苏州\t苏州姑苏\t550007672\t6/28/88\t女\t2013/6/25\t大专\t55486.1\t5\r\n湖北\t湖北武汉\t625056642\t12/8/85\t女\t2014/4/25\t大专\t55484\t14\r\n青岛\t青岛一支\t5087951932\t10/15/69\t女\t2016/3/11\t本科\t55479\t10\r\n江西\t江西南昌\t94187922\t10/2/71\t女\t2006/8/22\t大专\t55476.91\t6\r\n吉林\t吉林延边\t339562752\t4/27/68\t女\t2009/10/30\t大专\t55475.83\t12\r\n四川\t四川高新\t790113102\t12/1/85\t女\t2015/7/15\t本科\t55472.65\t13\r\n浙江\t浙江温州\t5156241732\t8/29/75\t女\t2016/5/31\t大专\t55470\t9\r\n重庆\t重庆永川\t5126698412\t5/23/72\t女\t2016/4/22\t大专\t55465.9\t16\r\n江苏\t江苏盐城\t19826192\t11/26/59\t女\t2004/9/28\t高中\t55460.16\t7\r\n四川\t四川高新\t783790652\t12/15/76\t女\t2015/7/8\t大专\t55456\t9\r\n青岛\t青岛一支\t5212268752\t10/20/84\t女\t2016/8/10\t大专\t55430.1\t12\r\n四川\t四川青羊\t15242902\t5/11/73\t女\t2004/6/29\t大专\t55428.9\t4\r\n江西\t江西南昌\t21067372\t10/16/73\t男\t2004/10/18\t大专\t55417.25\t4\r\n云南\t云南昆明\t646541792\t7/2/79\t女\t2014/7/18\t大专\t55411.9\t1\r\n山西\t山西太原\t155600232\t7/5/77\t女\t2007/8/1\t大专\t55404.43\t4\r\n天津\t天津市区一支\t870716332\t11/4/87\t女\t2015/9/11\t大专\t55404\t3\r\n苏州\t苏州昆山\t5223787242\t10/19/81\t女\t2016/8/25\t高中\t55396.5\t9\r\n山东\t山东济南\t626711782\t3/18/78\t女\t2014/5/4\t本科\t55395\t11\r\n湖南\t湖南湘潭\t442032022\t12/10/68\t女\t2011/10/11\t高中\t55388.63\t7\r\n湖北\t湖北随州\t515331222\t8/24/76\t女\t2013/4/16\t中专\t55381\t6\r\n山东\t山东烟台\t5218006222\t2/24/83\t女\t2016/8/17\t大专\t55376\t12\r\n四川\t四川高新\t5038332312\t10/8/83\t女\t2015/11/30\t大专\t55371\t8\r\n北京\t北京东城\t22446862\t12/10/75\t男\t2004/11/9\t大专\t55366.96\t8\r\n辽宁\t辽宁葫芦岛\t5202311262\t4/3/75\t女\t2016/8/2\t大专\t55360.3\t11\r\n四川\t四川高新\t620176912\t11/28/85\t女\t2014/3/29\t大专\t55359.05\t8\r\n云南\t云南昆明\t372408212\t11/12/76\t女\t2010/5/1\t大专\t55345.2\t3\r\n湖北\t湖北武汉\t572547542\t9/26/69\t男\t2013/8/7\t中专\t55343.48\t8\r\n四川\t四川青羊\t67783132\t3/11/74\t女\t2005/11/30\t大专\t55337.85\t8\r\n山东\t山东日照\t5172776112\t1/20/82\t女\t2016/6/15\t中专\t55324.5\t15\r\n上海\t上海陆家嘴\t615390142\t4/18/85\t女\t2014/3/19\t硕士\t55316.5\t5\r\n四川\t四川雅安\t5143598152\t5/23/92\t男\t2016/5/20\t大专\t55309\t2\r\n江苏\t江苏南京\t5147471852\t9/9/82\t女\t2016/5/26\t本科\t55293\t9\r\n四川\t四川高新\t738446572\t1/21/67\t女\t2015/4/9\t中专\t55280\t28\r\n山东\t山东烟台\t531340962\t11/13/76\t女\t2013/6/9\t高中\t55278.68\t1\r\n浙江\t浙江金华\t668907482\t12/24/92\t女\t2014/9/15\t高中\t55264.95\t7\r\n河南\t河南濮阳\t5026147492\t6/18/74\t女\t2015/11/21\t中专\t55262\t2\r\n苏州\t苏州昆山\t759429972\t3/29/80\t女\t2015/6/1\t大专\t55240\t5\r\n苏州\t苏州新区\t498309742\t2/2/76\t女\t2013/1/4\t大专\t55199.5\t4\r\n山东\t山东烟台\t5037409462\t12/29/86\t男\t2015/11/30\t本科\t55196.5\t3\r\n山东\t山东淄博\t100437932\t10/28/67\t女\t2006/10/9\t中专\t55190.36\t10\r\n湖北\t湖北武汉\t422827692\t8/12/81\t女\t2011/5/1\t硕士\t55178.9\t11\r\n江苏\t江苏泰州\t525158922\t4/10/66\t女\t2013/5/30\t高中\t55168\t5\r\n黑龙江\t黑龙江佳木斯\t131408292\t5/8/70\t女\t2007/4/23\t大专\t55166.84\t16\r\n山东\t山东烟台\t13163892\t7/26/57\t女\t2004/5/1\t本科\t55166.23\t11\r\n福建\t福建泉州\t187569892\t5/1/82\t男\t2007/12/5\t高中\t55159.34\t5\r\n湖北\t湖北武汉\t738785722\t2/22/82\t女\t2015/4/9\t本科\t55147.2\t14\r\n浙江\t浙江杭州\t290147742\t9/12/80\t女\t2009/4/1\t本科\t55145.63\t6\r\n江苏\t江苏盐城\t586881352\t7/21/75\t女\t2013/11/28\t高中\t55143.6\t16\r\n四川\t四川绵阳\t708840082\t12/31/85\t女\t2015/2/10\t本科\t55129.63\t12\r\n山东\t山东菏泽\t5195395252\t6/5/76\t女\t2016/7/28\t高中\t55111.1\t20\r\n山东\t山东烟台\t196467932\t5/14/79\t女\t2008/1/1\t中专\t55106.42\t11\r\n湖北\t湖北武汉\t5120188542\t12/14/81\t女\t2016/4/12\t本科\t55090\t19\r\n安徽\t铜陵\t222571542\t8/30/63\t女\t2008/5/1\t高中\t55087.7\t4\r\n江西\t江西新余\t300832122\t4/25/73\t女\t2009/5/19\t高中\t55086.34\t7\r\n四川\t四川高新\t866061032\t8/26/86\t女\t2015/9/2\t大专\t55081.5\t13\r\n山东\t山东菏泽\t5217190342\t8/16/73\t女\t2016/8/16\t高中\t55080\t9\r\n四川\t四川青羊\t104231542\t5/21/75\t女\t2006/11/22\t高中\t55078.17\t4\r\n天津\t天津蓟州\t122701182\t8/5/72\t女\t2007/3/14\t高中\t55070\t7\r\n四川\t四川宜宾\t811409692\t5/18/81\t女\t2015/7/29\t高中\t55053.3\t6\r\n山东\t山东济宁\t704511922\t3/5/78\t男\t2015/1/16\t高中\t55052\t7\r\n河北\t河北唐山\t5197447692\t7/1/77\t男\t2016/7/30\t中专\t55051\t9\r\n苏州\t苏州新区\t5169143632\t9/26/82\t女\t2016/6/13\t高中\t55044.4\t13\r\n河南\t河南郑州\t158020762\t1/15/70\t男\t2007/8/17\t本科\t55035.42\t1\r\n湖南\t湖南郴州\t338934972\t10/14/63\t女\t2009/10/1\t高中\t55030.43\t3\r\n浙江\t浙江金华\t825874972\t3/11/74\t女\t2015/8/3\t高中\t55030\t5\r\n黑龙江\t黑龙江七台河\t5136493612\t9/28/64\t女\t2016/5/11\t大专\t55028.6\t3\r\n湖北\t湖北武汉\t5182203252\t2/24/72\t男\t2016/6/24\t高中\t55016.5\t9\r\n天津\t天津市区二支\t800052182\t12/3/82\t男\t2015/7/23\t大专\t55000\t0\r\n深圳\t深圳福田\t641068482\t1/31/91\t女\t2014/6/24\t大专\t55000\t0\r\n北京\t北京东城\t610374472\t6/19/83\t男\t2014/2/27\t本科\t55000\t0\r\n陕西\t陕西西安\t5213767232\t11/8/72\t女\t2016/8/11\t本科\t54996.5\t8\r\n山东\t山东淄博\t5198644302\t2/13/74\t男\t2016/8/1\t大专\t54996\t10\r\n广东\t广东惠州\t557448342\t4/16/81\t女\t2013/6/27\t大专\t54993.54\t8\r\n青岛\t青岛一支\t376043962\t1/21/78\t女\t2010/5/20\t大专\t54984.93\t11\r\n四川\t四川青羊\t5113696812\t3/4/79\t女\t2016/3/29\t本科\t54958.5\t7\r\n安徽\t安徽安庆\t630953822\t12/19/80\t女\t2014/5/25\t高中\t54951.32\t11\r\n黑龙江\t黑龙江哈尔滨\t267481842\t8/21/76\t女\t2008/12/1\t中专\t54949.9\t12\r\n四川\t四川雅安\t189628112\t3/11/65\t男\t2007/12/13\t大专\t54949.85\t10\r\n新疆\t新疆昌吉\t5091517322\t8/11/84\t女\t2016/3/14\t大专\t54943.1\t8\r\n湖北\t湖北襄阳\t58056472\t2/26/74\t女\t2005/9/12\t高中\t54931.6\t8\r\n深圳\t深圳福田第二\t622050342\t12/21/68\t女\t2014/4/3\t大专\t54921.2\t10\r\n浙江\t浙江金华\t726388842\t3/19/80\t女\t2015/3/25\t高中\t54893.79\t5\r\n广东\t广东惠州\t17251572\t4/22/71\t女\t2004/8/13\t大专\t54871.76\t2\r\n福建\t福建泉州\t465064702\t2/9/71\t男\t2012/5/18\t中专\t54857.77\t8\r\n吉林\t吉林通化\t591047882\t3/13/71\t女\t2013/12/13\t本科\t54854\t9\r\n江苏\t江苏连云港\t5202687492\t2/17/83\t男\t2016/8/2\t高中\t54843.5\t11\r\n山东\t山东滨州\t443880462\t5/12/72\t男\t2011/11/14\t中专\t54840.55\t5\r\n四川\t四川高新\t526358792\t4/3/82\t女\t2013/6/3\t本科\t54835.99\t1\r\n湖南\t湖南长沙\t558027272\t1/25/74\t女\t2013/6/27\t高中\t54823.01\t4\r\n福建\t福建福州\t756134072\t1/30/93\t男\t2015/5/22\t本科\t54818\t2\r\n广西\t广西梧州\t548791752\t1/5/68\t女\t2013/6/25\t高中\t54811\t3\r\n苏州\t苏州昆山\t5028339512\t1/24/74\t女\t2015/11/24\t高中\t54810\t2\r\n四川\t四川青羊\t5175039792\t2/22/86\t女\t2016/6/17\t本科\t54804\t3\r\n深圳\t深圳罗湖\t864746712\t6/6/82\t女\t2015/8/28\t本科\t54794.36\t13\r\n江苏\t江苏泰州\t5173538542\t11/11/74\t男\t2016/6/16\t高中\t54780\t3\r\n青岛\t青岛一支\t627002782\t11/8/79\t女\t2014/5/6\t本科\t54777.11\t5\r\n四川\t四川高新\t104762\t2/16/74\t女\t2001/12/30\t大专\t54772.74\t7\r\n北京\t北京海淀\t571420112\t7/5/89\t男\t2013/7/31\t大专\t54762\t7\r\n北京\t北京平谷\t404084502\t3/8/74\t女\t2010/11/12\t高中\t54742.1\t7\r\n四川\t四川高新\t125647052\t7/30/72\t女\t2007/3/23\t大专\t54705.65\t12\r\n河南\t河南郑州\t495765552\t8/14/75\t女\t2012/12/28\t大专\t54704.55\t9\r\n福建\t福建福州\t157908412\t1/9/77\t女\t2007/8/17\t高中\t54693.92\t8\r\n河南\t河南洛阳\t5216854962\t12/19/80\t女\t2016/8/16\t大专\t54689\t11\r\n云南\t云南昆明\t149685602\t6/12/76\t女\t2007/7/1\t大专\t54683.1\t4\r\n广东\t广东广州\t2898642\t8/8/67\t女\t2003/3/1\t本科\t54681.58\t5\r\n重庆\t重庆涪陵\t5203389132\t6/3/74\t女\t2016/8/3\t大专\t54676.5\t19\r\n贵州\t贵州贵阳\t5081033152\t6/30/79\t男\t2016/3/8\t大专\t54672\t17\r\n苏州\t苏州张家港\t783871602\t11/9/66\t女\t2015/7/8\t本科\t54664\t14\r\n山西\t山西忻州\t730909602\t10/21/85\t女\t2015/3/30\t高中\t54662\t8\r\n山东\t山东威海\t532090032\t2/26/73\t女\t2013/6/9\t高中\t54656.7\t13\r\n四川\t四川高新\t668376702\t9/7/85\t女\t2014/9/11\t大专\t54653.82\t11\r\n河北\t河北廊坊\t81389092\t12/11/63\t男\t2006/4/5\t中专\t54648.1\t12\r\n福建\t福建福州\t5051083762\t9/9/84\t女\t2015/12/23\t大专\t54640\t8\r\n浙江\t浙江嘉兴\t676935592\t2/28/84\t女\t2014/10/11\t大专\t54639.8\t10\r\n山东\t山东日照\t834017532\t7/11/75\t男\t2015/8/7\t中专\t54631\t8\r\n佛山\t佛山顺德龙江\t5053502392\t11/20/83\t女\t2015/12/28\t大专\t54625.5\t9\r\n宁波\t宁波城区\t5091864542\t12/20/79\t女\t2016/3/14\t大专\t54610\t3\r\n山东\t山东潍坊\t385660642\t11/12/68\t男\t2010/7/9\t中专\t54589.75\t8\r\n辽宁\t辽宁沈阳\t416833512\t6/9/77\t女\t2011/3/4\t大专\t54578\t4\r\n青岛\t青岛开发区\t672350632\t1/22/86\t女\t2014/9/24\t本科\t54573\t11\r\n广西\t广西玉林\t579756942\t10/4/65\t女\t2013/9/26\t高中\t54573\t2\r\n山东\t山东临沂\t5205926572\t7/27/76\t女\t2016/8/5\t高中\t54544.5\t13\r\n上海\t上海黄浦\t863714882\t3/16/80\t女\t2015/8/26\t高中\t54539\t2\r\n贵州\t贵州贵阳\t5193773462\t6/13/78\t男\t2016/7/27\t中专\t54534.8\t11\r\n湖北\t湖北荆州\t403039692\t1/28/72\t女\t2010/11/3\t高中\t54521\t11\r\n河南\t河南驻马店\t177402342\t12/25/73\t女\t2007/11/7\t中专\t54519.74\t11\r\n山东\t山东东营\t802141102\t8/20/85\t女\t2015/7/25\t中专\t54512.9\t7\r\n北京\t北京海淀\t474910552\t8/20/89\t男\t2012/8/16\t本科\t54510.5\t5\r\n山西\t山西朔州\t5149914022\t2/10/75\t女\t2016/5/27\t高中\t54508.5\t16\r\n湖北\t湖北十堰\t5122803942\t11/17/77\t女\t2016/4/16\t中专\t54507\t8\r\n湖北\t湖北十堰\t5192771752\t11/8/81\t女\t2016/7/26\t高中\t54503.5\t13\r\n浙江\t浙江湖州\t5030752742\t3/26/83\t女\t2015/11/25\t本科\t54500.6\t3\r\n四川\t四川高新\t688555772\t1/8/81\t女\t2014/12/3\t大专\t54499.8\t13\r\n四川\t四川绵阳\t5173114262\t11/12/82\t女\t2016/6/16\t大专\t54485\t7\r\n北京\t北京海淀\t5081218082\t7/20/91\t男\t2016/3/8\t大专\t54478.6\t2\r\n大连\t大连明锐\t5162599282\t4/7/80\t女\t2016/6/6\t中专\t54473\t11\r\n河南\t河南南阳\t12613022\t7/16/75\t女\t2004/4/15\t大专\t54472.5\t7\r\n浙江\t浙江杭州\t813224362\t8/21/66\t男\t2015/7/30\t高中\t54469.5\t11\r\n江西\t江西吉安\t5152201242\t1/9/86\t女\t2016/5/29\t高中\t54450\t2\r\n河北\t河北唐山\t5195037162\t1/14/85\t女\t2016/7/28\t中专\t54426\t11\r\n黑龙江\t黑龙江佳木斯\t5126521652\t8/30/73\t女\t2016/4/22\t高中\t54407\t10\r\n黑龙江\t黑龙江黑河\t450841572\t2/26/77\t女\t2012/1/5\t中专\t54397.22\t2\r\n四川\t四川青羊\t5190385732\t7/21/83\t女\t2016/7/20\t本科\t54394.5\t13\r\n山东\t山东济南\t5225942\t1/9/59\t女\t2003/7/1\t中专\t54388.86\t0\r\n湖北\t湖北黄石\t363905982\t12/17/69\t女\t2010/3/15\t高中\t54388.69\t16\r\n山东\t山东德州\t581326392\t6/30/76\t女\t2013/10/22\t中专\t54374.7\t3\r\n深圳\t深圳罗湖\t5209074052\t12/8/89\t男\t2016/8/8\t本科\t54371\t11\r\n黑龙江\t黑龙江佳木斯\t523542722\t11/22/75\t女\t2013/5/27\t中专\t54363.05\t1\r\n福建\t福建福州\t669651382\t6/23/72\t女\t2014/9/17\t高中\t54360.31\t7\r\n北京\t北京海淀\t621650062\t2/28/90\t男\t2014/4/1\t高中\t54360\t10\r\n江苏\t江苏南京\t521129032\t10/20/85\t女\t2013/5/20\t中专\t54347.3\t11\r\n四川\t四川绵阳\t5185035292\t10/8/73\t女\t2016/6/29\t大专\t54337\t12\r\n辽宁\t辽宁营口\t5015164752\t7/15/85\t女\t2015/11/10\t本科\t54335\t8\r\n苏州\t苏州新区\t289187652\t4/12/72\t女\t2009/3/25\t本科\t54329.82\t10\r\n天津\t天津市区一支\t415006562\t2/14/79\t女\t2011/1/27\t本科\t54310.97\t5\r\n河北\t河北承德\t5198230962\t9/28/69\t女\t2016/8/1\t中专\t54305.9\t7\r\n河南\t河南南阳\t5015185592\t3/12/69\t女\t2015/11/10\t高中\t54299\t4\r\n广东\t广东汕头\t511686532\t5/20/65\t女\t2013/3/28\t初中\t54286.03\t6\r\n河北\t河北石家庄\t681000382\t12/4/80\t女\t2014/11/10\t大专\t54278\t6\r\n青岛\t青岛一支\t759071702\t9/16/82\t女\t2015/5/30\t本科\t54274.5\t2\r\n辽宁\t辽宁营口\t5143892822\t2/15/77\t女\t2016/5/21\t高中\t54270\t2\r\n重庆\t重庆永川\t5179381182\t11/24/86\t女\t2016/6/21\t大专\t54264\t7\r\n湖北\t湖北武汉\t432722392\t10/5/80\t女\t2011/8/1\t高中\t54260.1\t15\r\n湖北\t湖北襄阳\t5018178052\t3/7/75\t女\t2015/11/13\t高中\t54254\t14\r\n河北\t河北廊坊\t494869662\t8/12/78\t女\t2012/12/25\t本科\t54240.64\t4\r\n山东\t山东临沂\t861991772\t5/1/63\t男\t2015/8/21\t中专\t54233\t5\r\n河北\t河北沧州\t401766412\t1/24/76\t男\t2010/10/25\t高中\t54223\t10\r\n山东\t山东济南\t651570442\t7/29/81\t女\t2014/8/5\t高中\t54211.1\t11\r\n山东\t山东济南\t5169258772\t7/4/81\t女\t2016/6/13\t本科\t54204.5\t13\r\n黑龙江\t黑龙江哈尔滨\t19488712\t7/12/64\t女\t2004/10/1\t大专\t54193.23\t14\r\n四川\t四川青羊\t4628592\t10/5/58\t女\t2003/6/11\t高中\t54180.82\t0\r\n四川\t四川青羊\t5179862582\t10/3/74\t女\t2016/6/22\t高中\t54177\t14\r\n天津\t天津市区二支\t854273782\t3/15/61\t女\t2015/8/10\t高中\t54176.5\t5\r\n苏州\t苏州新区\t5145180062\t10/14/78\t男\t2016/5/24\t大专\t54175\t5\r\n四川\t四川高新\t5041592232\t11/18/88\t男\t2015/12/4\t硕士\t54172.6\t2\r\n四川\t四川雅安\t18505732\t7/21/69\t女\t2004/9/1\t本科\t54161.6\t10\r\n深圳\t深圳福田\t849444302\t8/21/89\t女\t2015/8/10\t本科\t54156.1\t2\r\n上海\t上海陆家嘴\t5213469932\t9/15/82\t女\t2016/8/11\t本科\t54155.5\t5\r\n四川\t四川高新\t837804302\t8/31/75\t男\t2015/8/8\t本科\t54154.5\t10\r\n江西\t江西宜春\t5002570122\t1/16/85\t女\t2015/10/19\t本科\t54153\t13\r\n四川\t四川青羊\t5193665592\t9/14/87\t女\t2016/7/27\t本科\t54139\t10\r\n陕西\t陕西汉中\t5156054032\t10/20/71\t女\t2016/5/31\t大专\t54134\t13\r\n湖北\t湖北十堰\t388899882\t8/19/70\t女\t2010/8/1\t大专\t54130.27\t12\r\n深圳\t深圳南山\t5184790542\t9/24/82\t女\t2016/6/28\t中专\t54110\t8\r\n黑龙江\t黑龙江哈尔滨\t223906652\t7/21/64\t女\t2008/5/16\t大专\t54109.2\t11\r\n深圳\t深圳罗湖\t5141693532\t9/6/77\t男\t2016/5/18\t本科\t54106\t5\r\n山东\t山东日照\t63860422\t12/29/70\t女\t2005/10/31\t高中\t54105.16\t9\r\n青岛\t青岛一支\t5209126672\t3/28/63\t女\t2016/8/8\t大专\t54105\t10\r\n山东\t山东淄博\t272962692\t5/9/70\t女\t2008/12/25\t大专\t54074.86\t5\r\n苏州\t苏州昆山\t5154307132\t7/12/76\t女\t2016/5/31\t大专\t54064\t4\r\n湖南\t湖南永州\t421507932\t5/23/84\t女\t2011/4/16\t高中\t54061.91\t10\r\n甘肃\t甘肃兰州\t793285072\t10/13/78\t女\t2015/7/17\t高中\t54052.18\t2\r\n苏州\t苏州昆山\t5204827862\t6/10/83\t女\t2016/8/4\t硕士\t54048.5\t16\r\n江西\t江西南昌\t93951912\t2/13/64\t女\t2006/8/21\t高中\t54026.72\t3\r\n天津\t天津市区一支\t834409302\t1/2/83\t女\t2015/8/7\t高中\t54013.5\t5\r\n山东\t山东泰安\t486560462\t4/5/69\t女\t2012/11/30\t大专\t54013.26\t0\r\n上海\t上海陆家嘴\t5066650912\t12/11/80\t男\t2016/2/17\t中技\t54012.5\t4\r\n青岛\t青岛一支\t740909812\t5/23/76\t女\t2015/4/10\t硕士\t54010\t10\r\n湖北\t湖北武汉\t5236946632\t10/15/63\t男\t2016/9/20\t本科\t54010\t4\r\n浙江\t浙江杭州\t5199474722\t6/27/81\t女\t2016/8/1\t本科\t53990\t14\r\n广西\t广西柳州\t604752242\t12/7/80\t女\t2014/1/8\t大专\t53983.5\t15\r\n四川\t四川青羊\t556328722\t3/20/77\t女\t2013/6/27\t高中\t53968.95\t9\r\n河北\t河北石家庄\t67378382\t6/18/78\t女\t2005/11/29\t中专\t53967.25\t1\r\n山东\t山东滨州\t5207030752\t9/1/69\t男\t2016/8/5\t中专\t53966.7\t11\r\n广东\t广东东莞\t5187729552\t4/26/75\t女\t2016/7/7\t大专\t53949.4\t10\r\n安徽\t安徽合肥\t5194842262\t3/10/87\t男\t2016/7/28\t高中\t53946.5\t8\r\n山西\t山西朔州\t5185889252\t9/3/67\t男\t2016/6/30\t高中\t53932.1\t6\r\n浙江\t浙江金华\t5198744972\t3/10/74\t男\t2016/8/1\t高中\t53915.5\t14\r\n山东\t山东济南\t685055262\t2/15/81\t女\t2014/11/19\t中专\t53904\t11\r\n河南\t河南南阳\t186924392\t12/9/63\t女\t2007/12/4\t大专\t53891.27\t11\r\n安徽\t安徽合肥\t99953632\t10/29/75\t女\t2006/10/1\t中专\t53878.24\t9\r\n安徽\t安徽滁州\t150305842\t4/8/64\t女\t2007/7/1\t高中\t53870.73\t8\r\n四川\t四川青羊\t5173414332\t8/23/88\t女\t2016/6/16\t高中\t53868\t10\r\n广东\t广东广州\t5177994172\t10/5/80\t女\t2016/6/21\t高中\t53867.6\t7\r\n辽宁\t辽宁沈阳\t646011712\t1/5/75\t男\t2014/7/11\t本科\t53859\t6\r\n浙江\t浙江温州\t5129824152\t5/18/83\t男\t2016/4/28\t大专\t53857.8\t10\r\n四川\t四川青羊\t478678202\t6/20/89\t女\t2012/9/24\t大专\t53838.6\t11\r\n山东\t山东临沂\t5183182322\t7/18/75\t男\t2016/6/25\t高中\t53834.1\t10\r\n佛山\t佛山顺德龙江\t90293272\t5/22/76\t女\t2006/6/30\t中专\t53828.39\t9\r\n山西\t山西阳泉\t327932662\t5/17/79\t女\t2009/8/26\t中专\t53813.82\t0\r\n云南\t云南昆明\t5117780782\t12/4/77\t男\t2016/4/7\t大专\t53807\t2\r\n黑龙江\t黑龙江哈尔滨\t287273612\t8/11/73\t女\t2009/3/24\t中专\t53802.7\t6\r\n苏州\t苏州新区\t5094944032\t12/8/77\t女\t2016/3/15\t中专\t53796.5\t4\r\n广东\t广东惠州\t225693962\t12/25/78\t女\t2008/5/23\t本科\t53787.51\t3\r\n黑龙江\t黑龙江哈尔滨\t5214256802\t8/14/78\t男\t2016/8/12\t本科\t53773.6\t16\r\n四川\t四川乐山\t5212482692\t7/20/64\t女\t2016/8/10\t高中\t53761.5\t9\r\n湖北\t湖北武汉\t439492572\t7/30/79\t女\t2011/9/24\t大专\t53761.38\t6\r\n河南\t河南安阳\t284234512\t8/16/76\t女\t2009/3/11\t高中\t53747.99\t5\r\n云南\t云南昆明\t466423402\t10/28/79\t女\t2012/6/1\t本科\t53744.04\t0\r\n广西\t广西贵港\t483309912\t11/14/74\t女\t2012/11/16\t大专\t53729.74\t13\r\n北京\t北京良乡\t221187582\t7/18/81\t女\t2008/5/5\t大专\t53717.72\t6\r\n四川\t四川绵阳\t54601042\t12/8/74\t女\t2005/8/10\t高中\t53716.46\t5\r\n青岛\t青岛城阳\t5221240802\t8/4/70\t女\t2016/8/22\t大专\t53709\t7\r\n山东\t山东淄博\t5040685722\t8/6/94\t女\t2015/12/2\t高中\t53707\t2\r\n山东\t山东济南\t5066951882\t9/2/84\t男\t2016/2/19\t大专\t53700\t2\r\n浙江\t浙江温州\t119327672\t3/18/85\t女\t2007/2/6\t大专\t53698.78\t5\r\n辽宁\t辽宁营口\t5137812632\t7/19/75\t女\t2016/5/12\t本科\t53690\t1\r\n辽宁\t辽宁丹东\t627933842\t5/6/74\t女\t2014/5/12\t中专\t53675.44\t7\r\n辽宁\t辽宁营口\t5012784132\t5/8/79\t女\t2015/11/8\t大专\t53662.9\t8\r\n广西\t广西玉林\t638690932\t7/8/77\t女\t2014/6/19\t中专\t53660\t13\r\n重庆\t重庆永川\t5063942112\t3/22/76\t女\t2016/1/30\t高中\t53647\t20\r\n福建\t福建福州\t616617642\t10/23/77\t女\t2014/3/21\t中专\t53621.25\t3\r\n四川\t四川成都\t5230106782\t4/10/67\t女\t2016/9/5\t高中\t53620\t5\r\n浙江\t浙江衢州\t650372942\t1/4/65\t女\t2014/8/1\t高中\t53614.5\t4\r\n佛山\t佛山顺德龙江\t417754662\t2/18/82\t女\t2011/3/15\t大专\t53610.5\t10\r\n浙江\t浙江杭州\t427626472\t5/15/78\t女\t2011/6/21\t高中\t53609.69\t6\r\n黑龙江\t黑龙江哈尔滨\t602157802\t12/28/75\t女\t2013/12/31\t大专\t53601.69\t12\r\n海南\t海南海口\t5187426782\t6/23/71\t女\t2016/7/6\t高中\t53596.8\t8\r\n天津\t天津市区二支\t119580432\t12/30/61\t男\t2007/2/9\t高中\t53586.43\t6\r\n广东\t广东广州\t691765982\t9/7/82\t男\t2014/12/17\t大专\t53582.5\t3\r\n山东\t山东烟台\t477288102\t10/7/81\t女\t2012/9/5\t初中\t53581.8\t9\r\n山东\t山东烟台\t225906112\t10/13/64\t女\t2008/5/23\t高中\t53580.43\t17\r\n云南\t云南昆明\t530241862\t10/3/77\t女\t2013/6/8\t大专\t53580.25\t9\r\n北京\t北京海淀\t444401332\t6/23/89\t女\t2011/11/22\t大专\t53578.4\t11\r\n河北\t河北石家庄\t815821172\t5/17/60\t女\t2015/7/30\t中专\t53570\t4\r\n四川\t四川宜宾\t394178222\t8/22/75\t女\t2010/9/3\t中专\t53562\t7\r\n河南\t河南郑州\t5161663762\t2/21/66\t女\t2016/6/3\t本科\t53560\t3\r\n深圳\t深圳宝安\t127624592\t4/8/68\t女\t2007/4/1\t大专\t53544.8\t2\r\n安徽\t安徽滁州\t5201279642\t11/28/82\t女\t2016/8/2\t高中\t53538.8\t9\r\n山西\t山西晋中\t647362872\t10/1/67\t男\t2014/7/24\t中专\t53514.05\t4\r\n河南\t河南三门峡\t5207132252\t6/13/68\t女\t2016/8/6\t高中\t53508\t6\r\n四川\t四川绵阳\t300385362\t2/19/82\t女\t2009/5/18\t本科\t53503.27\t6\r\n苏州\t苏州姑苏\t660101972\t11/14/72\t女\t2014/8/22\t高中\t53498.42\t5\r\n四川\t四川绵阳\t86499662\t2/19/68\t女\t2006/6/5\t大专\t53497.36\t4\r\n北京\t北京海淀\t589805032\t9/25/89\t女\t2013/12/9\t本科\t53495.05\t7\r\n湖北\t湖北襄阳\t106268542\t5/18/66\t女\t2006/12/6\t高中\t53494.24\t11\r\n四川\t四川成都\t70403802\t7/2/71\t女\t2005/12/23\t高中\t53485.25\t6\r\n云南\t云南昆明\t297223302\t2/28/76\t女\t2009/5/5\t本科\t53477.34\t3\r\n辽宁\t辽宁葫芦岛\t117479232\t8/22/78\t女\t2007/1/25\t高中\t53468.67\t6\r\n山东\t山东济南\t345347582\t10/25/77\t女\t2009/11/25\t大专\t53459.88\t8\r\n湖南\t湖南长沙\t139908422\t12/25/75\t女\t2007/7/1\t大专\t53458.35\t4\r\n黑龙江\t黑龙江哈尔滨\t5202153542\t3/20/69\t女\t2016/8/2\t大专\t53454.5\t18\r\n云南\t云南红河\t5048745792\t7/17/88\t男\t2015/12/20\t本科\t53450.4\t6\r\n湖南\t湖南长沙\t5113100272\t6/1/75\t男\t2016/3/28\t高中\t53441.2\t6\r\n辽宁\t辽宁葫芦岛\t46644942\t4/4/65\t女\t2005/6/9\t高中\t53438.6\t9\r\n新疆\t新疆昌吉\t818963412\t5/8/73\t女\t2015/7/31\t高中\t53434.5\t15\r\n浙江\t浙江杭州\t667648852\t7/19/68\t女\t2014/9/9\t高中\t53424\t6\r\n重庆\t重庆巴南\t261620532\t7/6/69\t男\t2008/11/6\t大专\t53413.57\t10\r\n河南\t河南周口\t37737692\t1/19/70\t女\t2005/4/1\t大专\t53406\t6\r\n四川\t四川青羊\t5017695822\t9/4/84\t男\t2015/11/13\t大专\t53386\t7\r\n大连\t大连明锐\t831758202\t8/10/78\t女\t2015/8/6\t大专\t53383\t5\r\n湖北\t湖北随州\t5216196802\t9/23/69\t男\t2016/8/15\t大专\t53382.6\t18\r\n湖北\t湖北武汉\t222599872\t8/12/78\t女\t2008/5/10\t大专\t53378.34\t14\r\n山东\t山东烟台\t500686592\t10/19/68\t女\t2013/1/23\t高中\t53373.64\t9\r\n湖北\t湖北武汉\t5149223252\t7/23/77\t女\t2016/5/27\t高中\t53347.5\t10\r\n江苏\t江苏无锡\t790538642\t4/30/83\t女\t2015/7/15\t高中\t53345\t8\r\n福建\t福建泉州\t5002277322\t6/17/85\t女\t2015/10/17\t高中\t53339.7\t12\r\n云南\t云南昆明\t5169539802\t10/15/87\t女\t2016/6/13\t本科\t53334\t10\r\n江苏\t江苏无锡\t481456032\t11/28/83\t女\t2012/10/26\t大专\t53324.43\t2\r\n佛山\t佛山顺德龙江\t875158512\t3/16/87\t女\t2015/9/21\t高中\t53314.8\t11\r\n四川\t四川巴中\t402966282\t4/23/63\t女\t2010/11/2\t大专\t53312.9\t9\r\n青岛\t青岛即墨\t148098432\t7/28/69\t女\t2007/7/10\t中专\t53308.77\t4\r\n大连\t大连海川\t5153319962\t9/10/83\t女\t2016/5/30\t中专\t53300\t4\r\n贵州\t贵州贵阳\t5149571372\t6/24/69\t女\t2016/5/27\t大专\t53291\t9\r\n深圳\t深圳罗湖\t5063085452\t9/30/83\t女\t2016/1/26\t本科\t53286.5\t9\r\n四川\t四川青羊\t71751892\t7/29/70\t女\t2005/12/30\t大专\t53277.19\t8\r\n陕西\t陕西西安\t501993372\t5/17/77\t女\t2013/1/30\t中专\t53272.51\t5\r\n苏州\t苏州新区\t5095087282\t1/25/80\t女\t2016/3/15\t大专\t53269.5\t7\r\n广东\t广东广州\t637343542\t2/18/77\t女\t2014/6/16\t大专\t53266.98\t9\r\n浙江\t浙江温州\t725092672\t6/4/71\t女\t2015/3/25\t高中\t53263\t5\r\n广西\t广西南宁\t5005439342\t8/13/75\t男\t2015/10/26\t本科\t53259\t8\r\n宁波\t宁波城区\t439165702\t11/10/72\t男\t2011/9/23\t大专\t53249\t6\r\n天津\t天津市区二支\t490889592\t10/7/60\t女\t2012/12/18\t大专\t53243.23\t4\r\n云南\t云南昆明\t835128912\t4/25/91\t男\t2015/8/7\t高中\t53232.5\t6\r\n河北\t河北沧州\t5190880702\t10/21/81\t男\t2016/7/22\t高中\t53230\t4\r\n深圳\t深圳福田第二\t5007294112\t10/8/84\t女\t2015/10/30\t大专\t53229.5\t10\r\n安徽\t安徽合肥\t30295352\t6/27/54\t女\t2005/1/1\t大专\t53195.75\t5\r\n黑龙江\t黑龙江牡丹江\t255264312\t9/18/74\t女\t2008/10/6\t高中\t53187.5\t11\r\n浙江\t浙江金华\t5220137522\t10/29/73\t女\t2016/8/19\t高中\t53186\t3\r\n大连\t大连明锐\t5151274792\t11/14/84\t男\t2016/5/28\t大专\t53177.9\t1\r\n吉林\t吉林长春\t157629692\t8/3/49\t女\t2007/8/15\t初中\t53177.77\t10\r\n黑龙江\t黑龙江牡丹江\t599815152\t2/17/82\t女\t2013/12/28\t大专\t53164\t1\r\n浙江\t浙江金华\t490397752\t10/3/64\t女\t2012/12/17\t高中\t53163.5\t6\r\n江西\t江西上饶\t248717162\t4/23/71\t女\t2008/9/1\t大专\t53155.56\t3\r\n湖北\t湖北荆州\t5070498232\t10/4/82\t女\t2016/3/1\t高中\t53136\t7\r\n江苏\t江苏南京\t21051322\t6/4/61\t女\t2004/10/19\t大专\t53132.47\t10\r\n河北\t河北邢台\t276066692\t9/10/60\t女\t2009/1/6\t高中\t53118.62\t9\r\n四川\t四川乐山\t15182472\t4/4/69\t女\t2004/6/29\t高中\t53108.24\t22\r\n河南\t河南南阳\t132815142\t12/5/73\t女\t2007/4/25\t高中\t53085.65\t9\r\n广东\t广东广州\t5160230502\t2/18/75\t女\t2016/6/3\t高中\t53085.5\t13\r\n江西\t江西吉安\t231701822\t11/13/74\t女\t2008/6/18\t本科\t53084.18\t3\r\n广东\t广东东莞\t500590292\t11/19/85\t女\t2013/1/23\t中专\t53074.8\t4\r\n河南\t河南郑州\t444385282\t8/21/79\t男\t2011/11/22\t大专\t53070.05\t7\r\n四川\t四川乐山\t291843222\t9/7/69\t女\t2009/4/9\t初中\t53056.07\t8\r\n甘肃\t甘肃兰州\t635948972\t10/12/83\t女\t2014/6/12\t大专\t53055.05\t4\r\n湖南\t湖南娄底\t749994042\t4/26/68\t女\t2015/4/28\t大专\t53035\t7\r\n湖北\t湖北十堰\t5064029142\t3/5/72\t女\t2016/1/30\t高中\t53034.8\t9\r\n广东\t广东广州\t5092237102\t6/27/94\t女\t2016/3/14\t大专\t53025.5\t4\r\n黑龙江\t黑龙江大庆\t220943062\t9/2/70\t女\t2008/5/4\t高中\t53023.08\t11\r\n江西\t江西南昌\t263167092\t3/21/74\t女\t2008/11/14\t大专\t53022.84\t6\r\n江西\t江西景德镇\t763900212\t6/22/80\t女\t2015/6/12\t中专\t53022.74\t7\r\n河北\t河北石家庄\t711128442\t9/27/68\t女\t2015/3/5\t大专\t53019\t7\r\n四川\t四川青羊\t679922\t12/13/68\t女\t2002/3/1\t高中\t53016.2\t5\r\n青岛\t青岛开发区\t664923642\t8/6/85\t女\t2014/8/30\t中专\t53013.38\t0\r\n陕西\t陕西渭南\t427935892\t5/5/86\t女\t2011/6/23\t本科\t53013.23\t8\r\n山西\t山西忻州\t661300172\t10/22/84\t女\t2014/8/25\t高中\t53013.11\t0\r\n浙江\t浙江温州\t648775862\t2/20/79\t女\t2014/7/29\t本科\t53013.05\t0\r\n苏州\t苏州昆山\t5092258912\t9/10/80\t女\t2016/3/14\t大专\t53009.1\t6\r\n山东\t山东烟台\t5080095832\t3/3/69\t女\t2016/3/8\t高中\t53002\t8\r\n广东\t广东中山\t664553092\t11/29/69\t男\t2014/8/29\t高中\t53000\t0\r\n山西\t山西太原\t298102442\t2/10/72\t女\t2009/5/8\t大专\t52989.32\t8\r\n苏州\t苏州张家港\t5188777512\t4/9/80\t男\t2016/7/14\t大专\t52988.3\t12\r\n吉林\t吉林吉林\t683677442\t9/19/69\t女\t2014/11/18\t大专\t52986\t8\r\n江西\t江西南昌\t5030182512\t3/4/83\t女\t2015/11/25\t高中\t52950\t8\r\n湖北\t湖北武汉\t852899732\t11/3/79\t男\t2015/8/10\t中专\t52949\t7\r\n福建\t福建泉州\t151680592\t2/28/81\t女\t2007/7/23\t高中\t52940.39\t7\r\n山东\t山东滨州\t648737622\t5/6/83\t男\t2014/7/29\t高中\t52938.03\t6\r\n宁波\t宁波象山\t593918942\t3/11/89\t女\t2013/12/20\t大专\t52936.17\t18\r\n山东\t山东菏泽\t345869152\t1/9/68\t女\t2009/11/25\t大专\t52934.43\t15\r\n江西\t江西南昌\t61636262\t11/27/63\t女\t2005/9/1\t高中\t52930.56\t10\r\n湖北\t湖北随州\t190422532\t2/10/74\t男\t2007/12/10\t高中\t52926.52\t4\r\n大连\t大连明锐\t636382752\t10/29/90\t男\t2014/6/13\t大专\t52905\t5\r\n四川\t四川青羊\t5173985462\t12/20/78\t女\t2016/6/16\t大专\t52902.5\t5\r\n湖北\t湖北荆州\t5127331162\t7/4/82\t女\t2016/4/24\t中专\t52894\t15\r\n河南\t河南驻马店\t206539882\t5/6/63\t女\t2008/3/10\t高中\t52882.12\t16\r\n陕西\t陕西西安\t604179452\t12/20/68\t女\t2014/1/3\t硕士\t52861.92\t4\r\n四川\t四川青羊\t378508602\t11/20/76\t女\t2010/6/1\t本科\t52842.01\t9\r\n北京\t北京海淀\t367947882\t4/10/88 1:00\t男\t2010/4/1\t高中\t52838.1\t8\r\n大连\t大连海川\t5573332\t10/5/58\t女\t2003/7/1\t高中\t52804.79\t2\r\n湖南\t湖南永州\t805544612\t12/25/85\t女\t2015/7/27\t高中\t52804\t4\r\n江西\t江西吉安\t5005203662\t6/19/87\t女\t2015/10/25\t高中\t52800\t3\r\n福建\t福建福州\t100139122\t7/5/70\t女\t2006/10/8\t高中\t52793.56\t12\r\n广西\t广西南宁\t5161941122\t2/8/72\t女\t2016/6/4\t高中\t52786.5\t6\r\n福建\t福建福州\t5180057482\t4/12/78\t女\t2016/6/22\t大专\t52784\t10\r\n山东\t山东潍坊\t207323422\t3/2/67\t女\t2008/3/14\t高中\t52783.9\t1\r\n佛山\t佛山顺德龙江\t512358692\t12/17/84\t女\t2013/3/29\t大专\t52779.49\t6\r\n大连\t大连开发区\t551302172\t3/4/80\t女\t2013/6/25\t高中\t52777.98\t6\r\n四川\t四川内江\t5041758122\t12/10/69\t女\t2015/12/4\t高中\t52774.88\t13\r\n四川\t四川高新\t5230505652\t8/12/79\t女\t2016/9/6\t大专\t52774\t7\r\n重庆\t重庆渝中\t5152844932\t4/28/87\t女\t2016/5/30\t大专\t52768.3\t13\r\n深圳\t深圳福田\t595083642\t10/15/75\t男\t2013/12/23\t大专\t52767.47\t4\r\n江西\t江西赣州\t770296072\t1/6/81\t女\t2015/6/24\t高中\t52762.5\t8\r\n山东\t山东烟台\t776731842\t1/3/83\t女\t2015/6/29\t大专\t52740\t1\r\n福建\t福建泉州\t238889732\t9/3/76\t男\t2008/7/1\t中专\t52736.99\t5\r\n湖北\t湖北武汉\t5018085622\t4/27/80\t男\t2015/11/13\t本科\t52727.5\t15\r\n四川\t四川高新\t604730052\t4/14/82\t女\t2014/1/8\t大专\t52722.7\t0\r\n山东\t山东济南\t658634692\t9/29/80\t男\t2014/8/19\t大专\t52712.8\t8\r\n青岛\t青岛城阳\t5129941092\t1/4/89\t女\t2016/4/28\t大专\t52710\t5\r\n辽宁\t辽宁营口\t73062442\t5/5/73\t女\t2006/1/4\t大专\t52709.2\t13\r\n重庆\t重庆巴南\t5111674282\t5/12/93\t女\t2016/3/25\t高中\t52704.2\t8\r\n苏州\t苏州昆山\t846325922\t12/24/80\t女\t2015/8/10\t本科\t52703.5\t9\r\n浙江\t浙江杭州\t5019071962\t4/25/88\t女\t2015/11/15\t大专\t52700\t2\r\n重庆\t重庆渝中\t728321032\t4/28/85\t女\t2015/3/26\t本科\t52696.3\t16\r\n四川\t四川高新\t752040252\t6/28/78\t女\t2015/5/5\t大专\t52688\t1\r\n上海\t上海陆家嘴\t724681782\t1/10/73\t男\t2015/3/25\t大专\t52675.7\t7\r\n山东\t山东泰安\t693855602\t10/15/88\t女\t2014/12/20\t中专\t52670.6\t3\r\n山东\t山东临沂\t675845702\t3/21/83\t女\t2014/10/6\t高中\t52664.93\t12\r\n广东\t广东广州\t670467022\t10/10/86\t女\t2014/9/19\t高中\t52661\t5\r\n河北\t河北石家庄\t5197507512\t4/16/82\t女\t2016/7/30\t大专\t52660\t13\r\n四川\t四川绵阳\t219473682\t9/28/64\t女\t2008/4/25\t大专\t52642.95\t7\r\n山东\t山东济宁\t649313482\t8/15/67\t女\t2014/7/30\t本科\t52640.97\t2\r\n宁波\t宁波宁海\t500358052\t8/23/83\t女\t2013/1/21\t高中\t52638.11\t6\r\n陕西\t陕西宝鸡\t239726862\t3/1/80\t女\t2008/7/10\t大专\t52617.17\t12\r\n重庆\t重庆渝中\t5201756472\t1/27/87\t女\t2016/8/2\t本科\t52585\t15\r\n苏州\t苏州新区\t521961692\t4/24/81\t女\t2013/5/23\t中专\t52585\t8\r\n河北\t河北秦皇岛\t525416152\t7/6/55\t男\t2013/5/31\t大专\t52582.61\t0\r\n浙江\t浙江金华\t5044081622\t8/9/75\t女\t2015/12/10\t高中\t52581\t7\r\n云南\t云南昆明\t5235313972\t12/16/87\t女\t2016/9/19\t中专\t52578\t1\r\n江西\t江西南昌\t5176744042\t6/22/87\t男\t2016/6/20\t高中\t52577\t8\r\n吉林\t吉林松原\t5142229282\t6/4/82\t女\t2016/5/19\t本科\t52573\t9\r\n海南\t海南三亚\t5196856622\t10/30/85\t女\t2016/7/29\t高中\t52564.14\t5\r\n浙江\t浙江舟山\t5050857082\t1/4/71\t女\t2015/12/22\t高中\t52560\t3\r\n山东\t山东威海\t5064278462\t11/17/83\t女\t2016/2/1\t硕士\t52559.5\t6\r\n山东\t山东威海\t258599852\t1/2/76\t女\t2008/10/23\t高中\t52545.35\t4\r\n江苏\t江苏无锡\t284395712\t12/13/77\t女\t2009/3/12\t大专\t52544.23\t6\r\n浙江\t浙江湖州\t5199737612\t9/10/81\t女\t2016/8/1\t高中\t52538.5\t14\r\n四川\t四川高新\t5153082412\t7/13/92\t男\t2016/5/30\t大专\t52534\t2\r\n大连\t大连海川\t744094762\t8/10/83\t女\t2015/4/11\t大专\t52533\t11\r\n青岛\t青岛一支\t5192198822\t11/4/79\t男\t2016/7/25\t大专\t52524\t3\r\n山东\t山东济南\t89234782\t2/14/76\t女\t2006/6/29\t大专\t52519.41\t10\r\n山东\t山东济宁\t43163552\t4/10/71\t女\t2005/5/16\t本科\t52512.59\t5\r\n浙江\t浙江绍兴\t360805752\t5/7/69\t女\t2010/2/9\t大专\t52509.37\t5\r\n河北\t河北唐山\t5145949762\t8/10/78\t男\t2016/5/25\t高中\t52500\t5\r\n浙江\t浙江嘉兴\t5134761182\t9/8/73\t女\t2016/5/6\t大专\t52500\t5\r\n湖北\t湖北随州\t877949322\t2/4/70\t女\t2015/9/24\t中专\t52500\t1\r\n河北\t河北邯郸\t5094227922\t5/28/84\t女\t2016/3/15\t高中\t52499\t10\r\n贵州\t贵州遵义\t707722832\t2/12/82\t女\t2015/2/2\t大专\t52496\t11\r\n广东\t广东清远\t827965292\t5/8/64\t女\t2015/8/4\t高中\t52482\t1\r\n广西\t广西柳州\t840754912\t5/31/81\t男\t2015/8/9\t高中\t52474\t9\r\n山东\t山东威海\t5122182962\t12/12/83\t女\t2016/4/15\t大专\t52470\t10\r\n湖北\t湖北武汉\t32710442\t12/25/79\t女\t2005/3/1\t大专\t52468.44\t6\r\n深圳\t深圳福田第二\t693684492\t4/28/73\t女\t2014/12/20\t本科\t52458.76\t6\r\n辽宁\t辽宁丹东\t614617212\t5/28/65\t女\t2014/3/17\t本科\t52453.82\t7\r\n四川\t四川成都\t193303502\t12/5/70\t女\t2007/12/24\t高中\t52453.5\t14\r\n广西\t广西百色\t637484922\t8/21/86\t女\t2014/6/17\t高中\t52444.9\t14\r\n辽宁\t辽宁锦州\t5141438812\t5/3/79\t女\t2016/5/18\t本科\t52429\t10\r\n河南\t河南焦作\t651137362\t10/18/86\t女\t2014/8/4\t大专\t52391.21\t1\r\n黑龙江\t黑龙江鹤岗\t490928532\t12/19/71\t女\t2012/12/18\t高中\t52388.32\t8\r\n山西\t山西临汾\t433203622\t7/26/70\t女\t2011/8/8\t大专\t52375.12\t5\r\n山东\t山东济南\t504727792\t10/10/81\t男\t2013/2/27\t本科\t52362.9\t10\r\n内蒙古\t内蒙古赤峰\t744840062\t3/11/66\t女\t2015/4/11\t中专\t52359\t5\r\n苏州\t苏州新区\t5208374212\t9/11/84\t女\t2016/8/8\t大专\t52358.6\t16\r\n四川\t四川青羊\t5195148702\t11/1/79\t女\t2016/7/28\t本科\t52358.4\t9\r\n苏州\t苏州张家港\t61844912\t11/29/64\t女\t2005/8/2\t高中\t52355.55\t7\r\n山东\t山东威海\t199074652\t1/26/75\t女\t2008/1/8\t大专\t52349.25\t6\r\n内蒙古\t内蒙古通辽\t5146005982\t1/5/70\t女\t2016/5/25\t高中\t52347.9\t7\r\n四川\t四川高新\t709614682\t12/24/81\t女\t2015/2/15\t本科\t52345\t1\r\n山东\t山东临沂\t5067900072\t11/14/87\t女\t2016/2/24\t中专\t52331.6\t22\r\n青岛\t青岛一支\t4686652\t12/12/69\t女\t2003/6/18\t大专\t52289\t9\r\n苏州\t苏州新区\t5075341932\t1/6/84\t女\t2016/3/4\t本科\t52286\t9\r\n北京\t北京海淀\t691012872\t12/26/78\t男\t2014/12/15\t大专\t52272.5\t9\r\n河南\t河南南阳\t328531412\t12/23/63\t女\t2009/8/31\t大专\t52264.08\t10\r\n四川\t四川高新\t5229992542\t4/12/83\t女\t2016/9/5\t本科\t52232.4\t7\r\n福建\t福建厦门\t5062505252\t6/4/87\t男\t2016/1/21\t大专\t52229.5\t10\r\n山东\t山东枣庄\t250609982\t6/25/70\t女\t2008/9/10\t中专\t52221.06\t8\r\n辽宁\t辽宁鞍山\t5020049162\t1/22/77\t女\t2015/11/16\t高中\t52211\t10\r\n江西\t江西赣州\t748000722\t7/10/85\t女\t2015/4/22\t中专\t52206\t21\r\n安徽\t安徽合肥\t22679802\t12/17/72\t女\t2004/11/1\t大专\t52201.37\t7\r\n四川\t四川成都\t5124940642\t3/15/81\t女\t2016/4/19\t大专\t52200.4\t4\r\n山东\t山东枣庄\t5199745782\t4/18/86\t女\t2016/8/1\t中专\t52195.6\t13\r\n深圳\t深圳福田第二\t733337672\t12/21/90\t男\t2015/4/1\t本科\t52180\t5\r\n青岛\t青岛一支\t5211371242\t12/25/74\t女\t2016/8/9\t大专\t52179.8\t11\r\n湖北\t湖北孝感\t5192682922\t12/15/80\t男\t2016/7/26\t高中\t52170\t17\r\n湖南\t湖南长沙\t214799262\t2/11/71\t女\t2008/4/7\t中专\t52161.43\t4\r\n湖南\t湖南长沙\t141280102\t8/23/77\t女\t2007/7/1\t本科\t52159.07\t4\r\n福建\t福建龙岩\t5080517342\t11/6/81\t女\t2016/3/8\t本科\t52153\t6\r\n四川\t四川高新\t631589142\t11/4/69\t女\t2014/5/28\t大专\t52145.2\t9\r\n吉林\t吉林长春\t5063924942\t4/2/79\t女\t2016/1/30\t本科\t52142.4\t1\r\n江西\t江西赣州\t5151876732\t3/16/77\t女\t2016/5/28\t高中\t52134.2\t11\r\n广西\t广西柳州\t5079596292\t10/22/74\t女\t2016/3/7\t高中\t52131\t3\r\n云南\t云南曲靖\t5229086932\t2/16/85\t女\t2016/9/2\t大专\t52120\t13\r\n河北\t河北石家庄\t643241422\t4/20/83\t女\t2014/6/26\t大专\t52114.5\t7\r\n江苏\t江苏南京\t5157393962\t1/22/95\t女\t2016/6/1\t本科\t52099\t11\r\n四川\t四川高新\t225139322\t3/2/78\t女\t2008/5/21\t大专\t52093.3\t10\r\n黑龙江\t黑龙江哈尔滨\t101281902\t1/7/71\t女\t2006/10/19\t大专\t52093.06\t9\r\n辽宁\t辽宁沈阳\t5546672\t9/19/60\t女\t2003/7/1\t大专\t52085.21\t7\r\n山东\t山东济南\t5157372152\t11/20/82\t男\t2016/6/1\t本科\t52085.1\t2\r\n浙江\t浙江金华\t5067750522\t12/31/90\t女\t2016/2/24\t高中\t52076\t8\r\n湖北\t湖北宜昌\t97251312\t9/20/73\t女\t2006/9/16\t中专\t52075.75\t9\r\n大连\t大连明锐\t5084283102\t2/23/87\t女\t2016/3/10\t本科\t52071\t5\r\n重庆\t重庆永川\t5210065862\t12/11/75\t男\t2016/8/8\t大专\t52069\t16\r\n湖北\t湖北宜昌\t226093272\t10/24/73\t女\t2008/5/23\t中专\t52063.27\t9\r\n福建\t福建福州\t5065072602\t10/20/75\t女\t2016/2/4\t高中\t52059\t5\r\n深圳\t深圳龙岗\t580233432\t2/10/64\t女\t2013/9/30\t中专\t52048\t7\r\n山东\t山东潍坊\t537451962\t9/30/72\t女\t2013/6/17\t中专\t52047.5\t11\r\n山东\t山东烟台\t241593452\t8/5/73\t女\t2008/7/22\t高中\t52047.48\t10\r\n辽宁\t辽宁沈阳\t692726772\t1/25/72\t女\t2014/12/19\t大专\t52045.13\t5\r\n宁波\t宁波城区\t160628182\t12/12/67\t女\t2007/9/1\t高中\t52039.6\t1\r\n山东\t山东烟台\t5055042622\t12/16/86\t女\t2016/1/1\t中专\t52030.5\t16\r\n山西\t山西晋城\t584421182\t7/9/80\t女\t2013/11/15\t中专\t52026.46\t0\r\n湖北\t湖北黄石\t661064162\t7/26/64\t女\t2014/8/25\t高中\t52010.3\t11\r\n辽宁\t辽宁鞍山\t798255932\t1/3/92\t女\t2015/7/22\t高中\t52000\t0\r\n辽宁\t辽宁沈阳\t5137956782\t3/12/79\t女\t2016/5/12\t大专\t52000\t0\r\n山东\t山东烟台\t5120286442\t7/26/80\t女\t2016/4/12\t中专\t51980.5\t12\r\n湖南\t湖南衡阳\t5217864842\t8/15/88\t男\t2016/8/17\t高中\t51973.5\t7\r\n四川\t四川青羊\t573685582\t1/26/78\t女\t2013/8/19\t大专\t51962.05\t5\r\n江苏\t江苏南京\t457227522\t9/29/78\t女\t2012/3/19\t大专\t51956.05\t8\r\n苏州\t苏州张家港\t5209358752\t11/4/76\t女\t2016/8/8\t中专\t51952.2\t4\r\n黑龙江\t黑龙江七台河\t5047622572\t9/22/75\t女\t2015/12/17\t高中\t51950\t1\r\n山东\t山东烟台\t44583382\t11/20/68\t女\t2005/5/27\t高中\t51937.32\t10\r\n北京\t北京海淀\t586135082\t5/27/87\t男\t2013/11/30\t大专\t51927\t6\r\n四川\t四川高新\t558629092\t9/30/80\t女\t2013/6/28\t大专\t51925.06\t11\r\n重庆\t重庆渝中\t5015848252\t5/11/77\t女\t2015/11/11\t中专\t51922.5\t12\r\n河南\t河南周口\t298787582\t9/26/76\t女\t2009/5/11\t本科\t51917.5\t16\r\n苏州\t苏州新区\t875649652\t5/26/77\t男\t2015/9/22\t高中\t51910\t3\r\n湖南\t湖南株洲\t5107593982\t10/19/75\t女\t2016/3/23\t高中\t51909\t6\r\n江苏\t江苏南京\t675904462\t1/19/80\t女\t2014/10/7\t本科\t51908\t11\r\n山西\t山西太原\t509825112\t8/22/79\t女\t2013/3/25\t大专\t51902.89\t4\r\n苏州\t苏州太仓\t454759812\t6/24/72\t女\t2012/3/6\t高中\t51891.46\t2\r\n新疆\t新疆库尔勒\t5200084832\t7/29/74\t女\t2016/8/1\t本科\t51875.9\t11\r\n江苏\t江苏镇江\t5037204592\t3/7/79\t女\t2015/11/30\t高中\t51866\t5\r\n苏州\t苏州新区\t489310932\t9/3/69\t女\t2012/12/12\t高中\t51857.21\t5\r\n四川\t四川高新\t571250672\t11/24/81\t女\t2013/7/29\t本科\t51856.28\t10\r\n重庆\t重庆渝中\t440423632\t7/8/80\t女\t2011/9/29\t大专\t51854.4\t11\r\n黑龙江\t黑龙江哈尔滨\t556057542\t2/8/75\t女\t2013/6/27\t本科\t51853\t8\r\n河南\t河南平顶山\t5165672472\t9/29/66\t男\t2016/6/8\t高中\t51852\t16\r\n湖北\t湖北武汉\t171923862\t11/17/74\t女\t2007/10/25\t高中\t51846.21\t4\r\n江西\t江西吉安\t656026302\t9/30/70\t男\t2014/8/13\t高中\t51845\t1\r\n重庆\t重庆渝中\t5179349472\t2/23/83\t女\t2016/6/21\t本科\t51835\t10\r\n江苏\t江苏泰州\t5043322862\t12/2/78\t女\t2015/12/8\t高中\t51830\t2\r\n四川\t四川青羊\t14221682\t6/3/82\t女\t2004/6/3\t大专\t51812.41\t4\r\n河南\t河南洛阳\t5147091052\t8/30/81\t女\t2016/5/26\t大专\t51791.6\t19\r\n湖北\t湖北武汉\t5199785662\t5/5/78\t女\t2016/8/1\t大专\t51785.8\t11\r\n湖北\t湖北武汉\t837758522\t11/13/74\t男\t2015/8/8\t高中\t51757\t15\r\n青岛\t青岛即墨\t859297962\t3/13/74\t女\t2015/8/14\t高中\t51753.3\t2\r\n河南\t河南周口\t5153703392\t2/21/81\t男\t2016/5/30\t本科\t51741.1\t8\r\n辽宁\t辽宁沈阳\t5164866562\t10/12/78\t女\t2016/6/7\t中专\t51740.5\t7\r\n北京\t北京海淀\t5194812352\t3/16/79\t女\t2016/7/28\t本科\t51740\t10\r\n四川\t四川高新\t733796712\t2/4/83\t女\t2015/4/2\t本科\t51737\t11\r\n广东\t广东广州\t570503702\t9/29/79\t女\t2013/7/24\t大专\t51733\t4\r\n青岛\t青岛城阳\t5077606442\t1/2/85\t女\t2016/3/7\t大专\t51731.9\t10\r\n四川\t四川青羊\t5225307532\t9/28/82\t男\t2016/8/29\t本科\t51723\t6\r\n山东\t山东临沂\t5207497612\t1/15/77\t女\t2016/8/6\t中专\t51714.5\t15\r\n新疆\t新疆伊犁\t5198413122\t11/15/73\t男\t2016/8/1\t高中\t51710\t14\r\n北京\t北京东城\t5165412282\t12/26/86\t女\t2016/6/7\t硕士\t51691\t5\r\n宁波\t宁波城区\t666036422\t11/21/72\t男\t2014/9/2\t本科\t51679\t8\r\n河北\t河北保定\t5142668032\t4/27/60\t女\t2016/5/19\t高中\t51670\t1\r\n山东\t山东威海\t728504422\t4/18/70\t男\t2015/3/26\t本科\t51657.5\t8\r\n辽宁\t辽宁营口\t5126240622\t10/20/88\t女\t2016/4/22\t大专\t51655.7\t12\r\n湖北\t湖北武汉\t256502422\t1/14/70\t女\t2008/10/10\t高中\t51655\t7\r\n广西\t广西南宁\t674889382\t3/26/79\t女\t2014/9/29\t大专\t51653.7\t16\r\n四川\t四川青羊\t5108734372\t7/17/90\t男\t2016/3/24\t大专\t51640\t2\r\n湖北\t湖北武汉\t615880582\t8/25/82\t女\t2014/3/20\t高中\t51630\t1\r\n深圳\t深圳福田\t460961672\t8/30/79\t女\t2012/3/31\t本科\t51625.6\t10\r\n浙江\t浙江金华\t454343482\t1/13/84\t女\t2012/3/5\t大专\t51619.63\t1\r\n广东\t广东广州\t517641772\t9/22/81\t女\t2013/4/26\t中专\t51613\t7\r\n四川\t四川青羊\t7578232\t6/25/71\t女\t2003/9/15\t大专\t51605\t5\r\n山东\t山东济南\t752905712\t7/22/86\t女\t2015/5/8\t中专\t51588.9\t13\r\n吉林\t吉林吉林\t5136416552\t4/21/78\t男\t2016/5/10\t大专\t51559.7\t15\r\n宁波\t宁波宁海\t692123282\t11/10/79\t女\t2014/12/18\t本科\t51542\t3\r\n山东\t山东威海\t569397762\t10/15/84\t女\t2013/7/15\t中专\t51537\t3\r\n四川\t四川青羊\t271921652\t7/11/83\t女\t2008/12/24\t本科\t51531.29\t15\r\n大连\t大连开发区\t20691652\t6/14/74\t女\t2004/10/12\t高中\t51528.5\t8\r\n黑龙江\t黑龙江鹤岗\t441502912\t4/29/82\t女\t2011/10/10\t高中\t51515.26\t11\r\n山东\t山东威海\t837436122\t8/19/84\t女\t2015/8/8\t中专\t51493\t13\r\n四川\t四川青羊\t271457172\t12/22/61\t女\t2008/12/22\t大专\t51478\t8\r\n湖北\t湖北黄石\t5195281982\t11/2/85\t男\t2016/7/28\t高中\t51448\t7\r\n陕西\t陕西咸阳\t676891212\t11/15/82\t女\t2014/10/10\t高中\t51438.1\t4\r\n山东\t山东滨州\t648969862\t11/12/83\t女\t2014/7/29\t本科\t51437.11\t4\r\n湖北\t湖北武汉\t101820222\t8/21/78\t女\t2006/10/25\t大专\t51432.58\t11\r\n浙江\t浙江杭州\t5074541422\t12/11/76\t女\t2016/3/4\t大专\t51423\t11\r\n山东\t山东临沂\t5162228522\t6/7/74\t男\t2016/6/5\t中专\t51415.1\t7\r\n浙江\t浙江嘉兴\t5198680582\t11/22/83\t女\t2016/8/1\t中专\t51407.8\t6\r\n苏州\t苏州张家港\t882508322\t5/6/69\t女\t2015/10/9\t高中\t51405\t4\r\n山东\t山东枣庄\t286961122\t5/13/79\t女\t2009/3/23\t中专\t51402.4\t5\r\n苏州\t苏州昆山\t5017623262\t10/4/89\t女\t2015/11/13\t高中\t51399.5\t2\r\n山东\t山东枣庄\t844166662\t10/21/73\t女\t2015/8/10\t本科\t51399.37\t11\r\n北京\t北京良乡\t173972172\t3/7/64\t女\t2007/11/1\t高中\t51395.28\t4\r\n浙江\t浙江杭州\t5178199042\t3/9/84\t女\t2016/6/21\t本科\t51395\t10\r\n江苏\t江苏南京\t534968902\t4/2/78\t女\t2013/6/14\t大专\t51391.55\t7\r\n山东\t山东临沂\t482587232\t10/27/67\t女\t2012/11/9\t初中\t51374.81\t7\r\n新疆\t新疆石河子\t612300792\t2/26/72\t女\t2014/3/10\t大专\t51373.78\t5\r\n湖北\t湖北武汉\t137596472\t12/20/68\t男\t2007/6/1\t本科\t51360.17\t8\r\n重庆\t重庆渝中\t5119726182\t11/6/85\t男\t2016/4/11\t大专\t51358\t5\r\n辽宁\t辽宁沈阳\t822543202\t6/9/76\t男\t2015/8/1\t大专\t51353.92\t10\r\n山西\t山西长治\t707517252\t8/21/93\t女\t2015/1/30\t高中\t51350\t1\r\n青岛\t青岛一支\t5145163792\t11/3/75\t女\t2016/5/24\t硕士\t51350\t1\r\n山西\t山西阳泉\t789055312\t7/25/92\t男\t2015/7/14\t本科\t51350\t1\r\n四川\t四川高新\t745885842\t1/30/90\t女\t2015/4/15\t高中\t51345\t7\r\n黑龙江\t黑龙江哈尔滨\t731466342\t5/1/80\t女\t2015/3/31\t本科\t51342\t7\r\n河南\t河南郑州\t322329552\t1/12/69\t女\t2009/8/5\t大专\t51319.72\t10\r\n江苏\t江苏无锡\t73298452\t7/28/64\t女\t2006/1/7\t高中\t51312.68\t5\r\n河南\t河南开封\t714946612\t9/28/92\t女\t2015/3/20\t高中\t51305\t10\r\n苏州\t苏州张家港\t5218024362\t6/15/74\t男\t2016/8/17\t高中\t51293\t8\r\n山东\t山东临沂\t5161668262\t5/13/81\t女\t2016/6/4\t中专\t51281\t8\r\n苏州\t苏州昆山\t5043835972\t11/26/78\t女\t2015/12/10\t高中\t51277.5\t3\r\n甘肃\t甘肃武威\t583703242\t4/18/81\t女\t2013/11/11\t大专\t51269.5\t4\r\n四川\t四川高新\t5176474852\t3/2/90\t女\t2016/6/20\t大专\t51261\t10\r\n山东\t山东烟台\t755259672\t5/6/86\t女\t2015/5/20\t本科\t51250\t12\r\n山西\t山西运城\t5190701172\t7/22/81\t男\t2016/7/21\t大专\t51243.2\t6\r\n福建\t福建福州\t5225026502\t7/8/81\t女\t2016/8/29\t高中\t51241\t7\r\n辽宁\t辽宁沈阳\t563705192\t9/17/78\t女\t2013/6/29\t中专\t51234\t7\r\n云南\t云南昆明\t372602212\t11/21/75\t女\t2010/5/1\t中专\t51231.35\t4\r\n四川\t四川青羊\t666151842\t6/9/82\t女\t2014/9/2\t大专\t51223.68\t0\r\n山东\t山东菏泽\t654267322\t5/7/78\t男\t2014/8/10\t中专\t51221.91\t0\r\n山东\t山东烟台\t706804752\t1/21/66\t女\t2015/1/26\t中专\t51220.3\t18\r\n贵州\t贵州贵阳\t681528092\t11/10/77\t女\t2014/11/12\t高中\t51215\t14\r\n山东\t山东烟台\t5209745852\t7/6/60\t女\t2016/8/8\t中专\t51210.9\t10\r\n浙江\t浙江金华\t863700232\t2/28/81\t男\t2015/8/26\t大专\t51192.5\t10\r\n江苏\t江苏南京\t520295942\t3/16/84\t女\t2013/5/14\t大专\t51192.1\t10\r\n北京\t北京海淀\t578357632\t10/30/88\t女\t2013/9/30\t本科\t51189\t1\r\n福建\t福建福州\t775290522\t8/19/79\t女\t2015/6/26\t高中\t51189\t1\r\n四川\t四川绵阳\t753964202\t12/10/81\t女\t2015/5/13\t高中\t51188.5\t4\r\n河南\t河南郑州\t816851602\t11/27/78\t女\t2015/7/31\t大专\t51181.09\t6\r\n河北\t河北沧州\t359132192\t9/15/65\t女\t2010/1/25\t高中\t51177.7\t6\r\n大连\t大连海川\t593924112\t2/6/76\t女\t2013/12/20\t大专\t51177.05\t8\r\n重庆\t重庆渝中\t5163485922\t3/8/84\t女\t2016/6/6\t大专\t51177\t6\r\n山东\t山东滨州\t783006142\t5/11/83\t女\t2015/7/7\t高中\t51175\t2\r\n四川\t四川高新\t5044924712\t2/18/80\t女\t2015/12/12\t高中\t51172.4\t11\r\n福建\t福建三明\t5119887572\t6/22/68\t男\t2016/4/11\t高中\t51160\t2\r\n安徽\t安徽合肥\t531766232\t8/10/66\t女\t2013/6/9\t高中\t51151.3\t5\r\n山东\t山东烟台\t5080595302\t2/3/84\t男\t2016/3/8\t本科\t51148.6\t24\r\n福建\t福建福州\t603482032\t2/20/86\t女\t2014/1/1\t大专\t51118.29\t10\r\n山西\t山西大同\t5014733202\t9/4/73\t女\t2015/11/10\t高中\t51106.8\t16\r\n湖北\t湖北襄阳\t662675892\t7/23/84\t女\t2014/8/26\t高中\t51098.05\t16\r\n山东\t山东枣庄\t746922142\t6/17/79\t女\t2015/4/18\t大专\t51097.5\t10\r\n山东\t山东威海\t701290132\t4/8/70\t女\t2014/12/31\t本科\t51097.2\t7\r\n河南\t河南郑州\t750140862\t8/17/72\t女\t2015/4/29\t本科\t51089.5\t11\r\n北京\t北京东城\t5172209552\t3/29/74\t女\t2016/6/15\t大专\t51086\t11\r\n河南\t河南周口\t713578702\t10/10/69\t女\t2015/3/18\t中专\t51080\t4\r\n河南\t河南洛阳\t340133172\t11/19/69\t女\t2009/11/2\t高中\t51072\t4\r\n江西\t江西南昌\t535472052\t7/14/78\t女\t2013/6/14\t中专\t51066.96\t4\r\n湖北\t湖北武汉\t576062432\t10/27/89\t男\t2013/9/2\t大专\t51061.38\t0\r\n河南\t河南南阳\t30002952\t11/19/68\t女\t2005/1/27\t中技\t51060.67\t0\r\n深圳\t深圳罗湖\t476625152\t1/8/78\t女\t2012/8/31\t大专\t51050\t1\r\n黑龙江\t黑龙江双鸭山\t267480172\t10/22/64\t女\t2008/12/1\t高中\t51044.85\t4\r\n江苏\t江苏南京\t44269492\t9/23/76\t男\t2005/5/26\t本科\t51036.2\t7\r\n江苏\t江苏南京\t724050932\t11/21/94\t女\t2015/3/25\t大专\t51025\t4\r\n江苏\t江苏常州\t274580292\t8/13/71\t女\t2009/1/1\t高中\t51019.56\t7\r\n山东\t山东济南\t73416942\t9/18/74\t女\t2006/1/11\t本科\t51016.81\t10\r\n河北\t河北石家庄\t523893182\t6/20/76\t男\t2013/5/28\t本科\t51014\t10\r\n天津\t天津市区二支\t47854722\t3/21/64\t女\t2005/6/21\t大专\t51012.57\t14\r\n山东\t山东临沂\t5156159202\t4/18/78\t女\t2016/5/31\t大专\t51011.4\t9\r\n山东\t山东济南\t185569462\t3/10/80\t男\t2007/11/25\t高中\t51002.5\t9\r\n深圳\t深圳福田第二\t636402572\t9/11/81\t女\t2014/6/13\t本科\t51002.2\t0\r\n江西\t江西新余\t820283172\t12/11/74\t女\t2015/7/31\t高中\t51001.98\t0\r\n佛山\t佛山禅城\t831039562\t1/16/78\t女\t2015/8/5\t大专\t51000\t0\r\n新疆\t新疆石河子\t734705582\t1/20/89\t女\t2015/4/3\t大专\t50998.94\t3\r\n四川\t四川乐山\t640191712\t12/20/79\t女\t2014/6/23\t中专\t50996.91\t4\r\n辽宁\t辽宁沈阳\t5050463682\t12/5/81\t女\t2015/12/22\t本科\t50991\t6\r\n湖北\t湖北武汉\t5192888692\t12/7/77\t女\t2016/7/26\t大专\t50989\t9\r\n广东\t广东广州\t5154989802\t10/14/75\t女\t2016/5/31\t中专\t50985.5\t6\r\n四川\t四川青羊\t649045372\t4/19/73\t女\t2014/7/30\t本科\t50968.14\t14\r\n大连\t大连明锐\t821023302\t1/9/74\t女\t2015/7/31\t大专\t50956\t9\r\n青岛\t青岛一支\t51745332\t6/8/73\t女\t2005/7/15\t大专\t50948.75\t9\r\n苏州\t苏州太仓\t5164899172\t3/23/87\t男\t2016/6/7\t本科\t50945\t2\r\n四川\t四川高新\t575225302\t11/3/82\t男\t2013/8/29\t本科\t50937.35\t16\r\n湖北\t湖北荆州\t5090668832\t1/20/88\t男\t2016/3/12\t高中\t50933\t7\r\n山东\t山东淄博\t5198611692\t12/15/75\t女\t2016/8/1\t中专\t50929.4\t11\r\n山东\t山东潍坊\t865205752\t8/8/72\t男\t2015/8/31\t本科\t50928.2\t6\r\n河南\t河南南阳\t341597382\t4/5/76\t女\t2009/11/10\t初中\t50909.79\t6\r\n四川\t四川成都\t5222786432\t10/9/74\t女\t2016/8/24\t中专\t50894\t6\r\n大连\t大连明锐\t131108082\t9/12/82\t女\t2007/4/20\t本科\t50893.75\t7\r\n山东\t山东济宁\t74488412\t9/20/71\t女\t2006/1/26\t大专\t50886.97\t5\r\n山东\t山东淄博\t5019747292\t12/4/85\t女\t2015/11/16\t大专\t50883\t11\r\n山西\t山西晋中\t274329902\t11/19/80\t女\t2009/1/1\t中专\t50879.98\t1\r\n北京\t北京海淀\t247118682\t10/9/75\t女\t2008/8/22\t硕士\t50875.46\t5\r\n贵州\t贵州贵阳\t5193920312\t9/27/85\t女\t2016/7/27\t中专\t50874.9\t16\r\n深圳\t深圳罗湖\t5216031812\t9/10/83\t女\t2016/8/15\t大专\t50870\t13\r\n新疆\t新疆石河子\t5175618122\t11/10/86\t女\t2016/6/20\t高中\t50866.5\t9\r\n青岛\t青岛一支\t343786372\t8/18/82\t女\t2009/11/18\t大专\t50850.48\t8\r\n安徽\t安徽亳州\t678754032\t1/14/73\t男\t2014/10/25\t中专\t50850\t3\r\n河北\t河北石家庄\t5160675622\t4/13/70\t女\t2016/6/3\t高中\t50849\t9\r\n天津\t天津市区一支\t627725192\t3/3/65\t女\t2014/5/9\t高中\t50843.1\t8\r\n江苏\t江苏南通\t5179359442\t2/10/66\t女\t2016/6/21\t高中\t50840.7\t3\r\n江西\t江西南昌\t735434132\t12/8/69\t男\t2015/4/3\t高中\t50831\t7\r\n江苏\t江苏泰州\t5230897252\t11/22/78\t女\t2016/9/7\t高中\t50820\t5\r\n山东\t山东烟台\t5195567512\t11/9/80\t女\t2016/7/28\t本科\t50810.6\t6\r\n湖南\t湖南永州\t5177469292\t1/16/63\t女\t2016/6/21\t中专\t50810\t3\r\n黑龙江\t黑龙江牡丹江\t458086842\t3/17/78\t女\t2012/3/22\t中专\t50798.92\t5\r\n广西\t广西南宁\t5198139362\t4/2/86\t女\t2016/8/1\t本科\t50798\t7\r\n山东\t山东淄博\t5185925532\t11/11/81\t男\t2016/6/30\t高中\t50791\t3\r\n内蒙古\t内蒙呼和浩特\t248772152\t7/24/74\t男\t2008/9/1\t大专\t50770.9\t8\r\n福建\t福建泉州\t868900962\t8/7/76\t男\t2015/9/9\t高中\t50768.4\t5\r\n山东\t山东菏泽\t497854472\t12/2/70\t女\t2012/12/31\t中专\t50766.5\t11\r\n苏州\t苏州新区\t689068132\t5/19/75\t女\t2014/12/5\t本科\t50759\t5\r\n浙江\t浙江嘉兴\t871897082\t2/29/84\t女\t2015/9/15\t大专\t50752\t9\r\n河南\t河南南阳\t479683372\t9/1/73\t男\t2012/9/29\t本科\t50745\t1\r\n山东\t山东济南\t5065289242\t3/30/63\t男\t2016/2/5\t高中\t50743.5\t10\r\n天津\t天津市区二支\t656263982\t7/28/78\t女\t2014/8/14\t中专\t50724.5\t7\r\n广东\t广东清远\t5217371672\t6/15/79\t女\t2016/8/16\t中专\t50724.3\t9\r\n青岛\t青岛一支\t462060772\t9/20/57\t男\t2012/4/16\t大专\t50721.48\t7\r\n辽宁\t辽宁丹东\t399213982\t11/10/73\t女\t2010/10/8\t中专\t50706.06\t8\r\n青岛\t青岛一支\t480936832\t10/25/70\t男\t2012/10/23\t大专\t50699.6\t8\r\n四川\t四川青羊\t605648132\t9/24/73\t男\t2014/1/15\t大专\t50692.68\t4\r\n湖南\t湖南邵阳\t5207035252\t3/4/80\t男\t2016/8/5\t高中\t50688\t8\r\n北京\t北京东城\t792060912\t4/15/82\t女\t2015/7/16\t本科\t50687\t14\r\n江苏\t江苏徐州\t533620812\t8/21/76\t男\t2013/6/13\t高中\t50686\t6\r\n山东\t山东烟台\t535322432\t7/7/83\t女\t2013/6/14\t中专\t50685.2\t10\r\n云南\t云南曲靖\t5190227042\t10/10/87\t女\t2016/7/20\t本科\t50682.4\t10\r\n广东\t广东茂名\t376334962\t10/17/54\t男\t2010/5/21\t高中\t50681.34\t1\r\n四川\t四川高新\t5096011032\t4/2/85\t女\t2016/3/16\t中专\t50674.5\t16\r\n江苏\t江苏常州\t86977822\t6/12/66\t女\t2006/6/12\t高中\t50672.58\t5\r\n江苏\t江苏南京\t345328462\t5/14/88\t男\t2009/11/25\t大专\t50669.7\t8\r\n深圳\t深圳宝安\t121795382\t12/3/79\t女\t2007/3/7\t大专\t50669.35\t8\r\n佛山\t佛山顺德龙江\t841947942\t6/7/84\t男\t2015/8/9\t高中\t50668.4\t6\r\n山东\t山东烟台\t444227152\t1/18/72\t男\t2011/11/19\t中专\t50649.13\t2\r\n浙江\t浙江金华\t518569762\t5/11/77\t女\t2013/5/2\t高中\t50637.05\t12\r\n湖北\t湖北十堰\t515047062\t10/6/80\t女\t2013/4/12\t中专\t50634.4\t13\r\n北京\t北京东城\t5189423902\t8/19/71\t女\t2016/7/18\t硕士\t50610\t7\r\n浙江\t浙江温州\t706792472\t10/6/78\t女\t2015/1/26\t高中\t50599.3\t6\r\n安徽\t安徽滁州\t348538672\t3/9/68\t女\t2009/12/1\t高中\t50598.5\t9\r\n佛山\t佛山禅城\t797135342\t2/9/68\t女\t2015/7/21\t高中\t50593\t8\r\n青岛\t青岛一支\t79235272\t1/17/78\t女\t2006/3/24\t大专\t50587.47\t8\r\n福建\t福建漳州\t5202059242\t2/21/77\t男\t2016/8/2\t大专\t50585.1\t8\r\n四川\t四川泸州\t704591202\t2/28/79\t女\t2015/1/16\t中专\t50547.5\t7\r\n河北\t河北石家庄\t799449662\t5/11/61\t女\t2015/7/23\t本科\t50544\t14\r\n福建\t福建福州\t583280072\t8/15/73\t女\t2013/11/7\t高中\t50526.64\t10\r\n吉林\t吉林延边\t582798142\t11/4/78\t女\t2013/11/1\t中专\t50525.22\t11\r\n黑龙江\t黑龙江哈尔滨\t217409052\t3/21/64\t女\t2008/4/21\t本科\t50525.21\t17\r\n山东\t山东威海\t415353252\t11/27/80\t女\t2011/2/8\t中专\t50524.6\t15\r\n黑龙江\t黑龙江牡丹江\t224145732\t4/23/62\t女\t2008/5/19\t大专\t50521.89\t4\r\n湖北\t湖北咸宁\t5210407612\t9/3/82\t女\t2016/8/9\t硕士\t50514\t8\r\n宁波\t宁波宁海\t5173775122\t2/5/78\t女\t2016/6/16\t初中\t50511.6\t8\r\n福建\t福建漳州\t577507522\t3/3/63\t男\t2013/9/9\t大专\t50501.46\t8\r\n吉林\t吉林四平\t748002122\t1/3/67\t女\t2015/4/22\t高中\t50500.8\t6\r\n山东\t山东济南\t5105375652\t11/12/82\t女\t2016/3/22\t本科\t50497.5\t9\r\n山东\t山东济宁\t579540752\t12/1/71\t男\t2013/9/25\t中专\t50485.07\t4\r\n云南\t云南昆明\t282230312\t9/2/79\t女\t2009/3/3\t大专\t50482.3\t5\r\n山东\t山东东营\t444752762\t12/3/81\t女\t2011/11/24\t大专\t50481.44\t10\r\n福建\t福建福州\t302512522\t10/15/78\t女\t2009/5/21\t初中\t50470.75\t7\r\n苏州\t苏州园区\t707292822\t9/10/84\t女\t2015/1/29\t大专\t50467.5\t1\r\n湖南\t湖南永州\t5180468122\t8/13/93\t男\t2016/6/23\t高中\t50467\t8\r\n福建\t福建泉州\t602665692\t8/24/76\t女\t2013/12/31\t高中\t50466.6\t4\r\n青岛\t青岛即墨\t5213260492\t3/29/77\t女\t2016/8/11\t大专\t50466.3\t8\r\n山东\t山东滨州\t605702422\t8/18/76\t女\t2014/1/15\t大专\t50466\t1\r\n` \r\n\r\nexport const companyTargetData = `区域\t分公司\t销售目标(万元)\r\n中心区\t青岛\t2360\r\n北区\t内蒙古\t400\r\n中心区\t佛山\t450\r\n北区\t安徽\t1810\r\n北区\t河北\t2210\r\n中心区\t北京\t2160\r\n省会\t青海\t40\r\n南区\t福建\t1200\r\n南区\t浙江\t2060\r\n南区\t江西\t2660\r\n南区\t湖南\t1460\r\n中心区\t天津\t750\r\n北区\t山东\t7280\r\n中心区\t深圳\t1410\r\n省会\t陕西\t1000\r\n北区\t辽宁\t2210\r\n中心区\t上海\t1000\r\n南区\t江苏\t2760\r\n北区\t黑龙江\t5720\r\n南区\t广西\t1100\r\n省会\t新疆\t600\r\n北区\t河南\t2710\r\n省会\t四川\t7330\r\n南区\t湖北\t5170\r\n北区\t吉林\t1560\r\n省会\t重庆\t1610\r\n中心区\t苏州\t2060\r\n中心区\t宁波\t500\r\n省会\t云南\t1960\r\n省会\t贵州\t600\r\n北区\t山西\t1660\r\n南区\t广东\t3060\r\n省会\t甘肃\t450\r\n中心区\t大连\t550\r\n省会\t海南\t170\r\n`\r\nexport const companyTargetData10 = `区域\t分公司\t销售目标(万元)\r\n中心区\t青岛\t2360\r\n北区\t内蒙古\t400\r\n中心区\t佛山\t450\r\n北区\t安徽\t1810\r\n北区\t河北\t2210\r\n中心区\t北京\t2160\r\n省会\t青海\t40\r\n南区\t福建\t1200\r\n南区\t浙江\t2060\r\n南区\t江西\t2660\r\n南区\t湖南\t1460\r\n中心区\t天津\t750\r\n北区\t山东\t7280\r\n中心区\t深圳\t1410\r\n省会\t陕西\t1000\r\n北区\t辽宁\t2210\r\n中心区\t上海\t1000\r\n南区\t江苏\t2760\r\n北区\t黑龙江\t5720\r\n南区\t广西\t1100\r\n省会\t新疆\t600\r\n北区\t河南\t2710\r\n省会\t四川\t7330\r\n南区\t湖北\t5170\r\n北区\t吉林\t1560\r\n省会\t重庆\t1610\r\n中心区\t苏州\t2060\r\n中心区\t宁波\t500\r\n省会\t云南\t1960\r\n省会\t贵州\t600\r\n北区\t山西\t1660\r\n南区\t广东\t3060\r\n省会\t甘肃\t450\r\n中心区\t大连\t550\r\n省会\t海南\t170\r\n`\r\nexport const companyTargetData11 = `区域\t分公司\t销售目标(万元)\r\n中心区\t青岛\t3240\r\n北区\t内蒙古\t1280\r\n中心区\t佛山\t1330\r\n北区\t安徽\t2690\r\n北区\t河北\t3090\r\n中心区\t北京\t3040\r\n省会\t青海\t920\r\n南区\t福建\t2080\r\n南区\t浙江\t2940\r\n南区\t江西\t3540\r\n南区\t湖南\t2340\r\n中心区\t天津\t1630\r\n北区\t山东\t8160\r\n中心区\t深圳\t2290\r\n省会\t陕西\t1880\r\n北区\t辽宁\t3090\r\n中心区\t上海\t1880\r\n南区\t江苏\t3640\r\n北区\t黑龙江\t6600\r\n南区\t广西\t1980\r\n省会\t新疆\t1480\r\n北区\t河南\t3590\r\n省会\t四川\t8210\r\n南区\t湖北\t6050\r\n北区\t吉林\t2440\r\n省会\t重庆\t2490\r\n中心区\t苏州\t2940\r\n中心区\t宁波\t1380\r\n省会\t云南\t2840\r\n省会\t贵州\t1480\r\n北区\t山西\t2540\r\n南区\t广东\t3940\r\n省会\t甘肃\t1330\r\n中心区\t大连\t1430\r\n省会\t海南\t1050\r\n\r\n`\r\nexport const companyTargetData12 = `区域\t分公司\t销售目标(万元)\r\n中心区\t青岛\t4760\r\n北区\t内蒙古\t2800\r\n中心区\t佛山\t2850\r\n北区\t安徽\t4210\r\n北区\t河北\t4610\r\n中心区\t北京\t4560\r\n省会\t青海\t2440\r\n南区\t福建\t3600\r\n南区\t浙江\t4460\r\n南区\t江西\t5060\r\n南区\t湖南\t3860\r\n中心区\t天津\t3150\r\n北区\t山东\t9680\r\n中心区\t深圳\t3810\r\n省会\t陕西\t3400\r\n北区\t辽宁\t4610\r\n中心区\t上海\t3400\r\n南区\t江苏\t5160\r\n北区\t黑龙江\t8120\r\n南区\t广西\t3500\r\n省会\t新疆\t3000\r\n北区\t河南\t5110\r\n省会\t四川\t9730\r\n南区\t湖北\t7570\r\n北区\t吉林\t3960\r\n省会\t重庆\t4010\r\n中心区\t苏州\t4460\r\n中心区\t宁波\t2900\r\n省会\t云南\t4360\r\n省会\t贵州\t3000\r\n北区\t山西\t4060\r\n南区\t广东\t5460\r\n省会\t甘肃\t2850\r\n中心区\t大连\t2950\r\n省会\t海南\t2570\r\n`\r\n\r\n\r\nexport function excelToLuckyArray(excelData) {\r\n    const rows = excelData.trim().split('\\n').map(row => row.trim().split('\\t'));\r\n    const header = rows[0].map(col => ({ v: col }));\r\n    const data = rows.slice(1).map(row => row.map(col => ({ v: col })));\r\n    return [header, ...data];\r\n}\r\n\r\nexport function excelToArray(excelData) {\r\n    const rows = excelData.trim().split('\\n').map(row => row.trim().split('\\t'));\r\n    const header = rows[0]\r\n    const data = rows.slice(1).map(row => row.map(col => (col)));\r\n    return [header, ...data];\r\n}\r\n\r\n// 生成表1\r\nexport function pivotTable(data, config) {\r\n    const headers = data.shift();\r\n    const rows = config.rows;\r\n    const values = config.values;\r\n    const result = [];\r\n\r\n    // Helper function to calculate sum or count based on type\r\n    function getCellValue(type, values) {\r\n        switch (type) {\r\n            case \"sum\":\r\n                return values.reduce((sum, curr) => sum + (parseFloat(curr) || 0), 0);\r\n            case \"count\":\r\n                return values.length;\r\n            default:\r\n                return null;\r\n        }\r\n    }\r\n\r\n    // Filter and sort data based on row columns\r\n    const sortedData = data\r\n        .filter((row) => row[rows[0]] != undefined)\r\n        .sort((a, b) => {\r\n            if (a[rows[0]] < b[rows[0]]) return -1;\r\n            if (a[rows[0]] > b[rows[0]]) return 1;\r\n            return 0;\r\n        });\r\n\r\n    // Loop through the sorted data and group rows by row columns\r\n    let currentRowValue = null;\r\n    let currentRowIndex = -1;\r\n    sortedData.forEach((row) => {\r\n        if (row[rows[0]] !== currentRowValue) {\r\n            currentRowIndex++;\r\n            currentRowValue = row[rows[0]];\r\n            result[currentRowIndex] = [{ v: currentRowValue }];\r\n            for (let i = 0; i < values.length; i++) {\r\n                result[currentRowIndex].push({ v: \"\" });\r\n            }\r\n        }\r\n\r\n        // Calculate cell values based on type\r\n        for (let i = 0; i < values.length; i++) {\r\n            const column = values[i].column;\r\n            const type = values[i].type;\r\n            const value = row[column];\r\n            const cellValue = getCellValue(type, [value])\r\n            if (result[currentRowIndex][i + 1].v === \"\") {\r\n                \r\n                result[currentRowIndex][i + 1].v = cellValue;\r\n            } else {\r\n                result[currentRowIndex][i + 1].v += cellValue;\r\n            }\r\n        }\r\n    });\r\n\r\n    // Add header row\r\n    result.unshift(\r\n        [{ v: headers[rows[0]] }].concat(\r\n            values.map((value) => ({ v: `${headers[value.column]}` }))\r\n        )\r\n    );\r\n\r\n    return result;\r\n}\r\n\r\n// 添加排名\r\nexport function sortTable(data) {\r\n    \r\n    // 按照销售额从高到底排序\r\n    data.sort(function (a, b) {\r\n        // 四舍五入\r\n        b[1].v = Math.round(b[1].v) || b[1].v || 0\r\n        a[1].v = Math.round(a[1].v) || a[1].v || 0\r\n        return b[1].v - a[1].v;\r\n    });\r\n\r\n    // 添加排名列\r\n    data[0].unshift({ v: \"排名\" });\r\n    for (var i = 1; i < data.length; i++) {\r\n        data[i].unshift({ \"v\": i });\r\n    }\r\n\r\n    return data\r\n}\r\n\r\n// 表1基础上增加一列“销售目标”\r\nexport function addSalesTargetToTable(table, salesTargetData) {\r\n    table[0].splice(1, 0, { v: salesTargetData[0][0] });\r\n    table[0].push({ v: salesTargetData[0][2] });\r\n\r\n    // 将销售目标数据转换为对象\r\n    const salesTargetObj = {};\r\n    for (let i = 1; i < salesTargetData.length; i++) {\r\n        salesTargetObj[salesTargetData[i][1]] = {\r\n            area: salesTargetData[i][0],\r\n            salesTarget: salesTargetData[i][2]\r\n        };\r\n    }\r\n\r\n    // 遍历结果表，为每个“分公司”添加“销售目标”列\r\n    for (let i = 1; i < table.length; i++) {\r\n        const companyName = table[i][1].v;\r\n        const area = salesTargetObj[companyName].area || \"\";\r\n        const salesTarget = parseFloat(salesTargetObj[companyName].salesTarget) || 0;\r\n        table[i].splice(1, 0, { v: area });\r\n        table[i].push({ v: salesTarget });\r\n    }\r\n\r\n    return table;\r\n}\r\n\r\n// 汇总所有区域数据，带分公司\r\nexport function summary(data) {\r\n    // 获取需要汇总的列数\r\n    const colCount = data[0].length - 1;\r\n\r\n    // 计算汇总数据\r\n    const summaryRow = [{ v: \"\" }, { v: \"合计\" }, { v: \"\" }];\r\n    for (let i = 3; i <= colCount; i++) {\r\n        let sum = 0;\r\n        for (let j = 1; j < data.length; j++) {\r\n            sum += parseInt(data[j][i]['v']) || 0;\r\n        }\r\n        summaryRow.push({ \"v\": parseInt(sum) || 0 });\r\n    }\r\n\r\n    // 插入汇总数据到第二行\r\n    data.splice(1, 0, summaryRow);\r\n    return data\r\n}\r\n\r\n// 汇总所有区域数据，不带分公司\r\nexport function summaryAll(data) {\r\n    // 获取需要汇总的列数\r\n    const colCount = data[0].length - 1;\r\n\r\n    // 计算汇总数据\r\n    const summaryRow = [{ v: \"\" }, { v: \"合计\" }];\r\n    for (let i = 2; i <= colCount; i++) {\r\n        let sum = 0;\r\n        for (let j = 1; j < data.length; j++) {\r\n            sum += parseInt(data[j][i]['v']) || 0;\r\n        }\r\n        summaryRow.push({ \"v\": parseInt(sum) || 0 });\r\n    }\r\n\r\n    // 插入汇总数据到第二行\r\n    data.splice(1, 0, summaryRow);\r\n    return data\r\n}\r\n\r\n// 汇总各个区域数据\r\nexport function summaryArea(data) {\r\n    // 获取所有的区域\r\n    const regions = [];\r\n    for (let i = 3; i < data.length; i++) {\r\n        const region = data[i][1]['v'];\r\n        if (!regions.includes(region)) {\r\n            regions.push(region);\r\n        }\r\n    }\r\n\r\n    // 按区域汇总数据\r\n    for (let i = 0; i < regions.length; i++) {\r\n        const region = regions[i];\r\n        let sumSales = 0;\r\n        let sumCustomers = 0;\r\n        let countSalesmen = 0;\r\n        let sumTargets = 0;\r\n        for (let j = 3; j < data.length; j++) {\r\n            if (data[j][1]['v'] === region) {\r\n                sumSales += parseInt(data[j][3]['v']) || 0;\r\n                sumCustomers += parseInt(data[j][4]['v']) || 0;\r\n                countSalesmen += parseInt(data[j][5]['v']) || 0;\r\n                sumTargets += parseInt(data[j][6]['v']) || 0;\r\n            }\r\n        }\r\n        const summary = [{ \"v\": \"\" }, { \"v\": region }, { v: \"\" }, { \"v\": parseInt(sumSales) || 0 }, { \"v\": sumCustomers }, { \"v\": countSalesmen }, { \"v\": sumTargets }];\r\n        data.splice(2, 0, summary);\r\n    }\r\n\r\n    return data\r\n}\r\n\r\n// 添加达成率\r\nexport function targetRate(data, title = '达成率(销售额/销售目标)') {\r\n    data[0].push({ v: title })\r\n    // 计算并添加达成率列\r\n    for (let i = 1; i < data.length; i++) {\r\n        const sumSales = data[i][3].v;  // 第四列\r\n        const salesTarget = data[i][6].v * 10000;  // 第七列\r\n        const achievementRate = ((sumSales / salesTarget) * 100).toFixed(0) + \"%\";  // 计算并格式化达成率\r\n        data[i].push({ v: achievementRate });  // 添加达成率列\r\n    }\r\n\r\n    return data\r\n}\r\n\r\n// 计算结果\r\nexport function askAIData(data, salesTargetData) {\r\n\r\n    const config = {\r\n        rows: [0],\r\n        values: [\r\n            {\r\n                column: data[0].length - 2,\r\n                type: \"sum\",\r\n            },\r\n            {\r\n                column: data[0].length - 1,\r\n                type: \"sum\",\r\n            },\r\n            {\r\n                column: 2,\r\n                type: \"count\",\r\n            },\r\n        ],\r\n    };\r\n\r\n    let resultTable = pivotTable(data, config)\r\n    resultTable = sortTable(resultTable)\r\n\r\n    let saleTarget = false\r\n    // 只有分公司才能执行vlookup查询\r\n    if(resultTable[0][1].v === '分公司'){\r\n        saleTarget = true\r\n        resultTable = addSalesTargetToTable(resultTable, salesTargetData); // 添加“销售目标”列\r\n    }\r\n    if(saleTarget){\r\n\r\n        resultTable = summary(resultTable)\r\n    }else{\r\n        resultTable = summaryAll(resultTable)\r\n    }\r\n    \r\n    if(saleTarget){\r\n        resultTable = summaryArea(resultTable)\r\n        resultTable = targetRate(resultTable)\r\n    }\r\n\r\n    if(!saleTarget && resultTable[0] && resultTable[0][4] && resultTable[0][4].v === '客户数'){\r\n        resultTable[0][4].v = '销售员人数'\r\n    }\r\n    return resultTable\r\n}\r\n\r\nfunction getAjax(url, data = {}, success, error) {\r\n    $.ajax({\r\n        url,\r\n        data,\r\n        beforeSend: function (request) {\r\n            request.setRequestHeader(\"Authorization\", `Bearer ${remoteT1}.${remoteT2}`)\r\n        },\r\n        success(res) {\r\n            success?.(res)\r\n        },\r\n        error(err) {\r\n            error?.(err)\r\n        }\r\n    })\r\n}\r\n\r\n\r\nexport function getAirTable(url, columnId = 0, sort = 1, success,fail) {\r\n    const host = 'https://api.airtable.com'\r\n    const urls = url.replace('https://airtable.com/', '').split('/')\r\n    const baseId = urls[0]\r\n    const tableId = urls[1]\r\n    const viewId = urls[2].split('?')[0]\r\n    let direction = 'asc'\r\n    if (!sort) {\r\n        direction = 'desc'\r\n    }\r\n\r\n    const tablesUrl = `${host}/v0/meta/bases/${baseId}/tables`\r\n    getAjax(tablesUrl, {}, (res) => {\r\n        const table = res.tables.find(item => item.id === tableId)\r\n        const fields = table.fields\r\n\r\n        const tableUrl = `${host}/v0/${baseId}/${tableId}`\r\n        const query = {\r\n            view: viewId,\r\n            sort: [{\r\n                field: fields[columnId].name,\r\n                direction\r\n            }]\r\n        }\r\n        getAjax(tableUrl, query, (result) => {\r\n            const records = result.records\r\n            const data = new Array()\r\n            data.length = records.length\r\n            for (let i = 0; i < records.length; i++) {\r\n                data[i] = []\r\n                for (let j = 0; j < fields.length; j++) {\r\n                    const record = records[i].fields[fields[j].name]\r\n                    if (record) {\r\n                        data[i].push(record)\r\n                    } else {\r\n                        data[i].push(null)\r\n                    }\r\n                }\r\n            }\r\n            success && success(data)\r\n        }, (err) => {\r\n            console.dir(err)\r\n            fail && fail(err)\r\n        })\r\n    }, (err) => {\r\n        console.dir(err)\r\n        fail && fail(err)\r\n    })\r\n\r\n}"
  },
  {
    "path": "src/demoData/sheetCell.js",
    "content": "window.sheetCell = {\r\n    \"name\": \"Cell\",\r\n    \"config\": {\r\n        \"merge\": {\r\n            \"13_5\": {\r\n                \"r\": 13,\r\n                \"c\": 5,\r\n                \"rs\": 3,\r\n                \"cs\": 1\r\n            },\r\n            \"13_7\": {\r\n                \"r\": 13,\r\n                \"c\": 7,\r\n                \"rs\": 3,\r\n                \"cs\": 2\r\n            },\r\n            \"14_2\": {\r\n                \"r\": 14,\r\n                \"c\": 2,\r\n                \"rs\": 1,\r\n                \"cs\": 2\r\n            },\r\n            \"15_10\": {\r\n                \"r\": 15,\r\n                \"c\": 10,\r\n                \"rs\": 4,\r\n                \"cs\": 3\r\n            }\r\n        },\r\n        \"borderInfo\": [\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 3,\r\n                    \"col_index\": 3,\r\n                    \"l\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 3,\r\n                    \"col_index\": 4,\r\n                    \"l\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 10,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 3,\r\n                    \"col_index\": 5,\r\n                    \"l\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 3,\r\n                    \"col_index\": 6,\r\n                    \"l\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 3,\r\n                    \"col_index\": 7,\r\n                    \"l\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 3,\r\n                    \"col_index\": 8,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 5,\r\n                    \"col_index\": 2,\r\n                    \"l\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 5,\r\n                    \"col_index\": 3,\r\n                    \"l\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 5,\r\n                    \"col_index\": 4,\r\n                    \"l\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 5,\r\n                    \"col_index\": 5,\r\n                    \"l\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 5,\r\n                    \"col_index\": 6,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 5,\r\n                    \"col_index\": 7,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 5,\r\n                    \"col_index\": 8,\r\n                    \"l\": {\r\n                        \"style\": 2,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 2,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 2,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 2,\r\n                        \"color\": \"rgb(255, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 7,\r\n                    \"col_index\": 2,\r\n                    \"l\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 7,\r\n                    \"col_index\": 3,\r\n                    \"l\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 7,\r\n                    \"col_index\": 5,\r\n                    \"l\": {\r\n                        \"style\": 2,\r\n                        \"color\": \"rgb(154, 205, 50)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 2,\r\n                        \"color\": \"rgb(154, 205, 50)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 7,\r\n                    \"col_index\": 6,\r\n                    \"r\": {\r\n                        \"style\": 2,\r\n                        \"color\": \"rgb(154, 205, 50)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 2,\r\n                        \"color\": \"rgb(154, 205, 50)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 7,\r\n                    \"col_index\": 8,\r\n                    \"r\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 7,\r\n                    \"col_index\": 9,\r\n                    \"l\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 8,\r\n                    \"col_index\": 2,\r\n                    \"l\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 8,\r\n                    \"col_index\": 3,\r\n                    \"l\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 255)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 8,\r\n                    \"col_index\": 5,\r\n                    \"l\": {\r\n                        \"style\": 2,\r\n                        \"color\": \"rgb(154, 205, 50)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 2,\r\n                        \"color\": \"rgb(154, 205, 50)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 8,\r\n                    \"col_index\": 6,\r\n                    \"r\": {\r\n                        \"style\": 2,\r\n                        \"color\": \"rgb(154, 205, 50)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 2,\r\n                        \"color\": \"rgb(154, 205, 50)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 8,\r\n                    \"col_index\": 8,\r\n                    \"r\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 8,\r\n                    \"col_index\": 9,\r\n                    \"l\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 9,\r\n                        \"color\": \"rgb(0, 0, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 10,\r\n                    \"col_index\": 2,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 10,\r\n                    \"col_index\": 3,\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 10,\r\n                    \"col_index\": 5,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 10,\r\n                    \"col_index\": 6,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 10,\r\n                    \"col_index\": 7,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 11,\r\n                    \"col_index\": 2,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 11,\r\n                    \"col_index\": 3,\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 11,\r\n                    \"col_index\": 5,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 11,\r\n                    \"col_index\": 6,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 11,\r\n                    \"col_index\": 7,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 12,\r\n                    \"col_index\": 2,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 12,\r\n                    \"col_index\": 3,\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    },\r\n                    \"t\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(144, 238, 144)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 12,\r\n                    \"col_index\": 5,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 12,\r\n                    \"col_index\": 6,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 12,\r\n                    \"col_index\": 7,\r\n                    \"l\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"r\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    },\r\n                    \"b\": {\r\n                        \"style\": 1,\r\n                        \"color\": \"rgb(205, 205, 0)\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-none\",\r\n                \"style\": \"2\",\r\n                \"color\": \"#000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            3,\r\n                            4\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"2\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            3,\r\n                            4\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-none\",\r\n                \"style\": \"4\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            4,\r\n                            4\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"3\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            4,\r\n                            4\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-none\",\r\n                \"style\": \"3\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            3,\r\n                            3\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"2\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            3,\r\n                            3\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-none\",\r\n                \"style\": \"2\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            5,\r\n                            5\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-none\",\r\n                \"style\": \"2\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            8,\r\n                            8\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-none\",\r\n                \"style\": \"2\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            3,\r\n                            8\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"4\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            7,\r\n                            7\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"1\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            8,\r\n                            8\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"5\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            6,\r\n                            6\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"6\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            5,\r\n                            5\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-none\",\r\n                \"style\": \"3\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            4,\r\n                            4\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"3\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            4,\r\n                            4\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"2\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            3,\r\n                            3\r\n                        ],\r\n                        \"column\": [\r\n                            3,\r\n                            3\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-none\",\r\n                \"style\": \"2\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            5,\r\n                            5\r\n                        ],\r\n                        \"column\": [\r\n                            2,\r\n                            9\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"9\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            5,\r\n                            5\r\n                        ],\r\n                        \"column\": [\r\n                            5,\r\n                            5\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"8\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            5,\r\n                            5\r\n                        ],\r\n                        \"column\": [\r\n                            6,\r\n                            6\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"13\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            5,\r\n                            5\r\n                        ],\r\n                        \"column\": [\r\n                            7,\r\n                            7\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"13\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            6,\r\n                            6\r\n                        ],\r\n                        \"column\": [\r\n                            11,\r\n                            11\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"10\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            5,\r\n                            5\r\n                        ],\r\n                        \"column\": [\r\n                            4,\r\n                            4\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"11\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            5,\r\n                            5\r\n                        ],\r\n                        \"column\": [\r\n                            3,\r\n                            3\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-none\",\r\n                \"style\": \"11\",\r\n                \"color\": \"#ff0000\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            7,\r\n                            8\r\n                        ],\r\n                        \"column\": [\r\n                            2,\r\n                            3\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-all\",\r\n                \"style\": \"3\",\r\n                \"color\": \"#0000ff\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            7,\r\n                            8\r\n                        ],\r\n                        \"column\": [\r\n                            2,\r\n                            3\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-inside\",\r\n                \"style\": \"3\",\r\n                \"color\": \"#0000ff\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            7,\r\n                            8\r\n                        ],\r\n                        \"column\": [\r\n                            8,\r\n                            9\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-inside\",\r\n                \"style\": \"9\",\r\n                \"color\": \"#0000ff\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            7,\r\n                            8\r\n                        ],\r\n                        \"column\": [\r\n                            8,\r\n                            9\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-inside\",\r\n                \"style\": \"2\",\r\n                \"color\": \"#0000ff\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            7,\r\n                            8\r\n                        ],\r\n                        \"column\": [\r\n                            8,\r\n                            9\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-inside\",\r\n                \"style\": \"9\",\r\n                \"color\": \"#0000ff\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            7,\r\n                            8\r\n                        ],\r\n                        \"column\": [\r\n                            8,\r\n                            9\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 10,\r\n                    \"col_index\": 10,\r\n                    \"l\": {\r\n                        \"color\": \"#ff0000\",\r\n                        \"style\": \"13\"\r\n                    },\r\n                    \"r\": {\r\n                        \"color\": \"#ff0000\",\r\n                        \"style\": \"13\"\r\n                    },\r\n                    \"t\": {\r\n                        \"color\": \"#ff0000\",\r\n                        \"style\": \"13\"\r\n                    },\r\n                    \"b\": {\r\n                        \"color\": \"#ff0000\",\r\n                        \"style\": \"13\"\r\n                    }\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 6,\r\n                    \"col_index\": 11,\r\n                    \"l\": null,\r\n                    \"r\": null,\r\n                    \"t\": null,\r\n                    \"b\": null\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"cell\",\r\n                \"value\": {\r\n                    \"row_index\": 10,\r\n                    \"col_index\": 10,\r\n                    \"l\": null,\r\n                    \"r\": null,\r\n                    \"t\": null,\r\n                    \"b\": null\r\n                }\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-outside\",\r\n                \"style\": \"13\",\r\n                \"color\": \"#00ff00\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            10,\r\n                            12\r\n                        ],\r\n                        \"column\": [\r\n                            2,\r\n                            3\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-horizontal\",\r\n                \"style\": \"13\",\r\n                \"color\": \"#00ff00\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            10,\r\n                            12\r\n                        ],\r\n                        \"column\": [\r\n                            2,\r\n                            3\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-vertical\",\r\n                \"style\": \"13\",\r\n                \"color\": \"#ff9900\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            10,\r\n                            12\r\n                        ],\r\n                        \"column\": [\r\n                            5,\r\n                            7\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-outside\",\r\n                \"style\": \"13\",\r\n                \"color\": \"#ff9900\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            10,\r\n                            12\r\n                        ],\r\n                        \"column\": [\r\n                            5,\r\n                            7\r\n                        ]\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"rangeType\": \"range\",\r\n                \"borderType\": \"border-none\",\r\n                \"style\": \"1\",\r\n                \"color\": \"#ff9900\",\r\n                \"range\": [\r\n                    {\r\n                        \"row\": [\r\n                            19,\r\n                            19\r\n                        ],\r\n                        \"column\": [\r\n                            6,\r\n                            6\r\n                        ]\r\n                    }\r\n                ]\r\n            }\r\n        ],\r\n        \"rowlen\": {\r\n            \"0\": 20,\r\n            \"1\": 20,\r\n            \"2\": 20,\r\n            \"3\": 20,\r\n            \"4\": 20,\r\n            \"5\": 20,\r\n            \"6\": 20,\r\n            \"7\": 20,\r\n            \"8\": 20,\r\n            \"9\": 20,\r\n            \"10\": 20,\r\n            \"11\": 20,\r\n            \"12\": 20,\r\n            \"13\": 20,\r\n            \"14\": 20,\r\n            \"15\": 20,\r\n            \"16\": 20,\r\n            \"17\": 31,\r\n            \"18\": 20,\r\n            \"19\": 20,\r\n            \"20\": 20,\r\n            \"21\": 20,\r\n            \"22\": 20,\r\n            \"23\": 20,\r\n            \"24\": 20,\r\n            \"25\": 79,\r\n            \"26\": 20,\r\n            \"27\": 20,\r\n            \"28\": 80,\r\n            \"29\": 36\r\n        },\r\n        \"columnlen\": {\r\n            \"0\": 131,\r\n            \"2\": 153,\r\n            \"3\": 128,\r\n            \"4\": 136,\r\n            \"5\": 122,\r\n            \"6\": 138,\r\n            \"7\": 131,\r\n            \"8\": 128,\r\n            \"9\": 140,\r\n            \"10\": 144\r\n        },\r\n        \"rowhidden\": {\r\n            \"30\": 0,\r\n            \"31\": 0\r\n        },\r\n        \"customHeight\": {\r\n            \"29\": 1\r\n        },\r\n        \"customWidth\": {\r\n            \"2\": 1\r\n        }\r\n    },\r\n    \"index\": \"0\",\r\n    \"zoomRatio\": 1,\r\n    \"order\": \"0\",\r\n    \"column\": 18,\r\n\t\"row\": 36,\r\n\t\"status\": 1,\r\n    \"celldata\": [{\"r\":0,\"c\":0,\"v\":{\"customKey\":{a:1},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":1,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"1\"}},{\"r\":0,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":2,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"2\"}},{\"r\":0,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":3,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"3\"}},{\"r\":0,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":0,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"0\",\"f\":\"=Formula!D3+Formula!D4\"}},{\"r\":0,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":0,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":0,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":0,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":0,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":0,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":0,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":0,\"v\":{\"v\":\"Background\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Background\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":2,\"v\":{\"bg\":\"rgb(30, 144, 255)\",\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":4,\"v\":{\"bg\":\"rgb(0, 255, 0)\",\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":0,\"v\":{\"v\":\"Border\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Border\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"ct\":{\"fa\":\"General\",\"t\":\"inlineStr\",\"s\":[{\"ff\":\"Arial\",\"fc\":\"rgb(255, 0, 0)\",\"fs\":12,\"cl\":0,\"un\":0,\"bl\":0,\"it\":0,\"v\":\"Inline\"},{\"ff\":\"Arial\",\"fc\":\"#000000\",\"fs\":12,\"cl\":0,\"un\":0,\"bl\":0,\"it\":0,\"v\":\" \"},{\"ff\":\"Arial\",\"fc\":\"#000000\",\"fs\":16,\"cl\":1,\"un\":0,\"bl\":0,\"it\":1,\"v\":\"Style\"},{\"ff\":\"Arial\",\"fc\":\"#000000\",\"fs\":12,\"cl\":0,\"un\":0,\"bl\":0,\"it\":0,\"v\":\" \"},{\"ff\":\"Arial\",\"fc\":\"#000000\",\"fs\":12,\"cl\":0,\"un\":0,\"bl\":1,\"it\":0,\"v\":\"Cell\"}]}}},{\"r\":5,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":13,\"c\":5,\"rs\":3,\"cs\":1}}},{\"r\":13,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":13,\"c\":7,\"rs\":3,\"cs\":2}}},{\"r\":13,\"c\":8,\"v\":{\"mc\":{\"r\":13,\"c\":7}}},{\"r\":13,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":14,\"c\":0,\"v\":{\"v\":\"Span\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Span\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":14,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":14,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":14,\"c\":2,\"rs\":1,\"cs\":2}}},{\"r\":14,\"c\":3,\"v\":{\"mc\":{\"r\":14,\"c\":2}}},{\"r\":14,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":14,\"c\":5,\"v\":{\"mc\":{\"r\":13,\"c\":5}}},{\"r\":14,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":14,\"c\":7,\"v\":{\"mc\":{\"r\":13,\"c\":7}}},{\"r\":14,\"c\":8,\"v\":{\"mc\":{\"r\":13,\"c\":7}}},{\"r\":14,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":14,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":5,\"v\":{\"mc\":{\"r\":13,\"c\":5}}},{\"r\":15,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":7,\"v\":{\"mc\":{\"r\":13,\"c\":7}}},{\"r\":15,\"c\":8,\"v\":{\"mc\":{\"r\":13,\"c\":7}}},{\"r\":15,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":15,\"c\":10,\"rs\":4,\"cs\":3}}},{\"r\":15,\"c\":11,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":15,\"c\":12,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":16,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":15,\"c\":10}}},{\"r\":16,\"c\":11,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":16,\"c\":12,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":17,\"c\":0,\"v\":{\"v\":\"Font\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Font\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":17,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":17,\"c\":2,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":\"11\",\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":17,\"c\":3,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":13,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":17,\"c\":4,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":9,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":17,\"c\":5,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":13,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":17,\"c\":6,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":\"rgb(255, 215, 0)\",\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":17,\"c\":7,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(67, 110, 238)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":17,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":17,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":17,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":15,\"c\":10}}},{\"r\":17,\"c\":11,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":17,\"c\":12,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":18,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":15,\"c\":10}}},{\"r\":18,\"c\":11,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":18,\"c\":12,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":19,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":19,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":19,\"c\":2,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":\"rgb(67, 110, 238)\",\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(255, 215, 0)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":19,\"c\":3,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":\"10\",\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":19,\"c\":4,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":1,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":19,\"c\":5,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"cl\":1,\"m\":\"Luckysheet\"}},{\"r\":19,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"1\",\"vt\":\"0\",\"cl\":1}},{\"r\":19,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":19,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":19,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":19,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":21,\"c\":0,\"v\":{\"v\":\"Format\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Format\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":21,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":21,\"c\":2,\"v\":{\"ct\":{\"fa\":\"##0.00\",\"t\":\"n\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"0.25\",\"v\":0.25}},{\"r\":21,\"c\":3,\"v\":{\"ct\":{\"fa\":\"$#,##0.00_);($#,##0.00)\",\"t\":\"n\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"$0.25 \",\"v\":0.25}},{\"r\":21,\"c\":4,\"v\":{\"ct\":{\"fa\":\"\\\"$\\\" 0.00\",\"t\":\"n\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"$ 0.25\",\"v\":0.25}},{\"r\":21,\"c\":5,\"v\":{\"ct\":{\"fa\":\"0%\",\"t\":\"n\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"25%\",\"v\":0.25}},{\"r\":21,\"c\":6,\"v\":{\"ct\":{\"fa\":\"# ?/?\",\"t\":\"n\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\" 1/4\",\"v\":0.25}},{\"r\":21,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":21,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":21,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":21,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":2,\"v\":{\"ct\":{\"fa\":\"0.00E+00\",\"t\":\"n\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"2.50E-01\",\"v\":0.25}},{\"r\":23,\"c\":3,\"v\":{\"v\":0.25,\"ct\":{\"fa\":\"0.00\",\"t\":\"n\"},\"m\":\"0.25\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":4,\"v\":{\"ct\":{\"fa\":\"AM/PM h:mm:ss\",\"t\":\"d\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":44032,\"m\":\"AM 12:00:00\"}},{\"r\":23,\"c\":5,\"v\":{\"ct\":{\"fa\":\"yyyy/MM/dd\",\"t\":\"d\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":44032,\"m\":\"2020/07/20\"}},{\"r\":23,\"c\":6,\"v\":{\"ct\":{\"fa\":\"yyyy\\\"年\\\"M\\\"月\\\"d\\\"日\\\"\",\"t\":\"d\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":44032,\"m\":\"2020年7月20日\"}},{\"r\":23,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":25,\"c\":0,\"v\":{\"v\":\"Alignment\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Alignment\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":25,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":25,\"c\":2,\"v\":{\"v\":\"Top Left\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Top Left\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"1\",\"vt\":\"1\"}},{\"r\":25,\"c\":3,\"v\":{\"v\":\"Top Center\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Top Center\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"0\",\"vt\":\"1\"}},{\"r\":25,\"c\":4,\"v\":{\"v\":\"Top Right\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Top Right\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"2\",\"vt\":\"1\"}},{\"r\":25,\"c\":5,\"v\":{\"v\":\"Center Left\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Center Left\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"1\",\"vt\":\"0\"}},{\"r\":25,\"c\":6,\"v\":{\"v\":\"Center Center\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Center Center\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"0\",\"vt\":\"0\"}},{\"r\":25,\"c\":7,\"v\":{\"v\":\"Center Right\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Center Right\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"2\",\"vt\":\"0\"}},{\"r\":25,\"c\":8,\"v\":{\"v\":\"Bottom Left\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Bottom Left\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"1\",\"vt\":\"2\"}},{\"r\":25,\"c\":9,\"v\":{\"v\":\"Bottom Center\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Bottom Center\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"0\",\"vt\":\"2\"}},{\"r\":25,\"c\":10,\"v\":{\"v\":\"Bottom Right\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Bottom Right\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"2\",\"vt\":\"2\"}},{\"r\":26,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":0,\"v\":{\"v\":\"WordWrap\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"WordWrap\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":2,\"v\":{\"v\":\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"tb\":\"2\"}},{\"r\":28,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"tb\":\"1\"}},{\"r\":28,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":29,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"inlineStr\",\"s\":[{\"ff\":\"\\\"times new roman\\\"\",\"fc\":\"rgb(51, 51, 51)\",\"fs\":\"12\",\"cl\":0,\"un\":0,\"bl\":1,\"it\":0,\"v\":\"TextRotate\"}]},\"ht\":\"1\",\"vt\":\"0\"}},{\"r\":29,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"I am Luckysheet text rotate style\",\"m\":\"I am Luckysheet text rotate style\",\"tr\":\"1\",\"tb\":\"2\",\"ht\":\"1\",\"fs\":\"12\"}},{\"r\":29,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"I am Luckysheet text rotate style\",\"m\":\"I am Luckysheet text rotate style\",\"tr\":\"2\",\"tb\":\"2\",\"ht\":\"0\",\"fs\":\"12\"}},{\"r\":29,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"I am Luckysheet text rotate style\",\"m\":\"I am Luckysheet text rotate style\",\"tr\":\"4\",\"tb\":\"2\",\"ht\":\"1\",\"fs\":\"12\",\"vt\":\"2\"}},{\"r\":29,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"I am Luckysheet text rotate style\",\"m\":\"I am Luckysheet text rotate style\",\"tr\":\"5\",\"tb\":\"2\",\"ht\":\"1\",\"fs\":\"12\"}},{\"r\":29,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"I am Luckysheet text rotate style\",\"m\":\"I am Luckysheet text rotate style\",\"tr\":\"1\",\"tb\":\"1\",\"ht\":\"1\",\"fs\":\"12\",\"vt\":\"0\"}},{\"r\":30,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"hidden1\",\"m\":\"hidden1\"}},{\"r\":31,\"c\":0,\"v\":{\"m\":\"hidden2\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"hidden2\"}},{\"r\":33,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}}],\r\n    \"ch_width\": 2361,\r\n    \"rh_height\": 936,\r\n    \"luckysheet_select_save\": [\r\n        {\r\n            \"left\": 741,\r\n            \"width\": 138,\r\n            \"top\": 796,\r\n            \"height\": 19,\r\n            \"left_move\": 741,\r\n            \"width_move\": 138,\r\n            \"top_move\": 796,\r\n            \"height_move\": 19,\r\n            \"row\": [\r\n                33,\r\n                33\r\n            ],\r\n            \"column\": [\r\n                6,\r\n                6\r\n            ],\r\n            \"row_focus\": 33,\r\n            \"column_focus\": 6\r\n        }\r\n    ],\r\n    \"calcChain\": [\r\n        {\r\n            \"r\": 0,\r\n            \"c\": 3,\r\n            \"index\": \"0\",\r\n            \"func\": [\r\n                true,\r\n                3,\r\n                \"=Formula!A1+Formula!B1\"\r\n            ],\r\n            \"color\": \"w\",\r\n            \"parent\": null,\r\n            \"chidren\": {},\r\n            \"times\": 0\r\n        }\r\n    ],\r\n    \"scrollLeft\": 0,\r\n    \"scrollTop\": 0\r\n}\r\n// export default sheetCell"
  },
  {
    "path": "src/demoData/sheetChart.js",
    "content": "window.sheetChart = {\r\n\t\"name\": \"Chart\",\r\n\t\"color\": \"\",\r\n\t\"status\": 0,\r\n\t\"order\": 8,\r\n\t\"index\": \"Sheet_6az6nei65t1i_1596209937084\",\r\n\t\"celldata\": [{\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Mon\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Mon\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Tues\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Tues\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Wed\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Wed\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Thur\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Thur\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Fri\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Fri\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Sat\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Sat\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Sun\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Sun\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"BUS\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"BUS\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 320,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"320\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 302,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"302\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 301,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"301\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 334,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"334\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 390,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"390\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 330,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"330\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 320,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"320\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"UBER\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"UBER\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 120,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"120\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 132,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"132\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 101,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"101\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 134,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"134\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 90,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"90\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 230,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"230\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 210,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"210\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"TAXI\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"TAXI\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 220,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"220\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 182,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"182\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 191,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"191\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 234,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"234\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 290,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"290\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 330,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"330\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 310,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"310\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"SUBWAY\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"SUBWAY\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 820,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"820\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 832,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"832\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 901,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"901\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 934,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"934\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1290,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1290\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1330,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1330\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1320,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1320\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"country\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"country\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Population\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Population\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"India\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"India\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1354051854,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1354051854\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Pakistan\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Pakistan\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 200813818,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"200813818\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"China\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"China\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1415045928,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1415045928\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Japan\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Japan\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 127185332,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"127185332\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"South-Eastern\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"South-Eastern\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 655636576,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"655636576\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Western\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Western\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 272298399,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"272298399\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Eastern\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Eastern\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 433643132,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"433643132\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Western\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Western\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 381980688,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"381980688\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Northern\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Northern\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 237784677,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"237784677\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Others\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Others\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 234512021,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"234512021\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Europe\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Europe\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 742648010,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"742648010\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}],\r\n\t\"row\": 84,\r\n\t\"column\": 60,\r\n\t\"config\": {\r\n\t\t\"merge\": {},\r\n\t\t\"rowlen\": {\r\n\t\t\t\"0\": 20,\r\n\t\t\t\"1\": 20,\r\n\t\t\t\"2\": 20,\r\n\t\t\t\"3\": 20,\r\n\t\t\t\"4\": 20,\r\n\t\t\t\"22\": 20,\r\n\t\t\t\"23\": 20,\r\n\t\t\t\"24\": 20,\r\n\t\t\t\"25\": 20,\r\n\t\t\t\"26\": 20,\r\n\t\t\t\"27\": 20,\r\n\t\t\t\"28\": 20,\r\n\t\t\t\"29\": 20,\r\n\t\t\t\"30\": 20,\r\n\t\t\t\"31\": 20,\r\n\t\t\t\"32\": 20,\r\n\t\t\t\"33\": 20\r\n\t\t}\r\n\t},\r\n\t\"pivotTable\": null,\r\n\t\"isPivotTable\": false,\r\n\t\"ch_width\": 4560,\r\n\t\"rh_height\": 1807,\r\n\t\"luckysheet_select_save\": [{\r\n\t\t\"left\": 0,\r\n\t\t\"width\": 73,\r\n\t\t\"top\": 445,\r\n\t\t\"height\": 20,\r\n\t\t\"left_move\": 0,\r\n\t\t\"width_move\": 147,\r\n\t\t\"top_move\": 445,\r\n\t\t\"height_move\": 251,\r\n\t\t\"row\": [22, 33],\r\n\t\t\"column\": [0, 1],\r\n\t\t\"row_focus\": 22,\r\n\t\t\"column_focus\": 0\r\n\t}],\r\n\t\"luckysheet_selection_range\": [],\r\n\t\"scrollLeft\": 0,\r\n\t\"scrollTop\": 185,\r\n\t\"chart\": [{\r\n\t\t\"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n\t\t\"width\": 400,\r\n\t\t\"height\": 250,\r\n\t\t\"left\": 20,\r\n\t\t\"top\": 120,\r\n\t\t\"sheetIndex\": \"Sheet_6az6nei65t1i_1596209937084\",\r\n\t\t\"needRangeShow\": true,\r\n\t\t\"chartOptions\": {\r\n\t\t\t\"chart_id\": \"chart_p145W6i73otw_1596209943446\",\r\n\t\t\t\"chartAllType\": \"echarts|column|default\",\r\n\t\t\t\"chartPro\": \"echarts\",\r\n\t\t\t\"chartType\": \"pie\",\r\n\t\t\t\"chartStyle\": \"default\",\r\n\t\t\t\"chartData\": [\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": null,\r\n\t\t\t\t\t\"m\": \"\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Mon\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Mon\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Tues\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Tues\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Wed\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Wed\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Thur\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Thur\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Fri\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Fri\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Sat\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Sat\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Sun\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Sun\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"BUS\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"BUS\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 320,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"320\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 302,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"302\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 301,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"301\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 334,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"334\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 390,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"390\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 330,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"330\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 320,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"320\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"UBER\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"UBER\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 120,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"120\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 132,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"132\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 101,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"101\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 134,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"134\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 90,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"90\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 230,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"230\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 210,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"210\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"TAXI\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"TAXI\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 220,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"220\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 182,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"182\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 191,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"191\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 234,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"234\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 290,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"290\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 330,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"330\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 310,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"310\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"SUBWAY\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"SUBWAY\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 820,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"820\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 832,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"832\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 901,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"901\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 934,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"934\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 1290,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"1290\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 1330,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"1330\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 1320,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"1320\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}]\r\n\t\t\t],\r\n\t\t\t\"rangeArray\": [{\r\n\t\t\t\t\"row\": [0, 4],\r\n\t\t\t\t\"column\": [0, 7]\r\n\t\t\t}],\r\n\t\t\t\"rangeTxt\": \"A1:H5\",\r\n\t\t\t\"rangeColCheck\": {\r\n\t\t\t\t\"exits\": true,\r\n\t\t\t\t\"range\": [0, 0]\r\n\t\t\t},\r\n\t\t\t\"rangeRowCheck\": {\r\n\t\t\t\t\"exits\": true,\r\n\t\t\t\t\"range\": [0, 0]\r\n\t\t\t},\r\n\t\t\t\"rangeConfigCheck\": false,\r\n\t\t\t\"rangeSplitArray\": {\r\n\t\t\t\t\"title\": {\r\n\t\t\t\t\t\"row\": [0, 0],\r\n\t\t\t\t\t\"column\": [0, 0]\r\n\t\t\t\t},\r\n\t\t\t\t\"rowtitle\": {\r\n\t\t\t\t\t\"row\": [0, 0],\r\n\t\t\t\t\t\"column\": [1, 7]\r\n\t\t\t\t},\r\n\t\t\t\t\"coltitle\": {\r\n\t\t\t\t\t\"row\": [1, 4],\r\n\t\t\t\t\t\"column\": [0, 0]\r\n\t\t\t\t},\r\n\t\t\t\t\"content\": {\r\n\t\t\t\t\t\"row\": [1, 4],\r\n\t\t\t\t\t\"column\": [1, 7]\r\n\t\t\t\t},\r\n\t\t\t\t\"type\": \"normal\",\r\n\t\t\t\t\"range\": {\r\n\t\t\t\t\t\"row\": [0, 4],\r\n\t\t\t\t\t\"column\": [0, 7]\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t\"chartDataCache\": {\r\n\t\t\t\t\"label\": [\"Mon\", \"Tues\", \"Wed\", \"Thur\", \"Fri\", \"Sat\", \"Sun\"],\r\n\t\t\t\t\"xAxis\": [\"BUS\", \"UBER\", \"TAXI\", \"SUBWAY\"],\r\n\t\t\t\t\"series\": [\r\n\t\t\t\t\t[320, 302, 301, 334, 390, 330, 320],\r\n\t\t\t\t\t[120, 132, 101, 134, 90, 230, 210],\r\n\t\t\t\t\t[220, 182, 191, 234, 290, 330, 310],\r\n\t\t\t\t\t[820, 832, 901, 934, 1290, 1330, 1320]\r\n\t\t\t\t],\r\n\t\t\t\t\"series_tpye\": {\r\n\t\t\t\t\t\"0\": \"num\",\r\n\t\t\t\t\t\"1\": \"num\",\r\n\t\t\t\t\t\"2\": \"num\",\r\n\t\t\t\t\t\"3\": \"num\",\r\n\t\t\t\t\t\"4\": \"num\",\r\n\t\t\t\t\t\"5\": \"num\",\r\n\t\t\t\t\t\"6\": \"num\"\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t\"chartDataSeriesOrder\": {\r\n\t\t\t\t\"0\": 0,\r\n\t\t\t\t\"1\": 1,\r\n\t\t\t\t\"2\": 2,\r\n\t\t\t\t\"3\": 3,\r\n\t\t\t\t\"4\": 4,\r\n\t\t\t\t\"5\": 5,\r\n\t\t\t\t\"6\": 6,\r\n\t\t\t\t\"length\": 7\r\n\t\t\t},\r\n\t\t\t\"defaultOption\": {\r\n\t\t\t\t\"title\": {\r\n\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\"text\": \"默认标题\",\r\n\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"position\": {\r\n\t\t\t\t\t\t\"value\": \"left-top\",\r\n\t\t\t\t\t\t\"offsetX\": 40,\r\n\t\t\t\t\t\t\"offsetY\": 50\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"subtitle\": {\r\n\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"distance\": {\r\n\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\"cusGap\": 40\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"config\": {\r\n\t\t\t\t\t\"color\": \"transparent\",\r\n\t\t\t\t\t\"fontFamily\": \"Sans-serif\",\r\n\t\t\t\t\t\"grid\": {\r\n\t\t\t\t\t\t\"value\": \"normal\",\r\n\t\t\t\t\t\t\"top\": 5,\r\n\t\t\t\t\t\t\"left\": 10,\r\n\t\t\t\t\t\t\"right\": 20,\r\n\t\t\t\t\t\t\"bottom\": 10\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"legend\": {\r\n\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\"selectMode\": \"multiple\",\r\n\t\t\t\t\t\"selected\": [{\r\n\t\t\t\t\t\t\"seriesName\": \"衣服\",\r\n\t\t\t\t\t\t\"isShow\": true\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"seriesName\": \"食材\",\r\n\t\t\t\t\t\t\"isShow\": true\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"seriesName\": \"图书\",\r\n\t\t\t\t\t\t\"isShow\": true\r\n\t\t\t\t\t}],\r\n\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"position\": {\r\n\t\t\t\t\t\t\"value\": \"left-top\",\r\n\t\t\t\t\t\t\"offsetX\": 40,\r\n\t\t\t\t\t\t\"offsetY\": 50,\r\n\t\t\t\t\t\t\"direction\": \"horizontal\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"width\": {\r\n\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\"cusSize\": 25\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"height\": {\r\n\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\"cusSize\": 14\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"distance\": {\r\n\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\"cusGap\": 10\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"itemGap\": 10,\r\n\t\t\t\t\t\"data\": [\"Mon\", \"Tues\", \"Wed\", \"Thur\", \"Fri\", \"Sat\", \"Sun\"]\r\n\t\t\t\t},\r\n\t\t\t\t\"tooltip\": {\r\n\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"backgroundColor\": \"rgba(50,50,50,0.7)\",\r\n\t\t\t\t\t\"triggerOn\": \"mousemove\",\r\n\t\t\t\t\t\"triggerType\": \"item\",\r\n\t\t\t\t\t\"axisPointer\": {\r\n\t\t\t\t\t\t\"type\": \"line\",\r\n\t\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\t\"color\": \"#555\",\r\n\t\t\t\t\t\t\t\"width\": \"normal\",\r\n\t\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"format\": [{\r\n\t\t\t\t\t\t\"seriesName\": \"衣服\",\r\n\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"seriesName\": \"食材\",\r\n\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"seriesName\": \"图书\",\r\n\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t}],\r\n\t\t\t\t\t\"position\": \"auto\"\r\n\t\t\t\t},\r\n\t\t\t\t\"axis\": {\r\n\t\t\t\t\t\"axisType\": \"xAxisDown\",\r\n\t\t\t\t\t\"xAxisUp\": {\r\n\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\"title\": {\r\n\t\t\t\t\t\t\t\"showTitle\": false,\r\n\t\t\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\t\t\"nameGap\": 15,\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"fzPosition\": \"end\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"name\": \"显示X轴\",\r\n\t\t\t\t\t\t\"inverse\": false,\r\n\t\t\t\t\t\t\"tickLine\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tick\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"position\": \"outside\",\r\n\t\t\t\t\t\t\t\"length\": 5,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tickLabel\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\"optimize\": 0,\r\n\t\t\t\t\t\t\t\"distance\": 0,\r\n\t\t\t\t\t\t\t\"min\": \"auto\",\r\n\t\t\t\t\t\t\t\"max\": \"auto\",\r\n\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netLine\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"type\": \"solid\",\r\n\t\t\t\t\t\t\t\"color\": \"auto\",\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netArea\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"colorOne\": \"auto\",\r\n\t\t\t\t\t\t\t\"colorTwo\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"axisLine\": {\r\n\t\t\t\t\t\t\t\"onZero\": false\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"xAxisDown\": {\r\n\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\"title\": {\r\n\t\t\t\t\t\t\t\"showTitle\": false,\r\n\t\t\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\t\t\"nameGap\": 15,\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"fzPosition\": \"end\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"name\": \"显示X轴\",\r\n\t\t\t\t\t\t\"inverse\": false,\r\n\t\t\t\t\t\t\"tickLine\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tick\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"position\": \"outside\",\r\n\t\t\t\t\t\t\t\"length\": 5,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tickLabel\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\"optimize\": 0,\r\n\t\t\t\t\t\t\t\"distance\": 0,\r\n\t\t\t\t\t\t\t\"min\": null,\r\n\t\t\t\t\t\t\t\"max\": null,\r\n\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netLine\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"type\": \"solid\",\r\n\t\t\t\t\t\t\t\"color\": \"auto\",\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netArea\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"colorOne\": \"auto\",\r\n\t\t\t\t\t\t\t\"colorTwo\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"data\": [\"BUS\", \"UBER\", \"TAXI\", \"SUBWAY\"],\r\n\t\t\t\t\t\t\"type\": \"category\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"yAxisLeft\": {\r\n\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\"title\": {\r\n\t\t\t\t\t\t\t\"showTitle\": false,\r\n\t\t\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\t\t\"nameGap\": 15,\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"fzPosition\": \"end\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"name\": \"显示Y轴\",\r\n\t\t\t\t\t\t\"inverse\": false,\r\n\t\t\t\t\t\t\"tickLine\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tick\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"position\": \"outside\",\r\n\t\t\t\t\t\t\t\"length\": 5,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tickLabel\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"formatter\": {\r\n\t\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"split\": 5,\r\n\t\t\t\t\t\t\t\"min\": null,\r\n\t\t\t\t\t\t\t\"max\": null,\r\n\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\"digit\": \"auto\",\r\n\t\t\t\t\t\t\t\"distance\": 0\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netLine\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"type\": \"solid\",\r\n\t\t\t\t\t\t\t\"color\": \"auto\",\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netArea\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"colorOne\": \"auto\",\r\n\t\t\t\t\t\t\t\"colorTwo\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"type\": \"value\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"yAxisRight\": {\r\n\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\"title\": {\r\n\t\t\t\t\t\t\t\"showTitle\": false,\r\n\t\t\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\t\t\"nameGap\": 15,\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"fzPosition\": \"end\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"name\": \"显示Y轴\",\r\n\t\t\t\t\t\t\"inverse\": false,\r\n\t\t\t\t\t\t\"tickLine\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tick\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"position\": \"outside\",\r\n\t\t\t\t\t\t\t\"length\": 5,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tickLabel\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"formatter\": {\r\n\t\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"split\": 5,\r\n\t\t\t\t\t\t\t\"min\": null,\r\n\t\t\t\t\t\t\t\"max\": null,\r\n\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\"digit\": \"auto\",\r\n\t\t\t\t\t\t\t\"distance\": 0\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netLine\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"type\": \"solid\",\r\n\t\t\t\t\t\t\t\"color\": \"auto\",\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netArea\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"colorOne\": \"auto\",\r\n\t\t\t\t\t\t\t\"colorTwo\": \"auto\"\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"series\": [{\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [320, 120, 220, 820],\r\n\t\t\t\t\t\"type\": \"bar\",\r\n\t\t\t\t\t\"name\": \"Mon\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [302, 132, 182, 832],\r\n\t\t\t\t\t\"type\": \"bar\",\r\n\t\t\t\t\t\"name\": \"Tues\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [301, 101, 191, 901],\r\n\t\t\t\t\t\"type\": \"bar\",\r\n\t\t\t\t\t\"name\": \"Wed\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [334, 134, 234, 934],\r\n\t\t\t\t\t\"type\": \"bar\",\r\n\t\t\t\t\t\"name\": \"Thur\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [390, 90, 290, 1290],\r\n\t\t\t\t\t\"type\": \"bar\",\r\n\t\t\t\t\t\"name\": \"Fri\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [330, 230, 330, 1330],\r\n\t\t\t\t\t\"type\": \"bar\",\r\n\t\t\t\t\t\"name\": \"Sat\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [320, 210, 310, 1320],\r\n\t\t\t\t\t\"type\": \"bar\",\r\n\t\t\t\t\t\"name\": \"Sun\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}],\r\n\t\t\t\t\"seriesData\": [\r\n\t\t\t\t\t[320, 120, 220, 820],\r\n\t\t\t\t\t[302, 132, 182, 832],\r\n\t\t\t\t\t[301, 101, 191, 901],\r\n\t\t\t\t\t[334, 134, 234, 934],\r\n\t\t\t\t\t[390, 90, 290, 1290],\r\n\t\t\t\t\t[330, 230, 330, 1330],\r\n\t\t\t\t\t[320, 210, 310, 1320]\r\n\t\t\t\t]\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"chart_id\": \"chart_lpiiaae1543z_1596209948642\",\r\n\t\t\"width\": 400,\r\n\t\t\"height\": 250,\r\n\t\t\"left\": 500,\r\n\t\t\"top\": 120,\r\n\t\t\"sheetIndex\": \"Sheet_6az6nei65t1i_1596209937084\",\r\n\t\t\"needRangeShow\": false,\r\n\t\t\"chartOptions\": {\r\n\t\t\t\"chart_id\": \"chart_lpiiaae1543z_1596209948642\",\r\n\t\t\t\"chartAllType\": \"echarts|line|default\",\r\n\t\t\t\"chartPro\": \"echarts\",\r\n\t\t\t\"chartType\": \"pie\",\r\n\t\t\t\"chartStyle\": \"default\",\r\n\t\t\t\"chartData\": [\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": null,\r\n\t\t\t\t\t\"m\": \"\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Mon\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Mon\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Tues\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Tues\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Wed\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Wed\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Thur\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Thur\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Fri\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Fri\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Sat\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Sat\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Sun\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Sun\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"BUS\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"BUS\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 320,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"320\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 302,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"302\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 301,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"301\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 334,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"334\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 390,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"390\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 330,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"330\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 320,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"320\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"UBER\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"UBER\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 120,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"120\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 132,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"132\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 101,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"101\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 134,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"134\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 90,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"90\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 230,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"230\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 210,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"210\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"TAXI\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"TAXI\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 220,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"220\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 182,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"182\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 191,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"191\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 234,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"234\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 290,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"290\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 330,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"330\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 310,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"310\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"SUBWAY\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"SUBWAY\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 820,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"820\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 832,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"832\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 901,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"901\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 934,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"934\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 1290,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"1290\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 1330,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"1330\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 1320,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"1320\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}]\r\n\t\t\t],\r\n\t\t\t\"rangeArray\": [{\r\n\t\t\t\t\"left\": 0,\r\n\t\t\t\t\"width\": 73,\r\n\t\t\t\t\"top\": 0,\r\n\t\t\t\t\"height\": 20,\r\n\t\t\t\t\"left_move\": 0,\r\n\t\t\t\t\"width_move\": 591,\r\n\t\t\t\t\"top_move\": 0,\r\n\t\t\t\t\"height_move\": 104,\r\n\t\t\t\t\"row\": [0, 4],\r\n\t\t\t\t\"column\": [0, 7],\r\n\t\t\t\t\"row_focus\": 0,\r\n\t\t\t\t\"column_focus\": 0\r\n\t\t\t}],\r\n\t\t\t\"rangeTxt\": \"A1:H5\",\r\n\t\t\t\"rangeColCheck\": {\r\n\t\t\t\t\"exits\": true,\r\n\t\t\t\t\"range\": [0, 0]\r\n\t\t\t},\r\n\t\t\t\"rangeRowCheck\": {\r\n\t\t\t\t\"exits\": true,\r\n\t\t\t\t\"range\": [0, 0]\r\n\t\t\t},\r\n\t\t\t\"rangeConfigCheck\": false,\r\n\t\t\t\"rangeSplitArray\": {\r\n\t\t\t\t\"title\": {\r\n\t\t\t\t\t\"row\": [0, 0],\r\n\t\t\t\t\t\"column\": [0, 0]\r\n\t\t\t\t},\r\n\t\t\t\t\"rowtitle\": {\r\n\t\t\t\t\t\"row\": [0, 0],\r\n\t\t\t\t\t\"column\": [1, 7]\r\n\t\t\t\t},\r\n\t\t\t\t\"coltitle\": {\r\n\t\t\t\t\t\"row\": [1, 4],\r\n\t\t\t\t\t\"column\": [0, 0]\r\n\t\t\t\t},\r\n\t\t\t\t\"content\": {\r\n\t\t\t\t\t\"row\": [1, 4],\r\n\t\t\t\t\t\"column\": [1, 7]\r\n\t\t\t\t},\r\n\t\t\t\t\"type\": \"normal\",\r\n\t\t\t\t\"range\": {\r\n\t\t\t\t\t\"left\": 0,\r\n\t\t\t\t\t\"width\": 73,\r\n\t\t\t\t\t\"top\": 0,\r\n\t\t\t\t\t\"height\": 20,\r\n\t\t\t\t\t\"left_move\": 0,\r\n\t\t\t\t\t\"width_move\": 591,\r\n\t\t\t\t\t\"top_move\": 0,\r\n\t\t\t\t\t\"height_move\": 104,\r\n\t\t\t\t\t\"row\": [0, 4],\r\n\t\t\t\t\t\"column\": [0, 7],\r\n\t\t\t\t\t\"row_focus\": 0,\r\n\t\t\t\t\t\"column_focus\": 0\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t\"chartDataCache\": {\r\n\t\t\t\t\"label\": [\"Mon\", \"Tues\", \"Wed\", \"Thur\", \"Fri\", \"Sat\", \"Sun\"],\r\n\t\t\t\t\"xAxis\": [\"BUS\", \"UBER\", \"TAXI\", \"SUBWAY\"],\r\n\t\t\t\t\"series\": [\r\n\t\t\t\t\t[320, 302, 301, 334, 390, 330, 320],\r\n\t\t\t\t\t[120, 132, 101, 134, 90, 230, 210],\r\n\t\t\t\t\t[220, 182, 191, 234, 290, 330, 310],\r\n\t\t\t\t\t[820, 832, 901, 934, 1290, 1330, 1320]\r\n\t\t\t\t],\r\n\t\t\t\t\"series_tpye\": {\r\n\t\t\t\t\t\"0\": \"num\",\r\n\t\t\t\t\t\"1\": \"num\",\r\n\t\t\t\t\t\"2\": \"num\",\r\n\t\t\t\t\t\"3\": \"num\",\r\n\t\t\t\t\t\"4\": \"num\",\r\n\t\t\t\t\t\"5\": \"num\",\r\n\t\t\t\t\t\"6\": \"num\"\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t\"chartDataSeriesOrder\": {\r\n\t\t\t\t\"0\": 0,\r\n\t\t\t\t\"1\": 1,\r\n\t\t\t\t\"2\": 2,\r\n\t\t\t\t\"3\": 3,\r\n\t\t\t\t\"4\": 4,\r\n\t\t\t\t\"5\": 5,\r\n\t\t\t\t\"6\": 6,\r\n\t\t\t\t\"length\": 7\r\n\t\t\t},\r\n\t\t\t\"defaultOption\": {\r\n\t\t\t\t\"title\": {\r\n\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\"text\": \"默认标题\",\r\n\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"position\": {\r\n\t\t\t\t\t\t\"value\": \"left-top\",\r\n\t\t\t\t\t\t\"offsetX\": 40,\r\n\t\t\t\t\t\t\"offsetY\": 50\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"subtitle\": {\r\n\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"distance\": {\r\n\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\"cusGap\": 40\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"config\": {\r\n\t\t\t\t\t\"color\": \"transparent\",\r\n\t\t\t\t\t\"fontFamily\": \"Sans-serif\",\r\n\t\t\t\t\t\"grid\": {\r\n\t\t\t\t\t\t\"value\": \"normal\",\r\n\t\t\t\t\t\t\"top\": 5,\r\n\t\t\t\t\t\t\"left\": 10,\r\n\t\t\t\t\t\t\"right\": 20,\r\n\t\t\t\t\t\t\"bottom\": 10\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"legend\": {\r\n\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\"selectMode\": \"multiple\",\r\n\t\t\t\t\t\"selected\": [{\r\n\t\t\t\t\t\t\"seriesName\": \"衣服\",\r\n\t\t\t\t\t\t\"isShow\": true\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"seriesName\": \"食材\",\r\n\t\t\t\t\t\t\"isShow\": true\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"seriesName\": \"图书\",\r\n\t\t\t\t\t\t\"isShow\": true\r\n\t\t\t\t\t}],\r\n\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"position\": {\r\n\t\t\t\t\t\t\"value\": \"left-top\",\r\n\t\t\t\t\t\t\"offsetX\": 40,\r\n\t\t\t\t\t\t\"offsetY\": 50,\r\n\t\t\t\t\t\t\"direction\": \"horizontal\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"width\": {\r\n\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\"cusSize\": 25\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"height\": {\r\n\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\"cusSize\": 14\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"distance\": {\r\n\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\"cusGap\": 10\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"itemGap\": 10,\r\n\t\t\t\t\t\"data\": [\"Mon\", \"Tues\", \"Wed\", \"Thur\", \"Fri\", \"Sat\", \"Sun\"]\r\n\t\t\t\t},\r\n\t\t\t\t\"tooltip\": {\r\n\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"backgroundColor\": \"rgba(50,50,50,0.7)\",\r\n\t\t\t\t\t\"triggerOn\": \"mousemove\",\r\n\t\t\t\t\t\"triggerType\": \"item\",\r\n\t\t\t\t\t\"axisPointer\": {\r\n\t\t\t\t\t\t\"type\": \"line\",\r\n\t\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\t\"color\": \"#555\",\r\n\t\t\t\t\t\t\t\"width\": \"normal\",\r\n\t\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"format\": [{\r\n\t\t\t\t\t\t\"seriesName\": \"衣服\",\r\n\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"seriesName\": \"食材\",\r\n\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"seriesName\": \"图书\",\r\n\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t}],\r\n\t\t\t\t\t\"position\": \"auto\"\r\n\t\t\t\t},\r\n\t\t\t\t\"axis\": {\r\n\t\t\t\t\t\"axisType\": \"xAxisDown\",\r\n\t\t\t\t\t\"xAxisUp\": {\r\n\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\"title\": {\r\n\t\t\t\t\t\t\t\"showTitle\": false,\r\n\t\t\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\t\t\"nameGap\": 15,\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"fzPosition\": \"end\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"name\": \"显示X轴\",\r\n\t\t\t\t\t\t\"inverse\": false,\r\n\t\t\t\t\t\t\"tickLine\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tick\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"position\": \"outside\",\r\n\t\t\t\t\t\t\t\"length\": 5,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tickLabel\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\"optimize\": 0,\r\n\t\t\t\t\t\t\t\"distance\": 0,\r\n\t\t\t\t\t\t\t\"min\": \"auto\",\r\n\t\t\t\t\t\t\t\"max\": \"auto\",\r\n\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netLine\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"type\": \"solid\",\r\n\t\t\t\t\t\t\t\"color\": \"auto\",\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netArea\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"colorOne\": \"auto\",\r\n\t\t\t\t\t\t\t\"colorTwo\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"axisLine\": {\r\n\t\t\t\t\t\t\t\"onZero\": false\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"xAxisDown\": {\r\n\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\"title\": {\r\n\t\t\t\t\t\t\t\"showTitle\": false,\r\n\t\t\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\t\t\"nameGap\": 15,\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"fzPosition\": \"end\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"name\": \"显示X轴\",\r\n\t\t\t\t\t\t\"inverse\": false,\r\n\t\t\t\t\t\t\"tickLine\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tick\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"position\": \"outside\",\r\n\t\t\t\t\t\t\t\"length\": 5,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tickLabel\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\"optimize\": 0,\r\n\t\t\t\t\t\t\t\"distance\": 0,\r\n\t\t\t\t\t\t\t\"min\": null,\r\n\t\t\t\t\t\t\t\"max\": null,\r\n\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netLine\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"type\": \"solid\",\r\n\t\t\t\t\t\t\t\"color\": \"auto\",\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netArea\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"colorOne\": \"auto\",\r\n\t\t\t\t\t\t\t\"colorTwo\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"data\": [\"BUS\", \"UBER\", \"TAXI\", \"SUBWAY\"],\r\n\t\t\t\t\t\t\"type\": \"category\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"yAxisLeft\": {\r\n\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\"title\": {\r\n\t\t\t\t\t\t\t\"showTitle\": false,\r\n\t\t\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\t\t\"nameGap\": 15,\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"fzPosition\": \"end\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"name\": \"显示Y轴\",\r\n\t\t\t\t\t\t\"inverse\": false,\r\n\t\t\t\t\t\t\"tickLine\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tick\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"position\": \"outside\",\r\n\t\t\t\t\t\t\t\"length\": 5,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tickLabel\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"formatter\": {\r\n\t\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"split\": 5,\r\n\t\t\t\t\t\t\t\"min\": null,\r\n\t\t\t\t\t\t\t\"max\": null,\r\n\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\"digit\": \"auto\",\r\n\t\t\t\t\t\t\t\"distance\": 0\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netLine\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"type\": \"solid\",\r\n\t\t\t\t\t\t\t\"color\": \"auto\",\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netArea\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"colorOne\": \"auto\",\r\n\t\t\t\t\t\t\t\"colorTwo\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"type\": \"value\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"yAxisRight\": {\r\n\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\"title\": {\r\n\t\t\t\t\t\t\t\"showTitle\": false,\r\n\t\t\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\t\t\"nameGap\": 15,\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"fzPosition\": \"end\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"name\": \"显示Y轴\",\r\n\t\t\t\t\t\t\"inverse\": false,\r\n\t\t\t\t\t\t\"tickLine\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tick\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"position\": \"outside\",\r\n\t\t\t\t\t\t\t\"length\": 5,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tickLabel\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"formatter\": {\r\n\t\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"split\": 5,\r\n\t\t\t\t\t\t\t\"min\": null,\r\n\t\t\t\t\t\t\t\"max\": null,\r\n\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\"digit\": \"auto\",\r\n\t\t\t\t\t\t\t\"distance\": 0\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netLine\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"type\": \"solid\",\r\n\t\t\t\t\t\t\t\"color\": \"auto\",\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netArea\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"colorOne\": \"auto\",\r\n\t\t\t\t\t\t\t\"colorTwo\": \"auto\"\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"series\": [{\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [320, 120, 220, 820],\r\n\t\t\t\t\t\"type\": \"line\",\r\n\t\t\t\t\t\"name\": \"Mon\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [302, 132, 182, 832],\r\n\t\t\t\t\t\"type\": \"line\",\r\n\t\t\t\t\t\"name\": \"Tues\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [301, 101, 191, 901],\r\n\t\t\t\t\t\"type\": \"line\",\r\n\t\t\t\t\t\"name\": \"Wed\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [334, 134, 234, 934],\r\n\t\t\t\t\t\"type\": \"line\",\r\n\t\t\t\t\t\"name\": \"Thur\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [390, 90, 290, 1290],\r\n\t\t\t\t\t\"type\": \"line\",\r\n\t\t\t\t\t\"name\": \"Fri\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [330, 230, 330, 1330],\r\n\t\t\t\t\t\"type\": \"line\",\r\n\t\t\t\t\t\"name\": \"Sat\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"itemStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"borderColor\": \"#000\",\r\n\t\t\t\t\t\t\"borderType\": \"solid\",\r\n\t\t\t\t\t\t\"borderWidth\": 1\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"lineStyle\": {\r\n\t\t\t\t\t\t\"color\": null,\r\n\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"data\": [320, 210, 310, 1320],\r\n\t\t\t\t\t\"type\": \"line\",\r\n\t\t\t\t\t\"name\": \"Sun\",\r\n\t\t\t\t\t\"markPoint\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markLine\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"markArea\": {\r\n\t\t\t\t\t\t\"data\": []\r\n\t\t\t\t\t}\r\n\t\t\t\t}],\r\n\t\t\t\t\"seriesData\": [\r\n\t\t\t\t\t[320, 120, 220, 820],\r\n\t\t\t\t\t[302, 132, 182, 832],\r\n\t\t\t\t\t[301, 101, 191, 901],\r\n\t\t\t\t\t[334, 134, 234, 934],\r\n\t\t\t\t\t[390, 90, 290, 1290],\r\n\t\t\t\t\t[330, 230, 330, 1330],\r\n\t\t\t\t\t[320, 210, 310, 1320]\r\n\t\t\t\t]\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"chart_id\": \"chart_ei765e0iKkoe_1596210011748\",\r\n\t\t\"width\": 600,\r\n\t\t\"height\": 250,\r\n\t\t\"left\": 150,\r\n\t\t\"top\": 450,\r\n\t\t\"sheetIndex\": \"Sheet_6az6nei65t1i_1596209937084\",\r\n\t\t\"needRangeShow\": false,\r\n\t\t\"chartOptions\": {\r\n\t\t\t\"chart_id\": \"chart_ei765e0iKkoe_1596210011748\",\r\n\t\t\t\"chartAllType\": \"echarts|pie|default\",\r\n\t\t\t\"chartPro\": \"echarts\",\r\n\t\t\t\"chartType\": \"pie\",\r\n\t\t\t\"chartStyle\": \"default\",\r\n\t\t\t\"chartData\": [\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"country\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"country\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": \"Population\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Population\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"India\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"India\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 1354051854,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"1354051854\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"Pakistan\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Pakistan\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 200813818,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"200813818\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"China\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"China\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 1415045928,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"1415045928\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"Japan\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Japan\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 127185332,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"127185332\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"South-Eastern\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"South-Eastern\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 655636576,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"655636576\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"Western\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Western\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 272298399,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"272298399\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"Eastern\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Eastern\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 433643132,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"433643132\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"Western\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Western\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 381980688,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"381980688\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"Northern\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Northern\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 237784677,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"237784677\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"Others\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Others\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 234512021,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"234512021\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}],\r\n\t\t\t\t[{\r\n\t\t\t\t\t\"v\": \"Europe\",\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"g\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"Europe\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}, {\r\n\t\t\t\t\t\"v\": 742648010,\r\n\t\t\t\t\t\"ct\": {\r\n\t\t\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\t\t\"t\": \"n\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"m\": \"742648010\",\r\n\t\t\t\t\t\"bg\": null,\r\n\t\t\t\t\t\"bl\": 0,\r\n\t\t\t\t\t\"it\": 0,\r\n\t\t\t\t\t\"ff\": 0,\r\n\t\t\t\t\t\"fs\": 11,\r\n\t\t\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\t\t\"ht\": 1,\r\n\t\t\t\t\t\"vt\": 1\r\n\t\t\t\t}]\r\n\t\t\t],\r\n\t\t\t\"rangeArray\": [{\r\n\t\t\t\t\"left\": 0,\r\n\t\t\t\t\"width\": 73,\r\n\t\t\t\t\"top\": 445,\r\n\t\t\t\t\"height\": 20,\r\n\t\t\t\t\"left_move\": 0,\r\n\t\t\t\t\"width_move\": 147,\r\n\t\t\t\t\"top_move\": 445,\r\n\t\t\t\t\"height_move\": 251,\r\n\t\t\t\t\"row\": [22, 33],\r\n\t\t\t\t\"column\": [0, 1],\r\n\t\t\t\t\"row_focus\": 22,\r\n\t\t\t\t\"column_focus\": 0\r\n\t\t\t}],\r\n\t\t\t\"rangeTxt\": \"A23:B34\",\r\n\t\t\t\"rangeColCheck\": {\r\n\t\t\t\t\"exits\": true,\r\n\t\t\t\t\"range\": [0, 0]\r\n\t\t\t},\r\n\t\t\t\"rangeRowCheck\": {\r\n\t\t\t\t\"exits\": true,\r\n\t\t\t\t\"range\": [0, 0]\r\n\t\t\t},\r\n\t\t\t\"rangeConfigCheck\": false,\r\n\t\t\t\"rangeSplitArray\": {\r\n\t\t\t\t\"title\": {\r\n\t\t\t\t\t\"row\": [0, 0],\r\n\t\t\t\t\t\"column\": [0, 0]\r\n\t\t\t\t},\r\n\t\t\t\t\"rowtitle\": {\r\n\t\t\t\t\t\"row\": [0, 0],\r\n\t\t\t\t\t\"column\": [1, 1]\r\n\t\t\t\t},\r\n\t\t\t\t\"coltitle\": {\r\n\t\t\t\t\t\"row\": [1, 11],\r\n\t\t\t\t\t\"column\": [0, 0]\r\n\t\t\t\t},\r\n\t\t\t\t\"content\": {\r\n\t\t\t\t\t\"row\": [1, 11],\r\n\t\t\t\t\t\"column\": [1, 1]\r\n\t\t\t\t},\r\n\t\t\t\t\"type\": \"normal\",\r\n\t\t\t\t\"range\": {\r\n\t\t\t\t\t\"left\": 0,\r\n\t\t\t\t\t\"width\": 73,\r\n\t\t\t\t\t\"top\": 445,\r\n\t\t\t\t\t\"height\": 20,\r\n\t\t\t\t\t\"left_move\": 0,\r\n\t\t\t\t\t\"width_move\": 147,\r\n\t\t\t\t\t\"top_move\": 445,\r\n\t\t\t\t\t\"height_move\": 251,\r\n\t\t\t\t\t\"row\": [22, 33],\r\n\t\t\t\t\t\"column\": [0, 1],\r\n\t\t\t\t\t\"row_focus\": 22,\r\n\t\t\t\t\t\"column_focus\": 0\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t\"chartDataCache\": {\r\n\t\t\t\t\"label\": [\"Population\"],\r\n\t\t\t\t\"xAxis\": [\"India\", \"Pakistan\", \"China\", \"Japan\", \"South-Eastern\", \"Western\", \"Eastern\", \"Western\", \"Northern\", \"Others\", \"Europe\"],\r\n\t\t\t\t\"series\": [\r\n\t\t\t\t\t[1354051854],\r\n\t\t\t\t\t[200813818],\r\n\t\t\t\t\t[1415045928],\r\n\t\t\t\t\t[127185332],\r\n\t\t\t\t\t[655636576],\r\n\t\t\t\t\t[272298399],\r\n\t\t\t\t\t[433643132],\r\n\t\t\t\t\t[381980688],\r\n\t\t\t\t\t[237784677],\r\n\t\t\t\t\t[234512021],\r\n\t\t\t\t\t[742648010]\r\n\t\t\t\t],\r\n\t\t\t\t\"series_tpye\": {\r\n\t\t\t\t\t\"0\": \"num\"\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t\"chartDataSeriesOrder\": {\r\n\t\t\t\t\"0\": 0,\r\n\t\t\t\t\"length\": 1\r\n\t\t\t},\r\n\t\t\t\"defaultOption\": {\r\n\t\t\t\t\"title\": {\r\n\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\"text\": \"默认标题\",\r\n\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"position\": {\r\n\t\t\t\t\t\t\"value\": \"left-top\",\r\n\t\t\t\t\t\t\"offsetX\": 40,\r\n\t\t\t\t\t\t\"offsetY\": 50\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"subtitle\": {\r\n\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"distance\": {\r\n\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\"cusGap\": 40\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"config\": {\r\n\t\t\t\t\t\"color\": \"transparent\",\r\n\t\t\t\t\t\"fontFamily\": \"Sans-serif\",\r\n\t\t\t\t\t\"grid\": {\r\n\t\t\t\t\t\t\"value\": \"normal\",\r\n\t\t\t\t\t\t\"top\": 5,\r\n\t\t\t\t\t\t\"left\": 10,\r\n\t\t\t\t\t\t\"right\": 20,\r\n\t\t\t\t\t\t\"bottom\": 10\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"legend\": {\r\n\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\"selectMode\": \"multiple\",\r\n\t\t\t\t\t\"selected\": [{\r\n\t\t\t\t\t\t\"seriesName\": \"衣服\",\r\n\t\t\t\t\t\t\"isShow\": true\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"seriesName\": \"食材\",\r\n\t\t\t\t\t\t\"isShow\": true\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"seriesName\": \"图书\",\r\n\t\t\t\t\t\t\"isShow\": true\r\n\t\t\t\t\t}],\r\n\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"position\": {\r\n\t\t\t\t\t\t\"value\": \"left-top\",\r\n\t\t\t\t\t\t\"offsetX\": 40,\r\n\t\t\t\t\t\t\"offsetY\": 50,\r\n\t\t\t\t\t\t\"direction\": \"horizontal\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"width\": {\r\n\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\"cusSize\": 25\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"height\": {\r\n\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\"cusSize\": 14\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"distance\": {\r\n\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\"cusGap\": 10\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"itemGap\": 10,\r\n\t\t\t\t\t\"data\": [{\r\n\t\t\t\t\t\t\"name\": \"India\",\r\n\t\t\t\t\t\t\"textStyle\": {\r\n\t\t\t\t\t\t\t\"color\": null\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"value\": 1354051854\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"name\": \"Pakistan\",\r\n\t\t\t\t\t\t\"textStyle\": {\r\n\t\t\t\t\t\t\t\"color\": null\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"value\": 200813818\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"name\": \"China\",\r\n\t\t\t\t\t\t\"textStyle\": {\r\n\t\t\t\t\t\t\t\"color\": null\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"value\": 1415045928\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"name\": \"Japan\",\r\n\t\t\t\t\t\t\"textStyle\": {\r\n\t\t\t\t\t\t\t\"color\": null\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"value\": 127185332\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"name\": \"South-Eastern\",\r\n\t\t\t\t\t\t\"textStyle\": {\r\n\t\t\t\t\t\t\t\"color\": null\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"value\": 655636576\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"name\": \"Western\",\r\n\t\t\t\t\t\t\"textStyle\": {\r\n\t\t\t\t\t\t\t\"color\": null\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"value\": 272298399\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"name\": \"Eastern\",\r\n\t\t\t\t\t\t\"textStyle\": {\r\n\t\t\t\t\t\t\t\"color\": null\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"value\": 433643132\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"name\": \"Western\",\r\n\t\t\t\t\t\t\"textStyle\": {\r\n\t\t\t\t\t\t\t\"color\": null\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"value\": 381980688\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"name\": \"Northern\",\r\n\t\t\t\t\t\t\"textStyle\": {\r\n\t\t\t\t\t\t\t\"color\": null\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"value\": 237784677\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"name\": \"Others\",\r\n\t\t\t\t\t\t\"textStyle\": {\r\n\t\t\t\t\t\t\t\"color\": null\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"value\": 234512021\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"name\": \"Europe\",\r\n\t\t\t\t\t\t\"textStyle\": {\r\n\t\t\t\t\t\t\t\"color\": null\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"value\": 742648010\r\n\t\t\t\t\t}]\r\n\t\t\t\t},\r\n\t\t\t\t\"tooltip\": {\r\n\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"backgroundColor\": \"rgba(50,50,50,0.7)\",\r\n\t\t\t\t\t\"triggerOn\": \"mousemove\",\r\n\t\t\t\t\t\"triggerType\": \"item\",\r\n\t\t\t\t\t\"axisPointer\": {\r\n\t\t\t\t\t\t\"type\": \"line\",\r\n\t\t\t\t\t\t\"style\": {\r\n\t\t\t\t\t\t\t\"color\": \"#555\",\r\n\t\t\t\t\t\t\t\"width\": \"normal\",\r\n\t\t\t\t\t\t\t\"type\": \"solid\"\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"format\": [{\r\n\t\t\t\t\t\t\"seriesName\": \"衣服\",\r\n\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"seriesName\": \"食材\",\r\n\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"seriesName\": \"图书\",\r\n\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t}],\r\n\t\t\t\t\t\"position\": \"auto\"\r\n\t\t\t\t},\r\n\t\t\t\t\"axis\": {\r\n\t\t\t\t\t\"axisType\": \"xAxisDown\",\r\n\t\t\t\t\t\"xAxisUp\": {\r\n\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\"title\": {\r\n\t\t\t\t\t\t\t\"showTitle\": false,\r\n\t\t\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\t\t\"nameGap\": 15,\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"fzPosition\": \"end\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"name\": \"显示X轴\",\r\n\t\t\t\t\t\t\"inverse\": false,\r\n\t\t\t\t\t\t\"tickLine\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tick\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"position\": \"outside\",\r\n\t\t\t\t\t\t\t\"length\": 5,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tickLabel\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\"optimize\": 0,\r\n\t\t\t\t\t\t\t\"distance\": 0,\r\n\t\t\t\t\t\t\t\"min\": \"auto\",\r\n\t\t\t\t\t\t\t\"max\": \"auto\",\r\n\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netLine\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"type\": \"solid\",\r\n\t\t\t\t\t\t\t\"color\": \"auto\",\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netArea\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"colorOne\": \"auto\",\r\n\t\t\t\t\t\t\t\"colorTwo\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"axisLine\": {\r\n\t\t\t\t\t\t\t\"onZero\": false\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"xAxisDown\": {\r\n\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\"title\": {\r\n\t\t\t\t\t\t\t\"showTitle\": false,\r\n\t\t\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\t\t\"nameGap\": 15,\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"fzPosition\": \"end\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"name\": \"显示X轴\",\r\n\t\t\t\t\t\t\"inverse\": false,\r\n\t\t\t\t\t\t\"tickLine\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tick\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"position\": \"outside\",\r\n\t\t\t\t\t\t\t\"length\": 5,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tickLabel\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\"optimize\": 0,\r\n\t\t\t\t\t\t\t\"distance\": 0,\r\n\t\t\t\t\t\t\t\"min\": null,\r\n\t\t\t\t\t\t\t\"max\": null,\r\n\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netLine\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"type\": \"solid\",\r\n\t\t\t\t\t\t\t\"color\": \"auto\",\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netArea\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"colorOne\": \"auto\",\r\n\t\t\t\t\t\t\t\"colorTwo\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"data\": [\"India\", \"Pakistan\", \"China\", \"Japan\", \"South-Eastern\", \"Western\", \"Eastern\", \"Western\", \"Northern\", \"Others\", \"Europe\"],\r\n\t\t\t\t\t\t\"type\": \"category\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"yAxisLeft\": {\r\n\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\"title\": {\r\n\t\t\t\t\t\t\t\"showTitle\": false,\r\n\t\t\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\t\t\"nameGap\": 15,\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"fzPosition\": \"end\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"name\": \"显示Y轴\",\r\n\t\t\t\t\t\t\"inverse\": false,\r\n\t\t\t\t\t\t\"tickLine\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tick\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"position\": \"outside\",\r\n\t\t\t\t\t\t\t\"length\": 5,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tickLabel\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"formatter\": {\r\n\t\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"split\": 5,\r\n\t\t\t\t\t\t\t\"min\": null,\r\n\t\t\t\t\t\t\t\"max\": null,\r\n\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\"digit\": \"auto\",\r\n\t\t\t\t\t\t\t\"distance\": 0\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netLine\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"type\": \"solid\",\r\n\t\t\t\t\t\t\t\"color\": \"auto\",\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netArea\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"colorOne\": \"auto\",\r\n\t\t\t\t\t\t\t\"colorTwo\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"type\": \"value\"\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"yAxisRight\": {\r\n\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\"title\": {\r\n\t\t\t\t\t\t\t\"showTitle\": false,\r\n\t\t\t\t\t\t\t\"text\": \"\",\r\n\t\t\t\t\t\t\t\"nameGap\": 15,\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"fzPosition\": \"end\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"name\": \"显示Y轴\",\r\n\t\t\t\t\t\t\"inverse\": false,\r\n\t\t\t\t\t\t\"tickLine\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tick\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"position\": \"outside\",\r\n\t\t\t\t\t\t\t\"length\": 5,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"color\": \"auto\"\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"tickLabel\": {\r\n\t\t\t\t\t\t\t\"show\": true,\r\n\t\t\t\t\t\t\t\"label\": {\r\n\t\t\t\t\t\t\t\t\"fontSize\": 12,\r\n\t\t\t\t\t\t\t\t\"color\": \"#333\",\r\n\t\t\t\t\t\t\t\t\"fontFamily\": \"sans-serif\",\r\n\t\t\t\t\t\t\t\t\"fontGroup\": [],\r\n\t\t\t\t\t\t\t\t\"cusFontSize\": 12\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"rotate\": 0,\r\n\t\t\t\t\t\t\t\"formatter\": {\r\n\t\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\t\"digit\": \"auto\"\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"split\": 5,\r\n\t\t\t\t\t\t\t\"min\": null,\r\n\t\t\t\t\t\t\t\"max\": null,\r\n\t\t\t\t\t\t\t\"prefix\": \"\",\r\n\t\t\t\t\t\t\t\"suffix\": \"\",\r\n\t\t\t\t\t\t\t\"ratio\": 1,\r\n\t\t\t\t\t\t\t\"digit\": \"auto\",\r\n\t\t\t\t\t\t\t\"distance\": 0\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netLine\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"width\": 1,\r\n\t\t\t\t\t\t\t\"type\": \"solid\",\r\n\t\t\t\t\t\t\t\"color\": \"auto\",\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"netArea\": {\r\n\t\t\t\t\t\t\t\"show\": false,\r\n\t\t\t\t\t\t\t\"interval\": {\r\n\t\t\t\t\t\t\t\t\"value\": \"auto\",\r\n\t\t\t\t\t\t\t\t\"cusNumber\": 0\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\"colorOne\": \"auto\",\r\n\t\t\t\t\t\t\t\"colorTwo\": \"auto\"\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"series\": [{\r\n\t\t\t\t\t\"name\": \"Population\",\r\n\t\t\t\t\t\"type\": \"pie\",\r\n\t\t\t\t\t\"radius\": [\"0%\", \"75%\"],\r\n\t\t\t\t\t\"data\": [{\r\n\t\t\t\t\t\t\"value\": 1354051854,\r\n\t\t\t\t\t\t\"name\": \"India\",\r\n\t\t\t\t\t\t\"label\": {},\r\n\t\t\t\t\t\t\"labelLine\": {\r\n\t\t\t\t\t\t\t\"lineStyle\": {}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"itemStyle\": {}\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"value\": 200813818,\r\n\t\t\t\t\t\t\"name\": \"Pakistan\",\r\n\t\t\t\t\t\t\"label\": {},\r\n\t\t\t\t\t\t\"labelLine\": {\r\n\t\t\t\t\t\t\t\"lineStyle\": {}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"itemStyle\": {}\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"value\": 1415045928,\r\n\t\t\t\t\t\t\"name\": \"China\",\r\n\t\t\t\t\t\t\"label\": {},\r\n\t\t\t\t\t\t\"labelLine\": {\r\n\t\t\t\t\t\t\t\"lineStyle\": {}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"itemStyle\": {}\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"value\": 127185332,\r\n\t\t\t\t\t\t\"name\": \"Japan\",\r\n\t\t\t\t\t\t\"label\": {},\r\n\t\t\t\t\t\t\"labelLine\": {\r\n\t\t\t\t\t\t\t\"lineStyle\": {}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"itemStyle\": {}\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"value\": 655636576,\r\n\t\t\t\t\t\t\"name\": \"South-Eastern\",\r\n\t\t\t\t\t\t\"label\": {},\r\n\t\t\t\t\t\t\"labelLine\": {\r\n\t\t\t\t\t\t\t\"lineStyle\": {}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"itemStyle\": {}\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"value\": 272298399,\r\n\t\t\t\t\t\t\"name\": \"Western\",\r\n\t\t\t\t\t\t\"label\": {},\r\n\t\t\t\t\t\t\"labelLine\": {\r\n\t\t\t\t\t\t\t\"lineStyle\": {}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"itemStyle\": {}\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"value\": 433643132,\r\n\t\t\t\t\t\t\"name\": \"Eastern\",\r\n\t\t\t\t\t\t\"label\": {},\r\n\t\t\t\t\t\t\"labelLine\": {\r\n\t\t\t\t\t\t\t\"lineStyle\": {}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"itemStyle\": {}\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"value\": 381980688,\r\n\t\t\t\t\t\t\"name\": \"Western\",\r\n\t\t\t\t\t\t\"label\": {},\r\n\t\t\t\t\t\t\"labelLine\": {\r\n\t\t\t\t\t\t\t\"lineStyle\": {}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"itemStyle\": {}\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"value\": 237784677,\r\n\t\t\t\t\t\t\"name\": \"Northern\",\r\n\t\t\t\t\t\t\"label\": {},\r\n\t\t\t\t\t\t\"labelLine\": {\r\n\t\t\t\t\t\t\t\"lineStyle\": {}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"itemStyle\": {}\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"value\": 234512021,\r\n\t\t\t\t\t\t\"name\": \"Others\",\r\n\t\t\t\t\t\t\"label\": {},\r\n\t\t\t\t\t\t\"labelLine\": {\r\n\t\t\t\t\t\t\t\"lineStyle\": {}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"itemStyle\": {}\r\n\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\"value\": 742648010,\r\n\t\t\t\t\t\t\"name\": \"Europe\",\r\n\t\t\t\t\t\t\"label\": {},\r\n\t\t\t\t\t\t\"labelLine\": {\r\n\t\t\t\t\t\t\t\"lineStyle\": {}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\"itemStyle\": {}\r\n\t\t\t\t\t}],\r\n\t\t\t\t\t\"dataLabels\": {},\r\n\t\t\t\t\t\"seLabel\": {},\r\n\t\t\t\t\t\"seLine\": {},\r\n\t\t\t\t\t\"roseType\": false\r\n\t\t\t\t}],\r\n\t\t\t\t\"seriesData\": [\r\n\t\t\t\t\t[1354051854, 200813818, 1415045928, 127185332, 655636576, 272298399, 433643132, 381980688, 237784677, 234512021, 742648010]\r\n\t\t\t\t]\r\n\t\t\t}\r\n\t\t}\r\n\t}]\r\n}\r\n\r\n// export default sheetChart"
  },
  {
    "path": "src/demoData/sheetComment.js",
    "content": "window.sheetComment = {\r\n\t\"name\": \"Comment\",\r\n\t\"color\": \"\",\r\n\t\"config\": {\r\n\t\t\"columnlen\": {\r\n\t\t\t\"2\": 102\r\n\t\t}\r\n\t},\r\n\t\"index\": \"5\",\r\n\t\"chart\": [],\r\n\t\"status\": 0,\r\n\t\"order\": \"5\",\r\n\t\"column\": 18,\r\n\t\"row\": 36,\r\n\t\"celldata\": [{\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"HoverShown\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"HoverShown\",\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"ps\": {\r\n\t\t\t\t\"left\": null,\r\n\t\t\t\t\"top\": null,\r\n\t\t\t\t\"width\": null,\r\n\t\t\t\t\"height\": null,\r\n\t\t\t\t\"value\": \"Hello world!\",\r\n\t\t\t\t\"isshow\": false\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Size\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Size\",\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"ps\": {\r\n\t\t\t\t\"left\": null,\r\n\t\t\t\t\"top\": null,\r\n\t\t\t\t\"width\": null,\r\n\t\t\t\t\"height\": null,\r\n\t\t\t\t\"value\": \"Hello,world!\",\r\n\t\t\t\t\"isshow\": true\r\n\t\t\t}\r\n\t\t}\r\n\t}],\r\n\t\"ch_width\": 4748,\r\n\t\"rh_height\": 1790,\r\n\t\"luckysheet_select_save\": [{\r\n\t\t\"row\": [0, 0],\r\n\t\t\"column\": [0, 0]\r\n\t}],\r\n\t\"luckysheet_selection_range\": [],\r\n\t\"scrollLeft\": 0,\r\n\t\"scrollTop\": 0\r\n}\r\n\r\n// export default sheetComment;"
  },
  {
    "path": "src/demoData/sheetConditionFormat.js",
    "content": "window.sheetConditionFormat = {\r\n\t\"name\": \"Conditional Format\",\r\n\t\"color\": \"\",\r\n\t\"zoomRatio\":1,\r\n\t\"config\": {\r\n\t\t\"merge\": {\r\n\t\t\t\"8_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"18_2\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 10,\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"24_2\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 10,\r\n\t\t\t\t\"r\": 24,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"2_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"3_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 3,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"6_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"7_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 7,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"4_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 4,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"5_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 5,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"9_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 9,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"10_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 10,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"11_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 11,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"12_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"13_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"14_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"15_10\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"1_10\": {\r\n\t\t\t\t\"r\": 1,\r\n\t\t\t\t\"c\": 10,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t},\r\n\t\t\"rowlen\": {\r\n\t\t\t\"0\": 20,\r\n\t\t\t\"1\": 20,\r\n\t\t\t\"2\": 20,\r\n\t\t\t\"3\": 20,\r\n\t\t\t\"4\": 20,\r\n\t\t\t\"5\": 20,\r\n\t\t\t\"6\": 20,\r\n\t\t\t\"7\": 20,\r\n\t\t\t\"8\": 20,\r\n\t\t\t\"9\": 20,\r\n\t\t\t\"10\": 20,\r\n\t\t\t\"11\": 20,\r\n\t\t\t\"12\": 20,\r\n\t\t\t\"13\": 20,\r\n\t\t\t\"14\": 20,\r\n\t\t\t\"15\": 20,\r\n\t\t\t\"16\": 20,\r\n\t\t\t\"17\": 20,\r\n\t\t\t\"18\": 20,\r\n\t\t\t\"19\": 20,\r\n\t\t\t\"20\": 20,\r\n\t\t\t\"21\": 20,\r\n\t\t\t\"22\": 20,\r\n\t\t\t\"23\": 20,\r\n\t\t\t\"24\": 20,\r\n\t\t\t\"25\": 20,\r\n\t\t\t\"26\": 20,\r\n\t\t\t\"27\": 20,\r\n\t\t\t\"28\": 20,\r\n\t\t\t\"29\": 20\r\n\t\t},\r\n\t\t\"columnlen\": {\r\n\t\t\t\"0\": 30,\r\n\t\t\t\"1\": 30,\r\n\t\t\t\"2\": 86,\r\n\t\t\t\"3\": 85,\r\n\t\t\t\"4\": 92,\r\n\t\t\t\"5\": 93,\r\n\t\t\t\"6\": 100,\r\n\t\t\t\"7\": 100,\r\n\t\t\t\"8\": 99,\r\n\t\t\t\"9\": 90,\r\n\t\t\t\"10\": 96,\r\n\t\t\t\"11\": 96\r\n\t\t}\r\n\t},\r\n\t\"index\": \"2\",\r\n\t\"chart\": [],\r\n\t\"status\": 0,\r\n\t\"order\": \"2\",\r\n\t\"column\": 18,\r\n\t\"row\": 36,\r\n\t\"celldata\": [{\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Cell Value\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Cell Value\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Specific Text\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Specific Text\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Unique\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Unique\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Duplicate\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Duplicate\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Date Occurring\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Date Occurring\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 1,\r\n\t\t\t\t\"c\": 10,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 1,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"test\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"test\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 44033.77921296296,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd hh:mm\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"m\": \"2020-07-21 18:42\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"bad\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"bad\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 44034.77921296296,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd hh:mm\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 3,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"m\": \"2020-07-22 18:42\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 3,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 2,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"2\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"good\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"good\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 11,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"11\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 11,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"11\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 44039.77921296296,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd hh:mm\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"m\": \"2020-07-27 18:42\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 4,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 4,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 3,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"3\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"testing\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"testing\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 5,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"5\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 5,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"5\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 44040.77921296296,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd hh:mm\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"m\": \"2020-07-28 18:42\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 5,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 5,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 4,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"4\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"tested\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"tested\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 44047.77921296296,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd hh:mm\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"m\": \"2020-08-04 18:42\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 5,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"5\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"general\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"general\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 120,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"120\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 120,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"120\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 44055.77921296296,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd hh:mm\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 7,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"m\": \"2020-08-12 18:42\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 7,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t},\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Top/Bottom\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Top/Bottom\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Average\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Average\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"2-Color Scale\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"2-Color Scale\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"3-Color Scale\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"3-Color Scale\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Data Bar\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Data Bar\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 9,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 9,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 10,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 10,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 15,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"15\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 11,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 11,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 2,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"2\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 100,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"100\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 100,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"100\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 100,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"100\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 3,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"3\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 2,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"2\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 2,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"2\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 2,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"2\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 4,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"4\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 60,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"60\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 60,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"60\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 60,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"60\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -15,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-15\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 5,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"5\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 3,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"3\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 3,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"3\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 3,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"3\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 10\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Icon Set\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Icon Set\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 10,\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 10,\r\n\t\t\t\t\"r\": 24,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 24,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 24,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 24,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 24,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 24,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 24,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 24,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 24,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 24,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"fs\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": \"2\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}],\r\n\t\"ch_width\": 4748,\r\n\t\"rh_height\": 1790,\r\n\t\"luckysheet_select_save\": [{\r\n\t\t\"row\": [0, 0],\r\n\t\t\"column\": [0, 0]\r\n\t}],\r\n\t\"luckysheet_selection_range\": [],\r\n\t\"scrollLeft\": 0,\r\n\t\"scrollTop\": 0,\r\n\t\"luckysheet_conditionformat_save\": [{\r\n\t\t\"type\": \"default\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [2, 7],\r\n\t\t\t\"column\": [2, 2]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"textColor\": \"#000000\",\r\n\t\t\t\"cellColor\": \"#ff0000\"\r\n\t\t},\r\n\t\t\"conditionName\": \"betweenness\",\r\n\t\t\"conditionRange\": [{\r\n\t\t\t\"row\": [4, 4],\r\n\t\t\t\"column\": [2, 2]\r\n\t\t}, {\r\n\t\t\t\"row\": [6, 6],\r\n\t\t\t\"column\": [2, 2]\r\n\t\t}],\r\n\t\t\"conditionValue\": [2, 4]\r\n\t}, {\r\n\t\t\"type\": \"default\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [2, 7],\r\n\t\t\t\"column\": [4, 4]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"textColor\": \"#000000\",\r\n\t\t\t\"cellColor\": \"#ff0000\"\r\n\t\t},\r\n\t\t\"conditionName\": \"textContains\",\r\n\t\t\"conditionRange\": [{\r\n\t\t\t\"row\": [2, 2],\r\n\t\t\t\"column\": [4, 4]\r\n\t\t}],\r\n\t\t\"conditionValue\": [\"test\"]\r\n\t}, {\r\n\t\t\"type\": \"default\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [2, 7],\r\n\t\t\t\"column\": [6, 6]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"textColor\": \"#000000\",\r\n\t\t\t\"cellColor\": \"#ff0000\"\r\n\t\t},\r\n\t\t\"conditionName\": \"duplicateValue\",\r\n\t\t\"conditionRange\": [],\r\n\t\t\"conditionValue\": [\"1\"]\r\n\t}, {\r\n\t\t\"type\": \"default\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [2, 7],\r\n\t\t\t\"column\": [8, 8]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"textColor\": \"#000000\",\r\n\t\t\t\"cellColor\": \"#ff0000\"\r\n\t\t},\r\n\t\t\"conditionName\": \"duplicateValue\",\r\n\t\t\"conditionRange\": [],\r\n\t\t\"conditionValue\": [\"0\"]\r\n\t}, {\r\n\t\t\"type\": \"default\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [10, 15],\r\n\t\t\t\"column\": [2, 2]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"textColor\": \"#000000\",\r\n\t\t\t\"cellColor\": \"#ff0000\"\r\n\t\t},\r\n\t\t\"conditionName\": \"greaterThan\",\r\n\t\t\"conditionRange\": [{\r\n\t\t\t\"row\": [11, 11],\r\n\t\t\t\"column\": [2, 2]\r\n\t\t}],\r\n\t\t\"conditionValue\": [1]\r\n\t}, {\r\n\t\t\"type\": \"default\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [10, 15],\r\n\t\t\t\"column\": [4, 4]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"textColor\": null,\r\n\t\t\t\"cellColor\": \"#ff0000\"\r\n\t\t},\r\n\t\t\"conditionName\": \"AboveAverage\",\r\n\t\t\"conditionRange\": [],\r\n\t\t\"conditionValue\": [\"AboveAverage\"]\r\n\t}, {\r\n\t\t\"type\": \"dataBar\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [10, 15],\r\n\t\t\t\"column\": [10, 11]\r\n\t\t}],\r\n\t\t\"format\": [\"#6aa84f\", \"#ffffff\"]\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [19, 23],\r\n\t\t\t\"column\": [2, 2]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"3\",\r\n\t\t\t\"leftMin\": \"0\",\r\n\t\t\t\"top\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [19, 23],\r\n\t\t\t\"column\": [3, 3]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"3\",\r\n\t\t\t\"leftMin\": \"5\",\r\n\t\t\t\"top\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [19, 23],\r\n\t\t\t\"column\": [4, 4]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"3\",\r\n\t\t\t\"leftMin\": \"0\",\r\n\t\t\t\"top\": \"1\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [19, 23],\r\n\t\t\t\"column\": [5, 5]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"3\",\r\n\t\t\t\"leftMin\": \"0\",\r\n\t\t\t\"top\": \"9\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [19, 23],\r\n\t\t\t\"column\": [6, 6]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"3\",\r\n\t\t\t\"leftMin\": \"0\",\r\n\t\t\t\"top\": \"8\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [19, 23],\r\n\t\t\t\"column\": [7, 7]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"3\",\r\n\t\t\t\"leftMin\": \"0\",\r\n\t\t\t\"top\": \"4\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [19, 23],\r\n\t\t\t\"column\": [8, 8]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"3\",\r\n\t\t\t\"leftMin\": \"5\",\r\n\t\t\t\"top\": \"4\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [19, 23],\r\n\t\t\t\"column\": [9, 9]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"3\",\r\n\t\t\t\"leftMin\": \"0\",\r\n\t\t\t\"top\": \"5\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [19, 23],\r\n\t\t\t\"column\": [10, 10]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"3\",\r\n\t\t\t\"leftMin\": \"0\",\r\n\t\t\t\"top\": \"7\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [19, 23],\r\n\t\t\t\"column\": [11, 11]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"3\",\r\n\t\t\t\"leftMin\": \"5\",\r\n\t\t\t\"top\": \"7\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [25, 29],\r\n\t\t\t\"column\": [2, 2]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"4\",\r\n\t\t\t\"leftMin\": \"0\",\r\n\t\t\t\"top\": \"2\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [25, 29],\r\n\t\t\t\"column\": [3, 3]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"4\",\r\n\t\t\t\"leftMin\": \"5\",\r\n\t\t\t\"top\": \"1\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [25, 29],\r\n\t\t\t\"column\": [4, 4]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"4\",\r\n\t\t\t\"leftMin\": \"0\",\r\n\t\t\t\"top\": \"6\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [25, 29],\r\n\t\t\t\"column\": [5, 5]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"4\",\r\n\t\t\t\"leftMin\": \"5\",\r\n\t\t\t\"top\": \"9\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [25, 29],\r\n\t\t\t\"column\": [6, 6]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"4\",\r\n\t\t\t\"leftMin\": \"0\",\r\n\t\t\t\"top\": \"6\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [25, 29],\r\n\t\t\t\"column\": [6, 6]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"4\",\r\n\t\t\t\"leftMin\": \"5\",\r\n\t\t\t\"top\": \"5\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [25, 29],\r\n\t\t\t\"column\": [7, 7]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"5\",\r\n\t\t\t\"leftMin\": \"0\",\r\n\t\t\t\"top\": \"3\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [25, 29],\r\n\t\t\t\"column\": [8, 8]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"5\",\r\n\t\t\t\"leftMin\": \"5\",\r\n\t\t\t\"top\": \"2\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [25, 29],\r\n\t\t\t\"column\": [9, 9]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"5\",\r\n\t\t\t\"leftMin\": \"5\",\r\n\t\t\t\"top\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [25, 29],\r\n\t\t\t\"column\": [10, 10]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"5\",\r\n\t\t\t\"leftMin\": \"0\",\r\n\t\t\t\"top\": \"10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"icons\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [25, 29],\r\n\t\t\t\"column\": [11, 11]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"len\": \"5\",\r\n\t\t\t\"leftMin\": \"0\",\r\n\t\t\t\"top\": \"11\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"type\": \"default\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [2, 7],\r\n\t\t\t\"column\": [10, 11]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"textColor\": null,\r\n\t\t\t\"cellColor\": \"#ff0000\"\r\n\t\t},\r\n\t\t\"conditionName\": \"occurrenceDate\",\r\n\t\t\"conditionRange\": [],\r\n\t\t\"conditionValue\": [\"2020/07/23 - 2020/07/29\"]\r\n\t},{\r\n\t\t\"type\": \"default\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [10, 19],\r\n\t\t\t\"column\": [0, 0]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"textColor\": \"#000000\",\r\n\t\t\t\"cellColor\": \"#ff0000\"\r\n\t\t},\r\n\t\t\"conditionName\": \"regExp\",\r\n\t\t\"conditionRange\": [],\r\n\t\t\"conditionValue\": [/^\\d{1,}\\.\\d{1,}$/]\r\n\t},{\r\n\t\t\"type\": \"default\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"row\": [0, 9],\r\n\t\t\t\"column\": [0, 0]\r\n\t\t}],\r\n\t\t\"format\": {\r\n\t\t\t\"textColor\": \"#000000\",\r\n\t\t\t\"cellColor\": \"#ff0000\"\r\n\t\t},\r\n\t\t\"conditionName\": \"sort\",\r\n\t\t\"conditionRange\": [],\r\n\t\t\"conditionValue\": ['desc']\r\n\t},\r\n\t{\r\n\t\t\"type\": \"colorGradation\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"left\": 422,\r\n\t\t\t\"width\": 100,\r\n\t\t\t\"top\": 210,\r\n\t\t\t\"height\": 20,\r\n\t\t\t\"left_move\": 422,\r\n\t\t\t\"width_move\": 100,\r\n\t\t\t\"top_move\": 210,\r\n\t\t\t\"height_move\": 125,\r\n\t\t\t\"row\": [10, 15],\r\n\t\t\t\"column\": [6, 6],\r\n\t\t\t\"row_focus\": 10,\r\n\t\t\t\"column_focus\": 6\r\n\t\t}],\r\n\t\t\"format\": [\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\", \"rgb(248, 105, 107)\"]\r\n\t}, {\r\n\t\t\"type\": \"colorGradation\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"left\": 422,\r\n\t\t\t\"width\": 100,\r\n\t\t\t\"top\": 210,\r\n\t\t\t\"height\": 20,\r\n\t\t\t\"left_move\": 422,\r\n\t\t\t\"width_move\": 100,\r\n\t\t\t\"top_move\": 210,\r\n\t\t\t\"height_move\": 125,\r\n\t\t\t\"row\": [10, 15],\r\n\t\t\t\"column\": [6, 6],\r\n\t\t\t\"row_focus\": 10,\r\n\t\t\t\"column_focus\": 6\r\n\t\t}],\r\n\t\t\"format\": [\"rgb(248, 105, 107)\", \"rgb(255, 235, 132)\", \"rgb(99, 190, 123)\"]\r\n\t}, {\r\n\t\t\"type\": \"colorGradation\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"left\": 422,\r\n\t\t\t\"width\": 100,\r\n\t\t\t\"top\": 210,\r\n\t\t\t\"height\": 20,\r\n\t\t\t\"left_move\": 422,\r\n\t\t\t\"width_move\": 100,\r\n\t\t\t\"top_move\": 210,\r\n\t\t\t\"height_move\": 125,\r\n\t\t\t\"row\": [10, 15],\r\n\t\t\t\"column\": [6, 6],\r\n\t\t\t\"row_focus\": 10,\r\n\t\t\t\"column_focus\": 6\r\n\t\t}],\r\n\t\t\"format\": [\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\", \"rgb(248, 105, 107)\"]\r\n\t}, {\r\n\t\t\"type\": \"colorGradation\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"left\": 422,\r\n\t\t\t\"width\": 100,\r\n\t\t\t\"top\": 210,\r\n\t\t\t\"height\": 20,\r\n\t\t\t\"left_move\": 422,\r\n\t\t\t\"width_move\": 100,\r\n\t\t\t\"top_move\": 210,\r\n\t\t\t\"height_move\": 125,\r\n\t\t\t\"row\": [10, 15],\r\n\t\t\t\"column\": [6, 6],\r\n\t\t\t\"row_focus\": 10,\r\n\t\t\t\"column_focus\": 6\r\n\t\t}],\r\n\t\t\"format\": [\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\"]\r\n\t}, {\r\n\t\t\"type\": \"colorGradation\",\r\n\t\t\"cellrange\": [{\r\n\t\t\t\"left\": 624,\r\n\t\t\t\"width\": 99,\r\n\t\t\t\"top\": 210,\r\n\t\t\t\"height\": 20,\r\n\t\t\t\"left_move\": 624,\r\n\t\t\t\"width_move\": 99,\r\n\t\t\t\"top_move\": 210,\r\n\t\t\t\"height_move\": 125,\r\n\t\t\t\"row\": [10, 15],\r\n\t\t\t\"column\": [8, 8],\r\n\t\t\t\"row_focus\": 10,\r\n\t\t\t\"column_focus\": 8\r\n\t\t}],\r\n\t\t\"format\": [\"rgb(248, 105, 107)\", \"rgb(255, 235, 132)\", \"rgb(99, 190, 123)\"]\r\n\t}]\r\n}\r\n\r\n// export default sheetConditionFormat;"
  },
  {
    "path": "src/demoData/sheetDataVerification.js",
    "content": "window.sheetDataVerification = {\r\n    \"name\": \"Data Verification\",\r\n    \"index\": \"Sheet_pdolzzie5xwi_1600927444446\",\r\n    \"celldata\": [{\"r\":0,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Drop Down List\",\"v\":\"Drop Down List\",\"bl\":1}},{\"r\":0,\"c\":1,\"v\":{\"m\":\"Checkbox\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Checkbox\",\"bl\":1}},{\"r\":0,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Number between 1-10\",\"bl\":1,\"m\":\"Number between 1-10\"}},{\"r\":0,\"c\":3,\"v\":{\"m\":\"Text content include Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Text content include Luckysheet\",\"bl\":1}},{\"r\":0,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Text length between 1-5\",\"m\":\"Text length between 1-5\",\"bl\":1}},{\"r\":0,\"c\":5,\"v\":{\"m\":\"Date\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Date\",\"bl\":1}},{\"r\":0,\"c\":6,\"v\":{\"m\":\"Identification Number\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Identification Number\",\"bl\":1}},{\"r\":0,\"c\":7,\"v\":{\"m\":\"Phone Number\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Phone Number\",\"bl\":1}},{\"r\":1,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Fix\",\"m\":\"Fix\"}},{\"r\":1,\"c\":1,\"v\":{\"m\":\"Fail\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Fail\"}},{\"r\":1,\"c\":2,\"v\":{\"v\":1,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"1\"}},{\"r\":1,\"c\":3,\"v\":{\"m\":\"Luckysheet is good\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Luckysheet is good\"}},{\"r\":1,\"c\":4,\"v\":{\"m\":\"Welcome\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Welcome\"}},{\"r\":1,\"c\":5,\"v\":{\"m\":\"2020-09-24\",\"ct\":{\"fa\":\"yyyy-MM-dd\",\"t\":\"d\"},\"v\":44098}},{\"r\":1,\"c\":6,\"v\":{\"v\":\"311414199009138910\",\"ct\":{\"fa\":\"@\",\"t\":\"s\"},\"m\":\"311414199009138910\"}},{\"r\":1,\"c\":7,\"v\":{\"v\":13678765439,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"13678765439\"}},{\"r\":2,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Done\",\"m\":\"Done\"}},{\"r\":2,\"c\":1,\"v\":{\"m\":\"Pass\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Pass\"}},{\"r\":2,\"c\":2,\"v\":{\"v\":2,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"2\"}},{\"r\":2,\"c\":3,\"v\":{\"m\":\"I am Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"I am Luckysheet\"}},{\"r\":2,\"c\":4,\"v\":{\"m\":\"Good\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Good\"}},{\"r\":2,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Time\",\"m\":\"Time\"}},{\"r\":2,\"c\":6,\"v\":{\"v\":\"31141419900913891\",\"ct\":{\"fa\":\"@\",\"t\":\"s\"},\"m\":\"31141419900913891\"}},{\"r\":2,\"c\":7,\"v\":{\"v\":1367876544,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"1367876544\"}},{\"r\":3,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Develop\",\"m\":\"Develop\"}},{\"r\":3,\"c\":1,\"v\":{\"m\":\"Fail\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Fail\"}},{\"r\":3,\"c\":2,\"v\":{\"v\":5,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"5\"}},{\"r\":3,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"I am luckyDemo\",\"m\":\"I am luckyDemo\"}},{\"r\":3,\"c\":4,\"v\":{\"m\":\"Nice\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Nice\"}},{\"r\":3,\"c\":5,\"v\":{\"m\":\"2020-09-26\",\"ct\":{\"fa\":\"yyyy-MM-dd\",\"t\":\"d\"},\"v\":44100}},{\"r\":3,\"c\":6,\"v\":{\"v\":\"3114141990091389102\",\"ct\":{\"fa\":\"@\",\"t\":\"s\"},\"m\":\"3114141990091389102\"}},{\"r\":3,\"c\":7,\"v\":{\"v\":136787654412,\"ct\":{\"fa\":\"##0\",\"t\":\"n\"},\"m\":\"136787654412\"}},{\"r\":4,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Doing\",\"m\":\"Doing\"}},{\"r\":4,\"c\":1,\"v\":{\"m\":\"Fail\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Fail\"}},{\"r\":4,\"c\":2,\"v\":{\"v\":11,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"11\"}},{\"r\":4,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Luckysheet Documentation\",\"m\":\"Luckysheet Documentation\"}},{\"r\":4,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Morning\",\"m\":\"Morning\"}},{\"r\":4,\"c\":5,\"v\":{\"m\":\"2020-09-27\",\"ct\":{\"fa\":\"yyyy-MM-dd\",\"t\":\"d\"},\"v\":44101}},{\"r\":4,\"c\":6,\"v\":{\"v\":\"31141419900913891X\",\"ct\":{\"fa\":\"@\",\"t\":\"s\"},\"m\":\"31141419900913891X\"}},{\"r\":4,\"c\":7,\"v\":{\"v\":49865342456,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"49865342456\"}},{\"r\":5,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Develop\",\"m\":\"Develop\"}},{\"r\":5,\"c\":1,\"v\":{\"m\":\"Fail\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Fail\"}},{\"r\":5,\"c\":2,\"v\":{\"v\":3,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"3\"}},{\"r\":5,\"c\":3,\"v\":{\"m\":\"Luckyexcel\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Luckyexcel\"}},{\"r\":5,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Tomorrow\",\"m\":\"Tomorrow\"}},{\"r\":5,\"c\":5,\"v\":{\"ct\":{\"fa\":\"yyyy-MM-dd\",\"t\":\"d\"},\"v\":44071,\"m\":\"2020-08-28\"}},{\"r\":5,\"c\":6,\"v\":{\"v\":\"Number\",\"ct\":{\"fa\":\"@\",\"t\":\"s\"},\"m\":\"Number\"}},{\"r\":5,\"c\":7,\"v\":{\"v\":\"Number\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Number\"}},{\"r\":6,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Done\",\"m\":\"Done\"}},{\"r\":6,\"c\":1,\"v\":{\"m\":\"Pass\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Pass\"}},{\"r\":6,\"c\":2,\"v\":{\"v\":0,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"0\"}},{\"r\":6,\"c\":3,\"v\":{\"m\":\"Luckysheet Online\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Luckysheet Online\"}},{\"r\":6,\"c\":4,\"v\":{\"m\":\"Three\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Three\"}},{\"r\":6,\"c\":5,\"v\":{\"m\":\"2020-09-29\",\"ct\":{\"fa\":\"yyyy-MM-dd\",\"t\":\"d\"},\"v\":44103}},{\"r\":6,\"c\":6,\"v\":{\"v\":\"311414199301118910\",\"ct\":{\"fa\":\"@\",\"t\":\"s\"},\"m\":\"311414199301118910\"}},{\"r\":6,\"c\":7,\"v\":{\"v\":23309873564,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"23309873564\"}},{\"r\":7,\"c\":8,\"v\":{\"v\":null,\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bl\":1}}],\r\n    \"row\": 84,\r\n    \"column\": 60,\r\n    \"config\": {\r\n        \"merge\": {},\r\n        \"rowlen\": {},\r\n        \"columnlen\": {\r\n            \"0\": 109,\r\n            \"2\": 143,\r\n            \"3\": 200,\r\n            \"4\": 180,\r\n            \"6\": 178,\r\n            \"7\": 125\r\n        },\r\n        \"customWidth\": {\r\n            \"2\": 1,\r\n            \"3\": 1,\r\n            \"4\": 1,\r\n            \"6\": 1,\r\n            \"7\": 1\r\n        }\r\n    },\r\n    \"luckysheet_select_save\": [\r\n        {\r\n            \"left\": 963,\r\n            \"width\": 125,\r\n            \"top\": 240,\r\n            \"height\": 19,\r\n            \"left_move\": 963,\r\n            \"width_move\": 125,\r\n            \"top_move\": 240,\r\n            \"height_move\": 19,\r\n            \"row\": [\r\n                12,\r\n                12\r\n            ],\r\n            \"column\": [\r\n                7,\r\n                7\r\n            ],\r\n            \"row_focus\": 12,\r\n            \"column_focus\": 7\r\n        }\r\n    ],\r\n    \"dataVerification\": {\r\n        \"1_0\": {\r\n            \"type\": \"dropdown\",\r\n            \"type2\": null,\r\n            \"value1\": \"Develop,Fix,Done\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"2_0\": {\r\n            \"type\": \"dropdown\",\r\n            \"type2\": null,\r\n            \"value1\": \"Develop,Fix,Done\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"3_0\": {\r\n            \"type\": \"dropdown\",\r\n            \"type2\": null,\r\n            \"value1\": \"Develop,Fix,Done\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"4_0\": {\r\n            \"type\": \"dropdown\",\r\n            \"type2\": null,\r\n            \"value1\": \"Develop,Fix,Done\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"5_0\": {\r\n            \"type\": \"dropdown\",\r\n            \"type2\": null,\r\n            \"value1\": \"Develop,Fix,Done\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"6_0\": {\r\n            \"type\": \"dropdown\",\r\n            \"type2\": null,\r\n            \"value1\": \"Develop,Fix,Done\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"1_1\": {\r\n            \"type\": \"checkbox\",\r\n            \"type2\": null,\r\n            \"value1\": \"Pass\",\r\n            \"value2\": \"Fail\",\r\n            \"checked\": false,\r\n            \"remote\": true,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"2_1\": {\r\n            \"type\": \"checkbox\",\r\n            \"type2\": null,\r\n            \"value1\": \"Pass\",\r\n            \"value2\": \"Fail\",\r\n            \"checked\": true,\r\n            \"remote\": true,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"3_1\": {\r\n            \"type\": \"checkbox\",\r\n            \"type2\": null,\r\n            \"value1\": \"Pass\",\r\n            \"value2\": \"Fail\",\r\n            \"checked\": false,\r\n            \"remote\": true,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"4_1\": {\r\n            \"type\": \"checkbox\",\r\n            \"type2\": null,\r\n            \"value1\": \"Pass\",\r\n            \"value2\": \"Fail\",\r\n            \"checked\": false,\r\n            \"remote\": true,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"5_1\": {\r\n            \"type\": \"checkbox\",\r\n            \"type2\": null,\r\n            \"value1\": \"Pass\",\r\n            \"value2\": \"Fail\",\r\n            \"checked\": false,\r\n            \"remote\": true,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"6_1\": {\r\n            \"type\": \"checkbox\",\r\n            \"type2\": null,\r\n            \"value1\": \"Pass\",\r\n            \"value2\": \"Fail\",\r\n            \"checked\": true,\r\n            \"remote\": true,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"1_2\": {\r\n            \"type\": \"number\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"1\",\r\n            \"value2\": \"10\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": true,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"2_2\": {\r\n            \"type\": \"number\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"1\",\r\n            \"value2\": \"10\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": true,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"3_2\": {\r\n            \"type\": \"number\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"1\",\r\n            \"value2\": \"10\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": true,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"4_2\": {\r\n            \"type\": \"number\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"1\",\r\n            \"value2\": \"10\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": true,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"5_2\": {\r\n            \"type\": \"number\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"1\",\r\n            \"value2\": \"10\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": true,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"6_2\": {\r\n            \"type\": \"number\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"1\",\r\n            \"value2\": \"10\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": true,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"1_3\": {\r\n            \"type\": \"text_content\",\r\n            \"type2\": \"include\",\r\n            \"value1\": \"Luckysheet\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": true,\r\n            \"hintText\": \"include Luckysheet\"\r\n        },\r\n        \"2_3\": {\r\n            \"type\": \"text_content\",\r\n            \"type2\": \"include\",\r\n            \"value1\": \"Luckysheet\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": true,\r\n            \"hintText\": \"include Luckysheet\"\r\n        },\r\n        \"3_3\": {\r\n            \"type\": \"text_content\",\r\n            \"type2\": \"include\",\r\n            \"value1\": \"Luckysheet\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": true,\r\n            \"hintText\": \"include Luckysheet\"\r\n        },\r\n        \"4_3\": {\r\n            \"type\": \"text_content\",\r\n            \"type2\": \"include\",\r\n            \"value1\": \"Luckysheet\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": true,\r\n            \"hintText\": \"include Luckysheet\"\r\n        },\r\n        \"5_3\": {\r\n            \"type\": \"text_content\",\r\n            \"type2\": \"include\",\r\n            \"value1\": \"Luckysheet\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": true,\r\n            \"hintText\": \"include Luckysheet\"\r\n        },\r\n        \"6_3\": {\r\n            \"type\": \"text_content\",\r\n            \"type2\": \"include\",\r\n            \"value1\": \"Luckysheet\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": true,\r\n            \"hintText\": \"include Luckysheet\"\r\n        },\r\n        \"1_4\": {\r\n            \"type\": \"text_length\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"1\",\r\n            \"value2\": \"5\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": true,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"2_4\": {\r\n            \"type\": \"text_length\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"1\",\r\n            \"value2\": \"5\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": true,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"3_4\": {\r\n            \"type\": \"text_length\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"1\",\r\n            \"value2\": \"5\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": true,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"4_4\": {\r\n            \"type\": \"text_length\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"1\",\r\n            \"value2\": \"5\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": true,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"5_4\": {\r\n            \"type\": \"text_length\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"1\",\r\n            \"value2\": \"5\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": true,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"6_4\": {\r\n            \"type\": \"text_length\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"1\",\r\n            \"value2\": \"5\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": true,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"1_5\": {\r\n            \"type\": \"date\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"2020-09-23\",\r\n            \"value2\": \"2020-10-10\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"2_5\": {\r\n            \"type\": \"date\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"2020-09-23\",\r\n            \"value2\": \"2020-10-10\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"3_5\": {\r\n            \"type\": \"date\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"2020-09-23\",\r\n            \"value2\": \"2020-10-10\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"4_5\": {\r\n            \"type\": \"date\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"2020-09-23\",\r\n            \"value2\": \"2020-10-10\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"5_5\": {\r\n            \"type\": \"date\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"2020-09-23\",\r\n            \"value2\": \"2020-10-10\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"6_5\": {\r\n            \"type\": \"date\",\r\n            \"type2\": \"bw\",\r\n            \"value1\": \"2020-09-23\",\r\n            \"value2\": \"2020-10-10\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"1_6\": {\r\n            \"type\": \"validity\",\r\n            \"type2\": \"card\",\r\n            \"value1\": \"\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"2_6\": {\r\n            \"type\": \"validity\",\r\n            \"type2\": \"card\",\r\n            \"value1\": \"\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"3_6\": {\r\n            \"type\": \"validity\",\r\n            \"type2\": \"card\",\r\n            \"value1\": \"\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"4_6\": {\r\n            \"type\": \"validity\",\r\n            \"type2\": \"card\",\r\n            \"value1\": \"\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"5_6\": {\r\n            \"type\": \"validity\",\r\n            \"type2\": \"card\",\r\n            \"value1\": \"\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"6_6\": {\r\n            \"type\": \"validity\",\r\n            \"type2\": \"card\",\r\n            \"value1\": \"\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"1_7\": {\r\n            \"type\": \"validity\",\r\n            \"type2\": \"phone\",\r\n            \"value1\": \"\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"2_7\": {\r\n            \"type\": \"validity\",\r\n            \"type2\": \"phone\",\r\n            \"value1\": \"\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"3_7\": {\r\n            \"type\": \"validity\",\r\n            \"type2\": \"phone\",\r\n            \"value1\": \"\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"4_7\": {\r\n            \"type\": \"validity\",\r\n            \"type2\": \"phone\",\r\n            \"value1\": \"\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"5_7\": {\r\n            \"type\": \"validity\",\r\n            \"type2\": \"phone\",\r\n            \"value1\": \"\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        },\r\n        \"6_7\": {\r\n            \"type\": \"validity\",\r\n            \"type2\": \"phone\",\r\n            \"value1\": \"\",\r\n            \"value2\": \"\",\r\n            \"checked\": false,\r\n            \"remote\": false,\r\n            \"prohibitInput\": false,\r\n            \"hintShow\": false,\r\n            \"hintText\": \"\"\r\n        }\r\n    }\r\n}\r\n// export default sheetDataVerification;"
  },
  {
    "path": "src/demoData/sheetFormula.js",
    "content": " window.sheetFormula = {\r\n\t\"name\": \"Formula\",\r\n\t\"color\": \"\",\r\n\t\"config\": {\r\n\t\t\"merge\": {\r\n\t\t\t\"12_2\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 6,\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"19_2\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 6,\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"20_6\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5,\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t},\r\n\t\t\t\"22_6\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 22,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t},\r\n\t\t\t\"23_6\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 23,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t},\r\n\t\t\t\"28_2\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 6,\r\n\t\t\t\t\"r\": 28,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"31_6\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3,\r\n\t\t\t\t\"r\": 31,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t},\r\n\t\t\t\"33_6\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3,\r\n\t\t\t\t\"r\": 33,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t},\r\n\t\t\t\"35_6\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3,\r\n\t\t\t\t\"r\": 35,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t},\r\n\t\t\t\"37_6\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3,\r\n\t\t\t\t\"r\": 37,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t},\r\n\t\t\t\"29_6\": {\r\n\t\t\t\t\"r\": 29,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3\r\n\t\t\t}\r\n\t\t},\r\n\t\t\"rowlen\": {},\r\n\t\t\"columnlen\": {\r\n\t\t\t\"0\": 111,\r\n\t\t\t\"2\": 105,\r\n\t\t\t\"3\": 82,\r\n\t\t\t\"4\": 71,\r\n\t\t\t\"5\": 84,\r\n\t\t\t\"6\": 123,\r\n\t\t\t\"7\": 48,\r\n\t\t\t\"8\": 192,\r\n\t\t\t\"9\": 56,\r\n\t\t\t\"10\": 56\r\n\t\t}\r\n\t},\r\n\t\"index\": \"1\",\r\n\t\"chart\": [],\r\n\t\"order\": \"1\",\r\n\t\"column\": 18,\r\n\t\"row\": 45,\r\n\t\"celldata\": [{\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Basic Function\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Basic Function\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Name\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Name\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Age\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Age\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Indirect Function\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Indirect Function\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"J2\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"J2\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Jack\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Jack\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 17,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"17\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"I\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"I\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 2,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"2\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Lily\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Lily\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 23,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"23\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"J\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"J\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 3,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"3\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Bob\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Bob\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 30,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"30\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Mary\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Mary\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"=INDIRECT(\\\"I2\\\")\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"=INDIRECT(\\\"I2\\\")\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"J2\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"J2\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=INDIRECT(\\\"I2\\\")\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Average Age:\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Average Age:\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 23.75,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"23.75\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=AVERAGE(D3:D6)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"=INDIRECT(I2)\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"=INDIRECT(I2)\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=INDIRECT(I2)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Max Age:\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Max Age:\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 30,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"30\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=MAX(D3:D6)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"=INDIRECT(\\\"I\\\"&(1+2))\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"=INDIRECT(\\\"I\\\"&(1+2))\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"I\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"I\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=INDIRECT(\\\"I\\\"&(1+2))\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Min Age:\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Min Age:\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 17,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"17\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=MIN(D3:D6)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"=INDIRECT(I4&J3)\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"=INDIRECT(I4&J3)\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=INDIRECT(I4&J3)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"=INDIRECT(\\\"Formula!\\\"&I2)\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"=INDIRECT(\\\"Formula!\\\"&I2)\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"f\": \"=INDIRECT(\\\"Formula!\\\"&I2)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"=INDIRECT(\\\"Formula!I2\\\")\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"=INDIRECT(\\\"Formula!I2\\\")\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"m\": \"J2\",\r\n\t\t\t\"v\": \"J2\",\r\n\t\t\t\"f\": \"=INDIRECT(\\\"Formula!I2\\\")\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Array Formula\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Array Formula\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Calculation\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Calculation\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 6,\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Match\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Match\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Physical\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Physical\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Chemistry\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Chemistry\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Alex\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Alex\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Sum\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Sum\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Alice\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Alice\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 97,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"m\": \"97\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 61,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"m\": \"61\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 53,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"53\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 43,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"43\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"v\": 207,\r\n\t\t\t\"m\": \"207\",\r\n\t\t\t\"f\": \"=SUBTOTAL(9,OFFSET($D$15,ROW($D$15:$D$18)-ROW($D$15),1,3))\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"John\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"John\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 65,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"65\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 76,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"76\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 65,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"65\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 55,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"55\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"v\": 182,\r\n\t\t\t\"m\": \"182\",\r\n\t\t\t\"f\": \"=SUBTOTAL(9,OFFSET(E15,ROW(E15:E18)-ROW(E15),1,3))\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Bob\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Bob\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 55,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"55\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 70,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"70\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 64,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"64\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 54,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"54\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 152,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"152\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=SUBTOTAL(9,OFFSET(F15,ROW(F15:F18)-ROW(F15),1,3))\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Jack\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Jack\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 89,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"89\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 77,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"77\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 73,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"73\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 73,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"73\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 541,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"541\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=SUBTOTAL(9,OFFSET(G15,ROW(G15:G18)-ROW(G15),1,3))\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Search\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Search\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 6,\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"apple\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"apple\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"apple\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"apple\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5,\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"banana\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"banana\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"pear\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"pear\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"pear\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"pear\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"potato\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"potato\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"ArrayFormula Result:\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"ArrayFormula Result:\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 22,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 22,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"dumpling\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"dumpling\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=INDEX(D21:D25,MATCH(\\\"dumpling\\\",D21:D25),1)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"b\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"tomato\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"tomato\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"potato\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"potato\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"NomalFormula Result:\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"NomalFormula Result:\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2,\r\n\t\t\t\t\"r\": 23,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 23,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"b\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"m\": \"FALSE\",\r\n\t\t\t\"v\": false,\r\n\t\t\t\"f\": \"=ISNA(MATCH(D21:D25,C21:C27,0))\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"b\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"potato\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"potato\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"dumpling\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"dumpling\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"e\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"cake\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"cake\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"noodel\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"noodel\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 26,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Statistics\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Statistics\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 6,\r\n\t\t\t\t\"r\": 28,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 28,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 28,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 28,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 28,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 28,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Product\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Product\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Salesman\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Salesman\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Units Sold\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Units Sold\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Summing Sales: Faxes Sold By Brown\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Summing Sales: Faxes Sold By Brown\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 29,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 29,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 29,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Fax\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Fax\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Brown\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Brown\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 61,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"61\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=SUM((C31:C39=\\\"Fax\\\")*(D31:D39=\\\"Brown\\\")*(E31:E39))\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Phone\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Phone\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Smith\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Smith\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 10,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"10\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Logical AND (Faxes And Brown)\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Logical AND (Faxes And Brown)\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3,\r\n\t\t\t\t\"r\": 31,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 31,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 31,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Fax\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Fax\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Jones\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Jones\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 20,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"20\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 2,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"2\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=SUM((C31:C39=\\\"Fax\\\")*(D31:D39=\\\"Brown\\\"))\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Fax\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Fax\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Smith\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Smith\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 30,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"30\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Logical OR (Faxes Or Jones)\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Logical OR (Faxes Or Jones)\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3,\r\n\t\t\t\t\"r\": 33,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 33,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 33,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Phone\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Phone\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Jones\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Jones\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 40,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"40\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=SUM(IF((C31:C39=\\\"Fax\\\")+(D31:D39=\\\"Jones\\\"),1,0))\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"PC\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"PC\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Smith\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Smith\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 50,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"50\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Logical XOR (Fax Or Jones but not both)\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Logical XOR (Fax Or Jones but not both)\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3,\r\n\t\t\t\t\"r\": 35,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 35,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 35,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Fax\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Fax\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Brown\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Brown\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 60,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"60\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=SUM(IF(MOD((C31:C39=\\\"Fax\\\")+(D31:D39=\\\"Jones\\\"),2),1,0))\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 37,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 37,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 37,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Phone\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Phone\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 37,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Davis\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Davis\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 37,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 70,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"70\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 37,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 37,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Logical NAND (All Sales Except Fax And Jones)\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Logical NAND (All Sales Except Fax And Jones)\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3,\r\n\t\t\t\t\"r\": 37,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 37,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 37,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 37,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 37,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 37,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 37,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"PC\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"PC\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Jones\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Jones\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 80,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"80\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"f\": \"=SUM(IF((C31:C39=\\\"Fax\\\")+(D31:D39=\\\"Jones\\\")<>2,1,0))\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 10,\r\n\t\t\t\"fc\": \"rgb(0, 0, 0)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {}\r\n\t}],\r\n\t\"calcChain\": [{\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 3,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, 23.75, \"=AVERAGE(D3:D6)\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 3,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, 30, \"=MAX(D3:D6)\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 3,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, 17, \"=MIN(D3:D6)\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 9,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, \"J2\", \"=INDIRECT(\\\"I2\\\")\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 9,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, 1, \"=INDIRECT(I2)\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 9,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, \"I\", \"=INDIRECT(\\\"I\\\"&(1+2))\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 9,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, 1, \"=INDIRECT(I4&J3)\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 7,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, 152, \"=SUBTOTAL(9,OFFSET(F15,ROW(F15:F18)-ROW(F15),1,3))\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 7,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, 541, \"=SUBTOTAL(9,OFFSET(G15,ROW(G15:G18)-ROW(G15),1,3))\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 8,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, \"dumpling\", \"=INDEX(D21:D25,MATCH(\\\"dumpling\\\",D21:D25),1)\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 6,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, 1, \"=SUM(IF((C31:C39=\\\"Fax\\\")+(D31:D39=\\\"Jones\\\")<>2,1,0))\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 6,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, \"#NAME?\", \"=SUM((C31:C39=\\\"Fax\\\")*(D31:D39=\\\"Brown\\\")*(E31:E39))\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 6,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, \"#NAME?\", \"=SUM((C31:C39=\\\"Fax\\\")*(D31:D39=\\\"Brown\\\"))\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 6,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, 1, \"=SUM(IF((C31:C39=\\\"Fax\\\")+(D31:D39=\\\"Jones\\\"),1,0))\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 6,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, 1, \"=SUM(IF(MOD((C31:C39=\\\"Fax\\\")+(D31:D39=\\\"Jones\\\"),2),1,0))\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 9,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, 1, \"=INDIRECT(\\\"Formula!\\\"&I2)\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 9,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, \"J2\", \"=INDIRECT(\\\"Formula!I2\\\")\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 7,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, 207, \"=SUBTOTAL(9,OFFSET($D$15,ROW($D$15:$D$18)-ROW($D$15),1,3))\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 7,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, 182, \"=SUBTOTAL(9,OFFSET(E15,ROW(E15:E18)-ROW(E15),1,3))\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 8,\r\n\t\t\"index\": 1,\r\n\t\t// \"func\": [true, false, \"=ISNA(MATCH(D21:D25,C21:C27,0))\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}],\r\n\t\"ch_width\": 1723,\r\n\t\"rh_height\": 1010,\r\n\t\"luckysheet_select_save\": [{\r\n\t\t\"left\": 532,\r\n\t\t\"width\": 123,\r\n\t\t\"top\": 780,\r\n\t\t\"height\": 19,\r\n\t\t\"left_move\": 532,\r\n\t\t\"width_move\": 123,\r\n\t\t\"top_move\": 780,\r\n\t\t\"height_move\": 19,\r\n\t\t\"row\": [39, 39],\r\n\t\t\"column\": [6, 6],\r\n\t\t\"row_focus\": 39,\r\n\t\t\"column_focus\": 6\r\n\t}],\r\n\t\"luckysheet_selection_range\": [],\r\n\t\"scrollLeft\": 0,\r\n\t\"scrollTop\": 0,\r\n\t\"frozen\": {\"type\":\"row\"}\r\n}\r\n\r\n// export default sheetFormula"
  },
  {
    "path": "src/demoData/sheetPicture.js",
    "content": "window.sheetPicture = {\r\n    \"name\": \"Picture\",\r\n    \"index\": \"Sheet_3e4oe25C757r_1600925108337\",\r\n    \"celldata\": [],\r\n    \"row\": 84,\r\n    \"column\": 60,\r\n    \"config\": {\r\n        \"rowlen\": {\r\n            \"2\": 31,\r\n            \"4\": 66\r\n        },\r\n        \"customHeight\": {\r\n            \"2\": 1,\r\n            \"4\": 1\r\n        },\r\n        \"merge\": {},\r\n        \"columnlen\": {\r\n            \"8\": 105\r\n        },\r\n        \"customWidth\": {\r\n            \"8\": 1\r\n        }\r\n    },\r\n    celldata:[{\"r\":0,\"c\":0,\"v\":{\"v\":null,\"bl\":1}},{\"r\":1,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Border\",\"bl\":1,\"tb\":\"1\",\"m\":\"Border\"}},{\"r\":1,\"c\":8,\"v\":{\"m\":\"Fixed Position\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Fixed Position\",\"bl\":1}},{\"r\":4,\"c\":8,\"v\":{}},{\"r\":5,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Move and resize cells\",\"bl\":1,\"tb\":\"1\",\"m\":\"Move and resize cells\"}},{\"r\":5,\"c\":8,\"v\":{\"m\":\"Move and don't resize the cell\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"Move and don't resize the cell\",\"bl\":1,\"tb\":\"1\"}},{\"r\":6,\"c\":0,\"v\":{\"v\":\"\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"\"}}],\r\n    \"luckysheet_select_save\": [\r\n        {\r\n            \"left\": 444,\r\n            \"width\": 73,\r\n            \"top\": 239,\r\n            \"height\": 19,\r\n            \"left_move\": 444,\r\n            \"width_move\": 73,\r\n            \"top_move\": 239,\r\n            \"height_move\": 19,\r\n            \"row\": [\r\n                9,\r\n                9\r\n            ],\r\n            \"column\": [\r\n                6,\r\n                6\r\n            ],\r\n            \"row_focus\": 9,\r\n            \"column_focus\": 6\r\n        }\r\n    ],\r\n    \"images\": {\r\n        \"img_wx5a6n0A1ael_1600925814407\": {\r\n            \"type\": \"3\",\r\n            \"src\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATAAAABACAYAAACdriuGAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABMKADAAQAAAABAAAAQAAAAADNtzoiAAAc30lEQVR4Ae1dCZwUxdWv6p6dPUAQPCMKmEPwAEVioiYx4hFj1AgYPD6i0cQvgPoDdheEvdhmd3YBZRdBc6wH3uQTFEVNosaExKjRENSFqIAalStEZOXcY6a76/vX7PZsdU9PT8/sTNhdqn+//nXVq1evql5Xv3r16lU1Ham1aeQgXJSSlsbK3AUHoWhZpOSA5EAv4YDSS9ohmyE5IDlwCHJACrBD8KXLJksO9BYOSAHWW96kbIfkwCHIASnADsGXLpssOdBbOBBwawgj7FxikqBbWqZgjCqREZVtBTF6jO1eX5W3KBaXAckByQHJgSQccBVg7cKLZVWAEWYohNK+sfopLBILy4DkgOSA5IAPDsgppA8mSRTJAcmB7skBdw2se9Y17Vqdr7FAkxIZTRg5jTA2jBE6hBLWjxFirtdyL0ubsMwoOSA5cFA50GsF2Oj5rH+kNTIB9rxxu0jkPGKwzukqJBmEFyGUbD6o3JeFSw5IDnSJAykIMHosSsrvUmlCZkqoiehhFoiZZA/CISue7nNUiA0x9MjccGvkGmhbee10ouIqjiTqsC8OKAGSA5IDPYYDKQgwks9Eo3sXm8gYhAojqkVGUUgfK5zO8xyNDdxPImW6HrkVgivXHw221R+exJIckBzojhxIRYB1x/oTbt/aRfXiAywyG4Lr8NQqSTemhi+xJQckB7oTB3q0ABsxjw1oaousICa70H2S6M1qSsj73hgyVXJAcqA7c6DHCrDRGhsebgs/h5noV9NlsEJyXkk3r8wnOSA5cPA50CP9wEbM1S+NkMgbsKGlLbywArnjbY2+d/BfgayB5IDkQLoc6HEa2OlzI2MYM5/FIkCX6o4VyOfTZZrMlzoHtPr6gSSsxlxZArrOysuLt6ROqWfnkHzI7PvrkhDIbFWSUxtdzb4SNiJPwljf9Xor9JHkJaaOoS1YcrwRiRTbcir0merSor/YYIdYxGg252Hg+bnVbIPQZoS7tPJs0epJT8mHzL6tHjOF/KbG+oWN8LMQXgO7ygKcBvtBY0Xg1a7ScctvmOFjoB1OF28sMoxyw5UwyQHJAW8OaLULh3thdF2T8aKeoTRNY8pTJLwMNq9TMkESq4/llNJ0Fi4zUbykITkgOeDBgfr6+vzdB8i1jJhTDIMeA9QhidB7hAa2kkauh/DKzJ5FSte8UxlckYghEi45IDlw8DhQEaq/ranZ3GYScyk0jLOS1aTbCzA4quZhOlaVrCF+0xVKZ0ntyy+3JJ7kwH+bA+wCKCsD/Jba7QVYE9FvQ4MG+22QJx4lv2uszFntiSMTJQckB3oMB7q1AOOe9jg3ojQT3ITWtTMQCN6SCVqShuSA5ED34EC3NuIrbeEiMwV1MiFLKQ3D72v82+X004Q4MsGTA1pDQwFpaj4WxxIdqWL76dFH526eNGnSIXeK7p13PtLnQOSzEwxK+qhq/rbKmbf8J9MmiQULHjhsH9l7PDXNvH6BozbNnHnDAc+X4zMxFKof1KYqx6mE7STHHr5Du+mmVp9Zk6Jlk7ZX4d1WgHWsPP7Eq/J+0+A2cQumjllxm/Bbh0zhwcg5Gcd4fC9Gj7G26ooZ18XiCQIVoYW34wC0szuT2c7q8hmTOuPxIf6x7m3bOQXG1HHGZ/vOxjOqseskTLZ+FjYrqhdux7Hgb6qEztfKi/4RTyF9iPbgg3n69qZ6rBXzY5xiF+rweWBAXpF26637y2vqiylj34olIqBSJaSVFb4lwtzCWu2SUwwzEhLTGCVrQ2XFNSKMh+fULLzYZLQIdfnGntbPYm48ut5C5oTqwhWhuq1IeyJXUe4uKyv8tzO/3zgvhzE6c19kN+xATEVbyR5jJwP9TxH/uxoMFmuzpm71S0+rrTvJMMnPgD8KtM5oZeZRRDeJzglsazLKQwtfw8D+9IAC2lBUVNTily7HyxTtjjZPiZXN2DdjYQTwTo5C+1eKMHgRPF5VXvwUh3VbAbaS6OfD9nWCWPF0whgdF6+rDD6QTt7umccchf2f46y6oQNyh1AfFz0biyFivs1emeaE6q/Y07bzV/hwBnE8/jGJF+JcmB2P9ON1wq5CJ3tRDQR+rs2e5klXpJEoHBWc23auAm37Jn1Kt5Ec5WIuvHhehZF/mYwtFOkYxNiJuKdg5vimEb4RbYjxg8PQV57lT+sqv2Px10g4stw0yRmcA04ecDzAgqjnl/EsaTWNYvDhrury4lkWDT9PjTHFqKm7G+XAxOEoBRINkKGgM1SPhC+uqKmfXF1WtNyLLt4znVOzKKSbbCbqluOKCwEJ+Hlo1XlNzWy6Vl0/WasoesEVVwBmmjbadqLYL4Wi2oOM5QPH9p6wDTA2WEZH1LhM3QAAxnbdbYKS+eNJTlE3aE6PqkJFTd0NJmFPo/NHhZefyqMTXoKz2J7TfvGL2HYhP/mcOHz6tLd15+9B70JbGiUfBVTl26FZhe9bcOVbo57DaLzdivMnOvs1XHsTYc4wFxjAs2mtGAj2qkf2jQmGUKjuBNqmvwyCEF7+LtAMot63Q9tNyW5r1NQvwKCU3D4LcwozzSe0mkVnJqrR8uXLVQw+D2HXQ2lC4eXMzMgQg5jPQZu8ypkkxrNJWywnlXC3FWDomBek0hAbLqWtkNITcd59iaZFT361JctIYg5oNYtPw8e0FJ2fj9CdFyVfQEN5Eb+SWkAU+ivw95XOxI4QIyONL1ofw0eM15f6pS1adPj+8Bd/wOD1HTE3hMv6QDD/21pJ4SciXBszRkeaXbtmpL+x/YuxIl5cOHQXNA9oj8LFFPIbbdKkmDbbxsjjqId99ZuSPShvGaXKfJglQuBDA3iyQSATDeKfC6E5NXVjnHC3OMooAL9m8DQuREH395zH7eXQD93yGMzQ3OAc9s+NWyaD5g1x6ZS+gbrej7rXQtX8DcKbRBzwI2AS8MDD8z2btMW6pBLullNIvm2omUROT6UhFi46wHac7jr2nTm5ayyYfPrngM70O53CCx/T831zDv+fWbN+ZjuCm2sCOjOwN5WcaJWAj/HKytr68xFfbcH8PGtr7zmiZX8bhBcZZcPHh1eg5v+g5PZbvrDBOyJBSu7DaMW1jZjARR1+guT/c8PnMIOaE50zNaqw+yx87gmOadXZNhxK3woU0Iu1oqImC896zqmum2RSwqfb7YIbT5PSa5Dumwfot+9hCn6pOAXnGs/6TVurIJBKYrRBFAPMFdyGp5VOfc+qA39qCxceqbeyarHeqNAOqqg3V5UV/taGy6ettXU/JSZdBPrtWjOmm7pJy4H3YxGXh7NFWz3uiEfIrl0xG5fRSh5C+2KzL9R/q5pv7xP9FCW2qAG/TtLivAl+Oos66+KNToxZBbpXpm7Cp/buV5sSGYZy2juDO0ocFCMK9gfTpbkkOPqdOUEpvOI4lBwAO8j3wPfvi5jg6yq1vOhKp/DiONxYHlCCl4PvbWIejOR2m4WY6BKuqbnrmGaz9c/4kBzCi7zcP/eoi0pK3IUXJ8VPtMAfpn7nIHtxTc2iLzlg0eiSJUty8YH/yJZGyTvVJTPWWrC9zSb+YGW3HaEzPuomvHieqoriBvTmVVZ+/sTXcqkY9wxTckDN7TNGFF4c/+qrrzaqy4vKUHbsA7fomGY4boDHx1+Dtg2wcPhTJer1TuHF4RqlZnXZjPvxXU/ncevCosh13EBvxa1ntmjzlVBtxozPrRucC1tltj+paaVZT3HBQWmszF3gvCGlXkenXGO/yWcgyCVfhm4WU9ftFUbpJhvmhHnFIYCfxwh6+not+LM1Gt3hhSvTEnNAp2aZLZXvFw3QCt7ZbXAhwrUAfGD2o4kY8Z7CCfn58nurqf8FH95pAhjTKbIycNLgy/y4EDCF/lrMC+GjthAWp0VwnM/2G5dBUB4u4iuM3i/G9ZzATjHOw8hzhZdtTQ0ohQpVxls3BP90bfnyoJOOWxwGuV9qM6fw78v9UuhiZwJG/yEiTJu/eDAqebMI4zzUKgpfFmHOcFVF0QP4zt+y4KCrwPhfbsX5M5u0xXLSCXfLKaRJlUGQYt7twceFF/Qn2Buq1mnyZFVvZvlLBUdH4kONIYO/L1XPLlofAyQIsBy1jOrGM2Iyn4aJI6WYZoVDoXuGtJLWPyL+FQvGn/j4Hxpx0gk3cw1EhCcKB0qKXtBruKtB50dNzeg08k5nHmoYEztbGC2sRemjPC7ihWZN3wgXkR3A63ThYOQCY1tTY0XNwjvVXPIM1wbEPB32uU9EmN8wCwRWeOGq/XPf1ptanChDRICpG6ejvjabNqWq7Z2I+GIYWthLeO/iwsAPxPRs0hbLSSfcLQUYZeZhtk5mtax9qvIGjJwvBAOBx9eU0y1Wknx2jQO1tUuOajbCNs0E+tc7fqjyDx54/PZ9YfTJaWNtfCFgsJgJwuueqrKiqXi6dgER1wpzDRErf/ciQ8yHCx/kqVqo/uuif9r8+Q399+v7L4OGZmXFkz2pFRbuFgDtQYrFCsYWiXDY1k6CkLzPaCENEHBr8eG/zFT6onrOqNf4goKIm0pYzdE/9sLnbiMV1XW70abO98PI0WIenNxwshjnYUaMc+E3ONwJj4szZsdh5Ai+GmyZDbJJO64uKQLcBRhju+Fkw+1gsYv/t7Grvz6LEXMJQJOKdSJ03i14WU+jg8BozKBa040IbyjoF1j7tyIaNxS5kJOgFDnQQow4uwdIfJoiGf/osDFBjNiEV0fmY1IRXlaBajB/qR5u1UTblUGiWtg/LJzmyAHYvuy/3AuQwP1WuviEL9ddEIpwiyALRDgPo95c0zkLffQs7EwoMV59azcE2gsQZo+GSoud9jhndnscg7I2o9imzdkRYrG9CHUKMDAploIA6mQXQhzGyGR4vIlovsP72Z6hQI5q39mk7btCCRBdBdj6qjzbyNORN5SARsbBjZXBBhDlt7z+Wxxg5olxRVFq87GKS88CAFrOhPKaugp4xFenQl67/dYdcCJ9Bh/bBCsfBMx1sEMVa1dfHTUMwyXUtvoIGbBJK58e7w7SQQA7Fe6oqF30GjFN7hB6RYfgssjHnh2a0bUQZtdyzYyo6rTq0sLXYggeAeiZvqbJHiSsJNs03AKm+6Q6GYq8lvkgm7TTrWI0n23O3CVKMnOP5oBq0ngjMiMDs96o9tVjm7YPdWIunDHHpVo2dBL7oIepkP7htss5Hb5YACH0XTtNZvchsydGY1wQQRsbm68Gj6WKMhGrC4/CSJdwuxCE3GhimC9V1NY7ynIhnkEQZij/cZID7PN0b7yD2BQ1m7SddU417qqBpUokVXzu58VdJfhqIzfYc5sXnzZ2aF5k5Fz9CiznnoqRbTumltsVEtjcqNkd71ItU+In4UAA/HVYcUyFHZ8kV5eSMQcKM0W5Dgb3o/GufxUjFvWjYo9qNXedq5VNXxeDJwnMLS36E7zJP4AQ+ZqFSg3zJwivbIM2BnjngE1pJI+qD1t4yZ6lpVP5yuSyjpuUL7hrmBI2zof/11j01YtAO/YtoS0FOEb8t9q8+jO0kqIPk9HORDo0uQ2og+3KpeTMTPw4JZu0bRVOIxJjehp5fWfhG7Ofpvp3sW/tcnTaC6JOqkaHnxeMa5zxeOlP4xEdQbnwMpk5r70AmBCxeXik1vYJbGGrIOhWDWCBv/5Zg5J7SF5872NnVwUX87lv09SpU9sSsYM7RK7btOXridKj8NnTN5OaenznnTYidNwve+bpSNSqF50P59CpIq6aWzDZyzUA/cBUiXKFVlr4Es+H6d83MX28MUaDkT7Y17gKDpRnOVf8YjiOAPoGwwbvBkz5FlpJ4M+l0QUKMzzRgvEn+thzZeXT47QWEccrLCxcNFTMrz+VRtgT6MOnxvLw+huMr+YticGyGIAryQYITVsJYUL5O+/yQlc2adsqnEYkqwKMn+dF2sKFOM/+RkihE3j97CzurDHUVBjs2y90hDjbCwySQ5F7Gjr5tCYa3j5iblgbfnLO0hVXw4H1ELpgx/nExkRoK00HdM7bhCP9ug+38JW3KP8TsSq6kldd9y+8n9hqFt7DVVi5mz579qQ9ifJxuEGNa/B+Oqd82LfoJbzaadFWbB6OCi8eVwcNnKJvaxqJep7Zno63zdhQvZU81dDQcJHfo3sKaPChZtoGh84OQYzFghYzUguenWHR5U94p98vxsUwPOurIPi+IcDWYxo5U4jbgnA1eRca2VUkrNu3FTEyBoj/FQGGE0E2OEd0vL/zUT5XDDwv7H3l3+eFFhL6mBEYdMRk67idbNK2ykz32alSp0vBJR8/BnqkFplB2iIfoeNU4Pb8eNpJsNhoyKeNLmRjIHwsx2G0uXfDe+H1+MntlbGEQyFA6cfOZpq6eakTZsW56wDcUOusuNcT+wFt/lB4b4cd0PdN8crD9y/ifdneAQajpB+Nkyb/WPJI7njYmHbZ0hg5b+vOfffYYB6R0tLbdkFztPlVQRDebMsCc4VSOv1FG0yImAppQ55LrBvCcKq2ZEk/ASUuGLh92geoO3fy7rzAiM5IdkMDD1PfhQb6iVgKBqNJ2rxFQ0WYM8x/A4h23gNh92PrRqUHWsKL42eTtrM+fNSyw9ArPS7PRI98rkl8qjhSC9+wi4Q3Yjc831M3wBXRFdhp4+I2L1cUJ5BBWzCNZ07Xwg9O0FjQmdwb41SJF2B446VuHXXevF8OOKDvfwJ94qt+eDEwn9bDQG2fcjBSiSNcrnXLzz3TjQPmUrznL4npqo9RX8S3wuXlt32qUHIdPiDb2j+69M/5zx4svKRPVfm1Fw4835dyjTMRDjY8/0lMA3+Dxt7wAhHmDBu19T+GwO8jwqHFxbYnifBshLkJAfW28whaqG6YjybaVsX3nxrhyPNx9XbsbMgmbScvMF21LZAwSgfxk0GceFY8YyNE+wbs6K/PLrOIp/LEFozvNGqdhw7C5vUxOu5Q3zQofR2+kePWaS6rab6JdB2xYt7C0UzvPK+oqxQxiG+urigeItIpD9W9CaEhTnEw1NNm7AlsQAdYR4nyH/zV5QwYx2/Dx3ecmNcKu9HlaXNCi643mfGIhRd9Rp1K2WPYcvNXbJ5tNKk5wCTKKdgtMQ2d31Y3dKjlOGCRb2S2XfCpauCCyALy+qJdtg/eSoMbRQk07Forzp+gq2Nf3yXYGmMTLiKOGMZhfetRt9NEGA+Djqnm5Jzo3Hco4mmrVwf019ZuQv4TRTg0nD+AwGMqUz/BczfqONCkbAgG6x8Cbyx4bVMI4Df5/aqyGTZNLxU+iGXDkfVTaEiDLRjq8jSmteOtuPWEG8dTqIcNDl5/joHpbrS9Ee9vC2zRg4BzLqzLU9DG/lZe/gTOShwW+CNuTxThPJxN2lZZsGEWwoZZb8WjTxr1/XwbNcJ+Z9KKdn/PSrcx3AKm+uR/zG4m4b+BGWkJLzC3jTup2sulq+zxJDHG8ELCa3hdkmD2+GRoKbOdjUDnLoBKUYiV3QdN0/gdFwDoge3Cix8Dg9MOnHnc4nPLpj+GzvuULY1vrGfkeiy33Ksz800cvPdCtJPFCS/6br+8o39qy5tGBH8xx3E19mko2hLAmVUrqquX+Hq/ELbuWhiEkJfw4tWNHtMToOO4kBWrD032YvD3YZzY8Rfd1Bt1YqzGYtNDqNt43PZvidIn5pYWx2x8Ip1shnOpMhVCyOYSg75xJITsXNT1Gd001uL5LOKz44UXbcT7u8FNePE6Z5O2xRP8guxJyAO7szoONcSAje8bxywx8i0Llz/tTBdTfIZPnxsZEzYifwfhU3xmcUN7w+lhDyamJsA4Vfy9iP+9m2uDboX0FlhVWfHq6JlcfhoEmxJVApdgbN3oCx0jL0a4H6FjTOUDi588HIcLSJYbGOdn83UymvwDUvvl3IgP0VZndOCBYRp+lm9zSUajIKfvYxit7TYpZILbRkLjvUizenZxI3h8U9zHJCIlCKPefwsMGnhjIkGQIFtGwOXlRdvgs3Ya6vCkb4LgN4T1MjU37/te7y+btK26Rt0+KCtB/TEeJ7+6JMBgQL8Uo9JLkI4DkxeVGIPvbXSmclcJfBTbnfCkcQhSaIPLuD0uKW4PRoCn+i2Ydv8QL3qHWzMA1/Hx/SafBk6tLp3+phuOF6yqYsbdAaqcDRpvgFY4ES46/mbY5W4acdLgkSFuyM7QpU2duldVg+NBf79IEtPQU/aHdy/TcJ6VCHeG+cop6v1nGxx/pjrhiALfAyM/ujmfqidCEN3hrIeNbkcEeKv5aRQjhg3+jmgEd8PNJoz7rGEaPwGOt9dAiH/sWRbeL1wRzsV0fiLfzeCJi8Rs0rbKDpXNWIzdDN8GP7nb1KZoX7YSHU+kpXeN1tjwCIm8AQFmm0OnTA3SPy+QM8RtYzZcJf6XrzamTJNnoKQaJ7LOSStvD8rEfcCa9pnDML06BTav4TB68lNKP81T1Bc6nC+73BpuEyKvrxtuMhwyyejJcHDdqRD1Q4UaH5FzRn/YlY3MXa5cAgJ8AaNZb9nKp9YWCj6GhV7uEBae25NrfS2RPcN0heLYGjZEMdkxUFvg6c7+DSG/Pchy/8UXIdzyHmwYX4k+YDafBqdebhOEQZx+jH2bG9Q89n6iM8781jmbtP3UIS0B1uHfxaeNvla3vCqCTvXHdVrwIjecCcuZyl0lUM7JbumeMEx/AoGcYfJXap5c6rWJMAbPhJ3uDrGBAZWcrJXO2CDCZLhnc8BTDXdrGny8ArQtsiITwovThw9RlVs5HBZ1UqVqSaJ0TziWkA09Uu2JIxN7JQf4zgOskN5qaxylr0rhZeNIr4ikLMB2Ub0Y08YLM9F62LieX5/kMML1lYFVWPp9KJ3ysDI0cVRV/NG76dCSeXoOB/65actYjIxDxBqjr90nxmW4d3AgJQF2jsYGYg9Z3BJ+OqzA1NGgSrw7gButk0jOJNgZXndL84TB0Iv/eE7zxJGJvY4DMPTb3zncSPDLNP+rcr2OI723QSkJsP0kUgbtq/NQtS7wBdrRw41zct/1Q2KFRsPcSRWG+c1+8EUcGPku7+0rkmJ7D/Vwxbw6/IXa/ls2DH7LxF+mHeo86k3t9y3ARoUYV8ntdoU0OcHdI/JITlkq2bmHfVANXgAh5ssh06INgXvUSkW3Ob9ZafLZCzlgwH/NcQWIP98vRzYZ7QEc8C3AYBCfi+Xj3C63CT+dVRQ6Np2/B62toB8VkOA5EGK/TakeJrsyJXyJ3CM5wF0n0EcvghtJ7CA/9JVX+O/femSDZKWTcsCXG8Xo+ax/uDWyA50jLynFZAjtf8xelgzNK51PCXFEjwZ/ltv9CFXY21bDVeMCL5oyTXJAcqDnccCXBhZpjUzIhPDC1HEenEu7JLw4izWNmtxJlft5QTjxI349tx3AJvKlnvdqZI0lByQHknHAlwCDABiXjFCydAiaxeNJsDwZXirp3EkVmtUNAYWcCSH2IMrY6Z6ftm9qdk+UUMkByYEeyoGkU0juuLqLRL6ABtY3rTZSrCBScsu6yuADaeVPIROfWkYN9u02rzPbNS8IL8b60b7Bvutm0rjNvSmQl6iSA5ID3YwD2MfpfTUpEfxlJT3hxTUiGFTHN1Z2nvPlXVrXUvnUEhT+2nHHiI28k/UZf4C0rItBZEByQHKgN3AgqQCDRzPfAJryBa3r92ogZ0p32IvINS8pvFJ+hTKD5EC354APAcaGpdQKStdg688saF2rU8onkSUHJAckB1LkQFIBhs3WcGCF33ySCxrXBzColb9TmbMCU8fkGZLQk8mSA5IDkgPJOJBUgOG8o34JpRElO2Djeh4nVz7SWBF4lQsuqiUrUqZLDkgOSA5khgNJBRiEl8n3IEJQ4b+NbCucRzdC03pfITmvvK3R2LYe2uuPDswMwyUVyQHJgcxx4P8BnVoIgZoAA2gAAAAASUVORK5CYII=\",\r\n            \"originWidth\": 304,\r\n            \"originHeight\": 64,\r\n            \"default\": {\r\n                \"width\": 304,\r\n                \"height\": 64,\r\n                \"left\": 80,\r\n                \"top\": 45\r\n            },\r\n            \"crop\": {\r\n                \"width\": 304,\r\n                \"height\": 64,\r\n                \"offsetLeft\": 0,\r\n                \"offsetTop\": 0\r\n            },\r\n            \"isFixedPos\": false,\r\n            \"fixedLeft\": 268,\r\n            \"fixedTop\": 297,\r\n            \"border\": {\r\n                \"width\": 2,\r\n                \"radius\": \"dashed\",\r\n                \"style\": \"solid\",\r\n                \"color\": \"#ff0000\"\r\n            }\r\n        },\r\n        \"img_5034067dpM6W_1600925833775\": {\r\n            \"type\": \"1\",\r\n            \"src\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATAAAABACAYAAACdriuGAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABMKADAAQAAAABAAAAQAAAAADNtzoiAAAc30lEQVR4Ae1dCZwUxdWv6p6dPUAQPCMKmEPwAEVioiYx4hFj1AgYPD6i0cQvgPoDdheEvdhmd3YBZRdBc6wH3uQTFEVNosaExKjRENSFqIAalStEZOXcY6a76/vX7PZsdU9PT8/sTNhdqn+//nXVq1evql5Xv3r16lU1Ham1aeQgXJSSlsbK3AUHoWhZpOSA5EAv4YDSS9ohmyE5IDlwCHJACrBD8KXLJksO9BYOSAHWW96kbIfkwCHIASnADsGXLpssOdBbOBBwawgj7FxikqBbWqZgjCqREZVtBTF6jO1eX5W3KBaXAckByQHJgSQccBVg7cKLZVWAEWYohNK+sfopLBILy4DkgOSA5IAPDsgppA8mSRTJAcmB7skBdw2se9Y17Vqdr7FAkxIZTRg5jTA2jBE6hBLWjxFirtdyL0ubsMwoOSA5cFA50GsF2Oj5rH+kNTIB9rxxu0jkPGKwzukqJBmEFyGUbD6o3JeFSw5IDnSJAykIMHosSsrvUmlCZkqoiehhFoiZZA/CISue7nNUiA0x9MjccGvkGmhbee10ouIqjiTqsC8OKAGSA5IDPYYDKQgwks9Eo3sXm8gYhAojqkVGUUgfK5zO8xyNDdxPImW6HrkVgivXHw221R+exJIckBzojhxIRYB1x/oTbt/aRfXiAywyG4Lr8NQqSTemhi+xJQckB7oTB3q0ABsxjw1oaousICa70H2S6M1qSsj73hgyVXJAcqA7c6DHCrDRGhsebgs/h5noV9NlsEJyXkk3r8wnOSA5cPA50CP9wEbM1S+NkMgbsKGlLbywArnjbY2+d/BfgayB5IDkQLoc6HEa2OlzI2MYM5/FIkCX6o4VyOfTZZrMlzoHtPr6gSSsxlxZArrOysuLt6ROqWfnkHzI7PvrkhDIbFWSUxtdzb4SNiJPwljf9Xor9JHkJaaOoS1YcrwRiRTbcir0merSor/YYIdYxGg252Hg+bnVbIPQZoS7tPJs0epJT8mHzL6tHjOF/KbG+oWN8LMQXgO7ygKcBvtBY0Xg1a7ScctvmOFjoB1OF28sMoxyw5UwyQHJAW8OaLULh3thdF2T8aKeoTRNY8pTJLwMNq9TMkESq4/llNJ0Fi4zUbykITkgOeDBgfr6+vzdB8i1jJhTDIMeA9QhidB7hAa2kkauh/DKzJ5FSte8UxlckYghEi45IDlw8DhQEaq/ranZ3GYScyk0jLOS1aTbCzA4quZhOlaVrCF+0xVKZ0ntyy+3JJ7kwH+bA+wCKCsD/Jba7QVYE9FvQ4MG+22QJx4lv2uszFntiSMTJQckB3oMB7q1AOOe9jg3ojQT3ITWtTMQCN6SCVqShuSA5ED34EC3NuIrbeEiMwV1MiFLKQ3D72v82+X004Q4MsGTA1pDQwFpaj4WxxIdqWL76dFH526eNGnSIXeK7p13PtLnQOSzEwxK+qhq/rbKmbf8J9MmiQULHjhsH9l7PDXNvH6BozbNnHnDAc+X4zMxFKof1KYqx6mE7STHHr5Du+mmVp9Zk6Jlk7ZX4d1WgHWsPP7Eq/J+0+A2cQumjllxm/Bbh0zhwcg5Gcd4fC9Gj7G26ooZ18XiCQIVoYW34wC0szuT2c7q8hmTOuPxIf6x7m3bOQXG1HHGZ/vOxjOqseskTLZ+FjYrqhdux7Hgb6qEztfKi/4RTyF9iPbgg3n69qZ6rBXzY5xiF+rweWBAXpF26637y2vqiylj34olIqBSJaSVFb4lwtzCWu2SUwwzEhLTGCVrQ2XFNSKMh+fULLzYZLQIdfnGntbPYm48ut5C5oTqwhWhuq1IeyJXUe4uKyv8tzO/3zgvhzE6c19kN+xATEVbyR5jJwP9TxH/uxoMFmuzpm71S0+rrTvJMMnPgD8KtM5oZeZRRDeJzglsazLKQwtfw8D+9IAC2lBUVNTily7HyxTtjjZPiZXN2DdjYQTwTo5C+1eKMHgRPF5VXvwUh3VbAbaS6OfD9nWCWPF0whgdF6+rDD6QTt7umccchf2f46y6oQNyh1AfFz0biyFivs1emeaE6q/Y07bzV/hwBnE8/jGJF+JcmB2P9ON1wq5CJ3tRDQR+rs2e5klXpJEoHBWc23auAm37Jn1Kt5Ec5WIuvHhehZF/mYwtFOkYxNiJuKdg5vimEb4RbYjxg8PQV57lT+sqv2Px10g4stw0yRmcA04ecDzAgqjnl/EsaTWNYvDhrury4lkWDT9PjTHFqKm7G+XAxOEoBRINkKGgM1SPhC+uqKmfXF1WtNyLLt4znVOzKKSbbCbqluOKCwEJ+Hlo1XlNzWy6Vl0/WasoesEVVwBmmjbadqLYL4Wi2oOM5QPH9p6wDTA2WEZH1LhM3QAAxnbdbYKS+eNJTlE3aE6PqkJFTd0NJmFPo/NHhZefyqMTXoKz2J7TfvGL2HYhP/mcOHz6tLd15+9B70JbGiUfBVTl26FZhe9bcOVbo57DaLzdivMnOvs1XHsTYc4wFxjAs2mtGAj2qkf2jQmGUKjuBNqmvwyCEF7+LtAMot63Q9tNyW5r1NQvwKCU3D4LcwozzSe0mkVnJqrR8uXLVQw+D2HXQ2lC4eXMzMgQg5jPQZu8ypkkxrNJWywnlXC3FWDomBek0hAbLqWtkNITcd59iaZFT361JctIYg5oNYtPw8e0FJ2fj9CdFyVfQEN5Eb+SWkAU+ivw95XOxI4QIyONL1ofw0eM15f6pS1adPj+8Bd/wOD1HTE3hMv6QDD/21pJ4SciXBszRkeaXbtmpL+x/YuxIl5cOHQXNA9oj8LFFPIbbdKkmDbbxsjjqId99ZuSPShvGaXKfJglQuBDA3iyQSATDeKfC6E5NXVjnHC3OMooAL9m8DQuREH395zH7eXQD93yGMzQ3OAc9s+NWyaD5g1x6ZS+gbrej7rXQtX8DcKbRBzwI2AS8MDD8z2btMW6pBLullNIvm2omUROT6UhFi46wHac7jr2nTm5ayyYfPrngM70O53CCx/T831zDv+fWbN+ZjuCm2sCOjOwN5WcaJWAj/HKytr68xFfbcH8PGtr7zmiZX8bhBcZZcPHh1eg5v+g5PZbvrDBOyJBSu7DaMW1jZjARR1+guT/c8PnMIOaE50zNaqw+yx87gmOadXZNhxK3woU0Iu1oqImC896zqmum2RSwqfb7YIbT5PSa5Dumwfot+9hCn6pOAXnGs/6TVurIJBKYrRBFAPMFdyGp5VOfc+qA39qCxceqbeyarHeqNAOqqg3V5UV/taGy6ettXU/JSZdBPrtWjOmm7pJy4H3YxGXh7NFWz3uiEfIrl0xG5fRSh5C+2KzL9R/q5pv7xP9FCW2qAG/TtLivAl+Oos66+KNToxZBbpXpm7Cp/buV5sSGYZy2juDO0ocFCMK9gfTpbkkOPqdOUEpvOI4lBwAO8j3wPfvi5jg6yq1vOhKp/DiONxYHlCCl4PvbWIejOR2m4WY6BKuqbnrmGaz9c/4kBzCi7zcP/eoi0pK3IUXJ8VPtMAfpn7nIHtxTc2iLzlg0eiSJUty8YH/yJZGyTvVJTPWWrC9zSb+YGW3HaEzPuomvHieqoriBvTmVVZ+/sTXcqkY9wxTckDN7TNGFF4c/+qrrzaqy4vKUHbsA7fomGY4boDHx1+Dtg2wcPhTJer1TuHF4RqlZnXZjPvxXU/ncevCosh13EBvxa1ntmjzlVBtxozPrRucC1tltj+paaVZT3HBQWmszF3gvCGlXkenXGO/yWcgyCVfhm4WU9ftFUbpJhvmhHnFIYCfxwh6+not+LM1Gt3hhSvTEnNAp2aZLZXvFw3QCt7ZbXAhwrUAfGD2o4kY8Z7CCfn58nurqf8FH95pAhjTKbIycNLgy/y4EDCF/lrMC+GjthAWp0VwnM/2G5dBUB4u4iuM3i/G9ZzATjHOw8hzhZdtTQ0ohQpVxls3BP90bfnyoJOOWxwGuV9qM6fw78v9UuhiZwJG/yEiTJu/eDAqebMI4zzUKgpfFmHOcFVF0QP4zt+y4KCrwPhfbsX5M5u0xXLSCXfLKaRJlUGQYt7twceFF/Qn2Buq1mnyZFVvZvlLBUdH4kONIYO/L1XPLlofAyQIsBy1jOrGM2Iyn4aJI6WYZoVDoXuGtJLWPyL+FQvGn/j4Hxpx0gk3cw1EhCcKB0qKXtBruKtB50dNzeg08k5nHmoYEztbGC2sRemjPC7ihWZN3wgXkR3A63ThYOQCY1tTY0XNwjvVXPIM1wbEPB32uU9EmN8wCwRWeOGq/XPf1ptanChDRICpG6ejvjabNqWq7Z2I+GIYWthLeO/iwsAPxPRs0hbLSSfcLQUYZeZhtk5mtax9qvIGjJwvBAOBx9eU0y1Wknx2jQO1tUuOajbCNs0E+tc7fqjyDx54/PZ9YfTJaWNtfCFgsJgJwuueqrKiqXi6dgER1wpzDRErf/ciQ8yHCx/kqVqo/uuif9r8+Q399+v7L4OGZmXFkz2pFRbuFgDtQYrFCsYWiXDY1k6CkLzPaCENEHBr8eG/zFT6onrOqNf4goKIm0pYzdE/9sLnbiMV1XW70abO98PI0WIenNxwshjnYUaMc+E3ONwJj4szZsdh5Ai+GmyZDbJJO64uKQLcBRhju+Fkw+1gsYv/t7Grvz6LEXMJQJOKdSJ03i14WU+jg8BozKBa040IbyjoF1j7tyIaNxS5kJOgFDnQQow4uwdIfJoiGf/osDFBjNiEV0fmY1IRXlaBajB/qR5u1UTblUGiWtg/LJzmyAHYvuy/3AuQwP1WuviEL9ddEIpwiyALRDgPo95c0zkLffQs7EwoMV59azcE2gsQZo+GSoud9jhndnscg7I2o9imzdkRYrG9CHUKMDAploIA6mQXQhzGyGR4vIlovsP72Z6hQI5q39mk7btCCRBdBdj6qjzbyNORN5SARsbBjZXBBhDlt7z+Wxxg5olxRVFq87GKS88CAFrOhPKaugp4xFenQl67/dYdcCJ9Bh/bBCsfBMx1sEMVa1dfHTUMwyXUtvoIGbBJK58e7w7SQQA7Fe6oqF30GjFN7hB6RYfgssjHnh2a0bUQZtdyzYyo6rTq0sLXYggeAeiZvqbJHiSsJNs03AKm+6Q6GYq8lvkgm7TTrWI0n23O3CVKMnOP5oBq0ngjMiMDs96o9tVjm7YPdWIunDHHpVo2dBL7oIepkP7htss5Hb5YACH0XTtNZvchsydGY1wQQRsbm68Gj6WKMhGrC4/CSJdwuxCE3GhimC9V1NY7ynIhnkEQZij/cZID7PN0b7yD2BQ1m7SddU417qqBpUokVXzu58VdJfhqIzfYc5sXnzZ2aF5k5Fz9CiznnoqRbTumltsVEtjcqNkd71ItU+In4UAA/HVYcUyFHZ8kV5eSMQcKM0W5Dgb3o/GufxUjFvWjYo9qNXedq5VNXxeDJwnMLS36E7zJP4AQ+ZqFSg3zJwivbIM2BnjngE1pJI+qD1t4yZ6lpVP5yuSyjpuUL7hrmBI2zof/11j01YtAO/YtoS0FOEb8t9q8+jO0kqIPk9HORDo0uQ2og+3KpeTMTPw4JZu0bRVOIxJjehp5fWfhG7Ofpvp3sW/tcnTaC6JOqkaHnxeMa5zxeOlP4xEdQbnwMpk5r70AmBCxeXik1vYJbGGrIOhWDWCBv/5Zg5J7SF5872NnVwUX87lv09SpU9sSsYM7RK7btOXridKj8NnTN5OaenznnTYidNwve+bpSNSqF50P59CpIq6aWzDZyzUA/cBUiXKFVlr4Es+H6d83MX28MUaDkT7Y17gKDpRnOVf8YjiOAPoGwwbvBkz5FlpJ4M+l0QUKMzzRgvEn+thzZeXT47QWEccrLCxcNFTMrz+VRtgT6MOnxvLw+huMr+YticGyGIAryQYITVsJYUL5O+/yQlc2adsqnEYkqwKMn+dF2sKFOM/+RkihE3j97CzurDHUVBjs2y90hDjbCwySQ5F7Gjr5tCYa3j5iblgbfnLO0hVXw4H1ELpgx/nExkRoK00HdM7bhCP9ug+38JW3KP8TsSq6kldd9y+8n9hqFt7DVVi5mz579qQ9ifJxuEGNa/B+Oqd82LfoJbzaadFWbB6OCi8eVwcNnKJvaxqJep7Zno63zdhQvZU81dDQcJHfo3sKaPChZtoGh84OQYzFghYzUguenWHR5U94p98vxsUwPOurIPi+IcDWYxo5U4jbgnA1eRca2VUkrNu3FTEyBoj/FQGGE0E2OEd0vL/zUT5XDDwv7H3l3+eFFhL6mBEYdMRk67idbNK2ykz32alSp0vBJR8/BnqkFplB2iIfoeNU4Pb8eNpJsNhoyKeNLmRjIHwsx2G0uXfDe+H1+MntlbGEQyFA6cfOZpq6eakTZsW56wDcUOusuNcT+wFt/lB4b4cd0PdN8crD9y/ifdneAQajpB+Nkyb/WPJI7njYmHbZ0hg5b+vOfffYYB6R0tLbdkFztPlVQRDebMsCc4VSOv1FG0yImAppQ55LrBvCcKq2ZEk/ASUuGLh92geoO3fy7rzAiM5IdkMDD1PfhQb6iVgKBqNJ2rxFQ0WYM8x/A4h23gNh92PrRqUHWsKL42eTtrM+fNSyw9ArPS7PRI98rkl8qjhSC9+wi4Q3Yjc831M3wBXRFdhp4+I2L1cUJ5BBWzCNZ07Xwg9O0FjQmdwb41SJF2B446VuHXXevF8OOKDvfwJ94qt+eDEwn9bDQG2fcjBSiSNcrnXLzz3TjQPmUrznL4npqo9RX8S3wuXlt32qUHIdPiDb2j+69M/5zx4svKRPVfm1Fw4835dyjTMRDjY8/0lMA3+Dxt7wAhHmDBu19T+GwO8jwqHFxbYnifBshLkJAfW28whaqG6YjybaVsX3nxrhyPNx9XbsbMgmbScvMF21LZAwSgfxk0GceFY8YyNE+wbs6K/PLrOIp/LEFozvNGqdhw7C5vUxOu5Q3zQofR2+kePWaS6rab6JdB2xYt7C0UzvPK+oqxQxiG+urigeItIpD9W9CaEhTnEw1NNm7AlsQAdYR4nyH/zV5QwYx2/Dx3ecmNcKu9HlaXNCi643mfGIhRd9Rp1K2WPYcvNXbJ5tNKk5wCTKKdgtMQ2d31Y3dKjlOGCRb2S2XfCpauCCyALy+qJdtg/eSoMbRQk07Forzp+gq2Nf3yXYGmMTLiKOGMZhfetRt9NEGA+Djqnm5Jzo3Hco4mmrVwf019ZuQv4TRTg0nD+AwGMqUz/BczfqONCkbAgG6x8Cbyx4bVMI4Df5/aqyGTZNLxU+iGXDkfVTaEiDLRjq8jSmteOtuPWEG8dTqIcNDl5/joHpbrS9Ee9vC2zRg4BzLqzLU9DG/lZe/gTOShwW+CNuTxThPJxN2lZZsGEWwoZZb8WjTxr1/XwbNcJ+Z9KKdn/PSrcx3AKm+uR/zG4m4b+BGWkJLzC3jTup2sulq+zxJDHG8ELCa3hdkmD2+GRoKbOdjUDnLoBKUYiV3QdN0/gdFwDoge3Cix8Dg9MOnHnc4nPLpj+GzvuULY1vrGfkeiy33Ksz800cvPdCtJPFCS/6br+8o39qy5tGBH8xx3E19mko2hLAmVUrqquX+Hq/ELbuWhiEkJfw4tWNHtMToOO4kBWrD032YvD3YZzY8Rfd1Bt1YqzGYtNDqNt43PZvidIn5pYWx2x8Ip1shnOpMhVCyOYSg75xJITsXNT1Gd001uL5LOKz44UXbcT7u8FNePE6Z5O2xRP8guxJyAO7szoONcSAje8bxywx8i0Llz/tTBdTfIZPnxsZEzYifwfhU3xmcUN7w+lhDyamJsA4Vfy9iP+9m2uDboX0FlhVWfHq6JlcfhoEmxJVApdgbN3oCx0jL0a4H6FjTOUDi588HIcLSJYbGOdn83UymvwDUvvl3IgP0VZndOCBYRp+lm9zSUajIKfvYxit7TYpZILbRkLjvUizenZxI3h8U9zHJCIlCKPefwsMGnhjIkGQIFtGwOXlRdvgs3Ya6vCkb4LgN4T1MjU37/te7y+btK26Rt0+KCtB/TEeJ7+6JMBgQL8Uo9JLkI4DkxeVGIPvbXSmclcJfBTbnfCkcQhSaIPLuD0uKW4PRoCn+i2Ydv8QL3qHWzMA1/Hx/SafBk6tLp3+phuOF6yqYsbdAaqcDRpvgFY4ES46/mbY5W4acdLgkSFuyM7QpU2duldVg+NBf79IEtPQU/aHdy/TcJ6VCHeG+cop6v1nGxx/pjrhiALfAyM/ujmfqidCEN3hrIeNbkcEeKv5aRQjhg3+jmgEd8PNJoz7rGEaPwGOt9dAiH/sWRbeL1wRzsV0fiLfzeCJi8Rs0rbKDpXNWIzdDN8GP7nb1KZoX7YSHU+kpXeN1tjwCIm8AQFmm0OnTA3SPy+QM8RtYzZcJf6XrzamTJNnoKQaJ7LOSStvD8rEfcCa9pnDML06BTav4TB68lNKP81T1Bc6nC+73BpuEyKvrxtuMhwyyejJcHDdqRD1Q4UaH5FzRn/YlY3MXa5cAgJ8AaNZb9nKp9YWCj6GhV7uEBae25NrfS2RPcN0heLYGjZEMdkxUFvg6c7+DSG/Pchy/8UXIdzyHmwYX4k+YDafBqdebhOEQZx+jH2bG9Q89n6iM8781jmbtP3UIS0B1uHfxaeNvla3vCqCTvXHdVrwIjecCcuZyl0lUM7JbumeMEx/AoGcYfJXap5c6rWJMAbPhJ3uDrGBAZWcrJXO2CDCZLhnc8BTDXdrGny8ArQtsiITwovThw9RlVs5HBZ1UqVqSaJ0TziWkA09Uu2JIxN7JQf4zgOskN5qaxylr0rhZeNIr4ikLMB2Ub0Y08YLM9F62LieX5/kMML1lYFVWPp9KJ3ysDI0cVRV/NG76dCSeXoOB/65actYjIxDxBqjr90nxmW4d3AgJQF2jsYGYg9Z3BJ+OqzA1NGgSrw7gButk0jOJNgZXndL84TB0Iv/eE7zxJGJvY4DMPTb3zncSPDLNP+rcr2OI723QSkJsP0kUgbtq/NQtS7wBdrRw41zct/1Q2KFRsPcSRWG+c1+8EUcGPku7+0rkmJ7D/Vwxbw6/IXa/ls2DH7LxF+mHeo86k3t9y3ARoUYV8ntdoU0OcHdI/JITlkq2bmHfVANXgAh5ssh06INgXvUSkW3Ob9ZafLZCzlgwH/NcQWIP98vRzYZ7QEc8C3AYBCfi+Xj3C63CT+dVRQ6Np2/B62toB8VkOA5EGK/TakeJrsyJXyJ3CM5wF0n0EcvghtJ7CA/9JVX+O/femSDZKWTcsCXG8Xo+ax/uDWyA50jLynFZAjtf8xelgzNK51PCXFEjwZ/ltv9CFXY21bDVeMCL5oyTXJAcqDnccCXBhZpjUzIhPDC1HEenEu7JLw4izWNmtxJlft5QTjxI349tx3AJvKlnvdqZI0lByQHknHAlwCDABiXjFCydAiaxeNJsDwZXirp3EkVmtUNAYWcCSH2IMrY6Z6ftm9qdk+UUMkByYEeyoGkU0juuLqLRL6ABtY3rTZSrCBScsu6yuADaeVPIROfWkYN9u02rzPbNS8IL8b60b7Bvutm0rjNvSmQl6iSA5ID3YwD2MfpfTUpEfxlJT3hxTUiGFTHN1Z2nvPlXVrXUvnUEhT+2nHHiI28k/UZf4C0rItBZEByQHKgN3AgqQCDRzPfAJryBa3r92ogZ0p32IvINS8pvFJ+hTKD5EC354APAcaGpdQKStdg688saF2rU8onkSUHJAckB1LkQFIBhs3WcGCF33ySCxrXBzColb9TmbMCU8fkGZLQk8mSA5IDkgPJOJBUgOG8o34JpRElO2Djeh4nVz7SWBF4lQsuqiUrUqZLDkgOSA5khgNJBRiEl8n3IEJQ4b+NbCucRzdC03pfITmvvK3R2LYe2uuPDswMwyUVyQHJgcxx4P8BnVoIgZoAA2gAAAAASUVORK5CYII=\",\r\n            \"originWidth\": 304,\r\n            \"originHeight\": 64,\r\n            \"default\": {\r\n                \"width\": 304,\r\n                \"height\": 64,\r\n                \"left\": 79,\r\n                \"top\": 187\r\n            },\r\n            \"crop\": {\r\n                \"width\": 304,\r\n                \"height\": 64,\r\n                \"offsetLeft\": 0,\r\n                \"offsetTop\": 0\r\n            },\r\n            \"isFixedPos\": false,\r\n            \"fixedLeft\": 268,\r\n            \"fixedTop\": 297,\r\n            \"border\": {\r\n                \"width\": 0,\r\n                \"radius\": 0,\r\n                \"style\": \"solid\",\r\n                \"color\": \"#000\"\r\n            }\r\n        },\r\n        \"img_8s8lnsidWmWo_1600925835996\": {\r\n            \"type\": \"3\",\r\n            \"src\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATAAAABACAYAAACdriuGAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABMKADAAQAAAABAAAAQAAAAADNtzoiAAAc30lEQVR4Ae1dCZwUxdWv6p6dPUAQPCMKmEPwAEVioiYx4hFj1AgYPD6i0cQvgPoDdheEvdhmd3YBZRdBc6wH3uQTFEVNosaExKjRENSFqIAalStEZOXcY6a76/vX7PZsdU9PT8/sTNhdqn+//nXVq1evql5Xv3r16lU1Ham1aeQgXJSSlsbK3AUHoWhZpOSA5EAv4YDSS9ohmyE5IDlwCHJACrBD8KXLJksO9BYOSAHWW96kbIfkwCHIASnADsGXLpssOdBbOBBwawgj7FxikqBbWqZgjCqREZVtBTF6jO1eX5W3KBaXAckByQHJgSQccBVg7cKLZVWAEWYohNK+sfopLBILy4DkgOSA5IAPDsgppA8mSRTJAcmB7skBdw2se9Y17Vqdr7FAkxIZTRg5jTA2jBE6hBLWjxFirtdyL0ubsMwoOSA5cFA50GsF2Oj5rH+kNTIB9rxxu0jkPGKwzukqJBmEFyGUbD6o3JeFSw5IDnSJAykIMHosSsrvUmlCZkqoiehhFoiZZA/CISue7nNUiA0x9MjccGvkGmhbee10ouIqjiTqsC8OKAGSA5IDPYYDKQgwks9Eo3sXm8gYhAojqkVGUUgfK5zO8xyNDdxPImW6HrkVgivXHw221R+exJIckBzojhxIRYB1x/oTbt/aRfXiAywyG4Lr8NQqSTemhi+xJQckB7oTB3q0ABsxjw1oaousICa70H2S6M1qSsj73hgyVXJAcqA7c6DHCrDRGhsebgs/h5noV9NlsEJyXkk3r8wnOSA5cPA50CP9wEbM1S+NkMgbsKGlLbywArnjbY2+d/BfgayB5IDkQLoc6HEa2OlzI2MYM5/FIkCX6o4VyOfTZZrMlzoHtPr6gSSsxlxZArrOysuLt6ROqWfnkHzI7PvrkhDIbFWSUxtdzb4SNiJPwljf9Xor9JHkJaaOoS1YcrwRiRTbcir0merSor/YYIdYxGg252Hg+bnVbIPQZoS7tPJs0epJT8mHzL6tHjOF/KbG+oWN8LMQXgO7ygKcBvtBY0Xg1a7ScctvmOFjoB1OF28sMoxyw5UwyQHJAW8OaLULh3thdF2T8aKeoTRNY8pTJLwMNq9TMkESq4/llNJ0Fi4zUbykITkgOeDBgfr6+vzdB8i1jJhTDIMeA9QhidB7hAa2kkauh/DKzJ5FSte8UxlckYghEi45IDlw8DhQEaq/ranZ3GYScyk0jLOS1aTbCzA4quZhOlaVrCF+0xVKZ0ntyy+3JJ7kwH+bA+wCKCsD/Jba7QVYE9FvQ4MG+22QJx4lv2uszFntiSMTJQckB3oMB7q1AOOe9jg3ojQT3ITWtTMQCN6SCVqShuSA5ED34EC3NuIrbeEiMwV1MiFLKQ3D72v82+X004Q4MsGTA1pDQwFpaj4WxxIdqWL76dFH526eNGnSIXeK7p13PtLnQOSzEwxK+qhq/rbKmbf8J9MmiQULHjhsH9l7PDXNvH6BozbNnHnDAc+X4zMxFKof1KYqx6mE7STHHr5Du+mmVp9Zk6Jlk7ZX4d1WgHWsPP7Eq/J+0+A2cQumjllxm/Bbh0zhwcg5Gcd4fC9Gj7G26ooZ18XiCQIVoYW34wC0szuT2c7q8hmTOuPxIf6x7m3bOQXG1HHGZ/vOxjOqseskTLZ+FjYrqhdux7Hgb6qEztfKi/4RTyF9iPbgg3n69qZ6rBXzY5xiF+rweWBAXpF26637y2vqiylj34olIqBSJaSVFb4lwtzCWu2SUwwzEhLTGCVrQ2XFNSKMh+fULLzYZLQIdfnGntbPYm48ut5C5oTqwhWhuq1IeyJXUe4uKyv8tzO/3zgvhzE6c19kN+xATEVbyR5jJwP9TxH/uxoMFmuzpm71S0+rrTvJMMnPgD8KtM5oZeZRRDeJzglsazLKQwtfw8D+9IAC2lBUVNTily7HyxTtjjZPiZXN2DdjYQTwTo5C+1eKMHgRPF5VXvwUh3VbAbaS6OfD9nWCWPF0whgdF6+rDD6QTt7umccchf2f46y6oQNyh1AfFz0biyFivs1emeaE6q/Y07bzV/hwBnE8/jGJF+JcmB2P9ON1wq5CJ3tRDQR+rs2e5klXpJEoHBWc23auAm37Jn1Kt5Ec5WIuvHhehZF/mYwtFOkYxNiJuKdg5vimEb4RbYjxg8PQV57lT+sqv2Px10g4stw0yRmcA04ecDzAgqjnl/EsaTWNYvDhrury4lkWDT9PjTHFqKm7G+XAxOEoBRINkKGgM1SPhC+uqKmfXF1WtNyLLt4znVOzKKSbbCbqluOKCwEJ+Hlo1XlNzWy6Vl0/WasoesEVVwBmmjbadqLYL4Wi2oOM5QPH9p6wDTA2WEZH1LhM3QAAxnbdbYKS+eNJTlE3aE6PqkJFTd0NJmFPo/NHhZefyqMTXoKz2J7TfvGL2HYhP/mcOHz6tLd15+9B70JbGiUfBVTl26FZhe9bcOVbo57DaLzdivMnOvs1XHsTYc4wFxjAs2mtGAj2qkf2jQmGUKjuBNqmvwyCEF7+LtAMot63Q9tNyW5r1NQvwKCU3D4LcwozzSe0mkVnJqrR8uXLVQw+D2HXQ2lC4eXMzMgQg5jPQZu8ypkkxrNJWywnlXC3FWDomBek0hAbLqWtkNITcd59iaZFT361JctIYg5oNYtPw8e0FJ2fj9CdFyVfQEN5Eb+SWkAU+ivw95XOxI4QIyONL1ofw0eM15f6pS1adPj+8Bd/wOD1HTE3hMv6QDD/21pJ4SciXBszRkeaXbtmpL+x/YuxIl5cOHQXNA9oj8LFFPIbbdKkmDbbxsjjqId99ZuSPShvGaXKfJglQuBDA3iyQSATDeKfC6E5NXVjnHC3OMooAL9m8DQuREH395zH7eXQD93yGMzQ3OAc9s+NWyaD5g1x6ZS+gbrej7rXQtX8DcKbRBzwI2AS8MDD8z2btMW6pBLullNIvm2omUROT6UhFi46wHac7jr2nTm5ayyYfPrngM70O53CCx/T831zDv+fWbN+ZjuCm2sCOjOwN5WcaJWAj/HKytr68xFfbcH8PGtr7zmiZX8bhBcZZcPHh1eg5v+g5PZbvrDBOyJBSu7DaMW1jZjARR1+guT/c8PnMIOaE50zNaqw+yx87gmOadXZNhxK3woU0Iu1oqImC896zqmum2RSwqfb7YIbT5PSa5Dumwfot+9hCn6pOAXnGs/6TVurIJBKYrRBFAPMFdyGp5VOfc+qA39qCxceqbeyarHeqNAOqqg3V5UV/taGy6ettXU/JSZdBPrtWjOmm7pJy4H3YxGXh7NFWz3uiEfIrl0xG5fRSh5C+2KzL9R/q5pv7xP9FCW2qAG/TtLivAl+Oos66+KNToxZBbpXpm7Cp/buV5sSGYZy2juDO0ocFCMK9gfTpbkkOPqdOUEpvOI4lBwAO8j3wPfvi5jg6yq1vOhKp/DiONxYHlCCl4PvbWIejOR2m4WY6BKuqbnrmGaz9c/4kBzCi7zcP/eoi0pK3IUXJ8VPtMAfpn7nIHtxTc2iLzlg0eiSJUty8YH/yJZGyTvVJTPWWrC9zSb+YGW3HaEzPuomvHieqoriBvTmVVZ+/sTXcqkY9wxTckDN7TNGFF4c/+qrrzaqy4vKUHbsA7fomGY4boDHx1+Dtg2wcPhTJer1TuHF4RqlZnXZjPvxXU/ncevCosh13EBvxa1ntmjzlVBtxozPrRucC1tltj+paaVZT3HBQWmszF3gvCGlXkenXGO/yWcgyCVfhm4WU9ftFUbpJhvmhHnFIYCfxwh6+not+LM1Gt3hhSvTEnNAp2aZLZXvFw3QCt7ZbXAhwrUAfGD2o4kY8Z7CCfn58nurqf8FH95pAhjTKbIycNLgy/y4EDCF/lrMC+GjthAWp0VwnM/2G5dBUB4u4iuM3i/G9ZzATjHOw8hzhZdtTQ0ohQpVxls3BP90bfnyoJOOWxwGuV9qM6fw78v9UuhiZwJG/yEiTJu/eDAqebMI4zzUKgpfFmHOcFVF0QP4zt+y4KCrwPhfbsX5M5u0xXLSCXfLKaRJlUGQYt7twceFF/Qn2Buq1mnyZFVvZvlLBUdH4kONIYO/L1XPLlofAyQIsBy1jOrGM2Iyn4aJI6WYZoVDoXuGtJLWPyL+FQvGn/j4Hxpx0gk3cw1EhCcKB0qKXtBruKtB50dNzeg08k5nHmoYEztbGC2sRemjPC7ihWZN3wgXkR3A63ThYOQCY1tTY0XNwjvVXPIM1wbEPB32uU9EmN8wCwRWeOGq/XPf1ptanChDRICpG6ejvjabNqWq7Z2I+GIYWthLeO/iwsAPxPRs0hbLSSfcLQUYZeZhtk5mtax9qvIGjJwvBAOBx9eU0y1Wknx2jQO1tUuOajbCNs0E+tc7fqjyDx54/PZ9YfTJaWNtfCFgsJgJwuueqrKiqXi6dgER1wpzDRErf/ciQ8yHCx/kqVqo/uuif9r8+Q399+v7L4OGZmXFkz2pFRbuFgDtQYrFCsYWiXDY1k6CkLzPaCENEHBr8eG/zFT6onrOqNf4goKIm0pYzdE/9sLnbiMV1XW70abO98PI0WIenNxwshjnYUaMc+E3ONwJj4szZsdh5Ai+GmyZDbJJO64uKQLcBRhju+Fkw+1gsYv/t7Grvz6LEXMJQJOKdSJ03i14WU+jg8BozKBa040IbyjoF1j7tyIaNxS5kJOgFDnQQow4uwdIfJoiGf/osDFBjNiEV0fmY1IRXlaBajB/qR5u1UTblUGiWtg/LJzmyAHYvuy/3AuQwP1WuviEL9ddEIpwiyALRDgPo95c0zkLffQs7EwoMV59azcE2gsQZo+GSoud9jhndnscg7I2o9imzdkRYrG9CHUKMDAploIA6mQXQhzGyGR4vIlovsP72Z6hQI5q39mk7btCCRBdBdj6qjzbyNORN5SARsbBjZXBBhDlt7z+Wxxg5olxRVFq87GKS88CAFrOhPKaugp4xFenQl67/dYdcCJ9Bh/bBCsfBMx1sEMVa1dfHTUMwyXUtvoIGbBJK58e7w7SQQA7Fe6oqF30GjFN7hB6RYfgssjHnh2a0bUQZtdyzYyo6rTq0sLXYggeAeiZvqbJHiSsJNs03AKm+6Q6GYq8lvkgm7TTrWI0n23O3CVKMnOP5oBq0ngjMiMDs96o9tVjm7YPdWIunDHHpVo2dBL7oIepkP7htss5Hb5YACH0XTtNZvchsydGY1wQQRsbm68Gj6WKMhGrC4/CSJdwuxCE3GhimC9V1NY7ynIhnkEQZij/cZID7PN0b7yD2BQ1m7SddU417qqBpUokVXzu58VdJfhqIzfYc5sXnzZ2aF5k5Fz9CiznnoqRbTumltsVEtjcqNkd71ItU+In4UAA/HVYcUyFHZ8kV5eSMQcKM0W5Dgb3o/GufxUjFvWjYo9qNXedq5VNXxeDJwnMLS36E7zJP4AQ+ZqFSg3zJwivbIM2BnjngE1pJI+qD1t4yZ6lpVP5yuSyjpuUL7hrmBI2zof/11j01YtAO/YtoS0FOEb8t9q8+jO0kqIPk9HORDo0uQ2og+3KpeTMTPw4JZu0bRVOIxJjehp5fWfhG7Ofpvp3sW/tcnTaC6JOqkaHnxeMa5zxeOlP4xEdQbnwMpk5r70AmBCxeXik1vYJbGGrIOhWDWCBv/5Zg5J7SF5872NnVwUX87lv09SpU9sSsYM7RK7btOXridKj8NnTN5OaenznnTYidNwve+bpSNSqF50P59CpIq6aWzDZyzUA/cBUiXKFVlr4Es+H6d83MX28MUaDkT7Y17gKDpRnOVf8YjiOAPoGwwbvBkz5FlpJ4M+l0QUKMzzRgvEn+thzZeXT47QWEccrLCxcNFTMrz+VRtgT6MOnxvLw+huMr+YticGyGIAryQYITVsJYUL5O+/yQlc2adsqnEYkqwKMn+dF2sKFOM/+RkihE3j97CzurDHUVBjs2y90hDjbCwySQ5F7Gjr5tCYa3j5iblgbfnLO0hVXw4H1ELpgx/nExkRoK00HdM7bhCP9ug+38JW3KP8TsSq6kldd9y+8n9hqFt7DVVi5mz579qQ9ifJxuEGNa/B+Oqd82LfoJbzaadFWbB6OCi8eVwcNnKJvaxqJep7Zno63zdhQvZU81dDQcJHfo3sKaPChZtoGh84OQYzFghYzUguenWHR5U94p98vxsUwPOurIPi+IcDWYxo5U4jbgnA1eRca2VUkrNu3FTEyBoj/FQGGE0E2OEd0vL/zUT5XDDwv7H3l3+eFFhL6mBEYdMRk67idbNK2ykz32alSp0vBJR8/BnqkFplB2iIfoeNU4Pb8eNpJsNhoyKeNLmRjIHwsx2G0uXfDe+H1+MntlbGEQyFA6cfOZpq6eakTZsW56wDcUOusuNcT+wFt/lB4b4cd0PdN8crD9y/ifdneAQajpB+Nkyb/WPJI7njYmHbZ0hg5b+vOfffYYB6R0tLbdkFztPlVQRDebMsCc4VSOv1FG0yImAppQ55LrBvCcKq2ZEk/ASUuGLh92geoO3fy7rzAiM5IdkMDD1PfhQb6iVgKBqNJ2rxFQ0WYM8x/A4h23gNh92PrRqUHWsKL42eTtrM+fNSyw9ArPS7PRI98rkl8qjhSC9+wi4Q3Yjc831M3wBXRFdhp4+I2L1cUJ5BBWzCNZ07Xwg9O0FjQmdwb41SJF2B446VuHXXevF8OOKDvfwJ94qt+eDEwn9bDQG2fcjBSiSNcrnXLzz3TjQPmUrznL4npqo9RX8S3wuXlt32qUHIdPiDb2j+69M/5zx4svKRPVfm1Fw4835dyjTMRDjY8/0lMA3+Dxt7wAhHmDBu19T+GwO8jwqHFxbYnifBshLkJAfW28whaqG6YjybaVsX3nxrhyPNx9XbsbMgmbScvMF21LZAwSgfxk0GceFY8YyNE+wbs6K/PLrOIp/LEFozvNGqdhw7C5vUxOu5Q3zQofR2+kePWaS6rab6JdB2xYt7C0UzvPK+oqxQxiG+urigeItIpD9W9CaEhTnEw1NNm7AlsQAdYR4nyH/zV5QwYx2/Dx3ecmNcKu9HlaXNCi643mfGIhRd9Rp1K2WPYcvNXbJ5tNKk5wCTKKdgtMQ2d31Y3dKjlOGCRb2S2XfCpauCCyALy+qJdtg/eSoMbRQk07Forzp+gq2Nf3yXYGmMTLiKOGMZhfetRt9NEGA+Djqnm5Jzo3Hco4mmrVwf019ZuQv4TRTg0nD+AwGMqUz/BczfqONCkbAgG6x8Cbyx4bVMI4Df5/aqyGTZNLxU+iGXDkfVTaEiDLRjq8jSmteOtuPWEG8dTqIcNDl5/joHpbrS9Ee9vC2zRg4BzLqzLU9DG/lZe/gTOShwW+CNuTxThPJxN2lZZsGEWwoZZb8WjTxr1/XwbNcJ+Z9KKdn/PSrcx3AKm+uR/zG4m4b+BGWkJLzC3jTup2sulq+zxJDHG8ELCa3hdkmD2+GRoKbOdjUDnLoBKUYiV3QdN0/gdFwDoge3Cix8Dg9MOnHnc4nPLpj+GzvuULY1vrGfkeiy33Ksz800cvPdCtJPFCS/6br+8o39qy5tGBH8xx3E19mko2hLAmVUrqquX+Hq/ELbuWhiEkJfw4tWNHtMToOO4kBWrD032YvD3YZzY8Rfd1Bt1YqzGYtNDqNt43PZvidIn5pYWx2x8Ip1shnOpMhVCyOYSg75xJITsXNT1Gd001uL5LOKz44UXbcT7u8FNePE6Z5O2xRP8guxJyAO7szoONcSAje8bxywx8i0Llz/tTBdTfIZPnxsZEzYifwfhU3xmcUN7w+lhDyamJsA4Vfy9iP+9m2uDboX0FlhVWfHq6JlcfhoEmxJVApdgbN3oCx0jL0a4H6FjTOUDi588HIcLSJYbGOdn83UymvwDUvvl3IgP0VZndOCBYRp+lm9zSUajIKfvYxit7TYpZILbRkLjvUizenZxI3h8U9zHJCIlCKPefwsMGnhjIkGQIFtGwOXlRdvgs3Ya6vCkb4LgN4T1MjU37/te7y+btK26Rt0+KCtB/TEeJ7+6JMBgQL8Uo9JLkI4DkxeVGIPvbXSmclcJfBTbnfCkcQhSaIPLuD0uKW4PRoCn+i2Ydv8QL3qHWzMA1/Hx/SafBk6tLp3+phuOF6yqYsbdAaqcDRpvgFY4ES46/mbY5W4acdLgkSFuyM7QpU2duldVg+NBf79IEtPQU/aHdy/TcJ6VCHeG+cop6v1nGxx/pjrhiALfAyM/ujmfqidCEN3hrIeNbkcEeKv5aRQjhg3+jmgEd8PNJoz7rGEaPwGOt9dAiH/sWRbeL1wRzsV0fiLfzeCJi8Rs0rbKDpXNWIzdDN8GP7nb1KZoX7YSHU+kpXeN1tjwCIm8AQFmm0OnTA3SPy+QM8RtYzZcJf6XrzamTJNnoKQaJ7LOSStvD8rEfcCa9pnDML06BTav4TB68lNKP81T1Bc6nC+73BpuEyKvrxtuMhwyyejJcHDdqRD1Q4UaH5FzRn/YlY3MXa5cAgJ8AaNZb9nKp9YWCj6GhV7uEBae25NrfS2RPcN0heLYGjZEMdkxUFvg6c7+DSG/Pchy/8UXIdzyHmwYX4k+YDafBqdebhOEQZx+jH2bG9Q89n6iM8781jmbtP3UIS0B1uHfxaeNvla3vCqCTvXHdVrwIjecCcuZyl0lUM7JbumeMEx/AoGcYfJXap5c6rWJMAbPhJ3uDrGBAZWcrJXO2CDCZLhnc8BTDXdrGny8ArQtsiITwovThw9RlVs5HBZ1UqVqSaJ0TziWkA09Uu2JIxN7JQf4zgOskN5qaxylr0rhZeNIr4ikLMB2Ub0Y08YLM9F62LieX5/kMML1lYFVWPp9KJ3ysDI0cVRV/NG76dCSeXoOB/65actYjIxDxBqjr90nxmW4d3AgJQF2jsYGYg9Z3BJ+OqzA1NGgSrw7gButk0jOJNgZXndL84TB0Iv/eE7zxJGJvY4DMPTb3zncSPDLNP+rcr2OI723QSkJsP0kUgbtq/NQtS7wBdrRw41zct/1Q2KFRsPcSRWG+c1+8EUcGPku7+0rkmJ7D/Vwxbw6/IXa/ls2DH7LxF+mHeo86k3t9y3ARoUYV8ntdoU0OcHdI/JITlkq2bmHfVANXgAh5ssh06INgXvUSkW3Ob9ZafLZCzlgwH/NcQWIP98vRzYZ7QEc8C3AYBCfi+Xj3C63CT+dVRQ6Np2/B62toB8VkOA5EGK/TakeJrsyJXyJ3CM5wF0n0EcvghtJ7CA/9JVX+O/femSDZKWTcsCXG8Xo+ax/uDWyA50jLynFZAjtf8xelgzNK51PCXFEjwZ/ltv9CFXY21bDVeMCL5oyTXJAcqDnccCXBhZpjUzIhPDC1HEenEu7JLw4izWNmtxJlft5QTjxI349tx3AJvKlnvdqZI0lByQHknHAlwCDABiXjFCydAiaxeNJsDwZXirp3EkVmtUNAYWcCSH2IMrY6Z6ftm9qdk+UUMkByYEeyoGkU0juuLqLRL6ABtY3rTZSrCBScsu6yuADaeVPIROfWkYN9u02rzPbNS8IL8b60b7Bvutm0rjNvSmQl6iSA5ID3YwD2MfpfTUpEfxlJT3hxTUiGFTHN1Z2nvPlXVrXUvnUEhT+2nHHiI28k/UZf4C0rItBZEByQHKgN3AgqQCDRzPfAJryBa3r92ogZ0p32IvINS8pvFJ+hTKD5EC354APAcaGpdQKStdg688saF2rU8onkSUHJAckB1LkQFIBhs3WcGCF33ySCxrXBzColb9TmbMCU8fkGZLQk8mSA5IDkgPJOJBUgOG8o34JpRElO2Djeh4nVz7SWBF4lQsuqiUrUqZLDkgOSA5khgNJBRiEl8n3IEJQ4b+NbCucRzdC03pfITmvvK3R2LYe2uuPDswMwyUVyQHJgcxx4P8BnVoIgZoAA2gAAAAASUVORK5CYII=\",\r\n            \"originWidth\": 304,\r\n            \"originHeight\": 64,\r\n            \"default\": {\r\n                \"width\": 304,\r\n                \"height\": 64,\r\n                \"left\": 563,\r\n                \"top\": 50\r\n            },\r\n            \"crop\": {\r\n                \"width\": 304,\r\n                \"height\": 64,\r\n                \"offsetLeft\": 0,\r\n                \"offsetTop\": 0\r\n            },\r\n            \"isFixedPos\": true,\r\n            \"fixedLeft\": 641,\r\n            \"fixedTop\": 193,\r\n            \"border\": {\r\n                \"width\": 0,\r\n                \"radius\": 0,\r\n                \"style\": \"solid\",\r\n                \"color\": \"#000\"\r\n            }\r\n        },\r\n        \"img_ni1an0tek2ko_1600926607293\": {\r\n            \"type\": \"2\",\r\n            \"src\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATAAAABACAYAAACdriuGAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABMKADAAQAAAABAAAAQAAAAADNtzoiAAAc30lEQVR4Ae1dCZwUxdWv6p6dPUAQPCMKmEPwAEVioiYx4hFj1AgYPD6i0cQvgPoDdheEvdhmd3YBZRdBc6wH3uQTFEVNosaExKjRENSFqIAalStEZOXcY6a76/vX7PZsdU9PT8/sTNhdqn+//nXVq1evql5Xv3r16lU1Ham1aeQgXJSSlsbK3AUHoWhZpOSA5EAv4YDSS9ohmyE5IDlwCHJACrBD8KXLJksO9BYOSAHWW96kbIfkwCHIASnADsGXLpssOdBbOBBwawgj7FxikqBbWqZgjCqREZVtBTF6jO1eX5W3KBaXAckByQHJgSQccBVg7cKLZVWAEWYohNK+sfopLBILy4DkgOSA5IAPDsgppA8mSRTJAcmB7skBdw2se9Y17Vqdr7FAkxIZTRg5jTA2jBE6hBLWjxFirtdyL0ubsMwoOSA5cFA50GsF2Oj5rH+kNTIB9rxxu0jkPGKwzukqJBmEFyGUbD6o3JeFSw5IDnSJAykIMHosSsrvUmlCZkqoiehhFoiZZA/CISue7nNUiA0x9MjccGvkGmhbee10ouIqjiTqsC8OKAGSA5IDPYYDKQgwks9Eo3sXm8gYhAojqkVGUUgfK5zO8xyNDdxPImW6HrkVgivXHw221R+exJIckBzojhxIRYB1x/oTbt/aRfXiAywyG4Lr8NQqSTemhi+xJQckB7oTB3q0ABsxjw1oaousICa70H2S6M1qSsj73hgyVXJAcqA7c6DHCrDRGhsebgs/h5noV9NlsEJyXkk3r8wnOSA5cPA50CP9wEbM1S+NkMgbsKGlLbywArnjbY2+d/BfgayB5IDkQLoc6HEa2OlzI2MYM5/FIkCX6o4VyOfTZZrMlzoHtPr6gSSsxlxZArrOysuLt6ROqWfnkHzI7PvrkhDIbFWSUxtdzb4SNiJPwljf9Xor9JHkJaaOoS1YcrwRiRTbcir0merSor/YYIdYxGg252Hg+bnVbIPQZoS7tPJs0epJT8mHzL6tHjOF/KbG+oWN8LMQXgO7ygKcBvtBY0Xg1a7ScctvmOFjoB1OF28sMoxyw5UwyQHJAW8OaLULh3thdF2T8aKeoTRNY8pTJLwMNq9TMkESq4/llNJ0Fi4zUbykITkgOeDBgfr6+vzdB8i1jJhTDIMeA9QhidB7hAa2kkauh/DKzJ5FSte8UxlckYghEi45IDlw8DhQEaq/ranZ3GYScyk0jLOS1aTbCzA4quZhOlaVrCF+0xVKZ0ntyy+3JJ7kwH+bA+wCKCsD/Jba7QVYE9FvQ4MG+22QJx4lv2uszFntiSMTJQckB3oMB7q1AOOe9jg3ojQT3ITWtTMQCN6SCVqShuSA5ED34EC3NuIrbeEiMwV1MiFLKQ3D72v82+X004Q4MsGTA1pDQwFpaj4WxxIdqWL76dFH526eNGnSIXeK7p13PtLnQOSzEwxK+qhq/rbKmbf8J9MmiQULHjhsH9l7PDXNvH6BozbNnHnDAc+X4zMxFKof1KYqx6mE7STHHr5Du+mmVp9Zk6Jlk7ZX4d1WgHWsPP7Eq/J+0+A2cQumjllxm/Bbh0zhwcg5Gcd4fC9Gj7G26ooZ18XiCQIVoYW34wC0szuT2c7q8hmTOuPxIf6x7m3bOQXG1HHGZ/vOxjOqseskTLZ+FjYrqhdux7Hgb6qEztfKi/4RTyF9iPbgg3n69qZ6rBXzY5xiF+rweWBAXpF26637y2vqiylj34olIqBSJaSVFb4lwtzCWu2SUwwzEhLTGCVrQ2XFNSKMh+fULLzYZLQIdfnGntbPYm48ut5C5oTqwhWhuq1IeyJXUe4uKyv8tzO/3zgvhzE6c19kN+xATEVbyR5jJwP9TxH/uxoMFmuzpm71S0+rrTvJMMnPgD8KtM5oZeZRRDeJzglsazLKQwtfw8D+9IAC2lBUVNTily7HyxTtjjZPiZXN2DdjYQTwTo5C+1eKMHgRPF5VXvwUh3VbAbaS6OfD9nWCWPF0whgdF6+rDD6QTt7umccchf2f46y6oQNyh1AfFz0biyFivs1emeaE6q/Y07bzV/hwBnE8/jGJF+JcmB2P9ON1wq5CJ3tRDQR+rs2e5klXpJEoHBWc23auAm37Jn1Kt5Ec5WIuvHhehZF/mYwtFOkYxNiJuKdg5vimEb4RbYjxg8PQV57lT+sqv2Px10g4stw0yRmcA04ecDzAgqjnl/EsaTWNYvDhrury4lkWDT9PjTHFqKm7G+XAxOEoBRINkKGgM1SPhC+uqKmfXF1WtNyLLt4znVOzKKSbbCbqluOKCwEJ+Hlo1XlNzWy6Vl0/WasoesEVVwBmmjbadqLYL4Wi2oOM5QPH9p6wDTA2WEZH1LhM3QAAxnbdbYKS+eNJTlE3aE6PqkJFTd0NJmFPo/NHhZefyqMTXoKz2J7TfvGL2HYhP/mcOHz6tLd15+9B70JbGiUfBVTl26FZhe9bcOVbo57DaLzdivMnOvs1XHsTYc4wFxjAs2mtGAj2qkf2jQmGUKjuBNqmvwyCEF7+LtAMot63Q9tNyW5r1NQvwKCU3D4LcwozzSe0mkVnJqrR8uXLVQw+D2HXQ2lC4eXMzMgQg5jPQZu8ypkkxrNJWywnlXC3FWDomBek0hAbLqWtkNITcd59iaZFT361JctIYg5oNYtPw8e0FJ2fj9CdFyVfQEN5Eb+SWkAU+ivw95XOxI4QIyONL1ofw0eM15f6pS1adPj+8Bd/wOD1HTE3hMv6QDD/21pJ4SciXBszRkeaXbtmpL+x/YuxIl5cOHQXNA9oj8LFFPIbbdKkmDbbxsjjqId99ZuSPShvGaXKfJglQuBDA3iyQSATDeKfC6E5NXVjnHC3OMooAL9m8DQuREH395zH7eXQD93yGMzQ3OAc9s+NWyaD5g1x6ZS+gbrej7rXQtX8DcKbRBzwI2AS8MDD8z2btMW6pBLullNIvm2omUROT6UhFi46wHac7jr2nTm5ayyYfPrngM70O53CCx/T831zDv+fWbN+ZjuCm2sCOjOwN5WcaJWAj/HKytr68xFfbcH8PGtr7zmiZX8bhBcZZcPHh1eg5v+g5PZbvrDBOyJBSu7DaMW1jZjARR1+guT/c8PnMIOaE50zNaqw+yx87gmOadXZNhxK3woU0Iu1oqImC896zqmum2RSwqfb7YIbT5PSa5Dumwfot+9hCn6pOAXnGs/6TVurIJBKYrRBFAPMFdyGp5VOfc+qA39qCxceqbeyarHeqNAOqqg3V5UV/taGy6ettXU/JSZdBPrtWjOmm7pJy4H3YxGXh7NFWz3uiEfIrl0xG5fRSh5C+2KzL9R/q5pv7xP9FCW2qAG/TtLivAl+Oos66+KNToxZBbpXpm7Cp/buV5sSGYZy2juDO0ocFCMK9gfTpbkkOPqdOUEpvOI4lBwAO8j3wPfvi5jg6yq1vOhKp/DiONxYHlCCl4PvbWIejOR2m4WY6BKuqbnrmGaz9c/4kBzCi7zcP/eoi0pK3IUXJ8VPtMAfpn7nIHtxTc2iLzlg0eiSJUty8YH/yJZGyTvVJTPWWrC9zSb+YGW3HaEzPuomvHieqoriBvTmVVZ+/sTXcqkY9wxTckDN7TNGFF4c/+qrrzaqy4vKUHbsA7fomGY4boDHx1+Dtg2wcPhTJer1TuHF4RqlZnXZjPvxXU/ncevCosh13EBvxa1ntmjzlVBtxozPrRucC1tltj+paaVZT3HBQWmszF3gvCGlXkenXGO/yWcgyCVfhm4WU9ftFUbpJhvmhHnFIYCfxwh6+not+LM1Gt3hhSvTEnNAp2aZLZXvFw3QCt7ZbXAhwrUAfGD2o4kY8Z7CCfn58nurqf8FH95pAhjTKbIycNLgy/y4EDCF/lrMC+GjthAWp0VwnM/2G5dBUB4u4iuM3i/G9ZzATjHOw8hzhZdtTQ0ohQpVxls3BP90bfnyoJOOWxwGuV9qM6fw78v9UuhiZwJG/yEiTJu/eDAqebMI4zzUKgpfFmHOcFVF0QP4zt+y4KCrwPhfbsX5M5u0xXLSCXfLKaRJlUGQYt7twceFF/Qn2Buq1mnyZFVvZvlLBUdH4kONIYO/L1XPLlofAyQIsBy1jOrGM2Iyn4aJI6WYZoVDoXuGtJLWPyL+FQvGn/j4Hxpx0gk3cw1EhCcKB0qKXtBruKtB50dNzeg08k5nHmoYEztbGC2sRemjPC7ihWZN3wgXkR3A63ThYOQCY1tTY0XNwjvVXPIM1wbEPB32uU9EmN8wCwRWeOGq/XPf1ptanChDRICpG6ejvjabNqWq7Z2I+GIYWthLeO/iwsAPxPRs0hbLSSfcLQUYZeZhtk5mtax9qvIGjJwvBAOBx9eU0y1Wknx2jQO1tUuOajbCNs0E+tc7fqjyDx54/PZ9YfTJaWNtfCFgsJgJwuueqrKiqXi6dgER1wpzDRErf/ciQ8yHCx/kqVqo/uuif9r8+Q399+v7L4OGZmXFkz2pFRbuFgDtQYrFCsYWiXDY1k6CkLzPaCENEHBr8eG/zFT6onrOqNf4goKIm0pYzdE/9sLnbiMV1XW70abO98PI0WIenNxwshjnYUaMc+E3ONwJj4szZsdh5Ai+GmyZDbJJO64uKQLcBRhju+Fkw+1gsYv/t7Grvz6LEXMJQJOKdSJ03i14WU+jg8BozKBa040IbyjoF1j7tyIaNxS5kJOgFDnQQow4uwdIfJoiGf/osDFBjNiEV0fmY1IRXlaBajB/qR5u1UTblUGiWtg/LJzmyAHYvuy/3AuQwP1WuviEL9ddEIpwiyALRDgPo95c0zkLffQs7EwoMV59azcE2gsQZo+GSoud9jhndnscg7I2o9imzdkRYrG9CHUKMDAploIA6mQXQhzGyGR4vIlovsP72Z6hQI5q39mk7btCCRBdBdj6qjzbyNORN5SARsbBjZXBBhDlt7z+Wxxg5olxRVFq87GKS88CAFrOhPKaugp4xFenQl67/dYdcCJ9Bh/bBCsfBMx1sEMVa1dfHTUMwyXUtvoIGbBJK58e7w7SQQA7Fe6oqF30GjFN7hB6RYfgssjHnh2a0bUQZtdyzYyo6rTq0sLXYggeAeiZvqbJHiSsJNs03AKm+6Q6GYq8lvkgm7TTrWI0n23O3CVKMnOP5oBq0ngjMiMDs96o9tVjm7YPdWIunDHHpVo2dBL7oIepkP7htss5Hb5YACH0XTtNZvchsydGY1wQQRsbm68Gj6WKMhGrC4/CSJdwuxCE3GhimC9V1NY7ynIhnkEQZij/cZID7PN0b7yD2BQ1m7SddU417qqBpUokVXzu58VdJfhqIzfYc5sXnzZ2aF5k5Fz9CiznnoqRbTumltsVEtjcqNkd71ItU+In4UAA/HVYcUyFHZ8kV5eSMQcKM0W5Dgb3o/GufxUjFvWjYo9qNXedq5VNXxeDJwnMLS36E7zJP4AQ+ZqFSg3zJwivbIM2BnjngE1pJI+qD1t4yZ6lpVP5yuSyjpuUL7hrmBI2zof/11j01YtAO/YtoS0FOEb8t9q8+jO0kqIPk9HORDo0uQ2og+3KpeTMTPw4JZu0bRVOIxJjehp5fWfhG7Ofpvp3sW/tcnTaC6JOqkaHnxeMa5zxeOlP4xEdQbnwMpk5r70AmBCxeXik1vYJbGGrIOhWDWCBv/5Zg5J7SF5872NnVwUX87lv09SpU9sSsYM7RK7btOXridKj8NnTN5OaenznnTYidNwve+bpSNSqF50P59CpIq6aWzDZyzUA/cBUiXKFVlr4Es+H6d83MX28MUaDkT7Y17gKDpRnOVf8YjiOAPoGwwbvBkz5FlpJ4M+l0QUKMzzRgvEn+thzZeXT47QWEccrLCxcNFTMrz+VRtgT6MOnxvLw+huMr+YticGyGIAryQYITVsJYUL5O+/yQlc2adsqnEYkqwKMn+dF2sKFOM/+RkihE3j97CzurDHUVBjs2y90hDjbCwySQ5F7Gjr5tCYa3j5iblgbfnLO0hVXw4H1ELpgx/nExkRoK00HdM7bhCP9ug+38JW3KP8TsSq6kldd9y+8n9hqFt7DVVi5mz579qQ9ifJxuEGNa/B+Oqd82LfoJbzaadFWbB6OCi8eVwcNnKJvaxqJep7Zno63zdhQvZU81dDQcJHfo3sKaPChZtoGh84OQYzFghYzUguenWHR5U94p98vxsUwPOurIPi+IcDWYxo5U4jbgnA1eRca2VUkrNu3FTEyBoj/FQGGE0E2OEd0vL/zUT5XDDwv7H3l3+eFFhL6mBEYdMRk67idbNK2ykz32alSp0vBJR8/BnqkFplB2iIfoeNU4Pb8eNpJsNhoyKeNLmRjIHwsx2G0uXfDe+H1+MntlbGEQyFA6cfOZpq6eakTZsW56wDcUOusuNcT+wFt/lB4b4cd0PdN8crD9y/ifdneAQajpB+Nkyb/WPJI7njYmHbZ0hg5b+vOfffYYB6R0tLbdkFztPlVQRDebMsCc4VSOv1FG0yImAppQ55LrBvCcKq2ZEk/ASUuGLh92geoO3fy7rzAiM5IdkMDD1PfhQb6iVgKBqNJ2rxFQ0WYM8x/A4h23gNh92PrRqUHWsKL42eTtrM+fNSyw9ArPS7PRI98rkl8qjhSC9+wi4Q3Yjc831M3wBXRFdhp4+I2L1cUJ5BBWzCNZ07Xwg9O0FjQmdwb41SJF2B446VuHXXevF8OOKDvfwJ94qt+eDEwn9bDQG2fcjBSiSNcrnXLzz3TjQPmUrznL4npqo9RX8S3wuXlt32qUHIdPiDb2j+69M/5zx4svKRPVfm1Fw4835dyjTMRDjY8/0lMA3+Dxt7wAhHmDBu19T+GwO8jwqHFxbYnifBshLkJAfW28whaqG6YjybaVsX3nxrhyPNx9XbsbMgmbScvMF21LZAwSgfxk0GceFY8YyNE+wbs6K/PLrOIp/LEFozvNGqdhw7C5vUxOu5Q3zQofR2+kePWaS6rab6JdB2xYt7C0UzvPK+oqxQxiG+urigeItIpD9W9CaEhTnEw1NNm7AlsQAdYR4nyH/zV5QwYx2/Dx3ecmNcKu9HlaXNCi643mfGIhRd9Rp1K2WPYcvNXbJ5tNKk5wCTKKdgtMQ2d31Y3dKjlOGCRb2S2XfCpauCCyALy+qJdtg/eSoMbRQk07Forzp+gq2Nf3yXYGmMTLiKOGMZhfetRt9NEGA+Djqnm5Jzo3Hco4mmrVwf019ZuQv4TRTg0nD+AwGMqUz/BczfqONCkbAgG6x8Cbyx4bVMI4Df5/aqyGTZNLxU+iGXDkfVTaEiDLRjq8jSmteOtuPWEG8dTqIcNDl5/joHpbrS9Ee9vC2zRg4BzLqzLU9DG/lZe/gTOShwW+CNuTxThPJxN2lZZsGEWwoZZb8WjTxr1/XwbNcJ+Z9KKdn/PSrcx3AKm+uR/zG4m4b+BGWkJLzC3jTup2sulq+zxJDHG8ELCa3hdkmD2+GRoKbOdjUDnLoBKUYiV3QdN0/gdFwDoge3Cix8Dg9MOnHnc4nPLpj+GzvuULY1vrGfkeiy33Ksz800cvPdCtJPFCS/6br+8o39qy5tGBH8xx3E19mko2hLAmVUrqquX+Hq/ELbuWhiEkJfw4tWNHtMToOO4kBWrD032YvD3YZzY8Rfd1Bt1YqzGYtNDqNt43PZvidIn5pYWx2x8Ip1shnOpMhVCyOYSg75xJITsXNT1Gd001uL5LOKz44UXbcT7u8FNePE6Z5O2xRP8guxJyAO7szoONcSAje8bxywx8i0Llz/tTBdTfIZPnxsZEzYifwfhU3xmcUN7w+lhDyamJsA4Vfy9iP+9m2uDboX0FlhVWfHq6JlcfhoEmxJVApdgbN3oCx0jL0a4H6FjTOUDi588HIcLSJYbGOdn83UymvwDUvvl3IgP0VZndOCBYRp+lm9zSUajIKfvYxit7TYpZILbRkLjvUizenZxI3h8U9zHJCIlCKPefwsMGnhjIkGQIFtGwOXlRdvgs3Ya6vCkb4LgN4T1MjU37/te7y+btK26Rt0+KCtB/TEeJ7+6JMBgQL8Uo9JLkI4DkxeVGIPvbXSmclcJfBTbnfCkcQhSaIPLuD0uKW4PRoCn+i2Ydv8QL3qHWzMA1/Hx/SafBk6tLp3+phuOF6yqYsbdAaqcDRpvgFY4ES46/mbY5W4acdLgkSFuyM7QpU2duldVg+NBf79IEtPQU/aHdy/TcJ6VCHeG+cop6v1nGxx/pjrhiALfAyM/ujmfqidCEN3hrIeNbkcEeKv5aRQjhg3+jmgEd8PNJoz7rGEaPwGOt9dAiH/sWRbeL1wRzsV0fiLfzeCJi8Rs0rbKDpXNWIzdDN8GP7nb1KZoX7YSHU+kpXeN1tjwCIm8AQFmm0OnTA3SPy+QM8RtYzZcJf6XrzamTJNnoKQaJ7LOSStvD8rEfcCa9pnDML06BTav4TB68lNKP81T1Bc6nC+73BpuEyKvrxtuMhwyyejJcHDdqRD1Q4UaH5FzRn/YlY3MXa5cAgJ8AaNZb9nKp9YWCj6GhV7uEBae25NrfS2RPcN0heLYGjZEMdkxUFvg6c7+DSG/Pchy/8UXIdzyHmwYX4k+YDafBqdebhOEQZx+jH2bG9Q89n6iM8781jmbtP3UIS0B1uHfxaeNvla3vCqCTvXHdVrwIjecCcuZyl0lUM7JbumeMEx/AoGcYfJXap5c6rWJMAbPhJ3uDrGBAZWcrJXO2CDCZLhnc8BTDXdrGny8ArQtsiITwovThw9RlVs5HBZ1UqVqSaJ0TziWkA09Uu2JIxN7JQf4zgOskN5qaxylr0rhZeNIr4ikLMB2Ub0Y08YLM9F62LieX5/kMML1lYFVWPp9KJ3ysDI0cVRV/NG76dCSeXoOB/65actYjIxDxBqjr90nxmW4d3AgJQF2jsYGYg9Z3BJ+OqzA1NGgSrw7gButk0jOJNgZXndL84TB0Iv/eE7zxJGJvY4DMPTb3zncSPDLNP+rcr2OI723QSkJsP0kUgbtq/NQtS7wBdrRw41zct/1Q2KFRsPcSRWG+c1+8EUcGPku7+0rkmJ7D/Vwxbw6/IXa/ls2DH7LxF+mHeo86k3t9y3ARoUYV8ntdoU0OcHdI/JITlkq2bmHfVANXgAh5ssh06INgXvUSkW3Ob9ZafLZCzlgwH/NcQWIP98vRzYZ7QEc8C3AYBCfi+Xj3C63CT+dVRQ6Np2/B62toB8VkOA5EGK/TakeJrsyJXyJ3CM5wF0n0EcvghtJ7CA/9JVX+O/femSDZKWTcsCXG8Xo+ax/uDWyA50jLynFZAjtf8xelgzNK51PCXFEjwZ/ltv9CFXY21bDVeMCL5oyTXJAcqDnccCXBhZpjUzIhPDC1HEenEu7JLw4izWNmtxJlft5QTjxI349tx3AJvKlnvdqZI0lByQHknHAlwCDABiXjFCydAiaxeNJsDwZXirp3EkVmtUNAYWcCSH2IMrY6Z6ftm9qdk+UUMkByYEeyoGkU0juuLqLRL6ABtY3rTZSrCBScsu6yuADaeVPIROfWkYN9u02rzPbNS8IL8b60b7Bvutm0rjNvSmQl6iSA5ID3YwD2MfpfTUpEfxlJT3hxTUiGFTHN1Z2nvPlXVrXUvnUEhT+2nHHiI28k/UZf4C0rItBZEByQHKgN3AgqQCDRzPfAJryBa3r92ogZ0p32IvINS8pvFJ+hTKD5EC354APAcaGpdQKStdg688saF2rU8onkSUHJAckB1LkQFIBhs3WcGCF33ySCxrXBzColb9TmbMCU8fkGZLQk8mSA5IDkgPJOJBUgOG8o34JpRElO2Djeh4nVz7SWBF4lQsuqiUrUqZLDkgOSA5khgNJBRiEl8n3IEJQ4b+NbCucRzdC03pfITmvvK3R2LYe2uuPDswMwyUVyQHJgcxx4P8BnVoIgZoAA2gAAAAASUVORK5CYII=\",\r\n            \"originWidth\": 304,\r\n            \"originHeight\": 64,\r\n            \"default\": {\r\n                \"width\": 304,\r\n                \"height\": 64,\r\n                \"left\": 598,\r\n                \"top\": 187\r\n            },\r\n            \"crop\": {\r\n                \"width\": 304,\r\n                \"height\": 64,\r\n                \"offsetLeft\": 0,\r\n                \"offsetTop\": 0\r\n            },\r\n            \"isFixedPos\": false,\r\n            \"fixedLeft\": 638,\r\n            \"fixedTop\": 309,\r\n            \"border\": {\r\n                \"width\": 0,\r\n                \"radius\": 0,\r\n                \"style\": \"solid\",\r\n                \"color\": \"#000\"\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n// export default sheetPicture;"
  },
  {
    "path": "src/demoData/sheetPivotTable.js",
    "content": "window.sheetPivotTable = {\r\n\t\"name\": \"PivotTable\",\r\n\t\"color\": \"\",\r\n\t\"config\": {},\r\n\t\"index\": \"7\",\r\n\t\"chart\": [],\r\n\t\"status\": 0,\r\n\t\"order\": \"7\",\r\n\t\"column\": 18,\r\n\t\"row\": 36,\r\n\t\"celldata\": [{\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": \"count:score\"\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": \"science\"\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": \"mathematics\"\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": \"foreign language\"\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": \"English\"\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": \"total\"\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": \"Alex\"\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": 1\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": 1\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": 1\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": 1\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": 4\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": \"Joy\"\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": 1\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": 1\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": 1\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": 1\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": 4\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": \"Tim\"\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": 1\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": 1\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": 1\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": 1\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": 4\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": \"total\"\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": 3\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": 3\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": 3\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": 3\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": 12\r\n\t}],\r\n\t\"ch_width\": 4748,\r\n\t\"rh_height\": 1790,\r\n\t\"luckysheet_select_save\": [{\r\n\t\t\"row\": [0, 0],\r\n\t\t\"column\": [0, 0]\r\n\t}],\r\n\t\"luckysheet_selection_range\": [],\r\n\t\"scrollLeft\": 0,\r\n\t\"scrollTop\": 0,\r\n\t\"isPivotTable\": true,\r\n\t\"pivotTable\": {\r\n\t\t\"pivot_select_save\": {\r\n\t\t\t\"left\": 0,\r\n\t\t\t\"width\": 73,\r\n\t\t\t\"top\": 0,\r\n\t\t\t\"height\": 19,\r\n\t\t\t\"left_move\": 0,\r\n\t\t\t\"width_move\": 369,\r\n\t\t\t\"top_move\": 0,\r\n\t\t\t\"height_move\": 259,\r\n\t\t\t\"row\": [0, 12],\r\n\t\t\t\"column\": [0, 4],\r\n\t\t\t\"row_focus\": 0,\r\n\t\t\t\"column_focus\": 0\r\n\t\t},\r\n\t\t\"pivotDataSheetIndex\": 6, //The sheet index where the source data is located\r\n\t\t\"column\": [{\r\n\t\t\t\"index\": 3,\r\n\t\t\t\"name\": \"subject\",\r\n\t\t\t\"fullname\": \"subject\"\r\n\t\t}],\r\n\t\t\"row\": [{\r\n\t\t\t\"index\": 1,\r\n\t\t\t\"name\": \"student\",\r\n\t\t\t\"fullname\": \"student\"\r\n\t\t}],\r\n\t\t\"filter\": [],\r\n\t\t\"values\": [{\r\n\t\t\t\"index\": 4,\r\n\t\t\t\"name\": \"score\",\r\n\t\t\t\"fullname\": \"count:score\",\r\n\t\t\t\"sumtype\": \"COUNTA\",\r\n\t\t\t\"nameindex\": 0\r\n\t\t}],\r\n\t\t\"showType\": \"column\",\r\n\t\t\"pivotDatas\": [\r\n\t\t\t[\"count:score\", \"science\", \"mathematics\", \"foreign language\", \"English\", \"total\"],\r\n\t\t\t[\"Alex\", 1, 1, 1, 1, 4],\r\n\t\t\t[\"Joy\", 1, 1, 1, 1, 4],\r\n\t\t\t[\"Tim\", 1, 1, 1, 1, 4],\r\n\t\t\t[\"total\", 3, 3, 3, 3, 12]\r\n\t\t],\r\n\t\t\"drawPivotTable\": false,\r\n\t\t\"pivotTableBoundary\": [5, 6]\r\n\t}\r\n}\r\n\r\n// export default sheetPivotTable;"
  },
  {
    "path": "src/demoData/sheetPivotTableData.js",
    "content": "window.sheetPivotTableData = {\r\n\t\"name\": \"PivotTableData\",\r\n\t\"color\": \"\",\r\n\t\"config\": {\r\n\t\t\"merge\": {}\r\n\t},\r\n\t\"index\": \"6\",\r\n\t\"chart\": [],\r\n\t\"status\": 0,\r\n\t\"order\": \"6\",\r\n\t\"hide\": 0,\r\n\t\"column\": 18,\r\n\t\"row\": 36,\r\n\t\"celldata\": [{\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Mock test\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Mock test\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"student\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"student\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"class\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"class\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"subject\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"subject\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"score\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"score\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"first round\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"first round\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Joy\",\r\n\t\t\t\"m\": \"Joy\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Class one\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Class one\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"English\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"English\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 96,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"96\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"first round\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"first round\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Joy\",\r\n\t\t\t\"m\": \"Joy\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Class one\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Class one\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"mathematics\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"mathematics\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 110,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"110\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"first round\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"first round\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Joy\",\r\n\t\t\t\"m\": \"Joy\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Class one\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Class one\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"foreign language\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"foreign language\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 87,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"87\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"first round\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"first round\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Joy\",\r\n\t\t\t\"m\": \"Joy\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Class one\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Class one\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"science\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"science\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 266,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"266\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"first round\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"first round\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Tim\",\r\n\t\t\t\"m\": \"Tim\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Class one\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Class one\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"English\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"English\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 5,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 92,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"92\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"first round\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"first round\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Tim\",\r\n\t\t\t\"m\": \"Tim\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Class one\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Class one\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"mathematics\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"mathematics\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 100,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"100\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"first round\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"first round\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Tim\",\r\n\t\t\t\"m\": \"Tim\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Class one\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Class one\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"foreign language\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"foreign language\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 90,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"90\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"first round\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"first round\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Tim\",\r\n\t\t\t\"m\": \"Tim\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Class one\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Class one\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"science\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"science\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 255,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"255\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"first round\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"first round\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Alex\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Alex\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Class one\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Class one\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"English\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"English\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 108,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"108\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"first round\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"first round\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Alex\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Alex\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Class one\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Class one\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"mathematics\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"mathematics\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 117,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"117\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"first round\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"first round\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Alex\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Alex\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Class one\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Class one\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"foreign language\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"foreign language\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 11,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 88,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"88\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"first round\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"first round\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Alex\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Alex\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Class one\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Class one\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"science\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"science\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 278,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"278\"\r\n\t\t}\r\n\t}],\r\n\t\"ch_width\": 4748,\r\n\t\"rh_height\": 1790,\r\n\t\"luckysheet_select_save\": [{\r\n\t\t\"row\": [0, 0],\r\n\t\t\"column\": [0, 0]\r\n\t}],\r\n\t\"luckysheet_selection_range\": [],\r\n\t\"scrollLeft\": 0,\r\n\t\"scrollTop\": 0\r\n}\r\n\r\n// export default sheetPivotTableData;"
  },
  {
    "path": "src/demoData/sheetSparkline.js",
    "content": "window.sheetSparkline = {\r\n\t\"name\": \"Sparkline\",\r\n\t\"color\": \"\",\r\n\t\"config\": {\r\n\t\t\"merge\": {\r\n\t\t\t\"1_2\": {\r\n\t\t\t\t\"r\": 1,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"1_4\": {\r\n\t\t\t\t\"r\": 1,\r\n\t\t\t\t\"c\": 4,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"0_0\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 0,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 6\r\n\t\t\t},\r\n\t\t\t\"2_2\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 3,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"2_4\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 4,\r\n\t\t\t\t\"rs\": 3,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"6_0\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 0,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"7_2\": {\r\n\t\t\t\t\"r\": 7,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"8_2\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 3,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"12_0\": {\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 0,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"13_2\": {\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3\r\n\t\t\t},\r\n\t\t\t\"14_2\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 4,\r\n\t\t\t\t\"cs\": 3\r\n\t\t\t},\r\n\t\t\t\"19_0\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 0,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"0_9\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"1_12\": {\r\n\t\t\t\t\"r\": 1,\r\n\t\t\t\t\"c\": 12,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"2_12\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 12,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"3_12\": {\r\n\t\t\t\t\"r\": 3,\r\n\t\t\t\t\"c\": 12,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"4_12\": {\r\n\t\t\t\t\"r\": 4,\r\n\t\t\t\t\"c\": 12,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"6_6\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 8\r\n\t\t\t},\r\n\t\t\t\"7_6\": {\r\n\t\t\t\t\"r\": 7,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"7_11\": {\r\n\t\t\t\t\"r\": 7,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3\r\n\t\t\t},\r\n\t\t\t\"8_6\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"9_6\": {\r\n\t\t\t\t\"r\": 9,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"10_6\": {\r\n\t\t\t\t\"r\": 10,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"8_11\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 3,\r\n\t\t\t\t\"cs\": 3\r\n\t\t\t},\r\n\t\t\t\"13_6\": {\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 7\r\n\t\t\t},\r\n\t\t\t\"14_7\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"14_9\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"14_11\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"15_6\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 2,\r\n\t\t\t\t\"cs\": 1\r\n\t\t\t},\r\n\t\t\t\"17_7\": {\r\n\t\t\t\t\"r\": 17,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"17_9\": {\r\n\t\t\t\t\"r\": 17,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"17_11\": {\r\n\t\t\t\t\"r\": 17,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"18_7\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"18_9\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"18_11\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"19_7\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"19_9\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"19_11\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"20_7\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"20_9\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"20_11\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"21_7\": {\r\n\t\t\t\t\"r\": 21,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"21_9\": {\r\n\t\t\t\t\"r\": 21,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"21_11\": {\r\n\t\t\t\t\"r\": 21,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"15_7\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 2,\r\n\t\t\t\t\"cs\": 7\r\n\t\t\t},\r\n\t\t\t\"20_0\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 0,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"21_3\": {\r\n\t\t\t\t\"r\": 21,\r\n\t\t\t\t\"c\": 3,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"22_3\": {\r\n\t\t\t\t\"r\": 22,\r\n\t\t\t\t\"c\": 3,\r\n\t\t\t\t\"rs\": 3,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"27_2\": {\r\n\t\t\t\t\"r\": 27,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3\r\n\t\t\t}\r\n\t\t},\r\n\t\t\"rowlen\": {\r\n\t\t\t\"0\": 29,\r\n\t\t\t\"1\": 20,\r\n\t\t\t\"2\": 20,\r\n\t\t\t\"3\": 20,\r\n\t\t\t\"4\": 20,\r\n\t\t\t\"6\": 29,\r\n\t\t\t\"7\": 20,\r\n\t\t\t\"8\": 20,\r\n\t\t\t\"9\": 20,\r\n\t\t\t\"10\": 20,\r\n\t\t\t\"12\": 29,\r\n\t\t\t\"13\": 29,\r\n\t\t\t\"14\": 20,\r\n\t\t\t\"15\": 20,\r\n\t\t\t\"16\": 26,\r\n\t\t\t\"17\": 20,\r\n\t\t\t\"18\": 20,\r\n\t\t\t\"19\": 29,\r\n\t\t\t\"20\": 29,\r\n\t\t\t\"21\": 20,\r\n\t\t\t\"22\": 20,\r\n\t\t\t\"23\": 20,\r\n\t\t\t\"24\": 20,\r\n\t\t\t\"25\": 20,\r\n\t\t\t\"27\": 100,\r\n\t\t\t\"28\": 20,\r\n\t\t\t\"29\": 20,\r\n\t\t\t\"30\": 20,\r\n\t\t\t\"31\": 20,\r\n\t\t\t\"32\": 20,\r\n\t\t\t\"33\": 20,\r\n\t\t\t\"34\": 26,\r\n\t\t\t\"35\": 20,\r\n\t\t\t\"36\": 20,\r\n\t\t\t\"37\": 20,\r\n\t\t\t\"38\": 20,\r\n\t\t\t\"39\": 20,\r\n\t\t\t\"40\": 20,\r\n\t\t\t\"41\": 20,\r\n\t\t\t\"42\": 20,\r\n\t\t\t\"43\": 20,\r\n\t\t\t\"44\": 20,\r\n\t\t\t\"45\": 20,\r\n\t\t\t\"46\": 20,\r\n\t\t\t\"47\": 20,\r\n\t\t\t\"48\": 20,\r\n\t\t\t\"49\": 20,\r\n\t\t\t\"50\": 20,\r\n\t\t\t\"51\": 20,\r\n\t\t\t\"52\": 20,\r\n\t\t\t\"53\": 20,\r\n\t\t\t\"54\": 20,\r\n\t\t\t\"55\": 20,\r\n\t\t\t\"56\": 20,\r\n\t\t\t\"57\": 20\r\n\t\t},\r\n\t\t\"columnlen\": {\r\n\t\t\t\"0\": 101,\r\n\t\t\t\"2\": 131,\r\n\t\t\t\"3\": 30,\r\n\t\t\t\"4\": 90\r\n\t\t},\r\n\t\t\"borderInfo\": [{\r\n\t\t\t\"rangeType\": \"cell\",\r\n\t\t\t\"value\": {\r\n\t\t\t\t\"row_index\": 7,\r\n\t\t\t\t\"col_index\": 6,\r\n\t\t\t\t\"b\": {\r\n\t\t\t\t\t\"style\": 13,\r\n\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\t\"rangeType\": \"cell\",\r\n\t\t\t\"value\": {\r\n\t\t\t\t\"row_index\": 7,\r\n\t\t\t\t\"col_index\": 7,\r\n\t\t\t\t\"b\": {\r\n\t\t\t\t\t\"style\": 13,\r\n\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\t\"rangeType\": \"cell\",\r\n\t\t\t\"value\": {\r\n\t\t\t\t\"row_index\": 7,\r\n\t\t\t\t\"col_index\": 8,\r\n\t\t\t\t\"b\": {\r\n\t\t\t\t\t\"style\": 13,\r\n\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\t\"rangeType\": \"cell\",\r\n\t\t\t\"value\": {\r\n\t\t\t\t\"row_index\": 7,\r\n\t\t\t\t\"col_index\": 9,\r\n\t\t\t\t\"b\": {\r\n\t\t\t\t\t\"style\": 13,\r\n\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\t\"rangeType\": \"cell\",\r\n\t\t\t\"value\": {\r\n\t\t\t\t\"row_index\": 7,\r\n\t\t\t\t\"col_index\": 10,\r\n\t\t\t\t\"b\": {\r\n\t\t\t\t\t\"style\": 13,\r\n\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\t\"rangeType\": \"cell\",\r\n\t\t\t\"value\": {\r\n\t\t\t\t\"row_index\": 7,\r\n\t\t\t\t\"col_index\": 11,\r\n\t\t\t\t\"b\": {\r\n\t\t\t\t\t\"style\": 13,\r\n\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\t\"rangeType\": \"cell\",\r\n\t\t\t\"value\": {\r\n\t\t\t\t\"row_index\": 7,\r\n\t\t\t\t\"col_index\": 12,\r\n\t\t\t\t\"b\": {\r\n\t\t\t\t\t\"style\": 13,\r\n\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\t\"rangeType\": \"cell\",\r\n\t\t\t\"value\": {\r\n\t\t\t\t\"row_index\": 7,\r\n\t\t\t\t\"col_index\": 13,\r\n\t\t\t\t\"b\": {\r\n\t\t\t\t\t\"style\": 13,\r\n\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}]\r\n\t},\r\n\t\"index\": \"4\",\r\n\t\"chart\": [],\r\n\t\"status\": 0,\r\n\t\"order\": \"4\",\r\n\t\"column\": 18,\r\n\t\"row\": 36,\r\n\t\"celldata\": [{\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"The company revenue in 2014\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"The company revenue in 2014\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 0,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 6\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Mobile Phone Contrast\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Mobile Phone Contrast\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 16,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 9\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 9\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 9\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 9\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Month\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Month\",\r\n\t\t\t\"bg\": \"#f1c232\",\r\n\t\t\t\"fc\": \"#ffffff\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Revenue\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Revenue\",\r\n\t\t\t\"bg\": \"#f1c232\",\r\n\t\t\t\"fc\": \"#ffffff\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Diagram 1\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Diagram 1\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 1,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"bg\": \"#f1c232\",\r\n\t\t\t\"fc\": \"#ffffff\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 1,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"bg\": \"#f1c232\",\r\n\t\t\t\"fc\": \"#ffffff\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Diagram 2\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Diagram 2\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 1,\r\n\t\t\t\t\"c\": 4,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"bg\": \"#f1c232\",\r\n\t\t\t\"fc\": \"#ffffff\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 1,\r\n\t\t\t\t\"c\": 4\r\n\t\t\t},\r\n\t\t\t\"bg\": \"#f1c232\",\r\n\t\t\t\"fc\": \"#ffffff\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Phone I\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Phone I\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Phone II\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Phone II\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Diagram\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Diagram\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 1,\r\n\t\t\t\t\"c\": 12,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 1,\r\n\t\t\t\t\"c\": 12\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"2014-02-01\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"v\": 41671\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 30,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"30\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 3,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"f\": \"=LINESPLINES(B3:B5,'pink',4,'avg','yellow','red','green',3)\",\r\n\t\t\t\"spl\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Shape\",\r\n\t\t\t\t\t\t\"args\": [0, [\r\n\t\t\t\t\t\t\t[0, 21],\r\n\t\t\t\t\t\t\t[0, 21],\r\n\t\t\t\t\t\t\t[80, 54],\r\n\t\t\t\t\t\t\t[159, 3]\r\n\t\t\t\t\t\t], \"pink\", null, 4]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 0, null, 159, null, null, \"yellow\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Circle\",\r\n\t\t\t\t\t\t\"args\": [2, 80, 54, 3, null, \"green\", null]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"3\": {\r\n\t\t\t\t\t\t\"id\": 3,\r\n\t\t\t\t\t\t\"type\": \"Circle\",\r\n\t\t\t\t\t\t\"args\": [3, 159, 3, 3, null, \"red\", null]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2, 3],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 5,\r\n\t\t\t\t\"pixelWidth\": 162,\r\n\t\t\t\t\"pixelHeight\": 58\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 4,\r\n\t\t\t\t\"rs\": 3,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"f\": \"=COLUMNSPLINES(B3:B5,35,'red','green','auto','brown')\",\r\n\t\t\t\"spl\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 108, 1, 18, 29, \"red\", \"red\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 54, 31, 18, 21, \"green\", \"green\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 0, 20, 18, 10, \"brown\", \"brown\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 164,\r\n\t\t\t\t\"pixelHeight\": 63\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 4\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Size(inch)\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Size(inch)\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 5,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"5\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 3.7,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"0.0\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"3.7\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 12,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"f\": \"=STACKBARSPLINES(K3:L3)\",\r\n\t\t\t\"spl\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 0, 10, 107, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 0, 0, 145, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 147,\r\n\t\t\t\t\"pixelHeight\": 21\r\n\t\t\t},\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 12\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"2014-03-01\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"v\": 41699\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -60,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-60\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 4\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 4\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"RAM(G)\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"RAM(G)\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 3,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"3\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 3,\r\n\t\t\t\t\"c\": 12,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"f\": \"=STACKBARSPLINES(K4:L4)\",\r\n\t\t\t\"spl\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 0, 10, 47, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 0, 0, 145, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 147,\r\n\t\t\t\t\"pixelHeight\": 21\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 3,\r\n\t\t\t\t\"c\": 12\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"2014-04-01\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"v\": 41730\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 80,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"80\",\r\n\t\t\t\"ht\": \"0\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 4\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 2,\r\n\t\t\t\t\"c\": 4\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Weight(g)\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Weight(g)\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 149,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"149\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 129,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"129\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 4,\r\n\t\t\t\t\"c\": 12,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"f\": \"=STACKBARSPLINES(K5:L5)\",\r\n\t\t\t\"spl\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 0, 10, 125, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 0, 0, 145, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 147,\r\n\t\t\t\t\"pixelHeight\": 21\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 4,\r\n\t\t\t\t\"c\": 12\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"My Assets\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"My Assets\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": \"14\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 0,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Checkbook Register\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Checkbook Register\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 16,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 8\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 6,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 6,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Asset Type\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Asset Type\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Amount\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Amount\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Diagram\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Diagram\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 7,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 7,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Note\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Note\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": \"10\",\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": \"0\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 7,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 7,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"InitialValue\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"InitialValue\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 815.25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"0.00\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"815.25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Σ\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Σ\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 7,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 7,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 7,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 7,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Savings\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Savings\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25000,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"\\\"$\\\" #\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"$ 25000\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 3,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"f\": \"=PIESPLINES(B9:B11)\",\r\n\t\t\t\"spl\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"PieSlice\",\r\n\t\t\t\t\t\t\"args\": [0, 31, 31, 31, 5.291103416572283, 6.283185307179586, null, \"#5ab1ef\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"PieSlice\",\r\n\t\t\t\t\t\t\"args\": [1, 31, 31, 31, 1.6534698176788385, 5.291103416572283, null, \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"PieSlice\",\r\n\t\t\t\t\t\t\"args\": [2, 31, 31, 31, 0, 1.6534698176788385, null, \"#2ec7c9\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 162,\r\n\t\t\t\t\"pixelHeight\": 63\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0.2631578947368421,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0.263157895\",\r\n\t\t\t\"bg\": \"rgb(145, 159, 129)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"f\": \"=B9/SUM(B9:B11)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"12/11/2012\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"12/11/2012\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"CVS\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"CVS\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -200,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"0.00\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-200.00\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 615.25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"0.00\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"615.25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"f\": \"=BARSPLINES(J9:J11)\",\r\n\t\t\t\"spl\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 56, 42, 53, 19, \"#97b552\", \"#97b552\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 110, 21, 108, 19, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 89, 0, 20, 19, \"#97b552\", \"#97b552\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 221,\r\n\t\t\t\t\"pixelHeight\": 63\r\n\t\t\t},\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 3,\r\n\t\t\t\t\"cs\": 3\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"401k\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"401k\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 55000,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"\\\"$\\\" #\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"$ 55000\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0.5789473684210527,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0.578947368\",\r\n\t\t\t\"bg\": \"rgb(215, 145, 62)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"f\": \"=B10/SUM(B9:B11)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"12/12/2012\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"12/12/2012\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 9,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 9,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Bank\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Bank\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1000.12,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"#,##0.00\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1,000.12\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1615.37,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"#,##0.00\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1,615.37\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Stocks\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Stocks\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 15000,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"\\\"$\\\" #\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"$ 15000\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0.15789473684210525,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0.157894737\",\r\n\t\t\t\"bg\": \"rgb(206, 167, 34)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"f\": \"=B11/SUM(B9:B11)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"12/13/2012\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"12/13/2012\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 10,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 10,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Starbucks\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Starbucks\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -500.43,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"0.00\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"-500.43\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 1114.94,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"#,##0.00\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"1,114.94\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Sales by State\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Sales by State\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": \"14\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 0,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 12,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 12,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"State\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"State\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Sales\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Sales\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Diagram\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Diagram\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": \"1\",\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"ht\": \"1\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t},\r\n\t\t\t\"ht\": \"1\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Student Grade Statistics\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Student Grade Statistics\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 16,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 13,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 13,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Idaho\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Idaho\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 3500,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"\\\"$\\\" #\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"$ 3500\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 4,\r\n\t\t\t\t\"cs\": 3\r\n\t\t\t},\r\n\t\t\t\"f\": \"=AREASPLINES(B15:B18)\",\r\n\t\t\t\"spl\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Shape\",\r\n\t\t\t\t\t\t\"args\": [0, [\r\n\t\t\t\t\t\t\t[0, 87],\r\n\t\t\t\t\t\t\t[0, 61],\r\n\t\t\t\t\t\t\t[84, 0],\r\n\t\t\t\t\t\t\t[169, 87],\r\n\t\t\t\t\t\t\t[253, 35],\r\n\t\t\t\t\t\t\t[253, 87]\r\n\t\t\t\t\t\t], \"#CCF3F4\", \"#CCF3F4\", null]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Shape\",\r\n\t\t\t\t\t\t\"args\": [1, [\r\n\t\t\t\t\t\t\t[0, 61],\r\n\t\t\t\t\t\t\t[0, 61],\r\n\t\t\t\t\t\t\t[84, 0],\r\n\t\t\t\t\t\t\t[169, 87],\r\n\t\t\t\t\t\t\t[253, 35]\r\n\t\t\t\t\t\t], \"#2ec7c9\", null, 1]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 2,\r\n\t\t\t\t\"pixelWidth\": 253,\r\n\t\t\t\t\"pixelHeight\": 88\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Name\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Name\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Chinese\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Chinese\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Math\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Math\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 9\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"English\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"English\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Total\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Total\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Montana\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Montana\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 7000,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"\\\"$\\\" #\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"$ 7000\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 6,\r\n\t\t\t\t\"rs\": 2,\r\n\t\t\t\t\"cs\": 1\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"f\": \"=TRISTATESPLINES(H18:N22,10)\",\r\n\t\t\t\"spl\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 476, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 462, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 448, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"3\": {\r\n\t\t\t\t\t\t\"id\": 3,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [3, 434, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"4\": {\r\n\t\t\t\t\t\t\"id\": 4,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [4, 420, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"5\": {\r\n\t\t\t\t\t\t\"id\": 5,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [5, 406, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"6\": {\r\n\t\t\t\t\t\t\"id\": 6,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [6, 392, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"7\": {\r\n\t\t\t\t\t\t\"id\": 7,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [7, 378, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"8\": {\r\n\t\t\t\t\t\t\"id\": 8,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [8, 364, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"9\": {\r\n\t\t\t\t\t\t\"id\": 9,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [9, 350, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"10\": {\r\n\t\t\t\t\t\t\"id\": 10,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [10, 336, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"11\": {\r\n\t\t\t\t\t\t\"id\": 11,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [11, 322, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"12\": {\r\n\t\t\t\t\t\t\"id\": 12,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [12, 308, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"13\": {\r\n\t\t\t\t\t\t\"id\": 13,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [13, 294, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"14\": {\r\n\t\t\t\t\t\t\"id\": 14,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [14, 280, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"15\": {\r\n\t\t\t\t\t\t\"id\": 15,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [15, 266, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"16\": {\r\n\t\t\t\t\t\t\"id\": 16,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [16, 252, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"17\": {\r\n\t\t\t\t\t\t\"id\": 17,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [17, 238, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"18\": {\r\n\t\t\t\t\t\t\"id\": 18,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [18, 224, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"19\": {\r\n\t\t\t\t\t\t\"id\": 19,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [19, 210, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"20\": {\r\n\t\t\t\t\t\t\"id\": 20,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [20, 196, 24, 3, 22, \"#97b552\", \"#97b552\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"21\": {\r\n\t\t\t\t\t\t\"id\": 21,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [21, 182, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"22\": {\r\n\t\t\t\t\t\t\"id\": 22,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [22, 168, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"23\": {\r\n\t\t\t\t\t\t\"id\": 23,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [23, 154, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"24\": {\r\n\t\t\t\t\t\t\"id\": 24,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [24, 140, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"25\": {\r\n\t\t\t\t\t\t\"id\": 25,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [25, 126, 24, 3, 22, \"#97b552\", \"#97b552\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"26\": {\r\n\t\t\t\t\t\t\"id\": 26,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [26, 112, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"27\": {\r\n\t\t\t\t\t\t\"id\": 27,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [27, 98, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"28\": {\r\n\t\t\t\t\t\t\"id\": 28,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [28, 84, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"29\": {\r\n\t\t\t\t\t\t\"id\": 29,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [29, 70, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"30\": {\r\n\t\t\t\t\t\t\"id\": 30,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [30, 56, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"31\": {\r\n\t\t\t\t\t\t\"id\": 31,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [31, 42, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"32\": {\r\n\t\t\t\t\t\t\"id\": 32,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [32, 28, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"33\": {\r\n\t\t\t\t\t\t\"id\": 33,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [33, 14, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"34\": {\r\n\t\t\t\t\t\t\"id\": 34,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [34, 0, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 517,\r\n\t\t\t\t\"pixelHeight\": 48\r\n\t\t\t},\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 2,\r\n\t\t\t\t\"cs\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Oregon\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Oregon\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 2000,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"\\\"$\\\" #\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"$ 2000\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 6\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 15,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Washington\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Washington\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 5000,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"\\\"$\\\" #\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"$ 5000\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 14,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Student 1\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Student 1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 70,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"70\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 17,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 17,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 90,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"90\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 17,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 17,\r\n\t\t\t\t\"c\": 9\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 51,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"51\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 17,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 17,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 211,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"211\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Student 2\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Student 2\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 99,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"99\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -59,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"m\": \"-59\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 9\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 63,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"63\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 18,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 221,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"221\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": \"14\",\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 0,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t},\r\n\t\t\t\"fs\": \"14\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Student 3\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Student 3\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": -90,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"m\": \"-90\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 128,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"128\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 9\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 74,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"74\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 19,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 291,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"291\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Employee KPI\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Employee KPI\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 9,\r\n\t\t\t\"fs\": 16,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 0,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 0\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Student 4\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Student 4\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 93,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"93\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 61,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"61\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 9\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 53,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"53\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 20,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 207,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"207\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Name\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Name\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Forecast\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Forecast\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Actuality\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Actuality\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Diagram\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Diagram\",\r\n\t\t\t\"bg\": \"rgb(255, 192, 0)\",\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(255, 255, 255)\",\r\n\t\t\t\"ht\": 0,\r\n\t\t\t\"vt\": 0,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 21,\r\n\t\t\t\t\"c\": 3,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 21,\r\n\t\t\t\t\"c\": 3\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 6,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Student 5\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Student 5\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 106,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"106\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 21,\r\n\t\t\t\t\"c\": 7,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 21,\r\n\t\t\t\t\"c\": 7\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 82,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"82\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 21,\r\n\t\t\t\t\"c\": 9,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 21,\r\n\t\t\t\t\"c\": 9\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 80,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"80\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 21,\r\n\t\t\t\t\"c\": 11,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 21,\r\n\t\t\t\t\"c\": 11\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 13,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 268,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"268\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Employee 1\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Employee 1\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 6,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"6\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 2,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 22,\r\n\t\t\t\t\"c\": 3,\r\n\t\t\t\t\"rs\": 3,\r\n\t\t\t\t\"cs\": 2\r\n\t\t\t},\r\n\t\t\t\"f\": \"=STACKCOLUMNSPLINES(B23:C25)\",\r\n\t\t\t\"spl\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 60, 57, 58, 5, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 60, 36, 58, 20, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 60, 27, 58, 8, \"#5ab1ef\", \"#5ab1ef\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"3\": {\r\n\t\t\t\t\t\t\"id\": 3,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [3, 0, 45, 58, 17, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"4\": {\r\n\t\t\t\t\t\t\"id\": 4,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [4, 0, 21, 58, 23, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"5\": {\r\n\t\t\t\t\t\t\"id\": 5,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [5, 0, 3, 58, 17, \"#5ab1ef\", \"#5ab1ef\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2, 3, 4, 5],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 121,\r\n\t\t\t\t\"pixelHeight\": 63\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 22,\r\n\t\t\t\t\"c\": 3\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Employee 2\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Employee 2\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 8,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"8\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 7,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"7\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 22,\r\n\t\t\t\t\"c\": 3\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 22,\r\n\t\t\t\t\"c\": 3\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 23,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Employee 3\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Employee 3\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 6,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"6\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 3,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"3\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 22,\r\n\t\t\t\t\"c\": 3\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 24,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 22,\r\n\t\t\t\t\"c\": 3\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 25,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": null,\r\n\t\t\t\"m\": \"\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42370,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-01\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 12,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"12\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"f\": \"=DISCRETESPLINES(B28:B58,30)\",\r\n\t\t\t\"spl\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 240, 14, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 232, 55, 6, 30, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 224, 57, 6, 30, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"3\": {\r\n\t\t\t\t\t\t\"id\": 3,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [3, 216, 49, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"4\": {\r\n\t\t\t\t\t\t\"id\": 4,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [4, 208, 68, 6, 30, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"5\": {\r\n\t\t\t\t\t\t\"id\": 5,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [5, 200, 71, 6, 30, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"6\": {\r\n\t\t\t\t\t\t\"id\": 6,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [6, 192, 45, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"7\": {\r\n\t\t\t\t\t\t\"id\": 7,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [7, 184, 64, 6, 30, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"8\": {\r\n\t\t\t\t\t\t\"id\": 8,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [8, 176, 30, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"9\": {\r\n\t\t\t\t\t\t\"id\": 9,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [9, 168, 32, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"10\": {\r\n\t\t\t\t\t\t\"id\": 10,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [10, 160, 14, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"11\": {\r\n\t\t\t\t\t\t\"id\": 11,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [11, 152, 12, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"12\": {\r\n\t\t\t\t\t\t\"id\": 12,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [12, 144, 0, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"13\": {\r\n\t\t\t\t\t\t\"id\": 13,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [13, 136, 65, 6, 30, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"14\": {\r\n\t\t\t\t\t\t\"id\": 14,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [14, 128, 7, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"15\": {\r\n\t\t\t\t\t\t\"id\": 15,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [15, 120, 9, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"16\": {\r\n\t\t\t\t\t\t\"id\": 16,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [16, 112, 54, 6, 30, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"17\": {\r\n\t\t\t\t\t\t\"id\": 17,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [17, 104, 3, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"18\": {\r\n\t\t\t\t\t\t\"id\": 18,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [18, 96, 33, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"19\": {\r\n\t\t\t\t\t\t\"id\": 19,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [19, 88, 1, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"20\": {\r\n\t\t\t\t\t\t\"id\": 20,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [20, 80, 53, 6, 30, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"21\": {\r\n\t\t\t\t\t\t\"id\": 21,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [21, 72, 7, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"22\": {\r\n\t\t\t\t\t\t\"id\": 22,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [22, 64, 25, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"23\": {\r\n\t\t\t\t\t\t\"id\": 23,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [23, 56, 8, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"24\": {\r\n\t\t\t\t\t\t\"id\": 24,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [24, 48, 59, 6, 30, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"25\": {\r\n\t\t\t\t\t\t\"id\": 25,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [25, 40, 22, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"26\": {\r\n\t\t\t\t\t\t\"id\": 26,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [26, 32, 46, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"27\": {\r\n\t\t\t\t\t\t\"id\": 27,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [27, 24, 60, 6, 30, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"28\": {\r\n\t\t\t\t\t\t\"id\": 28,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [28, 16, 32, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"29\": {\r\n\t\t\t\t\t\t\"id\": 29,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [29, 8, 25, 6, 30, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"30\": {\r\n\t\t\t\t\t\t\"id\": 30,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [30, 0, 62, 6, 30, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 253,\r\n\t\t\t\t\"pixelHeight\": 101\r\n\t\t\t},\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 27,\r\n\t\t\t\t\"c\": 2,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 3\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 27,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 27,\r\n\t\t\t\t\"c\": 2\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42371,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-02\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 28,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 64,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"64\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42372,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-03\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 29,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 54,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"54\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42373,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-04\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 30,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 15,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"15\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42374,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-05\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 35,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"35\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 31,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42375,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-06\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 67,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"67\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"f\": \"=BARSPLINES(B22:B25)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42376,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-07\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 16,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"16\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"f\": \"=STACKBARSPLINES(B22:B25)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42377,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-08\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 87,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"87\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"f\": \"=DISCRETESPLINES(B22:B25)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 7,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42378,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-09\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 64,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"64\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"f\": \"=TRISTATESPLINES(B22:B25)\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42379,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-10\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 88,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"88\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 36,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"e\"\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 37,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42380,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-11\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 37,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 25,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"25\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42381,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-12\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 38,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 96,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"96\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 39,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42382,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-13\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 39,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 53,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"53\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 40,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42383,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-14\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 40,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 94,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"94\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 41,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42384,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-15\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 41,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 23,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"23\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 42,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42385,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-16\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 42,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 85,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"85\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 43,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42386,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-17\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 43,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 89,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"89\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 44,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42387,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-18\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 44,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 8,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"8\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 45,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42388,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-19\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 45,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 98,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"98\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 46,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42389,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-20\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 46,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 82,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"82\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 47,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42390,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-21\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 47,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 79,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"79\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 48,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42391,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-22\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 48,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 54,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"54\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 49,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42392,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-23\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 49,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 56,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"56\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 50,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42393,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-24\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 50,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 10,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"10\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 51,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42394,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-25\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 51,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 36,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"36\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 52,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42395,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-26\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 52,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 0,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"0\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 53,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42396,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-27\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 53,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 4,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"4\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 54,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42397,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-28\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 54,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 31,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"31\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 55,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42398,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-29\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 55,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 19,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"19\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 56,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42399,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-30\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 56,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 22,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"22\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 57,\r\n\t\t\"c\": 0,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 42400,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"yyyy-MM-dd\",\r\n\t\t\t\t\"t\": \"d\"\r\n\t\t\t},\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1,\r\n\t\t\t\"m\": \"2016-01-31\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 57,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 78,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"78\",\r\n\t\t\t\"bg\": null,\r\n\t\t\t\"bl\": 0,\r\n\t\t\t\"it\": 0,\r\n\t\t\t\"ff\": 0,\r\n\t\t\t\"fs\": 11,\r\n\t\t\t\"fc\": \"rgb(51, 51, 51)\",\r\n\t\t\t\"ht\": 1,\r\n\t\t\t\"vt\": 1\r\n\t\t}\r\n\t}],\r\n\t\"ch_width\": 1524,\r\n\t\"rh_height\": 1571,\r\n\t\"luckysheet_select_save\": [{\r\n\t\t\"left\": 504,\r\n\t\t\"width\": 73,\r\n\t\t\"top\": 746,\r\n\t\t\"height\": 20,\r\n\t\t\"left_move\": 504,\r\n\t\t\"width_move\": 73,\r\n\t\t\"top_move\": 746,\r\n\t\t\"height_move\": 20,\r\n\t\t\"row\": [29, 29],\r\n\t\t\"column\": [6, 6],\r\n\t\t\"row_focus\": 29,\r\n\t\t\"column_focus\": 6\r\n\t}],\r\n\t\"luckysheet_selection_range\": [],\r\n\t\"scrollLeft\": 0,\r\n\t\"scrollTop\": 562,\r\n\t\"calcChain\": [{\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 2,\r\n\t\t\"index\": \"4\",\r\n\t\t\"func\": [true, \"\", \"=LINESPLINES(B3:B5,'pink',4,'avg','yellow','red','green',3)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Shape\",\r\n\t\t\t\t\t\t\"args\": [0, [\r\n\t\t\t\t\t\t\t[0, 21],\r\n\t\t\t\t\t\t\t[0, 21],\r\n\t\t\t\t\t\t\t[80, 54],\r\n\t\t\t\t\t\t\t[159, 3]\r\n\t\t\t\t\t\t], \"pink\", null, 4]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 0, null, 159, null, null, \"yellow\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Circle\",\r\n\t\t\t\t\t\t\"args\": [2, 80, 54, 3, null, \"green\", null]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"3\": {\r\n\t\t\t\t\t\t\"id\": 3,\r\n\t\t\t\t\t\t\"type\": \"Circle\",\r\n\t\t\t\t\t\t\"args\": [3, 159, 3, 3, null, \"red\", null]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2, 3],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 5,\r\n\t\t\t\t\"pixelWidth\": 162,\r\n\t\t\t\t\"pixelHeight\": 58\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 4,\r\n\t\t\"index\": \"4\",\r\n\t\t\"func\": [true, \"\", \"=COLUMNSPLINES(B3:B5,35,'red','green','auto','brown')\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 108, 1, 18, 29, \"red\", \"red\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 54, 31, 18, 21, \"green\", \"green\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 0, 20, 18, 10, \"brown\", \"brown\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 164,\r\n\t\t\t\t\"pixelHeight\": 63\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 4,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, 0.2631578947368421, \"=B9/SUM(B9:B11)\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 4,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, 0.5789473684210527, \"=B10/SUM(B9:B11)\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 10,\r\n\t\t\"c\": 4,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, 0.15789473684210525, \"=B11/SUM(B9:B11)\"],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 2,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, \"\", \"=PIESPLINES(B9:B11)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"PieSlice\",\r\n\t\t\t\t\t\t\"args\": [0, 31, 31, 31, 5.291103416572283, 6.283185307179586, null, \"#5ab1ef\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"PieSlice\",\r\n\t\t\t\t\t\t\"args\": [1, 31, 31, 31, 1.6534698176788385, 5.291103416572283, null, \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"PieSlice\",\r\n\t\t\t\t\t\t\"args\": [2, 31, 31, 31, 0, 1.6534698176788385, null, \"#2ec7c9\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 162,\r\n\t\t\t\t\"pixelHeight\": 63\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 14,\r\n\t\t\"c\": 2,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, \"\", \"=AREASPLINES(B15:B18)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Shape\",\r\n\t\t\t\t\t\t\"args\": [0, [\r\n\t\t\t\t\t\t\t[0, 87],\r\n\t\t\t\t\t\t\t[0, 61],\r\n\t\t\t\t\t\t\t[84, 0],\r\n\t\t\t\t\t\t\t[169, 87],\r\n\t\t\t\t\t\t\t[253, 35],\r\n\t\t\t\t\t\t\t[253, 87]\r\n\t\t\t\t\t\t], \"#CCF3F4\", \"#CCF3F4\", null]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Shape\",\r\n\t\t\t\t\t\t\"args\": [1, [\r\n\t\t\t\t\t\t\t[0, 61],\r\n\t\t\t\t\t\t\t[0, 61],\r\n\t\t\t\t\t\t\t[84, 0],\r\n\t\t\t\t\t\t\t[169, 87],\r\n\t\t\t\t\t\t\t[253, 35]\r\n\t\t\t\t\t\t], \"#2ec7c9\", null, 1]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 2,\r\n\t\t\t\t\"pixelWidth\": 253,\r\n\t\t\t\t\"pixelHeight\": 88\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 32,\r\n\t\t\"c\": 2,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, \"\", \"=BARSPLINES(B22:B25)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 0, 15, 129, 3, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 0, 10, 129, 3, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 0, 5, 129, 3, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"3\": {\r\n\t\t\t\t\t\t\"id\": 3,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [3, 0, 0, 129, 3, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2, 3],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 131,\r\n\t\t\t\t\"pixelHeight\": 20\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 33,\r\n\t\t\"c\": 2,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, \"\", \"=STACKBARSPLINES(B22:B25)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 0, 0, 129, 18, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 130, 0, 129, 18, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 260, 0, 129, 18, \"#5ab1ef\", \"#5ab1ef\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"3\": {\r\n\t\t\t\t\t\t\"id\": 3,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [3, 390, 0, 129, 18, \"#ffb980\", \"#ffb980\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2, 3],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 131,\r\n\t\t\t\t\"pixelHeight\": 20\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 34,\r\n\t\t\"c\": 2,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, \"\", \"=DISCRETESPLINES(B22:B25)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 96, null, 30, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 64, null, 30, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 32, null, 30, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"3\": {\r\n\t\t\t\t\t\t\"id\": 3,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [3, 0, null, 30, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2, 3],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 131,\r\n\t\t\t\t\"pixelHeight\": 20\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 35,\r\n\t\t\"c\": 2,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, \"\", \"=TRISTATESPLINES(B22:B25)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 15, 0, 3, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 10, 0, 3, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 5, 0, 3, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"3\": {\r\n\t\t\t\t\t\t\"id\": 3,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [3, 0, 9, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2, 3],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 131,\r\n\t\t\t\t\"pixelHeight\": 20\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 2,\r\n\t\t\"c\": 12,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, \"\", \"=STACKBARSPLINES(K3:L3)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 0, 10, 107, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 0, 0, 145, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 147,\r\n\t\t\t\t\"pixelHeight\": 21\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 27,\r\n\t\t\"c\": 2,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, \"\", \"=DISCRETESPLINES(B28:B58,30)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 120, 3, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 116, 10, 2, 6, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 112, 10, 2, 6, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"3\": {\r\n\t\t\t\t\t\t\"id\": 3,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [3, 108, 9, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"4\": {\r\n\t\t\t\t\t\t\"id\": 4,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [4, 104, 12, 2, 6, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"5\": {\r\n\t\t\t\t\t\t\"id\": 5,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [5, 100, 13, 2, 6, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"6\": {\r\n\t\t\t\t\t\t\"id\": 6,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [6, 96, 8, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"7\": {\r\n\t\t\t\t\t\t\"id\": 7,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [7, 92, 12, 2, 6, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"8\": {\r\n\t\t\t\t\t\t\"id\": 8,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [8, 88, 6, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"9\": {\r\n\t\t\t\t\t\t\"id\": 9,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [9, 84, 6, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"10\": {\r\n\t\t\t\t\t\t\"id\": 10,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [10, 80, 3, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"11\": {\r\n\t\t\t\t\t\t\"id\": 11,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [11, 76, 2, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"12\": {\r\n\t\t\t\t\t\t\"id\": 12,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [12, 72, 0, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"13\": {\r\n\t\t\t\t\t\t\"id\": 13,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [13, 68, 12, 2, 6, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"14\": {\r\n\t\t\t\t\t\t\"id\": 14,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [14, 64, 1, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"15\": {\r\n\t\t\t\t\t\t\"id\": 15,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [15, 60, 2, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"16\": {\r\n\t\t\t\t\t\t\"id\": 16,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [16, 56, 10, 2, 6, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"17\": {\r\n\t\t\t\t\t\t\"id\": 17,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [17, 52, 1, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"18\": {\r\n\t\t\t\t\t\t\"id\": 18,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [18, 48, 6, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"19\": {\r\n\t\t\t\t\t\t\"id\": 19,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [19, 44, 0, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"20\": {\r\n\t\t\t\t\t\t\"id\": 20,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [20, 40, 10, 2, 6, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"21\": {\r\n\t\t\t\t\t\t\"id\": 21,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [21, 36, 1, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"22\": {\r\n\t\t\t\t\t\t\"id\": 22,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [22, 32, 5, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"23\": {\r\n\t\t\t\t\t\t\"id\": 23,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [23, 28, 1, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"24\": {\r\n\t\t\t\t\t\t\"id\": 24,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [24, 24, 11, 2, 6, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"25\": {\r\n\t\t\t\t\t\t\"id\": 25,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [25, 20, 4, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"26\": {\r\n\t\t\t\t\t\t\"id\": 26,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [26, 16, 8, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"27\": {\r\n\t\t\t\t\t\t\"id\": 27,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [27, 12, 11, 2, 6, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"28\": {\r\n\t\t\t\t\t\t\"id\": 28,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [28, 8, 6, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"29\": {\r\n\t\t\t\t\t\t\"id\": 29,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [29, 4, 5, 2, 6, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"30\": {\r\n\t\t\t\t\t\t\"id\": 30,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [30, 0, 11, 2, 6, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 131,\r\n\t\t\t\t\"pixelHeight\": 19\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 3,\r\n\t\t\"c\": 12,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, \"\", \"=STACKBARSPLINES(K4:L4)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 0, 10, 47, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 0, 0, 145, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 147,\r\n\t\t\t\t\"pixelHeight\": 21\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 4,\r\n\t\t\"c\": 12,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, \"\", \"=STACKBARSPLINES(K5:L5)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 0, 10, 125, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 0, 0, 145, 8, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 147,\r\n\t\t\t\t\"pixelHeight\": 21\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 11,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, \"\", \"=BARSPLINES(J9:J11)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 56, 42, 53, 19, \"#97b552\", \"#97b552\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 110, 21, 108, 19, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 89, 0, 20, 19, \"#97b552\", \"#97b552\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 221,\r\n\t\t\t\t\"pixelHeight\": 63\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 15,\r\n\t\t\"c\": 7,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, \"\", \"=TRISTATESPLINES(H18:N22,10)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 476, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 462, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 448, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"3\": {\r\n\t\t\t\t\t\t\"id\": 3,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [3, 434, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"4\": {\r\n\t\t\t\t\t\t\"id\": 4,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [4, 420, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"5\": {\r\n\t\t\t\t\t\t\"id\": 5,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [5, 406, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"6\": {\r\n\t\t\t\t\t\t\"id\": 6,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [6, 392, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"7\": {\r\n\t\t\t\t\t\t\"id\": 7,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [7, 378, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"8\": {\r\n\t\t\t\t\t\t\"id\": 8,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [8, 364, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"9\": {\r\n\t\t\t\t\t\t\"id\": 9,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [9, 350, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"10\": {\r\n\t\t\t\t\t\t\"id\": 10,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [10, 336, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"11\": {\r\n\t\t\t\t\t\t\"id\": 11,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [11, 322, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"12\": {\r\n\t\t\t\t\t\t\"id\": 12,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [12, 308, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"13\": {\r\n\t\t\t\t\t\t\"id\": 13,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [13, 294, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"14\": {\r\n\t\t\t\t\t\t\"id\": 14,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [14, 280, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"15\": {\r\n\t\t\t\t\t\t\"id\": 15,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [15, 266, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"16\": {\r\n\t\t\t\t\t\t\"id\": 16,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [16, 252, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"17\": {\r\n\t\t\t\t\t\t\"id\": 17,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [17, 238, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"18\": {\r\n\t\t\t\t\t\t\"id\": 18,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [18, 224, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"19\": {\r\n\t\t\t\t\t\t\"id\": 19,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [19, 210, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"20\": {\r\n\t\t\t\t\t\t\"id\": 20,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [20, 196, 24, 3, 22, \"#97b552\", \"#97b552\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"21\": {\r\n\t\t\t\t\t\t\"id\": 21,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [21, 182, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"22\": {\r\n\t\t\t\t\t\t\"id\": 22,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [22, 168, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"23\": {\r\n\t\t\t\t\t\t\"id\": 23,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [23, 154, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"24\": {\r\n\t\t\t\t\t\t\"id\": 24,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [24, 140, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"25\": {\r\n\t\t\t\t\t\t\"id\": 25,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [25, 126, 24, 3, 22, \"#97b552\", \"#97b552\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"26\": {\r\n\t\t\t\t\t\t\"id\": 26,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [26, 112, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"27\": {\r\n\t\t\t\t\t\t\"id\": 27,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [27, 98, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"28\": {\r\n\t\t\t\t\t\t\"id\": 28,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [28, 84, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"29\": {\r\n\t\t\t\t\t\t\"id\": 29,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [29, 70, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"30\": {\r\n\t\t\t\t\t\t\"id\": 30,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [30, 56, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"31\": {\r\n\t\t\t\t\t\t\"id\": 31,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [31, 42, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"32\": {\r\n\t\t\t\t\t\t\"id\": 32,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [32, 28, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"33\": {\r\n\t\t\t\t\t\t\"id\": 33,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [33, 14, 23, 3, 1, \"#999\", \"#999\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"34\": {\r\n\t\t\t\t\t\t\"id\": 34,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [34, 0, 0, 3, 22, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 517,\r\n\t\t\t\t\"pixelHeight\": 48\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 3,\r\n\t\t\"index\": 4,\r\n\t\t\"func\": [true, \"\", \"=STACKCOLUMNSPLINES(B23:C25)\", {\r\n\t\t\t\"type\": \"sparklines\",\r\n\t\t\t\"data\": {\r\n\t\t\t\t\"shapes\": {\r\n\t\t\t\t\t\"0\": {\r\n\t\t\t\t\t\t\"id\": 0,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [0, 60, 57, 58, 5, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"1\": {\r\n\t\t\t\t\t\t\"id\": 1,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [1, 60, 36, 58, 20, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"2\": {\r\n\t\t\t\t\t\t\"id\": 2,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [2, 60, 27, 58, 8, \"#5ab1ef\", \"#5ab1ef\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"3\": {\r\n\t\t\t\t\t\t\"id\": 3,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [3, 0, 45, 58, 17, \"#2ec7c9\", \"#2ec7c9\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"4\": {\r\n\t\t\t\t\t\t\"id\": 4,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [4, 0, 21, 58, 23, \"#fc5c5c\", \"#fc5c5c\"]\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"5\": {\r\n\t\t\t\t\t\t\"id\": 5,\r\n\t\t\t\t\t\t\"type\": \"Rect\",\r\n\t\t\t\t\t\t\"args\": [5, 0, 3, 58, 17, \"#5ab1ef\", \"#5ab1ef\"]\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t\"shapeseq\": [0, 1, 2, 3, 4, 5],\r\n\t\t\t\t\"offsetX\": 0,\r\n\t\t\t\t\"offsetY\": 0,\r\n\t\t\t\t\"pixelWidth\": 121,\r\n\t\t\t\t\"pixelHeight\": 63\r\n\t\t\t}\r\n\t\t}],\r\n\t\t\"color\": \"w\",\r\n\t\t\"parent\": null,\r\n\t\t\"chidren\": {},\r\n\t\t\"times\": 0\r\n\t}],\r\n\t\"luckysheet_conditionformat_save\": [],\r\n\t\"filter_select\": null,\r\n\t\"filter\": null,\r\n\t\"luckysheet_alternateformat_save\": []\r\n}\r\n\r\n// export default sheetSparkline;"
  },
  {
    "path": "src/demoData/sheetTable.js",
    "content": "window.sheetTable = {\r\n\t\"name\": \"Table\",\r\n\t\"color\": \"\",\r\n\t\"config\": {\r\n\t\t\"merge\": {\r\n\t\t\t\"0_1\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 1,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"0_8\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 8,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"8_1\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 1,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"16_1\": {\r\n\t\t\t\t\"r\": 16,\r\n\t\t\t\t\"c\": 1,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"8_8\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 8,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"16_8\": {\r\n\t\t\t\t\"r\": 16,\r\n\t\t\t\t\"c\": 8,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\t\"index\": \"3\",\r\n\t\"chart\": [],\r\n\t\"status\": 0,\r\n\t\"order\": \"3\",\r\n\t\"column\": 18,\r\n\t\"row\": 36,\r\n\t\"celldata\": [{\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Table Style - light3, Filter\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 1,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"m\": \"Table Style - light3, Filter\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 1\r\n\t\t\t},\r\n\t\t\t\"bl\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 1\r\n\t\t\t},\r\n\t\t\t\"bl\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 1\r\n\t\t\t},\r\n\t\t\t\"bl\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 1\r\n\t\t\t},\r\n\t\t\t\"bl\": 1\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 8,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"m\": \"Table Style - light6\",\r\n\t\t\t\"v\": \"Table Style - light6\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 8\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 8\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 8\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 0,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 0,\r\n\t\t\t\t\"c\": 8\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Column1\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Column1\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Column2\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Column2\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Column3\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Column3\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Column4\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Column4\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 1,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Column5\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Column5\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Table Style - medium3,Header\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 1,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"m\": \"Table Style - medium3,Header\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 1\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 1\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 1\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 1\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Table Style - medium8,Footer\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 8,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"m\": \"Table Style - medium8,Footer\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 8\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 8\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 8\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 8,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 8,\r\n\t\t\t\t\"c\": 8\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Column1\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Column1\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Column2\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Column2\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Column3\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Column3\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Column4\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Column4\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 9,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": \"Column5\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"Column5\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Table Style - medium6,Header,Footer\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 16,\r\n\t\t\t\t\"c\": 1,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"m\": \"Table Style - medium6,Header,Footer\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 16,\r\n\t\t\t\t\"c\": 1\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 16,\r\n\t\t\t\t\"c\": 1\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 16,\r\n\t\t\t\t\"c\": 1\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 16,\r\n\t\t\t\t\"c\": 1\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Table Style - medium10,Header,Footer\",\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 16,\r\n\t\t\t\t\"c\": 8,\r\n\t\t\t\t\"rs\": 1,\r\n\t\t\t\t\"cs\": 5\r\n\t\t\t},\r\n\t\t\t\"bl\": 1,\r\n\t\t\t\"m\": \"Table Style - medium10,Header,Footer\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 16,\r\n\t\t\t\t\"c\": 8\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 16,\r\n\t\t\t\t\"c\": 8\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 16,\r\n\t\t\t\t\"c\": 8\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 16,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"mc\": {\r\n\t\t\t\t\"r\": 16,\r\n\t\t\t\t\"c\": 8\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 1,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Column1\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Column1\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 2,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Column2\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Column2\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 3,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Column3\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Column3\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 4,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Column4\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Column4\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 5,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Column5\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Column5\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Name\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Name\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Age\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Age\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Sex\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Sex\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Address\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Address\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 17,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Score\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Score\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"bob\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"bob\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 36,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"36\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"man\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"man\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Beijing\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Beijing\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 18,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 80,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"80\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Betty\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Betty\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 28,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"28\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"woman\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"woman\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Xi'an\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Xi'an\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 19,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 52,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"52\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Gary\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Gary\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 23,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"23\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"man\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"man\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"NewYork\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"NewYork\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 20,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 63,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"63\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Hunk\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Hunk\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 45,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"45\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"man\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"man\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Beijing\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Beijing\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 21,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 80,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"80\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 8,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Cherry\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Cherry\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 9,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 37,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"37\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 10,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"woman\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"woman\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 11,\r\n\t\t\"v\": {\r\n\t\t\t\"m\": \"Shanghai\",\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"g\"\r\n\t\t\t},\r\n\t\t\t\"v\": \"Shanghai\"\r\n\t\t}\r\n\t}, {\r\n\t\t\"r\": 22,\r\n\t\t\"c\": 12,\r\n\t\t\"v\": {\r\n\t\t\t\"v\": 58,\r\n\t\t\t\"ct\": {\r\n\t\t\t\t\"fa\": \"General\",\r\n\t\t\t\t\"t\": \"n\"\r\n\t\t\t},\r\n\t\t\t\"m\": \"58\"\r\n\t\t}\r\n\t}],\r\n\t\"ch_width\": 4748,\r\n\t\"rh_height\": 1790,\r\n\t\"luckysheet_select_save\": [{\r\n\t\t\"row\": [0, 0],\r\n\t\t\"column\": [0, 0]\r\n\t}],\r\n\t\"luckysheet_selection_range\": [],\r\n\t\"scrollLeft\": 0,\r\n\t\"scrollTop\": 0,\r\n\t\"filter_select\": {\r\n\t\t\"left\": 74,\r\n\t\t\"width\": 73,\r\n\t\t\"top\": 20,\r\n\t\t\"height\": 19,\r\n\t\t\"left_move\": 74,\r\n\t\t\"width_move\": 369,\r\n\t\t\"top_move\": 20,\r\n\t\t\"height_move\": 119,\r\n\t\t\"row\": [1, 6],\r\n\t\t\"column\": [1, 5],\r\n\t\t\"row_focus\": 1,\r\n\t\t\"column_focus\": 1\r\n\t},\r\n\t\"luckysheet_alternateformat_save\": [{\r\n\t\t\"cellrange\": {\r\n\t\t\t\"row\": [1, 6],\r\n\t\t\t\"column\": [1, 5]\r\n\t\t},\r\n\t\t\"format\": {\r\n\t\t\t\"head\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#5ed593\"\r\n\t\t\t},\r\n\t\t\t\"one\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#ffffff\"\r\n\t\t\t},\r\n\t\t\t\"two\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#e5fbee\"\r\n\t\t\t},\r\n\t\t\t\"foot\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#a5efcc\"\r\n\t\t\t}\r\n\t\t},\r\n\t\t\"hasRowHeader\": false,\r\n\t\t\"hasRowFooter\": false\r\n\t}, {\r\n\t\t\"cellrange\": {\r\n\t\t\t\"row\": [1, 6],\r\n\t\t\t\"column\": [8, 12]\r\n\t\t},\r\n\t\t\"format\": {\r\n\t\t\t\"head\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#5599fc\"\r\n\t\t\t},\r\n\t\t\t\"one\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#ffffff\"\r\n\t\t\t},\r\n\t\t\t\"two\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#ecf2fe\"\r\n\t\t\t},\r\n\t\t\t\"foot\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#afcbfa\"\r\n\t\t\t}\r\n\t\t},\r\n\t\t\"hasRowHeader\": false,\r\n\t\t\"hasRowFooter\": false\r\n\t}, {\r\n\t\t\"cellrange\": {\r\n\t\t\t\"row\": [9, 14],\r\n\t\t\t\"column\": [1, 5]\r\n\t\t},\r\n\t\t\"format\": {\r\n\t\t\t\"head\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#5ed593\"\r\n\t\t\t},\r\n\t\t\t\"one\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#ffffff\"\r\n\t\t\t},\r\n\t\t\t\"two\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#e5fbee\"\r\n\t\t\t},\r\n\t\t\t\"foot\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#a5efcc\"\r\n\t\t\t}\r\n\t\t},\r\n\t\t\"hasRowHeader\": true,\r\n\t\t\"hasRowFooter\": false\r\n\t}, {\r\n\t\t\"cellrange\": {\r\n\t\t\t\"row\": [17, 22],\r\n\t\t\t\"column\": [1, 5]\r\n\t\t},\r\n\t\t\"format\": {\r\n\t\t\t\"head\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#5599fc\"\r\n\t\t\t},\r\n\t\t\t\"one\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#ffffff\"\r\n\t\t\t},\r\n\t\t\t\"two\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#ecf2fe\"\r\n\t\t\t},\r\n\t\t\t\"foot\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#afcbfa\"\r\n\t\t\t}\r\n\t\t},\r\n\t\t\"hasRowHeader\": true,\r\n\t\t\"hasRowFooter\": true\r\n\t}, {\r\n\t\t\"cellrange\": {\r\n\t\t\t\"row\": [9, 14],\r\n\t\t\t\"column\": [8, 12]\r\n\t\t},\r\n\t\t\"format\": {\r\n\t\t\t\"head\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#7a939a\"\r\n\t\t\t},\r\n\t\t\t\"one\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#ffffff\"\r\n\t\t\t},\r\n\t\t\t\"two\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#f0eff7\"\r\n\t\t\t},\r\n\t\t\t\"foot\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#bdcad0\"\r\n\t\t\t}\r\n\t\t},\r\n\t\t\"hasRowHeader\": false,\r\n\t\t\"hasRowFooter\": true\r\n\t}, {\r\n\t\t\"cellrange\": {\r\n\t\t\t\"row\": [17, 22],\r\n\t\t\t\"column\": [8, 12]\r\n\t\t},\r\n\t\t\"format\": {\r\n\t\t\t\"head\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#89c54b\"\r\n\t\t\t},\r\n\t\t\t\"one\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#ffffff\"\r\n\t\t\t},\r\n\t\t\t\"two\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#f1f7e9\"\r\n\t\t\t},\r\n\t\t\t\"foot\": {\r\n\t\t\t\t\"fc\": \"#000\",\r\n\t\t\t\t\"bc\": \"#c5e3a7\"\r\n\t\t\t}\r\n\t\t},\r\n\t\t\"hasRowHeader\": true,\r\n\t\t\"hasRowFooter\": true\r\n\t}],\r\n\t\"luckysheet_alternateformat_save_modelCustom\": [{\r\n\t\t\"head\": {\r\n\t\t\t\"fc\": \"#6aa84f\",\r\n\t\t\t\"bc\": \"#ffffff\"\r\n\t\t},\r\n\t\t\"one\": {\r\n\t\t\t\"fc\": \"#000\",\r\n\t\t\t\"bc\": \"#ffffff\"\r\n\t\t},\r\n\t\t\"two\": {\r\n\t\t\t\"fc\": \"#000\",\r\n\t\t\t\"bc\": \"#e5fbee\"\r\n\t\t},\r\n\t\t\"foot\": {\r\n\t\t\t\"fc\": \"#000\",\r\n\t\t\t\"bc\": \"#a5efcc\"\r\n\t\t}\r\n\t}]\r\n}\r\n\r\n// export default sheetTable;"
  },
  {
    "path": "src/expendPlugins/chart/chartmix.css",
    "content": ".luckysheet-datavisual-quick-menu{width:120px;overflow:auto;margin-top:15px}.luckysheet-datavisual-quick-menu::-webkit-scrollbar{display:none}.luckysheet-datavisual-quick-menu>div{text-align:left;padding:4px 4px;border-right:3px solid #fff;color:#777;cursor:pointer;line-height:1.4em;word-wrap:break-word}.luckysheet-datavisual-quick-menu>div:hover{color:#000}.luckysheet-datavisual-quick-menu>div i{width:15px}.luckysheet-datavisual-quick-menu>div:hover i{color:#ff7e7e}.luckysheet-datavisual-quick-menu>div.luckysheet-datavisual-quick-menu-active{border-right:3px solid #ff7e7e;color:#000;font-weight:700}.luckysheet-datavisual-quick-menu>div.luckysheet-datavisual-quick-menu-active:hover i{color:#000}.luckysheet-datavisual-quick-range{padding:5px 0}.luckysheet-datavisual-range-container{background:#fff;border:1px solid #d9d9d9;border-top:1px solid silver;min-width:20px;width:100%;max-width:200px;display:inline-block}.luckysheet-datavisual-range-container-focus{border:1px solid #4d90fe;box-shadow:inset 0 1px 2px rgba(0,0,0,.3);outline:none}.luckysheet-datavisual-range-input,.luckysheet-datavisual-range-input:focus{background:transparent!important;border:none!important;box-sizing:border-box;box-shadow:none;height:25px;margin:0;outline:none!important;padding:1px 8px!important;width:100%}.luckysheet-datavisual-range-button-container{overflow:hidden;padding:0 0 0 8px;text-align:right;width:21px}.luckysheet-datavisual-range-button-container div{padding:2px 10px 0 10px;font-size:18px;cursor:pointer;color:#6598f3}.luckysheet-datavisual-range-button-container div:hover{color:#ff7e7e}.luckysheet-datavisual-quick-m{margin-top:5px;min-height:500px;top:50px;font-size:12px}.luckysheet-datavisual-quick-list{left:110px;right:0;bottom:0;top:80px;position:absolute;overflow:auto;border-top:1px solid #e5e5e5;padding:5px 3px 35px 3px}.luckysheet-datavisual-quick-list-title{padding:4px 6px;background:#e5e5e5;margin-top:10px}.luckysheet-datavisual-quick-list-ul{overflow:hidden}.luckysheet-datavisual-quick-list-item{display:inline-block;margin:5px 8px;border:1px solid #dadada;width:100px;height:80px}.luckysheet-datavisual-quick-list-item:hover{border:1px solid #ff7e7e;box-shadow:0 0 20px #ff7e7e}.luckysheet-datavisual-quick-list-item img{display:inline-block;width:100px;height:80px}.luckysheet-datavisual-quick-list-item-active{border:1px solid #6598f3;box-shadow:0 0 20px #6598f3}.chart-base-slider .el-slider__runway.show-input{margin-right:72px}.chart-base-slider .el-slider__input.el-input-number--mini{width:56px}.chart-base-slider .input_content{margin:6px 0 0 5px}.title{font-weight:700}.el-row{font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chartSetting{width:100%;height:100%}"
  },
  {
    "path": "src/expendPlugins/chart/plugin.js",
    "content": "import { seriesLoadScripts, loadLinks, $$, arrayRemoveItem } from \"../../utils/util\";\r\nimport { generateRandomKey, replaceHtml } from \"../../utils/chartUtil\";\r\nimport { getdatabyselection, getcellvalue } from \"../../global/getdata\";\r\nimport chartInfo from \"../../store\";\r\nimport formula from \"../../global/formula\";\r\nimport { luckysheet_getcelldata } from \"../../function/func\";\r\nimport { getSheetIndex, getRangetxt, getvisibledatacolumn, getvisibledatarow } from \"../../methods/get\";\r\nimport { rowLocation, colLocation, mouseposition } from \"../../global/location\";\r\nimport { setluckysheet_scroll_status } from \"../../methods/set\";\r\nimport {\r\n    luckysheetMoveHighlightCell,\r\n    luckysheetMoveHighlightCell2,\r\n    luckysheetMoveHighlightRange,\r\n    luckysheetMoveHighlightRange2,\r\n    luckysheetMoveEndCell,\r\n} from \"../../controllers/sheetMove\";\r\nimport { isEditMode } from \"../../global/validate\";\r\nimport luckysheetsizeauto from \"../../controllers/resize\";\r\nimport Store from \"../../store\";\r\n\r\nlet _rowLocation = rowLocation;\r\nlet _colLocation = colLocation;\r\n\r\n// Dynamically load dependent scripts and styles\r\nconst dependScripts = [\r\n    \"https://unpkg.com/vue@2.6.11/dist/vue.min.js\",\r\n    \"https://unpkg.com/vuex@3.4.0/dist/vuex.min.js\",\r\n    \"https://unpkg.com/element-ui@2.13.2/lib/index.js\",\r\n    \"https://unpkg.com/echarts@4.8.0/dist/echarts.min.js\",\r\n    \"./expendPlugins/chart/chartmix.umd.min.js\",\r\n];\r\n\r\nconst dependLinks = [\r\n    \"https://unpkg.com/element-ui@2.13.2/lib/theme-chalk/index.css\",\r\n    \"./expendPlugins/chart/chartmix.css\",\r\n    // 'http://26.26.26.1:8000/chartmix.css'\r\n];\r\n\r\n// Initialize the chart component\r\nfunction chart(options, config, isDemo) {\r\n    const data = options.data;\r\n    loadLinks(dependLinks);\r\n\r\n    seriesLoadScripts(dependScripts, null, function() {\r\n        const store = new Vuex.Store();\r\n        console.info(\"chartmix::\", chartmix.default);\r\n\r\n        Vue.use(chartmix.default, { store });\r\n        let outDom = document.getElementsByTagName(\"body\")[0];\r\n        chartmix.default.initChart(outDom, chartInfo.lang);\r\n\r\n        $(\".chartSetting\").css({\r\n            top: \"1px\",\r\n            bottom: \"1px\",\r\n            position: \"absolute\",\r\n            right: \"0px\",\r\n            width: \"350px\",\r\n            background: \"#fff\",\r\n\r\n            border: \"1px solid #E5E5E5\",\r\n            \"z-index\": 1004,\r\n            \"box-shadow\": \"0px 2px 4px rgba(0,0,0,0.2)\",\r\n            \"-webkit-box-shadow\": \"0px 2px 4px rgba(0,0,0,0.2)\",\r\n            \"-moz-box-shadow\": \"0px 2px 4px rgba(0,0,0,0.2)\",\r\n            \"-moz-user-select\": \"none\",\r\n            \"-khtml-user-select\": \"none\",\r\n            \"-webkit-user-select\": \"none\",\r\n            \"-ms-user-select\": \"none\",\r\n            \"user-select\": \"none\",\r\n            \"padding-left\": \"30px\",\r\n            display: \"none\",\r\n        });\r\n\r\n        chartInfo.createChart = chartmix.default.createChart;\r\n        chartInfo.highlightChart = chartmix.default.highlightChart;\r\n        chartInfo.deleteChart = chartmix.default.deleteChart;\r\n        chartInfo.resizeChart = chartmix.default.resizeChart;\r\n        chartInfo.changeChartRange = chartmix.default.changeChartRange;\r\n        chartInfo.changeChartCellData = chartmix.default.changeChartCellData;\r\n        chartInfo.getChartJson = chartmix.default.getChartJson;\r\n        chartInfo.chart_selection = chart_selection();\r\n        chartInfo.chartparam.jfrefreshchartall = jfrefreshchartall;\r\n        chartInfo.chartparam.changeChartCellData = chartmix.default.changeChartCellData;\r\n        chartInfo.chartparam.renderChart = chartmix.default.renderChart;\r\n        chartInfo.chartparam.getChartJson = chartmix.default.getChartJson;\r\n        chartInfo.chartparam.insertToStore = chartmix.default.insertToStore;\r\n\r\n        // Initialize the rendering chart\r\n        for (let i = 0; i < data.length; i++) {\r\n            // if (data[i].status == '1') {\r\n            renderCharts(data[i].chart, isDemo);\r\n            // }\r\n        }\r\n\r\n        for (let i = 0; i < data.length; i++) {\r\n            if (data[i].status == \"1\") {\r\n                renderChartShow(data[i].index);\r\n            }\r\n        }\r\n\r\n        // After the chart is loaded, mark it\r\n        arrayRemoveItem(chartInfo.asyncLoad, \"chart\");\r\n    });\r\n}\r\n\r\n// rendercharts\r\nfunction renderCharts(chartLists, isDemo) {\r\n    // no chart\r\n    if (chartLists == undefined) {\r\n        return;\r\n    }\r\n\r\n    for (let i = 0; i < chartLists.length; i++) {\r\n        let chart = chartLists[i];\r\n\r\n        if (isDemo) {\r\n            chartInfo.chartparam.insertToStore({ chart_id: chart.chart_id, chartOptions: chart.chartOptions });\r\n        }\r\n\r\n        let chart_id = chart.chart_id;\r\n        let chart_id_c = chart_id + \"_c\";\r\n        let modelChartShowHTML =\r\n            '<div id=\"${id}\"class=\"luckysheet-modal-dialog luckysheet-modal-dialog-chart ${addclass}\"tabindex=\"0\"role=\"dialog\"aria-labelledby=\":41e\"dir=\"ltr\"><div class=\"luckysheet-modal-dialog-resize\"><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lt\"data-type=\"lt\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mt\"data-type=\"mt\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lm\"data-type=\"lm\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rm\"data-type=\"rm\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rt\"data-type=\"rt\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lb\"data-type=\"lb\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mb\"data-type=\"mb\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rb\"data-type=\"rb\"></div></div><div class=\"luckysheet-modal-dialog-controll\"><span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-update\"role=\"button\"tabindex=\"0\"aria-label=\"修改图表\"title=\"修改图表\"><i class=\"fa fa-pencil\"aria-hidden=\"true\"></i></span><span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-max\"role=\"butluckysheet_chartIns_indexton\"tabindex=\"0\"aria-label=\"最大化\"title=\"最大化\"><i class=\"fa fa-window-maximize\"aria-hidden=\"true\"></i></span><span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-del\"role=\"button\"tabindex=\"0\"aria-label=\"删除\"title=\"删除\"><i class=\"fa fa-trash\"aria-hidden=\"true\"></i></span></div><div class=\"luckysheet-modal-dialog-content\">${content}</div></div>';\r\n\r\n        // 防止创建重复的id\r\n        let $t;\r\n        if ($(`.luckysheet-cell-main #${chart_id_c}`).length === 0) {\r\n            $t = $(\r\n                replaceHtml(modelChartShowHTML, {\r\n                    id: chart_id_c,\r\n                    addclass: \"luckysheet-data-visualization-chart\",\r\n                    title: \"图表生成\",\r\n                    content: \"\",\r\n                }),\r\n            ).appendTo($(\".luckysheet-cell-main\"));\r\n        }\r\n        if (!$t) return;\r\n\r\n        setChartMoveableEffect($t);\r\n\r\n        $(`#${chart_id_c}`).children(\".luckysheet-modal-dialog-content\")[0].id = chart_id;\r\n\r\n        let container = document.getElementById(chart_id_c);\r\n\r\n        let chart_json;\r\n        chart_json = chartInfo.chartparam.getChartJson(chart.chart_id);\r\n\r\n        chartInfo.chartparam.renderChart({ chart_id: chart.chart_id, chartOptions: chart_json });\r\n        chartInfo.currentChart = chart_json;\r\n\r\n        //处理区域高亮框参数，当前页中，只有当前的图表的needRangShow为true,其他为false\r\n        showNeedRangeShow(chart_id);\r\n\r\n        // delete current chart\r\n        $(`#${chart_id}_c .luckysheet-modal-controll-del`).click(function(e) {\r\n            delChart(chart_id);\r\n        });\r\n\r\n        // edit current chart\r\n        $(`#${chart_id}_c .luckysheet-modal-controll-update`).click(function(e) {\r\n            showChartSettingComponent();\r\n        });\r\n\r\n        // 把图表坐标信息更新到sheetFile中\r\n        $(`#${chart_id}_c`).mouseup(function(e) {\r\n            const w = $(this).css(\"width\");\r\n            const h = $(this).css(\"height\");\r\n            const t = $(this).css(\"top\");\r\n            const l = $(this).css(\"left\");\r\n\r\n            // insert chartinfo\r\n            let sheetFile = chartInfo.luckysheetfile[getSheetIndex(chartInfo.currentSheetIndex)];\r\n\r\n            if (!sheetFile.chart) {\r\n                sheetFile.chart = [];\r\n            }\r\n\r\n            sheetFile.chart.forEach((item) => {\r\n                if (item.chart_id === chart_id) {\r\n                    item.width = parseFloat(w);\r\n                    item.height = parseFloat(h);\r\n                    item.left = parseFloat(l);\r\n                    item.top = parseFloat(t);\r\n                }\r\n            });\r\n        });\r\n\r\n        $t.children(\".luckysheet-modal-dialog-content\").mousedown(function(e) {\r\n            if (!chartInfo.chartparam.luckysheetCurrentChartMaxState) {\r\n                //当前图表显示区域高亮\r\n                showNeedRangeShow(chart_id);\r\n            }\r\n            e.stopPropagation();\r\n        });\r\n        $t.mousedown(function(e) {\r\n            // move chart\r\n\r\n            if (!chartInfo.chartparam.luckysheetCurrentChartMaxState) {\r\n                //当前图表显示区域高亮\r\n                showNeedRangeShow(chart_id);\r\n                setluckysheet_scroll_status(true);\r\n\r\n                //允许拖动渲染框\r\n                if (\r\n                    !$(e.target).is(\".luckysheet-modal-dialog-controll\") &&\r\n                    !$(e.target).is(\".luckysheet-modal-controll-btn\") &&\r\n                    !$(e.target).is(\"i\")\r\n                ) {\r\n                    // Debounce\r\n                    chartInfo.chartparam.luckysheetCurrentChartMoveTimeout = setTimeout(function() {\r\n                        chartInfo.chartparam.luckysheetCurrentChartMove = true;\r\n                    }, 100);\r\n                }\r\n\r\n                var toffset = chartInfo.chartparam.luckysheetCurrentChartMoveObj.offset();\r\n                var tpsition = chartInfo.chartparam.luckysheetCurrentChartMoveObj.position();\r\n                //luckysheetCurrentChartMoveXy: [鼠标点相对chart框的距离X方向，鼠标点相对chart框的距离Y方向，chart框相对cell-main的距离X方向，chart框相对cell-main的距离Y方向，水平滚动条的位置，垂直滚动条的位置]\r\n                chartInfo.chartparam.luckysheetCurrentChartMoveXy = [\r\n                    e.pageX - toffset.left,\r\n                    e.pageY - toffset.top,\r\n                    tpsition.left,\r\n                    tpsition.top,\r\n                    $(\"#luckysheet-scrollbar-x\").scrollLeft(),\r\n                    $(\"#luckysheet-scrollbar-y\").scrollTop(),\r\n                ];\r\n                chartInfo.chartparam.luckysheetCurrentChartMoveWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n                chartInfo.chartparam.luckysheetCurrentChartMoveWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n\r\n                if (\r\n                    !$(e.target).hasClass(\"luckysheet-mousedown-cancel\") &&\r\n                    $(e.target).filter(\"[class*='sp-palette']\").length == 0 &&\r\n                    $(e.target).filter(\"[class*='sp-thumb']\").length == 0 &&\r\n                    $(e.target).filter(\"[class*='sp-']\").length == 0\r\n                ) {\r\n                    $(\"#luckysheet-rightclick-menu\").hide();\r\n                    $(\"#luckysheet-cols-h-hover\").hide();\r\n                    $(\"#luckysheet-cols-menu-btn\").hide();\r\n                    $(\"#luckysheet-rightclick-menu\").hide();\r\n                    $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu, #luckysheet-user-menu\").hide();\r\n                    $(\r\n                        \"body > .luckysheet-filter-menu, body > .luckysheet-filter-submenu, body > .luckysheet-cols-menu\",\r\n                    ).hide();\r\n                }\r\n\r\n                e.stopPropagation();\r\n            }\r\n        })\r\n            .find(\".luckysheet-modal-dialog-resize-item\")\r\n            .mousedown(function(e) {\r\n                if (chartInfo.chartparam.luckysheetCurrentChartActive) {\r\n                    chartInfo.chartparam.luckysheetCurrentChartResize = $(this).data(\"type\"); //开始状态resize\r\n\r\n                    var mouse = mouseposition(e.pageX, e.pageY),\r\n                        scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft(),\r\n                        scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n                    var x = mouse[0] + scrollLeft;\r\n                    var y = mouse[1] + scrollTop;\r\n                    var position = chartInfo.chartparam.luckysheetCurrentChartResizeObj.position();\r\n                    //参数：x,y:鼠标位置，$t.width(), $t.height(): chart框宽高， position.left + scrollLeft, position.top + scrollTop ：chart框位置 ，scrollLeft, scrollTop：滚动条位置\r\n                    chartInfo.chartparam.luckysheetCurrentChartResizeXy = [\r\n                        x,\r\n                        y,\r\n                        $t.width(),\r\n                        $t.height(),\r\n                        position.left + scrollLeft,\r\n                        position.top + scrollTop,\r\n                        scrollLeft,\r\n                        scrollTop,\r\n                    ];\r\n                    chartInfo.chartparam.luckysheetCurrentChartResizeWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n                    chartInfo.chartparam.luckysheetCurrentChartResizeWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n\r\n                    chartInfo.chartparam.luckysheetCurrentChart = chart_id;\r\n\r\n                    e.stopPropagation();\r\n                }\r\n            });\r\n\r\n        let width = chart.width;\r\n        let height = chart.height;\r\n        let left = chart.left;\r\n        let top = chart.top;\r\n        container.style.width = width + \"px\";\r\n        container.style.height = height + \"px\";\r\n        container.style.position = \"absolute\";\r\n        container.style.background = \"#fff\";\r\n        container.style.left = left + \"px\";\r\n        container.style.top = top + \"px\";\r\n        container.style.zIndex = chartInfo.zIndex ? chartInfo.zIndex : 15;\r\n        chartInfo.zIndex++;\r\n    }\r\n}\r\n\r\nfunction jfrefreshchartall(flowdata1, r_st, r_ed, c_st, c_ed) {\r\n    // let chart = chartInfo.currentChart;\r\n    // if (!chart) {\r\n    //     return;\r\n    // }\r\n    // if (chart.rangeArray.length == 1) {\r\n    //     var row = chart.rangeArray[0].row;\r\n    //     var column = chart.rangeArray[0].column;\r\n    //     //不在范围内的不更新\r\n    //     if (r_st > row[1] || r_ed < row[0] || c_st > column[1] || c_ed < column[0]) {\r\n    //         return;\r\n    //     }\r\n    //根据原有的范围取得数据\r\n    // var luckysheetgetcellrange = formula.getcellrange(chart.rangeTxt);\r\n    // var sheetIndex = luckysheetgetcellrange.sheetIndex == -1 ? 0 : luckysheetgetcellrange.sheetIndex; //sheetIndex为-1时，转化为0\r\n    // var sheetName = Store.luckysheetfile.find((item) => item.index === sheetIndex).name;\r\n    // var sheetName;\r\n    // Store.luckysheetfile.forEach((item) => {\r\n    //     if (item.chart && item.chart.length) {\r\n    //         item.chart.forEach((ele) => {\r\n    //             if (ele.chart_id === chart.chart_id) {\r\n    //                 sheetName = item.name;\r\n    //             }\r\n    //         });\r\n    //     }\r\n    // });\r\n    // var selection = {\r\n    //     row: luckysheetgetcellrange.row,\r\n    //     column: luckysheetgetcellrange.column,\r\n    //     dataSheetIndex: sheetIndex,\r\n    // }; //数组\r\n    // var getcelldata = luckysheet_getcelldata(sheetName + \"!\" + chart.rangeTxt);\r\n    // if (typeof getcelldata === \"object\" && getcelldata.length != 0 && getcelldata.data.length != null) {\r\n    //     //getcelldata有值，且不为空数组 && getcelldata.data为二维数组\r\n    //     var chartData = getcelldata.data;\r\n    //     chartInfo.chartparam.changeChartCellData(chart.chart_id, chartData);\r\n    // }\r\n    // }\r\n\r\n    const sheetInfo = Store.luckysheetfile.find((item) => item.index == Store.currentSheetIndex);\r\n    const charts = sheetInfo.chart;\r\n    charts &&\r\n        charts.forEach((item) => {\r\n            var getcelldata = luckysheet_getcelldata(sheetInfo.name + \"!\" + item.chartOptions.rangeTxt);\r\n            if (typeof getcelldata === \"object\" && getcelldata.length != 0 && getcelldata.data.length != null) {\r\n                //getcelldata有值，且不为空数组 && getcelldata.data为二维数组\r\n                var chartData = getcelldata.data;\r\n                chartInfo.chartparam.changeChartCellData(item.chart_id, chartData);\r\n            }\r\n        });\r\n}\r\n\r\nfunction chart_selection() {\r\n    return {\r\n        create: function() {\r\n            var chart_json = chartInfo.currentChart;\r\n\r\n            if (chart_json.rangeArray.length > 1) {\r\n                return;\r\n            }\r\n\r\n            $(\"#luckysheet-chart-rangeShow\").empty();\r\n            $(\"#luckysheet-cell-selected-boxs\").hide();\r\n            $(\"#luckysheet-cell-selected-focus\").hide();\r\n            $(\"#luckysheet-rows-h-selected\").empty();\r\n            $(\"#luckysheet-cols-h-selected\").empty();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n\r\n            var st_r = chart_json.rangeArray[0].row[0];\r\n            var st_c = chart_json.rangeArray[0].column[0];\r\n\r\n            var rangeSplitArray = chart_json.rangeSplitArray;\r\n\r\n            //首行是否标题\r\n            var rangeRowCheck = chart_json.rangeRowCheck;\r\n\r\n            if (rangeRowCheck.exits) {\r\n                var chart_rowtitle_html = getRangeShowHtml(\r\n                    \"rowtitle\",\r\n                    rangeSplitArray.rowtitle.row[0] + st_r,\r\n                    rangeSplitArray.rowtitle.row[1] + st_r,\r\n                    rangeSplitArray.rowtitle.column[0] + st_c,\r\n                    rangeSplitArray.rowtitle.column[1] + st_c,\r\n                );\r\n            } else {\r\n                var chart_rowtitle_html = \"\";\r\n            }\r\n\r\n            //首列是否标题\r\n            var rangeColCheck = chart_json.rangeColCheck;\r\n\r\n            if (rangeColCheck.exits) {\r\n                var chart_coltitle_html = getRangeShowHtml(\r\n                    \"coltitle\",\r\n                    rangeSplitArray.coltitle.row[0] + st_r,\r\n                    rangeSplitArray.coltitle.row[1] + st_r,\r\n                    rangeSplitArray.coltitle.column[0] + st_c,\r\n                    rangeSplitArray.coltitle.column[1] + st_c,\r\n                );\r\n            } else {\r\n                var chart_coltitle_html = \"\";\r\n            }\r\n\r\n            //内容块\r\n            var chart_content_html = getRangeShowHtml(\r\n                \"content\",\r\n                rangeSplitArray.content.row[0] + st_r,\r\n                rangeSplitArray.content.row[1] + st_r,\r\n                rangeSplitArray.content.column[0] + st_c,\r\n                rangeSplitArray.content.column[1] + st_c,\r\n            );\r\n\r\n            $(\"#luckysheet-chart-rangeShow\").append(chart_rowtitle_html + chart_coltitle_html + chart_content_html);\r\n\r\n            function getRangeShowHtml(type, r1, r2, c1, c2) {\r\n                var visibledatarow = getvisibledatarow();\r\n                var visibledatacolumn = getvisibledatacolumn();\r\n\r\n                var row = visibledatarow[r2],\r\n                    row_pre = r1 - 1 == -1 ? 0 : visibledatarow[r1 - 1];\r\n                var col = visibledatacolumn[c2],\r\n                    col_pre = c1 - 1 == -1 ? 0 : visibledatacolumn[c1 - 1];\r\n\r\n                if (type == \"rowtitle\") {\r\n                    var color = \"#C65151\";\r\n                }\r\n\r\n                if (type == \"coltitle\") {\r\n                    var color = \"#9667C0\";\r\n                }\r\n\r\n                if (type == \"content\") {\r\n                    var color = \"#4970D1\";\r\n                }\r\n\r\n                var html =\r\n                    '<div id=\"luckysheet-chart-rangeShow-' +\r\n                    type +\r\n                    '\" style=\"left: ' +\r\n                    col_pre +\r\n                    \"px;width: \" +\r\n                    (col - col_pre - 1) +\r\n                    \"px;top: \" +\r\n                    row_pre +\r\n                    \"px;height: \" +\r\n                    (row - row_pre - 1) +\r\n                    'px;border: none;margin: 0;position: absolute;z-index: 14;\">' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-move\" data-type=\"top\" style=\"height: 2px;border-top: 2px solid #fff;border-bottom: 2px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;left: 0;right: 0;top: -2px;z-index: 18;opacity: 0.9;cursor: move;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-move\" data-type=\"right\" style=\"width: 2px;border-left: 2px solid #fff;border-right: 2px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;top: 0;bottom: 0;right: -2px;z-index: 18;opacity: 0.9;cursor: move;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-move\" data-type=\"bottom\" style=\"height: 2px;border-top: 2px solid #fff;border-bottom: 2px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;left: 0;right: 0;bottom: -2px;z-index: 18;opacity: 0.9;cursor: move;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-move\" data-type=\"left\" style=\"width: 2px;border-left: 2px solid #fff;border-right: 2px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;top: 0;bottom: 0;left: -2px;z-index: 18;opacity: 0.9;cursor: move;\"></div>' +\r\n                    '<div style=\"border: 2px solid #85c0fc;background: ' +\r\n                    color +\r\n                    ';position: absolute;top: 0;right: 0;bottom: 0;left: 0;z-index: 15;opacity: 0.1;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-resize\" data-type=\"lt\" style=\"width: 6px;height: 6px;border: 1px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;left: -3px;top: -3px;z-index: 19;cursor: se-resize;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-resize\" data-type=\"rt\" style=\"width: 6px;height: 6px;border: 1px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;right: -3px;top: -3px;z-index: 19;cursor: ne-resize;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-resize\" data-type=\"lb\" style=\"width: 6px;height: 6px;border: 1px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;left: -3px;bottom: -3px;z-index: 19;cursor: ne-resize;\"></div>' +\r\n                    '<div class=\"luckysheet-chart-rangeShow-resize\" data-type=\"rb\" style=\"width: 6px;height: 6px;border: 1px solid #fff;background: ' +\r\n                    color +\r\n                    ';position: absolute;right: -3px;bottom: -3px;z-index: 19;cursor: se-resize;\"></div>' +\r\n                    \"</div>\";\r\n\r\n                return html;\r\n            }\r\n        },\r\n        rangeMove: false,\r\n        rangeMovexy: null,\r\n        rangeMoveIndex: null,\r\n        rangeMoveObj: null,\r\n        rangeMoveDraging: function(event, sheetBarHeight, statisticBarHeight) {\r\n            var chart_json = chartInfo.currentChart;\r\n            var st_r = chart_json.rangeArray[0].row[0];\r\n            var st_c = chart_json.rangeArray[0].column[0];\r\n            var rangeRowCheck = chart_json.rangeRowCheck;\r\n            var rangeColCheck = chart_json.rangeColCheck;\r\n            var rangeSplitArray = chart_json.rangeSplitArray;\r\n\r\n            var mouse = mouseposition(event.pageX, event.pageY);\r\n            var scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            var scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            var x = mouse[0] + scrollLeft;\r\n            var y = mouse[1] + scrollTop;\r\n\r\n            var winH = $(window).height() + scrollTop - sheetBarHeight - statisticBarHeight,\r\n                winW = $(window).width() + scrollLeft;\r\n\r\n            var rowLocation = _rowLocation(y),\r\n                row_index = rowLocation[2];\r\n            var colLocation = _colLocation(x),\r\n                col_index = colLocation[2];\r\n\r\n            var visibledatarow = getvisibledatarow();\r\n            var visibledatacolumn = getvisibledatacolumn();\r\n\r\n            var $id = chartInfo.chart_selection.rangeMoveObj.attr(\"id\");\r\n\r\n            if ($id == \"luckysheet-chart-rangeShow-content\") {\r\n                //行\r\n                var row_s =\r\n                    chartInfo.chart_selection.rangeMoveIndex[0] - chartInfo.chart_selection.rangeMovexy[0] + row_index;\r\n\r\n                if (rangeRowCheck.exits) {\r\n                    if (row_s < st_r + rangeRowCheck.range[1] + 1 || y < 0) {\r\n                        row_s = st_r + rangeRowCheck.range[1] + 1;\r\n                    }\r\n                } else {\r\n                    if (row_s < 0 || y < 0) {\r\n                        row_s = 0;\r\n                    }\r\n                }\r\n\r\n                var row_e = rangeSplitArray.content.row[1] - rangeSplitArray.content.row[0] + row_s;\r\n\r\n                if (row_e >= visibledatarow.length - 1 || y > winH) {\r\n                    row_s = visibledatarow.length - 1 - rangeSplitArray.content.row[1] + rangeSplitArray.content.row[0];\r\n                    row_e = visibledatarow.length - 1;\r\n                }\r\n\r\n                //列\r\n                var col_s =\r\n                    chartInfo.chart_selection.rangeMoveIndex[1] - chartInfo.chart_selection.rangeMovexy[1] + col_index;\r\n                if (rangeColCheck.exits) {\r\n                    if (col_s < st_c + rangeColCheck.range[1] + 1 || x < 0) {\r\n                        col_s = st_c + rangeColCheck.range[1] + 1;\r\n                    }\r\n                } else {\r\n                    if (col_s < 0 || x < 0) {\r\n                        col_s = 0;\r\n                    }\r\n                }\r\n\r\n                var col_e = rangeSplitArray.content.column[1] - rangeSplitArray.content.column[0] + col_s;\r\n\r\n                if (col_e >= visibledatacolumn.length - 1 || x > winW) {\r\n                    col_s =\r\n                        visibledatacolumn.length -\r\n                        1 -\r\n                        rangeSplitArray.content.column[1] +\r\n                        rangeSplitArray.content.column[0];\r\n                    col_e = visibledatacolumn.length - 1;\r\n                }\r\n\r\n                //更新\r\n                if (rangeRowCheck.exits && rangeColCheck.exits) {\r\n                    chart_json.rangeArray = [{ row: [st_r, row_e], column: [st_c, col_e] }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [st_r, row_e],\r\n                        column: [st_c, col_e],\r\n                    };\r\n\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: [row_s - st_r, row_e - st_r],\r\n                        column: [col_s - st_c, col_e - st_c],\r\n                    };\r\n\r\n                    chart_json.rangeSplitArray.rowtitle = {\r\n                        row: chart_json.rangeSplitArray.rowtitle.row,\r\n                        column: [col_s - st_c, col_e - st_c],\r\n                    };\r\n\r\n                    chart_json.rangeSplitArray.coltitle = {\r\n                        row: [row_s - st_r, row_e - st_r],\r\n                        column: chart_json.rangeSplitArray.coltitle.column,\r\n                    };\r\n                } else if (rangeRowCheck.exits) {\r\n                    chart_json.rangeArray = [{ row: [st_r, row_e], column: [col_s, col_e] }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [st_r, row_e],\r\n                        column: [col_s, col_e],\r\n                    };\r\n\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: [row_s - st_r, row_e - st_r],\r\n                        column: chart_json.rangeSplitArray.content.column,\r\n                    };\r\n                } else if (rangeColCheck.exits) {\r\n                    chart_json.rangeArray = [{ row: [row_s, row_e], column: [st_c, col_e] }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [row_s, row_e],\r\n                        column: [st_c, col_e],\r\n                    };\r\n\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: chart_json.rangeSplitArray.content.row,\r\n                        column: [col_s - st_c, col_e - st_c],\r\n                    };\r\n                } else {\r\n                    chart_json.rangeArray = [{ row: [row_s, row_e], column: [col_s, col_e] }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [row_s, row_e],\r\n                        column: [col_s, col_e],\r\n                    };\r\n                }\r\n            } else if ($id == \"luckysheet-chart-rangeShow-rowtitle\") {\r\n                //列\r\n                var col_s =\r\n                    chartInfo.chart_selection.rangeMoveIndex[1] - chartInfo.chart_selection.rangeMovexy[1] + col_index;\r\n\r\n                if (rangeColCheck.exits) {\r\n                    if (col_s < st_c + rangeColCheck.range[1] + 1 || x < 0) {\r\n                        col_s = st_c + rangeColCheck.range[1] + 1;\r\n                    }\r\n                } else {\r\n                    if (col_s < 0 || x < 0) {\r\n                        col_s = 0;\r\n                    }\r\n                }\r\n\r\n                var col_e = rangeSplitArray.rowtitle.column[1] - rangeSplitArray.rowtitle.column[0] + col_s;\r\n\r\n                if (col_e >= visibledatacolumn.length - 1 || x > winW) {\r\n                    col_s =\r\n                        visibledatacolumn.length -\r\n                        1 -\r\n                        rangeSplitArray.rowtitle.column[1] +\r\n                        rangeSplitArray.rowtitle.column[0];\r\n                    col_e = visibledatacolumn.length - 1;\r\n                }\r\n\r\n                //更新\r\n                if (rangeColCheck.exits) {\r\n                    chart_json.rangeArray = [{ row: chart_json.rangeArray[0].row, column: [st_c, col_e] }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: chart_json.rangeArray[0].row,\r\n                        column: [st_c, col_e],\r\n                    };\r\n\r\n                    chart_json.rangeSplitArray.rowtitle = {\r\n                        row: chart_json.rangeSplitArray.rowtitle.row,\r\n                        column: [col_s - st_c, col_e - st_c],\r\n                    };\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: chart_json.rangeSplitArray.content.row,\r\n                        column: [col_s - st_c, col_e - st_c],\r\n                    };\r\n                } else {\r\n                    chart_json.rangeArray = [{ row: chart_json.rangeArray[0].row, column: [col_s, col_e] }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: chart_json.rangeArray[0].row,\r\n                        column: [col_s, col_e],\r\n                    };\r\n                }\r\n            } else if ($id == \"luckysheet-chart-rangeShow-coltitle\") {\r\n                //行\r\n                var row_s =\r\n                    chartInfo.chart_selection.rangeMoveIndex[0] - chartInfo.chart_selection.rangeMovexy[0] + row_index;\r\n                if (rangeRowCheck.exits) {\r\n                    if (row_s < st_r + rangeRowCheck.range[1] + 1 || y < 0) {\r\n                        row_s = st_r + rangeRowCheck.range[1] + 1;\r\n                    }\r\n                } else {\r\n                    if (row_s < 0 || y < 0) {\r\n                        row_s = 0;\r\n                    }\r\n                }\r\n\r\n                //更新\r\n                var row_e = rangeSplitArray.coltitle.row[1] - rangeSplitArray.coltitle.row[0] + row_s;\r\n\r\n                if (row_e >= visibledatarow.length - 1 || y > winH) {\r\n                    row_s =\r\n                        visibledatarow.length - 1 - rangeSplitArray.coltitle.row[1] + rangeSplitArray.coltitle.row[0];\r\n                    row_e = visibledatarow.length - 1;\r\n                }\r\n\r\n                if (rangeRowCheck.exits) {\r\n                    chart_json.rangeArray = [{ row: [st_r, row_e], column: chart_json.rangeArray[0].column }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [st_r, row_e],\r\n                        column: chart_json.rangeArray[0].column,\r\n                    };\r\n\r\n                    chart_json.rangeSplitArray.coltitle = {\r\n                        row: [row_s - st_r, row_e - st_r],\r\n                        column: chart_json.rangeSplitArray.coltitle.column,\r\n                    };\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: [row_s - st_r, row_e - st_r],\r\n                        column: chart_json.rangeSplitArray.content.column,\r\n                    };\r\n                } else {\r\n                    chart_json.rangeArray = [{ row: [row_s, row_e], column: chart_json.rangeArray[0].column }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [row_s, row_e],\r\n                        column: chart_json.rangeArray[0].column,\r\n                    };\r\n                }\r\n            }\r\n\r\n            chartInfo.chart_selection.create();\r\n        },\r\n        rangeMoveDragged: function() {\r\n            chartInfo.chart_selection.rangeMove = false;\r\n\r\n            var updateJson = chartInfo.currentChart;\r\n\r\n            updateJson.rangeTxt = getRangetxt(\r\n                chartInfo.currentSheetIndex,\r\n                updateJson.rangeArray[0],\r\n                chartInfo.currentSheetIndex,\r\n            );\r\n            updateJson.chartData = getdatabyselection(updateJson.rangeArray[0], chartInfo.currentSheetIndex);\r\n            // 渲染\r\n            chartInfo.changeChartRange(\r\n                updateJson.chart_id,\r\n                updateJson.chartData,\r\n                updateJson.rangeArray,\r\n                updateJson.rangeTxt,\r\n            );\r\n        },\r\n        rangeResize: false,\r\n        rangeResizexy: null,\r\n        rangeResizeIndex: null,\r\n        rangeResizeObj: null,\r\n        rangeResizeDraging: function(event, sheetBarHeight, statisticBarHeight) {\r\n            var chart_json = chartInfo.currentChart;\r\n\r\n            var st_r = chart_json.rangeArray[0].row[0];\r\n            var st_c = chart_json.rangeArray[0].column[0];\r\n            var rangeRowCheck = chart_json.rangeRowCheck;\r\n            var rangeColCheck = chart_json.rangeColCheck;\r\n            var rangeSplitArray = chart_json.rangeSplitArray;\r\n\r\n            var mouse = mouseposition(event.pageX, event.pageY);\r\n            var scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            var scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n            var x = mouse[0] + scrollLeft;\r\n            var y = mouse[1] + scrollTop;\r\n\r\n            var winH = $(window).height() + scrollTop - sheetBarHeight - statisticBarHeight,\r\n                winW = $(window).width() + scrollLeft;\r\n\r\n            var rowLocation = _rowLocation(y),\r\n                row_index = rowLocation[2];\r\n            var colLocation = _colLocation(x),\r\n                col_index = colLocation[2];\r\n\r\n            var visibledatarow = getvisibledatarow();\r\n            var visibledatacolumn = getvisibledatacolumn();\r\n\r\n            var $id = chartInfo.chart_selection.rangeResizeObj.attr(\"id\");\r\n\r\n            if ($id == \"luckysheet-chart-rangeShow-content\") {\r\n                var r1, r2, c1, c2;\r\n\r\n                if (chartInfo.chart_selection.rangeResize == \"lt\") {\r\n                    r1 = chartInfo.chart_selection.rangeResizeIndex.row[0];\r\n                    c1 = chartInfo.chart_selection.rangeResizeIndex.column[0];\r\n\r\n                    r2 = chartInfo.chart_selection.rangeResizeIndex.row[1];\r\n                    c2 = chartInfo.chart_selection.rangeResizeIndex.column[1];\r\n                } else if (chartInfo.chart_selection.rangeResize == \"lb\") {\r\n                    r1 = chartInfo.chart_selection.rangeResizeIndex.row[1];\r\n                    c1 = chartInfo.chart_selection.rangeResizeIndex.column[0];\r\n\r\n                    r2 = chartInfo.chart_selection.rangeResizeIndex.row[0];\r\n                    c2 = chartInfo.chart_selection.rangeResizeIndex.column[1];\r\n                } else if (chartInfo.chart_selection.rangeResize == \"rt\") {\r\n                    r1 = chartInfo.chart_selection.rangeResizeIndex.row[0];\r\n                    c1 = chartInfo.chart_selection.rangeResizeIndex.column[1];\r\n\r\n                    r2 = chartInfo.chart_selection.rangeResizeIndex.row[1];\r\n                    c2 = chartInfo.chart_selection.rangeResizeIndex.column[0];\r\n                } else if (chartInfo.chart_selection.rangeResize == \"rb\") {\r\n                    r1 = chartInfo.chart_selection.rangeResizeIndex.row[1];\r\n                    c1 = chartInfo.chart_selection.rangeResizeIndex.column[1];\r\n\r\n                    r2 = chartInfo.chart_selection.rangeResizeIndex.row[0];\r\n                    c2 = chartInfo.chart_selection.rangeResizeIndex.column[0];\r\n                }\r\n\r\n                //行\r\n                if (rangeRowCheck.exits) {\r\n                    var row_s = r1 - chartInfo.chart_selection.rangeResizexy[0] + row_index;\r\n\r\n                    if (row_s < st_r + rangeRowCheck.range[1] + 1 || y < 0) {\r\n                        row_s = st_r + rangeRowCheck.range[1] + 1;\r\n                    } else if (row_s >= visibledatarow.length - 1 || y > winH) {\r\n                        row_s = visibledatarow.length - 1;\r\n                    }\r\n                } else {\r\n                    var row_s = st_r - chartInfo.chart_selection.rangeResizexy[0] + row_index;\r\n\r\n                    if (row_s < 0 || y < 0) {\r\n                        row_s = 0;\r\n                    } else if (row_s >= visibledatarow.length - 1 || y > winH) {\r\n                        row_s = visibledatarow.length - 1;\r\n                    }\r\n                }\r\n\r\n                //列\r\n                if (rangeColCheck.exits) {\r\n                    var col_s = c1 - chartInfo.chart_selection.rangeResizexy[1] + col_index;\r\n\r\n                    if (col_s < st_c + rangeColCheck.range[1] + 1 || x < 0) {\r\n                        col_s = st_c + rangeColCheck.range[1] + 1;\r\n                    } else if (col_s >= visibledatacolumn.length - 1 || x > winW) {\r\n                        col_s = visibledatacolumn.length - 1;\r\n                    }\r\n                } else {\r\n                    var col_s = st_c - chartInfo.chart_selection.rangeResizexy[1] + col_index;\r\n\r\n                    if (col_s < 0 || x < 0) {\r\n                        col_s = 0;\r\n                    } else if (col_s >= visibledatacolumn.length - 1 || x > winW) {\r\n                        col_s = visibledatacolumn.length - 1;\r\n                    }\r\n                }\r\n\r\n                var obj_r1, obj_r2, obj_c1, obj_c2;\r\n\r\n                if (row_s > r2) {\r\n                    obj_r1 = r2;\r\n                    obj_r2 = row_s;\r\n                } else {\r\n                    obj_r1 = row_s;\r\n                    obj_r2 = r2;\r\n                }\r\n\r\n                if (col_s > c2) {\r\n                    obj_c1 = c2;\r\n                    obj_c2 = col_s;\r\n                } else {\r\n                    obj_c1 = col_s;\r\n                    obj_c2 = c2;\r\n                }\r\n\r\n                if (!rangeRowCheck.exits && !rangeColCheck.exits) {\r\n                    chart_json.rangeArray = [{ row: [obj_r1, obj_r2], column: [obj_c1, obj_c2] }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [obj_r1, obj_r2],\r\n                        column: [obj_c1, obj_c2],\r\n                    };\r\n                } else {\r\n                    chart_json.rangeArray = [{ row: [st_r, obj_r2], column: [st_c, obj_c2] }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [st_r, obj_r2],\r\n                        column: [st_c, obj_c2],\r\n                    };\r\n\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: [obj_r1 - st_r, obj_r2 - st_r],\r\n                        column: [obj_c1 - st_c, obj_c2 - st_c],\r\n                    };\r\n\r\n                    if (rangeRowCheck.exits) {\r\n                        chart_json.rangeSplitArray.rowtitle = {\r\n                            row: chart_json.rangeSplitArray.rowtitle.row,\r\n                            column: [obj_c1 - st_c, obj_c2 - st_c],\r\n                        };\r\n                    }\r\n\r\n                    if (rangeColCheck.exits) {\r\n                        chart_json.rangeSplitArray.coltitle = {\r\n                            row: [obj_r1 - st_r, obj_r2 - st_r],\r\n                            column: chart_json.rangeSplitArray.coltitle.column,\r\n                        };\r\n                    }\r\n                }\r\n            } else if ($id == \"luckysheet-chart-rangeShow-rowtitle\") {\r\n                var c1, c2;\r\n\r\n                if (chartInfo.chart_selection.rangeResize == \"lt\" || chartInfo.chart_selection.rangeResize == \"lb\") {\r\n                    c1 = chartInfo.chart_selection.rangeResizeIndex.column[0];\r\n                    c2 = chartInfo.chart_selection.rangeResizeIndex.column[1];\r\n                } else if (\r\n                    chartInfo.chart_selection.rangeResize == \"rt\" ||\r\n                    chartInfo.chart_selection.rangeResize == \"rb\"\r\n                ) {\r\n                    c1 = chartInfo.chart_selection.rangeResizeIndex.column[1];\r\n                    c2 = chartInfo.chart_selection.rangeResizeIndex.column[0];\r\n                }\r\n\r\n                //列\r\n                if (rangeColCheck.exits) {\r\n                    var col_s = c1 - chartInfo.chart_selection.rangeResizexy[1] + col_index;\r\n\r\n                    if (col_s < st_c + rangeColCheck.range[1] + 1 || x < 0) {\r\n                        col_s = st_c + rangeColCheck.range[1] + 1;\r\n                    } else if (col_s >= visibledatacolumn.length - 1 || x > winW) {\r\n                        col_s = visibledatacolumn.length - 1;\r\n                    }\r\n                } else {\r\n                    var col_s = st_c - chartInfo.chart_selection.rangeResizexy[1] + col_index;\r\n\r\n                    if (col_s < 0 || x < 0) {\r\n                        col_s = 0;\r\n                    } else if (col_s >= visibledatacolumn.length - 1 || x > winW) {\r\n                        col_s = visibledatacolumn.length - 1;\r\n                    }\r\n                }\r\n\r\n                var obj_c1, obj_c2;\r\n\r\n                if (col_s > c2) {\r\n                    obj_c1 = c2;\r\n                    obj_c2 = col_s;\r\n                } else {\r\n                    obj_c1 = col_s;\r\n                    obj_c2 = c2;\r\n                }\r\n\r\n                //更新\r\n                if (!rangeColCheck.exits) {\r\n                    chart_json.rangeArray = [{ row: chart_json.rangeArray[0].row, column: [obj_c1, obj_c2] }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: chart_json.rangeArray[0].row,\r\n                        column: [obj_c1, obj_c2],\r\n                    };\r\n                } else {\r\n                    chart_json.rangeArray = [{ row: chart_json.rangeArray[0].row, column: [st_c, obj_c2] }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: chart_json.rangeArray[0].row,\r\n                        column: [st_c, obj_c2],\r\n                    };\r\n\r\n                    chart_json.rangeSplitArray.rowtitle = {\r\n                        row: chart_json.rangeSplitArray.rowtitle.row,\r\n                        column: [obj_c1 - st_c, obj_c2 - st_c],\r\n                    };\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: chart_json.rangeSplitArray.content.row,\r\n                        column: [obj_c1 - st_c, obj_c2 - st_c],\r\n                    };\r\n                }\r\n            } else if ($id == \"luckysheet-chart-rangeShow-coltitle\") {\r\n                var r1, r2;\r\n\r\n                if (chartInfo.chart_selection.rangeResize == \"lt\" || chartInfo.chart_selection.rangeResize == \"rt\") {\r\n                    r1 = chartInfo.chart_selection.rangeResizeIndex.row[0];\r\n                    r2 = chartInfo.chart_selection.rangeResizeIndex.row[1];\r\n                } else if (\r\n                    chartInfo.chart_selection.rangeResize == \"lb\" ||\r\n                    chartInfo.chart_selection.rangeResize == \"rb\"\r\n                ) {\r\n                    r1 = chartInfo.chart_selection.rangeResizeIndex.row[1];\r\n                    r2 = chartInfo.chart_selection.rangeResizeIndex.row[0];\r\n                }\r\n\r\n                //行\r\n                if (rangeRowCheck.exits) {\r\n                    var row_s = r1 - chartInfo.chart_selection.rangeResizexy[0] + row_index;\r\n\r\n                    if (row_s < st_r + rangeRowCheck.range[1] + 1 || y < 0) {\r\n                        row_s = st_r + rangeRowCheck.range[1] + 1;\r\n                    } else if (row_s >= visibledatarow.length - 1 || y > winH) {\r\n                        row_s = visibledatarow.length - 1;\r\n                    }\r\n                } else {\r\n                    var row_s = st_r - chartInfo.chart_selection.rangeResizexy[0] + row_index;\r\n\r\n                    if (row_s < 0 || y < 0) {\r\n                        row_s = 0;\r\n                    } else if (row_s >= visibledatarow.length - 1 || y > winH) {\r\n                        row_s = visibledatarow.length - 1;\r\n                    }\r\n                }\r\n\r\n                var obj_r1, obj_r2;\r\n\r\n                if (row_s > r2) {\r\n                    obj_r1 = r2;\r\n                    obj_r2 = row_s;\r\n                } else {\r\n                    obj_r1 = row_s;\r\n                    obj_r2 = r2;\r\n                }\r\n\r\n                //更新\r\n                if (!rangeRowCheck.exits) {\r\n                    chart_json.rangeArray = [{ row: [obj_r1, obj_r2], column: chart_json.rangeArray[0].column }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [obj_r1, obj_r2],\r\n                        column: chart_json.rangeArray[0].column,\r\n                    };\r\n                } else {\r\n                    chart_json.rangeArray = [{ row: [st_r, obj_r2], column: chart_json.rangeArray[0].column }];\r\n                    chart_json.rangeSplitArray.range = {\r\n                        row: [st_r, obj_r2],\r\n                        column: chart_json.rangeArray[0].column,\r\n                    };\r\n\r\n                    chart_json.rangeSplitArray.coltitle = {\r\n                        row: [obj_r1 - st_r, obj_r2 - st_r],\r\n                        column: chart_json.rangeSplitArray.coltitle.column,\r\n                    };\r\n                    chart_json.rangeSplitArray.content = {\r\n                        row: [obj_r1 - st_r, obj_r2 - st_r],\r\n                        column: chart_json.rangeSplitArray.content.column,\r\n                    };\r\n                }\r\n            }\r\n\r\n            chartInfo.chart_selection.create();\r\n        },\r\n        rangeResizeDragged: function() {\r\n            chartInfo.chart_selection.rangeResize = null;\r\n            var updateJson = chartInfo.currentChart;\r\n\r\n            updateJson.rangeTxt = getRangetxt(\r\n                chartInfo.currentSheetIndex,\r\n                updateJson.rangeArray[0],\r\n                chartInfo.currentSheetIndex,\r\n            );\r\n            updateJson.chartData = getdatabyselection(updateJson.rangeArray[0], chartInfo.currentSheetIndex);\r\n            // 渲染\r\n            chartInfo.changeChartRange(\r\n                updateJson.chart_id,\r\n                updateJson.chartData,\r\n                updateJson.rangeArray,\r\n                updateJson.rangeTxt,\r\n            );\r\n        },\r\n    };\r\n}\r\n\r\n// create chart\r\nfunction createLuckyChart(width, height, left, top) {\r\n    //如果只选中一个单元格，则自动填充选取\r\n    var jfgird_select_save = luckysheet.getluckysheet_select_save();\r\n    if (\r\n        jfgird_select_save.length == 1 &&\r\n        jfgird_select_save[0].row[0] == jfgird_select_save[0].row[1] &&\r\n        jfgird_select_save[0].column[0] == jfgird_select_save[0].column[1]\r\n    ) {\r\n        luckysheetMoveHighlightRange2(\"right\", \"rangeOfSelect\");\r\n\r\n        luckysheetMoveHighlightRange2(\"down\", \"rangeOfSelect\");\r\n\r\n        jfgird_select_save = luckysheet.getluckysheet_select_save();\r\n    }\r\n    //处理右边的空白单元格，自动略过并修改选区 ---------------start\r\n    var shiftpositon_row = -1;\r\n\r\n    var row_ed = jfgird_select_save[0][\"row\"][1] - jfgird_select_save[0][\"row\"][0];\r\n    for (var r = jfgird_select_save[0][\"row\"][0]; r <= jfgird_select_save[0][\"row\"][1]; r++) {\r\n        for (var c = jfgird_select_save[0][\"column\"][0]; c <= jfgird_select_save[0][\"column\"][1]; c++) {\r\n            var value = getcellvalue(r, c, luckysheet.flowdata());\r\n            //console.log(\"value,r,c\",value,r,c);\r\n            if (value != null && value.toString().length > 0) {\r\n                shiftpositon_row = r;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (shiftpositon_row !== -1) {\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (shiftpositon_row == -1) {\r\n        shiftpositon_row = 0;\r\n    }\r\n\r\n    jfgird_select_save[0][\"row\"] = [shiftpositon_row, shiftpositon_row];\r\n    jfgird_select_save[0].row_focus = shiftpositon_row;\r\n    luckysheet.setluckysheet_select_save(jfgird_select_save);\r\n\r\n    chartInfo.luckysheet_shiftpositon = $.extend(true, {}, jfgird_select_save[0]);\r\n    luckysheetMoveEndCell(\"down\", \"range\", false, row_ed);\r\n    jfgird_select_save = luckysheet.getluckysheet_select_save();\r\n\r\n    var shiftpositon_col = -1;\r\n    var column_ed = jfgird_select_save[0][\"column\"][1] - jfgird_select_save[0][\"column\"][0];\r\n    for (var c = jfgird_select_save[0][\"column\"][0]; c <= jfgird_select_save[0][\"column\"][1]; c++) {\r\n        for (var r = jfgird_select_save[0][\"row\"][0]; r <= jfgird_select_save[0][\"row\"][1]; r++) {\r\n            var value = getcellvalue(r, c, luckysheet.flowdata());\r\n            if (value != null && value.toString().length > 0) {\r\n                shiftpositon_col = c;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (shiftpositon_col !== -1) {\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (shiftpositon_col == -1) {\r\n        shiftpositon_col = 0;\r\n    }\r\n\r\n    jfgird_select_save[0][\"column\"] = [shiftpositon_col, shiftpositon_col];\r\n    jfgird_select_save[0].column_focus = shiftpositon_col;\r\n    luckysheet.setluckysheet_select_save(jfgird_select_save);\r\n\r\n    chartInfo.luckysheet_shiftpositon = $.extend(true, {}, jfgird_select_save[0]);\r\n    luckysheetMoveEndCell(\"right\", \"range\", false, column_ed);\r\n    jfgird_select_save = luckysheet.getluckysheet_select_save();\r\n\r\n    var rangeArray = $.extend(true, [], jfgird_select_save);\r\n\r\n    var rangeTxt = getRangetxt(chartInfo.currentSheetIndex, rangeArray[0], chartInfo.currentSheetIndex);\r\n\r\n    let chartData = getdatabyselection();\r\n    console.dir(chartData);\r\n\r\n    let chart_id = generateRandomKey(\"chart\");\r\n\r\n    let chart_id_c = chart_id + \"_c\";\r\n\r\n    let modelChartShowHTML =\r\n        '<div id=\"${id}\"class=\"luckysheet-modal-dialog luckysheet-modal-dialog-chart ${addclass}\"tabindex=\"0\"role=\"dialog\"aria-labelledby=\":41e\"dir=\"ltr\"><div class=\"luckysheet-modal-dialog-resize\"><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lt\"data-type=\"lt\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mt\"data-type=\"mt\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lm\"data-type=\"lm\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rm\"data-type=\"rm\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rt\"data-type=\"rt\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-lb\"data-type=\"lb\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-mb\"data-type=\"mb\"></div><div class=\"luckysheet-modal-dialog-resize-item luckysheet-modal-dialog-resize-item-rb\"data-type=\"rb\"></div></div><div class=\"luckysheet-modal-dialog-controll\"><span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-update\"role=\"button\"tabindex=\"0\"aria-label=\"修改图表\"title=\"修改图表\"><i class=\"fa fa-pencil\"aria-hidden=\"true\"></i></span><span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-max\"role=\"butluckysheet_chartIns_indexton\"tabindex=\"0\"aria-label=\"最大化\"title=\"最大化\"><i class=\"fa fa-window-maximize\"aria-hidden=\"true\"></i></span><span class=\"luckysheet-modal-controll-btn luckysheet-modal-controll-del\"role=\"button\"tabindex=\"0\"aria-label=\"删除\"title=\"删除\"><i class=\"fa fa-trash\"aria-hidden=\"true\"></i></span></div><div class=\"luckysheet-modal-dialog-content\">${content}</div></div>';\r\n\r\n    let $t = $(\r\n        replaceHtml(modelChartShowHTML, {\r\n            id: chart_id_c,\r\n            addclass: \"luckysheet-data-visualization-chart\",\r\n            title: \"图表生成\",\r\n            content: \"\",\r\n        }),\r\n    ).appendTo($(\".luckysheet-cell-main\"));\r\n\r\n    let container = document.getElementById(chart_id_c);\r\n\r\n    let { render, chart_json } = chartInfo.createChart(\r\n        $(`#${chart_id_c}`).children(\".luckysheet-modal-dialog-content\")[0],\r\n        chartData,\r\n        chart_id,\r\n        rangeArray,\r\n        rangeTxt,\r\n    );\r\n    // chartInfo.currentChart = chart_json.chartOptions\r\n    // console.dir(JSON.stringify(chart_json));\r\n\r\n    width = width ? width : 400;\r\n    height = height ? height : 250;\r\n    left = left ? left : 0;\r\n    top = top ? top : 0;\r\n    container.style.width = width + \"px\";\r\n    container.style.height = height + \"px\";\r\n    container.style.position = \"absolute\";\r\n    container.style.background = \"#fff\";\r\n    container.style.left = left + \"px\";\r\n    container.style.top = top + \"px\";\r\n    render.style.width = \"100%\";\r\n    render.style.height = \"100%\";\r\n    container.style.zIndex = chartInfo.zIndex ? chartInfo.zIndex : 15;\r\n    chartInfo.zIndex++;\r\n\r\n    // insert chartinfo\r\n    let sheetFile = chartInfo.luckysheetfile[getSheetIndex(chartInfo.currentSheetIndex)];\r\n\r\n    if (!sheetFile.chart) {\r\n        sheetFile.chart = [];\r\n    }\r\n    sheetFile.chart.push({\r\n        chart_id,\r\n        width,\r\n        height,\r\n        left,\r\n        top,\r\n        chartOptions: chart_json.chartOptions,\r\n        sheetIndex: sheetFile.index,\r\n    });\r\n\r\n    //处理区域高亮框参数，当前页中，只有当前的图表的needRangShow为true,其他为false\r\n    showNeedRangeShow(chart_id);\r\n\r\n    // delete current chart\r\n    $(`#${chart_id}_c .luckysheet-modal-controll-del`).click(function(e) {\r\n        delChart(chart_id);\r\n    });\r\n\r\n    setChartMoveableEffect($t);\r\n\r\n    // edit current chart\r\n    $(`#${chart_id}_c .luckysheet-modal-controll-update`).click(function(e) {\r\n        showChartSettingComponent();\r\n    });\r\n\r\n    $t.children(\".luckysheet-modal-dialog-content\").mousedown(function(e) {\r\n        if (!chartInfo.chartparam.luckysheetCurrentChartMaxState) {\r\n            //当前图表显示区域高亮\r\n            showNeedRangeShow(chart_id);\r\n        }\r\n        e.stopPropagation();\r\n    });\r\n    $t.mousedown(function(e) {\r\n        //move chart\r\n\r\n        if (!chartInfo.chartparam.luckysheetCurrentChartMaxState) {\r\n            //当前图表显示区域高亮\r\n            showNeedRangeShow(chart_id);\r\n            setluckysheet_scroll_status(true);\r\n\r\n            //允许拖动渲染框\r\n            if (\r\n                !$(e.target).is(\".luckysheet-modal-dialog-controll\") &&\r\n                !$(e.target).is(\".luckysheet-modal-controll-btn\") &&\r\n                !$(e.target).is(\"i\")\r\n            ) {\r\n                // Debounce\r\n                chartInfo.chartparam.luckysheetCurrentChartMoveTimeout = setTimeout(function() {\r\n                    chartInfo.chartparam.luckysheetCurrentChartMove = true;\r\n                }, 100);\r\n            }\r\n\r\n            var toffset = chartInfo.chartparam.luckysheetCurrentChartMoveObj.offset();\r\n            var tpsition = chartInfo.chartparam.luckysheetCurrentChartMoveObj.position();\r\n            //luckysheetCurrentChartMoveXy: [鼠标点相对chart框的距离X方向，鼠标点相对chart框的距离Y方向，chart框相对cell-main的距离X方向，chart框相对cell-main的距离Y方向，水平滚动条的位置，垂直滚动条的位置]\r\n            chartInfo.chartparam.luckysheetCurrentChartMoveXy = [\r\n                e.pageX - toffset.left,\r\n                e.pageY - toffset.top,\r\n                tpsition.left,\r\n                tpsition.top,\r\n                $(\"#luckysheet-scrollbar-x\").scrollLeft(),\r\n                $(\"#luckysheet-scrollbar-y\").scrollTop(),\r\n            ];\r\n            chartInfo.chartparam.luckysheetCurrentChartMoveWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n            chartInfo.chartparam.luckysheetCurrentChartMoveWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n\r\n            if (\r\n                !$(e.target).hasClass(\"luckysheet-mousedown-cancel\") &&\r\n                $(e.target).filter(\"[class*='sp-palette']\").length == 0 &&\r\n                $(e.target).filter(\"[class*='sp-thumb']\").length == 0 &&\r\n                $(e.target).filter(\"[class*='sp-']\").length == 0\r\n            ) {\r\n                $(\"#luckysheet-rightclick-menu\").hide();\r\n                $(\"#luckysheet-cols-h-hover\").hide();\r\n                $(\"#luckysheet-cols-menu-btn\").hide();\r\n                $(\"#luckysheet-rightclick-menu\").hide();\r\n                $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu, #luckysheet-user-menu\").hide();\r\n                $(\r\n                    \"body > .luckysheet-filter-menu, body > .luckysheet-filter-submenu, body > .luckysheet-cols-menu\",\r\n                ).hide();\r\n            }\r\n\r\n            e.stopPropagation();\r\n        }\r\n    })\r\n        .find(\".luckysheet-modal-dialog-resize-item\")\r\n        .mousedown(function(e) {\r\n            if (chartInfo.chartparam.luckysheetCurrentChartActive) {\r\n                chartInfo.chartparam.luckysheetCurrentChartResize = $(this).data(\"type\"); //开始状态resize\r\n\r\n                var mouse = mouseposition(e.pageX, e.pageY),\r\n                    scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft(),\r\n                    scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n                var x = mouse[0] + scrollLeft;\r\n                var y = mouse[1] + scrollTop;\r\n                var position = chartInfo.chartparam.luckysheetCurrentChartResizeObj.position();\r\n                //参数：x,y:鼠标位置，$t.width(), $t.height(): chart框宽高， position.left + scrollLeft, position.top + scrollTop ：chart框位置 ，scrollLeft, scrollTop：滚动条位置\r\n                chartInfo.chartparam.luckysheetCurrentChartResizeXy = [\r\n                    x,\r\n                    y,\r\n                    $t.width(),\r\n                    $t.height(),\r\n                    position.left + scrollLeft,\r\n                    position.top + scrollTop,\r\n                    scrollLeft,\r\n                    scrollTop,\r\n                ];\r\n                chartInfo.chartparam.luckysheetCurrentChartResizeWinH = $(\"#luckysheet-cell-main\")[0].scrollHeight;\r\n                chartInfo.chartparam.luckysheetCurrentChartResizeWinW = $(\"#luckysheet-cell-main\")[0].scrollWidth;\r\n\r\n                chartInfo.chartparam.luckysheetCurrentChart = chart_id;\r\n\r\n                e.stopPropagation();\r\n            }\r\n        });\r\n\r\n    // 将图表的坐标信息更新到sheetFile中\r\n    $(`#${chart_id}_c`).mouseup(function(e) {\r\n        const w = $(this).css(\"width\");\r\n        const h = $(this).css(\"height\");\r\n        const t = $(this).css(\"top\");\r\n        const l = $(this).css(\"left\");\r\n\r\n        // insert chartinfo\r\n        let sheetFile = chartInfo.luckysheetfile[getSheetIndex(chartInfo.currentSheetIndex)];\r\n\r\n        if (!sheetFile.chart) {\r\n            sheetFile.chart = [];\r\n        }\r\n\r\n        sheetFile.chart.forEach((item) => {\r\n            if (item.chart_id === chart_id) {\r\n                item.width = parseFloat(w);\r\n                item.height = parseFloat(h);\r\n                item.left = parseFloat(l);\r\n                item.top = parseFloat(t);\r\n            }\r\n        });\r\n    });\r\n}\r\n\r\n/**\r\n * 设置图表可拖动区域高亮效果，鼠标经过可拖动区域时鼠标显示“十字”，不可拖动区域显示箭头\r\n * @param {JQuery} $container 图表的容器DIV\r\n */\r\nfunction setChartMoveableEffect($container) {\r\n    $container.find(\".luckysheet-modal-dialog-content\").hover(\r\n        function() {\r\n            $container.removeClass(\"chart-moveable\");\r\n        },\r\n        function() {\r\n            $container.addClass(\"chart-moveable\");\r\n        },\r\n    );\r\n\r\n    $container.hover(\r\n        function() {\r\n            $container.addClass(\"chart-moveable\");\r\n        },\r\n        function() {\r\n            $container.removeClass(\"chart-moveable\");\r\n        },\r\n    );\r\n}\r\n// delete chart\r\nfunction delChart(chart_id) {\r\n    // delete container\r\n    $(`.luckysheet-cell-main #${chart_id}_c`).remove();\r\n\r\n    // Hide selected range\r\n    hideAllNeedRangeShow();\r\n\r\n    // delete storage\r\n    let sheetFile = chartInfo.luckysheetfile[getSheetIndex(chartInfo.currentSheetIndex)];\r\n    let index = sheetFile.chart.findIndex((item) => item.chart_id == chart_id);\r\n    sheetFile.chart.splice(index, 1);\r\n    // api call\r\n    chartInfo.deleteChart(chart_id);\r\n}\r\n\r\n//设置某个图表的高亮区域状态为显示,处理当前页的所有图表，只取一个图表设置为显示，其他隐藏，其他页不管\r\nfunction showNeedRangeShow(chart_id) {\r\n    let chartLists = chartInfo.luckysheetfile[getSheetIndex(chartInfo.currentSheetIndex)].chart;\r\n\r\n    for (let chartId in chartLists) {\r\n        // if (chartLists[chartId].sheetIndex == chartInfo.currentSheetIndex) {\r\n        //当前sheet的图表先设置为false\r\n        chartLists[chartId].needRangeShow = false;\r\n        if (chartLists[chartId].chart_id == chart_id) {\r\n            chartLists[chartId].needRangeShow = true;\r\n\r\n            chartInfo.currentChart = chartInfo.getChartJson(chart_id);\r\n        }\r\n        // }\r\n    }\r\n\r\n    //操作DOM当前图表选择区域高亮\r\n    selectRangeBorderShow(chart_id);\r\n}\r\n//隐藏当前sheet所有的图表高亮区域\r\nfunction hideAllNeedRangeShow() {\r\n    let chartLists = chartInfo.luckysheetfile[getSheetIndex(chartInfo.currentSheetIndex)].chart;\r\n    for (let chartId in chartLists) {\r\n        // if (chartLists[chartId].sheetIndex == chartInfo.currentSheetIndex) {\r\n        //当前sheet的图表设置为false\r\n        chartLists[chartId].needRangeShow = false;\r\n        // }\r\n    }\r\n\r\n    //操作DOM 当前图表选择区域隐藏\r\n    selectRangeBorderHide();\r\n}\r\n\r\n//选择区域高亮\r\nfunction selectRangeBorderShow(chart_id) {\r\n    let $t = $(\"#\" + chart_id + \"_c\");\r\n\r\n    // Highlight of data range\r\n    chartInfo.chart_selection.create();\r\n\r\n    chartInfo.chartparam.luckysheetCurrentChartActive = true;\r\n    chartInfo.chartparam.luckysheetCurrentChartMoveObj = $t;\r\n    chartInfo.chartparam.luckysheetCurrentChartResizeObj = $t;\r\n    chartInfo.chartparam.luckysheetCurrentChart = chart_id;\r\n\r\n    //luckysheet取cell-main，后续扩展到其他的用户自定义元素\r\n    $(\"#luckysheet-cell-main\")\r\n        .find(\".luckysheet-modal-dialog-chart .luckysheet-modal-dialog-resize\")\r\n        .hide();\r\n    $(\"#luckysheet-cell-main\")\r\n        .find(\".luckysheet-modal-dialog-chart .luckysheet-modal-dialog-controll\")\r\n        .hide();\r\n\r\n    $t.css(\"z-index\", chartInfo.chartparam.luckysheetCurrentChartZIndexRank++);\r\n    $t.find(\".luckysheet-modal-dialog-resize\").show();\r\n    $t.find(\".luckysheet-modal-dialog-controll\").show();\r\n\r\n    if (\r\n        ($(\".chartSetting\").is(\":visible\") || chartInfo.chartparam.luckysheet_chart_redo_click) &&\r\n        chart_id != chartInfo.chartparam.luckysheetCurrentChart\r\n    ) {\r\n        // TODO: 第一次创建图表时候需要初始化数据选择框 qkSelection\r\n        // generator.ini(chartMixConfig)\r\n        $(\"body .luckysheet-cols-menu\").hide();\r\n    }\r\n\r\n    // 切换到当前图表设置项\r\n    chartInfo.currentChart = chartInfo.highlightChart(chart_id);\r\n}\r\n\r\n//选择区域高亮隐藏\r\nfunction selectRangeBorderHide(settingShow) {\r\n    $(\r\n        \"#luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-resize, #luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-controll\",\r\n    ).hide();\r\n    $(\"#luckysheet-cell-main\")\r\n        .find(\".luckysheet-datavisual-selection-set div\")\r\n        .remove();\r\n    chartInfo.chartparam.luckysheetCurrentChartActive = false;\r\n\r\n    $(\"#luckysheet-chart-rangeShow\").empty();\r\n\r\n    //标识：是否处理设置界面\r\n    if (!settingShow && $(\".chartSetting\").is(\":visible\") && !isEditMode()) {\r\n        hideChartSettingComponent();\r\n    }\r\n}\r\n\r\n// 显示图表设置界面\r\nfunction showChartSettingComponent(refresh, chart_id) {\r\n    if (!$(\".chartSetting\").is(\":visible\")) {\r\n        //隐藏设置界面\r\n        $(\".chartSetting\").show();\r\n\r\n        $(\"#luckysheet-cell-main\")\r\n            .find(\".luckysheet-datavisual-selection-set div\")\r\n            .show();\r\n        chartInfo.chartparam.luckysheetCurrentChartActive = true;\r\n        setTimeout(function() {\r\n            luckysheetsizeauto();\r\n        }, 0);\r\n    }\r\n}\r\n\r\n// 隐藏图表设置界面\r\nfunction hideChartSettingComponent(refresh) {\r\n    if ($(\".chartSetting\").is(\":visible\")) {\r\n        //隐藏设置界面\r\n        $(\".chartSetting\").hide();\r\n        //.luckysheet-modal-dialog-resize为图表显示框的缩放框，.luckysheet-modal-dialog-controll为显示框右边的控制按钮\r\n        $(\r\n            \"#luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-resize, #luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-controll\",\r\n        ).hide();\r\n\r\n        $(\"#luckysheet-cell-main\")\r\n            .find(\".luckysheet-datavisual-selection-set div\")\r\n            .remove();\r\n\r\n        chartInfo.chartparam.luckysheetCurrentChartActive = false;\r\n        if (!isEditMode() && !refresh) {\r\n            setTimeout(function() {\r\n                luckysheetsizeauto();\r\n            }, 0);\r\n        }\r\n    }\r\n}\r\n\r\n// 隐藏其他sheet的图表，显示当前sheet的图表 chartMix 切换sheet页显示隐藏图表\r\nfunction renderChartShow(index) {\r\n    //传入index，图表显示隐藏\r\n    selectRangeBorderHide(\"true\"); //隐藏数据高亮区域，随意传入一个字符串，表示不处理chartSetting界面\r\n\r\n    const luckysheetfile = chartInfo.luckysheetfile;\r\n    luckysheetfile.forEach((file) => {\r\n        //切换当前页的所有图表都显示出来\r\n        if (file.index == index) {\r\n            const chartLists = file.chart || [];\r\n\r\n            chartLists.forEach((chart) => {\r\n                chart.isShow = true;\r\n                $(\"#\" + chart.chart_id + \"_c\").show();\r\n\r\n                chartInfo.resizeChart(chart.chart_id);\r\n\r\n                if (chart.needRangeShow == true) {\r\n                    //一个sheet页只有一个图表高亮显示,//重要！因为在store了做了存储，所以能在此处找到对应图表设置显示隐藏\r\n                    //操作DOM当前图表选择区域高亮\r\n                    chartInfo.currentChart = chartInfo.getChartJson(chart.chart_id);\r\n                    selectRangeBorderShow(chart.chart_id);\r\n                }\r\n            });\r\n        }\r\n\r\n        // 隐藏其他页的图表\r\n        else {\r\n            const chartLists = file.chart || [];\r\n\r\n            chartLists.forEach((chart) => {\r\n                chart.isShow = false;\r\n                $(\"#\" + chart.chart_id + \"_c\").hide();\r\n            });\r\n        }\r\n    });\r\n}\r\n\r\nexport { chart, createLuckyChart, hideAllNeedRangeShow, renderChartShow };\r\n"
  },
  {
    "path": "src/expendPlugins/exportXlsx/plugin.js",
    "content": "\r\nimport locale from '../../locale/locale';\r\nimport { modelHTML } from \"../../controllers/constant\";\r\nimport { arrayRemoveItem, replaceHtml } from '../../utils/util';\r\nimport tooltip from '../../global/tooltip';\r\nimport { getSheetIndex } from '../../methods/get';\r\nimport Store from '../../store';\r\n\r\n// Initialize the export xlsx api\r\nfunction exportXlsx(options, config, isDemo) {\r\n    arrayRemoveItem(Store.asyncLoad,'exportXlsx')\r\n}\r\n\r\nfunction downloadXlsx(data, filename) {\r\n    const blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });\r\n    const url = URL.createObjectURL(blob);\r\n    const link = document.createElement('a');\r\n    link.href = url;\r\n    link.download = filename;\r\n    link.click();\r\n    URL.revokeObjectURL(url);\r\n}\r\n\r\n/**\r\n * \r\n * @param {*} url \r\n * @param {*} success \r\n * @param {*} fail \r\n */\r\nfunction fetchAndDownloadXlsx({url,order}, success, fail) {\r\n    const luckyJson = luckysheet.toJson();\r\n    luckysheet.getAllChartsBase64((chartMap) => {\r\n        luckyJson.chartMap = chartMap\r\n        luckyJson.devicePixelRatio = window.devicePixelRatio\r\n        luckyJson.exportXlsx = {\r\n            order\r\n        }\r\n        fetch(url, {\r\n            method: 'POST',\r\n            headers: {\r\n                'Content-Type': 'application/json'\r\n            },\r\n            body: JSON.stringify(luckyJson)\r\n        })\r\n            .then((response) => response.blob())\r\n            .then((blob) => {\r\n                if (blob.type === \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\") {\r\n                    const filename = luckyJson.title + '.xlsx';\r\n                    downloadXlsx(blob, filename);\r\n                    success && success()\r\n                } else {\r\n                    fail && fail()\r\n                }\r\n\r\n            })\r\n            .catch((error) => {\r\n                console.error('fetch error:', error);\r\n                fail && fail()\r\n            });\r\n    })\r\n\r\n\r\n}\r\n\r\nfunction createExportDialog(url) {\r\n    $(\"#luckysheet-modal-dialog-mask\").hide();\r\n    var xlsxContainer = $(\"#luckysheet-export-xlsx\");\r\n\r\n    if (xlsxContainer.length === 0) {\r\n\r\n        const _locale = locale();\r\n        const locale_exportXlsx = _locale.exportXlsx;\r\n        const locale_button = _locale.button;\r\n\r\n        let content = `<div class=\"luckysheet-export-xlsx-content\" style=\"padding: 10px 10px 10px 0;\">\r\n                <span>${locale_exportXlsx.range}</span>\r\n                <select class=\"luckysheet-export-xlsx-select-area\">\r\n                    <option value=\"allSheets\" selected=\"selected\">${locale_exportXlsx.allSheets}</option>\r\n                    <option value=\"currentSheet\">${locale_exportXlsx.currentSheet}</option>\r\n                </select>\r\n        </div>`;\r\n\r\n        $(\"body\").append(\r\n            replaceHtml(modelHTML, {\r\n                id: \"luckysheet-export-xlsx\",\r\n                addclass: \"luckysheet-export-xlsx\",\r\n                title: locale_exportXlsx.title,\r\n                content: content,\r\n                botton: `<button class=\"btn btn-primary luckysheet-model-confirm-btn\">${locale_button.confirm}</button><button class=\"btn btn-default luckysheet-model-close-btn\">${locale_button.close}</button>`,\r\n                style: \"z-index:991\",\r\n                close: locale_button.close,\r\n            }),\r\n        );\r\n\r\n        selectedOption = 'allSheets'\r\n\r\n        // init event\r\n        $(\"#luckysheet-export-xlsx .luckysheet-model-confirm-btn\").on('click',()=>{\r\n            luckysheet.showLoadingProgress()\r\n\r\n            var order = 'all'\r\n            if(selectedOption === 'currentSheet'){\r\n                order = getSheetIndex(Store.currentSheetIndex)\r\n            }\r\n            fetchAndDownloadXlsx({url,order},()=>{\r\n                luckysheet.hideLoadingProgress()\r\n            },()=>{\r\n                luckysheet.hideLoadingProgress()\r\n                tooltip.info(_locale.exportXlsx.serverError, \"\");\r\n            })\r\n            $(\"#luckysheet-export-xlsx\").hide()\r\n        })\r\n\r\n        $(\"#luckysheet-export-xlsx .luckysheet-export-xlsx-select-area\").change(function() {\r\n            selectedOption = $(this).val();\r\n          });\r\n\r\n    }\r\n\r\n\r\n\r\n    let $t = $(\"#luckysheet-export-xlsx\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 350).end(),\r\n        myh = $t.outerHeight(),\r\n        myw = $t.outerWidth();\r\n    let winw = $(window).width(),\r\n        winh = $(window).height();\r\n    let scrollLeft = $(document).scrollLeft(),\r\n        scrollTop = $(document).scrollTop();\r\n    $(\"#luckysheet-export-xlsx\")\r\n        .css({ left: (winw + scrollLeft - myw) / 2, top: (winh + scrollTop - myh) / 3 })\r\n        .show();\r\n\r\n}\r\n\r\nexport { exportXlsx, downloadXlsx, fetchAndDownloadXlsx, createExportDialog }\r\n"
  },
  {
    "path": "src/expendPlugins/print/plugin.js",
    "content": "import { seriesLoadScripts, loadLinks, $$, arrayRemoveItem } from \"../../utils/util\";\r\nimport { luckysheetPrint } from \"./print\";\r\nimport Store from \"../../store\";\r\n\r\n// Dynamically load dependent scripts and styles\r\nconst dependScripts = [\r\n    // 'expendPlugins/chart/chartmix.umd.min.js',\r\n    // \"http://localhost:8080/luckysheetPluginPrint.umd.js\",\r\n];\r\n\r\nconst dependLinks = [\r\n    // 'expendPlugins/chart/chartmix.css',\r\n    // \"http://localhost:8080/luckysheetPluginPrint.css\",\r\n];\r\n\r\n// Initialize the chart component\r\nfunction print(options, config, isDemo) {\r\n    const data = options.data;\r\n    // loadLinks(dependLinks);\r\n\r\n    // seriesLoadScripts(dependScripts, null, function() {});\r\n    if (luckysheetPrint) {\r\n        arrayRemoveItem(Store.asyncLoad, \"print\");\r\n        Store.luckysheetPrint = luckysheetPrint;\r\n        const link = document.createElement(\"link\");\r\n        link.setAttribute(\"rel\", \"stylesheet\");\r\n        link.setAttribute(\"type\", \"text/css\");\r\n        link.setAttribute(\"href\", \"./expendPlugins/print/print.css\");\r\n        document.head.appendChild(link);\r\n    }\r\n}\r\n\r\nexport { print };\r\n"
  },
  {
    "path": "src/expendPlugins/print/print.css",
    "content": ".luckysheet-print span[role=\"heading\"] {\r\n    font-size: 30px;\r\n    font-weight: bold;\r\n}\r\n\r\n.luckysheet-print-suggest {\r\n    font-size: 12px;\r\n}\r\n\r\n.luckysheet-print-title {\r\n    font-weight: bold;\r\n    font-size: 18px;\r\n}\r\n\r\n.luckysheet-print-radio {\r\n    display: flex;\r\n}\r\n\r\n.luckysheet-print-radio > div {\r\n    width: 50%;\r\n}\r\n\r\n.luckysheet-print select {\r\n    height: 30px;\r\n}\r\n\r\n.luckysheet-print .luckysheet-modal-dialog-buttons {\r\n    display: flex;\r\n    flex-direction: row-reverse;\r\n}\r\n\r\n.luckysheet-print-box canvas {\r\n    display: block;\r\n}\r\n\r\n@media print {\r\n    :not(html, head, body, .luckysheet-print-preview, .luckysheet-print-preview *) {\r\n        display: none;\r\n    }\r\n    .luckysheet-print-break {\r\n        page-break-after: always;\r\n    }\r\n    #print-layout-options {\r\n        display: none;\r\n    }\r\n}\r\n"
  },
  {
    "path": "src/function/func.js",
    "content": "import func_methods from '../global/func_methods';\r\nimport formula from '../global/formula';\r\nimport tooltip from '../global/tooltip';\r\nimport { isRealNum, valueIsError,error } from '../global/validate';\r\nimport { getdatabyselectionD } from '../global/getdata';\r\nimport { genarate } from '../global/format';\r\nimport { inverse } from '../function/matrix_methods';\r\nimport { getSheetIndex, getluckysheetfile, getRangetxt } from '../methods/get';\r\nimport { getObjType, ABCatNum } from '../utils/util';\r\nimport Store from '../store';\r\nimport numeral from 'numeral';\r\n\r\n//函数功能：比较或运算\r\nfunction luckysheet_compareWith() {\r\n    //第一个参数和第三个参数，返回比较结果的布尔值或者运算值\r\n    //formula.operatorjson; 存储运算符和比较符\r\n    let sp = arguments[1]; //操作符\r\n\r\n    //参数一\r\n    let data_fp = arguments[0];\r\n    let fp;\r\n    if(getObjType(data_fp) == \"object\" && data_fp.startCell != null){ //参数是选区\r\n        if(sp == \"&\"){\r\n            fp = func_methods.getCellDataDyadicArr(data_fp, \"text\");\r\n        }\r\n        else{\r\n            fp = func_methods.getCellDataDyadicArr(data_fp, \"number\");\r\n        }\r\n\r\n        if(fp.length == 1 && fp[0].length == 1){\r\n            fp = fp[0][0];\r\n        }\r\n    }\r\n    else{\r\n        fp = data_fp;\r\n    }\r\n\r\n    //参数二\r\n    let data_tp = arguments[2];\r\n    let tp;\r\n    if(getObjType(data_tp) == \"object\" && data_tp.startCell != null){ //参数是选区\r\n        if(sp == \"&\"){\r\n            tp = func_methods.getCellDataDyadicArr(data_tp, \"text\");\r\n        }\r\n        else{\r\n            tp = func_methods.getCellDataDyadicArr(data_tp, \"number\");\r\n        }\r\n\r\n        if(tp.length == 1 && tp[0].length == 1){\r\n            tp = tp[0][0];\r\n        }\r\n    }\r\n    else{\r\n        tp = data_tp;\r\n    }\r\n\r\n    if(valueIsError(fp)){\r\n        return fp;\r\n    }\r\n\r\n    if(valueIsError(tp)){\r\n        return tp;\r\n    }\r\n\r\n    //参数是不规则二维数组 时 return #VALUE! 错误\r\n    if(getObjType(fp) == \"array\" && getObjType(fp[0]) == \"array\" && !func_methods.isDyadicArr(fp)){\r\n        return error.v;   \r\n    }\r\n\r\n    if(getObjType(tp) == \"array\" && getObjType(tp[0]) == \"array\" && !func_methods.isDyadicArr(tp)){\r\n        return error.v;   \r\n    }\r\n\r\n    if(sp == \"<>\"){\r\n        sp = \"!=\";\r\n    }\r\n\r\n    if(sp == \"=\"){\r\n        sp = \"==\";\r\n    }\r\n\r\n    if(fp==null && tp==null){\r\n        return \"#INVERSE!\";\r\n    }\r\n    else if(fp==\"#INVERSE!\"){\r\n        fp =0;\r\n        if(sp==\"-\"){\r\n            sp = \"+\";\r\n        }\r\n        else if(sp==\"+\"){\r\n            sp = \"-\";\r\n        }\r\n    }\r\n    else if(sp == \"-\" && fp == null){\r\n        fp = 0;\r\n    }\r\n    else if(sp == \"/\" && (tp == 0 || tp == null)){\r\n        return error.d;\r\n    }\r\n\r\n    //计算result\r\n    function booleanOperation(a, operator, b){\r\n        if(isRealNum(a)){\r\n            a = parseFloat(a);\r\n        }\r\n\r\n        if(isRealNum(b)){\r\n            b = parseFloat(b);\r\n        }\r\n\r\n        if(operator == \"==\"){\r\n            if(a == b){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        else if(operator == \"!=\"){\r\n            if(a != b){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        else if(operator == \">=\"){\r\n            if(a >= b){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        else if(operator == \"<=\"){\r\n            if(a <= b){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        else if(operator == \">\"){\r\n            if(a > b){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        else if(operator == \"<\"){\r\n            if(a < b){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n\r\n    //布尔值对应数字（true = 1, false = 1）\r\n    function booleanToNum(v){\r\n        if(v == null){\r\n            return v;\r\n        }\r\n\r\n        if(v.toString().toLowerCase() == \"true\"){\r\n            return 1;\r\n        }\r\n\r\n        if(v.toString().toLowerCase() == \"false\"){\r\n            return 0;\r\n        }\r\n\r\n        return v;\r\n    }\r\n      \r\n    if(sp == \"*\"){ //乘\r\n        if(getObjType(fp) == \"array\" && getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\" && getObjType(tp[0]) == \"array\"){\r\n                //二维数组相乘（m*n 与 m*n 等于 m*n；m*p 与 p*n 等于 m*n；其它错误） \r\n                if(fp.length == tp.length && fp[0].length == tp[0].length){\r\n                    for(let m = 0; m < fp.length; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < fp[m].length; n++){\r\n                            fp[m][n] = booleanToNum(fp[m][n]);\r\n                            tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[m][n]) && isRealNum(tp[m][n])){\r\n                                value = luckysheet_calcADPMM(fp[m][n], sp, tp[m][n]);//parseFloat(fp[m][n]) * parseFloat(tp[m][n]);\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(fp[0].length == tp.length){\r\n                    let rowlen = fp.length;\r\n                    let collen = tp[0].length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            let value = 0;\r\n\r\n                            for(let p = 0; p < fp[0].length; p++){\r\n                                fp[m][p] = booleanToNum(fp[m][p]);\r\n                                tp[p][n] = booleanToNum(tp[p][n]);\r\n\r\n                                if(isRealNum(fp[m][p]) && isRealNum(tp[p][n])){\r\n                                    value += luckysheet_calcADPMM(fp[m][p], sp, tp[p][n]);//parseFloat(fp[m][p]) * parseFloat(tp[p][n]);\r\n                                }\r\n                                else{\r\n                                    value += error.v;\r\n                                }\r\n                            }\r\n\r\n                            if(value.toString() == \"NaN\"){\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(fp.length == tp[0].length){\r\n                    let rowlen = tp.length;\r\n                    let collen = fp[0].length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            let value = 0;\r\n\r\n                            for(let p = 0; p < tp[0].length; p++){\r\n                                fp[p][n] = booleanToNum(fp[p][n]);\r\n                                tp[m][p] = booleanToNum(tp[m][p]);\r\n\r\n                                if(isRealNum(tp[m][p]) && isRealNum(fp[p][n])){\r\n                                    value += luckysheet_calcADPMM(fp[p][n], sp, tp[m][p]);//parseFloat(tp[m][p]) * parseFloat(fp[p][n]);\r\n                                }\r\n                                else{\r\n                                    value += error.v;\r\n                                }\r\n                            }\r\n\r\n                            if(value.toString() == \"NaN\"){\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    return error.na;\r\n                }\r\n            }\r\n            else if(getObjType(fp[0]) == \"array\"){\r\n                //二维数组与一维数组相乘（m*n 与 n 等于 m*n；m*1 与 n 等于 m*n；其它错误）\r\n                if(fp[0].length == tp.length){\r\n                    for(let m = 0; m < fp.length; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < fp[m].length; n++){\r\n                            fp[m][n] = booleanToNum(fp[m][n]);\r\n                            tp[n] = booleanToNum(tp[n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[m][n]) && isRealNum(tp[n])){\r\n                                value = luckysheet_calcADPMM(fp[m][n], sp, tp[n]);//parseFloat(fp[m][n]) * parseFloat(tp[n]);\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(fp[0].length == 1){\r\n                    let rowlen = fp.length;\r\n                    let collen = tp.length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            fp[m][0] = booleanToNum(fp[m][0]);\r\n                            tp[n] = booleanToNum(tp[n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[m][0]) && isRealNum(tp[n])){\r\n                                value = luckysheet_calcADPMM(fp[m][0], sp, tp[n]);// parseFloat(fp[m][0]) * parseFloat(tp[n]);\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    return error.na;\r\n                }\r\n            }\r\n            else if(getObjType(tp[0]) == \"array\"){\r\n                //二维数组与一维数组相乘（m*n 与 n 等于 m*n；m*1 与 n 等于 m*n；其它错误）\r\n                if(tp[0].length == fp.length){\r\n                    for(let m = 0; m < tp.length; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < tp[m].length; n++){\r\n                            fp[n] = booleanToNum(fp[n]);\r\n                            tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[n]) && isRealNum(tp[m][n])){\r\n                                value = luckysheet_calcADPMM(fp[n], sp, tp[m][n]);// parseFloat(fp[n]) * parseFloat(tp[m][n]);\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(tp[0].length == 1){\r\n                    let rowlen = tp.length;\r\n                    let collen = fp.length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            fp[n] = booleanToNum(fp[n]);\r\n                            tp[m][0] = booleanToNum(tp[m][0]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[n]) && isRealNum(tp[m][0])){\r\n                                value = luckysheet_calcADPMM(fp[n], sp, tp[m][0]);//parseFloat(fp[n]) * parseFloat(tp[m][0]);\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    return error.na;\r\n                }\r\n            }\r\n            else{\r\n                //一维数组与一维数组相乘时，数组大小不一样是错误\r\n                if(fp.length != tp.length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp[n])){\r\n                        value = luckysheet_calcADPMM(fp[n], sp, tp[n]);// parseFloat(fp[n]) * parseFloat(tp[n]);\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(fp) == \"array\"){\r\n            tp = booleanToNum(tp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\"){\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp)){\r\n                            value = luckysheet_calcADPMM(fp[m][n], sp, tp);// parseFloat(fp[m][n]) * parseFloat(tp);\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp)){\r\n                        value = luckysheet_calcADPMM(fp[n], sp, tp);// parseFloat(fp[n]) * parseFloat(tp);\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(tp) == \"array\"){\r\n            fp = booleanToNum(fp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(tp[0]) == \"array\"){\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp) && isRealNum(tp[m][n])){\r\n                            value = luckysheet_calcADPMM(fp, sp, tp[m][n]);// parseFloat(fp) * parseFloat(tp[m][n]);\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < tp.length; n++){\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp) && isRealNum(tp[n])){\r\n                        value = luckysheet_calcADPMM(fp, sp, tp[n]);//parseFloat(fp) * parseFloat(tp[n]);\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else{\r\n            fp = booleanToNum(fp);\r\n            tp = booleanToNum(tp);\r\n\r\n            let result;\r\n            if(isRealNum(fp) && isRealNum(tp)){\r\n                result = luckysheet_calcADPMM(fp, sp, tp);//parseFloat(fp) * parseFloat(tp);\r\n            }\r\n            else{\r\n                result = error.v;\r\n            }\r\n\r\n            return result;\r\n        }\r\n    }\r\n    else if(sp == \"/\"){ //除\r\n        if(getObjType(fp) == \"array\" && getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\" && getObjType(tp[0]) == \"array\"){\r\n                //二维数组相除（m*n 与 m*n 等于 m*n；m*p 与 p*n 等于 m*n；其它错误） \r\n                if(fp.length == tp.length && fp[0].length == tp[0].length){\r\n                    for(let m = 0; m < fp.length; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < fp[m].length; n++){\r\n                            fp[m][n] = booleanToNum(fp[m][n]);\r\n                            tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[m][n]) && isRealNum(tp[m][n])){\r\n                                if(parseFloat(tp[m][n]) == 0){\r\n                                    value = error.d;\r\n                                }\r\n                                else{\r\n                                    value = luckysheet_calcADPMM(fp[m][n], sp, tp[m][n]);// parseFloat(fp[m][n]) / parseFloat(tp[m][n]);    \r\n                                }\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(fp[0].length == tp.length){\r\n                    let tp_inverse = inverse(tp);\r\n\r\n                    let rowlen = fp.length;\r\n                    let collen = tp_inverse[0].length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            let value = 0;\r\n\r\n                            for(let p = 0; p < fp[0].length; p++){\r\n                                fp[m][p] = booleanToNum(fp[m][p]);\r\n                                tp_inverse[p][n] = booleanToNum(tp_inverse[p][n]);\r\n\r\n                                if(isRealNum(fp[m][p]) && isRealNum(tp_inverse[p][n])){\r\n                                    value += luckysheet_calcADPMM(fp[m][p], \"*\", tp_inverse[p][n]);// parseFloat(fp[m][p]) * parseFloat(tp_inverse[p][n]);\r\n                                }\r\n                                else{\r\n                                    value += error.v;\r\n                                }\r\n                            }\r\n\r\n                            if(value.toString() == \"NaN\"){\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    return error.na;\r\n                }\r\n            }\r\n            else if(getObjType(fp[0]) == \"array\"){\r\n                //二维数组与一维数组相除（m*n 与 n 等于 m*n；m*1 与 n 等于 m*n；其它错误）\r\n                if(fp[0].length == tp.length){\r\n                    for(let m = 0; m < fp.length; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < fp[m].length; n++){\r\n                            fp[m][n] = booleanToNum(fp[m][n]);\r\n                            tp[n] = booleanToNum(tp[n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[m][n]) && isRealNum(tp[n])){\r\n                                if(parseFloat(tp[n]) == 0){\r\n                                    value = error.d;\r\n                                }\r\n                                else{\r\n                                    value = luckysheet_calcADPMM(fp[m][n], sp, tp[n]);// parseFloat(fp[m][n]) / parseFloat(tp[n]);\r\n                                }\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(fp[0].length == 1){\r\n                    let rowlen = fp.length;\r\n                    let collen = tp.length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            fp[m][0] = booleanToNum(fp[m][0]);\r\n                            tp[n] = booleanToNum(tp[n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[m][0]) && isRealNum(tp[n])){\r\n                                if(parseFloat(tp[n]) == 0){\r\n                                    value = error.d;\r\n                                }\r\n                                else{\r\n                                    value = luckysheet_calcADPMM(fp[m][0], sp, tp[n]);// parseFloat(fp[m][0]) / parseFloat(tp[n]);\r\n                                }\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    return error.na;\r\n                }\r\n            }\r\n            else if(getObjType(tp[0]) == \"array\"){\r\n                //二维数组与一维数组相除（m*n 与 n 等于 m*n；m*1 与 n 等于 m*n；其它错误）\r\n                if(tp[0].length == fp.length){\r\n                    for(let m = 0; m < tp.length; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < tp[m].length; n++){\r\n                            fp[n] = booleanToNum(fp[n]);\r\n                            tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[n]) && isRealNum(tp[m][n])){\r\n                                if(parseFloat(tp[m][n]) == 0){\r\n                                    value = error.d;\r\n                                }\r\n                                else{\r\n                                    value = luckysheet_calcADPMM(fp[n], sp, tp[m][n]);//parseFloat(fp[n]) / parseFloat(tp[m][n]);\r\n                                }\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else if(tp[0].length == 1){\r\n                    let rowlen = tp.length;\r\n                    let collen = fp.length;\r\n\r\n                    for(let m = 0; m < rowlen; m++){\r\n                        let rowArr = [];\r\n\r\n                        for(let n = 0; n < collen; n++){\r\n                            fp[n] = booleanToNum(fp[n]);\r\n                            tp[m][0] = booleanToNum(tp[m][0]);\r\n\r\n                            let value;\r\n                            if(isRealNum(fp[n]) && isRealNum(tp[m][0])){\r\n                                if(parseFloat(tp[m][0]) == 0){\r\n                                    value = error.d;\r\n                                }\r\n                                else{\r\n                                    value = luckysheet_calcADPMM(fp[n], sp, tp[m][0]);//parseFloat(fp[n]) / parseFloat(tp[m][0]);\r\n                                }\r\n                            }\r\n                            else{\r\n                                value = error.v;\r\n                            }\r\n\r\n                            rowArr.push(value);\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    return error.na;\r\n                }\r\n            }\r\n            else{\r\n                //一维数组与一维数组相除时，数组大小不一样是错误\r\n                if(fp.length != tp.length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp[n])){\r\n                        if(parseFloat(tp[n]) == 0){\r\n                            value = error.d;\r\n                        }\r\n                        else{\r\n                            value = luckysheet_calcADPMM(fp[n], sp, tp[n]);//parseFloat(fp[n]) / parseFloat(tp[n]);\r\n                        }\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(fp) == \"array\"){\r\n            tp = booleanToNum(tp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\"){\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp)){\r\n                            if(parseFloat(tp) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp[m][n], sp, tp);//parseFloat(fp[m][n]) / parseFloat(tp);\r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp)){\r\n                        if(parseFloat(tp) == 0){\r\n                            value = error.d;\r\n                        }\r\n                        else{\r\n                            value = luckysheet_calcADPMM(fp[n], sp, tp);//parseFloat(fp[n]) / parseFloat(tp);\r\n                        }\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(tp) == \"array\"){\r\n            fp = booleanToNum(fp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(tp[0]) == \"array\"){\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp) && isRealNum(tp[m][n])){\r\n                            if(parseFloat(tp[m][n]) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp, sp, tp[m][n]);//parseFloat(fp) / parseFloat(tp[m][n]);\r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < tp.length; n++){\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp) && isRealNum(tp[n])){\r\n                        if(parseFloat(tp[n]) == 0){\r\n                            value = error.d;\r\n                        }\r\n                        else{\r\n                            value = luckysheet_calcADPMM(fp, sp, tp[n]);//parseFloat(fp) / parseFloat(tp[n]);\r\n                        }\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else{\r\n            fp = booleanToNum(fp);\r\n            tp = booleanToNum(tp);\r\n\r\n            let result;\r\n            if(isRealNum(fp) && isRealNum(tp)){\r\n                if(parseFloat(tp) == 0){\r\n                    result = error.d;\r\n                }\r\n                else{\r\n                    result = luckysheet_calcADPMM(fp, sp, tp);//parseFloat(fp) / parseFloat(tp);\r\n                }\r\n            }\r\n            else{\r\n                result = error.v;\r\n            }\r\n\r\n            return result;\r\n        }\r\n    }\r\n    else if(sp == \"+\" || sp == \"-\" || sp == \"%\"){ //加 减 取余\r\n        if(getObjType(fp) == \"array\" && getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\" && getObjType(tp[0]) == \"array\"){\r\n                if(fp.length != tp.length && fp[0].length != tp[0].length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp[m][n])){\r\n                            if(sp == \"%\" && parseFloat(tp[m][n]) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp[m][n], sp, tp[m][n]);// eval(parseFloat(fp[m][n]) + sp + parseFloat(tp[m][n]));    \r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(fp[0]) == \"array\"){\r\n                if(fp[0].length != tp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n                        tp[n] = booleanToNum(tp[n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp[n])){\r\n                            if(sp == \"%\" && parseFloat(tp[n]) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp[m][n], sp, tp[n]);//eval(parseFloat(fp[m][n]) + sp + parseFloat(tp[n]));    \r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(tp[0]) == \"array\"){\r\n                if(tp[0].length != fp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        fp[n] = booleanToNum(fp[n]);\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[n]) && isRealNum(tp[m][n])){\r\n                            if(sp == \"%\" && parseFloat(tp[m][n]) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp[n], sp, tp[m][n]);//eval(parseFloat(fp[n]) + sp + parseFloat(tp[m][n]));    \r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                if(fp.length != tp.length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp[n])){\r\n                        if(sp == \"%\" && parseFloat(tp[n]) == 0){\r\n                            value = error.d;\r\n                        }\r\n                        else{\r\n                            value = luckysheet_calcADPMM(fp[n], sp, tp[n]);//eval(parseFloat(fp[n]) + sp + \"(\" + parseFloat(tp[n]) + \")\" );    \r\n                        }\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(fp) == \"array\"){\r\n            tp = booleanToNum(tp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\"){\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp)){\r\n                            if(sp == \"%\" && parseFloat(tp) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp[m][n], sp, tp);//eval(parseFloat(fp[m][n]) + sp + parseFloat(tp));    \r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp)){\r\n                        if(sp == \"%\" && parseFloat(tp) == 0){\r\n                            value = error.d;\r\n                        }\r\n                        else{\r\n                            value = luckysheet_calcADPMM(fp[n], sp, tp);//eval(parseFloat(fp[n]) + sp + parseFloat(tp));    \r\n                        }\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(tp) == \"array\"){\r\n            fp = booleanToNum(fp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(tp[0]) == \"array\"){\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp) && isRealNum(tp[m][n])){\r\n                            if(sp == \"%\" && parseFloat(tp[m][n]) == 0){\r\n                                value = error.d;\r\n                            }\r\n                            else{\r\n                                value = luckysheet_calcADPMM(fp, sp, tp[m][n]);//eval(parseFloat(fp) + sp + parseFloat(tp[m][n]));    \r\n                            }\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < tp.length; n++){\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp) && isRealNum(tp[n])){\r\n                        if(sp == \"%\" && parseFloat(tp[n]) == 0){\r\n                            value = error.d;\r\n                        }\r\n                        else{\r\n                            value = luckysheet_calcADPMM(fp, sp, tp[n]);//eval(parseFloat(fp) + sp + parseFloat(tp[n]));    \r\n                        }\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else{\r\n            fp = booleanToNum(fp);\r\n            tp = booleanToNum(tp);\r\n\r\n            let result;\r\n            if(isRealNum(fp) && isRealNum(tp)){\r\n                if(sp == \"%\" && parseFloat(tp) == 0){\r\n                    result = error.d;\r\n                }\r\n                else{\r\n                    result = luckysheet_calcADPMM(fp, sp, tp);//eval(parseFloat(fp) + sp + \"(\" + parseFloat(tp) + \")\");    \r\n                }\r\n            }\r\n            else{\r\n                result = error.v;\r\n            }\r\n\r\n            return result;\r\n        }\r\n    }\r\n    else if(sp == \"==\" || sp == \"!=\" || sp == \">=\" || sp == \"<=\" || sp == \">\" || sp == \"<\"){ //比较运算符\r\n        if(getObjType(fp) == \"array\" && getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\" && getObjType(tp[0]) == \"array\"){\r\n                if(fp.length != tp.length && fp[0].length != tp[0].length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        let value = booleanOperation(fp[m][n], sp, tp[m][n]);\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(fp[0]) == \"array\"){\r\n                if(fp[0].length != tp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        let value = booleanOperation(fp[m][n], sp, tp[n]);\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(tp[0]) == \"array\"){\r\n                if(tp[0].length != fp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        let value = booleanOperation(fp[n], sp, tp[m][n]);\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                if(fp.length != tp.length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let n = 0; n < fp.length; n++){\r\n                    let value = booleanOperation(fp[n], sp, tp[n]);\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(fp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\"){\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        let value = booleanOperation(fp[m][n], sp, tp);\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < fp.length; n++){\r\n                    let value = booleanOperation(fp[n], sp, tp);\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(tp[0]) == \"array\"){\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        let value = booleanOperation(fp, sp, tp[m][n]);\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < tp.length; n++){\r\n                    let value = booleanOperation(fp, sp, tp[n]);\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else{\r\n            return booleanOperation(fp, sp, tp);\r\n        }\r\n    }\r\n    else if(sp == \"&\"){ //连接符\r\n        if(getObjType(fp) == \"array\" && getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\" && getObjType(tp[0]) == \"array\"){\r\n                if(fp.length != tp.length && fp[0].length != tp[0].length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        rowArr.push(fp[m][n] + \"\" + tp[m][n]);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(fp[0]) == \"array\"){\r\n                if(fp[0].length != tp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        rowArr.push(fp[m][n] + \"\" + tp[n]);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(tp[0]) == \"array\"){\r\n                if(tp[0].length != fp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        rowArr.push(fp[n] + \"\" + tp[m][n]);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                if(fp.length != tp.length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let n = 0; n < fp.length; n++){\r\n                    result.push(fp[n] + \"\" + tp[n]);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(fp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\"){\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        rowArr.push(fp[m][n] + \"\" + tp);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < fp.length; n++){\r\n                    result.push(fp[n] + \"\" + tp);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(tp[0]) == \"array\"){\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        rowArr.push(fp + \"\" + tp[m][n]);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < tp.length; n++){\r\n                    result.push(fp + \"\" + tp[n]);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else{\r\n            return fp + \"\" + tp;\r\n        }\r\n    }\r\n    else if(sp == \"^\"){ //幂\r\n        if(getObjType(fp) == \"array\" && getObjType(tp) == \"array\"){\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\" && getObjType(tp[0]) == \"array\"){\r\n                if(fp.length != tp.length && fp[0].length != tp[0].length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp[m][n])){\r\n                            value = Math.pow(parseFloat(fp[m][n]), parseFloat(tp[m][n]));\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(fp[0]) == \"array\"){\r\n                if(fp[0].length != tp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n                        tp[n] = booleanToNum(tp[n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp[n])){\r\n                            value = Math.pow(parseFloat(fp[m][n]), parseFloat(tp[n]));\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(tp[0]) == \"array\"){\r\n                if(tp[0].length != fp.length){\r\n                    return error.na;\r\n                }\r\n\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        fp[n] = booleanToNum(fp[n]);\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[n]) && isRealNum(tp[m][n])){\r\n                            value = Math.pow(parseFloat(fp[n]), parseFloat(tp[m][n]));\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                if(fp.length != tp.length){\r\n                    return error.na;   \r\n                }\r\n\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp[n])){\r\n                        value = Math.pow(parseFloat(fp[n]), parseFloat(tp[n]));\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(fp) == \"array\"){\r\n            tp = booleanToNum(tp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(fp[0]) == \"array\"){\r\n                for(let m = 0; m < fp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < fp[m].length; n++){\r\n                        fp[m][n] = booleanToNum(fp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp[m][n]) && isRealNum(tp)){\r\n                            value = Math.pow(parseFloat(fp[m][n]), parseFloat(tp));\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < fp.length; n++){\r\n                    fp[n] = booleanToNum(fp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp[n]) && isRealNum(tp)){\r\n                        value = Math.pow(parseFloat(fp[n]), parseFloat(tp));\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else if(getObjType(tp) == \"array\"){\r\n            fp = booleanToNum(fp);\r\n\r\n            let result = [];\r\n\r\n            if(getObjType(tp[0]) == \"array\"){\r\n                for(let m = 0; m < tp.length; m++){\r\n                    let rowArr = [];\r\n\r\n                    for(let n = 0; n < tp[m].length; n++){\r\n                        tp[m][n] = booleanToNum(tp[m][n]);\r\n\r\n                        let value;\r\n                        if(isRealNum(fp) && isRealNum(tp[m][n])){\r\n                            value = Math.pow(parseFloat(fp), parseFloat(tp[m][n]));\r\n                        }\r\n                        else{\r\n                            value = error.v;\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    result.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                for(let n = 0; n < tp.length; n++){\r\n                    tp[n] = booleanToNum(tp[n]);\r\n\r\n                    let value;\r\n                    if(isRealNum(fp) && isRealNum(tp[n])){\r\n                        value = Math.pow(parseFloat(fp), parseFloat(tp[n]));\r\n                    }\r\n                    else{\r\n                        value = error.v;\r\n                    }\r\n\r\n                    result.push(value);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        else{\r\n            fp = booleanToNum(fp);\r\n            tp = booleanToNum(tp);\r\n\r\n            let result;\r\n            if(isRealNum(fp) && isRealNum(tp)){\r\n                result = Math.pow(parseFloat(fp), parseFloat(tp));\r\n            }\r\n            else{\r\n                result = error.v;\r\n            }\r\n\r\n            return result;\r\n        }\r\n    }\r\n}\r\n\r\n//解析 公式中{1,2,3;2,3,4} 为数组[[1,2,3],[2,3,4]]\r\nfunction luckysheet_getarraydata() {\r\n    let fp = arguments[0];\r\n\r\n    fp = fp.replace(\"{\", \"\").replace(\"}\", \"\").replace(/\\\"/g, '');\r\n\r\n    let arr = [];\r\n\r\n    if(fp.indexOf(\";\") > -1){\r\n        arr = fp.split(\";\");\r\n\r\n        for(let i = 0; i < arr.length; i++){\r\n            arr[i] = arr[i].split(\",\");\r\n        }\r\n    }\r\n    else{\r\n        arr = fp.split(\",\");    \r\n    }\r\n\r\n    return arr;\r\n}\r\n\r\nfunction luckysheet_calcADPMM(fp, sp, tp){\r\n    let value;\r\n    if(sp==\"+\"){\r\n        value = numeral(fp).add(tp).value();\r\n    }\r\n    else if(sp==\"-\"){\r\n        value = numeral(fp).subtract(tp).value();\r\n    }\r\n    else if(sp==\"%\"){\r\n        value = new Function(\"return \" + parseFloat(fp) + sp + \"(\" + parseFloat(tp) + \")\" )();\r\n    }\r\n    else if(sp==\"/\"){\r\n        value = numeral(fp).divide(tp).value();\r\n    }\r\n    else if(sp==\"*\"){\r\n        value = numeral(fp).multiply(tp).value();\r\n    }\r\n    return value;\r\n}\r\n\r\nfunction luckysheet_getcelldata(txt) {\r\n    if (window.luckysheet_getcelldata_cache == null) {\r\n        window.luckysheet_getcelldata_cache = {};\r\n    }\r\n\r\n    if (txt in window.luckysheet_getcelldata_cache) {\r\n        return window.luckysheet_getcelldata_cache[txt];\r\n    }\r\n\r\n    let luckysheetfile = getluckysheetfile();\r\n    let val = txt.split(\"!\");\r\n    let sheettxt = \"\",\r\n        rangetxt = \"\",\r\n        sheetIndex = -1,\r\n        sheetdata = null;\r\n    \r\n    if (val.length > 1) {\r\n        sheettxt = val[0].replace(/''/g,\"'\");\r\n        rangetxt = val[1];\r\n\r\n        if(sheettxt.substr(0,1)==\"'\" && sheettxt.substr(sheettxt.length-1,1)==\"'\"){\r\n            sheettxt = sheettxt.substring(1,sheettxt.length-1);\r\n        }\r\n        \r\n        for (let i in luckysheetfile) {\r\n            if (sheettxt == luckysheetfile[i].name) {\r\n                sheetIndex = luckysheetfile[i].index;\r\n                sheetdata = luckysheetfile[i].data;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (sheetIndex == -1) {\r\n            sheetIndex = 0;\r\n        }\r\n    } \r\n    else {\r\n        let index = getSheetIndex(Store.calculateSheetIndex);\r\n        sheettxt = luckysheetfile[index].name;\r\n        sheetIndex = luckysheetfile[index].index;\r\n        // sheetdata = Store.flowdata;\r\n        sheetdata = luckysheetfile[index].data;\r\n        rangetxt = val[0];\r\n\r\n        // 取消execFunctionGroupData，改用execFunctionGlobalData\r\n        // if (formula.execFunctionGroupData != null) {\r\n        //     sheetdata = formula.execFunctionGroupData;\r\n        // }\r\n    }\r\n\r\n    if (rangetxt.indexOf(\":\") == -1) {\r\n        let row = parseInt(rangetxt.replace(/[^0-9]/g, \"\")) - 1;\r\n        let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, \"\"));\r\n\r\n        if (!isNaN(row) && !isNaN(col)) {\r\n            let ret = getdatabyselectionD(sheetdata, {\r\n                \"row\": [row, row],\r\n                \"column\": [col, col]\r\n            })[0][0];\r\n\r\n            if (formula.execFunctionGlobalData != null) {\r\n                let ef = formula.execFunctionGlobalData[row+\"_\"+col+\"_\"+sheetIndex];\r\n                if(ef!=null){\r\n                    ret = ef;\r\n                }\r\n            }\r\n\r\n            //范围的长宽\r\n            let rowl = 1;\r\n            let coll = 1;\r\n            let retAll= {\r\n                \"sheetName\": sheettxt,\r\n                \"startCell\": rangetxt,\r\n                \"rowl\": rowl,\r\n                \"coll\": coll,\r\n                \"data\": ret\r\n            };\r\n\r\n            window.luckysheet_getcelldata_cache[txt] = retAll;\r\n\r\n            return retAll;\r\n        } \r\n        else {\r\n            return [];\r\n        }\r\n    } \r\n    else {\r\n        rangetxt = rangetxt.split(\":\");\r\n        let row = [], col = [];\r\n        row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, \"\")) - 1;\r\n        row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, \"\")) - 1;\r\n        \r\n        if (isNaN(row[0])) {\r\n            row[0] = 0;\r\n        }\r\n\r\n        if (isNaN(row[1])) {\r\n            row[1] = sheetdata.length - 1;\r\n        }\r\n\r\n        if (row[0] > row[1]) {\r\n            tooltip.info(\"选择失败\", \"输入范围错误！\");\r\n            return [];\r\n        }\r\n\r\n        col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, \"\"));\r\n        col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, \"\"));\r\n        \r\n        if (isNaN(col[0])) {\r\n            col[0] = 0;\r\n        }\r\n\r\n        if (isNaN(col[1])) {\r\n            col[1] = sheetdata[0].length - 1;\r\n        }\r\n\r\n        if (col[0] > col[1]) {\r\n            tooltip.info(\"选择失败\", \"输入范围错误！\");\r\n            return [];\r\n        }\r\n        \r\n        let ret = getdatabyselectionD(sheetdata, {\r\n            \"row\": row,\r\n            \"column\": col\r\n        });\r\n\r\n        if(formula.execFunctionGlobalData!=null){\r\n            for(let r=row[0];r<=row[1];r++){\r\n                for(let c=col[0];c<=col[1];c++){\r\n                    let ef = formula.execFunctionGlobalData[r+\"_\"+c+\"_\"+sheetIndex];\r\n                    if(ef!=null){\r\n                        ret[r-row[0]][c-col[0]] = ef;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        \r\n        //范围的长宽\r\n        let rowl = row[1] - row[0] + 1;\r\n        let coll = col[1] - col[0] + 1;\r\n        let retAll= {\r\n            \"sheetName\": sheettxt,\r\n            \"startCell\": rangetxt[0],\r\n            \"rowl\": rowl,\r\n            \"coll\": coll,\r\n            \"data\": ret\r\n        };\r\n        \r\n        window.luckysheet_getcelldata_cache[txt] = retAll;\r\n\r\n        return retAll;\r\n    }\r\n}\r\n\r\n//解析单个取得的值，有字符串，数字，引用单元格或者函数\r\nfunction luckysheet_parseData(value) {\r\n    if(typeof value === \"object\" ){\r\n        if(value == null){\r\n            return \"\";\r\n        }\r\n        else if(Array.isArray(value)){ //函数返回的带期望格式的数组，可提取格式\r\n            let v = genarate(value[0]);\r\n            return v[2];\r\n        }\r\n        else{ //getcelldat引用单元格对象，带有格式\r\n            if(Array.isArray(value.data)){ //单元格区域\r\n                return error.v;             \r\n            }\r\n            else{ //单个单元格\r\n                if(value.data.v === undefined){\r\n                    return \"\";\r\n                }\r\n                else{\r\n                    return value.data.v;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else if(!formula.isCompareOperator(value).flag){\r\n        let v = genarate(value);\r\n        return v[2];\r\n    }\r\n    else if(typeof value === \"string\" || typeof value === \"number\"){\r\n        return value;\r\n    }\r\n\r\n    return error.v;\r\n}\r\n\r\nfunction luckysheet_getValue() {\r\n    //解析获取函数参数，无格式，且可包含带操作符的\">5\"\r\n    //数据类型：1.手动输入或函数返回的字符串，普通字符串或数字直接取值，特殊格式需转化 如：\"2019-1-1\"（特殊格式转化为数字）、\">5\"或数字\r\n    //2.引用单元格对象，取得二维数组或单个的v 如：A1\r\n    //3.函数返回的带期望格式的数组，取得第一个参数，转化为数字 如：[\"2019-1-1\",true]\r\n    let args = arguments[0];\r\n\r\n    for(let i = 0; i < args.length; i++){\r\n        let value = args[i];\r\n\r\n        if(typeof value === \"object\" ){\r\n            if(value == null){\r\n                value = \"\";\r\n            }\r\n            else if(Array.isArray(value)){ //函数返回的带期望格式的数组，可提取格式\r\n                let v = genarate(value[0]);\r\n                value = v[2];\r\n            }\r\n            else{ //getcelldat引用单元格对象，带有格式\r\n                if(Array.isArray(value.data)){ //单元格区域\r\n                    value = value.data;                \r\n                }\r\n                else{ //单个单元格\r\n                    if(value.data.v === undefined){ //空白单元格\r\n                        value = \"\";\r\n                    }\r\n                    else{\r\n                        value = value.data.v;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else if(!formula.isCompareOperator(value).flag){\r\n            let v = genarate(value);\r\n            value = v[2];\r\n        }\r\n        \r\n        args[i] = value;\r\n    }\r\n}\r\n\r\n\r\nfunction luckysheet_indirect_check() {\r\n    let cellTxt = arguments[0];\r\n    if (cellTxt == null || cellTxt.length == 0) {\r\n        return null;\r\n    }\r\n    return cellTxt;\r\n}\r\n\r\nfunction luckysheet_indirect_check_return(txt) {\r\n    return txt;\r\n}\r\n\r\nfunction luckysheet_offset_check() {\r\n    if (!(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null)) {\r\n        return formula.error.v;\r\n    }\r\n\r\n    var reference = arguments[0].startCell;\r\n\r\n    //要偏移的行数\r\n    var rows = func_methods.getFirstValue(arguments[1]);\r\n    if (valueIsError(rows)) {\r\n        return rows;\r\n    }\r\n\r\n    if (!isRealNum(rows)) {\r\n        return formula.error.v;\r\n    }\r\n\r\n    rows = parseInt(rows);\r\n\r\n    //要偏移的列数\r\n    var cols = func_methods.getFirstValue(arguments[2]);\r\n    if (valueIsError(cols)) {\r\n        return cols;\r\n    }\r\n\r\n    if (!isRealNum(cols)) {\r\n        return formula.error.v;\r\n    }\r\n\r\n    cols = parseInt(cols);\r\n\r\n    //要从偏移目标开始返回的范围的高度\r\n    var height = arguments[0].rowl;\r\n    if (arguments.length >= 4) {\r\n        height = func_methods.getFirstValue(arguments[3]);\r\n        if (valueIsError(height)) {\r\n            return height;\r\n        }\r\n\r\n        if (!isRealNum(height)) {\r\n            return formula.error.v;\r\n        }\r\n\r\n        height = parseInt(height);\r\n    }\r\n\r\n    //要从偏移目标开始返回的范围的宽度\r\n    var width = arguments[0].coll;\r\n    if (arguments.length == 5) {\r\n        width = func_methods.getFirstValue(arguments[4]);\r\n        if (valueIsError(width)) {\r\n            return width;\r\n        }\r\n\r\n        if (!isRealNum(width)) {\r\n            return formula.error.v;\r\n        }\r\n\r\n        width = parseInt(width);\r\n    }\r\n\r\n    if (height < 1 || width < 1) {\r\n        return formula.error.r;\r\n    }\r\n\r\n    //计算\r\n    var cellrange = formula.getcellrange(reference);\r\n    var cellRow0 = cellrange[\"row\"][0];\r\n    var cellCol0 = cellrange[\"column\"][0];\r\n\r\n    cellRow0 += rows;\r\n    cellCol0 += cols;\r\n\r\n    var cellRow1 = cellRow0 + height - 1;\r\n    var cellCol1 = cellCol0 + width - 1;\r\n\r\n    if (cellRow0 < 0 || cellRow1 >= Store.flowdata.length || cellCol0 < 0 || cellCol1 >= Store.flowdata[0].length) {\r\n        return formula.error.r;\r\n    }\r\n\r\n    return getRangetxt(Store.calculateSheetIndex, {\r\n        row: [cellRow0, cellRow1],\r\n        column: [cellCol0, cellCol1]\r\n    });\r\n}\r\n\r\n\r\nfunction luckysheet_getSpecialReference(isCellFirst, param1, param2) {\r\n    let functionRange, rangeTxt;\r\n    if(isCellFirst){\r\n        rangeTxt = param1;\r\n        functionRange = param2;\r\n    }\r\n    else{\r\n        functionRange = param1;\r\n        rangeTxt = param2;\r\n    }\r\n\r\n    if(functionRange.startCell.indexOf(\":\")>-1 || rangeTxt.indexOf(\":\")>-1){\r\n        return error.v;\r\n    }\r\n\r\n\r\n    if(isCellFirst){\r\n        return luckysheet_getcelldata(rangeTxt + \":\" +functionRange.startCell);\r\n    }\r\n    else{\r\n        let rangeT = rangeTxt, sheetName=\"\";\r\n        if(rangeTxt.indexOf(\"!\")>-1){\r\n            let rangetxtArr = rangeTxt.split(\"!\");\r\n            sheetName = rangetxtArr[0] + \"!\";\r\n            rangeT = rangetxtArr[1];\r\n        }\r\n        return luckysheet_getcelldata(sheetName + functionRange.startCell + \":\" + rangeT);\r\n    }\r\n\r\n    \r\n\r\n}\r\n\r\nexport {\r\n    luckysheet_compareWith,\r\n    luckysheet_getarraydata,\r\n    luckysheet_getcelldata,\r\n    luckysheet_parseData,\r\n    luckysheet_getValue,\r\n    luckysheet_indirect_check,\r\n    luckysheet_indirect_check_return,\r\n    luckysheet_offset_check,\r\n    luckysheet_calcADPMM,\r\n    luckysheet_getSpecialReference\r\n}"
  },
  {
    "path": "src/function/functionImplementation.js",
    "content": "import luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';\r\nimport { luckysheet_getcelldata, luckysheet_parseData, luckysheet_getValue, luckysheet_calcADPMM } from './func';\r\nimport { inverse } from './matrix_methods';\r\nimport { getSheetIndex, getluckysheetfile,getRangetxt } from '../methods/get';\r\nimport menuButton from '../controllers/menuButton';\r\nimport luckysheetSparkline from '../controllers/sparkline';\r\nimport formula from '../global/formula';\r\nimport func_methods from '../global/func_methods';\r\nimport editor from '../global/editor';\r\nimport { isdatetime, diff, isdatatype } from '../global/datecontroll';\r\nimport { isRealNum, isRealNull, valueIsError,error } from '../global/validate';\r\nimport { jfrefreshgrid,jfrefreshgridall } from '../global/refresh';\r\nimport { genarate, update } from '../global/format';\r\nimport { orderbydata } from '../global/sort';\r\nimport { getcellvalue,datagridgrowth } from '../global/getdata';\r\nimport { getObjType, ABCatNum, chatatABC, numFormat } from '../utils/util';\r\nimport Store from '../store';\r\nimport dayjs from 'dayjs';\r\nimport numeral from 'numeral';\r\nimport {getAirTable,companyTargetData,companyTargetData10,companyTargetData11,companyTargetData12,excelToLuckyArray,excelToArray,askAIData} from '../demoData/getTargetData'\r\nimport { setcellvalue } from \"../global/setdata\";\r\n\r\n//公式函数计算\r\nconst functionImplementation = {\r\n    \"SUM\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        if(getObjType(data) == \"boolean\"){\r\n                            if(data.toString().toLowerCase() == \"true\"){\r\n                                dataArr.push(1);\r\n                            }\r\n                            else if(data.toString().toLowerCase() == \"false\"){\r\n                                dataArr.push(0);\r\n                            }\r\n                        }\r\n                        else{\r\n                            return formula.error.v;\r\n                        }\r\n                    }\r\n                    else{\r\n                        dataArr.push(data);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var sum = 0;\r\n\r\n            if(dataArr.length > 0){\r\n                for(var i = 0; i < dataArr.length; i++){\r\n                    if(valueIsError(dataArr[i])){\r\n                        return dataArr[i];\r\n                    }\r\n\r\n                    if(!isRealNum(dataArr[i])){\r\n                        continue;\r\n                    }\r\n\r\n                    sum = luckysheet_calcADPMM(sum, \"+\", dataArr[i]);// parseFloat(dataArr[i]);\r\n                }\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AVERAGE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\"){\r\n                        if(!func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                    }\r\n                    else{\r\n                        dataArr = dataArr.concat(data);\r\n                    }\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var sum = 0, count = 0;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                if(valueIsError(dataArr[i])){\r\n                    return dataArr[i];\r\n                }\r\n                else if(!isRealNum(dataArr[i])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                sum = luckysheet_calcADPMM(sum, \"+\", dataArr[i]);// parseFloat(dataArr[i]);\r\n                count++;\r\n            }\r\n\r\n            if(count == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return luckysheet_calcADPMM(sum, \"/\", count);// sum / count;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUNT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\"){\r\n                        if(!func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                    }\r\n                    else{\r\n                        dataArr = dataArr.concat(data);\r\n                    }\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    if(getObjType(data) == \"boolean\"){\r\n                        if(data.toString().toLowerCase() == \"true\"){\r\n                            dataArr.push(1);\r\n                        }\r\n                        else if(data.toString().toLowerCase() == \"false\"){\r\n                            dataArr.push(0);\r\n                        }\r\n                    }\r\n                    else{\r\n                        dataArr.push(data);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var count = 0;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                if(isRealNum(dataArr[i])){\r\n                    count++;\r\n                }\r\n            }\r\n\r\n            return count;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUNTA\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\"){\r\n                        if(!func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        dataArr = dataArr.concat(func_methods.getDataArr(data));\r\n                    }\r\n                    else{\r\n                        dataArr = dataArr.concat(data);\r\n                    }\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            return dataArr.length;\r\n        }\r\n        catch (err) {\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MAX\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\"){\r\n                        if(!func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                    }\r\n                    else{\r\n                        dataArr = dataArr.concat(data);\r\n                    }\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var max = null;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                if(valueIsError(dataArr[i])){\r\n                    return dataArr[i];\r\n                }\r\n\r\n                if(!isRealNum(dataArr[i])){\r\n                    continue;\r\n                }\r\n\r\n                if(max == null || parseFloat(dataArr[i]) > max){\r\n                    max = parseFloat(dataArr[i]);\r\n                }\r\n            }\r\n\r\n            return max == null ? 0 : max;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MIN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\"){\r\n                        if(!func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                    }\r\n                    else{\r\n                        dataArr = dataArr.concat(data);\r\n                    }\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var min = null;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                if(valueIsError(dataArr[i])){\r\n                    return dataArr[i];\r\n                }\r\n\r\n                if(!isRealNum(dataArr[i])){\r\n                    continue;\r\n                }\r\n\r\n                if(min == null || parseFloat(dataArr[i]) < min){\r\n                    min = parseFloat(dataArr[i]);\r\n                }\r\n            }\r\n\r\n            return min == null ? 0 : min;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AGE_BY_IDCARD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //身份证号\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var birthday = window.luckysheet_function.BIRTHDAY_BY_IDCARD.f(UUserCard);\r\n            if(valueIsError(birthday)){\r\n                return birthday;\r\n            }\r\n\r\n            birthday = dayjs(birthday);\r\n\r\n            var cuurentdate = dayjs();\r\n            if(arguments.length == 2){\r\n                cuurentdate = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(cuurentdate)){\r\n                    return cuurentdate;\r\n                }\r\n\r\n                cuurentdate = dayjs(cuurentdate);\r\n            }\r\n\r\n            var age = cuurentdate.diff(birthday, \"years\");\r\n\r\n            if(age < 0 || age.toString() == \"NaN\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            return age;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SEX_BY_IDCARD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //身份证号\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]).toString();\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (parseInt(UUserCard.substr(16, 1)) % 2 == 1) {\r\n                return \"男\";\r\n            }\r\n            else {\r\n                return \"女\";\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BIRTHDAY_BY_IDCARD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //身份证号\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]).toString();\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var birthday = \"\";\r\n            if (UUserCard.length == 15) {\r\n                var year = \"19\" + UUserCard.substring(6, 8) + \"/\" + UUserCard.substring(8, 10) + \"/\" + UUserCard.substring(10, 12);\r\n                birthday = year;\r\n            }\r\n            else if (UUserCard.length == 18) {\r\n                var year = UUserCard.substring(6, 10) + \"/\" + UUserCard.substring(10, 12) + \"/\" + UUserCard.substring(12, 14);\r\n                birthday = year;\r\n            }\r\n\r\n            //生日格式\r\n            var datetype = 0;\r\n            if (arguments[1] != null) {\r\n                datetype = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(datetype)){\r\n                    return datetype;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(datetype)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            datetype = parseInt(datetype);\r\n\r\n            if(datetype < 0 || datetype > 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(parseInt(datetype) == 0){\r\n                return birthday;\r\n            }\r\n            else if(parseInt(datetype) == 1){\r\n                return dayjs(birthday).format(\"YYYY-MM-DD\");\r\n            }\r\n            else if(parseInt(datetype) == 2){\r\n                return dayjs(birthday).format(\"YYYY年M月D日\");\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PROVINCE_BY_IDCARD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //身份证号\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]).toString();\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var native = \"未知\";\r\n            var provinceArray = formula.classlist.province;\r\n\r\n            if (UUserCard.substring(0, 2) in provinceArray) {\r\n                native = provinceArray[UUserCard.substring(0, 2)];\r\n            }\r\n\r\n            return native;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CITY_BY_IDCARD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //身份证号\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]).toString();\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var dataNum = cityData.length,\r\n                native = \"未知\";\r\n\r\n            for (var i = 0; i < dataNum; i++) {\r\n                if (UUserCard.substring(0, 6) == cityData[i].code) {\r\n                    native = cityData[i].title;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return native;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STAR_BY_IDCARD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //身份证号\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var birthday = window.luckysheet_function.BIRTHDAY_BY_IDCARD.f(UUserCard);\r\n            if(valueIsError(birthday)){\r\n                return birthday;\r\n            }\r\n\r\n            birthday = new Date(birthday);\r\n\r\n            var month = birthday.getMonth(),\r\n                day = birthday.getDate();\r\n\r\n            var d = new Date(1999, month, day, 0, 0, 0);\r\n            var arr = [];\r\n            arr.push([\"魔羯座\", new Date(1999, 0, 1, 0, 0, 0)]);\r\n            arr.push([\"水瓶座\", new Date(1999, 0, 20, 0, 0, 0)]);\r\n            arr.push([\"双鱼座\", new Date(1999, 1, 19, 0, 0, 0)]);\r\n            arr.push([\"白羊座\", new Date(1999, 2, 21, 0, 0, 0)]);\r\n            arr.push([\"金牛座\", new Date(1999, 3, 21, 0, 0, 0)]);\r\n            arr.push([\"双子座\", new Date(1999, 4, 21, 0, 0, 0)]);\r\n            arr.push([\"巨蟹座\", new Date(1999, 5, 22, 0, 0, 0)]);\r\n            arr.push([\"狮子座\", new Date(1999, 6, 23, 0, 0, 0)]);\r\n            arr.push([\"处女座\", new Date(1999, 7, 23, 0, 0, 0)]);\r\n            arr.push([\"天秤座\", new Date(1999, 8, 23, 0, 0, 0)]);\r\n            arr.push([\"天蝎座\", new Date(1999, 9, 23, 0, 0, 0)]);\r\n            arr.push([\"射手座\", new Date(1999, 10, 22, 0, 0, 0)]);\r\n            arr.push([\"魔羯座\", new Date(1999, 11, 22, 0, 0, 0)]);\r\n            //console.log(birthday, arr, i);\r\n            for (var i = arr.length - 1; i >= 0; i--) {\r\n                if (d >= arr[i][1]) {\r\n                    return arr[i][0];\r\n                }\r\n            }\r\n\r\n            return \"未找到匹配星座信息\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ANIMAL_BY_IDCARD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //身份证号\r\n            var UUserCard = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(UUserCard)){\r\n                return UUserCard;\r\n            }\r\n\r\n            if (!window.luckysheet_function.ISIDCARD.f(UUserCard)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var birthday = window.luckysheet_function.BIRTHDAY_BY_IDCARD.f(UUserCard);\r\n            if(valueIsError(birthday)){\r\n                return birthday;\r\n            }\r\n\r\n            birthday = new Date(birthday);\r\n\r\n            var list = new Array(\"猪\", \"鼠\", \"牛\", \"虎\", \"兔\", \"龙\", \"蛇\", \"马\", \"羊\", \"猴\", \"鸡\", \"狗\");\r\n            var index = (parseInt(birthday.getFullYear()) + 9) % 12;\r\n\r\n            if (index != null && !isNaN(index)) {\r\n                return list[index];\r\n            }\r\n            else {\r\n                return \"未找到匹配生肖信息\";\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISIDCARD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var idcard = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(idcard)){\r\n                return idcard;\r\n            }\r\n\r\n            var reg = /(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/;\r\n\r\n            if(reg.test(idcard)){\r\n                return true\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DM_TEXT_CUTWORD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //任意需要分词的文本\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            //分词模式\r\n            var datetype = 0;\r\n            if (arguments[1] != null) {\r\n                datetype = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(datetype)){\r\n                    return datetype;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(datetype)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            datetype = parseInt(datetype);\r\n\r\n            if(datetype != 0 &&　datetype != 1 && datetype != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/cutword\", {\r\n                \"text\": text,\r\n                \"type\": datetype\r\n            }, function(data) {\r\n                var d = [].concat(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DM_TEXT_TFIDF\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //任意需要分词的文本\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            //关键词个数\r\n            var count = 20;\r\n            if (arguments[1] != null) {\r\n                count = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(count)){\r\n                    return count;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(count)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            count = parseInt(count);\r\n\r\n            //语料库\r\n            var set = 0;\r\n            if (arguments[2] != null) {\r\n                set = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(set)){\r\n                    return set;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(set)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            set = parseInt(set);\r\n\r\n            if(count < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(set != 0 && set != 1 && set != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/tfidf\", {\r\n                \"text\": text,\r\n                \"count\": count,\r\n                \"set\": set\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DM_TEXT_TEXTRANK\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //任意需要分词的文本\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            //关键词个数\r\n            var count = 20;\r\n            if (arguments[1] != null) {\r\n                count = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(count)){\r\n                    return count;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(count)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            count = parseInt(count);\r\n\r\n            //语料库\r\n            var set = 0;\r\n            if (arguments[2] != null) {\r\n                set = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(set)){\r\n                    return set;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(set)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            set = parseInt(set);\r\n\r\n            if(count < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(set != 0 && set != 1 && set != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/tfidf\", {\r\n                \"text\": text,\r\n                \"count\": count,\r\n                \"set\": set\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATA_CN_STOCK_CLOSE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //股票代码\r\n            var stockcode = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(stockcode)){\r\n                return stockcode;\r\n            }\r\n\r\n            //日期\r\n            var date = null;\r\n\r\n            if(arguments[1] != null){\r\n                var data_date = arguments[1];\r\n\r\n                if(getObjType(data_date) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(data_date) == \"object\" && data_date.startCell != null){\r\n                    if(data_date.data != null && getObjType(data_date.data) != \"array\" && data_date.data.ct != null && data_date.data.ct.t == \"d\"){\r\n                        date = update(\"yyyy-mm-dd\", data_date.data.v);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n                else{\r\n                    date = data_date;\r\n                }\r\n\r\n                if(!isdatetime(date)){\r\n                    return [formula.error.v, \"日期错误\"];\r\n                }\r\n\r\n                date = dayjs(date).format(\"YYYY-MM-DD\");\r\n            }\r\n\r\n            //复权除权\r\n            var price = 0;\r\n            if (arguments[2] != null) {\r\n                price = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(price)){\r\n                    return price;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(price)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            price = parseInt(price);\r\n\r\n            if(price != 0 && price != 1 && price != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/getstockinfo\", {\r\n                \"stockCode\": stockcode,\r\n                \"date\": date,\r\n                \"price\": price,\r\n                type: \"0\"\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                var v = numFormat(data);\r\n                if (v == null) {\r\n                    v = data;\r\n                }\r\n                formula.execFunctionGroup(cell_r, cell_c, v);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": v,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATA_CN_STOCK_OPEN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //股票代码\r\n            var stockcode = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(stockcode)){\r\n                return stockcode;\r\n            }\r\n\r\n            //日期\r\n            var date = null;\r\n\r\n            if(arguments[1] != null){\r\n                var data_date = arguments[1];\r\n\r\n                if(getObjType(data_date) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(data_date) == \"object\" && data_date.startCell != null){\r\n                    if(data_date.data != null && getObjType(data_date.data) != \"array\" && data_date.data.ct != null && data_date.data.ct.t == \"d\"){\r\n                        date = update(\"yyyy-mm-dd\", data_date.data.v);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n                else{\r\n                    date = data_date;\r\n                }\r\n\r\n                if(!isdatetime(date)){\r\n                    return [formula.error.v, \"日期错误\"];\r\n                }\r\n\r\n                date = dayjs(date).format(\"YYYY-MM-DD\");\r\n            }\r\n\r\n            //复权除权\r\n            var price = 0;\r\n            if (arguments[2] != null) {\r\n                price = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(price)){\r\n                    return price;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(price)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            price = parseInt(price);\r\n\r\n            if(price != 0 && price != 1 && price != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/getstockinfo\", {\r\n                \"stockCode\": stockcode,\r\n                \"date\": date,\r\n                \"price\": price,\r\n                type: \"1\"\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATA_CN_STOCK_MAX\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //股票代码\r\n            var stockcode = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(stockcode)){\r\n                return stockcode;\r\n            }\r\n\r\n            //日期\r\n            var date = null;\r\n\r\n            if(arguments[1] != null){\r\n                var data_date = arguments[1];\r\n\r\n                if(getObjType(data_date) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(data_date) == \"object\" && data_date.startCell != null){\r\n                    if(data_date.data != null && getObjType(data_date.data) != \"array\" && data_date.data.ct != null && data_date.data.ct.t == \"d\"){\r\n                        date = update(\"yyyy-mm-dd\", data_date.data.v);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n                else{\r\n                    date = data_date;\r\n                }\r\n\r\n                if(!isdatetime(date)){\r\n                    return [formula.error.v, \"日期错误\"];\r\n                }\r\n\r\n                date = dayjs(date).format(\"YYYY-MM-DD\");\r\n            }\r\n\r\n            //复权除权\r\n            var price = 0;\r\n            if (arguments[2] != null) {\r\n                price = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(price)){\r\n                    return price;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(price)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            price = parseInt(price);\r\n\r\n            if(price != 0 && price != 1 && price != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/getstockinfo\", {\r\n                \"stockCode\": stockcode,\r\n                \"date\": date,\r\n                \"price\": price,\r\n                type: \"2\"\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATA_CN_STOCK_MIN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //股票代码\r\n            var stockcode = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(stockcode)){\r\n                return stockcode;\r\n            }\r\n\r\n            //日期\r\n            var date = null;\r\n\r\n            if(arguments[1] != null){\r\n                var data_date = arguments[1];\r\n\r\n                if(getObjType(data_date) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(data_date) == \"object\" && data_date.startCell != null){\r\n                    if(data_date.data != null && getObjType(data_date.data) != \"array\" && data_date.data.ct != null && data_date.data.ct.t == \"d\"){\r\n                        date = update(\"yyyy-mm-dd\", data_date.data.v);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n                else{\r\n                    date = data_date;\r\n                }\r\n\r\n                if(!isdatetime(date)){\r\n                    return [formula.error.v, \"日期错误\"];\r\n                }\r\n\r\n                date = dayjs(date).format(\"YYYY-MM-DD\");\r\n            }\r\n\r\n            //复权除权\r\n            var price = 0;\r\n            if (arguments[2] != null) {\r\n                price = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(price)){\r\n                    return price;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(price)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            price = parseInt(price);\r\n\r\n            if(price != 0 && price != 1 && price != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/getstockinfo\", {\r\n                \"stockCode\": stockcode,\r\n                \"date\": date,\r\n                \"price\": price,\r\n                type: \"3\"\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATA_CN_STOCK_VOLUMN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //股票代码\r\n            var stockcode = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(stockcode)){\r\n                return stockcode;\r\n            }\r\n\r\n            //日期\r\n            var date = null;\r\n\r\n            if(arguments[1] != null){\r\n                var data_date = arguments[1];\r\n\r\n                if(getObjType(data_date) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(data_date) == \"object\" && data_date.startCell != null){\r\n                    if(data_date.data != null && getObjType(data_date.data) != \"array\" && data_date.data.ct != null && data_date.data.ct.t == \"d\"){\r\n                        date = update(\"yyyy-mm-dd\", data_date.data.v);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n                else{\r\n                    date = data_date;\r\n                }\r\n\r\n                if(!isdatetime(date)){\r\n                    return [formula.error.v, \"日期错误\"];\r\n                }\r\n\r\n                date = dayjs(date).format(\"YYYY-MM-DD\");\r\n            }\r\n\r\n            //复权除权\r\n            var price = 0;\r\n            if (arguments[2] != null) {\r\n                price = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(price)){\r\n                    return price;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(price)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            price = parseInt(price);\r\n\r\n            if(price != 0 && price != 1 && price != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/getstockinfo\", {\r\n                \"stockCode\": stockcode,\r\n                \"date\": date,\r\n                \"price\": price,\r\n                type: \"4\"\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATA_CN_STOCK_AMOUNT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            //股票代码\r\n            var stockcode = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(stockcode)){\r\n                return stockcode;\r\n            }\r\n\r\n            //日期\r\n            var date = null;\r\n\r\n            if(arguments[1] != null){\r\n                var data_date = arguments[1];\r\n\r\n                if(getObjType(data_date) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(data_date) == \"object\" && data_date.startCell != null){\r\n                    if(data_date.data != null && getObjType(data_date.data) != \"array\" && data_date.data.ct != null && data_date.data.ct.t == \"d\"){\r\n                        date = update(\"yyyy-mm-dd\", data_date.data.v);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n                else{\r\n                    date = data_date;\r\n                }\r\n\r\n                if(!isdatetime(date)){\r\n                    return [formula.error.v, \"日期错误\"];\r\n                }\r\n\r\n                date = dayjs(date).format(\"YYYY-MM-DD\");\r\n            }\r\n\r\n            //复权除权\r\n            var price = 0;\r\n            if (arguments[2] != null) {\r\n                price = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(price)){\r\n                    return price;\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(price)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            price = parseInt(price);\r\n\r\n            if(price != 0 && price != 1 && price != 2){\r\n                return formula.error.v;\r\n            }\r\n\r\n            $.post(\"/dataqk/tu/api/getstockinfo\", {\r\n                \"stockCode\": stockcode,\r\n                \"date\": date,\r\n                \"price\": price,\r\n                type: \"5\"\r\n            }, function(data) {\r\n                var d = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cell_r, cell_c, data);\r\n                d[cell_r][cell_c] = {\r\n                    \"v\": data,\r\n                    \"f\": cell_fp\r\n                };\r\n                jfrefreshgrid(d, [{\"row\": [cell_r, cell_r], \"column\": [cell_c, cell_c]}]);\r\n            });\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISDATE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //日期\r\n            var date = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(date)){\r\n                return date;\r\n            }\r\n\r\n            return isdatetime(date);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMIF\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //=SUMIF(A2:A5,\">1600000\",B2:B5)\r\n            //=SUMIF(A2:A5,\">1600000\")\r\n            //=SUMIF(A2:A5,3000000,B2:B5)\r\n            //找出range中匹配的字符串\r\n            var sum = 0;\r\n\r\n            var rangeData = arguments[0].data;\r\n            var rangeRow = arguments[0].rowl;\r\n            var rangeCol = arguments[0].coll;\r\n\r\n            var criteria = luckysheet_parseData(arguments[1]);\r\n\r\n            rangeData = formula.getRangeArray(rangeData)[0];\r\n\r\n            //如果有第三个参数\r\n            if(arguments[2]){\r\n                var sumRangeData = [];\r\n                //根据选择的目标的区域确定实际目标区域\r\n                //初始位置\r\n                var sumRangeStart = arguments[2].startCell;\r\n                var sumRangeRow = arguments[2].rowl;\r\n                var sumRangeCol = arguments[2].coll;\r\n                var sumRangeSheet = arguments[2].sheetName;\r\n\r\n                if(rangeRow == sumRangeRow && rangeCol == sumRangeCol){\r\n                    sumRangeData = arguments[2].data;\r\n                }\r\n                else{\r\n                    var row=[],col=[];\r\n                    var sumRangeEnd = \"\";\r\n                    var realSumRange = \"\";\r\n                    //console.log(\"开始位置！！！\",sumRangeStart,typeof(sumRangeStart));\r\n                    row[0] = parseInt(sumRangeStart.replace(/[^0-9]/g,\"\")) - 1;\r\n                    col[0] = ABCatNum(sumRangeStart.replace(/[^A-Za-z]/g,\"\"));\r\n\r\n                    //根据第一个范围的长宽确定目标范围的末尾位置\r\n                    row[1] = row[0] + rangeRow - 1;\r\n                    col[1] = col[0] + rangeCol - 1;\r\n\r\n                    //console.log(row[0],col[0],row[1],col[1]);\r\n                    //末尾位置转化为sheet格式：如 F4\r\n                    var real_ABC = chatatABC(col[1]);\r\n                    var real_Num = row[1] + 1;\r\n                    sumRangeEnd = real_ABC + real_Num;\r\n                    //console.log(\"合成新的末尾位置：\" + sumRangeEnd);\r\n\r\n                    realSumRange = sumRangeSheet + \"!\" +sumRangeStart + \":\" + sumRangeEnd;\r\n                    sumRangeData = luckysheet_getcelldata(realSumRange).data;\r\n                    //console.log(\"最终的目标范围：\",sumRangeData);\r\n                }\r\n\r\n                sumRangeData = formula.getRangeArray(sumRangeData)[0];\r\n\r\n                //循环遍历查找匹配项\r\n                for(var i = 0; i < rangeData.length;i++){\r\n                    var v = rangeData[i];\r\n\r\n                    if(!!v && formula.acompareb(v, criteria)){\r\n                        if(!isRealNum(sumRangeData[i])){\r\n                            continue;\r\n                        }\r\n\r\n                        sum = luckysheet_calcADPMM(sum, \"+\", sumRangeData[i]);// parseFloat(sumRangeData[i]);\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                //循环遍历查找匹配项\r\n                for(var i = 0; i < rangeData.length;i++){\r\n                    var v = rangeData[i];\r\n\r\n                    if(!!v && formula.acompareb(v, criteria)){\r\n                        if(!isRealNum(v)){\r\n                            continue;\r\n                        }\r\n\r\n                        sum = luckysheet_calcADPMM(sum, \"\", v);// parseFloat(v);\r\n                    }\r\n                }\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TAN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.tan(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TANH\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            var e2 = Math.exp(2 * number);\r\n\r\n            return (e2 - 1) / (e2 + 1);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CEILING\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //number\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //significance\r\n            var significance = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(significance)){\r\n                return significance;\r\n            }\r\n\r\n            if(!isRealNum(significance)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            significance = parseFloat(significance);\r\n\r\n            if(significance == 0){\r\n                return 0;\r\n            }\r\n\r\n            if(number > 0 && significance < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.ceil(number / significance) * significance;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ATAN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.atan(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ASINH\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.log(number + Math.sqrt(number * number + 1));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ABS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.abs(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ACOS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number < -1 || number > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.acos(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ACOSH\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.log(number + Math.sqrt(number * number - 1));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MULTINOMIAL\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var sum = 0, divisor = 1;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                if(number < 0){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                sum += number;\r\n                divisor *= func_methods.factorial(number);\r\n            }\r\n\r\n            return func_methods.factorial(sum) / divisor;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ATANH\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number <= -1 ||　number >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.log((1 + number) / (1 - number)) / 2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ATAN2\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要计算其与x轴夹角大小的线段的终点x坐标\r\n            var number_x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number_x)){\r\n                return number_x;\r\n            }\r\n\r\n            if(!isRealNum(number_x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_x = parseFloat(number_x);\r\n\r\n            //要计算其与x轴夹角大小的线段的终点y坐标\r\n            var number_y = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(number_y)){\r\n                return number_y;\r\n            }\r\n\r\n            if(!isRealNum(number_y)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_y = parseFloat(number_y);\r\n\r\n            if(number_x == 0 && number_y == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return Math.atan2(number_y, number_x);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUNTBLANK\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var data = arguments[0];\r\n            var sum = 0;\r\n\r\n            if(getObjType(data) == \"object\" && data.startCell != null){\r\n                if(data.data == null){\r\n                    return 1;\r\n                }\r\n\r\n                if(getObjType(data.data) == \"array\"){\r\n                    for(var r = 0; r < data.data.length; r++){\r\n                        for(var c = 0; c < data.data[r].length; c++){\r\n                            if(data.data[r][c] == null || isRealNull(data.data[r][c].v)){\r\n                                sum++;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    if(isRealNull(data.data.v)){\r\n                        sum++;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COSH\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return (Math.exp(number) + Math.exp(-number)) / 2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"INT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var data = arguments[0];\r\n\r\n            if(getObjType(data) == \"array\"){\r\n                if(getObjType(data[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    if(!isRealNum(data[0][0])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    return Math.floor(parseFloat(data[0][0]));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data[0])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    return Math.floor(parseFloat(data[0]));\r\n                }\r\n            }\r\n            else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                if(data.coll > 1){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                if(data.rowl > 1){\r\n                    var cellrange = formula.getcellrange(data.startCell);\r\n                    var str = cellrange.row[0];\r\n\r\n                    if(window.luckysheetCurrentRow < str || window.luckysheetCurrentRow > str + data.rowl - 1){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    var cell = data.data[window.luckysheetCurrentRow - str][0];\r\n                }\r\n                else{\r\n                    var cell = data.data;\r\n                }\r\n\r\n                if(cell == null || isRealNull(cell.v)){\r\n                    return 0;\r\n                }\r\n\r\n                if(!isRealNum(cell.v)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                return Math.floor(parseFloat(cell.v));\r\n            }\r\n            else{\r\n                if(getObjType(data) == \"boolean\"){\r\n                    if(data.toString().toLowerCase() == \"true\"){\r\n                        return 1;\r\n                    }\r\n\r\n                    if(data.toString().toLowerCase() == \"false\"){\r\n                        return 0;\r\n                    }\r\n                }\r\n\r\n                if(!isRealNum(data)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                return Math.floor(parseFloat(data));\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISEVEN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            return Math.abs(number) & 1 ? false : true;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISODD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            return Math.abs(number) & 1 ? true : false;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LCM\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var o = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\"){\r\n                        if(!func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        o = o.concat(func_methods.getDataArr(data));\r\n                    }\r\n                    else{\r\n                        o = o.concat(data);\r\n                    }\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    o = o.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    o.push(data);\r\n                }\r\n            }\r\n\r\n            for(var y = 0; y < o.length; y++){\r\n                var number = o[y];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseInt(number);\r\n\r\n                if(number < 0){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                o[y] = number;\r\n            }\r\n\r\n            for (var i, j, n, d, r = 1; (n = o.pop()) !== undefined;) {\r\n                if(n == 0){\r\n                    r = 0;\r\n                }\r\n\r\n                while (n > 1) {\r\n                    if (n % 2) {\r\n                        for (i = 3, j = Math.floor(Math.sqrt(n)); i <= j && n % i; i += 2) {\r\n                            //empty\r\n                        }\r\n\r\n                        d = (i <= j) ? i : n;\r\n                    }\r\n                    else {\r\n                        d = 2;\r\n                    }\r\n\r\n                    for (n /= d, r *= d, i = o.length; i; (o[--i] % d) === 0 && (o[i] /= d) === 1 && o.splice(i, 1)) {\r\n                        //empty\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(r >= Math.pow(2, 53)){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return r;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.log(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOG\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(arguments.length == 2){\r\n                var base = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(base)){\r\n                    return base;\r\n                }\r\n\r\n                if(!isRealNum(base)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                base = parseFloat(base);\r\n\r\n                if(base <= 0){\r\n                    return formula.error.nm;\r\n                }\r\n            }\r\n            else{\r\n                var base = 10;\r\n            }\r\n\r\n            return Math.log(number) / Math.log(base);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOG10\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.log(number) / Math.log(10);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MOD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //被除数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //除数\r\n            var divisor = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(divisor)){\r\n                return divisor;\r\n            }\r\n\r\n            if(!isRealNum(divisor)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            divisor = parseFloat(divisor);\r\n\r\n            if(divisor == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //计算结果\r\n            var modulus = Math.abs(number % divisor);\r\n            return (divisor > 0) ? modulus : -modulus;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MROUND\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要舍入的值\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //要舍入到的倍数\r\n            var multiple = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(multiple)){\r\n                return multiple;\r\n            }\r\n\r\n            if(!isRealNum(multiple)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            multiple = parseFloat(multiple);\r\n\r\n            if (number * multiple < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算结果\r\n            return Math.round(number / multiple) * multiple;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ODD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            var temp = Math.ceil(Math.abs(number));\r\n            temp = (temp & 1) ? temp : temp + 1;\r\n            return (number >= 0) ? temp : -temp;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMSQ\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var sum = 0;\r\n\r\n            if(dataArr.length > 0){\r\n                for(var i = 0; i < dataArr.length; i++){\r\n                    var number = dataArr[i];\r\n\r\n                    if(!isRealNum(number)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    number = parseFloat(number);\r\n\r\n                    sum += number * number;\r\n                }\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COMBIN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //项目的数量\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            //每一组合中项目的数量\r\n            var number_chosen = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(number_chosen)){\r\n                return number_chosen;\r\n            }\r\n\r\n            if(!isRealNum(number_chosen)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_chosen = parseInt(number_chosen);\r\n\r\n            if (number < 0 || number_chosen < 0 || number < number_chosen){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算结果\r\n            return func_methods.factorial(number) / (func_methods.factorial(number_chosen) * func_methods.factorial(number - number_chosen))\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUBTOTAL\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数字 1-11 或 101-111，用于指定要为分类汇总使用的函数\r\n            var data_function_num = arguments[0];\r\n            var function_num;\r\n\r\n            if(getObjType(data_function_num) == \"array\"){\r\n                if(getObjType(data_function_num[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_function_num)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    function_num = [];\r\n\r\n                    for(var i = 0; i < data_function_num.length; i++){\r\n                        var rowArr = [];\r\n\r\n                        for(var j = 0; j < data_function_num[i].length; j++){\r\n                            rowArr.push(data_function_num[i][j]);\r\n                        }\r\n\r\n                        function_num.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    function_num = [];\r\n\r\n                    for(var i = 0; i < data_function_num.length; i++){\r\n                        function_num.push(data_function_num[i]);\r\n                    }\r\n                }\r\n            }\r\n            else if(getObjType(data_function_num) == \"object\" && data_function_num.startCell != null){\r\n                function_num = func_methods.getFirstValue(data_function_num);\r\n            }\r\n            else{\r\n                function_num = data_function_num;\r\n            }\r\n\r\n            var arr = Array.prototype.slice.apply(arguments);\r\n            arr.shift();\r\n\r\n            //计算结果\r\n            if(getObjType(function_num) == \"array\"){\r\n                var result = [];\r\n\r\n                if(getObjType(function_num[0]) == \"array\"){\r\n                    for(var i = 0; i < function_num.length; i++){\r\n                        var rowArr = [];\r\n\r\n                        for(var j = 0; j < function_num[i].length; j++){\r\n                            var value = function_num[i][j];\r\n\r\n                            if(valueIsError(value)){\r\n                                rowArr.push(value);\r\n                            }\r\n                            else if(!isRealNum(value)){\r\n                                rowArr.push(formula.error.v);\r\n                            }\r\n                            else{\r\n                                value = parseInt(value);\r\n\r\n                                if(value < 1 || value > 111 || (value > 11 && value < 101)){\r\n                                    rowArr.push(formula.error.v);\r\n                                }\r\n                                else{\r\n                                    rowArr.push(compute(value));\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    for(var i = 0; i < function_num.length; i++){\r\n                        var value = function_num[i];\r\n\r\n                        if(valueIsError(value)){\r\n                            result.push(value);\r\n                        }\r\n                        else if(!isRealNum(value)){\r\n                            result.push(formula.error.v);\r\n                        }\r\n                        else{\r\n                            value = parseInt(value);\r\n\r\n                            if(value < 1 || value > 111 || (value > 11 && value < 101)){\r\n                                result.push(formula.error.v);\r\n                            }\r\n                            else{\r\n                                result.push(compute(value));\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return result;\r\n            }\r\n            else{\r\n                if(valueIsError(function_num)){\r\n                    return function_num;\r\n                }\r\n\r\n                if(!isRealNum(function_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                function_num = parseInt(function_num);\r\n\r\n                if(function_num < 1 || function_num > 111 || (function_num > 11 && function_num < 101)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                return compute(function_num);\r\n            }\r\n\r\n\r\n            function compute(function_num){\r\n                switch(function_num){\r\n                    case 1:    //AVERAGE\r\n                    case 101:\r\n                        return window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, arr);\r\n                        break;\r\n                    case 2:    //COUNT\r\n                    case 102:\r\n                        return window.luckysheet_function.COUNT.f.apply(window.luckysheet_function.COUNT, arr);\r\n                        break;\r\n                    case 3:    //COUNTA\r\n                    case 103:\r\n                        return window.luckysheet_function.COUNTA.f.apply(window.luckysheet_function.COUNTA, arr);\r\n                        break;\r\n                    case 4:    //MAX\r\n                    case 104:\r\n                        return window.luckysheet_function.MAX.f.apply(window.luckysheet_function.MAX, arr);\r\n                        break;\r\n                    case 5:    //MIN\r\n                    case 105:\r\n                        return window.luckysheet_function.MIN.f.apply(window.luckysheet_function.MIN, arr);\r\n                        break;\r\n                    case 6:    //PRODUCT\r\n                    case 106:\r\n                        return window.luckysheet_function.PRODUCT.f.apply(window.luckysheet_function.PRODUCT, arr);\r\n                        break;\r\n                    case 7:    //STDEV\r\n                    case 107:\r\n                        return window.luckysheet_function.STDEVA.f.apply(window.luckysheet_function.STDEVA, arr);\r\n                        break;\r\n                    case 8:    //STDEVP\r\n                    case 108:\r\n                        return window.luckysheet_function.STDEVP.f.apply(window.luckysheet_function.STDEVP, arr);\r\n                        break;\r\n                    case 9:    //SUM\r\n                    case 109:\r\n                        return window.luckysheet_function.SUM.f.apply(window.luckysheet_function.SUM, arr);\r\n                        break;\r\n                    case 10:   //VAR\r\n                    case 110:\r\n                        return window.luckysheet_function.VAR_S.f.apply(window.luckysheet_function.VAR_S, arr);\r\n                        break;\r\n                    case 11:   //VARP\r\n                    case 111:\r\n                        return window.luckysheet_function.VAR_P.f.apply(window.luckysheet_function.VAR_P, arr);\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ASIN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number < -1 || number > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.asin(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUNTIF\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //范围\r\n            var data_range = arguments[0];\r\n            var range;\r\n\r\n            if(getObjType(data_range) == \"object\" && data_range.startCell != null){\r\n                range = data_range.data;\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //条件\r\n            var data_criteria = arguments[1];\r\n            var criteria;\r\n\r\n            if(getObjType(data_criteria) == \"array\"){\r\n                criteria = [];\r\n\r\n                if(getObjType(data_criteria[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_criteria)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    for(var i = 0; i < data_criteria.length; i++){\r\n                        var rowArr = [];\r\n\r\n                        for(var j = 0; j < data_criteria[i].length; j++){\r\n                            rowArr.push(data_criteria[i][j]);\r\n                        }\r\n\r\n                        criteria.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    for(var i = 0; i < data_criteria.length; i++){\r\n                        criteria.push(data_criteria[i]);\r\n                    }\r\n                }\r\n            }\r\n            else if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.rowl > 1 || data_criteria.coll > 1){\r\n                    return 0;\r\n                }\r\n\r\n                criteria = data_criteria.data.v;\r\n            }\r\n            else{\r\n                criteria = data_criteria;\r\n            }\r\n\r\n            //计算\r\n            if(getObjType(criteria) == \"array\"){\r\n                var result = [];\r\n\r\n                if(getObjType(criteria[0]) == \"array\"){\r\n                    for(var i = 0; i < criteria.length; i++){\r\n                        var rowArr = [];\r\n\r\n                        for(var j = 0; j < criteria[i].length; j++){\r\n                            rowArr.push(getCriteriaResult(range, criteria[i][j]));\r\n                        }\r\n\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    for(var i = 0; i < criteria.length; i++){\r\n                        result.push(getCriteriaResult(range, criteria[i]));\r\n                    }\r\n                }\r\n\r\n                return result;\r\n            }\r\n            else{\r\n                return getCriteriaResult(range, criteria);\r\n            }\r\n\r\n            function getCriteriaResult(range, criter){\r\n                if (!/[<>=!*?]/.test(criter)) {\r\n                    criter = '==\"' + criter + '\"';\r\n                }\r\n\r\n                criter = criter.replace(\"<>\", \"!=\");\r\n\r\n                var matches = 0;\r\n\r\n                if(getObjType(range) == \"array\"){\r\n                    for (var i = 0; i < range.length; i++) {\r\n                        for(var j = 0; j < range[i].length; j++){\r\n                            if(range[i][j] != null && !isRealNull(range[i][j].v)){\r\n                                var value = range[i][j].v;\r\n\r\n                                if(criter.indexOf(\"*\") > -1 || criter.indexOf(\"?\") > -1){\r\n                                    if(formula.isWildcard(value, criter)){\r\n                                        matches++;\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    if (typeof value !== 'string') {\r\n                                        if (new Function(\"return \" + value + criter)()) {\r\n                                            matches++;\r\n                                        }\r\n                                    }\r\n                                    else {\r\n                                        if (new Function(\"return \" + '\"' + value + '\"' + criter)()) {\r\n                                            matches++;\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    if(range != null && !isRealNull(range.v)){\r\n                        var value = range.v;\r\n\r\n                        if(criter.indexOf(\"*\") > -1 || criter.indexOf(\"?\") > -1){\r\n                            if(formula.isWildcard(value, criter)){\r\n                                matches++;\r\n                            }\r\n                        }\r\n                        else{\r\n                            if (typeof value !== 'string') {\r\n                                if (new Function(\"return \" + value + criter)()) {\r\n                                    matches++;\r\n                                }\r\n                            }\r\n                            else {\r\n                                if (new Function(\"return \" + '\"' + value + '\"' + criter)()) {\r\n                                    matches++;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                return matches;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RADIANS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return number * Math.PI / 180;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RAND\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        try {\r\n            return Math.floor(Math.random() * 1000000000) / 1000000000;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUNTUNIQUE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            return window.luckysheet_function.UNIQUE.f(dataArr);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DEGREES\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return number * 180 / Math.PI;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ERFC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return jStat.erfc(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EVEN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            var temp = Math.ceil(Math.abs(number));\r\n            temp = (temp & 1) ? temp + 1 : temp;\r\n            return (number > 0) ? temp : -temp;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EXP\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.exp(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FACT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                if(getObjType(number) == \"boolean\"){\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        number = 1;\r\n                    }\r\n                    else if(number.toString().toLowerCase() == \"false\"){\r\n                        number = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            if(number < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return func_methods.factorial(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FACTDOUBLE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                if(getObjType(number) == \"boolean\"){\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        number = 1;\r\n                    }\r\n                    else if(number.toString().toLowerCase() == \"false\"){\r\n                        number = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            if(number < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return func_methods.factorialDouble(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PI\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        try {\r\n            return Math.PI;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FLOOR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //number\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //significance\r\n            var significance = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(significance)){\r\n                return significance;\r\n            }\r\n\r\n            if(!isRealNum(significance)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            significance = parseFloat(significance);\r\n\r\n            if(significance == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            if(number > 0 && significance < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var precision = -Math.floor(Math.log(Math.abs(significance)) / Math.log(10));\r\n\r\n            if (number >= 0) {\r\n                return (Math.floor(number / significance) * significance) * Math.pow(10, precision) / Math.pow(10, precision);\r\n            }\r\n            else {\r\n                return -((Math.ceil(Math.abs(number) / significance) * significance) * Math.pow(10, precision)) / Math.pow(10, precision);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GCD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", false));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            if(!isRealNum(dataArr[0])){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var x = parseInt(dataArr[0]);\r\n\r\n            if(x < 0 || x >= Math.pow(2, 53)){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            for (var i = 1; i < dataArr.length; i++) {\r\n                var y = dataArr[i];\r\n\r\n                if(!isRealNum(y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                y = parseInt(y);\r\n\r\n                if(y < 0 || y >= Math.pow(2, 53)){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                while (x && y) {\r\n                    if (x > y) {\r\n                        x %= y;\r\n                    }\r\n                    else {\r\n                        y %= x;\r\n                    }\r\n                }\r\n\r\n                x += y;\r\n            }\r\n\r\n            return x;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RANDBETWEEN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //下界\r\n            var bottom = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(bottom)){\r\n                return bottom;\r\n            }\r\n\r\n            if(!isRealNum(bottom)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            bottom = parseInt(bottom);\r\n\r\n            //上界\r\n            var top = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(top)){\r\n                return top;\r\n            }\r\n\r\n            if(!isRealNum(top)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            top = parseInt(top);\r\n\r\n            if(bottom > top){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            return bottom + Math.ceil((top - bottom + 1) * Math.random()) - 1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ROUND\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //四舍五入的数字\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //位数\r\n            var digits = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(digits)){\r\n                return digits;\r\n            }\r\n\r\n            if(!isRealNum(digits)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            digits = parseInt(digits);\r\n\r\n            //计算\r\n            var sign = (number > 0) ? 1 : -1;\r\n            return sign * (Math.round(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ROUNDDOWN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //四舍五入的数字\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //位数\r\n            var digits = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(digits)){\r\n                return digits;\r\n            }\r\n\r\n            if(!isRealNum(digits)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            digits = parseInt(digits);\r\n\r\n            //计算\r\n            var sign = (number > 0) ? 1 : -1;\r\n            return sign * (Math.floor(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ROUNDUP\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //四舍五入的数字\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //位数\r\n            var digits = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(digits)){\r\n                return digits;\r\n            }\r\n\r\n            if(!isRealNum(digits)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            digits = parseInt(digits);\r\n\r\n            //计算\r\n            var sign = (number > 0) ? 1 : -1;\r\n            return sign * (Math.ceil(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SERIESSUM\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //幂级数的输入值\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //x 的首项乘幂\r\n            var n = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(n)){\r\n                return n;\r\n            }\r\n\r\n            if(!isRealNum(n)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            n = parseFloat(n);\r\n\r\n            //级数中每一项的乘幂 n 的步长增加值\r\n            var m = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(m)){\r\n                return m;\r\n            }\r\n\r\n            if(!isRealNum(m)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            m = parseFloat(m);\r\n\r\n            //与 x 的每个连续乘幂相乘的一组系数\r\n            var data_coefficients = arguments[3];\r\n            var coefficients = [];\r\n\r\n            if(getObjType(data_coefficients) == \"array\"){\r\n                if(getObjType(data_coefficients[0]) == \"array\" && !func_methods.isDyadicArr(data_coefficients)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                coefficients = coefficients.concat(func_methods.getDataArr(data_coefficients, false));\r\n            }\r\n            else if(getObjType(data_coefficients) == \"object\" && data_coefficients.startCell != null){\r\n                coefficients = coefficients.concat(func_methods.getCellDataArr(data_coefficients, \"number\", false));\r\n            }\r\n            else{\r\n                coefficients.push(data_coefficients);\r\n            }\r\n\r\n            //计算\r\n            if(!isRealNum(coefficients[0])){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var result = parseFloat(coefficients[0]) * Math.pow(x, n);\r\n\r\n            for (var i = 1; i < coefficients.length; i++) {\r\n                var number = coefficients[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                result += number * Math.pow(x, n + i * m);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SIGN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number > 0){\r\n                return 1;\r\n            }\r\n            else if(number == 0){\r\n                return 0;\r\n            }\r\n            else if(number < 0){\r\n                return -1;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SIN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.sin(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SINH\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return (Math.exp(number) - Math.exp(-number)) / 2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SQRT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.sqrt(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SQRTPI\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.sqrt(number * Math.PI);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GAMMALN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            if(number <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.gammaln(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            return Math.cos(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TRUNC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要截取的数据\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //位数\r\n            if(arguments.length == 2){\r\n                var digits = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(digits)){\r\n                    return digits;\r\n                }\r\n\r\n                if(!isRealNum(digits)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                digits = parseInt(digits);\r\n            }\r\n            else{\r\n                var digits = 0;\r\n            }\r\n\r\n            //计算\r\n            var sign = (number > 0) ? 1 : -1;\r\n            return sign * (Math.floor(Math.abs(number) * Math.pow(10, digits))) / Math.pow(10, digits);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"QUOTIENT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //被除数\r\n            var numerator = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(numerator)){\r\n                return numerator;\r\n            }\r\n\r\n            if(!isRealNum(numerator)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            numerator = parseFloat(numerator);\r\n\r\n            //除数\r\n            var denominator = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(denominator)){\r\n                return denominator;\r\n            }\r\n\r\n            if(!isRealNum(denominator)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            denominator = parseFloat(denominator);\r\n\r\n            if(denominator == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //计算\r\n            return parseInt(numerator / denominator, 10);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"POWER\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //底数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //指数\r\n            var power = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(power)){\r\n                return power;\r\n            }\r\n\r\n            if(!isRealNum(power)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            power = parseFloat(power);\r\n\r\n            if(number == 0 && power == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(number < 0 && power.toString().indexOf(\".\") > -1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.pow(number, power);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMIFS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var sum = 0;\r\n            var args = arguments;\r\n            luckysheet_getValue(args);\r\n            var rangeData = formula.getRangeArray(args[0])[0];\r\n            var results = new Array(rangeData.length);\r\n\r\n            for(var i = 0;i < results.length; i++){\r\n                results[i] = true;\r\n            }\r\n\r\n            for(var i = 1; i < args.length; i += 2){\r\n                var range = formula.getRangeArray(args[i])[0];\r\n                var criteria = args[i+1];\r\n                for(var j = 0; j < range.length; j++){\r\n                    var v = range[j];\r\n                    results[j] = results[j] && (!!v) && formula.acompareb(v,criteria);\r\n                }\r\n            }\r\n\r\n            for(var i = 0; i < rangeData.length; i++){\r\n                if(results[i]){\r\n                    sum = luckysheet_calcADPMM(sum, \"+\", rangeData[i]); //parseFloat(rangeData[i]);\r\n                }\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GET_TARGET\": function() {\r\n        try {   \r\n                var luckysheetCurrentIndex = window.luckysheetCurrentIndex;\r\n                var currentSheetIndex = Store.currentSheetIndex;\r\n                if(luckysheetCurrentIndex !== currentSheetIndex){\r\n                    return\r\n                }\r\n                var startRow = window.luckysheetCurrentRow;\r\n                var startColumn = window.luckysheetCurrentColumn;\r\n                \r\n                // const {row, column} = Store.luckysheet_select_save[0];\r\n                // const startRow = row[0]\r\n                // const endRow = row[1]\r\n                // const startColumn = column[0]\r\n                // const endColumn = column[1]\r\n                var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n                setTimeout(() => {\r\n                    var d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n                    const target = excelToLuckyArray(companyTargetData);\r\n\r\n                    const rowheight = startRow + target.length;\r\n                    const colwidth = startColumn + target[0].length;\r\n                    \r\n                    if(rowheight >= d.length && colwidth >= d[0].length){\r\n                        d = datagridgrowth(d,rowheight - d.length + 1, colwidth - d[0].length + 1)\r\n                    }else if(rowheight >= d.length){\r\n                        d = datagridgrowth(d,rowheight - d.length + 1, 0)\r\n                    }else if(colwidth >= d[0].length){\r\n                        d = datagridgrowth(d,0, colwidth - d[0].length + 1)\r\n                    }\r\n\r\n                    target.forEach((row,r)=>{\r\n                        row.forEach((cell,c)=>{\r\n                            // d[startRow+r][startColumn+c] = Object.assign({},d[startRow+r][startColumn+c],cell)\r\n                            setcellvalue(startRow+r,startColumn+c,d,cell)\r\n                        })\r\n                    })\r\n\r\n                    d[startRow][startColumn].f = cell_fp\r\n                    delete d[startRow][startColumn].m;\r\n\r\n                    // 切换到包含远程公式的页之后300ms内又切换到其他页，不需要刷新，否则会导致公式页的数据刷到当前页\r\n                    if(currentSheetIndex === Store.currentSheetIndex){\r\n                        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n                        file.row = d.length\r\n                        file.data = d\r\n                        jfrefreshgridall(\r\n                            d[0].length,\r\n                            d.length,\r\n                            d,\r\n                            null,\r\n                            Store.luckysheet_select_save,\r\n                            \"datachangeAll\",\r\n                            undefined,\r\n                            undefined,\r\n                        );\r\n\r\n                        // jfrefreshgrid(d, [{\"row\": [startRow, startRow+target.length], \"column\": [startColumn, startColumn + target[0].length]}]);\r\n                    }else{\r\n                        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n                        file.data = d\r\n                    }\r\n                    \r\n                }, 300);\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GET_AIRTABLE_DATA\": function() {\r\n\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var luckysheetCurrentIndex = window.luckysheetCurrentIndex;\r\n            var currentSheetIndex = Store.currentSheetIndex;\r\n            if(luckysheetCurrentIndex !== currentSheetIndex){\r\n                return\r\n            }\r\n\r\n            var startRow = window.luckysheetCurrentRow;\r\n            var startColumn = window.luckysheetCurrentColumn;\r\n\r\n            // airtable url\r\n            const url = func_methods.getFirstValue(arguments[0]);\r\n            // 表示要排序的列的数字\r\n            const sort_index = func_methods.getFirstValue(arguments[1]);\r\n            // 表示所需排序顺序的数字；1表示升序（默认），0表示降序\r\n            const sort_order = func_methods.getFirstValue(arguments[2]);\r\n            // const {row, column} = Store.luckysheet_select_save[0];\r\n            // const startRow = row[0]\r\n            // const endRow = row[1]\r\n            // const startColumn = column[0]\r\n            // const endColumn = column[1]\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n            var d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n            getAirTable(url,sort_index,sort_order,(data)=>{\r\n                const rowheight = startRow + data.length;\r\n                const colwidth = startColumn + data[0].length;\r\n                \r\n                if(rowheight >= d.length && colwidth >= d[0].length){\r\n                    d = datagridgrowth(d,rowheight - d.length + 1, colwidth - d[0].length + 1)\r\n                }else if(rowheight >= d.length){\r\n                    d = datagridgrowth(d,rowheight - d.length + 1, 0)\r\n                }else if(colwidth >= d[0].length){\r\n                    d = datagridgrowth(d,0, colwidth - d[0].length + 1)\r\n                }\r\n\r\n                data.forEach((row,r)=>{\r\n                    row.forEach((cell,c)=>{\r\n                        // d[startRow+r][startColumn+c] = Object.assign({},d[startRow+r][startColumn+c],{v:cell})\r\n                        setcellvalue(startRow+r,startColumn+c,d,cell)\r\n                    })\r\n                })\r\n\r\n                d[startRow][startColumn].f = cell_fp\r\n                delete d[startRow][startColumn].m;\r\n\r\n                // 切换到包含远程公式的页之后300ms内又切换到其他页，不需要刷新，否则会导致公式页的数据刷到当前页\r\n                if(currentSheetIndex === Store.currentSheetIndex){\r\n                    let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n                    file.row = d.length\r\n                    file.data = d\r\n                    jfrefreshgridall(\r\n                        d[0].length,\r\n                        d.length,\r\n                        d,\r\n                        null,\r\n                        Store.luckysheet_select_save,\r\n                        \"datachangeAll\",\r\n                        undefined,\r\n                        undefined,\r\n                    );\r\n                    // jfrefreshgrid(d, [{\"row\": [startRow, startRow+data.length], \"column\": [startColumn, startColumn + data[0].length]}]);\r\n                }else{\r\n                    let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n                    file.data = d\r\n                }\r\n                \r\n                \r\n            },(e)=>{\r\n                var err = e;\r\n                err = formula.errorInfo(err);\r\n                return [formula.error.v, err];\r\n            });\r\n            \r\n        return \"loading...\";\r\n    }\r\n    catch (e) {\r\n        var err = e;\r\n        err = formula.errorInfo(err);\r\n        return [formula.error.v, err];\r\n    }\r\n    },\r\n    \"ASK_AI\": function() {\r\n         //必要参数个数错误检测\r\n         if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n        try {   \r\n                let luckysheetCurrentIndex = window.luckysheetCurrentIndex;\r\n                let currentSheetIndex = Store.currentSheetIndex;\r\n                if(luckysheetCurrentIndex !== currentSheetIndex){\r\n                    return\r\n                }\r\n                var startRow = window.luckysheetCurrentRow;\r\n                var startColumn = window.luckysheetCurrentColumn;\r\n                // const {row, column} = Store.luckysheet_select_save[0];\r\n                // const startRow = row[0]\r\n                // const endRow = row[1]\r\n                // const startColumn = column[0]\r\n                // const endColumn = column[1]\r\n                var cell_fp = window.luckysheetCurrentFunction;\r\n\r\n                var args = arguments;\r\n                var targetText =  func_methods.getFirstValue(arguments[0]);\r\n                var rangeData\r\n                if(args[1]){\r\n                    rangeData = formula.getRangeArrayTwo(args[1].data);\r\n                }else{\r\n                    // 默认是target数据\r\n                    rangeData = excelToArray(companyTargetData)\r\n                }\r\n                \r\n                const companyTarget  = excelToArray(companyTargetData)\r\n                \r\n\r\n                let resultTable = askAIData(rangeData,companyTarget)\r\n\r\n                // 没有传数据，默认为target数据\r\n                if(!args[1]){\r\n                    if(targetText.indexOf('10月') !== -1){\r\n                        resultTable = excelToLuckyArray(companyTargetData10);\r\n                    }else if(targetText.indexOf('11月') !== -1){\r\n                        resultTable = excelToLuckyArray(companyTargetData11);\r\n                    }else if(targetText.indexOf('12月') !== -1){\r\n                        resultTable = excelToLuckyArray(companyTargetData12);\r\n                    }else{\r\n                        resultTable = excelToLuckyArray(companyTargetData11);\r\n                    }\r\n                    \r\n                }\r\n\r\n                setTimeout(() => {\r\n                    var d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n                    const rowheight = startRow + resultTable.length;\r\n                    const colwidth = startColumn + resultTable[0].length;\r\n                    \r\n                    if(rowheight >= d.length && colwidth >= d[0].length){\r\n                        d = datagridgrowth(d,rowheight - d.length + 1, colwidth - d[0].length + 1)\r\n                    }else if(rowheight >= d.length){\r\n                        d = datagridgrowth(d,rowheight - d.length + 1, 0)\r\n                    }else if(colwidth >= d[0].length){\r\n                        d = datagridgrowth(d,0, colwidth - d[0].length + 1)\r\n                    }\r\n                        \r\n                    resultTable.forEach((row,r)=>{\r\n                        row.forEach((cell,c)=>{\r\n                            // d[startRow+r][startColumn+c] = Object.assign({},d[startRow+r][startColumn+c],cell)\r\n                            setcellvalue(startRow+r,startColumn+c,d,cell)\r\n                        })\r\n                    })\r\n                    d[startRow][startColumn].f = cell_fp\r\n                    delete d[startRow][startColumn].m;\r\n                    \r\n                    // 切换到包含远程公式的页之后300ms内又切换到其他页，不需要刷新，否则会导致公式页的数据刷到当前页\r\n                    if(currentSheetIndex === Store.currentSheetIndex){\r\n                        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n                        file.row = d.length\r\n                        file.data = d\r\n                        jfrefreshgridall(\r\n                            d[0].length,\r\n                            d.length,\r\n                            d,\r\n                            null,\r\n                            Store.luckysheet_select_save,\r\n                            \"datachangeAll\",\r\n                            undefined,\r\n                            undefined,\r\n                        );\r\n\r\n                        // jfrefreshgrid(d, [{\"row\": [startRow, startRow+resultTable.length], \"column\": [startColumn, startColumn + resultTable[0].length]}]);\r\n                    }else{\r\n                        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n                        file.data = d\r\n                    }\r\n                    \r\n                }, 300);\r\n\r\n            return \"loading...\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUNTIFS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var args = arguments;\r\n            luckysheet_getValue(args);\r\n            var results = new Array(formula.getRangeArray(args[0])[0].length);\r\n            for(var i = 0;i < results.length; i++){\r\n                results[i] = true;\r\n            }\r\n            for(var i = 0; i < args.length; i += 2){\r\n                var range = formula.getRangeArray(args[i])[0];\r\n                var criteria = args[i+1];\r\n                for(var j = 0; j < range.length; j++){\r\n                    var v = range[j];\r\n                    results[j] = results[j] && (!!v) && formula.acompareb(v,criteria);\r\n                }\r\n            }\r\n            var result = 0;\r\n            for(var i = 0; i < results.length; i++){\r\n                if(results[i]){\r\n                    result++;\r\n                }\r\n            }\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PRODUCT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var result = 1;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                result *= number;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HARMEAN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var den = 0, len = 0;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                if(number <= 0){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                den += 1 / number;\r\n                len++;\r\n            }\r\n\r\n            return len / den;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HYPGEOMDIST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //样本中成功的次数\r\n            var sample_s = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(sample_s)){\r\n                return sample_s;\r\n            }\r\n\r\n            if(!isRealNum(sample_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            sample_s = parseInt(sample_s);\r\n\r\n            //样本量\r\n            var number_sample = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(number_sample)){\r\n                return number_sample;\r\n            }\r\n\r\n            if(!isRealNum(number_sample)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_sample = parseInt(number_sample);\r\n\r\n            //总体中成功的次数\r\n            var population_s = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(population_s)){\r\n                return population_s;\r\n            }\r\n\r\n            if(!isRealNum(population_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            population_s = parseInt(population_s);\r\n\r\n            //总体大小\r\n            var number_pop = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(number_pop)){\r\n                return number_pop;\r\n            }\r\n\r\n            if(!isRealNum(number_pop)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_pop = parseInt(number_pop);\r\n\r\n            //决定函数形式的逻辑值\r\n            var cumulative = func_methods.getCellBoolen(arguments[4]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(sample_s < 0 || sample_s > Math.min(number_sample, population_s) || sample_s < Math.max(0, number_sample - number_pop + population_s)){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(number_sample <= 0 || number_sample > number_pop){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(population_s <= 0 || population_s > number_pop){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(number_pop <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            function pdf(x, n, M, N) {\r\n                var a = func_methods.factorial(M) / (func_methods.factorial(x) * func_methods.factorial(M - x));\r\n                var b = func_methods.factorial(N - M) / (func_methods.factorial(n - x) * func_methods.factorial(N - M - n + x));\r\n                var c = func_methods.factorial(N) / (func_methods.factorial(n) * func_methods.factorial(N - n));\r\n\r\n                return a * b / c;\r\n            }\r\n\r\n            function cdf(x, n, M, N) {\r\n                var sum = 0;\r\n\r\n                for (var i = 0; i <= x; i++) {\r\n                    sum += pdf(i, n, M, N);\r\n                }\r\n\r\n                return sum;\r\n            }\r\n\r\n            return (cumulative) ? cdf(sample_s, number_sample, population_s, number_pop) : pdf(sample_s, number_sample, population_s, number_pop);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"INTERCEPT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //x轴上用于预测的值\r\n            var x = 0;\r\n\r\n            //代表因变量数据数组或矩阵的范围\r\n            var data_known_y = arguments[0];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            //代表自变量数据数组或矩阵的范围\r\n            var data_known_x = arguments[1];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            if(known_y.length != known_x.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y 和 known_x 只取数值\r\n            var data_y = [], data_x = [];\r\n\r\n            for(var i = 0; i < known_y.length; i++){\r\n                var num_y = known_y[i];\r\n                var num_x = known_x[i];\r\n\r\n                if(isRealNum(num_y) && isRealNum(num_x)){\r\n                    data_y.push(parseFloat(num_y));\r\n                    data_x.push(parseFloat(num_x));\r\n                }\r\n            }\r\n\r\n            if(func_methods.variance_s(data_x) == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //计算\r\n            var xmean = jStat.mean(data_x);\r\n            var ymean = jStat.mean(data_y);\r\n\r\n            var n = data_x.length;\r\n            var num = 0;\r\n            var den = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                num += (data_x[i] - xmean) * (data_y[i] - ymean);\r\n                den += Math.pow(data_x[i] - xmean, 2);\r\n            }\r\n\r\n            var b = num / den;\r\n            var a = ymean - b * xmean;\r\n\r\n            return a + b * x;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"KURT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            //剔除不是数值类型的值\r\n            var dataArr_n = [];\r\n\r\n            for(var j = 0; j < dataArr.length; j++){\r\n                var number = dataArr[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                dataArr_n.push(number);\r\n            }\r\n\r\n            if(dataArr_n.length < 4 || func_methods.standardDeviation_s(dataArr_n) == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //计算\r\n            var mean = jStat.mean(dataArr_n);\r\n            var n = dataArr_n.length;\r\n\r\n            var sigma = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                sigma += Math.pow(dataArr_n[i] - mean, 4);\r\n            }\r\n\r\n            sigma = sigma / Math.pow(jStat.stdev(dataArr_n, true), 4);\r\n\r\n            return ((n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3))) * sigma - 3 * (n - 1) * (n - 1) / ((n - 2) * (n - 3));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LARGE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数组或范围\r\n            var dataArr = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr = dataArr.concat(func_methods.getDataArr(arguments[0], true));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                dataArr = dataArr.concat(func_methods.getCellDataArr(arguments[0], \"text\", true));\r\n            }\r\n            else{\r\n                dataArr.push(arguments[0]);\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var j = 0; j < dataArr.length; j++){\r\n                var number = dataArr[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number)\r\n\r\n                dataArr_n.push(number);\r\n            }\r\n\r\n            //要返回的元素的排行位置\r\n            var n;\r\n\r\n            if(getObjType(arguments[1]) == \"array\"){\r\n                if(getObjType(arguments[1][0]) == \"array\" && !func_methods.isDyadicArr(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                n = func_methods.getDataArr(arguments[1]);\r\n            }\r\n            else if(getObjType(arguments[1]) == \"object\" && arguments[1].startCell != null){\r\n                if(arguments[1].rowl > 1 || arguments[1].coll > 1){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                var cell = arguments[1].data;\r\n\r\n                if(cell == null || isRealNull(cell.v)){\r\n                    var n = 0;\r\n                }\r\n                else{\r\n                    var n = cell.v;\r\n                }\r\n            }\r\n            else{\r\n                n = arguments[1];\r\n            }\r\n\r\n            //计算\r\n            if(getObjType(n) == \"array\"){\r\n                if(dataArr_n.length == 0){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                var result = [];\r\n\r\n                for(var i = 0; i < n.length; i++){\r\n                    if(!isRealNum(n[i])){\r\n                        result.push(formula.error.v);\r\n                        continue;\r\n                    }\r\n\r\n                    n[i] = Math.ceil(parseFloat(n[i]));\r\n\r\n                    if(n[i] <= 0 || n[i] > dataArr_n.length){\r\n                        result.push(formula.error.nm);\r\n                        continue;\r\n                    }\r\n\r\n                    result.push(dataArr.sort(function(a, b) { return b - a; })[n[i] - 1]);\r\n                }\r\n\r\n                return result;\r\n            }\r\n            else{\r\n                if(!isRealNum(n)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                n = Math.ceil(parseFloat(n));\r\n\r\n                if(dataArr_n.length == 0){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                if(n <= 0 || n > dataArr_n.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return dataArr.sort(function(a, b) {\r\n                    return b - a;\r\n                })[n - 1];\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STDEVA\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", false));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            //不是数值类型的值转化成数字（true为1，false和文本为0）\r\n            var dataArr_n = [];\r\n\r\n            for(var j = 0; j < dataArr.length; j++){\r\n                var number = dataArr[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        number = 1;\r\n                    }\r\n                    else{\r\n                        number = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    number = parseFloat(number);\r\n                }\r\n\r\n                dataArr_n.push(number);\r\n            }\r\n\r\n            if(dataArr_n.length == 0){\r\n                return 0;\r\n            }\r\n\r\n            if(dataArr_n.length == 1){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return func_methods.standardDeviation_s(dataArr_n);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STDEVP\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            //剔除不是数值类型的值\r\n            var dataArr_n = [];\r\n\r\n            for(var j = 0; j < dataArr.length; j++){\r\n                var number = dataArr[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                dataArr_n.push(number);\r\n            }\r\n\r\n            if(dataArr_n.length == 0){\r\n                return 0;\r\n            }\r\n\r\n            if(dataArr_n.length == 1){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return func_methods.standardDeviation(dataArr_n);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GEOMEAN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", true));\r\n                }\r\n                else{\r\n                    if(getObjType(data) == \"boolean\"){\r\n                        if(data.toString().toLowerCase() == \"true\"){\r\n                            dataArr.push(1);\r\n                        }\r\n                        else if(data.toString().toLowerCase() == \"false\"){\r\n                            dataArr.push(0);\r\n                        }\r\n                    }\r\n                    else if(isRealNum(data)){\r\n                        dataArr.push(data);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n\r\n            //剔除不是数值类型的值\r\n            var dataArr_n = [];\r\n\r\n            for(var j = 0; j < dataArr.length; j++){\r\n                var number = dataArr[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    continue;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                if(number <= 0){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                dataArr_n.push(number);\r\n            }\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.geomean(dataArr_n);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RANK_EQ\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要确定其排名的值\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //包含相关数据集的数组或范围\r\n            var data_ref = arguments[1];\r\n            var ref = [];\r\n\r\n            if(getObjType(data_ref) == \"array\"){\r\n                if(getObjType(data_ref[0]) == \"array\" && !func_methods.isDyadicArr(data_ref)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                ref = ref.concat(func_methods.getDataArr(data_ref, true));\r\n            }\r\n            else if(getObjType(data_ref) == \"object\" && data_ref.startCell != null){\r\n                ref = ref.concat(func_methods.getCellDataArr(data_ref, \"number\", true));\r\n            }\r\n            else{\r\n                ref.push(data_ref);\r\n            }\r\n\r\n            var ref_n = [];\r\n\r\n            for(var j = 0; j < ref.length; j++){\r\n                var num = ref[j];\r\n\r\n                if(!isRealNum(num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                num = parseFloat(num);\r\n\r\n                ref_n.push(num);\r\n            }\r\n\r\n            //要按升序还是按降序考虑“data”中的值\r\n            if(arguments.length == 3){\r\n                var order = func_methods.getCellBoolen(arguments[2]);\r\n\r\n                if(valueIsError(order)){\r\n                    return order;\r\n                }\r\n            }\r\n            else{\r\n                var order = false;\r\n            }\r\n\r\n            //计算\r\n            var sort = (order) ? function(a, b) {\r\n                return a - b;\r\n            } : function(a, b) {\r\n                return b - a;\r\n            };\r\n\r\n            ref_n = ref_n.sort(sort);\r\n\r\n            var index = ref_n.indexOf(number);\r\n\r\n            if(index == -1){\r\n                return formula.error.na;\r\n            }\r\n            else{\r\n                return index + 1;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RANK_AVG\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要确定其排名的值\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //包含相关数据集的数组或范围\r\n            var data_ref = arguments[1];\r\n            var ref = [];\r\n\r\n            if(getObjType(data_ref) == \"array\"){\r\n                if(getObjType(data_ref[0]) == \"array\" && !func_methods.isDyadicArr(data_ref)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                ref = ref.concat(func_methods.getDataArr(data_ref, true));\r\n            }\r\n            else if(getObjType(data_ref) == \"object\" && data_ref.startCell != null){\r\n                ref = ref.concat(func_methods.getCellDataArr(data_ref, \"number\", true));\r\n            }\r\n            else{\r\n                ref.push(data_ref);\r\n            }\r\n\r\n            var ref_n = [];\r\n\r\n            for(var j = 0; j < ref.length; j++){\r\n                var num = ref[j];\r\n\r\n                if(!isRealNum(num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                num = parseFloat(num);\r\n\r\n                ref_n.push(num);\r\n            }\r\n\r\n            //要按升序还是按降序考虑“data”中的值\r\n            if(arguments.length == 3){\r\n                var order = func_methods.getFirstValue(arguments[2]);\r\n\r\n                if(valueIsError(order)){\r\n                    return order;\r\n                }\r\n\r\n                if(getObjType(order) == \"boolean\"){\r\n\r\n                }\r\n                else if(getObjType(order) == \"string\" && (order.toLowerCase() == \"true\" || order.toLowerCase() == \"false\")){\r\n                    if(order.toLowerCase() == \"true\"){\r\n                        order = true;\r\n                    }\r\n\r\n                    if(order.toLowerCase() == \"false\"){\r\n                        order = false;\r\n                    }\r\n                }\r\n                else if(isRealNum(order)){\r\n                    order = parseFloat(order);\r\n\r\n                    order = order == 0 ? false : true;\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n            else{\r\n                var order = false;\r\n            }\r\n\r\n            //计算\r\n            var sort = (order) ? function(a, b) {\r\n                return a - b;\r\n            } : function(a, b) {\r\n                return b - a;\r\n            };\r\n\r\n            ref_n = ref_n.sort(sort);\r\n\r\n            var count = 0;\r\n            for (var i = 0; i < ref_n.length; i++) {\r\n                if (ref_n[i] == number) {\r\n                    count++;\r\n                }\r\n            }\r\n\r\n            return (count > 1) ? (2 * ref_n.indexOf(number) + count + 1) / 2 : ref_n.indexOf(number) + 1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PERCENTRANK_EXC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //包含相关数据集的数组或范围\r\n            var data_ref = arguments[0];\r\n            var ref = [];\r\n\r\n            if(getObjType(data_ref) == \"array\"){\r\n                if(getObjType(data_ref[0]) == \"array\" && !func_methods.isDyadicArr(data_ref)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                ref = ref.concat(func_methods.getDataArr(data_ref, true));\r\n            }\r\n            else if(getObjType(data_ref) == \"object\" && data_ref.startCell != null){\r\n                ref = ref.concat(func_methods.getCellDataArr(data_ref, \"number\", true));\r\n            }\r\n            else{\r\n                ref.push(data_ref);\r\n            }\r\n\r\n            var ref_n = [];\r\n\r\n            for(var j = 0; j < ref.length; j++){\r\n                var number = ref[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                ref_n.push(number);\r\n            }\r\n\r\n            //要确定其百分比排位的值\r\n            var x = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //要在计算中使用的有效位数\r\n            if(arguments.length == 3){\r\n                var significance = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(significance)){\r\n                    return significance;\r\n                }\r\n\r\n                if(!isRealNum(significance)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                significance = parseInt(significance);\r\n            }\r\n            else{\r\n                var significance = 3;\r\n            }\r\n\r\n            if(ref_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(significance < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            if(ref_n.length == 1 && ref_n[0] == x){\r\n                return 1;\r\n            }\r\n\r\n            ref_n = ref_n.sort(function(a, b) {\r\n                return a - b;\r\n            });\r\n            var uniques = window.luckysheet_function.UNIQUE.f(ref_n)[0];\r\n\r\n            var n = ref_n.length;\r\n            var m = uniques.length;\r\n\r\n            var power = Math.pow(10, significance);\r\n            var result = 0;\r\n            var match = false;\r\n            var i = 0;\r\n\r\n            while (!match && i < m) {\r\n                if (x === uniques[i]) {\r\n                    result = (ref_n.indexOf(uniques[i]) + 1) / (n + 1);\r\n                    match = true;\r\n                }\r\n                else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\r\n                    result = (ref_n.lastIndexOf(uniques[i]) + 1 + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n + 1);\r\n                    match = true;\r\n                }\r\n\r\n                i++;\r\n            }\r\n\r\n            if(isNaN(result)){\r\n                return formula.error.na;\r\n            }\r\n            else{\r\n                return Math.floor(result * power) / power;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PERCENTRANK_INC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //包含相关数据集的数组或范围\r\n            var data_ref = arguments[0];\r\n            var ref = [];\r\n\r\n            if(getObjType(data_ref) == \"array\"){\r\n                if(getObjType(data_ref[0]) == \"array\" && !func_methods.isDyadicArr(data_ref)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                ref = ref.concat(func_methods.getDataArr(data_ref, true));\r\n            }\r\n            else if(getObjType(data_ref) == \"object\" && data_ref.startCell != null){\r\n                ref = ref.concat(func_methods.getCellDataArr(data_ref, \"number\", true));\r\n            }\r\n            else{\r\n                ref.push(data_ref);\r\n            }\r\n\r\n            var ref_n = [];\r\n\r\n            for(var j = 0; j < ref.length; j++){\r\n                var number = ref[j];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number = parseFloat(number);\r\n\r\n                ref_n.push(number);\r\n            }\r\n\r\n            //要确定其百分比排位的值\r\n            var x = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //要在计算中使用的有效位数\r\n            if(arguments.length == 3){\r\n                var significance = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(significance)){\r\n                    return significance;\r\n                }\r\n\r\n                if(!isRealNum(significance)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                significance = parseInt(significance);\r\n            }\r\n            else{\r\n                var significance = 3;\r\n            }\r\n\r\n            if(ref_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(significance < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            if(ref_n.length == 1 && ref_n[0] == x){\r\n                return 1;\r\n            }\r\n\r\n            ref_n = ref_n.sort(function(a, b) {\r\n                return a - b;\r\n            });\r\n            var uniques = window.luckysheet_function.UNIQUE.f(ref_n)[0];\r\n\r\n            var n = ref_n.length;\r\n            var m = uniques.length;\r\n\r\n            var power = Math.pow(10, significance);\r\n            var result = 0;\r\n            var match = false;\r\n            var i = 0;\r\n\r\n            while (!match && i < m) {\r\n                if (x === uniques[i]) {\r\n                    result = ref_n.indexOf(uniques[i]) / (n - 1);\r\n                    match = true;\r\n                }\r\n                else if (x >= uniques[i] && (x < uniques[i + 1] || i === m - 1)) {\r\n                    result = (ref_n.lastIndexOf(uniques[i]) + (x - uniques[i]) / (uniques[i + 1] - uniques[i])) / (n - 1);\r\n                    match = true;\r\n                }\r\n\r\n                i++;\r\n            }\r\n\r\n            if(isNaN(result)){\r\n                return formula.error.na;\r\n            }\r\n            else{\r\n                return Math.floor(result * power) / power;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FORECAST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //x轴上用于预测的值\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //代表因变量数据数组或矩阵的范围\r\n            var data_known_y = arguments[1];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            //代表自变量数据数组或矩阵的范围\r\n            var data_known_x = arguments[2];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            if(known_y.length != known_x.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y 和 known_x 只取数值\r\n            var data_y = [], data_x = [];\r\n\r\n            for(var i = 0; i < known_y.length; i++){\r\n                var num_y = known_y[i];\r\n                var num_x = known_x[i];\r\n\r\n                if(isRealNum(num_y) && isRealNum(num_x)){\r\n                    data_y.push(parseFloat(num_y));\r\n                    data_x.push(parseFloat(num_x));\r\n                }\r\n            }\r\n\r\n            if(func_methods.variance_s(data_x) == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //计算\r\n            var xmean = jStat.mean(data_x);\r\n            var ymean = jStat.mean(data_y);\r\n\r\n            var n = data_x.length;\r\n            var num = 0;\r\n            var den = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                num += (data_x[i] - xmean) * (data_y[i] - ymean);\r\n                den += Math.pow(data_x[i] - xmean, 2);\r\n            }\r\n\r\n            var b = num / den;\r\n            var a = ymean - b * xmean;\r\n\r\n            return a + b * x;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FISHERINV\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var y = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(y)){\r\n                return y;\r\n            }\r\n\r\n            if(!isRealNum(y)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            y = parseFloat(y);\r\n\r\n            var e2y = Math.exp(2 * y);\r\n\r\n            return (e2y - 1) / (e2y + 1);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FISHER\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            if(x <= -1 || x >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.log((1 + x) / (1 - x)) / 2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MODE_SNGL\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            var count = {};\r\n            var maxItems = [];\r\n            var max = 0;\r\n            var currentItem;\r\n\r\n            for (var i = 0; i < dataArr_n.length; i++) {\r\n                currentItem = dataArr_n[i];\r\n                count[currentItem] = count[currentItem] ? count[currentItem] + 1 : 1;\r\n\r\n                if (count[currentItem] > max) {\r\n                    max = count[currentItem];\r\n                    maxItems = [];\r\n                }\r\n\r\n                if (count[currentItem] == max) {\r\n                    maxItems[maxItems.length] = currentItem;\r\n                }\r\n            }\r\n\r\n            if(max <= 1){\r\n                return formula.error.na;\r\n            }\r\n\r\n            var resultIndex = dataArr_n.indexOf(maxItems[0]);\r\n\r\n            for(var j = 0; j < maxItems.length; j++){\r\n                var index = dataArr_n.indexOf(maxItems[j]);\r\n\r\n                if(index < resultIndex){\r\n                    resultIndex = index;\r\n                }\r\n            }\r\n\r\n            return dataArr_n[resultIndex];\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"WEIBULL_DIST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //WEIBULL 分布函数的输入值\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //Weibull 分布函数的形状参数\r\n            var alpha = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(alpha)){\r\n                return alpha;\r\n            }\r\n\r\n            if(!isRealNum(alpha)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            alpha = parseFloat(alpha);\r\n\r\n            //Weibull 分布函数的尺度参数\r\n            var beta = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(beta)){\r\n                return beta;\r\n            }\r\n\r\n            if(!isRealNum(beta)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            beta = parseFloat(beta);\r\n\r\n            //决定函数形式的逻辑值\r\n            var cumulative = func_methods.getCellBoolen(arguments[3]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(x < 0 || alpha <= 0 || beta <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? 1 - Math.exp(-Math.pow(x / beta, alpha)) : Math.pow(x, alpha - 1) * Math.exp(-Math.pow(x / beta, alpha)) * alpha / Math.pow(beta, alpha);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AVEDEV\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.sum(jStat(dataArr_n).subtract(jStat.mean(dataArr_n)).abs()[0]) / dataArr_n.length;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AVERAGEA\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(number.toString.toLowerCase() == \"true\"){\r\n                        dataArr.push(1);\r\n                    }\r\n                    else if(number.toString.toLowerCase() == \"false\"){\r\n                        dataArr.push(0);\r\n                    }\r\n                    else if(isRealNum(data)){\r\n                        dataArr.push(data);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var sum = 0,\r\n                count = 0;\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    sum += parseFloat(number);\r\n                }\r\n                else{\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        sum += 1;\r\n                    }\r\n                    else{\r\n                        sum += 0;\r\n                    }\r\n                }\r\n\r\n                count++;\r\n            }\r\n\r\n            if(count == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return sum / count;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BINOM_DIST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //试验的成功次数\r\n            var number_s = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number_s)){\r\n                return number_s;\r\n            }\r\n\r\n            if(!isRealNum(number_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_s = parseInt(number_s);\r\n\r\n            //独立检验的次数\r\n            var trials = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(trials)){\r\n                return trials;\r\n            }\r\n\r\n            if(!isRealNum(trials)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            trials = parseInt(trials);\r\n\r\n            //任一给定检验的成功概率\r\n            var probability_s = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(probability_s)){\r\n                return probability_s;\r\n            }\r\n\r\n            if(!isRealNum(probability_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability_s = parseFloat(probability_s);\r\n\r\n            //是否使用二项式累积分布\r\n            var cumulative = func_methods.getCellBoolen(arguments[3]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(number_s < 0 || number_s > trials){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(probability_s < 0 || probability_s > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.binomial.cdf(number_s, trials, probability_s) : jStat.binomial.pdf(number_s, trials, probability_s);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BINOM_INV\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //贝努利试验次数\r\n            var trials = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(trials)){\r\n                return trials;\r\n            }\r\n\r\n            if(!isRealNum(trials)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            trials = parseInt(trials);\r\n\r\n            //任一次给定检验的成功概率\r\n            var probability_s = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(probability_s)){\r\n                return probability_s;\r\n            }\r\n\r\n            if(!isRealNum(probability_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability_s = parseFloat(probability_s);\r\n\r\n            //期望的临界概率\r\n            var alpha = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(alpha)){\r\n                return alpha;\r\n            }\r\n\r\n            if(!isRealNum(alpha)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            alpha = parseFloat(alpha);\r\n\r\n            if(trials < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(probability_s < 0 || probability_s > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(alpha < 0 || alpha > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var x = 0;\r\n            while (x <= trials) {\r\n                if (jStat.binomial.cdf(x, trials, probability_s) >= alpha) {\r\n                    return x;\r\n                }\r\n\r\n                x++;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CONFIDENCE_NORM\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //置信水平\r\n            var alpha = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(alpha)){\r\n                return alpha;\r\n            }\r\n\r\n            if(!isRealNum(alpha)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            alpha = parseFloat(alpha);\r\n\r\n            //数据区域的总体标准偏差\r\n            var standard_dev = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(standard_dev)){\r\n                return standard_dev;\r\n            }\r\n\r\n            if(!isRealNum(standard_dev)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            standard_dev = parseFloat(standard_dev);\r\n\r\n            //样本总量的大小\r\n            var size = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(size)){\r\n                return size;\r\n            }\r\n\r\n            if(!isRealNum(size)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            size = parseInt(size);\r\n\r\n            if(alpha <= 0 || alpha >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(standard_dev <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(size < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.normalci(1, alpha, standard_dev, size)[1] - 1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CORREL\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //代表因变量数据数组或矩阵的范围\r\n            var data_known_y = arguments[0];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            //代表自变量数据数组或矩阵的范围\r\n            var data_known_x = arguments[1];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            if(known_y.length != known_x.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y 和 known_x 只取数值\r\n            var data_y = [], data_x = [];\r\n\r\n            for(var i = 0; i < known_y.length; i++){\r\n                var num_y = known_y[i];\r\n                var num_x = known_x[i];\r\n\r\n                if(isRealNum(num_y) && isRealNum(num_x)){\r\n                    data_y.push(parseFloat(num_y));\r\n                    data_x.push(parseFloat(num_x));\r\n                }\r\n            }\r\n\r\n            if(data_y.length == 0 || data_x.length == 0 || func_methods.standardDeviation(data_y) == 0 || func_methods.standardDeviation(data_x) == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return jStat.corrcoeff(data_y, data_x);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COVARIANCE_P\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //代表自变量数据数组或矩阵的范围\r\n            var data_known_x = arguments[0];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            //代表因变量数据数组或矩阵的范围\r\n            var data_known_y = arguments[1];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            if(known_x.length != known_y.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y 和 known_x 只取数值\r\n            var data_x = [], data_y = [];\r\n\r\n            for(var i = 0; i < known_x.length; i++){\r\n                var num_x = known_x[i];\r\n                var num_y = known_y[i];\r\n\r\n                if(isRealNum(num_x) && isRealNum(num_y)){\r\n                    data_x.push(parseFloat(num_x));\r\n                    data_y.push(parseFloat(num_y));\r\n                }\r\n            }\r\n\r\n            if(data_x.length == 0 || data_y.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //计算\r\n            var mean1 = jStat.mean(data_x);\r\n            var mean2 = jStat.mean(data_y);\r\n\r\n            var result = 0;\r\n\r\n            for (var i = 0; i < data_x.length; i++) {\r\n                result += (data_x[i] - mean1) * (data_y[i] - mean2);\r\n            }\r\n\r\n            result = result / data_x.length;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COVARIANCE_S\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //代表自变量数据数组或矩阵的范围\r\n            var data_known_x = arguments[0];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            //代表因变量数据数组或矩阵的范围\r\n            var data_known_y = arguments[1];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            if(known_x.length != known_y.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y 和 known_x 只取数值\r\n            var data_x = [], data_y = [];\r\n\r\n            for(var i = 0; i < known_x.length; i++){\r\n                var num_x = known_x[i];\r\n                var num_y = known_y[i];\r\n\r\n                if(isRealNum(num_x) && isRealNum(num_y)){\r\n                    data_x.push(parseFloat(num_x));\r\n                    data_y.push(parseFloat(num_y));\r\n                }\r\n            }\r\n\r\n            if(data_x.length == 0 || data_y.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return jStat.covariance(data_x, data_y);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DEVSQ\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        if(getObjType(data) == \"boolean\"){\r\n                            if(data.toString().toLowerCase() == \"true\"){\r\n                                dataArr.push(1);\r\n                            }\r\n                            else if(data.toString().toLowerCase() == \"false\"){\r\n                                dataArr.push(0);\r\n                            }\r\n                        }\r\n                        else{\r\n                            return formula.error.v;\r\n                        }\r\n                    }\r\n                    else{\r\n                        dataArr.push(data);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            var mean = jStat.mean(dataArr_n);\r\n            var result = 0;\r\n\r\n            for (var i = 0; i < dataArr_n.length; i++) {\r\n                result += Math.pow((dataArr_n[i] - mean), 2);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EXPON_DIST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //指数分布函数的输入值\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //用于指定指数分布函数的 lambda 值\r\n            var lambda = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(lambda)){\r\n                return lambda;\r\n            }\r\n\r\n            if(!isRealNum(lambda)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            lambda = parseFloat(lambda);\r\n\r\n            //是否使用指数累积分布\r\n            var cumulative = func_methods.getCellBoolen(arguments[2]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(x < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(lambda < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.exponential.cdf(x, lambda) : jStat.exponential.pdf(x, lambda);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AVERAGEIF\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var sum = 0;\r\n            var count = 0;\r\n\r\n            var rangeData = arguments[0].data;\r\n            var rangeRow = arguments[0].rowl;\r\n            var rangeCol = arguments[0].coll;\r\n            var criteria = luckysheet_parseData(arguments[1]);\r\n            var sumRangeData = [];\r\n\r\n            //如果有第三个参数\r\n            if(arguments[2]){\r\n                //根据选择的目标的区域确定实际目标区域\r\n                //初始位置\r\n                var sumRangeStart = arguments[2].startCell;\r\n                var sumRangeRow = arguments[2].rowl;\r\n                var sumRangeCol = arguments[2].coll;\r\n                var sumRangeSheet = arguments[2].sheetName;\r\n\r\n                if(rangeRow == sumRangeRow && rangeCol == sumRangeCol){\r\n                    sumRangeData = arguments[2].data;\r\n                }\r\n                else{\r\n                    var row=[],col=[];\r\n                    var sumRangeEnd = \"\";\r\n                    var realSumRange = \"\";\r\n                    //console.log(\"开始位置！！！\",sumRangeStart,typeof(sumRangeStart));\r\n                    row[0] = parseInt(sumRangeStart.replace(/[^0-9]/g,\"\")) - 1;\r\n                    col[0] = ABCatNum(sumRangeStart.replace(/[^A-Za-z]/g,\"\"));\r\n\r\n                    //根据第一个范围的长宽确定目标范围的末尾位置\r\n                    row[1] = row[0] + rangeRow - 1;\r\n                    col[1] = col[0] + rangeCol - 1;\r\n\r\n                    //console.log(row[0],col[0],row[1],col[1]);\r\n                    //末尾位置转化为sheet格式：如 F4\r\n                    var real_ABC = chatatABC(col[1]);\r\n                    var real_Num = row[1] + 1;\r\n                    sumRangeEnd = real_ABC + real_Num;\r\n                    //console.log(\"合成新的末尾位置：\" + sumRangeEnd);\r\n\r\n                    realSumRange = sumRangeSheet + \"!\" +sumRangeStart + \":\" + sumRangeEnd;\r\n                    sumRangeData = luckysheet_getcelldata(realSumRange).data;\r\n                    //console.log(\"最终的目标范围：\",sumRangeData);\r\n                }\r\n\r\n                sumRangeData = formula.getRangeArray(sumRangeData)[0];\r\n            }\r\n            rangeData = formula.getRangeArray(rangeData)[0];\r\n\r\n            //循环遍历查找匹配项\r\n            for(var i = 0; i < rangeData.length;i++){\r\n                var v = rangeData[i];\r\n                if(!!v && formula.acompareb(v, criteria)){\r\n                    var vnow = sumRangeData[i] || v;\r\n\r\n                    if(!isRealNum(vnow)){\r\n                        continue;\r\n                    }\r\n\r\n                    sum += parseFloat(vnow);\r\n                    count++;\r\n                }\r\n            }\r\n\r\n            if(sum == 0 || count == 0){\r\n                return formula.error.d;\r\n            }\r\n            else{\r\n                return numFormat(sum / count);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AVERAGEIFS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var sum = 0;\r\n            var count = 0;\r\n            var args = arguments;\r\n            luckysheet_getValue(args);\r\n            var rangeData = formula.getRangeArray(args[0])[0];\r\n            var results = new Array(rangeData.length);\r\n            for(var i = 0;i < results.length; i++){\r\n                results[i] = true;\r\n            }\r\n            for(var i = 1; i < args.length; i += 2){\r\n                var range = formula.getRangeArray(args[i])[0];\r\n                var criteria = args[i+1];\r\n                for(var j = 0; j < range.length; j++){\r\n                    var v = range[j];\r\n                    results[j] = results[j] && (!!v) && formula.acompareb(v,criteria);\r\n                }\r\n            }\r\n            for(var i = 0; i < rangeData.length; i++){\r\n                if(results[i] && isRealNum(rangeData[i])){\r\n                    sum += parseFloat(rangeData[i]);\r\n                    count ++;\r\n                }\r\n            }\r\n\r\n            if(sum == 0 || count == 0){\r\n                return formula.error.d;\r\n            }\r\n            else{\r\n                return numFormat(sum / count);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PERMUT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //表示对象个数的整数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            //表示每个排列中对象个数的整数\r\n            var number_chosen = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(number_chosen)){\r\n                return number_chosen;\r\n            }\r\n\r\n            if(!isRealNum(number_chosen)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_chosen = parseInt(number_chosen);\r\n\r\n            if(number <= 0 || number_chosen < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(number < number_chosen){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return func_methods.factorial(number) / func_methods.factorial(number - number_chosen);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TRIMMEAN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //包含相关数据集的数组或范围\r\n            var data_dataArr = arguments[0];\r\n            var dataArr = [];\r\n\r\n            if(getObjType(data_dataArr) == \"array\"){\r\n                if(getObjType(data_dataArr[0]) == \"array\" && !func_methods.isDyadicArr(data_dataArr)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr = dataArr.concat(func_methods.getDataArr(data_dataArr, false));\r\n            }\r\n            else if(getObjType(data_dataArr) == \"object\" && data_dataArr.startCell != null){\r\n                dataArr = dataArr.concat(func_methods.getCellDataArr(data_dataArr, \"number\", false));\r\n            }\r\n            else{\r\n                dataArr.push(data_dataArr);\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //排除比例\r\n            var percent = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(percent)){\r\n                return percent;\r\n            }\r\n\r\n            if(!isRealNum(percent)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            percent = parseFloat(percent);\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(percent < 0 || percent > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            function rest(array, idx) {\r\n                idx = idx || 1;\r\n                if (!array || typeof array.slice !== 'function') {\r\n                    return array;\r\n                }\r\n                return array.slice(idx);\r\n            };\r\n\r\n            function initial(array, idx) {\r\n                idx = idx || 1;\r\n                if (!array || typeof array.slice !== 'function') {\r\n                    return array;\r\n                }\r\n                return array.slice(0, array.length - idx);\r\n            };\r\n\r\n            dataArr_n.sort(function(a, b) {\r\n                return a - b;\r\n            })\r\n\r\n            var trim = window.luckysheet_function.FLOOR.f(dataArr_n.length * percent, 2) / 2;\r\n\r\n            var result = rest(dataArr_n, trim);\r\n            result = initial(result, trim);\r\n            result = jStat.mean(result);\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PERCENTILE_EXC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //定义相对位置的数组或数据区域\r\n            var data_dataArr = arguments[0];\r\n            var dataArr = [];\r\n\r\n            if(getObjType(data_dataArr) == \"array\"){\r\n                if(getObjType(data_dataArr[0]) == \"array\" && !func_methods.isDyadicArr(data_dataArr)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr = dataArr.concat(func_methods.getDataArr(data_dataArr, false));\r\n            }\r\n            else if(getObjType(data_dataArr) == \"object\" && data_dataArr.startCell != null){\r\n                dataArr = dataArr.concat(func_methods.getCellDataArr(data_dataArr, \"number\", false));\r\n            }\r\n            else{\r\n                dataArr.push(data_dataArr);\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //0 到 1 之间的百分点值，不包含 0 和 1\r\n            var k = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(k)){\r\n                return k;\r\n            }\r\n\r\n            if(!isRealNum(k)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            k = parseFloat(k);\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(k <= 0 || k >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            dataArr_n = dataArr_n.sort(function(a, b) {\r\n                return a - b;\r\n            });\r\n\r\n            var n = dataArr_n.length;\r\n\r\n            if (k < 1 / (n + 1) || k > 1 - 1 / (n + 1)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            var l = k * (n + 1) - 1;\r\n            var fl = Math.floor(l);\r\n\r\n            return (l === fl) ? dataArr_n[l] : dataArr_n[fl] + (l - fl) * (dataArr_n[fl + 1] - dataArr_n[fl]);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PERCENTILE_INC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //定义相对位置的数组或数据区域\r\n            var data_dataArr = arguments[0];\r\n            var dataArr = [];\r\n\r\n            if(getObjType(data_dataArr) == \"array\"){\r\n                if(getObjType(data_dataArr[0]) == \"array\" && !func_methods.isDyadicArr(data_dataArr)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr = dataArr.concat(func_methods.getDataArr(data_dataArr, false));\r\n            }\r\n            else if(getObjType(data_dataArr) == \"object\" && data_dataArr.startCell != null){\r\n                dataArr = dataArr.concat(func_methods.getCellDataArr(data_dataArr, \"number\", false));\r\n            }\r\n            else{\r\n                dataArr.push(data_dataArr);\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //0 到 1 之间的百分点值，不包含 0 和 1\r\n            var k = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(k)){\r\n                return k;\r\n            }\r\n\r\n            if(!isRealNum(k)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            k = parseFloat(k);\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(k < 0 || k > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            dataArr_n = dataArr_n.sort(function(a, b) {\r\n                return a - b;\r\n            });\r\n\r\n            var n = dataArr_n.length;\r\n\r\n            var l = k * (n - 1);\r\n            var fl = Math.floor(l);\r\n\r\n            return (l === fl) ? dataArr_n[l] : dataArr_n[fl] + (l - fl) * (dataArr_n[fl + 1] - dataArr_n[fl]);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PEARSON\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //代表自变量数据数组或矩阵的范围\r\n            var data_known_x = arguments[0];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            //代表因变量数据数组或矩阵的范围\r\n            var data_known_y = arguments[1];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            if(known_x.length != known_y.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y 和 known_x 只取数值\r\n            var data_x = [], data_y = [];\r\n\r\n            for(var i = 0; i < known_x.length; i++){\r\n                var num_x = known_x[i];\r\n                var num_y = known_y[i];\r\n\r\n                if(isRealNum(num_x) && isRealNum(num_y)){\r\n                    data_x.push(parseFloat(num_x));\r\n                    data_y.push(parseFloat(num_y));\r\n                }\r\n            }\r\n\r\n            if(data_y.length == 0 || data_x.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //计算\r\n            var xmean = jStat.mean(data_x);\r\n            var ymean = jStat.mean(data_y);\r\n\r\n            var n = data_x.length;\r\n            var num = 0;\r\n            var den1 = 0;\r\n            var den2 = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                num += (data_x[i] - xmean) * (data_y[i] - ymean);\r\n                den1 += Math.pow(data_x[i] - xmean, 2);\r\n                den2 += Math.pow(data_y[i] - ymean, 2);\r\n            }\r\n\r\n            return num / Math.sqrt(den1 * den2);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NORM_S_INV\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //对应于正态分布的概率\r\n            var probability = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(probability)){\r\n                return probability;\r\n            }\r\n\r\n            if(!isRealNum(probability)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability = parseFloat(probability);\r\n\r\n            if(probability <= 0 || probability >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.normal.inv(probability, 0, 1);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NORM_S_DIST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //需要计算其分布的数值\r\n            var z = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(z)){\r\n                return z;\r\n            }\r\n\r\n            if(!isRealNum(z)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            z = parseFloat(z);\r\n\r\n            //决定函数形式的逻辑值\r\n            var cumulative = func_methods.getCellBoolen(arguments[1]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            return (cumulative) ? jStat.normal.cdf(z, 0, 1) : jStat.normal.pdf(z, 0, 1);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NORM_INV\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //对应于正态分布的概率\r\n            var probability = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(probability)){\r\n                return probability;\r\n            }\r\n\r\n            if(!isRealNum(probability)){\r\n                if(getObjType(probability) == \"boolean\"){\r\n                    if(probability.toString().toLowerCase() == \"true\"){\r\n                        probability = 1;\r\n                    }\r\n                    else if(probability.toString().toLowerCase() == \"false\"){\r\n                        probability = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            probability = parseFloat(probability);\r\n\r\n            //分布的算术平均值\r\n            var mean = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(mean)){\r\n                return mean;\r\n            }\r\n\r\n            if(!isRealNum(mean)){\r\n                if(getObjType(mean) == \"boolean\"){\r\n                    if(mean.toString().toLowerCase() == \"true\"){\r\n                        mean = 1;\r\n                    }\r\n                    else if(mean.toString().toLowerCase() == \"false\"){\r\n                        mean = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            mean = parseFloat(mean);\r\n\r\n            //分布的标准偏差\r\n            var standard_dev = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(standard_dev)){\r\n                return standard_dev;\r\n            }\r\n\r\n            if(!isRealNum(standard_dev)){\r\n                if(getObjType(standard_dev) == \"boolean\"){\r\n                    if(standard_dev.toString().toLowerCase() == \"true\"){\r\n                        standard_dev = 1;\r\n                    }\r\n                    else if(standard_dev.toString().toLowerCase() == \"false\"){\r\n                        standard_dev = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            standard_dev = parseFloat(standard_dev);\r\n\r\n            if(probability <= 0 || probability >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(standard_dev <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            return jStat.normal.inv(probability, mean, standard_dev);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NORM_DIST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //需要计算其分布的数值\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                if(getObjType(x) == \"boolean\"){\r\n                    if(x.toString().toLowerCase() == \"true\"){\r\n                        x = 1;\r\n                    }\r\n                    else if(x.toString().toLowerCase() == \"false\"){\r\n                        x = 0;\r\n                    }\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //分布的算术平均值\r\n            var mean = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(mean)){\r\n                return mean;\r\n            }\r\n\r\n            if(!isRealNum(mean)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            mean = parseFloat(mean);\r\n\r\n            //分布的标准偏差\r\n            var standard_dev = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(standard_dev)){\r\n                return standard_dev;\r\n            }\r\n\r\n            if(!isRealNum(standard_dev)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            standard_dev = parseFloat(standard_dev);\r\n\r\n            //决定函数形式的逻辑值\r\n            var cumulative = func_methods.getCellBoolen(arguments[3]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(standard_dev <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.normal.cdf(x, mean, standard_dev) : jStat.normal.pdf(x, mean, standard_dev);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NEGBINOM_DIST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要模拟的失败次数\r\n            var number_f = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number_f)){\r\n                return number_f;\r\n            }\r\n\r\n            if(!isRealNum(number_f)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_f = parseInt(number_f);\r\n\r\n            //要模拟的成功次数\r\n            var number_s = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(number_s)){\r\n                return number_s;\r\n            }\r\n\r\n            if(!isRealNum(number_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_s = parseInt(number_s);\r\n\r\n            //任一次给定检验的成功概率\r\n            var probability_s = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(probability_s)){\r\n                return probability_s;\r\n            }\r\n\r\n            if(!isRealNum(probability_s)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability_s = parseFloat(probability_s);\r\n\r\n            //决定函数形式的逻辑值\r\n            var cumulative = func_methods.getCellBoolen(arguments[3]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(probability_s < 0 || probability_s > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(number_f < 0 || number_s < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.negbin.cdf(number_f, number_s, probability_s) : jStat.negbin.pdf(number_f, number_s, probability_s);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MINA\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(number.toString.toLowerCase() == \"true\"){\r\n                        dataArr.push(1);\r\n                    }\r\n                    else if(number.toString.toLowerCase() == \"false\"){\r\n                        dataArr.push(0);\r\n                    }\r\n                    else if(isRealNum(data)){\r\n                        dataArr.push(data);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n                else{\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        dataArr_n.push(1);\r\n                    }\r\n                    else{\r\n                        dataArr_n.push(0);\r\n                    }\r\n                }\r\n            }\r\n\r\n            return (dataArr_n.length === 0) ? 0 : Math.min.apply(Math, dataArr_n);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MEDIAN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            return jStat.median(dataArr_n);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MAXA\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(number.toString.toLowerCase() == \"true\"){\r\n                        dataArr.push(1);\r\n                    }\r\n                    else if(number.toString.toLowerCase() == \"false\"){\r\n                        dataArr.push(0);\r\n                    }\r\n                    else if(isRealNum(data)){\r\n                        dataArr.push(data);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n                else{\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        dataArr_n.push(1);\r\n                    }\r\n                    else{\r\n                        dataArr_n.push(0);\r\n                    }\r\n                }\r\n            }\r\n\r\n            return (dataArr_n.length === 0) ? 0 : Math.max.apply(Math, dataArr_n);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOGNORM_INV\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //与对数分布相关的概率\r\n            var probability = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(probability)){\r\n                return probability;\r\n            }\r\n\r\n            if(!isRealNum(probability)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability = parseFloat(probability);\r\n\r\n            //ln(x) 的平均值\r\n            var mean = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(mean)){\r\n                return mean;\r\n            }\r\n\r\n            if(!isRealNum(mean)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            mean = parseFloat(mean);\r\n\r\n            //ln(x) 的标准偏差\r\n            var standard_dev = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(standard_dev)){\r\n                return standard_dev;\r\n            }\r\n\r\n            if(!isRealNum(standard_dev)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            standard_dev = parseFloat(standard_dev);\r\n\r\n            if(probability <= 0 || probability >= 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(standard_dev <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.lognormal.inv(probability, mean, standard_dev);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOGNORM_DIST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //与对数分布相关的概率\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //ln(x) 的平均值\r\n            var mean = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(mean)){\r\n                return mean;\r\n            }\r\n\r\n            if(!isRealNum(mean)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            mean = parseFloat(mean);\r\n\r\n            //ln(x) 的标准偏差\r\n            var standard_dev = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(standard_dev)){\r\n                return standard_dev;\r\n            }\r\n\r\n            if(!isRealNum(standard_dev)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            standard_dev = parseFloat(standard_dev);\r\n\r\n            //决定函数形式的逻辑值\r\n            var cumulative = func_methods.getCellBoolen(arguments[3]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(x <= 0 || standard_dev <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.lognormal.cdf(x, mean, standard_dev) : jStat.lognormal.pdf(x, mean, standard_dev);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"Z_TEST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //用来检验 x 的数组或数据区域\r\n            var dataArr = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr = dataArr.concat(func_methods.getDataArr(arguments[0], true));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                dataArr = dataArr.concat(func_methods.getCellDataArr(arguments[0], \"text\", true));\r\n            }\r\n            else{\r\n                dataArr.push(arguments[0]);\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var j = 0; j < dataArr.length; j++){\r\n                var number = dataArr[j];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //要测试的值\r\n            var x = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //总体（已知）标准偏差。 如果省略，则使用样本标准偏差\r\n            var sigma = func_methods.standardDeviation_s(dataArr_n);\r\n            if(arguments.length == 3){\r\n                sigma = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(sigma)){\r\n                    return sigma;\r\n                }\r\n\r\n                if(!isRealNum(sigma)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                sigma = parseFloat(sigma);\r\n            }\r\n\r\n            //计算\r\n            var n = dataArr_n.length;\r\n            var mean = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, dataArr_n);\r\n\r\n            return 1 - window.luckysheet_function.NORM_S_DIST.f((mean - x) / (sigma / Math.sqrt(n)), \"true\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PROB\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //x_range\r\n            var data_x_range = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_x_range = data_x_range.concat(func_methods.getDataArr(arguments[0], false));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                data_x_range = data_x_range.concat(func_methods.getCellDataArr(arguments[0], \"text\", false));\r\n            }\r\n            else{\r\n                data_x_range.push(arguments[0]);\r\n            }\r\n\r\n            //prob_range\r\n            var data_prob_range = [];\r\n\r\n            if(getObjType(arguments[1]) == \"array\"){\r\n                if(getObjType(arguments[1][0]) == \"array\" && !func_methods.isDyadicArr(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_prob_range = data_prob_range.concat(func_methods.getDataArr(arguments[1], false));\r\n            }\r\n            else if(getObjType(arguments[1]) == \"object\" && arguments[1].startCell != null){\r\n                data_prob_range = data_prob_range.concat(func_methods.getCellDataArr(arguments[1], \"text\", false));\r\n            }\r\n            else{\r\n                data_prob_range.push(arguments[1]);\r\n            }\r\n\r\n            if(data_x_range.length != data_prob_range.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //data_x_range 和 data_prob_range 只取数值\r\n            var x_range = [], prob_range = [], prob_range_sum = 0;\r\n\r\n            for(var i = 0; i < data_x_range.length; i++){\r\n                var num_x_range = data_x_range[i];\r\n                var num_prob_range = data_prob_range[i];\r\n\r\n                if(isRealNum(num_x_range) && isRealNum(num_prob_range)){\r\n                    x_range.push(parseFloat(num_x_range));\r\n                    prob_range.push(parseFloat(num_prob_range));\r\n\r\n                    prob_range_sum += parseFloat(num_prob_range);\r\n\r\n                    if(parseFloat(num_prob_range) <= 0 || parseFloat(num_prob_range) > 1){\r\n                        return formula.error.nm;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(prob_range_sum != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //要计算其概率的数值下界\r\n            var lower_limit = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(lower_limit)){\r\n                return lower_limit;\r\n            }\r\n\r\n            if(!isRealNum(lower_limit)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            lower_limit = parseFloat(lower_limit);\r\n\r\n            //要计算其概率的数值上界\r\n            var upper_limit = lower_limit;\r\n            if(arguments.length == 4){\r\n                upper_limit = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(upper_limit)){\r\n                    return upper_limit;\r\n                }\r\n\r\n                if(!isRealNum(upper_limit)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                upper_limit = parseFloat(upper_limit);\r\n            }\r\n\r\n            //计算\r\n            var result = 0;\r\n\r\n            for (var i = 0; i < x_range.length; i++) {\r\n                if (x_range[i] >= lower_limit && x_range[i] <= upper_limit) {\r\n                    result += prob_range[i];\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"QUARTILE_EXC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要求得四分位数值的数组或数字型单元格区域\r\n            var data_array = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_array = data_array.concat(func_methods.getDataArr(arguments[0], true));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                data_array = data_array.concat(func_methods.getCellDataArr(arguments[0], \"text\", true));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_array.push(arguments[0]);\r\n            }\r\n\r\n            var array = [];\r\n\r\n            for(var i = 0; i < data_array.length; i++){\r\n                var number = data_array[i];\r\n\r\n                if(isRealNum(number)){\r\n                    array.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //要返回第几个四分位值\r\n            var quart = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(quart)){\r\n                return quart;\r\n            }\r\n\r\n            if(!isRealNum(quart)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            quart = parseInt(quart);\r\n\r\n            if(array.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(quart <= 0 || quart >= 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            switch (quart) {\r\n                case 1:\r\n                    return window.luckysheet_function.PERCENTILE_EXC.f(array, 0.25);\r\n                case 2:\r\n                    return window.luckysheet_function.PERCENTILE_EXC.f(array, 0.5);\r\n                case 3:\r\n                    return window.luckysheet_function.PERCENTILE_EXC.f(array, 0.75);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"QUARTILE_INC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要求得四分位数值的数组或数字型单元格区域\r\n            var data_array = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_array = data_array.concat(func_methods.getDataArr(arguments[0], true));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                data_array = data_array.concat(func_methods.getCellDataArr(arguments[0], \"text\", true));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_array.push(arguments[0]);\r\n            }\r\n\r\n            var array = [];\r\n\r\n            for(var i = 0; i < data_array.length; i++){\r\n                var number = data_array[i];\r\n\r\n                if(isRealNum(number)){\r\n                    array.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //要返回第几个四分位值\r\n            var quart = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(quart)){\r\n                return quart;\r\n            }\r\n\r\n            if(!isRealNum(quart)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            quart = parseInt(quart);\r\n\r\n            if(array.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(quart < 0 || quart > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            switch (quart) {\r\n                case 0:\r\n                    return Math.min.apply(Math, array);\r\n                case 1:\r\n                    return window.luckysheet_function.PERCENTILE_INC.f(array, 0.25);\r\n                case 2:\r\n                    return window.luckysheet_function.PERCENTILE_INC.f(array, 0.5);\r\n                case 3:\r\n                    return window.luckysheet_function.PERCENTILE_INC.f(array, 0.75);\r\n                case 4:\r\n                    return Math.max.apply(Math, array);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"POISSON_DIST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //事件数\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseInt(x);\r\n\r\n            //期望值\r\n            var mean = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(mean)){\r\n                return mean;\r\n            }\r\n\r\n            if(!isRealNum(mean)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            mean = parseFloat(mean);\r\n\r\n            //决定函数形式的逻辑值\r\n            var cumulative = func_methods.getCellBoolen(arguments[2]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(x < 0 || mean < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.poisson.cdf(x, mean) : jStat.poisson.pdf(x, mean);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RSQ\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //代表因变量数据数组或矩阵的范围\r\n            var data_known_y = arguments[0];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(data_known_y, false));\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(data_known_y, \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y.push(data_known_y);\r\n            }\r\n\r\n            //代表自变量数据数组或矩阵的范围\r\n            var data_known_x = arguments[1];\r\n            var known_x = [];\r\n\r\n            if(getObjType(data_known_x) == \"array\"){\r\n                if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(data_known_x, false));\r\n            }\r\n            else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(data_known_x, \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(data_known_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x.push(data_known_x);\r\n            }\r\n\r\n            if(known_y.length != known_x.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y 和 known_x 只取数值\r\n            var data_y = [], data_x = [];\r\n\r\n            for(var i = 0; i < known_y.length; i++){\r\n                var num_y = known_y[i];\r\n                var num_x = known_x[i];\r\n\r\n                if(isRealNum(num_y) && isRealNum(num_x)){\r\n                    data_y.push(parseFloat(num_y));\r\n                    data_x.push(parseFloat(num_x));\r\n                }\r\n            }\r\n\r\n            if(data_y.length == 0 || data_x.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return Math.pow(window.luckysheet_function.PEARSON.f(data_y, data_x), 2);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T_DIST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //T-分布函数的输入\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //自由度数值\r\n            var degrees_freedom = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(degrees_freedom)){\r\n                return degrees_freedom;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom = parseInt(degrees_freedom);\r\n\r\n            //决定函数形式的逻辑值\r\n            var cumulative = func_methods.getCellBoolen(arguments[2]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(degrees_freedom < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.studentt.cdf(x, degrees_freedom) : jStat.studentt.pdf(x, degrees_freedom);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T_DIST_2T\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //T-分布函数的输入\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //自由度数值\r\n            var degrees_freedom = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(degrees_freedom)){\r\n                return degrees_freedom;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom = parseInt(degrees_freedom);\r\n\r\n            if(x < 0 || degrees_freedom < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (1 - jStat.studentt.cdf(x , degrees_freedom)) * 2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T_DIST_RT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //T-分布函数的输入\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //自由度数值\r\n            var degrees_freedom = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(degrees_freedom)){\r\n                return degrees_freedom;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom = parseInt(degrees_freedom);\r\n\r\n            if(degrees_freedom < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return 1 - jStat.studentt.cdf(x , degrees_freedom);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T_INV\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //与学生的 t 分布相关的概率\r\n            var probability = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(probability)){\r\n                return probability;\r\n            }\r\n\r\n            if(!isRealNum(probability)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability = parseFloat(probability);\r\n\r\n            //自由度数值\r\n            var deg_freedom = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(deg_freedom)){\r\n                return deg_freedom;\r\n            }\r\n\r\n            if(!isRealNum(deg_freedom)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            deg_freedom = parseInt(deg_freedom);\r\n\r\n            if(probability <= 0 || probability > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(deg_freedom < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return jStat.studentt.inv(probability, deg_freedom);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T_INV_2T\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //与学生的 t 分布相关的概率\r\n            var probability = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(probability)){\r\n                return probability;\r\n            }\r\n\r\n            if(!isRealNum(probability)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            probability = parseFloat(probability);\r\n\r\n            //自由度数值\r\n            var deg_freedom = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(deg_freedom)){\r\n                return deg_freedom;\r\n            }\r\n\r\n            if(!isRealNum(deg_freedom)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            deg_freedom = parseInt(deg_freedom);\r\n\r\n            if(probability <= 0 || probability > 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(deg_freedom < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.abs(jStat.studentt.inv(probability / 2, deg_freedom));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T_TEST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //第一个数据集\r\n            var known_x = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(arguments[0], false));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(arguments[0], \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x.push(arguments[0]);\r\n            }\r\n\r\n            // var data_x = [];\r\n            var data_x = known_x;\r\n\r\n            //第二个数据集\r\n            var known_y = [];\r\n\r\n            if(getObjType(arguments[1]) == \"array\"){\r\n                if(getObjType(arguments[1][0]) == \"array\" && !func_methods.isDyadicArr(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(arguments[1], false));\r\n            }\r\n            else if(getObjType(arguments[1]) == \"object\" && arguments[1].startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(arguments[1], \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y.push(arguments[1]);\r\n            }\r\n\r\n            // var data_y = [];\r\n            var data_y = known_y;\r\n\r\n            //指定分布的尾数\r\n            var tails = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(tails)){\r\n                return tails;\r\n            }\r\n\r\n            if(!isRealNum(tails)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            tails = parseInt(tails);\r\n\r\n            //指定 t 检验的类型\r\n            var type = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(type)){\r\n                return type;\r\n            }\r\n\r\n            if(!isRealNum(type)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            type = parseInt(type);\r\n\r\n            if([1,2].indexOf(tails) == -1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if([1,2,3].indexOf(type) == -1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var t = null, df = null;\r\n            if(type == 1){\r\n                var diff_arr = [];\r\n\r\n                for (i = 0; i < data_x.length; i++) {\r\n                    diff_arr.push(data_x[i] - data_y[i]);\r\n                }\r\n\r\n                var diff_mean = Math.abs(jStat.mean(diff_arr));\r\n                var diff_sd = func_methods.standardDeviation_s(diff_arr);\r\n\r\n                t = diff_mean / (diff_sd / Math.sqrt(data_x.length));\r\n                df = data_x.length - 1;\r\n            }\r\n            else{\r\n                var mean_x = jStat.mean(data_x);\r\n                var mean_y = jStat.mean(data_y);\r\n\r\n                var s_x = func_methods.variance_s(data_x);\r\n                var s_y = func_methods.variance_s(data_y);\r\n\r\n                t = Math.abs(mean_x - mean_y) / Math.sqrt(s_x / data_x.length + s_y / data_y.length);\r\n\r\n                switch(type){\r\n                    case 2:\r\n                        df = data_x.length + data_y.length - 2;\r\n                        break;\r\n                    case 3:\r\n                        df = Math.pow(s_x / data_x.length + s_y / data_y.length, 2) / (Math.pow(s_x / data_x.length, 2) / (data_x.length - 1) + Math.pow(s_y / data_y.length, 2) / (data_y.length - 1));\r\n                        break;\r\n                }\r\n            }\r\n\r\n            if(tails == 1){\r\n                var result = window.luckysheet_function.T_DIST_RT.f(t, df);\r\n            }\r\n            else if(tails == 2){\r\n                var result = window.luckysheet_function.T_DIST_2T.f(t, df);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"F_DIST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //用来计算函数的值\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //分子自由度\r\n            var degrees_freedom1 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(degrees_freedom1)){\r\n                return degrees_freedom1;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom1 = parseInt(degrees_freedom1);\r\n\r\n            //分母自由度\r\n            var degrees_freedom2 = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(degrees_freedom2)){\r\n                return degrees_freedom2;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom2 = parseInt(degrees_freedom2);\r\n\r\n            //用于确定函数形式的逻辑值\r\n            var cumulative = func_methods.getCellBoolen(arguments[3]);\r\n\r\n            if(valueIsError(cumulative)){\r\n                return cumulative;\r\n            }\r\n\r\n            if(x < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(degrees_freedom1 < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(degrees_freedom2 < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (cumulative) ? jStat.centralF.cdf(x, degrees_freedom1, degrees_freedom2) : jStat.centralF.pdf(x, degrees_freedom1, degrees_freedom2);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"F_DIST_RT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //用来计算函数的值\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //分子自由度\r\n            var degrees_freedom1 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(degrees_freedom1)){\r\n                return degrees_freedom1;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom1 = parseInt(degrees_freedom1);\r\n\r\n            //分母自由度\r\n            var degrees_freedom2 = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(degrees_freedom2)){\r\n                return degrees_freedom2;\r\n            }\r\n\r\n            if(!isRealNum(degrees_freedom2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            degrees_freedom2 = parseInt(degrees_freedom2);\r\n\r\n            if(x < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(degrees_freedom1 < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(degrees_freedom2 < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return 1 - jStat.centralF.cdf(x, degrees_freedom1, degrees_freedom2);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"VAR_P\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            var n = dataArr_n.length;\r\n            var sigma = 0;\r\n            var mean = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, dataArr_n);\r\n            for (var i = 0; i < n; i++) {\r\n                sigma += Math.pow(dataArr_n[i] - mean, 2);\r\n            }\r\n\r\n            return sigma / n;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"VAR_S\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            var n = dataArr_n.length;\r\n            var sigma = 0;\r\n            var mean = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, dataArr_n);\r\n            for (var i = 0; i < n; i++) {\r\n                sigma += Math.pow(dataArr_n[i] - mean, 2);\r\n            }\r\n\r\n            return sigma / (n - 1);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"VARA\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(number.toString.toLowerCase() == \"true\"){\r\n                        dataArr.push(1);\r\n                    }\r\n                    else if(number.toString.toLowerCase() == \"false\"){\r\n                        dataArr.push(0);\r\n                    }\r\n                    else if(isRealNum(data)){\r\n                        dataArr.push(data);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n                else{\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        dataArr_n.push(1);\r\n                    }\r\n                    else{\r\n                        dataArr_n.push(0);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var n = dataArr_n.length;\r\n            var sigma = 0;\r\n            var mean = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, dataArr_n);\r\n            for (var i = 0; i < n; i++) {\r\n                sigma += Math.pow(dataArr_n[i] - mean, 2);\r\n            }\r\n\r\n            return sigma / (n - 1);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"VARPA\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(number.toString.toLowerCase() == \"true\"){\r\n                        dataArr.push(1);\r\n                    }\r\n                    else if(number.toString.toLowerCase() == \"false\"){\r\n                        dataArr.push(0);\r\n                    }\r\n                    else if(isRealNum(data)){\r\n                        dataArr.push(data);\r\n                    }\r\n                    else{\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n                else{\r\n                    if(number.toString().toLowerCase() == \"true\"){\r\n                        dataArr_n.push(1);\r\n                    }\r\n                    else{\r\n                        dataArr_n.push(0);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var n = dataArr_n.length;\r\n            var sigma = 0;\r\n            var mean = window.luckysheet_function.AVERAGE.f.apply(window.luckysheet_function.AVERAGE, dataArr_n);\r\n            for (var i = 0; i < n; i++) {\r\n                sigma += Math.pow(dataArr_n[i] - mean, 2);\r\n            }\r\n\r\n            return sigma / n;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STEYX\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //代表因变量数据数组或矩阵的范围\r\n            var known_y = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(arguments[0], false));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(arguments[0], \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y.push(arguments[0]);\r\n            }\r\n\r\n            //代表自变量数据数组或矩阵的范围\r\n            var known_x = [];\r\n\r\n            if(getObjType(arguments[1]) == \"array\"){\r\n                if(getObjType(arguments[1][0]) == \"array\" && !func_methods.isDyadicArr(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(arguments[1], false));\r\n            }\r\n            else if(getObjType(arguments[1]) == \"object\" && arguments[1].startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(arguments[1], \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x.push(arguments[1]);\r\n            }\r\n\r\n            if(known_y.length != known_x.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y 和 known_x 只取数值\r\n            var data_y = [], data_x = [];\r\n\r\n            for(var i = 0; i < known_y.length; i++){\r\n                var num_y = known_y[i];\r\n                var num_x = known_x[i];\r\n\r\n                if(isRealNum(num_y) && isRealNum(num_x)){\r\n                    data_y.push(parseFloat(num_y));\r\n                    data_x.push(parseFloat(num_x));\r\n                }\r\n            }\r\n\r\n            if(data_y.length < 3 || data_x.length < 3){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //计算\r\n            var xmean = jStat.mean(data_x);\r\n            var ymean = jStat.mean(data_y);\r\n\r\n            var n = data_x.length;\r\n            var lft = 0;\r\n            var num = 0;\r\n            var den = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                lft += Math.pow(data_y[i] - ymean, 2);\r\n                num += (data_x[i] - xmean) * (data_y[i] - ymean);\r\n                den += Math.pow(data_x[i] - xmean, 2);\r\n            }\r\n\r\n            return Math.sqrt((lft - num * num / den) / (n - 2));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STANDARDIZE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要正态化的随机变量值\r\n            var x = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            if(!isRealNum(x)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            x = parseFloat(x);\r\n\r\n            //分布的均值\r\n            var mean = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(mean)){\r\n                return mean;\r\n            }\r\n\r\n            if(!isRealNum(mean)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            mean = parseFloat(mean);\r\n\r\n            //分布的标准偏差\r\n            var standard_dev = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(standard_dev)){\r\n                return standard_dev;\r\n            }\r\n\r\n            if(!isRealNum(standard_dev)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            standard_dev = parseFloat(standard_dev);\r\n\r\n            if(standard_dev <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (x - mean) / standard_dev;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SMALL\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要正态化的随机变量值\r\n            var dataArr = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr = dataArr.concat(func_methods.getDataArr(arguments[0], true));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                dataArr = dataArr.concat(func_methods.getCellDataArr(arguments[0], \"number\", true));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                dataArr.push(arguments[0]);\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //要返回的数据在数组或数据区域里的位置（从小到大）\r\n            var k = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(k)){\r\n                return k;\r\n            }\r\n\r\n            if(!isRealNum(k)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            k = parseInt(k);\r\n\r\n            if(dataArr_n.length == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(k <= 0 || k > dataArr_n.length){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n\r\n            return  dataArr_n.sort(function(a, b) {\r\n                        return a - b;\r\n                    })[k - 1];\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SLOPE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //代表因变量数据数组或矩阵的范围\r\n            var known_y = [];\r\n\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\" && !func_methods.isDyadicArr(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = known_y.concat(func_methods.getDataArr(arguments[0], false));\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                known_y = known_y.concat(func_methods.getCellDataArr(arguments[0], \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[0])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y.push(arguments[0]);\r\n            }\r\n\r\n            //代表自变量数据数组或矩阵的范围\r\n            var known_x = [];\r\n\r\n            if(getObjType(arguments[1]) == \"array\"){\r\n                if(getObjType(arguments[1][0]) == \"array\" && !func_methods.isDyadicArr(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x = known_x.concat(func_methods.getDataArr(arguments[1], false));\r\n            }\r\n            else if(getObjType(arguments[1]) == \"object\" && arguments[1].startCell != null){\r\n                known_x = known_x.concat(func_methods.getCellDataArr(arguments[1], \"text\", false));\r\n            }\r\n            else{\r\n                if(!isRealNum(arguments[1])){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_x.push(arguments[1]);\r\n            }\r\n\r\n            if(known_y.length != known_x.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //known_y 和 known_x 只取数值\r\n            var data_y = [], data_x = [];\r\n\r\n            for(var i = 0; i < known_y.length; i++){\r\n                var num_y = known_y[i];\r\n                var num_x = known_x[i];\r\n\r\n                if(isRealNum(num_y) && isRealNum(num_x)){\r\n                    data_y.push(parseFloat(num_y));\r\n                    data_x.push(parseFloat(num_x));\r\n                }\r\n            }\r\n\r\n            if(data_y.length < 3 || data_x.length < 3){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //计算\r\n            var xmean = jStat.mean(data_x);\r\n            var ymean = jStat.mean(data_y);\r\n\r\n            var n = data_x.length;\r\n            var num = 0;\r\n            var den = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                num += (data_x[i] - xmean) * (data_y[i] - ymean);\r\n                den += Math.pow(data_x[i] - xmean, 2);\r\n            }\r\n\r\n            return num / den;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SKEW\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            if(dataArr_n.length < 3 || func_methods.standardDeviation_s(dataArr_n) == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //计算\r\n            var mean = jStat.mean(dataArr_n);\r\n            var n = dataArr_n.length;\r\n            var sigma = 0;\r\n            for (var i = 0; i < n; i++) {\r\n                sigma += Math.pow(dataArr_n[i] - mean, 3);\r\n            }\r\n\r\n            return n * sigma / ((n - 1) * (n - 2) * Math.pow(jStat.stdev(dataArr_n, true), 3));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SKEW_P\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var dataArr = [];\r\n\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    if(!isRealNum(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            var dataArr_n = [];\r\n\r\n            for(var i = 0; i < dataArr.length; i++){\r\n                var number = dataArr[i];\r\n\r\n                if(isRealNum(number)){\r\n                    dataArr_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            if(dataArr_n.length < 3 || func_methods.standardDeviation_s(dataArr_n) == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //计算\r\n            var mean = jStat.mean(dataArr_n);\r\n            var n = dataArr_n.length;\r\n            var m2 = 0;\r\n            var m3 = 0;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                m3 += Math.pow(dataArr_n[i] - mean, 3);\r\n                m2 += Math.pow(dataArr_n[i] - mean, 2);\r\n            }\r\n\r\n            m3 = m3 / n;\r\n            m2 = m2 / n;\r\n\r\n            return m3 / Math.pow(m2, 3 / 2);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ADDRESS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //行号\r\n            var row_num = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(row_num)){\r\n                return row_num;\r\n            }\r\n\r\n            if(!isRealNum(row_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            row_num = parseInt(row_num);\r\n\r\n            //列标\r\n            var column_num = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(column_num)){\r\n                return column_num;\r\n            }\r\n\r\n            if(!isRealNum(column_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            column_num = parseInt(column_num);\r\n\r\n            //引用类型\r\n            var abs_num = 1;\r\n            if(arguments.length >= 3){\r\n                abs_num = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(abs_num)){\r\n                    return abs_num;\r\n                }\r\n\r\n                if(!isRealNum(abs_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                abs_num = parseInt(abs_num);\r\n            }\r\n\r\n            //A1标记形式 -- R1C1标记形式\r\n            var A1 = true;\r\n            if(arguments.length >= 4){\r\n                A1 = func_methods.getCellBoolen(arguments[3]);\r\n\r\n                if(valueIsError(A1)){\r\n                    return A1;\r\n                }\r\n            }\r\n\r\n            if(row_num <= 0 || column_num <= 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if([1,2,3,4].indexOf(abs_num) == -1){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            var str;\r\n            if(A1){\r\n                column_num = chatatABC(column_num - 1);\r\n\r\n                switch(abs_num){\r\n                    case 1:\r\n                        str = \"$\" + column_num + \"$\" + row_num;\r\n                        break;\r\n                    case 2:\r\n                        str = column_num + \"$\" + row_num;\r\n                        break;\r\n                    case 3:\r\n                        str = \"$\" + column_num + row_num;\r\n                        break;\r\n                    case 4:\r\n                        str = column_num + row_num;\r\n                        break;\r\n                }\r\n            }\r\n            else{\r\n                switch(abs_num){\r\n                    case 1:\r\n                        str = \"R\" + row_num + \"C\" + column_num;\r\n                        break;\r\n                    case 2:\r\n                        str = \"R\" + row_num + \"C[\" + column_num + \"]\";\r\n                        break;\r\n                    case 3:\r\n                        str = \"R[\" + row_num + \"]\" + \"C\" + column_num;\r\n                        break;\r\n                    case 4:\r\n                        str = \"R[\" + row_num + \"]\" + \"C[\" + column_num + \"]\";\r\n                        break;\r\n                }\r\n            }\r\n\r\n            if(arguments.length == 5){\r\n                //工作表名称\r\n                var sheet_text = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(sheet_text)){\r\n                    return sheet_text;\r\n                }\r\n\r\n                return sheet_text + \"!\" + str;\r\n            }\r\n            else{\r\n                return str;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"INDIRECT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //以带引号的字符串形式提供的单元格引用\r\n            var ref_text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(ref_text)){\r\n                return ref_text;\r\n            }\r\n\r\n            //A1标记形式 -- R1C1标记形式\r\n            var A1 = true;\r\n            if(arguments.length == 2){\r\n                A1 = func_methods.getCellBoolen(arguments[1]);\r\n\r\n                if(valueIsError(A1)){\r\n                    return A1;\r\n                }\r\n            }\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let currentSheet = luckysheetfile[index];\r\n            let sheetdata = currentSheet.data;\r\n            // sheetdata = Store.flowdata;\r\n            // if (formula.execFunctionGroupData != null) {\r\n            //     sheetdata = formula.execFunctionGroupData;\r\n            // }\r\n\r\n            //计算\r\n            if(A1){\r\n\r\n            }\r\n            else{\r\n\r\n            }\r\n\r\n            if(formula.iscelldata(ref_text)){\r\n                let cellrange = formula.getcellrange(ref_text);\r\n                let row = cellrange.row[0], col = cellrange.column[0];\r\n\r\n                if (row < 0 || row >= sheetdata.length || col < 0 || col >= sheetdata[0].length){\r\n                    return formula.error.r;\r\n                }\r\n\r\n                if (sheetdata[row][col] == null || isRealNull(sheetdata[row][col].v)){\r\n                    return 0;\r\n                }\r\n\r\n                let value = sheetdata[row][col].v;\r\n                if (formula.execFunctionGlobalData != null) {\r\n                    let ef = formula.execFunctionGlobalData[row+\"_\"+col+\"_\"+Store.calculateSheetIndex];\r\n                    if(ef!=null){\r\n                        value = ef.v;\r\n                    }\r\n                }\r\n\r\n\r\n                let retAll= {\r\n                    \"sheetName\": currentSheet.name,\r\n                    \"startCell\": ref_text,\r\n                    \"rowl\": row,\r\n                    \"coll\": col,\r\n                    \"data\": value\r\n                };\r\n\r\n                return retAll;\r\n            }\r\n            else{\r\n                return formula.error.r;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ROW\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            if(arguments.length == 1){\r\n                //要返回其行号的单元格\r\n                var reference;\r\n\r\n                if(getObjType(arguments[0]) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                    reference = arguments[0].startCell;\r\n                }\r\n                else{\r\n                    reference = arguments[0];\r\n                }\r\n\r\n                if(formula.iscelldata(reference)){\r\n                    var cellrange = formula.getcellrange(reference);\r\n\r\n                    return cellrange[\"row\"][0] + 1;\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n            else{\r\n                return window.luckysheetCurrentRow + 1;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ROWS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要返回其行数的范围\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\"){\r\n                    return arguments[0].length;\r\n                }\r\n                else{\r\n                    return 1;\r\n                }\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                return arguments[0].rowl;\r\n            }\r\n            else{\r\n                return 1;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COLUMN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            if(arguments.length == 1){\r\n                //要返回其列号的单元格\r\n                var reference;\r\n\r\n                if(getObjType(arguments[0]) == \"array\"){\r\n                    return formula.error.v;\r\n                }\r\n                else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                    reference = arguments[0].startCell;\r\n                }\r\n                else{\r\n                    reference = arguments[0];\r\n                }\r\n\r\n                if(formula.iscelldata(reference)){\r\n                    var cellrange = formula.getcellrange(reference);\r\n\r\n                    return cellrange[\"column\"][0] + 1;\r\n                }\r\n                else{\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n            else{\r\n                return window.luckysheetCurrentColumn + 1;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COLUMNS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //返回指定数组或范围中的列数\r\n            if(getObjType(arguments[0]) == \"array\"){\r\n                if(getObjType(arguments[0][0]) == \"array\"){\r\n                    return arguments[0][0].length;\r\n                }\r\n                else{\r\n                    return arguments[0].length;\r\n                }\r\n            }\r\n            else if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                return arguments[0].coll;\r\n            }\r\n            else{\r\n                return 1;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"OFFSET\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //用于计算行列偏移量的起点\r\n            if(!(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var reference = arguments[0].startCell;\r\n            let sheetName = arguments[0].sheetName;\r\n\r\n            //要偏移的行数\r\n            var rows = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(rows)){\r\n                return rows;\r\n            }\r\n\r\n            if(!isRealNum(rows)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rows = parseInt(rows);\r\n\r\n            //要偏移的列数\r\n            var cols = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(cols)){\r\n                return cols;\r\n            }\r\n\r\n            if(!isRealNum(cols)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            cols = parseInt(cols);\r\n\r\n            //要从偏移目标开始返回的范围的高度\r\n            var height = arguments[0].rowl;\r\n            if(arguments.length >= 4){\r\n                height = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(height)){\r\n                    return height;\r\n                }\r\n\r\n                if(!isRealNum(height)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                height = parseInt(height);\r\n            }\r\n\r\n            //要从偏移目标开始返回的范围的宽度\r\n            var width = arguments[0].coll;\r\n            if(arguments.length == 5){\r\n                width = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(width)){\r\n                    return width;\r\n                }\r\n\r\n                if(!isRealNum(width)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                width = parseInt(width);\r\n            }\r\n\r\n            if(height < 1 || width < 1){\r\n                return formula.error.r;\r\n            }\r\n\r\n            //计算\r\n            var cellrange = formula.getcellrange(reference);\r\n            var cellRow0 = cellrange[\"row\"][0];\r\n            var cellCol0 = cellrange[\"column\"][0];\r\n\r\n            cellRow0 += rows;\r\n            cellCol0 += cols;\r\n\r\n            var cellRow1 = cellRow0 + height - 1;\r\n            var cellCol1 = cellCol0 + width - 1;\r\n\r\n            // let sheetdata = null;\r\n            // sheetdata = Store.flowdata;\r\n            // if (formula.execFunctionGroupData != null) {\r\n            //     sheetdata = formula.execFunctionGroupData;\r\n            // }\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            if (cellRow0 < 0 || cellRow1 >= sheetdata.length || cellCol0 < 0 || cellCol1 >= sheetdata[0].length){\r\n                return formula.error.r;\r\n            }\r\n\r\n            var result = [];\r\n\r\n            for(var r = cellRow0; r <= cellRow1; r++){\r\n                var rowArr = [];\r\n\r\n                for(var c = cellCol0; c <= cellCol1; c++){\r\n                    if(formula.execFunctionGlobalData != null && formula.execFunctionGlobalData[r+\"_\"+c+\"_\"+Store.calculateSheetIndex]!=null){\r\n                        let ef = formula.execFunctionGlobalData[r+\"_\"+c+\"_\"+Store.calculateSheetIndex];\r\n                        if(ef!=null){\r\n                            rowArr.push(ef.v);\r\n                        }\r\n                        else{\r\n                            rowArr.push(0);\r\n                        }\r\n                    }\r\n                    else if (sheetdata[r][c] != null && !isRealNull(sheetdata[r][c].v)){\r\n                        rowArr.push(sheetdata[r][c].v);\r\n                    }\r\n                    else{\r\n                        rowArr.push(0);\r\n                    }\r\n                }\r\n\r\n                result.push(rowArr);\r\n            }\r\n\r\n\r\n            let retAll= {\r\n                \"sheetName\": sheetName,\r\n                \"startCell\": getRangetxt(Store.calculateSheetIndex, {\r\n                    row: [cellRow0, cellRow1],\r\n                    column: [cellCol0, cellCol1]\r\n                }),\r\n                \"rowl\": cellRow0,\r\n                \"coll\": cellCol0,\r\n                \"data\": result\r\n            };\r\n\r\n            return retAll;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MATCH\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //lookup_value\r\n            var lookup_value = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(lookup_value)){\r\n                return lookup_value;\r\n            }\r\n\r\n            //lookup_array\r\n            var data_lookup_array = arguments[1];\r\n            var lookup_array = [];\r\n\r\n            if(getObjType(data_lookup_array) == \"array\"){\r\n                if(getObjType(data_lookup_array[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_lookup_array)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    return formula.error.na;\r\n                }\r\n                else{\r\n                    for(var i = 0; i < data_lookup_array.length; i++){\r\n                        lookup_array.push(data_lookup_array[i]);\r\n                    }\r\n                }\r\n            }\r\n            else if(getObjType(data_lookup_array) == \"object\" && data_lookup_array.startCell != null){\r\n                if(data_lookup_array.rowl > 1 && data_lookup_array.coll > 1){\r\n                    return formula.error.na;\r\n                }\r\n\r\n                if(data_lookup_array.data != null){\r\n                    if(getObjType(data_lookup_array.data) == \"array\"){\r\n                        for(var i = 0; i < data_lookup_array.data.length; i++){\r\n                            for(var j = 0; j < data_lookup_array.data[i].length; j++){\r\n                                if(data_lookup_array.data[i][j] != null && !isRealNull(data_lookup_array.data[i][j].v)){\r\n                                    lookup_array.push(data_lookup_array.data[i][j].v);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else{\r\n                        lookup_array.push(data_lookup_array.data.v);\r\n                    }\r\n                }\r\n            }\r\n\r\n            //match_type\r\n            var match_type = 1;\r\n            if(arguments.length == 3){\r\n                match_type = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(match_type)){\r\n                    return match_type;\r\n                }\r\n\r\n                if(!isRealNum(match_type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                match_type = Math.ceil(parseFloat(match_type));\r\n            }\r\n\r\n            if([-1,0,1].indexOf(match_type) == -1){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //计算\r\n            var index;\r\n            var indexValue;\r\n\r\n            for (var idx = 0; idx < lookup_array.length; idx++) {\r\n                if (match_type === 1) {\r\n                    if (lookup_array[idx] === lookup_value) {\r\n                        return idx + 1;\r\n                    }\r\n                    else if (lookup_array[idx] < lookup_value) {\r\n                        if (!indexValue) {\r\n                            index = idx + 1;\r\n                            indexValue = lookup_array[idx];\r\n                        }\r\n                        else if (lookup_array[idx] > indexValue) {\r\n                            index = idx + 1;\r\n                            indexValue = lookup_array[idx];\r\n                        }\r\n                    }\r\n                }\r\n                else if (match_type === 0) {\r\n                    if (typeof lookup_value === 'string') {\r\n                        lookup_value = lookup_value.replace(/\\?/g, '.');\r\n                        if (lookup_array[idx].toLowerCase().match(lookup_value.toLowerCase())) {\r\n                            return idx + 1;\r\n                        }\r\n                    }\r\n                    else {\r\n                        if (lookup_array[idx] === lookup_value) {\r\n                            return idx + 1;\r\n                        }\r\n                    }\r\n                }\r\n                else if (match_type === -1) {\r\n                    if (lookup_array[idx] === lookup_value) {\r\n                        return idx + 1;\r\n                    }\r\n                    else if (lookup_array[idx] > lookup_value) {\r\n                        if (!indexValue) {\r\n                            index = idx + 1;\r\n                            indexValue = lookup_array[idx];\r\n                        }\r\n                        else if (lookup_array[idx] < indexValue) {\r\n                            index = idx + 1;\r\n                            indexValue = lookup_array[idx];\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return index ? index : formula.error.na;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"VLOOKUP\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //lookup_value\r\n            var lookup_value = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(lookup_value)){\r\n                return lookup_value;\r\n            }\r\n\r\n            if(lookup_value.toString().replace(/\\s/g, \"\") == \"\"){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //table_array\r\n            var data_table_array = arguments[1];\r\n            var table_array = [];\r\n\r\n            if(getObjType(data_table_array) == \"array\"){\r\n                if(getObjType(data_table_array[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_table_array)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    for(var i = 0; i < data_table_array.length; i++){\r\n                        var rowArr = [];\r\n\r\n                        for(var j = 0; j < data_table_array[i].length; j++){\r\n                            rowArr.push(data_table_array[i][j]);\r\n                        }\r\n\r\n                        table_array.push(rowArr);\r\n                    }\r\n                }\r\n                else{\r\n                    var rowArr = [];\r\n\r\n                    for(var i = 0; i < data_table_array.length; i++){\r\n                        rowArr.push(data_table_array[i]);\r\n                    }\r\n\r\n                    table_array.push(rowArr);\r\n                }\r\n            }\r\n            else if(getObjType(data_table_array) == \"object\" && data_table_array.startCell != null){\r\n                table_array = func_methods.getCellDataDyadicArr(data_table_array, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //col_index_num\r\n            var col_index_num = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(col_index_num)){\r\n                return col_index_num;\r\n            }\r\n\r\n            if(!isRealNum(col_index_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            col_index_num = parseInt(col_index_num);\r\n\r\n            //range_lookup\r\n            var range_lookup = true;\r\n            if(arguments.length == 4){\r\n                range_lookup = func_methods.getCellBoolen(arguments[3]);\r\n\r\n                if(valueIsError(range_lookup)){\r\n                    return range_lookup;\r\n                }\r\n            }\r\n\r\n            //判断\r\n            if(col_index_num < 1){\r\n                return formula.error.v;\r\n            }\r\n            else if(col_index_num > table_array[0].length){\r\n                return formula.error.r;\r\n            }\r\n\r\n            //计算\r\n            if(range_lookup){\r\n                table_array = orderbydata(table_array, 0, true);\r\n\r\n                for(var r = 0; r < table_array.length; r++){\r\n                    var v = table_array[r][0];\r\n\r\n                    var result;\r\n\r\n                    if (isdatetime(lookup_value) && isdatetime(v)) {\r\n                        result = diff(lookup_value, v);\r\n                    }\r\n                    else if (isRealNum(lookup_value) && isRealNum(v)) {\r\n                        result = numeral(lookup_value).value() - numeral(v).value();\r\n                    }\r\n                    else if (!isRealNum(lookup_value) && !isRealNum(v)) {\r\n                        result = lookup_value.localeCompare(v, \"zh\");\r\n                    }\r\n                    else if (!isRealNum(lookup_value)) {\r\n                        result = 1;\r\n                    }\r\n                    else if (!isRealNum(v)) {\r\n                        result = -1;\r\n                    }\r\n\r\n                    if(result < 0){\r\n                        if(r == 0){\r\n                            return formula.error.na;\r\n                        }\r\n                        else{\r\n                            return table_array[r - 1][col_index_num - 1];\r\n                        }\r\n                    }\r\n                    else{\r\n                        if(r == table_array.length - 1){\r\n                            return table_array[r][col_index_num - 1];\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                var index = null;\r\n\r\n                for(var r = 0; r < table_array.length; r++){\r\n                    if(lookup_value.toString() == table_array[r][0].toString()){\r\n                        index = r;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if(index == null){\r\n                    return formula.error.na;\r\n                }\r\n\r\n                return table_array[index][col_index_num - 1];\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HLOOKUP\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var searchkey = arguments[0];\r\n\r\n            if(typeof(searchkey) == \"object\"){\r\n                searchkey = arguments[0].data;\r\n\r\n                if (getObjType(searchkey) == \"array\") {\r\n                    searchkey = searchkey[r];\r\n\r\n                    if (getObjType(searchkey) == \"array\") {\r\n                        searchkey = searchkey[c];\r\n                    }\r\n                }\r\n                else{\r\n                    searchkey = searchkey.v;\r\n                }\r\n            }\r\n            var range = arguments[1].data;\r\n            var index = arguments[2];\r\n            var isaccurate = false;\r\n            if (arguments.length > 3) {\r\n                isaccurate = !!arguments[3];\r\n            }\r\n            if (index > range.rowl) {\r\n                return [formula.error.v, \"索引超过了范围的长度，\" + range[0].length];\r\n            }\r\n            if (index < 1) {\r\n                return [formula.error.v, \"索引必须大于1\"];\r\n            }\r\n\r\n            var result = formula.error.na;\r\n            for(var c = 0;c < range[0].length;c++){\r\n                var matchv = getcellvalue(0, c, range);\r\n                var showv = getcellvalue(index - 1, c, range);\r\n\r\n                if (isaccurate) {\r\n                    if (matchv.indexOf(searchkey) > -1) {\r\n                        result = showv;\r\n                    }\r\n                } else {\r\n                    if (formula.acompareb(matchv,searchkey)) {\r\n                        result = showv;\r\n                        return result;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOOKUP\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //完成矢量形式（数组形式不推荐，未做）\r\n            //=LOOKUP(4.19, A2:A6, B2:B6)\r\n            //=LOOKUP(0, A2:A6, B2:B6)\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var searchkey = arguments[0];\r\n\r\n            if(typeof(searchkey) == \"object\"){\r\n                searchkey = arguments[0].data;\r\n\r\n                if (getObjType(searchkey) == \"array\") {\r\n                    searchkey = searchkey[r];\r\n\r\n                    if (getObjType(searchkey) == \"array\") {\r\n                        searchkey = searchkey[c];\r\n                    }\r\n                }\r\n                else{\r\n                    searchkey = searchkey.v;\r\n                }\r\n            }\r\n\r\n            //必须为一维数组\r\n            var range = arguments[1].data;\r\n            var range2;\r\n            var result = formula.error.na;\r\n\r\n            function sortNum(a,b){ //用于排序\r\n                return b - a;\r\n            }\r\n\r\n            //获得两个范围的数组\r\n            range= formula.getRangeArray(range)[0];\r\n            if(arguments[2]){\r\n                range2 = arguments[2].data;\r\n                range2 = formula.getRangeArray(range2)[0];\r\n            }\r\n\r\n            if(typeof(searchkey) == \"string\"){ //字符串直接判断是否相等\r\n\r\n                for (var i = 0; i < range.length; i++) {\r\n                    var matchv = range[i];\r\n                    var showv;\r\n                    if(arguments[2]){\r\n                        showv = range2[i];\r\n                        if(matchv == searchkey) {\r\n                            result = showv;\r\n                        }\r\n                    }else{\r\n                        if (formula.acompareb(matchv,searchkey)) {\r\n                            result = matchv;\r\n                        }\r\n                    }\r\n                }\r\n            }else if(isdatatype(searchkey) == \"num\"){ //数字判断1.是否相等2.不等，去找接近值\r\n                    var rangeNow = [];\r\n\r\n                    for (var i = 0; i < range.length; i++) {\r\n                        var matchv = range[i];\r\n                        var showv;\r\n\r\n                        if(arguments[2]){\r\n                            showv = range2[i];\r\n                            if(matchv == searchkey) {\r\n                                result = showv;\r\n                                return result;\r\n                            }else if(matchv != searchkey && isdatatype(matchv) == \"num\"){\r\n                                rangeNow.push(matchv);\r\n                            }\r\n                        }else{\r\n                            if (matchv == searchkey) {\r\n                                result = matchv;\r\n                                return result;\r\n                            }else if(matchv != searchkey && isdatatype(matchv) == \"num\"){\r\n                                rangeNow.push(matchv);\r\n                            }\r\n                        }\r\n\r\n                    }\r\n                    if(rangeNow.length != 0){\r\n                        rangeNow.push(searchkey);\r\n                        rangeNow.sort(sortNum);\r\n\r\n                        var index = rangeNow.indexOf(searchkey);\r\n                        if(index == (rangeNow.length -1)){\r\n                            return [formula.error.na, \"找不到对应参数\"];\r\n                        }else{\r\n                            var mat = rangeNow[index + 1];\r\n                            if(arguments[2]){\r\n                                var i = range.indexOf(mat);//改成数组\r\n                                result = range2[i];\r\n                            }else{\r\n                                result = mat;\r\n                            }\r\n\r\n                        }\r\n                    }\r\n\r\n            }\r\n\r\n            return result;\r\n\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"INDEX\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //单元格区域或数组常量\r\n            var data_array = arguments[0];\r\n            var array = [];\r\n            let isReference = false;\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array = func_methods.getDataDyadicArr(data_array);\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                array = func_methods.getCellDataDyadicArr(data_array, \"number\");\r\n                isReference = true;\r\n            }\r\n\r\n            var rowlen = array.length, collen = array[0].length;\r\n\r\n            //选择数组中的某行，函数从该行返回数值\r\n            var row_num = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(row_num)){\r\n                return row_num;\r\n            }\r\n\r\n            if(!isRealNum(row_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            row_num = parseInt(row_num);\r\n\r\n            //选择数组中的某列，函数从该列返回数值\r\n            var column_num = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(column_num)){\r\n                return column_num;\r\n            }\r\n\r\n\r\n\r\n            if(row_num < 0 || (isRealNum(column_num) && column_num < 0)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(rowlen == 1 && column_num == undefined){\r\n                column_num = row_num;\r\n                row_num = 1;\r\n            }\r\n\r\n            if(row_num > rowlen || (isRealNum(column_num) && column_num > collen)){\r\n                return formula.error.r;\r\n            }\r\n\r\n            if(isReference){\r\n\r\n                var cellrange = formula.getcellrange(data_array.startCell);\r\n                var cellRow0 = cellrange[\"row\"][0];\r\n                var cellCol0 = cellrange[\"column\"][0];\r\n\r\n\r\n                let data = array;\r\n                if(row_num == 0 || column_num == 0){\r\n                    if(row_num==0){\r\n                        data = array[0];\r\n                        row_num = 1;\r\n                    }\r\n                    else{\r\n                        data = array[row_num-1];\r\n                    }\r\n\r\n                    if(isRealNum(column_num)){\r\n                        if(column_num==0){\r\n                            data = data[0];\r\n                            column_num = 1;\r\n                        }\r\n                        else{\r\n                            data = data[column_num-1]\r\n                        }\r\n                    }\r\n                    else{\r\n                        column_num = 1;\r\n                    }\r\n                }\r\n                else{\r\n                    if(!isRealNum(row_num)){\r\n                        row_num = 1;\r\n                    }\r\n\r\n                    if(!isRealNum(column_num)){\r\n                        column_num = 1;\r\n                    }\r\n                    data = array[row_num - 1][column_num - 1];\r\n                }\r\n\r\n                let row_index = cellRow0 + row_num - 1, column_index = cellCol0 + column_num - 1;\r\n\r\n                let retAll= {\r\n                    \"sheetName\": data_array.sheetName,\r\n                    \"startCell\": getRangetxt(Store.calculateSheetIndex, {\r\n                        row: [row_index, row_index],\r\n                        column: [column_index, column_index]\r\n                    }),\r\n                    \"rowl\": row_index,\r\n                    \"coll\": column_index,\r\n                    \"data\": data\r\n                };\r\n                return retAll;\r\n            }\r\n            else{\r\n                //计算\r\n\r\n                if(!isRealNum(column_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                column_num = parseInt(column_num);\r\n\r\n                if(row_num <= 0 || column_num <= 0){\r\n                    return formula.error.v;\r\n                }\r\n                return array[row_num - 1][column_num - 1];\r\n            }\r\n\r\n\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GETPIVOTDATA\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return formula.error.v;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CHOOSE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //指定要返回哪一项\r\n            var index_num = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(index_num)){\r\n                return index_num;\r\n            }\r\n\r\n            if(!isRealNum(index_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            index_num = parseInt(index_num);\r\n\r\n            if(index_num < 1 || index_num > arguments.length - 1){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var data_result = arguments[index_num];\r\n\r\n            if(getObjType(data_result) == \"array\"){\r\n                if(getObjType(data_result[0]) == \"array\" && !func_methods.isDyadicArr(data_result)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                return data_result;\r\n            }\r\n            else if(getObjType(data_result) == \"object\" && data_result.startCell != null){\r\n                if(data_result.data == null){\r\n                    return 0;\r\n                }\r\n\r\n                if(getObjType(data_result.data) == \"array\"){\r\n                    var result = func_methods.getCellDataDyadicArr(data_result.data, \"number\");\r\n\r\n                    return result;\r\n                }\r\n                else{\r\n                    if(isRealNull(data_result.data.v)){\r\n                        return 0;\r\n                    }\r\n\r\n                    return data_result.data.v;\r\n                }\r\n            }\r\n            else{\r\n                return data_result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HYPERLINK\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return formula.error.v;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TIME\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //时\r\n            var hour = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(hour)){\r\n                return hour;\r\n            }\r\n\r\n            if(!isRealNum(hour)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            hour = parseInt(hour);\r\n\r\n            //分\r\n            var minute = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(minute)){\r\n                return minute;\r\n            }\r\n\r\n            if(!isRealNum(minute)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            minute = parseInt(minute);\r\n\r\n            //秒\r\n            var second = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(second)){\r\n                return second;\r\n            }\r\n\r\n            if(!isRealNum(second)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            second = parseInt(second);\r\n\r\n            if(hour < 0 || hour > 32767){\r\n                return formula.error.nm;\r\n            }\r\n            else if(hour > 24){\r\n                hour = hour % 24;\r\n            }\r\n\r\n            if(minute < 0 || minute > 32767){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(second < 0 || second > 32767){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var time = dayjs().set({'hour': hour, 'minute': minute, 'second': second});\r\n\r\n            return dayjs(time).format(\"h:mm:ss a\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TIMEVALUE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //用于表示时间的字符串\r\n            var time_text = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(time_text)){\r\n                return time_text;\r\n            }\r\n\r\n            //计算\r\n            if(!dayjs(time_text).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            return (3600 * dayjs(time_text).get('hour') + 60 * dayjs(time_text).get('minute') + dayjs(time_text).get('second')) / 86400;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EOMONTH\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //用于计算结果的参照日期\r\n            var start_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            //月数\r\n            var months = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(months)){\r\n                return months;\r\n            }\r\n\r\n            if(!isRealNum(months)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            months = parseInt(months);\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            var date = dayjs(start_date).add(months + 1, 'months').set('date', 1).subtract(1, 'days');\r\n            var mask = genarate(dayjs(date).format(\"YYYY-MM-DD H:mm:ss\"));\r\n\r\n            var result = mask[2];\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EDATE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //用于计算结果的参照日期\r\n            var start_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            //月数\r\n            var months = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(months)){\r\n                return months;\r\n            }\r\n\r\n            if(!isRealNum(months)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            months = parseInt(months);\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            var date = dayjs(start_date).add(months, 'months');\r\n            var mask = genarate(dayjs(date).format(\"YYYY-MM-DD h:mm:ss\"));\r\n\r\n            var result = mask[2];\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SECOND\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //时间值\r\n            var time_text = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(time_text)){\r\n                return time_text;\r\n            }\r\n\r\n            if(!dayjs(time_text).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var result = dayjs(time_text).seconds();\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MINUTE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //时间值\r\n            var time_text = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(time_text)){\r\n                return time_text;\r\n            }\r\n\r\n            if(!dayjs(time_text).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var result = dayjs(time_text).minutes();\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HOUR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //时间值\r\n            var time_text = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(time_text)){\r\n                return time_text;\r\n            }\r\n\r\n            if(!dayjs(time_text).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var result = dayjs(time_text).hours();\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NOW\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return dayjs().format(\"YYYY-M-D HH:mm\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NETWORKDAYS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            if(arguments.length == 3){\r\n                var result = window.luckysheet_function.NETWORKDAYS_INTL.f(arguments[0], arguments[1], 1, arguments[2]);\r\n            }\r\n            else{\r\n                var result = window.luckysheet_function.NETWORKDAYS_INTL.f(arguments[0], arguments[1], 1);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NETWORKDAYS_INTL\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var WEEKEND_TYPES = [\r\n                [],\r\n                [6, 0],\r\n                [0, 1],\r\n                [1, 2],\r\n                [2, 3],\r\n                [3, 4],\r\n                [4, 5],\r\n                [5, 6],\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                [0, 0],\r\n                [1, 1],\r\n                [2, 2],\r\n                [3, 3],\r\n                [4, 4],\r\n                [5, 5],\r\n                [6, 6]\r\n            ];\r\n\r\n            //用于计算净工作日天数的时间段开始日期\r\n            var start_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //用于计算净工作日天数的时间段结束日期\r\n            var end_date = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(end_date)){\r\n                return end_date;\r\n            }\r\n\r\n            if(!dayjs(end_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //用于表示哪些天为周末的数字或字符串\r\n            var weekend = WEEKEND_TYPES[1];\r\n            if(arguments.length >= 3){\r\n                weekend = arguments[2];\r\n\r\n                if(typeof weekend == \"string\" && weekend.length == \"7\" && /^[0-1]{7}$/g.test(weekend)){\r\n\r\n                }\r\n                else{\r\n                    weekend = func_methods.getFirstValue(arguments[2]);\r\n                    if(valueIsError(weekend)){\r\n                        return weekend;\r\n                    }\r\n\r\n                    if(!isRealNum(weekend)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    weekend = parseInt(weekend);\r\n\r\n                    if(weekend < 1 || (weekend > 7 && weekend < 11) || weekend > 17){\r\n                        return formula.error.nm;\r\n                    }\r\n\r\n                    weekend = WEEKEND_TYPES[weekend];\r\n                }\r\n            }\r\n\r\n            //这是一个范围或数组常量，其中包含作为节假日的日期\r\n            var holidays = [];\r\n            if(arguments.length == 4){\r\n                holidays = func_methods.getCellrangeDate(arguments[3]);\r\n                if(valueIsError(holidays)){\r\n                    return holidays;\r\n                }\r\n            }\r\n\r\n            for (var i = 0; i < holidays.length; i++) {\r\n                if(!dayjs(holidays[i]).isValid()){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            //计算\r\n            var days = dayjs(end_date).diff(dayjs(start_date), 'days') + 1;\r\n            var total = days;\r\n            var day = dayjs(start_date);\r\n\r\n            for (i = 0; i < days; i++) {\r\n                var d = dayjs(day).weekday();\r\n                var dec = false;\r\n\r\n                if(getObjType(weekend) == \"array\"){\r\n                    if (d === weekend[0] || d === weekend[1]) {\r\n                        dec = true;\r\n                    }\r\n                }\r\n                else{\r\n                    if(d == 0){\r\n                        d = 7;\r\n                    }\r\n\r\n                    if(weekend.charAt(d - 1) == \"0\"){\r\n                        dec = true;\r\n                    }\r\n                }\r\n\r\n                for (var j = 0; j < holidays.length; j++) {\r\n                    if(dayjs(day).diff(dayjs(holidays[j]), 'days') === 0){\r\n                        dec = true;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (dec) {\r\n                    total--;\r\n                }\r\n\r\n                day = dayjs(day).add(1, 'days');\r\n            }\r\n\r\n            return total;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISOWEEKNUM\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //用于日期和时间计算的日期\r\n            var date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(date)){\r\n                return date;\r\n            }\r\n\r\n            if(!dayjs(date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            return dayjs(date).isoWeeks();\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"WEEKNUM\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var WEEK_STARTS = [\r\n                undefined,\r\n                7,\r\n                1,\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                1,\r\n                2,\r\n                3,\r\n                4,\r\n                5,\r\n                6,\r\n                7\r\n            ];\r\n\r\n            //用于计算净工作日天数的时间段开始日期\r\n            var serial_number = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(serial_number)){\r\n                return serial_number;\r\n            }\r\n\r\n            if(!dayjs(serial_number).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //用于表示哪些天为周末的数字或字符串\r\n            var return_type = 1;\r\n            if(arguments.length == 2){\r\n                return_type = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(return_type)){\r\n                    return return_type;\r\n                }\r\n\r\n                if(!isRealNum(return_type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                return_type = parseInt(return_type);\r\n            }\r\n\r\n            if(return_type == 21){\r\n                return window.luckysheet_function.ISOWEEKNUM.f(arguments[0]);\r\n            }\r\n\r\n            if([1,2,11,12,13,14,15,16,17].indexOf(return_type) == -1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var week_start = WEEK_STARTS[return_type];\r\n            var inc = dayjs(serial_number).isoWeekday() >= week_start ? 1 : 0;\r\n            var result = dayjs(serial_number).isoWeeks() + inc;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"WEEKDAY\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var WEEK_TYPES = [\r\n                [],\r\n                [1, 2, 3, 4, 5, 6, 7],\r\n                [7, 1, 2, 3, 4, 5, 6],\r\n                [6, 0, 1, 2, 3, 4, 5],\r\n                [],\r\n                [],\r\n                [],\r\n                [],\r\n                [],\r\n                [],\r\n                [],\r\n                [7, 1, 2, 3, 4, 5, 6],\r\n                [6, 7, 1, 2, 3, 4, 5],\r\n                [5, 6, 7, 1, 2, 3, 4],\r\n                [4, 5, 6, 7, 1, 2, 3],\r\n                [3, 4, 5, 6, 7, 1, 2],\r\n                [2, 3, 4, 5, 6, 7, 1],\r\n                [1, 2, 3, 4, 5, 6, 7]\r\n            ];\r\n\r\n            //用于计算净工作日天数的时间段开始日期\r\n            var serial_number = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(serial_number)){\r\n                return serial_number;\r\n            }\r\n\r\n            if(!dayjs(serial_number).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //以数字指示使用哪种编号顺序来表示星期几\r\n            var return_type = 1;\r\n            if(arguments.length == 2){\r\n                return_type = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(return_type)){\r\n                    return return_type;\r\n                }\r\n\r\n                if(!isRealNum(return_type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                return_type = parseInt(return_type);\r\n            }\r\n\r\n            if([1,2,3,11,12,13,14,15,16,17].indexOf(return_type) == -1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var result = WEEK_TYPES[return_type][dayjs(serial_number).day()];\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DAY\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //用于计算净工作日天数的时间段开始日期\r\n            var serial_number = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(serial_number)){\r\n                return serial_number;\r\n            }\r\n\r\n            if(!dayjs(serial_number).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            return dayjs(serial_number).date();\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DAYS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结束日期\r\n            var end_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(end_date)){\r\n                return end_date;\r\n            }\r\n\r\n            if(!dayjs(end_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //开始日期\r\n            var start_date = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            var result = dayjs(end_date).diff(dayjs(start_date), 'days');\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DAYS360\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //开始日期\r\n            var start_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //结束日期\r\n            var end_date = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(end_date)){\r\n                return end_date;\r\n            }\r\n\r\n            if(!dayjs(end_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //天数计算方法\r\n            var method = false;\r\n            if(arguments.length == 3){\r\n                method = func_methods.getCellBoolen(arguments[2]);\r\n\r\n                if(valueIsError(method)){\r\n                    return method;\r\n                }\r\n            }\r\n\r\n            //计算\r\n            var sm = dayjs(start_date).month();\r\n            var em = dayjs(end_date).month();\r\n            var sd, ed;\r\n\r\n            if (method) {\r\n                sd = dayjs(start_date).date() === 31 ? 30 : dayjs(start_date).date();\r\n                ed = dayjs(end_date).date() === 31 ? 30 : dayjs(end_date).date();\r\n            }\r\n            else {\r\n                var smd = dayjs().set({ 'year': dayjs(start_date).year(), 'month': sm + 1, 'date': 0 }).date();\r\n                var emd = dayjs().set({ 'year': dayjs(end_date).year(), 'month': em + 1, 'date': 0 }).date();\r\n                sd = dayjs(start_date).date() === smd ? 30 : dayjs(start_date).date();\r\n\r\n                if (dayjs(end_date).date() === emd) {\r\n                    if (sd < 30) {\r\n                        em++;\r\n                        ed = 1;\r\n                    }\r\n                    else {\r\n                        ed = 30;\r\n                    }\r\n                }\r\n                else {\r\n                    ed = dayjs(end_date).date();\r\n                }\r\n            }\r\n\r\n            var result = 360 * dayjs(end_date).diff(dayjs(start_date), 'years') + 30 * (em - sm) + (ed - sd);\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //年\r\n            var year = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(year)){\r\n                return year;\r\n            }\r\n\r\n            if(!isRealNum(year)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            year = parseInt(year);\r\n\r\n            //月\r\n            var month = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(month)){\r\n                return month;\r\n            }\r\n\r\n            if(!isRealNum(month)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            month = parseInt(month);\r\n\r\n            //日\r\n            var day = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(day)){\r\n                return day;\r\n            }\r\n\r\n            if(!isRealNum(day)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            day = parseInt(day);\r\n\r\n            if(year < 0 || year >= 10000){\r\n                return formula.error.nm;\r\n            }\r\n            else if(year >= 0 && year <= 1899){\r\n                year = year + 1900;\r\n            }\r\n\r\n            var date = dayjs().set({ 'year': year, 'month': month - 1, \"date\": day });\r\n\r\n            if(dayjs(date).year() < 1900){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return dayjs(date).format(\"YYYY-MM-DD\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATEVALUE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //开始日期\r\n            var date_text = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(date_text)){\r\n                return date_text;\r\n            }\r\n\r\n            if(!dayjs(date_text).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            date_text = dayjs(date_text).format(\"YYYY-MM-DD\");\r\n            var result = genarate(date_text)[2];\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DATEDIF\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            for (var i = 0; i < arguments.length-1; i++){\r\n                arguments[i] = func_methods.getCellDate(arguments[i]);\r\n                if(!isdatetime(arguments[i])){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            var startDate = dayjs(arguments[0]);\r\n            var endDate = dayjs(arguments[1]);\r\n            var unit = arguments[2];\r\n            var result = formula.error.v;\r\n            if(window.luckysheet_function.DAYS.f(endDate,startDate) < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            switch(unit){\r\n                case \"Y\":case \"y\":\r\n                    result = endDate.diff(startDate,\"years\",false);\r\n                    break;\r\n                case \"M\":case \"m\":\r\n                    result = endDate.diff(startDate,\"months\",false);\r\n                    break;\r\n                case \"D\":case \"d\":\r\n                    result = endDate.diff(startDate,\"days\",false);\r\n                    break;\r\n                case \"MD\":case \"md\":\r\n                    result = endDate.format('DD') - startDate.format('DD');\r\n                    break;\r\n                case \"YM\":case \"ym\":\r\n                    var startM = parseInt(startDate.format('M')); //注意字符串转化为数字\r\n                    var endM = parseInt(endDate.format('M'));\r\n                    result = (startM <= endM) ?  endM - startM : endM + 12 - startM;\r\n                    break;\r\n                case \"YD\":case \"yd\":\r\n                    const format = `${endDate.$y}-MM-DD`;\r\n                    var startM = genarate(startDate.format(format))[2];\r\n                    var endM = genarate(endDate.format(format))[2];\r\n\r\n                    result = (startM <= endM) ? endM - startM : endM + 365 - startM;\r\n                    break;\r\n                default:\r\n                    result = formula.error.v;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"WORKDAY\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            if(arguments.length == 3){\r\n                var result = window.luckysheet_function.WORKDAY_INTL.f(arguments[0], arguments[1], 1, arguments[2]);\r\n            }\r\n            else{\r\n                var result = window.luckysheet_function.WORKDAY_INTL.f(arguments[0], arguments[1], 1);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"WORKDAY_INTL\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var WEEKEND_TYPES = [\r\n                [],\r\n                [6, 0],\r\n                [0, 1],\r\n                [1, 2],\r\n                [2, 3],\r\n                [3, 4],\r\n                [4, 5],\r\n                [5, 6],\r\n                undefined,\r\n                undefined,\r\n                undefined,\r\n                [0, 0],\r\n                [1, 1],\r\n                [2, 2],\r\n                [3, 3],\r\n                [4, 4],\r\n                [5, 5],\r\n                [6, 6]\r\n            ];\r\n\r\n            //计算的开始日期\r\n            var start_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //工作日的天数\r\n            var days = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(days)){\r\n                return days;\r\n            }\r\n\r\n            if(!isRealNum(days)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            days = parseInt(days);\r\n\r\n            //用于表示哪些天为周末的数字或字符串\r\n            var weekend = WEEKEND_TYPES[1];\r\n            if(arguments.length >= 3){\r\n                weekend = arguments[2];\r\n\r\n                if(typeof weekend == \"string\" && weekend.length == \"7\" && /^[0-1]{7}$/g.test(weekend)){\r\n\r\n                }\r\n                else{\r\n                    weekend = func_methods.getFirstValue(arguments[2]);\r\n                    if(valueIsError(weekend)){\r\n                        return weekend;\r\n                    }\r\n\r\n                    if(!isRealNum(weekend)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    weekend = parseInt(weekend);\r\n\r\n                    if(weekend < 1 || (weekend > 7 && weekend < 11) || weekend > 17){\r\n                        return formula.error.nm;\r\n                    }\r\n\r\n                    weekend = WEEKEND_TYPES[weekend];\r\n                }\r\n            }\r\n\r\n            //这是一个范围或数组常量，其中包含作为节假日的日期\r\n            var holidays = [];\r\n            if(arguments.length == 4){\r\n                holidays = func_methods.getCellrangeDate(arguments[3]);\r\n                if(valueIsError(holidays)){\r\n                    return holidays;\r\n                }\r\n            }\r\n\r\n            for (var i = 0; i < holidays.length; i++) {\r\n                if(!dayjs(holidays[i]).isValid()){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            //计算\r\n            var d = 0;\r\n\r\n            while (d < days) {\r\n                start_date = dayjs(start_date).add(1, 'days');\r\n                var day = dayjs(start_date).weekday();\r\n\r\n                if(getObjType(weekend)){\r\n                    if (day === weekend[0] || day === weekend[1]) {\r\n                        continue;\r\n                    }\r\n                }\r\n                else{\r\n                    if(day == 0){\r\n                        day = 7;\r\n                    }\r\n\r\n                    if(weekend.charAt(day - 1) == \"0\"){\r\n                        continue;\r\n                    }\r\n                }\r\n\r\n                for (var j = 0; j < holidays.length; j++) {\r\n                    if(dayjs(start_date).diff(dayjs(holidays[j]), 'days') === 0){\r\n                        d--;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                d++;\r\n            }\r\n\r\n            return dayjs(start_date).format(\"YYYY-MM-DD\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"YEAR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //开始日期\r\n            var serial_number = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(serial_number)){\r\n                return serial_number;\r\n            }\r\n\r\n            if(!dayjs(serial_number).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            return dayjs(serial_number).year();\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"YEARFRAC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //开始日期\r\n            var start_date = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(start_date)){\r\n                return start_date;\r\n            }\r\n\r\n            if(!dayjs(start_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //结束日期\r\n            var end_date = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(end_date)){\r\n                return end_date;\r\n            }\r\n\r\n            if(!dayjs(end_date).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 3){\r\n                basis = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var sd = dayjs(start_date).date();\r\n            var sm = dayjs(start_date).month() + 1;\r\n            var sy = dayjs(start_date).year();\r\n            var ed = dayjs(end_date).date();\r\n            var em = dayjs(end_date).month() + 1;\r\n            var ey = dayjs(end_date).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(start_date, end_date) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        return dayjs(end_date).diff(dayjs(start_date), 'days') / ylength;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    result = dayjs(end_date).diff(dayjs(start_date), 'days') / average;\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    result = dayjs(end_date).diff(dayjs(start_date), 'days') / 360;\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    result = dayjs(end_date).diff(dayjs(start_date), 'days') / 365;\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                    break;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TODAY\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return dayjs().format(\"YYYY-MM-DD\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MONTH\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //开始日期\r\n            var serial_number = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(serial_number)){\r\n                return serial_number;\r\n            }\r\n\r\n            if(!dayjs(serial_number).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            return dayjs(serial_number).month() + 1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EFFECT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //每年的名义利率\r\n            var nominal_rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(nominal_rate)){\r\n                return nominal_rate;\r\n            }\r\n\r\n            if(!isRealNum(nominal_rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nominal_rate = parseFloat(nominal_rate);\r\n\r\n            //每年的复利计算期数\r\n            var npery = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(npery)){\r\n                return npery;\r\n            }\r\n\r\n            if(!isRealNum(npery)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            npery = parseInt(npery);\r\n\r\n            if(nominal_rate <= 0 || npery < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return Math.pow(1 + nominal_rate / npery, npery) - 1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DOLLAR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要设置格式的值\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //显示的小数位数\r\n            var decimals = 2;\r\n            if(arguments.length == 2){\r\n                decimals = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(decimals)){\r\n                    return decimals;\r\n                }\r\n\r\n                if(!isRealNum(decimals)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                decimals = parseInt(decimals);\r\n            }\r\n\r\n            if(decimals > 9){\r\n                decimals = 9;\r\n            }\r\n\r\n            var foucsStatus = \"0.\";\r\n            for(var i = 1; i <= decimals; i++){\r\n                foucsStatus += \"0\";\r\n            }\r\n\r\n            //计算\r\n            var sign = (number > 0) ? 1 : -1;\r\n\r\n            return sign * (Math.floor(Math.abs(number) * Math.pow(10, decimals))) / Math.pow(10, decimals);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DOLLARDE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //分数\r\n            var fractional_dollar = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(fractional_dollar)){\r\n                return fractional_dollar;\r\n            }\r\n\r\n            if(!isRealNum(fractional_dollar)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            fractional_dollar = parseFloat(fractional_dollar);\r\n\r\n            //用作分数中的分母的整数\r\n            var fraction = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(fraction)){\r\n                return fraction;\r\n            }\r\n\r\n            if(!isRealNum(fraction)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            fraction = parseInt(fraction);\r\n\r\n            if(fraction < 0){\r\n                return formula.error.nm;\r\n            }\r\n            else if(fraction == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //计算\r\n            var result = parseInt(fractional_dollar, 10);\r\n\r\n            result += (fractional_dollar % 1) * Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN10)) / fraction;\r\n\r\n            var power = Math.pow(10, Math.ceil(Math.log(fraction) / Math.LN2) + 1);\r\n            result = Math.round(result * power) / power;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DOLLARFR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //小数\r\n            var decimal_dollar = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(decimal_dollar)){\r\n                return decimal_dollar;\r\n            }\r\n\r\n            if(!isRealNum(decimal_dollar)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            decimal_dollar = parseFloat(decimal_dollar);\r\n\r\n            //用作分数中的分母的整数\r\n            var fraction = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(fraction)){\r\n                return fraction;\r\n            }\r\n\r\n            if(!isRealNum(fraction)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            fraction = parseInt(fraction);\r\n\r\n            if(fraction < 0){\r\n                return formula.error.nm;\r\n            }\r\n            else if(fraction == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            //计算\r\n            var result = parseInt(decimal_dollar, 10);\r\n\r\n            result += (decimal_dollar % 1) * Math.pow(10, -Math.ceil(Math.log(fraction) / Math.LN10)) * fraction;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DB\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //资产原值\r\n            var cost = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(cost)){\r\n                return cost;\r\n            }\r\n\r\n            if(!isRealNum(cost)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            cost = parseFloat(cost);\r\n\r\n            //资产残值\r\n            var salvage = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(salvage)){\r\n                return salvage;\r\n            }\r\n\r\n            if(!isRealNum(salvage)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            salvage = parseFloat(salvage);\r\n\r\n            //资产的折旧期数\r\n            var life = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(life)){\r\n                return life;\r\n            }\r\n\r\n            if(!isRealNum(life)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            life = parseFloat(life);\r\n\r\n            //在使用期限内要计算折旧的折旧期\r\n            var period = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(period)){\r\n                return period;\r\n            }\r\n\r\n            if(!isRealNum(period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            period = parseInt(period);\r\n\r\n            //折旧第一年中的月数\r\n            var month = 12;\r\n            if(arguments.length == 5){\r\n                month = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(month)){\r\n                    return month;\r\n                }\r\n\r\n                if(!isRealNum(month)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                month = parseInt(month);\r\n            }\r\n\r\n            if(cost < 0 || salvage < 0 || life < 0 || period < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(month < 1 || month > 12){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(period > life){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(salvage >= cost){\r\n                return 0;\r\n            }\r\n\r\n            //计算\r\n            var rate = (1 - Math.pow(salvage / cost, 1 / life)).toFixed(3);\r\n\r\n            var initial = cost * rate * month / 12;\r\n\r\n            var total = initial;\r\n            var current = 0;\r\n            var ceiling = (period === life) ? life - 1 : period;\r\n\r\n            for (var i = 2; i <= ceiling; i++) {\r\n                current = (cost - total) * rate;\r\n                total += current;\r\n            }\r\n\r\n            if (period === 1) {\r\n                var result = initial;\r\n            }\r\n            else if (period === life) {\r\n                var result = (cost - total) * rate;\r\n            }\r\n            else {\r\n                var result = current;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DDB\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //资产原值\r\n            var cost = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(cost)){\r\n                return cost;\r\n            }\r\n\r\n            if(!isRealNum(cost)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            cost = parseFloat(cost);\r\n\r\n            //资产残值\r\n            var salvage = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(salvage)){\r\n                return salvage;\r\n            }\r\n\r\n            if(!isRealNum(salvage)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            salvage = parseFloat(salvage);\r\n\r\n            //资产的折旧期数\r\n            var life = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(life)){\r\n                return life;\r\n            }\r\n\r\n            if(!isRealNum(life)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            life = parseFloat(life);\r\n\r\n            //在使用期限内要计算折旧的折旧期\r\n            var period = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(period)){\r\n                return period;\r\n            }\r\n\r\n            if(!isRealNum(period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            period = parseInt(period);\r\n\r\n            //折旧的递减系数\r\n            var factor = 2;\r\n            if(arguments.length == 5){\r\n                factor = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(factor)){\r\n                    return factor;\r\n                }\r\n\r\n                if(!isRealNum(factor)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                factor = parseFloat(factor);\r\n            }\r\n\r\n            if(cost < 0 || salvage < 0 || life < 0 || period < 0 || factor <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(period > life){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(salvage >= cost){\r\n                return 0;\r\n            }\r\n\r\n            //计算\r\n            var total = 0;\r\n            var current = 0;\r\n\r\n            for (var i = 1; i <= period; i++) {\r\n                current = Math.min((cost - total) * (factor / life), (cost - salvage - total));\r\n                total += current;\r\n            }\r\n\r\n            return current;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RATE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //年金的付款总期数。\r\n            var nper = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //每期的付款金额\r\n            var pmt = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(pmt)){\r\n                return pmt;\r\n            }\r\n\r\n            if(!isRealNum(pmt)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pmt = parseFloat(pmt);\r\n\r\n            //现值\r\n            var pv = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //最后一次付款后希望得到的现金余额\r\n            var fv = 0;\r\n            if(arguments.length >= 4){\r\n                fv = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(fv)){\r\n                    return fv;\r\n                }\r\n\r\n                if(!isRealNum(fv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                fv = parseFloat(fv);\r\n            }\r\n\r\n            //指定各期的付款时间是在期初还是期末\r\n            var type = 0;\r\n            if(arguments.length >= 5){\r\n                type = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            //预期利率\r\n            var guess = 0.1;\r\n            if(arguments.length == 6){\r\n                guess = func_methods.getFirstValue(arguments[5]);\r\n                if(valueIsError(guess)){\r\n                    return guess;\r\n                }\r\n\r\n                if(!isRealNum(guess)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                guess = parseFloat(guess);\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var epsMax = 1e-6;\r\n\r\n            var iterMax = 100;\r\n            var iter = 0;\r\n            var close = false;\r\n            var rate = guess;\r\n\r\n            while (iter < iterMax && !close) {\r\n                var t1 = Math.pow(rate + 1, nper);\r\n                var t2 = Math.pow(rate + 1, nper - 1);\r\n\r\n                var f1 = fv + t1 * pv + pmt * (t1 - 1) * (rate * type + 1) / rate;\r\n                var f2 = nper * t2 * pv - pmt * (t1 - 1) *(rate * type + 1) / Math.pow(rate,2);\r\n                var f3 = nper * pmt * t2 * (rate * type + 1) / rate + pmt * (t1 - 1) * type / rate;\r\n\r\n                var newRate = rate - f1 / (f2 + f3);\r\n\r\n                if (Math.abs(newRate - rate) < epsMax) close = true;\r\n\r\n                iter++\r\n                rate = newRate;\r\n            }\r\n\r\n            if (!close) return formula.error.nm;\r\n\r\n            return rate;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CUMPRINC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //利率\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //总付款期数\r\n            var nper = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //年金的现值\r\n            var pv = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //首期\r\n            var start_period = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(start_period)){\r\n                return start_period;\r\n            }\r\n\r\n            if(!isRealNum(start_period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            start_period = parseInt(start_period);\r\n\r\n            //末期\r\n            var end_period = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(end_period)){\r\n                return end_period;\r\n            }\r\n\r\n            if(!isRealNum(end_period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            end_period = parseInt(end_period);\r\n\r\n            //指定各期的付款时间是在期初还是期末\r\n            var type = func_methods.getFirstValue(arguments[5]);\r\n            if(valueIsError(type)){\r\n                return type;\r\n            }\r\n\r\n            if(!isRealNum(type)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            type = parseFloat(type);\r\n\r\n            if(rate <= 0 || nper <= 0 || pv <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(start_period < 1 || end_period < 1 || start_period > end_period){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var payment = window.luckysheet_function.PMT.f(rate, nper, pv, 0, type);\r\n            var principal = 0;\r\n\r\n            if (start_period === 1) {\r\n                if (type === 0) {\r\n                    principal = payment + pv * rate;\r\n                }\r\n                else {\r\n                    principal = payment;\r\n                }\r\n                start_period++;\r\n            }\r\n\r\n            for (var i = start_period; i <= end_period; i++) {\r\n                if (type > 0) {\r\n                    principal += payment - (window.luckysheet_function.FV.f(rate, i - 2, payment, pv, 1) - payment) * rate;\r\n                }\r\n                else {\r\n                    principal += payment - window.luckysheet_function.FV.f(rate, i - 1, payment, pv, 0) * rate;\r\n                }\r\n            }\r\n\r\n            return principal;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUPNUM\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //年付息次数\r\n            var frequency = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 4){\r\n                var basis = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var sd = dayjs(settlement).date();\r\n            var sm = dayjs(settlement).month() + 1;\r\n            var sy = dayjs(settlement).year();\r\n            var ed = dayjs(maturity).date();\r\n            var em = dayjs(maturity).month() + 1;\r\n            var ey = dayjs(maturity).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / (360 / frequency);\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(settlement, maturity) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        return dayjs(maturity).diff(dayjs(settlement), 'days') / (ylength / frequency);\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    result = dayjs(maturity).diff(dayjs(settlement), 'days') / (average / frequency);\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    result = dayjs(maturity).diff(dayjs(settlement), 'days') / (360 / frequency);\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    result = dayjs(maturity).diff(dayjs(settlement), 'days') / (365 / frequency);\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / (360 / frequency);\r\n\r\n                    break;\r\n            }\r\n\r\n            return Math.round(result);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SYD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //资产原值\r\n            var cost = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(cost)){\r\n                return cost;\r\n            }\r\n\r\n            if(!isRealNum(cost)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            cost = parseFloat(cost);\r\n\r\n            //资产残值\r\n            var salvage = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(salvage)){\r\n                return salvage;\r\n            }\r\n\r\n            if(!isRealNum(salvage)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            salvage = parseFloat(salvage);\r\n\r\n            //资产的折旧期数\r\n            var life = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(life)){\r\n                return life;\r\n            }\r\n\r\n            if(!isRealNum(life)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            life = parseFloat(life);\r\n\r\n            //在使用期限内要计算折旧的折旧期\r\n            var period = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(period)){\r\n                return period;\r\n            }\r\n\r\n            if(!isRealNum(period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            period = parseInt(period);\r\n\r\n            if(life == 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(period < 1 || period > life){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return ((cost - salvage) * (life - period + 1) * 2) / (life * (life + 1));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TBILLEQ\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //债券购买时的贴现率\r\n            var discount = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(discount)){\r\n                return discount;\r\n            }\r\n\r\n            if(!isRealNum(discount)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            discount = parseFloat(discount);\r\n\r\n            if(discount <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) > 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(maturity) - dayjs(settlement) > 365 * 24 * 60 * 60 * 1000){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (365 * discount) / (360 - discount * dayjs(maturity).diff(dayjs(settlement), 'days'));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TBILLYIELD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的价格\r\n            var pr = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pr)){\r\n                return pr;\r\n            }\r\n\r\n            if(!isRealNum(pr)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pr = parseFloat(pr);\r\n\r\n            if(pr <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(maturity) - dayjs(settlement) > 365 * 24 * 60 * 60 * 1000){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return ((100 - pr) / pr) * (360 / dayjs(maturity).diff(dayjs(settlement), 'days'));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TBILLPRICE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的价格\r\n            var discount = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(discount)){\r\n                return discount;\r\n            }\r\n\r\n            if(!isRealNum(discount)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            discount = parseFloat(discount);\r\n\r\n            if(discount <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) > 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(maturity) - dayjs(settlement) > 365 * 24 * 60 * 60 * 1000){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return 100 * (1 - discount * dayjs(maturity).diff(dayjs(settlement), 'days') / 360);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PV\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //利率\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //总付款期数\r\n            var nper = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //每期的付款金额\r\n            var pmt = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pmt)){\r\n                return pmt;\r\n            }\r\n\r\n            if(!isRealNum(pmt)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pmt = parseFloat(pmt);\r\n\r\n            //最后一次付款后希望得到的现金余额\r\n            var fv = 0;\r\n            if(arguments.length >= 4){\r\n                fv = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(fv)){\r\n                    return fv;\r\n                }\r\n\r\n                if(!isRealNum(fv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                fv = parseFloat(fv);\r\n            }\r\n\r\n            //指定各期的付款时间是在期初还是期末\r\n            var type = 0;\r\n            if(arguments.length >= 5){\r\n                type = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            if (rate === 0) {\r\n                var result = -pmt * nper - fv;\r\n            }\r\n            else {\r\n                var result = (((1 - Math.pow(1 + rate, nper)) / rate) * pmt * (1 + rate * type) - fv) / Math.pow(1 + rate, nper);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ACCRINT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //有价证券的发行日\r\n            var issue = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(issue)){\r\n                return issue;\r\n            }\r\n\r\n            if(!dayjs(issue).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的首次计息日\r\n            var first_interest = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(first_interest)){\r\n                return first_interest;\r\n            }\r\n\r\n            if(!dayjs(first_interest).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的结算日\r\n            var settlement = func_methods.getCellDate(arguments[2]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的年息票利率\r\n            var rate = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //证券的票面值\r\n            var par = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(par)){\r\n                return par;\r\n            }\r\n\r\n            if(!isRealNum(par)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            par = parseFloat(par);\r\n\r\n            //年付息次数\r\n            var frequency = func_methods.getFirstValue(arguments[5]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length >= 7){\r\n                basis = func_methods.getFirstValue(arguments[6]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            //当结算日期晚于首次计息日期时用于计算总应计利息的方法\r\n            var calc_method = true;\r\n            if(arguments.length == 8){\r\n                calc_method = func_methods.getCellBoolen(arguments[7]);\r\n\r\n                if(valueIsError(calc_method)){\r\n                    return calc_method;\r\n                }\r\n            }\r\n\r\n            if(rate <= 0 || par <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(issue) - dayjs(settlement) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var result;\r\n            if(dayjs(settlement) - dayjs(first_interest) >= 0 && !calc_method){\r\n                var sd = dayjs(first_interest).date();\r\n                var sm = dayjs(first_interest).month() + 1;\r\n                var sy = dayjs(first_interest).year();\r\n                var ed = dayjs(settlement).date();\r\n                var em = dayjs(settlement).month() + 1;\r\n                var ey = dayjs(settlement).year();\r\n\r\n                switch (basis) {\r\n                    case 0: // US (NASD) 30/360\r\n                        if (sd === 31 && ed === 31) {\r\n                            sd = 30;\r\n                            ed = 30;\r\n                        }\r\n                        else if (sd === 31) {\r\n                            sd = 30;\r\n                        }\r\n                        else if (sd === 30 && ed === 31) {\r\n                            ed = 30;\r\n                        }\r\n\r\n                        result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                        break;\r\n                    case 1: // Actual/actual\r\n                        var ylength = 365;\r\n                        if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                            if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(first_interest, settlement) || (em === 1 && ed === 29)) {\r\n                                ylength = 366;\r\n                            }\r\n\r\n                            return dayjs(settlement).diff(dayjs(first_interest), 'days') / ylength;\r\n                        }\r\n\r\n                        var years = (ey - sy) + 1;\r\n                        var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                        var average = days / years;\r\n\r\n                        result = dayjs(settlement).diff(dayjs(first_interest), 'days') / average;\r\n\r\n                        break;\r\n                    case 2: // Actual/360\r\n                        result = dayjs(settlement).diff(dayjs(first_interest), 'days') / 360;\r\n\r\n                        break;\r\n                    case 3: // Actual/365\r\n                        result = dayjs(settlement).diff(dayjs(first_interest), 'days') / 365;\r\n\r\n                        break;\r\n                    case 4: // European 30/360\r\n                        result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                        break;\r\n                }\r\n            }\r\n            else{\r\n                var sd = dayjs(issue).date();\r\n                var sm = dayjs(issue).month() + 1;\r\n                var sy = dayjs(issue).year();\r\n                var ed = dayjs(settlement).date();\r\n                var em = dayjs(settlement).month() + 1;\r\n                var ey = dayjs(settlement).year();\r\n\r\n                switch (basis) {\r\n                    case 0: // US (NASD) 30/360\r\n                        if (sd === 31 && ed === 31) {\r\n                            sd = 30;\r\n                            ed = 30;\r\n                        }\r\n                        else if (sd === 31) {\r\n                            sd = 30;\r\n                        }\r\n                        else if (sd === 30 && ed === 31) {\r\n                            ed = 30;\r\n                        }\r\n\r\n                        result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                        break;\r\n                    case 1: // Actual/actual\r\n                        var ylength = 365;\r\n                        if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                            if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(issue, settlement) || (em === 1 && ed === 29)) {\r\n                                ylength = 366;\r\n                            }\r\n\r\n                            return dayjs(settlement).diff(dayjs(issue), 'days') / ylength;\r\n                        }\r\n\r\n                        var years = (ey - sy) + 1;\r\n                        var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                        var average = days / years;\r\n\r\n                        result = dayjs(settlement).diff(dayjs(issue), 'days') / average;\r\n\r\n                        break;\r\n                    case 2: // Actual/360\r\n                        result = dayjs(settlement).diff(dayjs(issue), 'days') / 360;\r\n\r\n                        break;\r\n                    case 3: // Actual/365\r\n                        result = dayjs(settlement).diff(dayjs(issue), 'days') / 365;\r\n\r\n                        break;\r\n                    case 4: // European 30/360\r\n                        result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                        break;\r\n                }\r\n            }\r\n\r\n            return par * rate * result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ACCRINTM\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //有价证券的发行日\r\n            var issue = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(issue)){\r\n                return issue;\r\n            }\r\n\r\n            if(!dayjs(issue).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的到期日\r\n            var settlement = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的年息票利率\r\n            var rate = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //证券的票面值\r\n            var par = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(par)){\r\n                return par;\r\n            }\r\n\r\n            if(!isRealNum(par)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            par = parseFloat(par);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 5){\r\n                basis = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(rate <= 0 || par <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(issue) - dayjs(settlement) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var sd = dayjs(issue).date();\r\n            var sm = dayjs(issue).month() + 1;\r\n            var sy = dayjs(issue).year();\r\n            var ed = dayjs(settlement).date();\r\n            var em = dayjs(settlement).month() + 1;\r\n            var ey = dayjs(settlement).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(issue, settlement) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        return dayjs(settlement).diff(dayjs(issue), 'days') / ylength;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    result = dayjs(settlement).diff(dayjs(issue), 'days') / average;\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    result = dayjs(settlement).diff(dayjs(issue), 'days') / 360;\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    result = dayjs(settlement).diff(dayjs(issue), 'days') / 365;\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                    break;\r\n            }\r\n\r\n            return par * rate * result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUPDAYBS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //年付息次数\r\n            var frequency = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 4){\r\n                basis = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var interest; //结算日之前的上一个付息日\r\n\r\n            var maxCount = Math.ceil(dayjs(maturity).diff(dayjs(settlement), 'months') / (12 / frequency)) + 1;\r\n\r\n            for(var i = 1; i <= maxCount; i++){\r\n                var di = dayjs(maturity).subtract((12 / frequency) * i, 'months');\r\n\r\n                if(di <= dayjs(settlement)){\r\n                    interest = di;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    var sd = dayjs(interest).date();\r\n                    var sm = dayjs(interest).month() + 1;\r\n                    var sy = dayjs(interest).year();\r\n                    var ed = dayjs(settlement).date();\r\n                    var em = dayjs(settlement).month() + 1;\r\n                    var ey = dayjs(settlement).year();\r\n\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = (ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360);\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                case 2: // Actual/360\r\n                case 3: // Actual/365\r\n                    result = dayjs(settlement).diff(dayjs(interest), 'days');\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    var sd = dayjs(interest).date();\r\n                    var sm = dayjs(interest).month() + 1;\r\n                    var sy = dayjs(interest).year();\r\n                    var ed = dayjs(settlement).date();\r\n                    var em = dayjs(settlement).month() + 1;\r\n                    var ey = dayjs(settlement).year();\r\n\r\n                    result = (ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360);\r\n\r\n                    break;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUPDAYS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //年付息次数\r\n            var frequency = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 4){\r\n                basis = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    result = 360 / frequency;\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var maxCount = Math.ceil(dayjs(maturity).diff(dayjs(settlement), 'months') / (12 / frequency)) + 1;\r\n\r\n                    for(var i = 1; i <= maxCount; i++){\r\n                        var d1 = dayjs(maturity).subtract((12 / frequency) * i, 'months');\r\n                        if(d1 <= dayjs(settlement)){\r\n                            var d2 = dayjs(maturity).subtract((12 / frequency) * (i - 1), 'months');\r\n                            result = dayjs(d2).diff(dayjs(d1), 'days');\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    result = 360 / frequency;\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    result = 365 / frequency;\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    result = 360 / frequency;\r\n\r\n                    break;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUPDAYSNC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //年付息次数\r\n            var frequency = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 4){\r\n                basis = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var interest; //结算日之后的下一个付息日\r\n\r\n            var maxCount = Math.ceil(dayjs(maturity).diff(dayjs(settlement), 'months') / (12 / frequency)) + 1;\r\n\r\n            for(var i = 1; i <= maxCount; i++){\r\n                var di = dayjs(maturity).subtract((12 / frequency) * i, 'months');\r\n\r\n                if(di <= dayjs(settlement)){\r\n                    interest = dayjs(maturity).subtract((12 / frequency) * (i - 1), 'months');\r\n                    break;\r\n                }\r\n            }\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    var sd = dayjs(settlement).date();\r\n                    var sm = dayjs(settlement).month() + 1;\r\n                    var sy = dayjs(settlement).year();\r\n                    var ed = dayjs(interest).date();\r\n                    var em = dayjs(interest).month() + 1;\r\n                    var ey = dayjs(interest).year();\r\n\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = (ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360);\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                case 2: // Actual/360\r\n                case 3: // Actual/365\r\n                    result = dayjs(interest).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    var sd = dayjs(settlement).date();\r\n                    var sm = dayjs(settlement).month() + 1;\r\n                    var sy = dayjs(settlement).year();\r\n                    var ed = dayjs(interest).date();\r\n                    var em = dayjs(interest).month() + 1;\r\n                    var ey = dayjs(interest).year();\r\n\r\n                    result = (ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360);\r\n\r\n                    break;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUPNCD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //年付息次数\r\n            var frequency = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 4){\r\n                basis = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var interest; //结算日之后的下一个付息日\r\n\r\n            var maxCount = Math.ceil(dayjs(maturity).diff(dayjs(settlement), 'months') / (12 / frequency)) + 1;\r\n\r\n            for(var i = 1; i <= maxCount; i++){\r\n                var di = dayjs(maturity).subtract((12 / frequency) * i, 'months');\r\n\r\n                if(di <= dayjs(settlement)){\r\n                    interest = dayjs(maturity).subtract((12 / frequency) * (i - 1), 'months');\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return dayjs(interest).format(\"YYYY-MM-DD\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COUPPCD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //年付息次数\r\n            var frequency = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 4){\r\n                basis = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var interest; //结算日之前的上一个付息日\r\n\r\n            var maxCount = Math.ceil(dayjs(maturity).diff(dayjs(settlement), 'months') / (12 / frequency)) + 1;\r\n\r\n            for(var i = 1; i <= maxCount; i++){\r\n                var di = dayjs(maturity).subtract((12 / frequency) * i, 'months');\r\n\r\n                if(di <= dayjs(settlement)){\r\n                    interest = di;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return dayjs(interest).format(\"YYYY-MM-DD\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FV\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //利率\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //总付款期数\r\n            var nper = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //每期的付款金额\r\n            var pmt = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pmt)){\r\n                return pmt;\r\n            }\r\n\r\n            if(!isRealNum(pmt)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pmt = parseFloat(pmt);\r\n\r\n            //现值，或一系列未来付款的当前值的累积和\r\n            var pv = 0;\r\n            if(arguments.length >= 4){\r\n                pv = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(pv)){\r\n                    return pv;\r\n                }\r\n\r\n                if(!isRealNum(pv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                pv = parseFloat(pv);\r\n            }\r\n\r\n            //指定各期的付款时间是在期初还是期末\r\n            var type = 0;\r\n            if(arguments.length >= 5){\r\n                type = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var result;\r\n            if (rate === 0) {\r\n                result = pv + pmt * nper;\r\n            }\r\n            else {\r\n                var term = Math.pow(1 + rate, nper);\r\n                if (type === 1) {\r\n                    result = pv * term + pmt * (1 + rate) * (term - 1) / rate;\r\n                }\r\n                else {\r\n                    result = pv * term + pmt * (term - 1) / rate;\r\n                }\r\n            }\r\n\r\n            return -result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FVSCHEDULE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //现值\r\n            var principal = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(principal)){\r\n                return principal;\r\n            }\r\n\r\n            if(!isRealNum(principal)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            principal = parseFloat(principal);\r\n\r\n            //一组利率\r\n            var data_schedule = arguments[1];\r\n            var schedule = [];\r\n\r\n            if(getObjType(data_schedule) == \"array\"){\r\n                if(getObjType(data_schedule[0]) == \"array\" && !func_methods.isDyadicArr(data_schedule)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                schedule = schedule.concat(func_methods.getDataArr(data_schedule, false));\r\n            }\r\n            else if(getObjType(data_schedule) == \"object\" && data_schedule.startCell != null){\r\n                schedule = schedule.concat(func_methods.getCellDataArr(data_schedule, \"number\", false));\r\n            }\r\n            else{\r\n                schedule.push(data_schedule);\r\n            }\r\n\r\n            var schedule_n = [];\r\n\r\n            for(var i = 0; i < schedule.length; i++){\r\n                var number = schedule[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                schedule_n.push(parseFloat(number));\r\n            }\r\n\r\n            //计算\r\n            var n = schedule_n.length;\r\n            var future = principal;\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                future *= 1 + schedule_n[i];\r\n            }\r\n\r\n            return future;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"YIELD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的年息票利率\r\n            var rate = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //有价证券的价格\r\n            var pr = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(pr)){\r\n                return pr;\r\n            }\r\n\r\n            if(!isRealNum(pr)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pr = parseFloat(pr);\r\n\r\n            //有价证券的清偿价值\r\n            var redemption = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(redemption)){\r\n                return redemption;\r\n            }\r\n\r\n            if(!isRealNum(redemption)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            redemption = parseFloat(redemption);\r\n\r\n            //年付息次数\r\n            var frequency = func_methods.getFirstValue(arguments[5]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 7){\r\n                basis = func_methods.getFirstValue(arguments[6]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(rate < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(pr <= 0 || redemption <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var num = window.luckysheet_function.COUPNUM.f(settlement, maturity, frequency, basis);\r\n\r\n            if(num > 1){\r\n                var a = 1;\r\n                var b = 0;\r\n                var yld = a;\r\n\r\n                for(var i = 1; i <= 100; i++){\r\n                    var price = window.luckysheet_function.PRICE.f(settlement, maturity, rate, yld, redemption, frequency, basis);\r\n\r\n                    if(Math.abs(price - pr) < 0.000001){\r\n                        break;\r\n                    }\r\n\r\n                    if(price > pr){\r\n                        b = yld;\r\n                    }\r\n                    else{\r\n                        a = yld;\r\n                    }\r\n\r\n                    yld = (a + b) / 2;\r\n                }\r\n\r\n                var result = yld;\r\n            }\r\n            else{\r\n                var DSR = window.luckysheet_function.COUPDAYSNC.f(settlement, maturity, frequency, basis);\r\n                var E = window.luckysheet_function.COUPDAYS.f(settlement, maturity, frequency, basis);\r\n                var A = window.luckysheet_function.COUPDAYBS.f(settlement, maturity, frequency, basis);\r\n\r\n                var T1 = redemption / 100 + rate / frequency;\r\n                var T2 = pr / 100 + (A / E) * (rate / frequency);\r\n                var T3 = frequency * E / DSR;\r\n\r\n                var result = ((T1 - T2) / T2) * T3;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"YIELDDISC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的价格\r\n            var pr = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pr)){\r\n                return pr;\r\n            }\r\n\r\n            if(!isRealNum(pr)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pr = parseFloat(pr);\r\n\r\n            //有价证券的清偿价值\r\n            var redemption = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(redemption)){\r\n                return redemption;\r\n            }\r\n\r\n            if(!isRealNum(redemption)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            redemption = parseFloat(redemption);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 5){\r\n                basis = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(pr <= 0 || redemption <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            var yearfrac = window.luckysheet_function.YEARFRAC.f(settlement, maturity, basis);\r\n\r\n            return (redemption / pr - 1) / yearfrac;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NOMINAL\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //每年的实际利率\r\n            var effect_rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(effect_rate)){\r\n                return effect_rate;\r\n            }\r\n\r\n            if(!isRealNum(effect_rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            effect_rate = parseFloat(effect_rate);\r\n\r\n            //每年的复利期数\r\n            var npery = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(npery)){\r\n                return npery;\r\n            }\r\n\r\n            if(!isRealNum(npery)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            npery = parseInt(npery);\r\n\r\n            if(effect_rate <= 0 || npery < 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return (Math.pow(effect_rate + 1, 1 / npery) - 1) * npery;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"XIRR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //投资相关收益或支出的数组或范围\r\n            var data_values = arguments[0];\r\n            var values = [];\r\n\r\n            if(getObjType(data_values) == \"array\"){\r\n                if(getObjType(data_values[0]) == \"array\" && !func_methods.isDyadicArr(data_values)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values = values.concat(func_methods.getDataArr(data_values, false));\r\n            }\r\n            else if(getObjType(data_values) == \"object\" && data_values.startCell != null){\r\n                values = values.concat(func_methods.getCellDataArr(data_values, \"number\", false));\r\n            }\r\n            else{\r\n                values.push(data_values);\r\n            }\r\n\r\n            var values_n = [];\r\n\r\n            for(var i = 0; i < values.length; i++){\r\n                var number = values[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values_n.push(parseFloat(number));\r\n            }\r\n\r\n            //与现金流数额参数中的现金流对应的日期数组或范围\r\n            var dates = func_methods.getCellrangeDate(arguments[1]);\r\n            if(valueIsError(dates)){\r\n                return dates;\r\n            }\r\n\r\n            for(var i = 0; i < dates.length; i++){\r\n                if(!dayjs(dates[i]).isValid()){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            //对内部回报率的估算值\r\n            var guess = 0.1;\r\n            if(arguments.length == 3){\r\n                guess = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(guess)){\r\n                    return guess;\r\n                }\r\n\r\n                if(!isRealNum(guess)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                guess = parseFloat(guess);\r\n            }\r\n\r\n            var positive = false;\r\n            var negative = false;\r\n            for (var i = 0; i < values_n.length; i++) {\r\n                if (values_n[i] > 0) {\r\n                    positive = true;\r\n                }\r\n\r\n                if (values_n[i] < 0) {\r\n                    negative = true;\r\n                }\r\n\r\n                if(positive && negative){\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(!positive || !negative){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(values_n.length != dates.length){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var irrResult = function(values, dates, rate) {\r\n                var r = rate + 1;\r\n                var result = values[0];\r\n\r\n                for (var i = 1; i < values.length; i++) {\r\n                    result += values[i] / Math.pow(r, window.luckysheet_function.DAYS.f(dates[i], dates[0]) / 365);\r\n                }\r\n\r\n                return result;\r\n            };\r\n\r\n            var irrResultDeriv = function(values, dates, rate) {\r\n                var r = rate + 1;\r\n                var result = 0;\r\n\r\n                for (var i = 1; i < values.length; i++) {\r\n                    var frac = window.luckysheet_function.DAYS.f(dates[i], dates[0]) / 365;\r\n                    result -= frac * values[i] / Math.pow(r, frac + 1);\r\n                }\r\n\r\n                return result;\r\n            };\r\n\r\n            var resultRate = guess;\r\n            var epsMax = 1e-10;\r\n\r\n            var newRate, epsRate, resultValue;\r\n            var contLoop = true;\r\n\r\n            do {\r\n                resultValue = irrResult(values_n, dates, resultRate);\r\n                newRate = resultRate - resultValue / irrResultDeriv(values_n, dates, resultRate);\r\n                epsRate = Math.abs(newRate - resultRate);\r\n                resultRate = newRate;\r\n                contLoop = (epsRate > epsMax) && (Math.abs(resultValue) > epsMax);\r\n            }\r\n            while (contLoop);\r\n\r\n            return resultRate;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MIRR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //投资相关收益或支出的数组或范围\r\n            var data_values = arguments[0];\r\n            var values = [];\r\n\r\n            if(getObjType(data_values) == \"array\"){\r\n                if(getObjType(data_values[0]) == \"array\" && !func_methods.isDyadicArr(data_values)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values = values.concat(func_methods.getDataArr(data_values, false));\r\n            }\r\n            else if(getObjType(data_values) == \"object\" && data_values.startCell != null){\r\n                values = values.concat(func_methods.getCellDataArr(data_values, \"number\", false));\r\n            }\r\n            else{\r\n                values.push(data_values);\r\n            }\r\n\r\n            var values_n = [];\r\n\r\n            for(var i = 0; i < values.length; i++){\r\n                var number = values[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values_n.push(parseFloat(number));\r\n            }\r\n\r\n            //现金流中使用的资金支付的利率\r\n            var finance_rate = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(finance_rate)){\r\n                return finance_rate;\r\n            }\r\n\r\n            if(!isRealNum(finance_rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            finance_rate = parseFloat(finance_rate);\r\n\r\n            //将现金流再投资的收益率\r\n            var reinvest_rate = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(reinvest_rate)){\r\n                return reinvest_rate;\r\n            }\r\n\r\n            if(!isRealNum(reinvest_rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            reinvest_rate = parseFloat(reinvest_rate);\r\n\r\n            //计算\r\n            var n = values_n.length;\r\n            var payments = [];\r\n            var incomes = [];\r\n\r\n            for (var i = 0; i < n; i++) {\r\n                if (values_n[i] < 0) {\r\n                    payments.push(values_n[i]);\r\n                }\r\n                else {\r\n                    incomes.push(values_n[i]);\r\n                }\r\n            }\r\n\r\n            if(payments.length == 0 || incomes.length == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            var num = -window.luckysheet_function.NPV.f(reinvest_rate, incomes) * Math.pow(1 + reinvest_rate, n - 1);\r\n            var den = window.luckysheet_function.NPV.f(finance_rate, payments) * (1 + finance_rate);\r\n\r\n            return Math.pow(num / den, 1 / (n - 1)) - 1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IRR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //投资相关收益或支出的数组或范围\r\n            var data_values = arguments[0];\r\n            var values = [];\r\n\r\n            if(getObjType(data_values) == \"array\"){\r\n                if(getObjType(data_values[0]) == \"array\" && !func_methods.isDyadicArr(data_values)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values = values.concat(func_methods.getDataArr(data_values, false));\r\n            }\r\n            else if(getObjType(data_values) == \"object\" && data_values.startCell != null){\r\n                values = values.concat(func_methods.getCellDataArr(data_values, \"number\", true));\r\n            }\r\n            else{\r\n                values.push(data_values);\r\n            }\r\n\r\n            var values_n = [];\r\n\r\n            for(var i = 0; i < values.length; i++){\r\n                var number = values[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values_n.push(parseFloat(number));\r\n            }\r\n\r\n            //对内部回报率的估算值\r\n            var guess = 0.1;\r\n            if(arguments.length == 2){\r\n                guess = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(guess)){\r\n                    return guess;\r\n                }\r\n\r\n                if(!isRealNum(guess)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                guess = parseFloat(guess);\r\n            }\r\n\r\n            var dates = [];\r\n            var positive = false;\r\n            var negative = false;\r\n\r\n            for (var i = 0; i < values.length; i++) {\r\n                dates[i] = (i === 0) ? 0 : dates[i - 1] + 365;\r\n\r\n                if (values[i] > 0) {\r\n                    positive = true;\r\n                }\r\n\r\n                if (values[i] < 0) {\r\n                    negative = true;\r\n                }\r\n            }\r\n\r\n            if(!positive || !negative){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var irrResult = function(values, dates, rate) {\r\n                var r = rate + 1;\r\n                var result = values[0];\r\n\r\n                for (var i = 1; i < values.length; i++) {\r\n                    // result += values[i] / Math.pow(r, window.luckysheet_function.DAYS.f(dates[i], dates[0]) / 365);\r\n                    result += values[i] / Math.pow(r, (dates[i] - dates[0]) / 365);\r\n                }\r\n\r\n                return result;\r\n            };\r\n\r\n            var irrResultDeriv = function(values, dates, rate) {\r\n                var r = rate + 1;\r\n                var result = 0;\r\n\r\n                for (var i = 1; i < values.length; i++) {\r\n                    // var frac = window.luckysheet_function.DAYS.f(dates[i], dates[0]) / 365;\r\n                    var frac = (dates[i] - dates[0]) / 365;\r\n                    result -= frac * values[i] / Math.pow(r, frac + 1);\r\n                }\r\n\r\n                return result;\r\n            };\r\n\r\n            var resultRate = guess;\r\n            var epsMax = 1e-10;\r\n\r\n            var newRate, epsRate, resultValue;\r\n            var contLoop = true;\r\n\r\n            do {\r\n                resultValue = irrResult(values_n, dates, resultRate);\r\n                newRate = resultRate - resultValue / irrResultDeriv(values_n, dates, resultRate);\r\n                epsRate = Math.abs(newRate - resultRate);\r\n                resultRate = newRate;\r\n                contLoop = (epsRate > epsMax) && (Math.abs(resultValue) > epsMax);\r\n            }\r\n            while (contLoop);\r\n\r\n            return resultRate;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NPV\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //某一期间的贴现率\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //支出（负值）和收益（正值）\r\n            var values = [];\r\n\r\n            for(var i = 1; i < arguments.length; i++){\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    values = values.concat(func_methods.getDataArr(data, true));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    values = values.concat(func_methods.getCellDataArr(data, \"number\", true));\r\n                }\r\n                else{\r\n                    values.push(data);\r\n                }\r\n            }\r\n\r\n            var values_n = [];\r\n\r\n            for(var i = 0; i < values.length; i++){\r\n                var number = values[i];\r\n\r\n                if(isRealNum(number)){\r\n                    values_n.push(parseFloat(number));\r\n                }\r\n            }\r\n\r\n            //计算\r\n            var result = 0;\r\n\r\n            if(values_n.length > 0){\r\n                for(var i = 0; i < values_n.length; i++){\r\n                    result += values_n[i] / Math.pow(1 + rate, i + 1);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"XNPV\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //应用于现金流的贴现率\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //与 dates 中的支付时间相对应的一系列现金流\r\n            var data_values = arguments[1];\r\n            var values = [];\r\n\r\n            if(getObjType(data_values) == \"array\"){\r\n                if(getObjType(data_values[0]) == \"array\" && !func_methods.isDyadicArr(data_values)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values = values.concat(func_methods.getDataArr(data_values, false));\r\n            }\r\n            else if(getObjType(data_values) == \"object\" && data_values.startCell != null){\r\n                values = values.concat(func_methods.getCellDataArr(data_values, \"number\", false));\r\n            }\r\n            else{\r\n                values.push(data_values);\r\n            }\r\n\r\n            var values_n = [];\r\n\r\n            for(var i = 0; i < values.length; i++){\r\n                var number = values[i];\r\n\r\n                if(!isRealNum(number)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                values_n.push(parseFloat(number));\r\n            }\r\n\r\n            //与现金流支付相对应的支付日期表\r\n            var dates = func_methods.getCellrangeDate(arguments[2]);\r\n            if(valueIsError(dates)){\r\n                return dates;\r\n            }\r\n\r\n            for(var i = 0; i < dates.length; i++){\r\n                if(!dayjs(dates[i]).isValid()){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            if(values_n.length != dates.length){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var result = 0;\r\n            for (var i = 0; i < values_n.length; i++) {\r\n                result += values_n[i] / Math.pow(1 + rate, window.luckysheet_function.DAYS.f(dates[i], dates[0]) / 365);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CUMIPMT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //利率\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //总付款期数\r\n            var nper = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //年金的现值\r\n            var pv = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //首期\r\n            var start_period = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(start_period)){\r\n                return start_period;\r\n            }\r\n\r\n            if(!isRealNum(start_period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            start_period = parseInt(start_period);\r\n\r\n            //末期\r\n            var end_period = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(end_period)){\r\n                return end_period;\r\n            }\r\n\r\n            if(!isRealNum(end_period)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            end_period = parseInt(end_period);\r\n\r\n            //指定各期的付款时间是在期初还是期末\r\n            var type = func_methods.getFirstValue(arguments[5]);\r\n            if(valueIsError(type)){\r\n                return type;\r\n            }\r\n\r\n            if(!isRealNum(type)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            type = parseFloat(type);\r\n\r\n            if(rate <= 0 || nper <= 0 || pv <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(start_period < 1 || end_period < 1 || start_period > end_period){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var payment = window.luckysheet_function.PMT.f(rate, nper, pv, 0, type);\r\n            var interest = 0;\r\n\r\n            if (start_period === 1) {\r\n                if (type === 0) {\r\n                    interest = -pv;\r\n                    start_period++;\r\n                }\r\n            }\r\n\r\n            for (var i = start_period; i <= end_period; i++) {\r\n                if (type === 1) {\r\n                    interest += window.luckysheet_function.FV.f(rate, i - 2, payment, pv, 1) - payment;\r\n                }\r\n                else {\r\n                    interest += window.luckysheet_function.FV.f(rate, i - 1, payment, pv, 0);\r\n                }\r\n            }\r\n\r\n            interest *= rate;\r\n\r\n            return interest;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PMT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //贷款利率\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //该项贷款的付款总数\r\n            var nper = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //现值\r\n            var pv = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //最后一次付款后希望得到的现金余额\r\n            var fv = 0;\r\n            if(arguments.length >= 4){\r\n                fv = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(fv)){\r\n                    return fv;\r\n                }\r\n\r\n                if(!isRealNum(fv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                fv = parseFloat(fv);\r\n            }\r\n\r\n            //指定各期的付款时间是在期初还是期末\r\n            var type = 0;\r\n            if(arguments.length == 5){\r\n                type = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var result;\r\n\r\n            if (rate === 0) {\r\n                result = (pv + fv) / nper;\r\n            }\r\n            else {\r\n                var term = Math.pow(1 + rate, nper);\r\n\r\n                if (type === 1) {\r\n                    result = (fv * rate / (term - 1) + pv * rate / (1 - 1 / term)) / (1 + rate);\r\n                }\r\n                else {\r\n                    result = fv * rate / (term - 1) + pv * rate / (1 - 1 / term);\r\n                }\r\n            }\r\n\r\n            return -result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IPMT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //利率\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //用于计算其利息数额的期数\r\n            var per = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(per)){\r\n                return per;\r\n            }\r\n\r\n            if(!isRealNum(per)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            per = parseFloat(per);\r\n\r\n            //总付款期数\r\n            var nper = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //现值\r\n            var pv = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //最后一次付款后希望得到的现金余额\r\n            var fv = 0;\r\n            if(arguments.length >= 5){\r\n                fv = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(fv)){\r\n                    return fv;\r\n                }\r\n\r\n                if(!isRealNum(fv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                fv = parseFloat(fv);\r\n            }\r\n\r\n            //指定各期的付款时间是在期初还是期末\r\n            var type = 0;\r\n            if(arguments.length >= 6){\r\n                type = func_methods.getFirstValue(arguments[5]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            if(per < 1 || per > nper){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var payment = window.luckysheet_function.PMT.f(rate, nper, pv, fv, type);\r\n            var interest;\r\n\r\n            if (per === 1) {\r\n                if (type === 1) {\r\n                    interest = 0;\r\n                }\r\n                else {\r\n                    interest = -pv;\r\n                }\r\n            }\r\n            else {\r\n                if (type === 1) {\r\n                    interest = window.luckysheet_function.FV.f(rate, per - 2, payment, pv, 1) - payment;\r\n                }\r\n                else {\r\n                    interest = window.luckysheet_function.FV.f(rate, per - 1, payment, pv, 0);\r\n                }\r\n            }\r\n\r\n            var result = interest * rate;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PPMT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //利率\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //用于计算其利息数额的期数\r\n            var per = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(per)){\r\n                return per;\r\n            }\r\n\r\n            if(!isRealNum(per)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            per = parseFloat(per);\r\n\r\n            //总付款期数\r\n            var nper = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(nper)){\r\n                return nper;\r\n            }\r\n\r\n            if(!isRealNum(nper)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            nper = parseFloat(nper);\r\n\r\n            //现值\r\n            var pv = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //最后一次付款后希望得到的现金余额\r\n            var fv = 0;\r\n            if(arguments.length >= 5){\r\n                fv = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(fv)){\r\n                    return fv;\r\n                }\r\n\r\n                if(!isRealNum(fv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                fv = parseFloat(fv);\r\n            }\r\n\r\n            //指定各期的付款时间是在期初还是期末\r\n            var type = 0;\r\n            if(arguments.length >= 6){\r\n                type = func_methods.getFirstValue(arguments[5]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            if(per < 1 || per > nper){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var payment = window.luckysheet_function.PMT.f(rate, nper, pv, fv, type);\r\n            var payment2 = window.luckysheet_function.IPMT.f(rate, per, nper, pv, fv, type);\r\n\r\n            return payment - payment2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"INTRATE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的投资额\r\n            var investment = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(investment)){\r\n                return investment;\r\n            }\r\n\r\n            if(!isRealNum(investment)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            investment = parseFloat(investment);\r\n\r\n            //有价证券到期时的兑换值\r\n            var redemption = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(redemption)){\r\n                return redemption;\r\n            }\r\n\r\n            if(!isRealNum(redemption)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            redemption = parseFloat(redemption);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 5){\r\n                basis = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(investment <= 0 || redemption <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var sd = dayjs(settlement).date();\r\n            var sm = dayjs(settlement).month() + 1;\r\n            var sy = dayjs(settlement).year();\r\n            var ed = dayjs(maturity).date();\r\n            var em = dayjs(maturity).month() + 1;\r\n            var ey = dayjs(maturity).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = 360 / ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(settlement, maturity) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        result = ylength / dayjs(maturity).diff(dayjs(settlement), 'days');\r\n                        result = ((redemption - investment) / investment) * result;\r\n\r\n                        return result;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    result = average / dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    result = 360 / dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    result = 365 / dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    result = 360 / ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n\r\n                    break;\r\n            }\r\n\r\n            result = ((redemption - investment) / investment) * result;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PRICE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的年息票利率\r\n            var rate = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //有价证券的年收益率\r\n            var yld = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(yld)){\r\n                return yld;\r\n            }\r\n\r\n            if(!isRealNum(yld)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            yld = parseFloat(yld);\r\n\r\n            //有价证券的清偿价值\r\n            var redemption = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(redemption)){\r\n                return redemption;\r\n            }\r\n\r\n            if(!isRealNum(redemption)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            redemption = parseFloat(redemption);\r\n\r\n            //年付息次数\r\n            var frequency = func_methods.getFirstValue(arguments[5]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 7){\r\n                basis = func_methods.getFirstValue(arguments[6]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(rate < 0 || yld < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(redemption <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var DSC = window.luckysheet_function.COUPDAYSNC.f(settlement, maturity, frequency, basis);\r\n            var E = window.luckysheet_function.COUPDAYS.f(settlement, maturity, frequency, basis);\r\n            var A = window.luckysheet_function.COUPDAYBS.f(settlement, maturity, frequency, basis);\r\n            var num = window.luckysheet_function.COUPNUM.f(settlement, maturity, frequency, basis);\r\n\r\n            if(num > 1){\r\n                var T1 = redemption / Math.pow(1 + yld / frequency, num - 1 + DSC / E);\r\n\r\n                var T2 = 0;\r\n                for(var i = 1; i <= num; i++){\r\n                    T2 += (100 * rate / frequency) / Math.pow(1 + yld / frequency, i - 1 + DSC / E);\r\n                }\r\n\r\n                var T3 = 100 * (rate / frequency) * (A / E);\r\n\r\n                var result = T1 + T2 - T3;\r\n            }\r\n            else{\r\n                var DSR = E - A;\r\n                var T1 = 100 * (rate / frequency) + redemption;\r\n                var T2 = (yld / frequency) * (DSR / E) + 1;\r\n                var T3 = 100 * (rate / frequency) * (A / E);\r\n\r\n                var result = T1 / T2 - T3;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PRICEDISC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的贴现率\r\n            var discount = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(discount)){\r\n                return discount;\r\n            }\r\n\r\n            if(!isRealNum(discount)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            discount = parseFloat(discount);\r\n\r\n            //有价证券的清偿价值\r\n            var redemption = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(redemption)){\r\n                return redemption;\r\n            }\r\n\r\n            if(!isRealNum(redemption)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            redemption = parseFloat(redemption);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 5){\r\n                basis = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(discount <= 0 || redemption <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var sd = dayjs(settlement).date();\r\n            var sm = dayjs(settlement).month() + 1;\r\n            var sy = dayjs(settlement).year();\r\n            var ed = dayjs(maturity).date();\r\n            var em = dayjs(maturity).month() + 1;\r\n            var ey = dayjs(maturity).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if (sd === 31 && ed === 31) {\r\n                        sd = 30;\r\n                        ed = 30;\r\n                    }\r\n                    else if (sd === 31) {\r\n                        sd = 30;\r\n                    }\r\n                    else if (sd === 30 && ed === 31) {\r\n                        ed = 30;\r\n                    }\r\n\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(settlement, maturity) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        result = dayjs(maturity).diff(dayjs(settlement), 'days') / ylength;\r\n                        result = redemption - discount * redemption * result;\r\n\r\n                        return result;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    result = dayjs(maturity).diff(dayjs(settlement), 'days') / average;\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    result = dayjs(maturity).diff(dayjs(settlement), 'days') / 360;\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    result = dayjs(maturity).diff(dayjs(settlement), 'days') / 365;\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    result = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360)) / 360;\r\n\r\n                    break;\r\n            }\r\n\r\n            result = redemption - discount * redemption * result;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PRICEMAT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //发行日\r\n            var issue = func_methods.getCellDate(arguments[2]);\r\n            if(valueIsError(issue)){\r\n                return issue;\r\n            }\r\n\r\n            if(!dayjs(issue).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券在发行日的利率\r\n            var rate = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //有价证券的年收益率\r\n            var yld = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(yld)){\r\n                return yld;\r\n            }\r\n\r\n            if(!isRealNum(yld)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            yld = parseFloat(yld);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 6){\r\n                basis = func_methods.getFirstValue(arguments[5]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(rate < 0 || yld < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var sd = dayjs(settlement).date();\r\n            var sm = dayjs(settlement).month() + 1;\r\n            var sy = dayjs(settlement).year();\r\n            var ed = dayjs(maturity).date();\r\n            var em = dayjs(maturity).month() + 1;\r\n            var ey = dayjs(maturity).year();\r\n            var td = dayjs(issue).date();\r\n            var tm = dayjs(issue).month() + 1;\r\n            var ty = dayjs(issue).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if(sd == 31){\r\n                        sd = 30;\r\n                    }\r\n\r\n                    if(ed == 31){\r\n                        ed = 30;\r\n                    }\r\n\r\n                    if(td == 31){\r\n                        td = 30;\r\n                    }\r\n\r\n                    var B = 360;\r\n                    var DSM = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n                    var DIM = ((ed + em * 30 + ey * 360) - (td + tm * 30 + ty * 360));\r\n                    var A = ((sd + sm * 30 + sy * 360) - (td + tm * 30 + ty * 360));\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(settlement, maturity) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        var B = ylength;\r\n                        var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n                        var DIM = dayjs(settlement).diff(dayjs(issue), 'days');\r\n                        var A = dayjs(maturity).diff(dayjs(issue), 'days');\r\n\r\n                        result = (100 + (DIM / B * rate * 100)) / (1 + DSM / B * yld) - (A / B * rate * 100);\r\n\r\n                        return result;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    var B = average;\r\n                    var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n                    var DIM = dayjs(settlement).diff(dayjs(issue), 'days');\r\n                    var A = dayjs(maturity).diff(dayjs(issue), 'days');\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    var B = 360;\r\n                    var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n                    var DIM = dayjs(settlement).diff(dayjs(issue), 'days');\r\n                    var A = dayjs(maturity).diff(dayjs(issue), 'days');\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    var B = 365;\r\n                    var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n                    var DIM = dayjs(settlement).diff(dayjs(issue), 'days');\r\n                    var A = dayjs(maturity).diff(dayjs(issue), 'days');\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    var B = 360;\r\n                    var DSM = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n                    var DIM = ((ed + em * 30 + ey * 360) - (td + tm * 30 + ty * 360));\r\n                    var A = ((sd + sm * 30 + sy * 360) - (td + tm * 30 + ty * 360));\r\n\r\n                    break;\r\n            }\r\n\r\n            result = (100 + (DIM / B * rate * 100)) / (1 + (DSM / B * yld)) - (A / B * rate * 100);\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RECEIVED\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的投资额\r\n            var investment = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(investment)){\r\n                return investment;\r\n            }\r\n\r\n            if(!isRealNum(investment)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            investment = parseFloat(investment);\r\n\r\n            //有价证券的贴现率\r\n            var discount = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(discount)){\r\n                return discount;\r\n            }\r\n\r\n            if(!isRealNum(discount)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            discount = parseFloat(discount);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 5){\r\n                basis = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseFloat(basis);\r\n            }\r\n\r\n            if(investment <= 0 || discount <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var sd = dayjs(settlement).date();\r\n            var sm = dayjs(settlement).month() + 1;\r\n            var sy = dayjs(settlement).year();\r\n            var ed = dayjs(maturity).date();\r\n            var em = dayjs(maturity).month() + 1;\r\n            var ey = dayjs(maturity).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if(sd == 31){\r\n                        sd = 30;\r\n                    }\r\n\r\n                    if(ed == 31){\r\n                        ed = 30;\r\n                    }\r\n\r\n                    var B = 360;\r\n                    var DIM = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(settlement, maturity) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        var B = ylength;\r\n                        var DIM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                        result = investment / (1 - discount * DIM / B);\r\n\r\n                        return result;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, 'date': 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    var B = average;\r\n                    var DIM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    var B = 360;\r\n                    var DIM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    var B = 365;\r\n                    var DIM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    var B = 360;\r\n                    var DIM = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n\r\n                    break;\r\n            }\r\n\r\n            result = investment / (1 - discount * DIM / B);\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DISC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的价格\r\n            var pr = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pr)){\r\n                return pr;\r\n            }\r\n\r\n            if(!isRealNum(pr)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pr = parseFloat(pr);\r\n\r\n            //有价证券的清偿价值\r\n            var redemption = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(redemption)){\r\n                return redemption;\r\n            }\r\n\r\n            if(!isRealNum(redemption)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            redemption = parseFloat(redemption);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 5){\r\n                basis = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseFloat(basis);\r\n            }\r\n\r\n            if(pr <= 0 || redemption <= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var sd = dayjs(settlement).date();\r\n            var sm = dayjs(settlement).month() + 1;\r\n            var sy = dayjs(settlement).year();\r\n            var ed = dayjs(maturity).date();\r\n            var em = dayjs(maturity).month() + 1;\r\n            var ey = dayjs(maturity).year();\r\n\r\n            var result;\r\n            switch (basis) {\r\n                case 0: // US (NASD) 30/360\r\n                    if(sd == 31){\r\n                        sd = 30;\r\n                    }\r\n\r\n                    if(ed == 31){\r\n                        ed = 30;\r\n                    }\r\n\r\n                    var B = 360;\r\n                    var DSM = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n\r\n                    break;\r\n                case 1: // Actual/actual\r\n                    var ylength = 365;\r\n                    if (sy === ey || ((sy + 1) === ey) && ((sm > em) || ((sm === em) && (sd >= ed)))) {\r\n                        if ((sy === ey && func_methods.isLeapYear(sy)) || func_methods.feb29Between(settlement, maturity) || (em === 1 && ed === 29)) {\r\n                            ylength = 366;\r\n                        }\r\n\r\n                        var B = ylength;\r\n                        var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                        result = ((redemption - pr) / redemption) * (B / DSM);\r\n\r\n                        return result;\r\n                    }\r\n\r\n                    var years = (ey - sy) + 1;\r\n                    var days = (dayjs().set({ 'year': ey + 1, 'month': 0, 'date': 1 }) - dayjs().set({ 'year': sy, 'month': 0, \"date\": 1 })) / 1000 / 60 / 60 / 24;\r\n                    var average = days / years;\r\n\r\n                    var B = average;\r\n                    var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 2: // Actual/360\r\n                    var B = 360;\r\n                    var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 3: // Actual/365\r\n                    var B = 365;\r\n                    var DSM = dayjs(maturity).diff(dayjs(settlement), 'days');\r\n\r\n                    break;\r\n                case 4: // European 30/360\r\n                    var B = 360;\r\n                    var DSM = ((ed + em * 30 + ey * 360) - (sd + sm * 30 + sy * 360));\r\n\r\n                    break;\r\n            }\r\n\r\n            result = ((redemption - pr) / redemption) * (B / DSM);\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NPER\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //利率\r\n            var rate = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rate)){\r\n                return rate;\r\n            }\r\n\r\n            if(!isRealNum(rate)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rate = parseFloat(rate);\r\n\r\n            //各期所应支付的金额\r\n            var pmt = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(pmt)){\r\n                return pmt;\r\n            }\r\n\r\n            if(!isRealNum(pmt)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pmt = parseFloat(pmt);\r\n\r\n            //现值\r\n            var pv = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(pv)){\r\n                return pv;\r\n            }\r\n\r\n            if(!isRealNum(pv)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            pv = parseFloat(pv);\r\n\r\n            //最后一次付款后希望得到的现金余额\r\n            var fv = 0;\r\n            if(arguments.length >= 4){\r\n                fv = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(fv)){\r\n                    return fv;\r\n                }\r\n\r\n                if(!isRealNum(fv)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                fv = parseFloat(fv);\r\n            }\r\n\r\n            //指定各期的付款时间是在期初还是期末\r\n            var type = 0;\r\n            if(arguments.length >= 5){\r\n                type = func_methods.getFirstValue(arguments[4]);\r\n                if(valueIsError(type)){\r\n                    return type;\r\n                }\r\n\r\n                if(!isRealNum(type)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                type = parseFloat(type);\r\n            }\r\n\r\n            if(type != 0 && type != 1){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var num = pmt * (1 + rate * type) - fv * rate;\r\n            var den = (pv * rate + pmt * (1 + rate * type));\r\n\r\n            return Math.log(num / den) / Math.log(1 + rate);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SLN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //资产原值\r\n            var cost = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(cost)){\r\n                return cost;\r\n            }\r\n\r\n            if(!isRealNum(cost)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            cost = parseFloat(cost);\r\n\r\n            //资产残值\r\n            var salvage = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(salvage)){\r\n                return salvage;\r\n            }\r\n\r\n            if(!isRealNum(salvage)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            salvage = parseFloat(salvage);\r\n\r\n            //资产的折旧期数\r\n            var life = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(life)){\r\n                return life;\r\n            }\r\n\r\n            if(!isRealNum(life)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            life = parseFloat(life);\r\n\r\n            if(life == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return (cost - salvage) / life;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DURATION\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的年息票利率\r\n            var coupon = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(coupon)){\r\n                return coupon;\r\n            }\r\n\r\n            if(!isRealNum(coupon)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            coupon = parseFloat(coupon);\r\n\r\n            //有价证券的年收益率\r\n            var yld = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(yld)){\r\n                return yld;\r\n            }\r\n\r\n            if(!isRealNum(yld)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            yld = parseFloat(yld);\r\n\r\n            //年付息次数\r\n            var frequency = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 6){\r\n                basis = func_methods.getFirstValue(arguments[5]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(coupon < 0 || yld < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            var nper = window.luckysheet_function.COUPNUM.f(settlement, maturity, frequency, basis);\r\n\r\n            var sum1 = 0;\r\n            var sum2 = 0;\r\n            for(var i = 1; i <= nper; i++){\r\n                sum1 += 100 * (coupon / frequency) * i / Math.pow(1 + (yld / frequency), i);\r\n                sum2 += 100 * (coupon / frequency) / Math.pow(1 + (yld / frequency), i);\r\n            }\r\n\r\n            var result = (sum1 + 100 * nper / Math.pow(1 + (yld / frequency), nper)) / (sum2 + 100 / Math.pow(1 + (yld / frequency), nper));\r\n            result = result / frequency;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MDURATION\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //结算日\r\n            var settlement = func_methods.getCellDate(arguments[0]);\r\n            if(valueIsError(settlement)){\r\n                return settlement;\r\n            }\r\n\r\n            if(!dayjs(settlement).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //到期日\r\n            var maturity = func_methods.getCellDate(arguments[1]);\r\n            if(valueIsError(maturity)){\r\n                return maturity;\r\n            }\r\n\r\n            if(!dayjs(maturity).isValid()){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //有价证券的年息票利率\r\n            var coupon = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(coupon)){\r\n                return coupon;\r\n            }\r\n\r\n            if(!isRealNum(coupon)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            coupon = parseFloat(coupon);\r\n\r\n            //有价证券的年收益率\r\n            var yld = func_methods.getFirstValue(arguments[3]);\r\n            if(valueIsError(yld)){\r\n                return yld;\r\n            }\r\n\r\n            if(!isRealNum(yld)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            yld = parseFloat(yld);\r\n\r\n            //年付息次数\r\n            var frequency = func_methods.getFirstValue(arguments[4]);\r\n            if(valueIsError(frequency)){\r\n                return frequency;\r\n            }\r\n\r\n            if(!isRealNum(frequency)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            frequency = parseInt(frequency);\r\n\r\n            //日计数基准类型\r\n            var basis = 0;\r\n            if(arguments.length == 6){\r\n                basis = func_methods.getFirstValue(arguments[5]);\r\n                if(valueIsError(basis)){\r\n                    return basis;\r\n                }\r\n\r\n                if(!isRealNum(basis)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                basis = parseInt(basis);\r\n            }\r\n\r\n            if(coupon < 0 || yld < 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(frequency != 1 && frequency != 2 && frequency != 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(basis < 0 || basis > 4){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if(dayjs(settlement) - dayjs(maturity) >= 0){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            var duration = window.luckysheet_function.DURATION.f(settlement, maturity, coupon, yld, frequency, basis);\r\n\r\n            return duration / (1 + yld / frequency);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BIN2DEC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //二进制数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!/^[01]{1,10}$/g.test(number)){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var result = parseInt(number, 2);\r\n            var stringified = number.toString();\r\n\r\n            if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\r\n                return parseInt(stringified.substring(1), 2) - 512;\r\n            }\r\n            else {\r\n                return result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BIN2HEX\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //二进制数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            //有效位数\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if(!/^[01]{1,10}$/g.test(number)){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var result = parseInt(number, 2).toString(16).toUpperCase();\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BIN2OCT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //二进制数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            //有效位数\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if(!/^[01]{1,10}$/g.test(number)){\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var stringified = number.toString();\r\n            if (stringified.length === 10 && stringified.substring(0, 1) === '1') {\r\n                return (1073741312 + parseInt(stringified.substring(1), 2)).toString(8);\r\n            }\r\n\r\n            var result = parseInt(number, 2).toString(8);\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DEC2BIN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //十进制数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //有效位数\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^-?[0-9]{1,3}$/.test(number) || number < -512 || number > 511) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            if (number < 0) {\r\n                return '1' + new Array(9 - (512 + number).toString(2).length).join('0') + (512 + number).toString(2);\r\n            }\r\n\r\n            var result = parseInt(number, 10).toString(2);\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DEC2HEX\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //十进制数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //有效位数\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^-?[0-9]{1,12}$/.test(number) || number < -549755813888 || number > 549755813887) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            if (number < 0) {\r\n                return (1099511627776 + number).toString(16).toUpperCase();\r\n            }\r\n\r\n            var result = parseInt(number, 10).toString(16).toUpperCase();\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DEC2OCT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //十进制数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //有效位数\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^-?[0-9]{1,9}$/.test(number) || number < -536870912 || number > 536870911) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            if (number < 0) {\r\n                return (1073741824 + number).toString(8);\r\n            }\r\n\r\n            var result = parseInt(number, 10).toString(8);\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HEX2BIN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //十六进制数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            //有效位数\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var negative = (number.length === 10 && number.substring(0, 1).toLowerCase() === 'f') ? true : false;\r\n\r\n            var decimal = (negative) ? parseInt(number, 16) - 1099511627776 : parseInt(number, 16);\r\n\r\n            if (decimal < -512 || decimal > 511) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if (negative) {\r\n                return '1' + new Array(9 - (512 + decimal).toString(2).length).join('0') + (512 + decimal).toString(2);\r\n            }\r\n\r\n            var result = decimal.toString(2);\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HEX2DEC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //十六进制数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var decimal = parseInt(number, 16);\r\n\r\n            return (decimal >= 549755813888) ? decimal - 1099511627776 : decimal;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"HEX2OCT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //十六进制数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            //有效位数\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^[0-9A-Fa-f]{1,10}$/.test(number)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var decimal = parseInt(number, 16);\r\n\r\n            if (decimal > 536870911 && decimal < 1098974756864) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            if (decimal >= 1098974756864) {\r\n                return (decimal - 1098437885952).toString(8);\r\n            }\r\n\r\n            var result = decimal.toString(8);\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"OCT2BIN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //八进制数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            //有效位数\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^[0-7]{1,10}$/.test(number)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            number = number.toString();\r\n\r\n            var negative = (number.length === 10 && number.substring(0, 1) === '7') ? true : false;\r\n\r\n            var decimal = (negative) ? parseInt(number, 8) - 1073741824 : parseInt(number, 8);\r\n\r\n            if (decimal < -512 || decimal > 511) {\r\n                return error.num;\r\n            }\r\n\r\n            if (negative) {\r\n                return '1' + new Array(9 - (512 + decimal).toString(2).length).join('0') + (512 + decimal).toString(2);\r\n            }\r\n\r\n            var result = decimal.toString(2);\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"OCT2DEC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //八进制数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if (!/^[0-7]{1,10}$/.test(number)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var decimal = parseInt(number, 8);\r\n\r\n            return (decimal >= 536870912) ? decimal - 1073741824 : decimal;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"OCT2HEX\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //八进制数\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            //有效位数\r\n            var places = null;\r\n            if(arguments.length == 2){\r\n                places = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(places)){\r\n                    return places;\r\n                }\r\n\r\n                if(!isRealNum(places)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                places = parseInt(places);\r\n            }\r\n\r\n            if (!/^[0-7]{1,10}$/.test(number)) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            //计算\r\n            var decimal = parseInt(number, 8);\r\n\r\n            if (decimal >= 536870912) {\r\n                return 'FF' + (decimal + 3221225472).toString(16).toUpperCase();\r\n            }\r\n\r\n            var result = decimal.toString(16).toUpperCase();\r\n\r\n            if (places == null) {\r\n                return result;\r\n            }\r\n            else {\r\n                if(places < 0 || places < result.length){\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                return new Array(places - result.length + 1).join('0') + result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COMPLEX\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //复数的实系数\r\n            var real_num = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(real_num)){\r\n                return real_num;\r\n            }\r\n\r\n            if(!isRealNum(real_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            real_num = parseFloat(real_num);\r\n\r\n            //复数的虚系数\r\n            var i_num = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(i_num)){\r\n                return i_num;\r\n            }\r\n\r\n            if(!isRealNum(i_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            i_num = parseFloat(i_num);\r\n\r\n            //复数中虚系数的后缀\r\n            var suffix = \"i\";\r\n            if(arguments.length == 3){\r\n                suffix = arguments[2].toString();\r\n            }\r\n\r\n            if(suffix != \"i\" && suffix != \"j\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            if (real_num === 0 && i_num === 0) {\r\n                return 0;\r\n            }\r\n            else if (real_num === 0) {\r\n                return (i_num === 1) ? suffix : i_num.toString() + suffix;\r\n            }\r\n            else if (i_num === 0) {\r\n                return real_num.toString();\r\n            }\r\n            else {\r\n                var sign = (i_num > 0) ? '+' : '';\r\n                return real_num.toString() + sign + ((i_num === 1) ? suffix : i_num.toString() + suffix);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMREAL\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //复数\r\n            var inumber = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(inumber)){\r\n                return inumber;\r\n            }\r\n\r\n            inumber = inumber.toString();\r\n\r\n            if(inumber.toLowerCase() == \"true\" || inumber.toLowerCase() == \"false\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            if(inumber == \"0\"){\r\n                return 0;\r\n            }\r\n\r\n            if(['i', '+i', '1i', '+1i', '-i', '-1i', 'j', '+j', '1j', '+1j', '-j', '-1j'].indexOf(inumber) >= 0){\r\n                return 0;\r\n            }\r\n\r\n            var plus = inumber.indexOf('+');\r\n            var minus = inumber.indexOf('-');\r\n\r\n            if (plus === 0) {\r\n                plus = inumber.indexOf('+', 1);\r\n            }\r\n\r\n            if (minus === 0) {\r\n                minus = inumber.indexOf('-', 1);\r\n            }\r\n\r\n            var last = inumber.substring(inumber.length - 1, inumber.length);\r\n            var unit = (last === 'i' || last === 'j');\r\n\r\n            if (plus >= 0 || minus >= 0) {\r\n                if (!unit) {\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                if (plus >= 0) {\r\n                    return (isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))) ? formula.error.nm : Number(inumber.substring(0, plus));\r\n                }\r\n                else {\r\n                    return (isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))) ? formula.error.nm : Number(inumber.substring(0, minus));\r\n                }\r\n            }\r\n            else {\r\n                if (unit) {\r\n                    return (isNaN(inumber.substring(0, inumber.length - 1))) ? formula.error.nm : 0;\r\n                }\r\n                else {\r\n                    return (isNaN(inumber)) ? formula.error.nm : inumber;\r\n                }\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMAGINARY\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //复数\r\n            var inumber = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(inumber)){\r\n                return inumber;\r\n            }\r\n\r\n            inumber = inumber.toString();\r\n\r\n            if(inumber.toLowerCase() == \"true\" || inumber.toLowerCase() == \"false\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            if(inumber == \"0\"){\r\n                return 0;\r\n            }\r\n\r\n            if (['i', 'j'].indexOf(inumber) >= 0) {\r\n                return 1;\r\n            }\r\n\r\n            inumber = inumber.replace('+i', '+1i').replace('-i', '-1i').replace('+j', '+1j').replace('-j', '-1j');\r\n\r\n            var plus = inumber.indexOf('+');\r\n            var minus = inumber.indexOf('-');\r\n\r\n            if (plus === 0) {\r\n                plus = inumber.indexOf('+', 1);\r\n            }\r\n\r\n            if (minus === 0) {\r\n                minus = inumber.indexOf('-', 1);\r\n            }\r\n\r\n            var last = inumber.substring(inumber.length - 1, inumber.length);\r\n            var unit = (last === 'i' || last === 'j');\r\n\r\n            if (plus >= 0 || minus >= 0) {\r\n                if (!unit) {\r\n                    return formula.error.nm;\r\n                }\r\n\r\n                if (plus >= 0) {\r\n                    return (isNaN(inumber.substring(0, plus)) || isNaN(inumber.substring(plus + 1, inumber.length - 1))) ? formula.error.nm : Number(inumber.substring(plus + 1, inumber.length - 1));\r\n                }\r\n                else {\r\n                    return (isNaN(inumber.substring(0, minus)) || isNaN(inumber.substring(minus + 1, inumber.length - 1))) ? formula.error.nm : -Number(inumber.substring(minus + 1, inumber.length - 1));\r\n                }\r\n            }\r\n            else {\r\n                if (unit) {\r\n                    return (isNaN(inumber.substring(0, inumber.length - 1))) ? formula.error.nm : inumber.substring(0, inumber.length - 1);\r\n                }\r\n                else {\r\n                    return (isNaN(inumber)) ? formula.error.nm : 0;\r\n                }\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMCONJUGATE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //复数\r\n            var inumber = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(inumber)){\r\n                return inumber;\r\n            }\r\n\r\n            inumber = inumber.toString();\r\n\r\n            var x = window.luckysheet_function.IMREAL.f(inumber);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            var y = window.luckysheet_function.IMAGINARY.f(inumber);\r\n            if(valueIsError(y)){\r\n                return y;\r\n            }\r\n\r\n            var unit = inumber.substring(inumber.length - 1);\r\n            unit = (unit === 'i' || unit === 'j') ? unit : 'i';\r\n\r\n            return (y !== 0) ? window.luckysheet_function.COMPLEX.f(x, -y, unit) : inumber;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMABS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var x = window.luckysheet_function.IMREAL.f(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            var y = window.luckysheet_function.IMAGINARY.f(arguments[0]);\r\n            if(valueIsError(y)){\r\n                return y;\r\n            }\r\n\r\n            return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DELTA\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //第一个数字\r\n            var number1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number1)){\r\n                return number1;\r\n            }\r\n\r\n            if(!isRealNum(number1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number1 = parseFloat(number1);\r\n\r\n            //第二个数字\r\n            var number2 = 0;\r\n            if(arguments.length == 2){\r\n                number2 = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(number2)){\r\n                    return number2;\r\n                }\r\n\r\n                if(!isRealNum(number2)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                number2 = parseFloat(number2);\r\n            }\r\n\r\n            return (number1 === number2) ? 1 : 0;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMSUM\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var x = window.luckysheet_function.IMREAL.f(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            var y = window.luckysheet_function.IMAGINARY.f(arguments[0]);\r\n            if(valueIsError(y)){\r\n                return y;\r\n            }\r\n\r\n            var result = arguments[0];\r\n\r\n            for(var i = 1; i < arguments.length; i++){\r\n                var a = window.luckysheet_function.IMREAL.f(result);\r\n                if(valueIsError(a)){\r\n                    return a;\r\n                }\r\n\r\n                var b = window.luckysheet_function.IMAGINARY.f(result);\r\n                if(valueIsError(b)){\r\n                    return b;\r\n                }\r\n\r\n                var c = window.luckysheet_function.IMREAL.f(arguments[i]);\r\n                if(valueIsError(c)){\r\n                    return c;\r\n                }\r\n\r\n                var d = window.luckysheet_function.IMAGINARY.f(arguments[i]);\r\n                if(valueIsError(d)){\r\n                    return d;\r\n                }\r\n\r\n                result = window.luckysheet_function.COMPLEX.f(a + c, b + d);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMSUB\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //inumber1\r\n            var inumber1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(inumber1)){\r\n                return inumber1;\r\n            }\r\n\r\n            inumber1 = inumber1.toString();\r\n\r\n            if(inumber1.toLowerCase() == \"true\" || inumber1.toLowerCase() == \"false\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var a = window.luckysheet_function.IMREAL.f(inumber1);\r\n            if(valueIsError(a)){\r\n                return a;\r\n            }\r\n\r\n            var b = window.luckysheet_function.IMAGINARY.f(inumber1);\r\n            if(valueIsError(b)){\r\n                return b;\r\n            }\r\n\r\n            //inumber2\r\n            var inumber2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(inumber2)){\r\n                return inumber2;\r\n            }\r\n\r\n            inumber2 = inumber2.toString();\r\n\r\n            if(inumber2.toLowerCase() == \"true\" || inumber2.toLowerCase() == \"false\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var c = window.luckysheet_function.IMREAL.f(inumber2);\r\n            if(valueIsError(c)){\r\n                return c;\r\n            }\r\n\r\n            var d = window.luckysheet_function.IMAGINARY.f(inumber2);\r\n            if(valueIsError(d)){\r\n                return d;\r\n            }\r\n\r\n            //计算\r\n            var unit1 = inumber1.substring(inumber1.length - 1);\r\n            var unit2 = inumber2.substring(inumber2.length - 1);\r\n\r\n            var unit = 'i';\r\n\r\n            if (unit1 === 'j') {\r\n                unit = 'j';\r\n            }\r\n            else if (unit2 === 'j') {\r\n                unit = 'j';\r\n            }\r\n\r\n            return window.luckysheet_function.COMPLEX.f(a - c, b - d, unit);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMPRODUCT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var x = window.luckysheet_function.IMREAL.f(arguments[0]);\r\n            if(valueIsError(x)){\r\n                return x;\r\n            }\r\n\r\n            var y = window.luckysheet_function.IMAGINARY.f(arguments[0]);\r\n            if(valueIsError(y)){\r\n                return y;\r\n            }\r\n\r\n            var result = arguments[0];\r\n\r\n            for(var i = 1; i < arguments.length; i++){\r\n                var a = window.luckysheet_function.IMREAL.f(result);\r\n                if(valueIsError(a)){\r\n                    return a;\r\n                }\r\n\r\n                var b = window.luckysheet_function.IMAGINARY.f(result);\r\n                if(valueIsError(b)){\r\n                    return b;\r\n                }\r\n\r\n                var c = window.luckysheet_function.IMREAL.f(arguments[i]);\r\n                if(valueIsError(c)){\r\n                    return c;\r\n                }\r\n\r\n                var d = window.luckysheet_function.IMAGINARY.f(arguments[i]);\r\n                if(valueIsError(d)){\r\n                    return d;\r\n                }\r\n\r\n                result = window.luckysheet_function.COMPLEX.f(a * c - b * d, a * d + b * c);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IMDIV\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //inumber1\r\n            var inumber1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(inumber1)){\r\n                return inumber1;\r\n            }\r\n\r\n            inumber1 = inumber1.toString();\r\n\r\n            if(inumber1.toLowerCase() == \"true\" || inumber1.toLowerCase() == \"false\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var a = window.luckysheet_function.IMREAL.f(inumber1);\r\n            if(valueIsError(a)){\r\n                return a;\r\n            }\r\n\r\n            var b = window.luckysheet_function.IMAGINARY.f(inumber1);\r\n            if(valueIsError(b)){\r\n                return b;\r\n            }\r\n\r\n            //inumber2\r\n            var inumber2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(inumber2)){\r\n                return inumber2;\r\n            }\r\n\r\n            inumber2 = inumber2.toString();\r\n\r\n            if(inumber2.toLowerCase() == \"true\" || inumber2.toLowerCase() == \"false\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var c = window.luckysheet_function.IMREAL.f(inumber2);\r\n            if(valueIsError(c)){\r\n                return c;\r\n            }\r\n\r\n            var d = window.luckysheet_function.IMAGINARY.f(inumber2);\r\n            if(valueIsError(d)){\r\n                return d;\r\n            }\r\n\r\n            //计算\r\n            var unit1 = inumber1.substring(inumber1.length - 1);\r\n            var unit2 = inumber2.substring(inumber2.length - 1);\r\n\r\n            var unit = 'i';\r\n\r\n            if (unit1 === 'j') {\r\n                unit = 'j';\r\n            }\r\n            else if (unit2 === 'j') {\r\n                unit = 'j';\r\n            }\r\n\r\n            if (c === 0 && d === 0) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            var den = c * c + d * d;\r\n\r\n            return window.luckysheet_function.COMPLEX.f((a * c + b * d) / den, (b * c - a * d) / den, unit);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NOT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //logical\r\n            var logical = func_methods.getCellBoolen(arguments[0]);\r\n\r\n            if(valueIsError(logical)){\r\n                return logical;\r\n            }\r\n\r\n            return !logical;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TRUE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return true;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FALSE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return false;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AND\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var result = true;\r\n\r\n            for(var i = 0; i < arguments.length; i++){\r\n                var logical = func_methods.getCellBoolen(arguments[i]);\r\n\r\n                if(valueIsError(logical)){\r\n                    return logical;\r\n                }\r\n\r\n                if(!logical){\r\n                    result = false;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IFERROR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var value_if_error = func_methods.getFirstValue(arguments[1], \"text\");\r\n\r\n            var value = func_methods.getFirstValue(arguments[0], \"text\");\r\n            // (getObjType(value) === 'string' && $.trim(value) === ''It means that the cell associated with IFERROR has been deleted by keyboard\r\n            if(valueIsError(value) || (getObjType(value) === 'string' && $.trim(value) === '' )){\r\n                return value_if_error;\r\n            }\r\n\r\n            return value;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"IF\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要测试的条件\r\n            var logical_test = func_methods.getCellBoolen(arguments[0]);\r\n            if(valueIsError(logical_test)){\r\n                return logical_test;\r\n            }\r\n\r\n            //结果为 TRUE\r\n            var value_if_true = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(value_if_true) && value_if_true!=error.d){\r\n                return value_if_true;\r\n            }\r\n\r\n            //结果为 FALSE\r\n            var value_if_false = \"\";\r\n            if(arguments.length == 3){\r\n                value_if_false = func_methods.getFirstValue(arguments[2], \"text\");\r\n                if(valueIsError(value_if_false) && value_if_false!=error.d){\r\n                    return value_if_false;\r\n                }\r\n            }\r\n\r\n            if(logical_test){\r\n                return value_if_true;\r\n            }\r\n            else{\r\n                return value_if_false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"OR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var result = false;\r\n\r\n            for(var i = 0; i < arguments.length; i++){\r\n                var logical = func_methods.getCellBoolen(arguments[i]);\r\n\r\n                if(valueIsError(logical)){\r\n                    return logical;\r\n                }\r\n\r\n                if(logical){\r\n                    result = true;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            return value1 != value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EQ\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            return value1 == value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 > value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GTE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 >= value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 < value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LTE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 <= value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ADD\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 + value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MINUS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 - value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MULTIPLY\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            return value1 * value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DIVIDE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            if(!isRealNum(value1)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value1 = parseFloat(value1);\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            if(!isRealNum(value2)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value2 = parseFloat(value2);\r\n\r\n            if(value2 == 0){\r\n                return formula.error.d;\r\n            }\r\n\r\n            return value1 / value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CONCAT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //value1\r\n            var value1 = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(value1)){\r\n                return value1;\r\n            }\r\n\r\n            //value2\r\n            var value2 = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(value2)){\r\n                return value2;\r\n            }\r\n\r\n            return value1 + \"\" + value2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"UNARY_PERCENT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要作为百分比解释的数值\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            var result = number / 100;\r\n\r\n            return Math.round(result * 100) / 100;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CONCATENATE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var result = \"\";\r\n\r\n            for(var i = 0; i < arguments.length; i++){\r\n                var text = func_methods.getFirstValue(arguments[i], \"text\");\r\n                if(valueIsError(text)){\r\n                    return text;\r\n                }\r\n\r\n                result = result + \"\" + text;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CODE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            if(text == \"\"){\r\n                return formula.error.v;\r\n            }\r\n\r\n            return text.charCodeAt(0);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CHAR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数字\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            if(number < 1 || number > 255){\r\n                return formula.error.v;\r\n            }\r\n\r\n            return String.fromCharCode(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ARABIC\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString().toUpperCase();\r\n\r\n            if (!/^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/.test(text)) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var r = 0;\r\n            text.replace(/[MDLV]|C[MD]?|X[CL]?|I[XV]?/g, function(i) {\r\n                r += {\r\n                    M: 1000,\r\n                    CM: 900,\r\n                    D: 500,\r\n                    CD: 400,\r\n                    C: 100,\r\n                    XC: 90,\r\n                    L: 50,\r\n                    XL: 40,\r\n                    X: 10,\r\n                    IX: 9,\r\n                    V: 5,\r\n                    IV: 4,\r\n                    I: 1\r\n                }[i];\r\n            });\r\n\r\n            return r;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ROMAN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数字\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseInt(number);\r\n\r\n            if(number == 0){\r\n                return \"\";\r\n            }\r\n            else if(number < 1 || number > 3999){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            function convert(num) {\r\n                var a=[\r\n                    [\"\",\"I\",\"II\",\"III\",\"IV\",\"V\",\"VI\",\"VII\",\"VIII\",\"IX\"],\r\n                    [\"\",\"X\",\"XX\",\"XXX\",\"XL\",\"L\",\"LX\",\"LXX\",\"LXXX\",\"XC\"],\r\n                    [\"\",\"C\",\"CC\",\"CCC\",\"CD\",\"D\",\"DC\",\"DCC\",\"DCCC\",\"CM\"],\r\n                    [\"\",\"M\",\"MM\",\"MMM\"]\r\n                ];\r\n\r\n                var i = a[3][Math.floor(num / 1000)];\r\n                var j = a[2][Math.floor(num % 1000 / 100)];\r\n                var k = a[1][Math.floor(num % 100 / 10)];\r\n                var l = a[0][num % 10];\r\n\r\n                return  i + j + k + l;\r\n            }\r\n\r\n            return convert(number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"REGEXEXTRACT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //输入文本\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            //表达式\r\n            var regular_expression = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(regular_expression)){\r\n                return regular_expression;\r\n            }\r\n\r\n            var match = text.match(new RegExp(regular_expression));\r\n            return match ? (match[match.length > 1 ? match.length - 1 : 0]) : null;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"REGEXMATCH\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //输入文本\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            //表达式\r\n            var regular_expression = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(regular_expression)){\r\n                return regular_expression;\r\n            }\r\n\r\n            var match = text.match(new RegExp(regular_expression));\r\n            return match ? true : false;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"REGEXREPLACE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //输入文本\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            //表达式\r\n            var regular_expression = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(regular_expression)){\r\n                return regular_expression;\r\n            }\r\n\r\n            //插入文本\r\n            var replacement = func_methods.getFirstValue(arguments[2], \"text\");\r\n            if(valueIsError(replacement)){\r\n                return replacement;\r\n            }\r\n\r\n            return text.replace(new RegExp(regular_expression), replacement);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"T\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //文本\r\n            var value = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            return getObjType(value) == \"string\" ? value : '';\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FIXED\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要进行舍入并转换为文本的数字\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //小数位数\r\n            var decimals = 2;\r\n            if(arguments.length >= 2){\r\n                decimals = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(decimals)){\r\n                    return decimals;\r\n                }\r\n\r\n                if(!isRealNum(decimals)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                decimals = parseInt(decimals);\r\n            }\r\n\r\n            //逻辑值\r\n            var no_commas = false;\r\n            if(arguments.length == 3){\r\n                no_commas = func_methods.getCellBoolen(arguments[2]);\r\n\r\n                if(valueIsError(no_commas)){\r\n                    return no_commas;\r\n                }\r\n            }\r\n\r\n            if(decimals > 127){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            var format = no_commas ? '0' : '#,##0';\r\n\r\n            if (decimals <= 0) {\r\n                number = Math.round(number * Math.pow(10, decimals)) / Math.pow(10, decimals);\r\n            }\r\n            else if (decimals > 0) {\r\n                format += '.' + new Array(decimals + 1).join('0');\r\n            }\r\n\r\n            return update(format, number);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FIND\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要查找的文本\r\n            var find_text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(find_text)){\r\n                return find_text;\r\n            }\r\n\r\n            find_text = find_text.toString();\r\n\r\n            //包含要查找文本的文本\r\n            var within_text = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(within_text)){\r\n                return within_text;\r\n            }\r\n\r\n            within_text = within_text.toString();\r\n\r\n            //指定开始进行查找的字符\r\n            var start_num = 1;\r\n            if(arguments.length == 3){\r\n                start_num = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(start_num)){\r\n                    return start_num;\r\n                }\r\n\r\n                if(!isRealNum(start_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                start_num = parseFloat(start_num);\r\n            }\r\n\r\n            if(start_num < 0 || start_num > within_text.length){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(find_text == \"\"){\r\n                return start_num;\r\n            }\r\n\r\n            if(within_text.indexOf(find_text) == -1){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var result = within_text.indexOf(find_text, start_num - 1) + 1;\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FINDB\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要查找的文本\r\n            var find_text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(find_text)){\r\n                return find_text;\r\n            }\r\n\r\n            find_text = find_text.toString();\r\n\r\n            //包含要查找文本的文本\r\n            var within_text = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(within_text)){\r\n                return within_text;\r\n            }\r\n\r\n            within_text = within_text.toString();\r\n\r\n            //指定开始进行查找的字符\r\n            var start_num = 1;\r\n            if(arguments.length == 3){\r\n                start_num = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(start_num)){\r\n                    return start_num;\r\n                }\r\n\r\n                if(!isRealNum(start_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                start_num = parseFloat(start_num);\r\n            }\r\n\r\n            if(start_num < 0 || start_num > within_text.length){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(find_text == \"\"){\r\n                return start_num;\r\n            }\r\n\r\n            if(within_text.indexOf(find_text) == -1){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var strArr = within_text.split(\"\");\r\n            var index = within_text.indexOf(find_text, start_num - 1);\r\n\r\n            var result = 0;\r\n            for(var i = 0; i < index; i++){\r\n                if(/[^\\x00-\\xff]/g.test(strArr[i])){\r\n                    result += 2;\r\n                }\r\n                else{\r\n                    result += 1;\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"JOIN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //定界符\r\n            var separator = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(separator)){\r\n                return separator;\r\n            }\r\n\r\n            //值或数组\r\n            var dataArr = [];\r\n\r\n            for(var i = 1; i < arguments.length; i++){\r\n                var data = arguments[i];\r\n\r\n                if(getObjType(data) == \"array\"){\r\n                    if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    dataArr = dataArr.concat(func_methods.getDataArr(data, false));\r\n                }\r\n                else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                    dataArr = dataArr.concat(func_methods.getCellDataArr(data, \"text\", false));\r\n                }\r\n                else{\r\n                    dataArr.push(data);\r\n                }\r\n            }\r\n\r\n            return dataArr.join(separator);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LEFT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //包含要提取���字符的文本字符串\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            //提取的字符的数量\r\n            var num_chars = 1;\r\n            if(arguments.length == 2){\r\n                num_chars = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(num_chars)){\r\n                    return num_chars;\r\n                }\r\n\r\n                if(!isRealNum(num_chars)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                num_chars = parseInt(num_chars);\r\n            }\r\n\r\n            if(num_chars < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            if(num_chars >= text.length){\r\n                return text;\r\n            }\r\n            else if(num_chars == 0){\r\n                return \"\";\r\n            }\r\n            else{\r\n                return text.substr(0, num_chars);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RIGHT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //包含要提取的字符的文本字符串\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            //提取的字符的数量\r\n            var num_chars = 1;\r\n            if(arguments.length == 2){\r\n                num_chars = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(num_chars)){\r\n                    return num_chars;\r\n                }\r\n\r\n                if(!isRealNum(num_chars)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                num_chars = parseInt(num_chars);\r\n            }\r\n\r\n            if(num_chars < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            if(num_chars >= text.length){\r\n                return text;\r\n            }\r\n            else if(num_chars == 0){\r\n                return \"\";\r\n            }\r\n            else{\r\n                return text.substr(-num_chars, num_chars);\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MID\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //包含要提取的字符的文本字符串\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            //开始提取的位置\r\n            var start_num = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(start_num)){\r\n                return start_num;\r\n            }\r\n\r\n            if(!isRealNum(start_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            start_num = parseInt(start_num);\r\n\r\n            //提取的字符的数量\r\n            var num_chars = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(num_chars)){\r\n                return num_chars;\r\n            }\r\n\r\n            if(!isRealNum(num_chars)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            num_chars = parseInt(num_chars);\r\n\r\n            if(start_num < 1 || num_chars < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            if(start_num > text.length){\r\n                return \"\";\r\n            }\r\n\r\n            if(start_num + num_chars > text.length){\r\n                return text.substr(start_num - 1, text.length - start_num + 1);\r\n            }\r\n\r\n            return text.substr(start_num - 1, num_chars);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LEN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            return text.length;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LENB\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            return text.replace(/[^\\x00-\\xff]/g, \"aa\").length;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOWER\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            return text ? text.toLowerCase() : text;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"UPPER\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            return text ? text.toUpperCase() : text;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EXACT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串1\r\n            var text1 = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text1)){\r\n                return text1;\r\n            }\r\n\r\n            text1 = text1.toString();\r\n\r\n            //字符串2\r\n            var text2 = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(text2)){\r\n                return text2;\r\n            }\r\n\r\n            text2 = text2.toString();\r\n\r\n            return text1 === text2;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"REPLACE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串1\r\n            var old_text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(old_text)){\r\n                return old_text;\r\n            }\r\n\r\n            old_text = old_text.toString();\r\n\r\n            //进行替换操作的位置\r\n            var start_num = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(start_num)){\r\n                return start_num;\r\n            }\r\n\r\n            if(!isRealNum(start_num)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            start_num = parseInt(start_num);\r\n\r\n            //要在文本中替换的字符个数\r\n            var num_chars = func_methods.getFirstValue(arguments[2]);\r\n            if(valueIsError(num_chars)){\r\n                return num_chars;\r\n            }\r\n\r\n            if(!isRealNum(num_chars)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            num_chars = parseInt(num_chars);\r\n\r\n            //字符串2\r\n            var new_text = func_methods.getFirstValue(arguments[3], \"text\");\r\n            if(valueIsError(new_text)){\r\n                return new_text;\r\n            }\r\n\r\n            new_text = new_text.toString();\r\n\r\n            return old_text.substr(0, start_num - 1) + new_text + old_text.substr(start_num - 1 + num_chars);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"REPT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串1\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            //重复次数\r\n            var number_times = func_methods.getFirstValue(arguments[1]);\r\n            if(valueIsError(number_times)){\r\n                return number_times;\r\n            }\r\n\r\n            if(!isRealNum(number_times)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number_times = parseInt(number_times);\r\n\r\n            if(number_times < 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            if(number_times > 100){\r\n                number_times = 100;\r\n            }\r\n\r\n            return new Array(number_times + 1).join(text);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SEARCH\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串1\r\n            var find_text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(find_text)){\r\n                return find_text;\r\n            }\r\n\r\n            find_text = find_text.toString();\r\n\r\n            //字符串2\r\n            var within_text = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(within_text)){\r\n                return within_text;\r\n            }\r\n\r\n            within_text = within_text.toString();\r\n\r\n            //开始位置\r\n            var start_num = 1;\r\n            if(arguments.length == 3){\r\n                start_num = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(start_num)){\r\n                    return start_num;\r\n                }\r\n\r\n                if(!isRealNum(start_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                start_num = parseInt(start_num);\r\n            }\r\n\r\n            if(start_num <= 0 || start_num > within_text.length){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var foundAt = within_text.toLowerCase().indexOf(find_text.toLowerCase(), start_num - 1) + 1;\r\n\r\n            return (foundAt === 0) ? formula.error.v : foundAt;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUBSTITUTE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //需要替换其中字符的文本\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            //需要替换的文本\r\n            var old_text = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(old_text)){\r\n                return old_text;\r\n            }\r\n\r\n            old_text = old_text.toString();\r\n\r\n            //用于替换 old_text 的文本\r\n            var new_text = func_methods.getFirstValue(arguments[2], \"text\");\r\n            if(valueIsError(new_text)){\r\n                return new_text;\r\n            }\r\n\r\n            new_text = new_text.toString();\r\n\r\n            //instance_num\r\n            var instance_num = null;\r\n            if(arguments.length == 4){\r\n                instance_num = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(instance_num)){\r\n                    return instance_num;\r\n                }\r\n\r\n                if(!isRealNum(instance_num)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                instance_num = parseInt(instance_num);\r\n            }\r\n\r\n            //计算\r\n            var reg = new RegExp(old_text, \"g\");\r\n\r\n            var result;\r\n\r\n            if(instance_num == null){\r\n                result = text.replace(reg, new_text);\r\n            }\r\n            else{\r\n                if(instance_num <= 0){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                var match = text.match(reg);\r\n\r\n                if(match == null || instance_num > match.length){\r\n                    return text;\r\n                }\r\n                else{\r\n                    var len = old_text.length;\r\n                    var index = 0;\r\n\r\n                    for(var i = 1; i <= instance_num; i++){\r\n                        index = text.indexOf(old_text, index) + 1;\r\n                    }\r\n\r\n                    result = text.substring(0, index - 1) + new_text + text.substring(index - 1 + len);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CLEAN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            var textArr = [];\r\n            for(var i = 0; i < text.length; i++){\r\n                var code = text.charCodeAt(i);\r\n\r\n                if(/[\\u4e00-\\u9fa5]/g.test(text.charAt(i)) || (code > 31 && code < 127)){\r\n                    textArr.push(text.charAt(i));\r\n                }\r\n            }\r\n\r\n            return textArr.join(\"\");\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TEXT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数字\r\n            var value = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            if(!isRealNum(value)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value = parseFloat(value);\r\n\r\n            //格式\r\n            var format_text = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(format_text)){\r\n                return format_text;\r\n            }\r\n\r\n            format_text = format_text.toString();\r\n\r\n            return update(format_text, value);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TRIM\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            return text.replace(/ +/g, ' ').trim();\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"VALUE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString();\r\n\r\n            return genarate(text)[2];\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PROPER\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //字符串\r\n            var text = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(text)){\r\n                return text;\r\n            }\r\n\r\n            text = text.toString().toLowerCase();\r\n\r\n            return text.replace(/[a-zA-Z]+/g, function(word){ return word.substring(0,1).toUpperCase() + word.substring(1); })\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CONVERT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数字\r\n            var number = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(number)){\r\n                return number;\r\n            }\r\n\r\n            if(!isRealNum(number)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            number = parseFloat(number);\r\n\r\n            //数值的单位\r\n            var from_unit = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(from_unit)){\r\n                return from_unit;\r\n            }\r\n\r\n            from_unit = from_unit.toString();\r\n\r\n            //结果的单位\r\n            var to_unit = func_methods.getFirstValue(arguments[2], \"text\");\r\n            if(valueIsError(to_unit)){\r\n                return to_unit;\r\n            }\r\n\r\n            to_unit = to_unit.toString();\r\n\r\n            //计算\r\n            var units = [\r\n                [\"a.u. of action\", \"?\", null, \"action\", false, false, 1.05457168181818e-34],\r\n                [\"a.u. of charge\", \"e\", null, \"electric_charge\", false, false, 1.60217653141414e-19],\r\n                [\"a.u. of energy\", \"Eh\", null, \"energy\", false, false, 4.35974417757576e-18],\r\n                [\"a.u. of length\", \"a?\", null, \"length\", false, false, 5.29177210818182e-11],\r\n                [\"a.u. of mass\", \"m?\", null, \"mass\", false, false, 9.10938261616162e-31],\r\n                [\"a.u. of time\", \"?/Eh\", null, \"time\", false, false, 2.41888432650516e-17],\r\n                [\"admiralty knot\", \"admkn\", null, \"speed\", false, true, 0.514773333],\r\n                [\"ampere\", \"A\", null, \"electric_current\", true, false, 1],\r\n                [\"ampere per meter\", \"A/m\", null, \"magnetic_field_intensity\", true, false, 1],\r\n                [\"ångström\", \"Å\", [\"ang\"], \"length\", false, true, 1e-10],\r\n                [\"are\", \"ar\", null, \"area\", false, true, 100],\r\n                [\"astronomical unit\", \"ua\", null, \"length\", false, false, 1.49597870691667e-11],\r\n                [\"bar\", \"bar\", null, \"pressure\", false, false, 100000],\r\n                [\"barn\", \"b\", null, \"area\", false, false, 1e-28],\r\n                [\"becquerel\", \"Bq\", null, \"radioactivity\", true, false, 1],\r\n                [\"bit\", \"bit\", [\"b\"], \"information\", false, true, 1],\r\n                [\"btu\", \"BTU\", [\"btu\"], \"energy\", false, true, 1055.05585262],\r\n                [\"byte\", \"byte\", null, \"information\", false, true, 8],\r\n                [\"candela\", \"cd\", null, \"luminous_intensity\", true, false, 1],\r\n                [\"candela per square metre\", \"cd/m?\", null, \"luminance\", true, false, 1],\r\n                [\"coulomb\", \"C\", null, \"electric_charge\", true, false, 1],\r\n                [\"cubic ångström\", \"ang3\", [\"ang^3\"], \"volume\", false, true, 1e-30],\r\n                [\"cubic foot\", \"ft3\", [\"ft^3\"], \"volume\", false, true, 0.028316846592],\r\n                [\"cubic inch\", \"in3\", [\"in^3\"], \"volume\", false, true, 0.000016387064],\r\n                [\"cubic light-year\", \"ly3\", [\"ly^3\"], \"volume\", false, true, 8.46786664623715e-47],\r\n                [\"cubic metre\", \"m?\", null, \"volume\", true, true, 1],\r\n                [\"cubic mile\", \"mi3\", [\"mi^3\"], \"volume\", false, true, 4168181825.44058],\r\n                [\"cubic nautical mile\", \"Nmi3\", [\"Nmi^3\"], \"volume\", false, true, 6352182208],\r\n                [\"cubic Pica\", \"Pica3\", [\"Picapt3\", \"Pica^3\", \"Picapt^3\"], \"volume\", false, true, 7.58660370370369e-8],\r\n                [\"cubic yard\", \"yd3\", [\"yd^3\"], \"volume\", false, true, 0.764554857984],\r\n                [\"cup\", \"cup\", null, \"volume\", false, true, 0.0002365882365],\r\n                [\"dalton\", \"Da\", [\"u\"], \"mass\", false, false, 1.66053886282828e-27],\r\n                [\"day\", \"d\", [\"day\"], \"time\", false, true, 86400],\r\n                [\"degree\", \"°\", null, \"angle\", false, false, 0.0174532925199433],\r\n                [\"degrees Rankine\", \"Rank\", null, \"temperature\", false, true, 0.555555555555556],\r\n                [\"dyne\", \"dyn\", [\"dy\"], \"force\", false, true, 0.00001],\r\n                [\"electronvolt\", \"eV\", [\"ev\"], \"energy\", false, true, 1.60217656514141],\r\n                [\"ell\", \"ell\", null, \"length\", false, true, 1.143],\r\n                [\"erg\", \"erg\", [\"e\"], \"energy\", false, true, 1e-7],\r\n                [\"farad\", \"F\", null, \"electric_capacitance\", true, false, 1],\r\n                [\"fluid ounce\", \"oz\", null, \"volume\", false, true, 0.0000295735295625],\r\n                [\"foot\", \"ft\", null, \"length\", false, true, 0.3048],\r\n                [\"foot-pound\", \"flb\", null, \"energy\", false, true, 1.3558179483314],\r\n                [\"gal\", \"Gal\", null, \"acceleration\", false, false, 0.01],\r\n                [\"gallon\", \"gal\", null, \"volume\", false, true, 0.003785411784],\r\n                [\"gauss\", \"G\", [\"ga\"], \"magnetic_flux_density\", false, true, 1],\r\n                [\"grain\", \"grain\", null, \"mass\", false, true, 0.0000647989],\r\n                [\"gram\", \"g\", null, \"mass\", false, true, 0.001],\r\n                [\"gray\", \"Gy\", null, \"absorbed_dose\", true, false, 1],\r\n                [\"gross registered ton\", \"GRT\", [\"regton\"], \"volume\", false, true, 2.8316846592],\r\n                [\"hectare\", \"ha\", null, \"area\", false, true, 10000],\r\n                [\"henry\", \"H\", null, \"inductance\", true, false, 1],\r\n                [\"hertz\", \"Hz\", null, \"frequency\", true, false, 1],\r\n                [\"horsepower\", \"HP\", [\"h\"], \"power\", false, true, 745.69987158227],\r\n                [\"horsepower-hour\", \"HPh\", [\"hh\", \"hph\"], \"energy\", false, true, 2684519.538],\r\n                [\"hour\", \"h\", [\"hr\"], \"time\", false, true, 3600],\r\n                [\"imperial gallon (U.K.)\", \"uk_gal\", null, \"volume\", false, true, 0.00454609],\r\n                [\"imperial hundredweight\", \"lcwt\", [\"uk_cwt\", \"hweight\"], \"mass\", false, true, 50.802345],\r\n                [\"imperial quart (U.K)\", \"uk_qt\", null, \"volume\", false, true, 0.0011365225],\r\n                [\"imperial ton\", \"brton\", [\"uk_ton\", \"LTON\"], \"mass\", false, true, 1016.046909],\r\n                [\"inch\", \"in\", null, \"length\", false, true, 0.0254],\r\n                [\"international acre\", \"uk_acre\", null, \"area\", false, true, 4046.8564224],\r\n                [\"IT calorie\", \"cal\", null, \"energy\", false, true, 4.1868],\r\n                [\"joule\", \"J\", null, \"energy\", true, true, 1],\r\n                [\"katal\", \"kat\", null, \"catalytic_activity\", true, false, 1],\r\n                [\"kelvin\", \"K\", [\"kel\"], \"temperature\", true, true, 1],\r\n                [\"kilogram\", \"kg\", null, \"mass\", true, true, 1],\r\n                [\"knot\", \"kn\", null, \"speed\", false, true, 0.514444444444444],\r\n                [\"light-year\", \"ly\", null, \"length\", false, true, 9460730472580800],\r\n                [\"litre\", \"L\", [\"l\", \"lt\"], \"volume\", false, true, 0.001],\r\n                [\"lumen\", \"lm\", null, \"luminous_flux\", true, false, 1],\r\n                [\"lux\", \"lx\", null, \"illuminance\", true, false, 1],\r\n                [\"maxwell\", \"Mx\", null, \"magnetic_flux\", false, false, 1e-18],\r\n                [\"measurement ton\", \"MTON\", null, \"volume\", false, true, 1.13267386368],\r\n                [\"meter per hour\", \"m/h\", [\"m/hr\"], \"speed\", false, true, 0.00027777777777778],\r\n                [\"meter per second\", \"m/s\", [\"m/sec\"], \"speed\", true, true, 1],\r\n                [\"meter per second squared\", \"m?s??\", null, \"acceleration\", true, false, 1],\r\n                [\"parsec\", \"pc\", [\"parsec\"], \"length\", false, true, 30856775814671900],\r\n                [\"meter squared per second\", \"m?/s\", null, \"kinematic_viscosity\", true, false, 1],\r\n                [\"metre\", \"m\", null, \"length\", true, true, 1],\r\n                [\"miles per hour\", \"mph\", null, \"speed\", false, true, 0.44704],\r\n                [\"millimetre of mercury\", \"mmHg\", null, \"pressure\", false, false, 133.322],\r\n                [\"minute\", \"?\", null, \"angle\", false, false, 0.000290888208665722],\r\n                [\"minute\", \"min\", [\"mn\"], \"time\", false, true, 60],\r\n                [\"modern teaspoon\", \"tspm\", null, \"volume\", false, true, 0.000005],\r\n                [\"mole\", \"mol\", null, \"amount_of_substance\", true, false, 1],\r\n                [\"morgen\", \"Morgen\", null, \"area\", false, true, 2500],\r\n                [\"n.u. of action\", \"?\", null, \"action\", false, false, 1.05457168181818e-34],\r\n                [\"n.u. of mass\", \"m?\", null, \"mass\", false, false, 9.10938261616162e-31],\r\n                [\"n.u. of speed\", \"c?\", null, \"speed\", false, false, 299792458],\r\n                [\"n.u. of time\", \"?/(me?c??)\", null, \"time\", false, false, 1.28808866778687e-21],\r\n                [\"nautical mile\", \"M\", [\"Nmi\"], \"length\", false, true, 1852],\r\n                [\"newton\", \"N\", null, \"force\", true, true, 1],\r\n                [\"œrsted\", \"Oe \", null, \"magnetic_field_intensity\", false, false, 79.5774715459477],\r\n                [\"ohm\", \"Ω\", null, \"electric_resistance\", true, false, 1],\r\n                [\"ounce mass\", \"ozm\", null, \"mass\", false, true, 0.028349523125],\r\n                [\"pascal\", \"Pa\", null, \"pressure\", true, false, 1],\r\n                [\"pascal second\", \"Pa?s\", null, \"dynamic_viscosity\", true, false, 1],\r\n                [\"pferdestärke\", \"PS\", null, \"power\", false, true, 735.49875],\r\n                [\"phot\", \"ph\", null, \"illuminance\", false, false, 0.0001],\r\n                [\"pica (1/6 inch)\", \"pica\", null, \"length\", false, true, 0.00035277777777778],\r\n                [\"pica (1/72 inch)\", \"Pica\", [\"Picapt\"], \"length\", false, true, 0.00423333333333333],\r\n                [\"poise\", \"P\", null, \"dynamic_viscosity\", false, false, 0.1],\r\n                [\"pond\", \"pond\", null, \"force\", false, true, 0.00980665],\r\n                [\"pound force\", \"lbf\", null, \"force\", false, true, 4.4482216152605],\r\n                [\"pound mass\", \"lbm\", null, \"mass\", false, true, 0.45359237],\r\n                [\"quart\", \"qt\", null, \"volume\", false, true, 0.000946352946],\r\n                [\"radian\", \"rad\", null, \"angle\", true, false, 1],\r\n                [\"second\", \"?\", null, \"angle\", false, false, 0.00000484813681109536],\r\n                [\"second\", \"s\", [\"sec\"], \"time\", true, true, 1],\r\n                [\"short hundredweight\", \"cwt\", [\"shweight\"], \"mass\", false, true, 45.359237],\r\n                [\"siemens\", \"S\", null, \"electrical_conductance\", true, false, 1],\r\n                [\"sievert\", \"Sv\", null, \"equivalent_dose\", true, false, 1],\r\n                [\"slug\", \"sg\", null, \"mass\", false, true, 14.59390294],\r\n                [\"square ångström\", \"ang2\", [\"ang^2\"], \"area\", false, true, 1e-20],\r\n                [\"square foot\", \"ft2\", [\"ft^2\"], \"area\", false, true, 0.09290304],\r\n                [\"square inch\", \"in2\", [\"in^2\"], \"area\", false, true, 0.00064516],\r\n                [\"square light-year\", \"ly2\", [\"ly^2\"], \"area\", false, true, 8.95054210748189e+31],\r\n                [\"square meter\", \"m?\", null, \"area\", true, true, 1],\r\n                [\"square mile\", \"mi2\", [\"mi^2\"], \"area\", false, true, 2589988.110336],\r\n                [\"square nautical mile\", \"Nmi2\", [\"Nmi^2\"], \"area\", false, true, 3429904],\r\n                [\"square Pica\", \"Pica2\", [\"Picapt2\", \"Pica^2\", \"Picapt^2\"], \"area\", false, true, 0.00001792111111111],\r\n                [\"square yard\", \"yd2\", [\"yd^2\"], \"area\", false, true, 0.83612736],\r\n                [\"statute mile\", \"mi\", null, \"length\", false, true, 1609.344],\r\n                [\"steradian\", \"sr\", null, \"solid_angle\", true, false, 1],\r\n                [\"stilb\", \"sb\", null, \"luminance\", false, false, 0.0001],\r\n                [\"stokes\", \"St\", null, \"kinematic_viscosity\", false, false, 0.0001],\r\n                [\"stone\", \"stone\", null, \"mass\", false, true, 6.35029318],\r\n                [\"tablespoon\", \"tbs\", null, \"volume\", false, true, 0.0000147868],\r\n                [\"teaspoon\", \"tsp\", null, \"volume\", false, true, 0.00000492892],\r\n                [\"tesla\", \"T\", null, \"magnetic_flux_density\", true, true, 1],\r\n                [\"thermodynamic calorie\", \"c\", null, \"energy\", false, true, 4.184],\r\n                [\"ton\", \"ton\", null, \"mass\", false, true, 907.18474],\r\n                [\"tonne\", \"t\", null, \"mass\", false, false, 1000],\r\n                [\"U.K. pint\", \"uk_pt\", null, \"volume\", false, true, 0.00056826125],\r\n                [\"U.S. bushel\", \"bushel\", null, \"volume\", false, true, 0.03523907],\r\n                [\"U.S. oil barrel\", \"barrel\", null, \"volume\", false, true, 0.158987295],\r\n                [\"U.S. pint\", \"pt\", [\"us_pt\"], \"volume\", false, true, 0.000473176473],\r\n                [\"U.S. survey mile\", \"survey_mi\", null, \"length\", false, true, 1609.347219],\r\n                [\"U.S. survey/statute acre\", \"us_acre\", null, \"area\", false, true, 4046.87261],\r\n                [\"volt\", \"V\", null, \"voltage\", true, false, 1],\r\n                [\"watt\", \"W\", null, \"power\", true, true, 1],\r\n                [\"watt-hour\", \"Wh\", [\"wh\"], \"energy\", false, true, 3600],\r\n                [\"weber\", \"Wb\", null, \"magnetic_flux\", true, false, 1],\r\n                [\"yard\", \"yd\", null, \"length\", false, true, 0.9144],\r\n                [\"year\", \"yr\", null, \"time\", false, true, 31557600]\r\n            ];\r\n\r\n            var binary_prefixes = {\r\n                Yi: [\"yobi\", 80, 1208925819614629174706176, \"Yi\", \"yotta\"],\r\n                Zi: [\"zebi\", 70, 1180591620717411303424, \"Zi\", \"zetta\"],\r\n                Ei: [\"exbi\", 60, 1152921504606846976, \"Ei\", \"exa\"],\r\n                Pi: [\"pebi\", 50, 1125899906842624, \"Pi\", \"peta\"],\r\n                Ti: [\"tebi\", 40, 1099511627776, \"Ti\", \"tera\"],\r\n                Gi: [\"gibi\", 30, 1073741824, \"Gi\", \"giga\"],\r\n                Mi: [\"mebi\", 20, 1048576, \"Mi\", \"mega\"],\r\n                ki: [\"kibi\", 10, 1024, \"ki\", \"kilo\"]\r\n            };\r\n\r\n            var unit_prefixes = {\r\n                Y: [\"yotta\", 1e+24, \"Y\"],\r\n                Z: [\"zetta\", 1e+21, \"Z\"],\r\n                E: [\"exa\", 1e+18, \"E\"],\r\n                P: [\"peta\", 1e+15, \"P\"],\r\n                T: [\"tera\", 1e+12, \"T\"],\r\n                G: [\"giga\", 1e+09, \"G\"],\r\n                M: [\"mega\", 1e+06, \"M\"],\r\n                k: [\"kilo\", 1e+03, \"k\"],\r\n                h: [\"hecto\", 1e+02, \"h\"],\r\n                e: [\"dekao\", 1e+01, \"e\"],\r\n                d: [\"deci\", 1e-01, \"d\"],\r\n                c: [\"centi\", 1e-02, \"c\"],\r\n                m: [\"milli\", 1e-03, \"m\"],\r\n                u: [\"micro\", 1e-06, \"u\"],\r\n                n: [\"nano\", 1e-09, \"n\"],\r\n                p: [\"pico\", 1e-12, \"p\"],\r\n                f: [\"femto\", 1e-15, \"f\"],\r\n                a: [\"atto\", 1e-18, \"a\"],\r\n                z: [\"zepto\", 1e-21, \"z\"],\r\n                y: [\"yocto\", 1e-24, \"y\"]\r\n            };\r\n\r\n            var from = null;\r\n            var to = null;\r\n            var base_from_unit = from_unit;\r\n            var base_to_unit = to_unit;\r\n            var from_multiplier = 1;\r\n            var to_multiplier = 1;\r\n            var alt;\r\n\r\n            for (var i = 0; i < units.length; i++) {\r\n                alt = (units[i][2] === null) ? [] : units[i][2];\r\n\r\n                if (units[i][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\r\n                    from = units[i];\r\n                }\r\n\r\n                if (units[i][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\r\n                    to = units[i];\r\n                }\r\n            }\r\n\r\n            if (from === null) {\r\n                var from_binary_prefix = binary_prefixes[from_unit.substring(0, 2)];\r\n                var from_unit_prefix = unit_prefixes[from_unit.substring(0, 1)];\r\n\r\n                if (from_unit.substring(0, 2) === 'da') {\r\n                    from_unit_prefix = [\"dekao\", 1e+01, \"da\"];\r\n                }\r\n\r\n                if (from_binary_prefix) {\r\n                    from_multiplier = from_binary_prefix[2];\r\n                    base_from_unit = from_unit.substring(2);\r\n                }\r\n                else if (from_unit_prefix) {\r\n                    from_multiplier = from_unit_prefix[1];\r\n                    base_from_unit = from_unit.substring(from_unit_prefix[2].length);\r\n                }\r\n\r\n                for (var j = 0; j < units.length; j++) {\r\n                    alt = (units[j][2] === null) ? [] : units[j][2];\r\n\r\n                    if (units[j][1] === base_from_unit || alt.indexOf(base_from_unit) >= 0) {\r\n                        from = units[j];\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (to === null) {\r\n                var to_binary_prefix = binary_prefixes[to_unit.substring(0, 2)];\r\n                var to_unit_prefix = unit_prefixes[to_unit.substring(0, 1)];\r\n\r\n                if (to_unit.substring(0, 2) === 'da') {\r\n                    to_unit_prefix = [\"dekao\", 1e+01, \"da\"];\r\n                }\r\n\r\n                if (to_binary_prefix) {\r\n                    to_multiplier = to_binary_prefix[2];\r\n                    base_to_unit = to_unit.substring(2);\r\n                }\r\n                else if (to_unit_prefix) {\r\n                    to_multiplier = to_unit_prefix[1];\r\n                    base_to_unit = to_unit.substring(to_unit_prefix[2].length);\r\n                }\r\n\r\n                for (var k = 0; k < units.length; k++) {\r\n                    alt = (units[k][2] === null) ? [] : units[k][2];\r\n\r\n                    if (units[k][1] === base_to_unit || alt.indexOf(base_to_unit) >= 0) {\r\n                        to = units[k];\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (from === null || to === null) {\r\n                return formula.error.na;\r\n            }\r\n\r\n            if (from[3] !== to[3]) {\r\n                return formula.error.na;\r\n            }\r\n\r\n            return number * from[6] * from_multiplier / (to[6] * to_multiplier);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMX2MY2\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //第一个数组或数值区域\r\n            var data_array_x = arguments[0];\r\n            var array_x = [];\r\n\r\n            if(getObjType(data_array_x) == \"array\"){\r\n                if(getObjType(data_array_x[0]) == \"array\" && !func_methods.isDyadicArr(data_array_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array_x = array_x.concat(func_methods.getDataArr(data_array_x, false));\r\n            }\r\n            else if(getObjType(data_array_x) == \"object\" && data_array_x.startCell != null){\r\n                array_x = array_x.concat(func_methods.getCellDataArr(data_array_x, \"text\", false));\r\n            }\r\n            else{\r\n                array_x.push(data_array_x);\r\n            }\r\n\r\n            //第二个数组或数值区域\r\n            var data_array_y = arguments[1];\r\n            var array_y = [];\r\n\r\n            if(getObjType(data_array_y) == \"array\"){\r\n                if(getObjType(data_array_y[0]) == \"array\" && !func_methods.isDyadicArr(data_array_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array_y = array_y.concat(func_methods.getDataArr(data_array_y, false));\r\n            }\r\n            else if(getObjType(data_array_y) == \"object\" && data_array_y.startCell != null){\r\n                array_y = array_y.concat(func_methods.getCellDataArr(data_array_y, \"text\", false));\r\n            }\r\n            else{\r\n                array_y.push(data_array_y);\r\n            }\r\n\r\n            if(array_x.length != array_y.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //array_x 和 array_y 只取数值\r\n            var data_x = [], data_y = [];\r\n\r\n            for(var i = 0; i < array_x.length; i++){\r\n                var num_x = array_x[i];\r\n                var num_y = array_y[i];\r\n\r\n                if(isRealNum(num_x) && isRealNum(num_y)){\r\n                    data_x.push(parseFloat(num_x));\r\n                    data_y.push(parseFloat(num_y));\r\n                }\r\n            }\r\n\r\n            //计算\r\n            var sum = 0;\r\n\r\n            for (var i = 0; i < data_x.length; i++) {\r\n                sum += Math.pow(data_x[i], 2) - Math.pow(data_y[i], 2);\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMX2PY2\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //第一个数组或数值区域\r\n            var data_array_x = arguments[0];\r\n            var array_x = [];\r\n\r\n            if(getObjType(data_array_x) == \"array\"){\r\n                if(getObjType(data_array_x[0]) == \"array\" && !func_methods.isDyadicArr(data_array_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array_x = array_x.concat(func_methods.getDataArr(data_array_x, false));\r\n            }\r\n            else if(getObjType(data_array_x) == \"object\" && data_array_x.startCell != null){\r\n                array_x = array_x.concat(func_methods.getCellDataArr(data_array_x, \"text\", false));\r\n            }\r\n            else{\r\n                array_x.push(data_array_x);\r\n            }\r\n\r\n            //第二个数组或数值区域\r\n            var data_array_y = arguments[1];\r\n            var array_y = [];\r\n\r\n            if(getObjType(data_array_y) == \"array\"){\r\n                if(getObjType(data_array_y[0]) == \"array\" && !func_methods.isDyadicArr(data_array_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array_y = array_y.concat(func_methods.getDataArr(data_array_y, false));\r\n            }\r\n            else if(getObjType(data_array_y) == \"object\" && data_array_y.startCell != null){\r\n                array_y = array_y.concat(func_methods.getCellDataArr(data_array_y, \"text\", false));\r\n            }\r\n            else{\r\n                array_y.push(data_array_y);\r\n            }\r\n\r\n            if(array_x.length != array_y.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //array_x 和 array_y 只取数值\r\n            var data_x = [], data_y = [];\r\n\r\n            for(var i = 0; i < array_x.length; i++){\r\n                var num_x = array_x[i];\r\n                var num_y = array_y[i];\r\n\r\n                if(isRealNum(num_x) && isRealNum(num_y)){\r\n                    data_x.push(parseFloat(num_x));\r\n                    data_y.push(parseFloat(num_y));\r\n                }\r\n            }\r\n\r\n            //计算\r\n            var sum = 0;\r\n\r\n            for (var i = 0; i < data_x.length; i++) {\r\n                sum += Math.pow(data_x[i], 2) + Math.pow(data_y[i], 2);\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMXMY2\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //第一个数组或数值区域\r\n            var data_array_x = arguments[0];\r\n            var array_x = [];\r\n\r\n            if(getObjType(data_array_x) == \"array\"){\r\n                if(getObjType(data_array_x[0]) == \"array\" && !func_methods.isDyadicArr(data_array_x)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array_x = array_x.concat(func_methods.getDataArr(data_array_x, false));\r\n            }\r\n            else if(getObjType(data_array_x) == \"object\" && data_array_x.startCell != null){\r\n                array_x = array_x.concat(func_methods.getCellDataArr(data_array_x, \"text\", false));\r\n            }\r\n            else{\r\n                array_x.push(data_array_x);\r\n            }\r\n\r\n            //第二个数组或数值区域\r\n            var data_array_y = arguments[1];\r\n            var array_y = [];\r\n\r\n            if(getObjType(data_array_y) == \"array\"){\r\n                if(getObjType(data_array_y[0]) == \"array\" && !func_methods.isDyadicArr(data_array_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array_y = array_y.concat(func_methods.getDataArr(data_array_y, false));\r\n            }\r\n            else if(getObjType(data_array_y) == \"object\" && data_array_y.startCell != null){\r\n                array_y = array_y.concat(func_methods.getCellDataArr(data_array_y, \"text\", false));\r\n            }\r\n            else{\r\n                array_y.push(data_array_y);\r\n            }\r\n\r\n            if(array_x.length != array_y.length){\r\n                return formula.error.na;\r\n            }\r\n\r\n            //array_x 和 array_y 只取数值\r\n            var data_x = [], data_y = [];\r\n\r\n            for(var i = 0; i < array_x.length; i++){\r\n                var num_x = array_x[i];\r\n                var num_y = array_y[i];\r\n\r\n                if(isRealNum(num_x) && isRealNum(num_y)){\r\n                    data_x.push(parseFloat(num_x));\r\n                    data_y.push(parseFloat(num_y));\r\n                }\r\n            }\r\n\r\n            //计算\r\n            var sum = 0;\r\n\r\n            for (var i = 0; i < data_x.length; i++) {\r\n                sum += Math.pow(data_x[i] - data_y[i], 2);\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TRANSPOSE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //从其返回唯一值的数组或区域\r\n            var data_array = arguments[0];\r\n            var array = [];\r\n\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array = func_methods.getDataDyadicArr(data_array);\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                array = func_methods.getCellDataDyadicArr(data_array, \"number\");\r\n            }\r\n\r\n            array = array[0].map(function(col, a){\r\n                return array.map(function(row){\r\n                    return row[a];\r\n                });\r\n            });\r\n\r\n            return array;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TREND\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //已知的 y 值集合\r\n            var data_known_y = arguments[0];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = func_methods.getDataDyadicArr(data_known_y);\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = func_methods.getCellDataDyadicArr(data_known_y, \"text\");\r\n            }\r\n            else{\r\n                if(!isRealNum(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                var rowArr = [];\r\n\r\n                rowArr.push(parseFloat(data_known_y));\r\n\r\n                known_y.push(rowArr);\r\n            }\r\n\r\n            var known_y_rowlen = known_y.length;\r\n            var known_y_collen = known_y[0].length;\r\n\r\n            for(var i = 0; i < known_y_rowlen; i++){\r\n                for(var j = 0; j < known_y_collen; j++){\r\n                    if(!isRealNum(known_y[i][j])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    known_y[i][j] = parseFloat(known_y[i][j]);\r\n                }\r\n            }\r\n\r\n            //可选 x 值集合\r\n            var known_x = [];\r\n            for(var i = 1; i <= known_y_rowlen; i++){\r\n                for(var j = 1; j <= known_y_collen; j++){\r\n                    var number = (i - 1) * known_y_collen + j;\r\n                    known_x.push(number);\r\n                }\r\n            }\r\n\r\n            if(arguments.length >= 2){\r\n                var data_known_x = arguments[1];\r\n                known_x = [];\r\n\r\n                if(getObjType(data_known_x) == \"array\"){\r\n                    if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    known_x = func_methods.getDataDyadicArr(data_known_x);\r\n                }\r\n                else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                    known_x = func_methods.getCellDataDyadicArr(data_known_x, \"text\");\r\n                }\r\n                else{\r\n                    if(!isRealNum(data_known_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    var rowArr = [];\r\n\r\n                    rowArr.push(parseFloat(data_known_x));\r\n\r\n                    known_x.push(rowArr);\r\n                }\r\n\r\n                for(var i = 0; i < known_x.length; i++){\r\n                    for(var j = 0; j < known_x[0].length; j++){\r\n                        if(!isRealNum(known_x[i][j])){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        known_x[i][j] = parseFloat(known_x[i][j]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var known_x_rowlen = known_x.length;\r\n            var known_x_collen = known_x[0].length;\r\n\r\n            //新 x 值\r\n            var new_x = known_x;\r\n\r\n            if(arguments.length >= 3){\r\n                var data_new_x = arguments[2];\r\n                new_x = [];\r\n\r\n                if(getObjType(data_new_x) == \"array\"){\r\n                    if(getObjType(data_new_x[0]) == \"array\" && !func_methods.isDyadicArr(data_new_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    new_x = func_methods.getDataDyadicArr(data_new_x);\r\n                }\r\n                else if(getObjType(data_new_x) == \"object\" && data_new_x.startCell != null){\r\n                    new_x = func_methods.getCellDataDyadicArr(data_new_x, \"text\");\r\n                }\r\n                else{\r\n                    if(!isRealNum(data_new_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    var rowArr = [];\r\n\r\n                    rowArr.push(parseFloat(data_new_x));\r\n\r\n                    new_x.push(rowArr);\r\n                }\r\n\r\n                for(var i = 0; i < new_x.length; i++){\r\n                    for(var j = 0; j < new_x[0].length; j++){\r\n                        if(!isRealNum(new_x[i][j])){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        new_x[i][j] = parseFloat(new_x[i][j]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            //逻辑值\r\n            var const_b = true;\r\n\r\n            if(arguments.length == 4){\r\n                const_b = func_methods.getCellBoolen(arguments[3]);\r\n\r\n                if(valueIsError(const_b)){\r\n                    return const_b;\r\n                }\r\n            }\r\n\r\n            if(known_y_rowlen != known_x_rowlen || known_y_collen != known_x_collen){\r\n                return formula.error.r;\r\n            }\r\n\r\n            //计算\r\n            function leastSquare(arr_x, arr_y){\r\n                var xSum = 0, ySum = 0, xySum = 0, x2Sum = 0;\r\n\r\n                for(var i = 0; i < arr_x.length; i++){\r\n                    for(var j = 0; j < arr_x[i].length; j++){\r\n                        xSum += arr_x[i][j];\r\n                        ySum += arr_y[i][j];\r\n                        xySum += arr_x[i][j] * arr_y[i][j];\r\n                        x2Sum += arr_x[i][j] * arr_x[i][j];\r\n                    }\r\n                }\r\n\r\n                var n = arr_x.length * arr_x[0].length;\r\n\r\n                var xMean = xSum / n;\r\n                var yMean = ySum / n;\r\n                var xyMean = xySum / n;\r\n                var x2Mean = x2Sum / n;\r\n\r\n                var m = (xyMean - xMean * yMean) / (x2Mean - xMean * xMean);\r\n                var b = yMean - m * xMean;\r\n\r\n                return [m, b];\r\n            }\r\n\r\n            var ls = leastSquare(known_x, known_y);\r\n            var m = ls[0];\r\n\r\n            if(const_b){\r\n                var b = ls[1];\r\n            }\r\n            else{\r\n                var b = 0;\r\n            }\r\n\r\n            var result = [];\r\n\r\n            for(var i = 0; i < new_x.length; i++){\r\n                for(var j = 0; j < new_x[i].length; j++){\r\n                    var x = new_x[i][j];\r\n                    var y = m * x + b;\r\n\r\n                    result.push(Math.round(y * 1000000000) / 1000000000);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FREQUENCY\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //频率数组\r\n            var data_data_array = arguments[0];\r\n            var data_array = [];\r\n\r\n            if(getObjType(data_data_array) == \"array\"){\r\n                if(getObjType(data_data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_array = data_array.concat(func_methods.getDataArr(data_data_array, true));\r\n            }\r\n            else if(getObjType(data_data_array) == \"object\" && data_data_array.startCell != null){\r\n                data_array = data_array.concat(func_methods.getCellDataArr(data_data_array, \"number\", true));\r\n            }\r\n            else{\r\n                if(!isRealNum(data_data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                data_array.push(data_data_array);\r\n            }\r\n\r\n            var data_array_n = [];\r\n\r\n            for(var i = 0; i < data_array.length; i++){\r\n                if(isRealNum(data_array[i])){\r\n                    data_array_n.push(parseFloat(data_array[i]));\r\n                }\r\n            }\r\n\r\n            //间隔数组\r\n            var data_bins_array = arguments[1];\r\n            var bins_array = [];\r\n\r\n            if(getObjType(data_bins_array) == \"array\"){\r\n                if(getObjType(data_bins_array[0]) == \"array\" && !func_methods.isDyadicArr(data_bins_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                bins_array = bins_array.concat(func_methods.getDataArr(data_bins_array, true));\r\n            }\r\n            else if(getObjType(data_bins_array) == \"object\" && data_bins_array.startCell != null){\r\n                bins_array = bins_array.concat(func_methods.getCellDataArr(data_bins_array, \"number\", true));\r\n            }\r\n            else{\r\n                if(!isRealNum(data_bins_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                bins_array.push(data_bins_array);\r\n            }\r\n\r\n            var bins_array_n = [];\r\n\r\n            for(var i = 0; i < bins_array.length; i++){\r\n                if(isRealNum(bins_array[i])){\r\n                    bins_array_n.push(parseFloat(bins_array[i]));\r\n                }\r\n            }\r\n\r\n            //计算\r\n            if(data_array_n.length == 0 && bins_array_n.length == 0){\r\n                return [[0], [0]];\r\n            }\r\n            else if(data_array_n.length == 0){\r\n                var result = [[0]];\r\n\r\n                for(var i = 0; i < bins_array_n.length; i++){\r\n                    result.push([0]);\r\n                }\r\n\r\n                return result;\r\n            }\r\n            else if(bins_array_n.length == 0){\r\n                return [[0], [data_array_n.length]];\r\n            }\r\n            else{\r\n                bins_array_n.sort(function(a, b){\r\n                    return a - b;\r\n                });\r\n\r\n                var result = [];\r\n\r\n                for(var i = 0; i < bins_array_n.length; i++){\r\n                    if(i == 0){\r\n                        var count = 0;\r\n\r\n                        for(var j = 0; j < data_array_n.length; j++){\r\n                            if(data_array_n[j] <= bins_array_n[0]){\r\n                                count++;\r\n                            }\r\n                        }\r\n\r\n                        result.push([count]);\r\n                    }\r\n                    else if(i == bins_array_n.length - 1){\r\n                        var count1 = 0, count2 = 0;\r\n\r\n                        for(var j = 0; j < data_array_n.length; j++){\r\n                            if(data_array_n[j] <= bins_array_n[i] && data_array_n[j] > bins_array_n[i - 1]){\r\n                                count1++;\r\n                            }\r\n\r\n                            if(data_array_n[j] > bins_array_n[i]){\r\n                                count2++;\r\n                            }\r\n                        }\r\n\r\n                        result.push([count1]);\r\n                        result.push([count2]);\r\n                    }\r\n                    else{\r\n                        var count = 0;\r\n\r\n                        for(var j = 0; j < data_array_n.length; j++){\r\n                            if(data_array_n[j] <= bins_array_n[i] && data_array_n[j] > bins_array_n[i - 1]){\r\n                                count++;\r\n                            }\r\n                        }\r\n\r\n                        result.push([count]);\r\n                    }\r\n                }\r\n\r\n                return result;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"GROWTH\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //已知的 y 值集合\r\n            var data_known_y = arguments[0];\r\n            var known_y = [];\r\n\r\n            if(getObjType(data_known_y) == \"array\"){\r\n                if(getObjType(data_known_y[0]) == \"array\" && !func_methods.isDyadicArr(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                known_y = func_methods.getDataDyadicArr(data_known_y);\r\n            }\r\n            else if(getObjType(data_known_y) == \"object\" && data_known_y.startCell != null){\r\n                known_y = func_methods.getCellDataDyadicArr(data_known_y, \"text\");\r\n            }\r\n            else{\r\n                if(!isRealNum(data_known_y)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                var rowArr = [];\r\n\r\n                rowArr.push(parseFloat(data_known_y));\r\n\r\n                known_y.push(rowArr);\r\n            }\r\n\r\n            var known_y_rowlen = known_y.length;\r\n            var known_y_collen = known_y[0].length;\r\n\r\n            for(var i = 0; i < known_y_rowlen; i++){\r\n                for(var j = 0; j < known_y_collen; j++){\r\n                    if(!isRealNum(known_y[i][j])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    known_y[i][j] = parseFloat(known_y[i][j]);\r\n                }\r\n            }\r\n\r\n            //可选 x 值集合\r\n            var known_x = [];\r\n            for(var i = 1; i <= known_y_rowlen; i++){\r\n                for(var j = 1; j <= known_y_collen; j++){\r\n                    var number = (i - 1) * known_y_collen + j;\r\n                    known_x.push(number);\r\n                }\r\n            }\r\n\r\n            if(arguments.length >= 2){\r\n                var data_known_x = arguments[1];\r\n                known_x = [];\r\n\r\n                if(getObjType(data_known_x) == \"array\"){\r\n                    if(getObjType(data_known_x[0]) == \"array\" && !func_methods.isDyadicArr(data_known_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    known_x = func_methods.getDataDyadicArr(data_known_x);\r\n                }\r\n                else if(getObjType(data_known_x) == \"object\" && data_known_x.startCell != null){\r\n                    known_x = func_methods.getCellDataDyadicArr(data_known_x, \"text\");\r\n                }\r\n                else{\r\n                    if(!isRealNum(data_known_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    var rowArr = [];\r\n\r\n                    rowArr.push(parseFloat(data_known_x));\r\n\r\n                    known_x.push(rowArr);\r\n                }\r\n\r\n                for(var i = 0; i < known_x.length; i++){\r\n                    for(var j = 0; j < known_x[0].length; j++){\r\n                        if(!isRealNum(known_x[i][j])){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        known_x[i][j] = parseFloat(known_x[i][j]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var known_x_rowlen = known_x.length;\r\n            var known_x_collen = known_x[0].length;\r\n\r\n            //新 x 值\r\n            var new_x = known_x;\r\n\r\n            if(arguments.length >= 3){\r\n                var data_new_x = arguments[2];\r\n                new_x = [];\r\n\r\n                if(getObjType(data_new_x) == \"array\"){\r\n                    if(getObjType(data_new_x[0]) == \"array\" && !func_methods.isDyadicArr(data_new_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    new_x = func_methods.getDataDyadicArr(data_new_x);\r\n                }\r\n                else if(getObjType(data_new_x) == \"object\" && data_new_x.startCell != null){\r\n                    new_x = func_methods.getCellDataDyadicArr(data_new_x, \"text\");\r\n                }\r\n                else{\r\n                    if(!isRealNum(data_new_x)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    var rowArr = [];\r\n\r\n                    rowArr.push(parseFloat(data_new_x));\r\n\r\n                    new_x.push(rowArr);\r\n                }\r\n\r\n                for(var i = 0; i < new_x.length; i++){\r\n                    for(var j = 0; j < new_x[0].length; j++){\r\n                        if(!isRealNum(new_x[i][j])){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        new_x[i][j] = parseFloat(new_x[i][j]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            //逻辑值\r\n            var const_b = true;\r\n\r\n            if(arguments.length == 4){\r\n                const_b = func_methods.getCellBoolen(arguments[3]);\r\n\r\n                if(valueIsError(const_b)){\r\n                    return const_b;\r\n                }\r\n            }\r\n\r\n            if(known_y_rowlen != known_x_rowlen || known_y_collen != known_x_collen){\r\n                return formula.error.r;\r\n            }\r\n\r\n            //计算\r\n            function leastSquare(arr_x, arr_y){\r\n                var xSum = 0, ySum = 0, xySum = 0, x2Sum = 0;\r\n\r\n                for(var i = 0; i < arr_x.length; i++){\r\n                    for(var j = 0; j < arr_x[i].length; j++){\r\n                        xSum += arr_x[i][j];\r\n                        // ySum += arr_y[i][j];\r\n                        ySum += Math.log(arr_y[i][j]);\r\n                        // xySum += arr_x[i][j] * arr_y[i][j];\r\n                        xySum += arr_x[i][j] * Math.log(arr_y[i][j]);\r\n                        x2Sum += arr_x[i][j] * arr_x[i][j];\r\n                    }\r\n                }\r\n\r\n                var n = arr_x.length * arr_x[0].length;\r\n\r\n                var xMean = xSum / n;\r\n                var yMean = ySum / n;\r\n                var xyMean = xySum / n;\r\n                var x2Mean = x2Sum / n;\r\n\r\n                var m = (xyMean - xMean * yMean) / (x2Mean - xMean * xMean);\r\n                var b = yMean - m * xMean;\r\n\r\n                return [Math.exp(m), Math.exp(b)];\r\n            }\r\n\r\n            var ls = leastSquare(known_x, known_y);\r\n            var m = ls[0];\r\n\r\n            if(const_b){\r\n                var b = ls[1];\r\n            }\r\n            else{\r\n                var b = 1;\r\n            }\r\n\r\n            var result = [];\r\n\r\n            for(var i = 0; i < new_x.length; i++){\r\n                for(var j = 0; j < new_x[i].length; j++){\r\n                    var x = new_x[i][j];\r\n                    var y = b * Math.pow(m, x);\r\n                    // var y = Math.exp(b + m * x);\r\n\r\n                    result.push(Math.round(y * 1000000000) / 1000000000);\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LINEST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return formula.error.v;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LOGEST\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return formula.error.v;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MDETERM\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数组\r\n            var data_array = arguments[0];\r\n            var array = [];\r\n\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array = func_methods.getDataDyadicArr(data_array);\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                array = func_methods.getCellDataDyadicArr(data_array, \"text\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n                rowArr.push(data_array);\r\n                array.push(rowArr);\r\n            }\r\n\r\n            for(var i = 0; i < array.length; i++){\r\n                for(var j = 0; j < array[i].length; j++){\r\n                    if(!isRealNum(array[i][j])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    array[i][j] = parseFloat(array[i][j]);\r\n                }\r\n            }\r\n\r\n            if(array.length != array[0].length){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            function Ma(a, n){\r\n                var A;\r\n                var b = new Array();\r\n\r\n                if(n == 1){\r\n                    A = a[0][0];\r\n\r\n                    return A;\r\n                }\r\n                else if(n == 2){\r\n                    A = a[0][0] * a[1][1] - a[0][1] * a[1][0];\r\n\r\n                    return A;\r\n                }\r\n                else if(n == 3){\r\n                    A = a[0][0]*a[1][1]*a[2][2] + a[1][0]*a[2][1]*a[0][2] + a[2][0]*a[0][1]*a[1][2] - a[2][0]*a[1][1]*a[0][2] - a[0]      [0]*a[2][1]*a[1][2] - a[1][0]*a[0][1]*a[2][2];\r\n\r\n                    return A;\r\n                }\r\n                else{\r\n                    A = 0;\r\n                    var c = new Array();\r\n                    var e = new Array();\r\n\r\n                    for(var i = 0; i < n; i++){\r\n                        b[i] = a[i][0] * Math.pow(-1, i + 1 + 1);\r\n                    }\r\n\r\n                    for(var i = 0; i < n; i++){\r\n                        e[i] = new Array();\r\n\r\n                        for(var j = 0; j < n - 1; j++){\r\n                            e[i][j] = a[i][j + 1];\r\n                        }\r\n                    }\r\n\r\n                    for(var i = 0; i < n; i++){\r\n                        for(var j = 0; j < n; j++){\r\n                            c[j] = new Array();\r\n\r\n                            for(var k = 0; k < n - 1; k++){\r\n                                if(i > j){\r\n                                    c[j][k] = e[j][k];\r\n                                }\r\n                                else if(i < j){\r\n                                    c[j - 1][k] = e[j][k];\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        A += b[i] * arguments.callee(c, n - 1);\r\n                    }\r\n\r\n                    return A;\r\n                }\r\n            }\r\n\r\n            return Ma(array, array.length);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MINVERSE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数组\r\n            var data_array = arguments[0];\r\n            var array = [];\r\n\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array = func_methods.getDataDyadicArr(data_array);\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                array = func_methods.getCellDataDyadicArr(data_array, \"text\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n                rowArr.push(data_array);\r\n                array.push(rowArr);\r\n            }\r\n\r\n            for(var i = 0; i < array.length; i++){\r\n                for(var j = 0; j < array[i].length; j++){\r\n                    if(!isRealNum(array[i][j])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    array[i][j] = parseFloat(array[i][j]);\r\n                }\r\n            }\r\n\r\n            if(array.length != array[0].length){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            return inverse(array);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"MMULT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数组1\r\n            var data_array1 = arguments[0];\r\n            var array1 = [];\r\n\r\n            if(getObjType(data_array1) == \"array\"){\r\n                if(getObjType(data_array1[0]) == \"array\" && !func_methods.isDyadicArr(data_array1)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array1 = func_methods.getDataDyadicArr(data_array1);\r\n            }\r\n            else if(getObjType(data_array1) == \"object\" && data_array1.startCell != null){\r\n                array1 = func_methods.getCellDataDyadicArr(data_array1, \"text\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n                rowArr.push(data_array1);\r\n                array1.push(rowArr);\r\n            }\r\n\r\n            for(var i = 0; i < array1.length; i++){\r\n                for(var j = 0; j < array1[i].length; j++){\r\n                    if(!isRealNum(array1[i][j])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    array1[i][j] = parseFloat(array1[i][j]);\r\n                }\r\n            }\r\n\r\n            //数组2\r\n            var data_array2 = arguments[1];\r\n            var array2 = [];\r\n\r\n            if(getObjType(data_array2) == \"array\"){\r\n                if(getObjType(data_array2[0]) == \"array\" && !func_methods.isDyadicArr(data_array2)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array2 = func_methods.getDataDyadicArr(data_array2);\r\n            }\r\n            else if(getObjType(data_array2) == \"object\" && data_array2.startCell != null){\r\n                array2 = func_methods.getCellDataDyadicArr(data_array2, \"text\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n                rowArr.push(data_array2);\r\n                array2.push(rowArr);\r\n            }\r\n\r\n            for(var i = 0; i < array2.length; i++){\r\n                for(var j = 0; j < array2[i].length; j++){\r\n                    if(!isRealNum(array2[i][j])){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    array2[i][j] = parseFloat(array2[i][j]);\r\n                }\r\n            }\r\n\r\n            //计算\r\n            if(array1[0].length != array2.length){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var rowlen = array1.length;\r\n            var collen = array2[0].length;\r\n\r\n            var result = [];\r\n\r\n            for(var m = 0; m < rowlen; m++){\r\n                var rowArr = [];\r\n\r\n                for(var n = 0; n < collen; n++){\r\n                    var value = 0;\r\n\r\n                    for(var p = 0; p < array1[0].length; p++){\r\n                        value += array1[m][p] * array2[p][n];\r\n                    }\r\n\r\n                    rowArr.push(value);\r\n                }\r\n\r\n                result.push(rowArr);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SUMPRODUCT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //第一个数组\r\n            //数组1\r\n            var data_array1 = arguments[0];\r\n            var array1 = [];\r\n\r\n            if(getObjType(data_array1) == \"array\"){\r\n                if(getObjType(data_array1[0]) == \"array\" && !func_methods.isDyadicArr(data_array1)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array1 = func_methods.getDataDyadicArr(data_array1);\r\n            }\r\n            else if(getObjType(data_array1) == \"object\" && data_array1.startCell != null){\r\n                array1 = func_methods.getCellDataDyadicArr(data_array1, \"text\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n                rowArr.push(data_array1);\r\n                array1.push(rowArr);\r\n            }\r\n\r\n            for(var i = 0; i < array1.length; i++){\r\n                for(var j = 0; j < array1[i].length; j++){\r\n                    if(!isRealNum(array1[i][j])){\r\n                        array1[i][j] = 0;\r\n                    }\r\n                    else{\r\n                        array1[i][j] = parseFloat(array1[i][j]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var rowlen = array1.length;\r\n            var collen = array1[0].length;\r\n\r\n            if(arguments.length >= 2){\r\n                for(var i = 1; i < arguments.length; i++){\r\n                    var data = arguments[i];\r\n                    var arr = [];\r\n\r\n                    if(getObjType(data) == \"array\"){\r\n                        if(getObjType(data[0]) == \"array\" && !func_methods.isDyadicArr(data)){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        arr = func_methods.getDataDyadicArr(data);\r\n                    }\r\n                    else if(getObjType(data) == \"object\" && data.startCell != null){\r\n                        arr = func_methods.getCellDataDyadicArr(data, \"text\");\r\n                    }\r\n                    else{\r\n                        var rowArr = [];\r\n                        rowArr.push(data);\r\n                        arr.push(rowArr);\r\n                    }\r\n\r\n                    if(arr.length != rowlen || arr[0].length != collen){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    for(var m = 0; m < rowlen; m++){\r\n                        for(var n = 0; n < collen; n++){\r\n                            if(!isRealNum(arr[m][n])){\r\n                                array1[m][n] = 0;\r\n                            }\r\n                            else{\r\n                                array1[m][n] = array1[m][n] * parseFloat(arr[m][n]);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            var sum = 0;\r\n\r\n            for(var m = 0; m < rowlen; m++){\r\n                for(var n = 0; n < collen; n++){\r\n                    sum += array1[m][n];\r\n                }\r\n            }\r\n\r\n            return sum;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISFORMULA\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var data_cell = arguments[0];\r\n            var cell;\r\n\r\n            if(getObjType(data_cell) == \"object\" && data_cell.startCell != null){\r\n                if(data_cell.data == null){\r\n                    return false;\r\n                }\r\n\r\n                if(getObjType(data_cell.data) == \"array\"){\r\n                    cell = data_cell.data[0][0];\r\n                }\r\n                else{\r\n                    cell = data_cell.data;\r\n                }\r\n\r\n                if(cell != null && cell.f != null){\r\n                    return true;\r\n                }\r\n                else{\r\n                    return false;\r\n                }\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"CELL\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //单元格信息的类型\r\n            var data_info_type = arguments[0];\r\n            var info_type;\r\n\r\n            if(getObjType(data_info_type) == \"array\"){\r\n                if(getObjType(data_info_type[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_info_type)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    info_type = data_info_type[0][0];\r\n                }\r\n                else{\r\n                    info_type = data_info_type[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_info_type) == \"object\" && data_info_type.startCell != null){\r\n                if(data_info_type.data == null){\r\n                    return formula.error.v;\r\n                }\r\n                else{\r\n                    if(getObjType(data_info_type.data) == \"array\"){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    info_type = data_info_type.data.v;\r\n\r\n                    if(isRealNull(info_type)){\r\n                        return formula.error.v;\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                info_type = data_info_type;\r\n            }\r\n\r\n            //单元格\r\n            var data_reference = arguments[1];\r\n            var reference;\r\n\r\n            if(getObjType(data_reference) == \"object\" && data_reference.startCell != null){\r\n                reference = data_reference.startCell;\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if([\"address\", \"col\", \"color\", \"contents\", \"filename\", \"format\", \"parentheses\", \"prefix\", \"protect\", \"row\", \"type\", \"width\"].indexOf(info_type) == -1){\r\n                return formula.error.v;\r\n            }\r\n\r\n            var file = getluckysheetfile()[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n            var cellrange = formula.getcellrange(reference);\r\n            var row_index = cellrange.row[0];\r\n            var col_index = cellrange.column[0];\r\n\r\n            // let sheetdata = null;\r\n            // sheetdata = Store.flowdata;\r\n            // if (formula.execFunctionGroupData != null) {\r\n            //     sheetdata = formula.execFunctionGroupData;\r\n            // }\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            let value;\r\n            if(formula.execFunctionGlobalData != null && formula.execFunctionGlobalData[row_index+\"_\"+col_index+\"_\"+Store.calculateSheetIndex]!=null){\r\n                value = formula.execFunctionGlobalData[row_index+\"_\"+col_index+\"_\"+Store.calculateSheetIndex].v;\r\n            }\r\n            else if(sheetdata[row_index][col_index] != null && sheetdata[row_index][col_index].v != null && sheetdata[row_index][col_index].v !=\"\"){\r\n                value = sheetdata[row_index][col_index];\r\n                if(value instanceof Object){\r\n                    value = value.v;\r\n                }\r\n            }\r\n            else {\r\n                value = 0;\r\n            }\r\n\r\n            switch(info_type){\r\n                case \"address\":\r\n                    return reference;\r\n                    break;\r\n                case \"col\":\r\n                    return col_index + 1;\r\n                    break;\r\n                case \"color\":\r\n                    return 0;\r\n                    break;\r\n                case \"contents\":\r\n                    // if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].v == null || sheetdata[row_index][col_index].v ==\"\"){\r\n                    //     value = 0;\r\n                    // }\r\n\r\n                    return value;\r\n                    break;\r\n                case \"filename\":\r\n                    return file.name;\r\n                    break;\r\n                case \"format\":\r\n                    if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].ct == null){\r\n                        return \"G\";\r\n                    }\r\n\r\n                    return sheetdata[row_index][col_index].ct.fa;\r\n                    break;\r\n                case \"parentheses\":\r\n                    if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].v == null || sheetdata[row_index][col_index].v ==\"\"){\r\n                        return 0;\r\n                    }\r\n\r\n                    if (sheetdata[row_index][col_index].v > 0){\r\n                        return 1;\r\n                    }\r\n                    else{\r\n                        return 0;\r\n                    }\r\n                    break;\r\n                case \"prefix\":\r\n                    if (value==0){\r\n                        return \"\";\r\n                    }\r\n\r\n                    if (sheetdata[row_index][col_index].ht == 0){//居中对齐\r\n                        return \"^\";\r\n                    }\r\n                    else if (sheetdata[row_index][col_index].ht == 1){//左对齐\r\n                        return \"'\";\r\n                    }\r\n                    else if (sheetdata[row_index][col_index].ht == 2){//右对齐\r\n                        return '\"';\r\n                    }\r\n                    else{\r\n                        return \"\";\r\n                    }\r\n                    break;\r\n                case \"protect\":\r\n                    return 0;\r\n                    break;\r\n                case \"row\":\r\n                    return row_index + 1;\r\n                    break;\r\n                case \"type\":\r\n                    if (value==0){\r\n                        return \"b\";\r\n                    }\r\n\r\n                    return \"l\";\r\n                    break;\r\n                case \"width\":\r\n                    var cfg = file.config;\r\n\r\n                    if(cfg[\"columnlen\"] != null && col_index in cfg[\"columnlen\"]){\r\n                        return cfg[\"columnlen\"][col_index];\r\n                    }\r\n\r\n                    return Store.defaultcollen;\r\n                    break;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"NA\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            return formula.error.na;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ERROR_TYPE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //单元格\r\n            var data_error_val = arguments[0];\r\n            var error_val;\r\n\r\n            if(getObjType(data_error_val) == \"array\"){\r\n                if(getObjType(data_error_val[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_error_val)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    error_val = data_error_val[0][0];\r\n                }\r\n                else{\r\n                    error_val = data_error_val[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_error_val) == \"object\" && data_error_val.startCell != null){\r\n                if(data_error_val.data == null){\r\n                    return formula.error.na;\r\n                }\r\n\r\n                if(getObjType(data_error_val.data) == \"array\"){\r\n                    error_val = data_error_val.data[0][0];\r\n\r\n                    if(error_val == null || isRealNull(error_val.v)){\r\n                        return formula.error.na;\r\n                    }\r\n\r\n                    error_val = error_val.v;\r\n                }\r\n                else{\r\n                    if(isRealNull(data_error_val.data.v)){\r\n                        return formula.error.na;\r\n                    }\r\n\r\n                    error_val = data_error_val.data.v;\r\n                }\r\n            }\r\n            else{\r\n                error_val = data_error_val;\r\n            }\r\n\r\n            var error_obj = {\r\n                \"#NULL!\": 1,\r\n                \"#DIV/0!\": 2,\r\n                \"#VALUE!\": 3,\r\n                \"#REF!\": 4,\r\n                \"#NAME?\": 5,\r\n                \"#NUM!\": 6,\r\n                \"#N/A\": 7,\r\n                \"#GETTING_DATA\": 8\r\n            }\r\n\r\n            if(error_val in error_obj){\r\n                return error_obj[error_val];\r\n            }\r\n            else{\r\n                return formula.error.na;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISBLANK\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //单元格\r\n            var data_error_val = arguments[0];\r\n            var error_val;\r\n\r\n            if(getObjType(data_error_val) == \"object\" && data_error_val.startCell != null){\r\n                if(data_error_val.data == null){\r\n                    return true;\r\n                }\r\n                else{\r\n                    return false;\r\n                }\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISERR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //单元格\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return true;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return false;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if([\"#VALUE!\", \"#REF!\", \"#DIV/0!\", \"#NUM!\", \"#NAME?\", \"#NULL!\"].indexOf(value) > -1){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISERROR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //单元格\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return true;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return false;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if([\"#N/A\", \"#VALUE!\", \"#REF!\", \"#DIV/0!\", \"#NUM!\", \"#NAME?\", \"#NULL!\"].indexOf(value) > -1){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISLOGICAL\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //单元格\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return false\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return false;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if(value.toString().toLowerCase() == \"true\" || value.toString().toLowerCase() == \"false\"){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISNA\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //单元格\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return false;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return false;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if(value.toString() == \"#N/A\"){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISNONTEXT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //单元格\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return true;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return true;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if([\"#N/A\", \"#VALUE!\", \"#REF!\", \"#DIV/0!\", \"#NUM!\", \"#NAME?\", \"#NULL!\"].indexOf(value) > -1){\r\n                return true;\r\n            }\r\n            else if(value.toString().toLowerCase() == \"true\" || value.toString().toLowerCase() == \"false\"){\r\n                return true;\r\n            }\r\n            else if(isRealNum(value)){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISNUMBER\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //单元格\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return false;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return false;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if(isRealNum(value)){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISREF\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            if(getObjType(arguments[0]) == \"object\" && arguments[0].startCell != null){\r\n                return true;\r\n            }\r\n            else{\r\n                return false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"ISTEXT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //单元格\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return false;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return false;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if([\"#N/A\", \"#VALUE!\", \"#REF!\", \"#DIV/0!\", \"#NUM!\", \"#NAME?\", \"#NULL!\"].indexOf(value) > -1){\r\n                return false;\r\n            }\r\n            else if(value.toString().toLowerCase() == \"true\" || value.toString().toLowerCase() == \"false\"){\r\n                return false;\r\n            }\r\n            else if(isRealNum(value)){\r\n                return false;\r\n            }\r\n            else{\r\n                return true;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TYPE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //单元格\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                return 64;\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    return 16;\r\n                }\r\n\r\n                if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                    return 1;\r\n                }\r\n\r\n                value = data_value.data.v;\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if([\"#N/A\", \"#VALUE!\", \"#REF!\", \"#DIV/0!\", \"#NUM!\", \"#NAME?\", \"#NULL!\"].indexOf(value) > -1){\r\n                return 16;\r\n            }\r\n            else if(value.toString().toLowerCase() == \"true\" || value.toString().toLowerCase() == \"false\"){\r\n                return 4;\r\n            }\r\n            else if(isRealNum(value)){\r\n                return 1;\r\n            }\r\n            else{\r\n                return 2;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"N\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //单元格\r\n            var data_value = arguments[0];\r\n            var value;\r\n\r\n            if(getObjType(data_value) == \"array\"){\r\n                if(getObjType(data_value[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_value)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    value = data_value[0][0];\r\n                }\r\n                else{\r\n                    value = data_value[0];\r\n                }\r\n            }\r\n            else if(getObjType(data_value) == \"object\" && data_value.startCell != null){\r\n                if(getObjType(data_value.data) == \"array\"){\r\n                    value = data_value.data[0][0];\r\n\r\n                    if(value == null || isRealNull(value.v)){\r\n                        return 0;\r\n                    }\r\n\r\n                    value = value.v;\r\n                }\r\n                else{\r\n                    if(data_value.data == null || isRealNull(data_value.data.v)){\r\n                        return 0;\r\n                    }\r\n\r\n                    value = data_value.data.v;\r\n                }\r\n            }\r\n            else{\r\n                value = data_value;\r\n            }\r\n\r\n            if([\"#N/A\", \"#VALUE!\", \"#REF!\", \"#DIV/0!\", \"#NUM!\", \"#NAME?\", \"#NULL!\"].indexOf(value) > -1){\r\n                return value;\r\n            }\r\n            else if(value.toString().toLowerCase() == \"true\" || value.toString().toLowerCase() == \"false\"){\r\n                if(value.toString().toLowerCase() == \"true\"){\r\n                    return 1;\r\n                }\r\n                else{\r\n                    return 0;\r\n                }\r\n            }\r\n            else if(isRealNum(value)){\r\n                return parseFloat(value);\r\n            }\r\n            else{\r\n                return 0;\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TO_DATE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数字\r\n            var value = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            if(!isRealNum(value)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value = parseFloat(value);\r\n\r\n            return update(\"yyyy-mm-dd\", value);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TO_PURE_NUMBER\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var value = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            if(dayjs(value).isValid()){\r\n                return genarate(value)[2];\r\n            }\r\n            else{\r\n                return numeral(value).value() == null ? value : numeral(value).value();\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TO_TEXT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var value = func_methods.getFirstValue(arguments[0], \"text\");\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            return update(\"@\", value);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TO_DOLLARS\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数字\r\n            var value = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            if(!isRealNum(value)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value = parseFloat(value);\r\n\r\n            return update(\"$ 0.00\", value);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TO_PERCENT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数字\r\n            var value = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(value)){\r\n                return value;\r\n            }\r\n\r\n            if(!isRealNum(value)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            value = parseFloat(value);\r\n\r\n            return update(\"0%\", value);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DGET\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数据库的单元格区域\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //列\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //条件的单元格区域\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            if (resultIndexes.length === 0) {\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (resultIndexes.length > 1) {\r\n                return formula.error.nm;\r\n            }\r\n\r\n            return targetFields[resultIndexes[0]];\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DMAX\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数据库的单元格区域\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //列\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //条件的单元格区域\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var maxValue = targetFields[resultIndexes[0]];\r\n\r\n            for (var i = 1; i < resultIndexes.length; i++) {\r\n                if (maxValue < targetFields[resultIndexes[i]]) {\r\n                    maxValue = targetFields[resultIndexes[i]];\r\n                }\r\n            }\r\n\r\n            return maxValue;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DMIN\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数据库的单元格区域\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //列\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //条件的单元格区域\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = findField(database, field);\r\n                targetFields = rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = rest(database[field]);\r\n            }\r\n\r\n            var minValue = targetFields[resultIndexes[0]];\r\n\r\n            for (var i = 1; i < resultIndexes.length; i++) {\r\n                if (minValue > targetFields[resultIndexes[i]]) {\r\n                    minValue = targetFields[resultIndexes[i]];\r\n                }\r\n            }\r\n\r\n            return minValue;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DAVERAGE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数据库的单元格区域\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //列\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //条件的单元格区域\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var sum = 0;\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                sum += targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            return resultIndexes.length === 0 ? formula.error.d : sum / resultIndexes.length;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DCOUNT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数据库的单元格区域\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //列\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //条件的单元格区域\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            return window.luckysheet_function.COUNT.f.apply(window.luckysheet_function.COUNT, targetValues);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DCOUNTA\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数据库的单元格区域\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //列\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //条件的单元格区域\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            return window.luckysheet_function.COUNTA.f.apply(window.luckysheet_function.COUNTA, targetValues);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DPRODUCT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数据库的单元格区域\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //列\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //条件的单元格区域\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            targetValues = func_methods.compact(targetValues);\r\n\r\n            var result = 1;\r\n\r\n            for (i = 0; i < targetValues.length; i++) {\r\n                result *= targetValues[i];\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DSTDEV\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数据库的单元格区域\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //列\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //条件的单元格区域\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            targetValues = func_methods.compact(targetValues);\r\n\r\n            return window.luckysheet_function.STDEVA.f.apply(window.luckysheet_function.STDEVA, targetValues);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DSTDEVP\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数据库的单元格区域\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //列\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //条件的单元格区域\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            targetValues = func_methods.compact(targetValues);\r\n\r\n            return window.luckysheet_function.STDEVP.f.apply(window.luckysheet_function.STDEVP, targetValues);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DSUM\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数据库的单元格区域\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //列\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //条件的单元格区域\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            targetValues = func_methods.compact(targetValues);\r\n\r\n            var result = 0;\r\n\r\n            for (i = 0; i < targetValues.length; i++) {\r\n                result += targetValues[i];\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DVAR\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数据库的单元格区域\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //列\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //条件的单元格区域\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            targetValues = func_methods.compact(targetValues);\r\n\r\n            return window.luckysheet_function.VAR_S.f.apply(window.luckysheet_function.VAR_S, targetValues);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DVARP\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //数据库的单元格区域\r\n            var data_database = arguments[0];\r\n            var database = [];\r\n\r\n            if(getObjType(data_database) == \"object\" && data_database.startCell != null){\r\n                if(data_database.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                database = func_methods.getCellDataDyadicArr(data_database, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //列\r\n            var field = func_methods.getFirstValue(arguments[1], \"text\");\r\n            if(valueIsError(field)){\r\n                return field;\r\n            }\r\n\r\n            if(isRealNull(field)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //条件的单元格区域\r\n            var data_criteria = arguments[2];\r\n            var criteria = [];\r\n\r\n            if(getObjType(data_criteria) == \"object\" && data_criteria.startCell != null){\r\n                if(data_criteria.data == null){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                criteria = func_methods.getCellDataDyadicArr(data_criteria, \"text\");\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            if (!isRealNum(field) && getObjType(field) !== \"string\") {\r\n                return formula.error.v;\r\n            }\r\n\r\n            var resultIndexes = func_methods.findResultIndex(database, criteria);\r\n            var targetFields = [];\r\n\r\n            if (getObjType(field) === \"string\") {\r\n                var index = func_methods.findField(database, field);\r\n                targetFields = func_methods.rest(database[index]);\r\n            }\r\n            else {\r\n                targetFields = func_methods.rest(database[field]);\r\n            }\r\n\r\n            var targetValues = [];\r\n\r\n            for (var i = 0; i < resultIndexes.length; i++) {\r\n                targetValues[i] = targetFields[resultIndexes[i]];\r\n            }\r\n\r\n            targetValues = func_methods.compact(targetValues);\r\n\r\n            return window.luckysheet_function.VAR_P.f.apply(window.luckysheet_function.VAR_P, targetValues);\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"LINESPLINES\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //色表，接下来会用到\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n            var lineColor = arguments[1];\r\n            var lineWidth = arguments[2];\r\n            var normalValue = arguments[3];\r\n            var normalColor = arguments[4];\r\n            var maxSpot = arguments[5];\r\n            var minSpot = arguments[6];\r\n            var spotRadius = arguments[7];\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //定义需要格式化data数据\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //开始进行sparklines的详细设置，宽和高为单元格的宽高。\r\n            var sparksetting = {};\r\n\r\n            if(lineWidth==null){\r\n                lineWidth = 1;\r\n            }\r\n            sparksetting[\"lineWidth\"] = lineWidth;\r\n            //设置sparklines图表的宽高，线图的高会随着粗细而超出单元格高度，所以减去一个量，设置offsetY或者offsetX为渲染偏移量，传给luckysheetDrawMain使用。默认为0。=LINESPLINES(D9:E24,3,5)\r\n            sparksetting[\"offsetY\"] = lineWidth+1;\r\n            sparksetting.height = height-(lineWidth+1);\r\n            sparksetting.width = width;\r\n\r\n            //定义sparklines的通用色彩设置函数，可以设置 色表【colorList】索引数值 或者 具体颜色值\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            if(lineColor==null){\r\n                lineColor = \"#2ec7c9\";\r\n            }\r\n            sparkColorSetting(\"lineColor\", lineColor);\r\n            //sparkColorSetting(\"fillColor\", fillColor);\r\n            sparksetting[\"fillColor\"] = 0;\r\n\r\n\r\n\r\n\r\n            //设置辅助线，可以支持min、max、avg、median等几个字符变量，或者具体的数值。\r\n            if(!!normalValue){\r\n                if(typeof(normalValue)==\"string\"){\r\n                    normalValue = normalValue.toLowerCase();\r\n                    var nv = null;\r\n                    if(normalValue==\"min\"){\r\n                        nv = window.luckysheet_function.MIN.f({\"data\":dataformat});\r\n                    }\r\n                    else if(normalValue==\"max\"){\r\n                        nv = window.luckysheet_function.MAX.f({\"data\":dataformat});\r\n                    }\r\n                    else if(normalValue==\"avg\" || normalValue==\"mean\"){\r\n                        nv = window.luckysheet_function.AVERAGE.f({\"data\":dataformat});\r\n                    }\r\n                    else if(normalValue==\"median\"){\r\n                        nv = window.luckysheet_function.MEDIAN.f({\"data\":dataformat});\r\n                    }\r\n\r\n                    if(!!nv){\r\n                        sparksetting[\"normalRangeMin\"] = nv;\r\n                        sparksetting[\"normalRangeMax\"] = nv;\r\n                    }\r\n                }\r\n                else{\r\n                    sparksetting[\"normalRangeMin\"] = normalValue;\r\n                    sparksetting[\"normalRangeMax\"] = normalValue;\r\n                }\r\n\r\n            }\r\n\r\n            if(normalColor==null){\r\n                normalColor = \"#000\";\r\n            }\r\n            sparkColorSetting(\"normalRangeColor\", normalColor);\r\n\r\n            sparkColorSetting(\"maxSpotColor\", maxSpot);\r\n            sparkColorSetting(\"minSpotColor\", minSpot);\r\n\r\n            if(spotRadius==null){\r\n                spotRadius = \"1.5\";\r\n            }\r\n            sparksetting[\"spotRadius\"] = spotRadius;\r\n\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n            // {\r\n            //     height:rowlen,\r\n            //     width:firstcolumnlen,\r\n            //     normalRangeMin:6,\r\n            //     normalRangeMax:6,\r\n            //     normalRangeColor:\"#000\"\r\n            // }\r\n            //return \"\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"AREASPLINES\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //色表，接下来会用到\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n            var lineColor = arguments[1];\r\n            var fillColor = arguments[2];\r\n            var lineWidth = arguments[3];\r\n            var normalValue = arguments[4];\r\n            var normalColor = arguments[5];\r\n            // var maxSpot = arguments[5];\r\n            // var minSpot = arguments[6];\r\n            // var spotRadius = arguments[7];\r\n\r\n            //定义需要格式化data数据\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //开始进行sparklines的详细设置，宽和高为单元格的宽高。\r\n            var sparksetting = {};\r\n\r\n            if(lineWidth==null){\r\n                lineWidth = 1;\r\n            }\r\n            sparksetting[\"lineWidth\"] = lineWidth;\r\n            //设置sparklines图表的宽高，线图的高会随着粗细而超出单元格高度，所以减去一个量，设置offsetY或者offsetX为渲染偏移量，传给luckysheetDrawMain使用。默认为0。=LINESPLINES(D9:E24,3,5)\r\n            sparksetting[\"offsetY\"] = lineWidth+1;\r\n            sparksetting.height = height-(lineWidth+1);\r\n            sparksetting.width = width;\r\n\r\n            //定义sparklines的通用色彩设置函数，可以设置 色表【colorList】索引数值 或者 具体颜色值\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            if(lineColor==null){\r\n                lineColor = \"#2ec7c9\";\r\n            }\r\n            sparkColorSetting(\"lineColor\", lineColor);\r\n            sparkColorSetting(\"fillColor\", fillColor);\r\n            // sparksetting[\"fillColor\"] = 0;\r\n\r\n            if(lineWidth==null){\r\n                lineWidth = \"1\";\r\n            }\r\n            sparksetting[\"lineWidth\"] = lineWidth;\r\n\r\n            //设置辅助线，可以支持min、max、avg、median等几个字符变量，或者具体的数值。\r\n            if(!!normalValue){\r\n                if(typeof(normalValue)==\"string\"){\r\n                    normalValue = normalValue.toLowerCase();\r\n                    var nv = null;\r\n                    if(normalValue==\"min\"){\r\n                        nv = window.luckysheet_function.MIN.f({\"data\":dataformat});\r\n                    }\r\n                    else if(normalValue==\"max\"){\r\n                        nv = window.luckysheet_function.MAX.f({\"data\":dataformat});\r\n                    }\r\n                    else if(normalValue==\"avg\" || normalValue==\"mean\"){\r\n                        nv = window.luckysheet_function.AVERAGE.f({\"data\":dataformat});\r\n                    }\r\n                    else if(normalValue==\"median\"){\r\n                        nv = window.luckysheet_function.MEDIAN.f({\"data\":dataformat});\r\n                    }\r\n\r\n                    if(!!nv){\r\n                        sparksetting[\"normalRangeMin\"] = nv;\r\n                        sparksetting[\"normalRangeMax\"] = nv;\r\n                    }\r\n                }\r\n                else{\r\n                    sparksetting[\"normalRangeMin\"] = normalValue;\r\n                    sparksetting[\"normalRangeMax\"] = normalValue;\r\n                }\r\n\r\n            }\r\n\r\n            if(normalColor==null){\r\n                normalColor = \"#000\";\r\n            }\r\n            sparkColorSetting(\"normalRangeColor\", normalColor);\r\n\r\n            // sparkColorSetting(\"maxSpotColor\", maxSpot);\r\n            // sparkColorSetting(\"minSpotColor\", minSpot);\r\n\r\n            // if(spotRadius==null){\r\n            //     spotRadius = \"1.5\";\r\n            // }\r\n            // sparksetting[\"spotRadius\"] = spotRadius;\r\n\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n            // {\r\n            //     height:rowlen,\r\n            //     width:firstcolumnlen,\r\n            //     normalRangeMin:6,\r\n            //     normalRangeMax:6,\r\n            //     normalRangeColor:\"#000\"\r\n            // }\r\n            //return \"\";\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"COLUMNSPLINES\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //色表，接下来会用到\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //定义需要格式化data数据\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //开始进行sparklines的详细设置，宽和高为单元格的宽高。\r\n            var sparksetting = {};\r\n\r\n            //设置sparklines图表的宽高，线图的高会随着粗细而超出单元格高度，所以减去一个量，设置offsetY或者offsetX为渲染偏移量，传给luckysheetDrawMain使用。默认为0。=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //定义sparklines的通用色彩设置函数，可以设置 色表【colorList】索引数值 或者 具体颜色值\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var barSpacing = arguments[1];\r\n            var barColor = arguments[2];\r\n            var negBarColor = arguments[3];\r\n            var chartRangeMax = arguments[4];\r\n\r\n            ////具体实现\r\n            sparksetting[\"type\"] = \"column\";\r\n            if(barSpacing==null){\r\n                barSpacing = \"1\";\r\n            }\r\n            sparksetting[\"barSpacing\"] = barSpacing;\r\n\r\n            if(barColor==null){\r\n                barColor = \"#fc5c5c\";\r\n            }\r\n            sparkColorSetting(\"barColor\", barColor);\r\n\r\n            if(negBarColor==null){\r\n                negBarColor = \"#97b552\";\r\n            }\r\n            sparkColorSetting(\"negBarColor\", negBarColor);\r\n\r\n            if(chartRangeMax==null || chartRangeMax===false || typeof chartRangeMax !=\"number\" ){\r\n                sparksetting[\"chartRangeMax\"] = undefined;\r\n            }\r\n            else{\r\n                sparksetting[\"chartRangeMax\"] = chartRangeMax;\r\n            }\r\n\r\n            var colorLists = formula.sparklinesColorMap(arguments);\r\n            if(!!colorLists){\r\n                sparksetting[\"colorMap\"] = colorLists;\r\n            }\r\n            ////具体实现\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STACKCOLUMNSPLINES\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //色表，接下来会用到\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //定义需要格式化data数据\r\n            //var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            var dataformat = [];\r\n\r\n            var data = [];\r\n            if(rangeValue!=null && rangeValue.data!=null){\r\n                data = rangeValue.data;\r\n            }\r\n\r\n            if(getObjType(data) == \"array\"){\r\n                data = formula.getPureValueByData(data);\r\n            }\r\n            else if(getObjType(data) == \"object\"){\r\n                data = data.v;\r\n\r\n                return [data];\r\n            }\r\n            else{\r\n                if(/\\{.*?\\}/.test(data)){\r\n                    data = data.replace(/\\{/g, \"[\").replace(/\\}/g, \"]\");\r\n                }\r\n                data = new Function(\"return \" + data)();\r\n            }\r\n\r\n            var stackconfig = arguments[1];\r\n            var offsetY = data.length;\r\n            if(stackconfig==null || !!stackconfig){\r\n                for(var c=0;c<data[0].length;c++){\r\n                    var colstr = \"\";\r\n                    for(var r=0;r<data.length;r++){\r\n                        colstr += data[r][c] + \":\";\r\n                    }\r\n                    colstr = colstr.substr(0, colstr.length-1);\r\n                    dataformat.push(colstr);\r\n                }\r\n            }\r\n            else{\r\n                for(var r=0;r<data.length;r++){\r\n                    var rowstr = \"\";\r\n                    for(var c=0;c<data[0].length;c++){\r\n                        rowstr += data[r][c] + \":\";\r\n                    }\r\n                    rowstr = rowstr.substr(0, rowstr.length-1);\r\n                    dataformat.push(rowstr);\r\n                }\r\n                var offsetY = data[0].length;\r\n            }\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n            //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //开始进行sparklines的详细设置，宽和高为单元格的宽高。\r\n            var sparksetting = {};\r\n\r\n            //设置sparklines图表的宽高，线图的高会随着粗细而超出单元格高度，所以减去一个量，设置offsetY或者offsetX为渲染偏移量，传给luckysheetDrawMain使用。默认为0。=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n            //sparksetting.offsetY = offsetY;\r\n\r\n            //定义sparklines的通用色彩设置函数，可以设置 色表【colorList】索引数值 或者 具体颜色值\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var barSpacing = arguments[2];\r\n            var chartRangeMax = arguments[3];\r\n\r\n            ////具体实现\r\n            sparksetting[\"type\"] = \"column\";\r\n            if(barSpacing==null){\r\n                barSpacing = \"1\";\r\n            }\r\n            sparksetting[\"barSpacing\"] = barSpacing;\r\n\r\n            if(chartRangeMax==null || chartRangeMax===false || typeof chartRangeMax !=\"number\" ){\r\n                sparksetting[\"chartRangeMax\"] = undefined;\r\n            }\r\n            else{\r\n                sparksetting[\"chartRangeMax\"] = chartRangeMax;\r\n            }\r\n\r\n            var colorLists = formula.sparklinesColorMap(arguments, 4);\r\n            if(!!colorLists){\r\n                sparksetting[\"colorMap\"] = colorLists;\r\n            }\r\n            ////具体实现\r\n\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BARSPLINES\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //色表，接下来会用到\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //定义需要格式化data数据\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //开始进行sparklines的详细设置，宽和高为单元格的宽高。\r\n            var sparksetting = {};\r\n\r\n            //设置sparklines图表的宽高，线图的高会随着粗细而超出单元格高度，所以减去一个量，设置offsetY或者offsetX为渲染偏移量，传给luckysheetDrawMain使用。默认为0。=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //定义sparklines的通用色彩设置函数，可以设置 色表【colorList】索引数值 或者 具体颜色值\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var barSpacing = arguments[1];\r\n            var barColor = arguments[2];\r\n            var negBarColor = arguments[3];\r\n            var chartRangeMax = arguments[4];\r\n\r\n            ////具体实现\r\n            sparksetting[\"type\"] = \"bar\";\r\n            if(barSpacing==null){\r\n                barSpacing = \"1\";\r\n            }\r\n            sparksetting[\"barSpacing\"] = barSpacing;\r\n\r\n            if(barColor==null){\r\n                barColor = \"#fc5c5c\";\r\n            }\r\n            sparkColorSetting(\"barColor\", barColor);\r\n\r\n            if(negBarColor==null){\r\n                negBarColor = \"#97b552\";\r\n            }\r\n            sparkColorSetting(\"negBarColor\", negBarColor);\r\n\r\n            if(chartRangeMax==null || chartRangeMax===false || typeof chartRangeMax !=\"number\" ){\r\n                sparksetting[\"chartRangeMax\"] = undefined;\r\n            }\r\n            else{\r\n                sparksetting[\"chartRangeMax\"] = chartRangeMax;\r\n            }\r\n\r\n            var colorLists = formula.sparklinesColorMap(arguments);\r\n            if(!!colorLists){\r\n                sparksetting[\"colorMap\"] = colorLists;\r\n            }\r\n            ////具体实现\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"STACKBARSPLINES\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //色表，接下来会用到\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //定义需要格式化data数据\r\n            //var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            var dataformat = [];\r\n\r\n            var data = [];\r\n            if(rangeValue!=null && rangeValue.data!=null){\r\n                data = rangeValue.data;\r\n            }\r\n\r\n            if(getObjType(data) == \"array\"){\r\n                data = formula.getPureValueByData(data);\r\n            }\r\n            else if(getObjType(data) == \"object\"){\r\n                data = data.v;\r\n                return [data];\r\n            }\r\n            else{\r\n                if(/\\{.*?\\}/.test(data)){\r\n                    data = data.replace(/\\{/g, \"[\").replace(/\\}/g, \"]\");\r\n                }\r\n                data = new Function(\"return \" + data)();\r\n            }\r\n\r\n            var stackconfig = arguments[1];\r\n            var offsetY = data.length;\r\n            if(stackconfig==null || !!stackconfig){\r\n                for(var c=0;c<data[0].length;c++){\r\n                    var colstr = \"\";\r\n                    for(var r=0;r<data.length;r++){\r\n                        colstr += data[r][c] + \":\";\r\n                    }\r\n                    colstr = colstr.substr(0, colstr.length-1);\r\n                    dataformat.push(colstr);\r\n                }\r\n            }\r\n            else{\r\n                for(var r=0;r<data.length;r++){\r\n                    var rowstr = \"\";\r\n                    for(var c=0;c<data[0].length;c++){\r\n                        rowstr += data[r][c] + \":\";\r\n                    }\r\n                    rowstr = rowstr.substr(0, rowstr.length-1);\r\n                    dataformat.push(rowstr);\r\n                }\r\n                var offsetY = data[0].length;\r\n            }\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n            //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //开始进行sparklines的详细设置，宽和高为单元格的宽高。\r\n            var sparksetting = {};\r\n\r\n            //设置sparklines图表的宽高，线图的高会随着粗细而超出单元格高度，所以减去一个量，设置offsetY或者offsetX为渲染偏移量，传给luckysheetDrawMain使用。默认为0。=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n            //sparksetting.offsetY = offsetY;\r\n\r\n            //定义sparklines的通用色彩设置函数，可以设置 色表【colorList】索引数值 或者 具体颜色值\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var barSpacing = arguments[2];\r\n            var chartRangeMax = arguments[3];\r\n\r\n            ////具体实现\r\n            sparksetting[\"type\"] = \"bar\";\r\n            if(barSpacing==null){\r\n                barSpacing = \"1\";\r\n            }\r\n            sparksetting[\"barSpacing\"] = barSpacing;\r\n\r\n            if(chartRangeMax==null || chartRangeMax===false || typeof chartRangeMax !=\"number\" ){\r\n                sparksetting[\"chartRangeMax\"] = undefined;\r\n            }\r\n            else{\r\n                sparksetting[\"chartRangeMax\"] = chartRangeMax;\r\n            }\r\n\r\n            var colorLists = formula.sparklinesColorMap(arguments, 4);\r\n            if(!!colorLists){\r\n                sparksetting[\"colorMap\"] = colorLists;\r\n            }\r\n            ////具体实现\r\n\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"DISCRETESPLINES\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //色表，接下来会用到\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //定义需要格式化data数据\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //开始进行sparklines的详细设置，宽和高为单元格的宽高。\r\n            var sparksetting = {};\r\n\r\n            //设置sparklines图表的宽高，线图的高会随着粗细而超出单元格高度，所以减去一个量，设置offsetY或者offsetX为渲染偏移量，传给luckysheetDrawMain使用。默认为0。=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //定义sparklines的通用色彩设置函数，可以设置 色表【colorList】索引数值 或者 具体颜色值\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var thresholdValue = arguments[1];\r\n            var barColor = arguments[2];\r\n            var negBarColor = arguments[3];\r\n\r\n            ////具体实现\r\n            sparksetting[\"type\"] = \"discrete\";\r\n\r\n            if(thresholdValue==null){\r\n                thresholdValue = 0;\r\n            }\r\n            sparksetting[\"thresholdValue\"] = thresholdValue;\r\n\r\n            if(barColor==null){\r\n                barColor = \"#2ec7c9\";\r\n            }\r\n            sparkColorSetting(\"lineColor\", barColor);\r\n\r\n            if(negBarColor==null){\r\n                negBarColor = \"#fc5c5c\";\r\n            }\r\n            sparkColorSetting(\"thresholdColor\", negBarColor);\r\n            ////具体实现\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"TRISTATESPLINES\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //色表，接下来会用到\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //定义需要格式化data数据\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //开始进行sparklines的详细设置，宽和高为单元格的宽高。\r\n            var sparksetting = {};\r\n\r\n            //设置sparklines图表的宽高，线图的高会随着粗细而超出单元格高度，所以减去一个量，设置offsetY或者offsetX为渲染偏移量，传给luckysheetDrawMain使用。默认为0。=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //定义sparklines的通用色彩设置函数，可以设置 色表【colorList】索引数值 或者 具体颜色值\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var barSpacing = arguments[1];\r\n            var barColor = arguments[2];\r\n            var negBarColor = arguments[3];\r\n            var zeroBarColor = arguments[4];\r\n\r\n            ////具体实现\r\n            sparksetting[\"type\"] = \"tristate\";\r\n            if(barSpacing==null){\r\n                barSpacing = \"1\";\r\n            }\r\n            sparksetting[\"barSpacing\"] = barSpacing;\r\n\r\n            if(barColor==null){\r\n                barColor = \"#fc5c5c\";\r\n            }\r\n            sparkColorSetting(\"barColor\", barColor);\r\n\r\n            if(negBarColor==null){\r\n                negBarColor = \"#97b552\";\r\n            }\r\n            sparkColorSetting(\"negBarColor\", negBarColor);\r\n\r\n            if(zeroBarColor==null){\r\n                zeroBarColor = \"#999\";\r\n            }\r\n            sparkColorSetting(\"zeroBarColor\", zeroBarColor);\r\n\r\n            var colorLists = formula.sparklinesColorMap(arguments);\r\n            if(!!colorLists){\r\n                sparksetting[\"colorMap\"] = colorLists;\r\n            }\r\n            ////具体实现\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"PIESPLINES\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //色表，接下来会用到\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //定义需要格式化data数据\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //开始进行sparklines的详细设置，宽和高为单元格的宽高。\r\n            var sparksetting = {};\r\n\r\n            //设置sparklines图表的宽高，线图的高会随着粗细而超出单元格高度，所以减去一个量，设置offsetY或者offsetX为渲染偏移量，传给luckysheetDrawMain使用。默认为0。=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //定义sparklines的通用色彩设置函数，可以设置 色表【colorList】索引数值 或者 具体颜色值\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var offset = arguments[1];\r\n            var borderWidth = arguments[2];\r\n            var borderColor = arguments[3];\r\n\r\n            ////具体实现\r\n            sparksetting[\"type\"] = \"pie\";\r\n            if(offset==null){\r\n                offset = 0;\r\n            }\r\n            sparksetting[\"offset\"] = offset;\r\n\r\n            if(borderWidth==null){\r\n                borderWidth = 0;\r\n            }\r\n            sparkColorSetting(\"borderWidth\", borderWidth);\r\n\r\n            if(borderColor==null){\r\n                borderColor = \"#97b552\";\r\n            }\r\n            sparkColorSetting(\"borderColor\", borderColor);\r\n\r\n            var colorLists = formula.sparklinesColorMap(arguments, 4);\r\n            if(!!colorLists){\r\n                sparksetting[\"colorMap\"] = colorLists;\r\n            }\r\n            ////具体实现\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BOXSPLINES\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //色表，接下来���用到\r\n            var colorList = formula.colorList;\r\n            var rangeValue = arguments[0];\r\n\r\n            //定义需要格式化data数据\r\n            var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //开始进行sparklines的详细设置，宽和高为单元格的宽高。\r\n            var sparksetting = {};\r\n\r\n            //设置sparklines图表的宽高，线图的高会随着粗细而超出单元格高度，所以减去一个量，设置offsetY或者offsetX为渲染偏移量，传给luckysheetDrawMain使用。默认为0。=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //定义sparklines的通用色彩设置函数，可以设置 色表【colorList】索引数值 或者 具体颜色值\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            var outlierIQR = arguments[1];\r\n            var target = arguments[2];\r\n            var spotRadius = arguments[3];\r\n\r\n            ////具体实现\r\n            sparksetting[\"type\"] = \"box\";\r\n            if(outlierIQR==null){\r\n                outlierIQR = 1.5;\r\n            }\r\n            sparksetting[\"outlierIQR\"] = outlierIQR;\r\n\r\n            if(target==null){\r\n                target = 0;\r\n            }\r\n            else{\r\n                sparkColorSetting(\"target\", target);\r\n            }\r\n\r\n            if(spotRadius==null){\r\n                spotRadius = 1.5;\r\n            }\r\n            sparkColorSetting(\"spotRadius\", spotRadius);\r\n            ////具体实现\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"BULLETSPLINES\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var cell_fp = window.luckysheetCurrentFunction;\r\n            //色表，接下来会用到\r\n            var colorList = formula.colorList;\r\n            //var rangeValue = arguments[0];\r\n\r\n            //定义需要格式化data数据\r\n            //var dataformat = formula.readCellDataToOneArray(rangeValue);\r\n\r\n            let luckysheetfile = getluckysheetfile();\r\n            let index = getSheetIndex(Store.calculateSheetIndex);\r\n            let sheetdata = luckysheetfile[index].data;\r\n\r\n            //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题\r\n            var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);\r\n            var width = cellSize[0];\r\n            var height = cellSize[1];\r\n\r\n            //开始进行sparklines的详细设置，宽和高为单元格的宽高。\r\n            var sparksetting = {};\r\n\r\n            //设置sparklines图表的宽高，线图的高会随着粗细而超出单元格高度，所以减去一个量，设置offsetY或者offsetX为渲染偏移量，传给luckysheetDrawMain使用。默认为0。=LINESPLINES(D9:E24,3,5)\r\n            sparksetting.height = height;\r\n            sparksetting.width = width;\r\n\r\n            //定义sparklines的通用色彩设置函数，可以设置 色表【colorList】索引数值 或者 具体颜色值\r\n            var sparkColorSetting = function(attr, value){\r\n                if(!!value){\r\n                    if(typeof(value)==\"number\"){\r\n                        if(value>19){\r\n                            value = value % 20;\r\n                        }\r\n                        value = colorList[value];\r\n                    }\r\n                    sparksetting[attr] = value;\r\n                }\r\n            }\r\n\r\n            ////具体实现\r\n            var dataformat = [];\r\n            luckysheet_getValue(arguments);\r\n\r\n            var data1 = formula.getValueByFuncData(arguments[0]);\r\n            var data2 = formula.getValueByFuncData(arguments[1]);\r\n\r\n            dataformat.push(data1);\r\n            dataformat.push(data2);\r\n\r\n            for(var i=2;i<arguments.length;i++){\r\n                dataformat.push(formula.getValueByFuncData(arguments[i]));\r\n            }\r\n\r\n            sparksetting[\"type\"] = \"bullet\";\r\n            ////具体实现\r\n\r\n            var temp1 = luckysheetSparkline.init(dataformat, sparksetting);\r\n\r\n            return temp1;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    //动态数组公式\r\n    \"SORT\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要排序的范围或数组\r\n            var data_array = arguments[0];\r\n            var array = [], rowlen = 1, collen = 1;\r\n\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_array)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    for(var i = 0; i < data_array.length; i++){\r\n                        var rowArr = [];\r\n\r\n                        for(var j = 0; j < data_array[i].length; j++){\r\n                            var number = data_array[i][j];\r\n\r\n                            rowArr.push(number);\r\n                        }\r\n\r\n                        array.push(rowArr);\r\n                    }\r\n\r\n                    rowlen = array.length;\r\n                    collen = array[0].length;\r\n                }\r\n                else{\r\n                    for(var i = 0; i < data_array.length; i++){\r\n                        var number = data_array[i];\r\n\r\n                        array.push(number);\r\n                    }\r\n\r\n                    rowlen = array.length;\r\n                }\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                if(data_array.data != null){\r\n                    if(getObjType(data_array.data) == \"array\"){\r\n                        for(var i = 0; i < data_array.data.length; i++){\r\n                            var rowArr = [];\r\n\r\n                            for(var j = 0; j < data_array.data[i].length; j++){\r\n                                if(data_array.data[i][j] != null){\r\n                                    var number = data_array.data[i][j].v;\r\n\r\n                                    if(isRealNull(number)){\r\n                                        number = 0;\r\n                                    }\r\n\r\n                                    rowArr.push(number);\r\n                                }\r\n                                else{\r\n                                    rowArr.push(0);\r\n                                }\r\n                            }\r\n\r\n                            array.push(rowArr);\r\n                        }\r\n\r\n                        rowlen = array.length;\r\n                        collen = array[0].length;\r\n                    }\r\n                    else{\r\n                        var number = data_array.data.v;\r\n\r\n                        if(isRealNull(number)){\r\n                            number = 0;\r\n                        }\r\n\r\n                        array.push(number);\r\n                    }\r\n                }\r\n                else{\r\n                    array.push(0);\r\n                }\r\n            }\r\n            else{\r\n                var number = data_array;\r\n\r\n                array.push(number);\r\n            }\r\n\r\n            //表示要排序的行或列的数字（默认row1/col1）\r\n            var sort_index = 1;\r\n            if(arguments.length >= 2){\r\n                sort_index = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(sort_index)){\r\n                    return sort_index;\r\n                }\r\n\r\n                if(!isRealNum(sort_index)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                sort_index = parseInt(sort_index);\r\n            }\r\n\r\n            //表示所需排序顺序的数字；1表示升序（默认），-1表示降序。\r\n            var sort_order = 1;\r\n            if(arguments.length >= 3){\r\n                sort_order = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(sort_order)){\r\n                    return sort_order;\r\n                }\r\n\r\n                if(!isRealNum(sort_order)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                sort_order = Math.floor(parseFloat(sort_order));\r\n            }\r\n\r\n            //表示所需排序方向的逻辑值；按行排序为FALSE（默认），按列排序为TRUE。\r\n            var by_col = false;\r\n            if(arguments.length == 4){\r\n                by_col = func_methods.getCellBoolen(arguments[3]);\r\n\r\n                if(valueIsError(by_col)){\r\n                    return by_col;\r\n                }\r\n            }\r\n\r\n            if(by_col){\r\n                if(sort_index < 1 || sort_index > rowlen){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n            else{\r\n                if(sort_index < 1 || sort_index > collen){\r\n                    return formula.error.v;\r\n                }\r\n            }\r\n\r\n            if(sort_order != 1 && sort_order != -1){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            var asc = function(x, y){\r\n                if(getObjType(x) == \"array\"){\r\n                    x = x[sort_index - 1];\r\n                }\r\n\r\n                if(getObjType(y) == \"array\"){\r\n                    y = y[sort_index - 1];\r\n                }\r\n\r\n                if(!isNaN(x) && !isNaN(y)){\r\n                    return x - y;\r\n                }\r\n                else if(!isNaN(x)){\r\n                    return -1;\r\n                }\r\n                else if(!isNaN(y)){\r\n                    return 1;\r\n                }\r\n                else{\r\n                    if(x > y){\r\n                        return 1;\r\n                    }\r\n                    else if(x < y){\r\n                        return -1;\r\n                    }\r\n                }\r\n            }\r\n\r\n            var desc = function(x, y){\r\n                if(getObjType(x) == \"array\"){\r\n                    x = x[sort_index - 1];\r\n                }\r\n\r\n                if(getObjType(y) == \"array\"){\r\n                    y = y[sort_index - 1];\r\n                }\r\n\r\n                if(!isNaN(x) && !isNaN(y)){\r\n                    return y - x;\r\n                }\r\n                else if(!isNaN(x)){\r\n                    return 1;\r\n                }\r\n                else if(!isNaN(y)){\r\n                    return -1;\r\n                }\r\n                else{\r\n                    if(x > y){\r\n                        return -1;\r\n                    }\r\n                    else if(x < y){\r\n                        return 1;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(by_col){\r\n                array = array[0].map(function(col, a){\r\n                    return array.map(function(row){\r\n                        return row[a];\r\n                    });\r\n                });\r\n\r\n                if(sort_order == 1){\r\n                    array.sort(asc);\r\n                }\r\n\r\n                if(sort_order == -1){\r\n                    array.sort(desc);\r\n                }\r\n\r\n                array = array[0].map(function(col, b){\r\n                    return array.map(function(row){\r\n                        return row[b];\r\n                    });\r\n                });\r\n            }\r\n            else{\r\n                if(sort_order == 1){\r\n                    array.sort(asc);\r\n                }\r\n\r\n                if(sort_order == -1){\r\n                    array.sort(desc);\r\n                }\r\n            }\r\n\r\n            return array;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"FILTER\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要筛选的数组或范围\r\n            var data_array = arguments[0];\r\n            var array = [];\r\n\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array = func_methods.getDataDyadicArr(data_array);\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                array = func_methods.getCellDataDyadicArr(data_array, \"number\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n\r\n                rowArr.push(parseFloat(data_array));\r\n\r\n                array.push(rowArr);\r\n            }\r\n\r\n            var rowlen = array.length,\r\n                collen = array[0].length;\r\n\r\n            //布尔数组，其高度或宽度与数组相同\r\n            var data_include = arguments[1];\r\n            var include = [];\r\n            var type = \"row\"; //筛选方式 row - 行，col - 列\r\n\r\n            if(getObjType(data_include) == \"array\"){\r\n                if(getObjType(data_include[0]) == \"array\"){\r\n                    if(!func_methods.isDyadicArr(data_include)){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    if(data_include.length > 1 && data_include[0].length > 1){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    if(data_include.length > 1){\r\n                        if(data_include.length != array.length){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        type = \"row\";\r\n\r\n                        for(var i = 0; i < data_include.length; i++){\r\n                            var txt = data_include[i][0];\r\n\r\n                            if(getObjType(txt) == \"boolean\"){\r\n\r\n                            }\r\n                            else if(getObjType(txt) == \"string\" && (txt.toLowerCase() == \"true\" || txt.toLowerCase() == \"false\")){\r\n                                if(txt.toLowerCase() == \"true\"){\r\n                                    txt = true;\r\n                                }\r\n                                else if(txt.toLowerCase() == \"false\"){\r\n                                    txt = false;\r\n                                }\r\n                            }\r\n                            else if(isRealNum(txt)){\r\n                                txt = parseFloat(txt);\r\n\r\n                                txt = txt == 0 ? false : true;\r\n                            }\r\n                            else{\r\n                                return formula.error.v;\r\n                            }\r\n\r\n                            include.push(txt);\r\n                        }\r\n                    }\r\n\r\n                    if(data_include[0].length > 1){\r\n                        if(data_include[0].length != array[0].length){\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        type = \"col\";\r\n\r\n                        for(var i = 0; i < data_include[0].length; i++){\r\n                            var txt = data_include[0][i];\r\n\r\n                            if(getObjType(txt) == \"boolean\"){\r\n\r\n                            }\r\n                            else if(getObjType(txt) == \"string\" && (txt.toLowerCase() == \"true\" || txt.toLowerCase() == \"false\")){\r\n                                if(txt.toLowerCase() == \"true\"){\r\n                                    txt = true;\r\n                                }\r\n                                else if(txt.toLowerCase() == \"false\"){\r\n                                    txt = false;\r\n                                }\r\n                            }\r\n                            else if(isRealNum(txt)){\r\n                                txt = parseFloat(txt);\r\n\r\n                                txt = txt == 0 ? false : true;\r\n                            }\r\n                            else{\r\n                                return formula.error.v;\r\n                            }\r\n\r\n                            include.push(txt);\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    if(data_include.length != array[0].length){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    type = \"col\";\r\n\r\n                    for(var i = 0; i < data_include.length; i++){\r\n                        var txt = data_include[i];\r\n\r\n                        if(getObjType(txt) == \"boolean\"){\r\n\r\n                        }\r\n                        else if(getObjType(txt) == \"string\" && (txt.toLowerCase() == \"true\" || txt.toLowerCase() == \"false\")){\r\n                            if(txt.toLowerCase() == \"true\"){\r\n                                txt = true;\r\n                            }\r\n                            else if(txt.toLowerCase() == \"false\"){\r\n                                txt = false;\r\n                            }\r\n                        }\r\n                        else if(isRealNum(txt)){\r\n                            txt = parseFloat(txt);\r\n\r\n                            txt = txt == 0 ? false : true;\r\n                        }\r\n                        else{\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        include.push(txt);\r\n                    }\r\n                }\r\n            }\r\n            else if(getObjType(data_include) == \"object\" && data_include.data != null && getObjType(data_include.data) == \"array\"){\r\n                if(data_include.data.length > 1 && data_include.data[0].length > 1){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                if(data_include.data.length > 1){\r\n                    if(data_include.data.length != array.length){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    type = \"row\";\r\n\r\n                    for(var i = 0; i < data_include.data.length; i++){\r\n                        var txt = data_include.data[i][0].v;\r\n\r\n                        if(isRealNull(txt)){\r\n                            txt = 0;\r\n                        }\r\n\r\n                        if(getObjType(txt) == \"boolean\"){\r\n\r\n                        }\r\n                        else if(getObjType(txt) == \"string\" && (txt.toLowerCase() == \"true\" || txt.toLowerCase() == \"false\")){\r\n                            if(txt.toLowerCase() == \"true\"){\r\n                                txt = true;\r\n                            }\r\n                            else if(txt.toLowerCase() == \"false\"){\r\n                                txt = false;\r\n                            }\r\n                        }\r\n                        else if(isRealNum(txt)){\r\n                            txt = parseFloat(txt);\r\n\r\n                            txt = txt == 0 ? false : true;\r\n                        }\r\n                        else{\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        include.push(txt);\r\n                    }\r\n                }\r\n\r\n                if(data_include.data[0].length > 1){\r\n                    if(data_include.data[0].length != array[0].length){\r\n                        return formula.error.v;\r\n                    }\r\n\r\n                    type = \"col\";\r\n\r\n                    for(var i = 0; i < data_include.data[0].length; i++){\r\n                        var txt = data_include.data[0][i].v;\r\n\r\n                        if(isRealNull(txt)){\r\n                            txt = 0;\r\n                        }\r\n\r\n                        if(getObjType(txt) == \"boolean\"){\r\n\r\n                        }\r\n                        else if(getObjType(txt) == \"string\" && (txt.toLowerCase() == \"true\" || txt.toLowerCase() == \"false\")){\r\n                            if(txt.toLowerCase() == \"true\"){\r\n                                txt = true;\r\n                            }\r\n                            else if(txt.toLowerCase() == \"false\"){\r\n                                txt = false;\r\n                            }\r\n                        }\r\n                        else if(isRealNum(txt)){\r\n                            txt = parseFloat(txt);\r\n\r\n                            txt = txt == 0 ? false : true;\r\n                        }\r\n                        else{\r\n                            return formula.error.v;\r\n                        }\r\n\r\n                        include.push(txt);\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                return formula.error.v;\r\n            }\r\n\r\n            //如果包含数组中的所有值都为空(filter不返回任何值)，则返回的值\r\n            var if_empty = \"\";\r\n            if(arguments.length == 3){\r\n                if_empty = func_methods.getFirstValue(arguments[2], \"text\");\r\n                if(valueIsError(if_empty)){\r\n                    return if_empty;\r\n                }\r\n            }\r\n\r\n            //计算\r\n            var result = [];\r\n            if(type == \"row\"){\r\n                for(var i = 0; i < array.length; i++){\r\n                    if(include[i]){\r\n                        result.push(array[i]);\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                for(var i = 0; i < array.length; i++){\r\n                    var rowArr = [];\r\n\r\n                    for(var j = 0; j < array[0].length; j++){\r\n                        if(include[j]){\r\n                            rowArr.push(array[i][j]);\r\n                        }\r\n                    }\r\n\r\n                    if(rowArr.length > 0){\r\n                        result.push(rowArr);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(result.length == 0){\r\n                return if_empty;\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"UNIQUE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //从其返回唯一值的数组或区域\r\n            var data_array = arguments[0];\r\n            var array = [];\r\n\r\n            if(getObjType(data_array) == \"array\"){\r\n                if(getObjType(data_array[0]) == \"array\" && !func_methods.isDyadicArr(data_array)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                array = func_methods.getDataDyadicArr(data_array);\r\n            }\r\n            else if(getObjType(data_array) == \"object\" && data_array.startCell != null){\r\n                array = func_methods.getCellDataDyadicArr(data_array, \"number\");\r\n            }\r\n            else{\r\n                var rowArr = [];\r\n\r\n                rowArr.push(parseFloat(data_array));\r\n\r\n                array.push(rowArr);\r\n            }\r\n\r\n            //逻辑值，指示如何比较；按行 = FALSE 或省略；按列 = TRUE\r\n            var by_col = false;\r\n            if(arguments.length >= 2){\r\n                by_col = func_methods.getCellBoolen(arguments[1]);\r\n\r\n                if(valueIsError(by_col)){\r\n                    return by_col;\r\n                }\r\n            }\r\n\r\n            //逻辑值，仅返回唯一值中出现一次 = TRUE；包括所有唯一值 = FALSE 或省略\r\n            var occurs_once = false;\r\n            if(arguments.length == 3){\r\n                occurs_once = func_methods.getCellBoolen(arguments[2]);\r\n\r\n                if(valueIsError(occurs_once)){\r\n                    return occurs_once;\r\n                }\r\n            }\r\n\r\n            //计算\r\n            if(by_col){\r\n                array = array[0].map(function(col, a){\r\n                    return array.map(function(row){\r\n                        return row[a];\r\n                    });\r\n                });\r\n\r\n                var strObj = {}, strArr = [];\r\n                var allUnique = [];\r\n\r\n                for(var i = 0; i < array.length; i++){\r\n                    var str = '';\r\n\r\n                    for(var j = 0; j < array[i].length; j++){\r\n                        str += array[i][j].toString() + \"|||\";\r\n                    }\r\n\r\n                    strArr.push(str);\r\n\r\n                    if(!(str in strObj)){\r\n                        strObj[str] = 0;\r\n\r\n                        allUnique.push(array[i]);\r\n                    }\r\n                }\r\n\r\n                if(occurs_once){\r\n                    var oneUnique = [];\r\n\r\n                    for(var i = 0; i < strArr.length; i++){\r\n                        if(strArr.indexOf(strArr[i]) == strArr.lastIndexOf(strArr[i])){\r\n                            oneUnique.push(array[i]);\r\n                        }\r\n                    }\r\n\r\n                    oneUnique = oneUnique[0].map(function(col, a){\r\n                        return oneUnique.map(function(row){\r\n                            return row[a];\r\n                        });\r\n                    });\r\n\r\n                    return oneUnique;\r\n                }\r\n                else{\r\n                    allUnique = allUnique[0].map(function(col, a){\r\n                        return allUnique.map(function(row){\r\n                            return row[a];\r\n                        });\r\n                    });\r\n\r\n                    return allUnique;\r\n                }\r\n            }\r\n            else{\r\n                var strObj = {}, strArr = [];\r\n                var allUnique = [];\r\n\r\n                for(var i = 0; i < array.length; i++){\r\n                    var str = '';\r\n\r\n                    for(var j = 0; j < array[i].length; j++){\r\n                        str += array[i][j].toString() + \"|||\";\r\n                    }\r\n\r\n                    strArr.push(str);\r\n\r\n                    if(!(str in strObj)){\r\n                        strObj[str] = 0;\r\n\r\n                        allUnique.push(array[i]);\r\n                    }\r\n                }\r\n\r\n                if(occurs_once){\r\n                    var oneUnique = [];\r\n\r\n                    for(var i = 0; i < strArr.length; i++){\r\n                        if(strArr.indexOf(strArr[i]) == strArr.lastIndexOf(strArr[i])){\r\n                            oneUnique.push(array[i]);\r\n                        }\r\n                    }\r\n\r\n                    return oneUnique;\r\n                }\r\n                else{\r\n                    return allUnique;\r\n                }\r\n            }\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"RANDARRAY\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要返回的行数\r\n            var rows = 1;\r\n            if(arguments.length >= 1){\r\n                rows = func_methods.getFirstValue(arguments[0]);\r\n                if(valueIsError(rows)){\r\n                    return rows;\r\n                }\r\n\r\n                if(!isRealNum(rows)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                rows = parseInt(rows);\r\n            }\r\n\r\n            //要返回的列数\r\n            var cols = 1;\r\n            if(arguments.length == 2){\r\n                cols = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(cols)){\r\n                    return cols;\r\n                }\r\n\r\n                if(!isRealNum(cols)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                cols = parseInt(cols);\r\n            }\r\n\r\n            if(rows <= 0 || cols <= 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            var result = [];\r\n\r\n            for(var i = 0; i < rows; i++){\r\n                var result_row = [];\r\n\r\n                for(var j = 0; j < cols; j++){\r\n                    result_row.push(Math.random().toFixed(9));\r\n                }\r\n\r\n                result.push(result_row);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"SEQUENCE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            //要返回的行数\r\n            var rows = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(rows)){\r\n                return rows;\r\n            }\r\n\r\n            if(!isRealNum(rows)){\r\n                return formula.error.v;\r\n            }\r\n\r\n            rows = parseInt(rows);\r\n\r\n            //要返回的列数\r\n            var cols = 1;\r\n            if(arguments.length >= 2){\r\n                cols = func_methods.getFirstValue(arguments[1]);\r\n                if(valueIsError(cols)){\r\n                    return cols;\r\n                }\r\n\r\n                if(!isRealNum(cols)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                cols = parseInt(cols);\r\n            }\r\n\r\n            //序列中的第一个数字\r\n            var start = 1;\r\n            if(arguments.length >= 3){\r\n                start = func_methods.getFirstValue(arguments[2]);\r\n                if(valueIsError(start)){\r\n                    return start;\r\n                }\r\n\r\n                if(!isRealNum(start)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                start = parseFloat(start);\r\n            }\r\n\r\n            //序列中每个序列值的增量\r\n            var step = 1;\r\n            if(arguments.length == 4){\r\n                step = func_methods.getFirstValue(arguments[3]);\r\n                if(valueIsError(step)){\r\n                    return step;\r\n                }\r\n\r\n                if(!isRealNum(step)){\r\n                    return formula.error.v;\r\n                }\r\n\r\n                step = parseFloat(step);\r\n            }\r\n\r\n            if(rows <= 0 || cols <= 0){\r\n                return formula.error.v;\r\n            }\r\n\r\n            //计算\r\n            var result = [];\r\n\r\n            for(var i = 0; i < rows; i++){\r\n                var result_row = [];\r\n\r\n                for(var j = 0; j < cols; j++){\r\n                    var number = start + step * (j + cols * i);\r\n                    result_row.push(number);\r\n                }\r\n\r\n                result.push(result_row);\r\n            }\r\n\r\n            return result;\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"EVALUATE\": function() {\r\n        //必要参数个数错误检测\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        //参数类型错误检测\r\n        for (var i = 0; i < arguments.length; i++) {\r\n            var p = formula.errorParamCheck(this.p, arguments[i], i);\r\n\r\n            if (!p[0]) {\r\n                return formula.error.v;\r\n            }\r\n        }\r\n\r\n        try {\r\n            var cell_r = window.luckysheetCurrentRow;\r\n            var cell_c = window.luckysheetCurrentColumn;\r\n            var sheetindex_now = window.luckysheetCurrentIndex;\r\n            //公式文本\r\n            var strtext = func_methods.getFirstValue(arguments[0]).toString();\r\n            if(valueIsError(strtext)){\r\n                return strtext;\r\n            }\r\n            //在文本公式前面添加=\r\n            if(strtext.trim().indexOf('=')!=0)\r\n            {\r\n                strtext ='='+strtext;\r\n            }\r\n            //console.log(strtext);\r\n            var result_this = formula.execstringformula(strtext,cell_r,cell_c,sheetindex_now);\r\n            return result_this[1];\r\n        }\r\n        catch (e) {\r\n            var err = e;\r\n            //计算错误检测\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n    \"REMOTE\": function() {\r\n        if (arguments.length < this.m[0] || arguments.length > this.m[1]) {\r\n            return formula.error.na;\r\n        }\r\n\r\n        try {\r\n            const cellRow = window.luckysheetCurrentRow;\r\n            const cellColumn = window.luckysheetCurrentColumn;\r\n            const cellFunction = window.luckysheetCurrentFunction;\r\n\r\n            const remoteFunction = func_methods.getFirstValue(arguments[0]);\r\n            if(valueIsError(remoteFunction)){\r\n                return remoteFunction;\r\n            }\r\n\r\n            luckysheetConfigsetting.remoteFunction(remoteFunction, data => {\r\n                const flowData = editor.deepCopyFlowData(Store.flowdata);\r\n                formula.execFunctionGroup(cellRow, cellColumn, data);\r\n                flowData[cellRow][cellColumn] = {\r\n                    \"v\": data,\r\n                    \"f\": cellFunction\r\n                };\r\n                jfrefreshgrid(flowData, [{\"row\": [cellRow, cellRow], \"column\": [cellColumn, cellColumn]}]);\r\n            });\r\n\r\n            return \"Loading...\";\r\n        }\r\n        catch (e) {\r\n            console.log(e);\r\n            var err = e;\r\n            err = formula.errorInfo(err);\r\n            return [formula.error.v, err];\r\n        }\r\n    },\r\n};\r\n\r\nexport default functionImplementation;\r\n"
  },
  {
    "path": "src/function/functionListDescriptor.js",
    "content": "export default [\r\n    {\r\n        \"n\": \"SUMIF\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"\\\">20\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"B1:B10\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TAN\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"45*PI()/180\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TANH\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CEILING\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"23.25\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ATAN\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ASINH\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.9\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ABS\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"-2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ACOS\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ACOSH\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MULTINOMIAL\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ATANH\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.9\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ATAN2\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COUNTBLANK\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:C100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COSH\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"INT\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"99.44\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISEVEN\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISODD\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LCM\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A5\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"3\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LN\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LOG\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"128\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LOG10\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MOD\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MROUND\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"21\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"14\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ODD\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SUMSQ\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COMBIN\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SUM\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SUBTOTAL\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            256\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A2:A5\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B8\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ASIN\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COUNTIF\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"\\\">20\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"RADIANS\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"180\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"RAND\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            0,\r\n            0\r\n        ],\r\n        \"p\": []\r\n    },\r\n    {\r\n        \"n\": \"COUNTUNIQUE\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:C100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DEGREES\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"PI()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ERFC\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"EVEN\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"EXP\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"FACT\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"FACTDOUBLE\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"6\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PI\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            0,\r\n            0\r\n        ],\r\n        \"p\": []\r\n    },\r\n    {\r\n        \"n\": \"FLOOR\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"23.25\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"GCD\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A5\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"96\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"RANDBETWEEN\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ROUND\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"99.44\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ROUNDDOWN\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"99.44\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ROUNDUP\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"99.44\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SERIESSUM\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            4,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"{FACT(0)\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SIGN\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"-42\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SIN\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"PI()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SINH\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SQRT\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"9\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SQRTPI\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"9\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"GAMMALN\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COS\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"PI()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TRUNC\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"3.141592654\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"QUOTIENT\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"POWER\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.5\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SUMIFS\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            3,\r\n            257\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \" B1:B10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \" \\\">20\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \" C1:C10\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"GET_TARGET\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            0,\r\n            0\r\n        ],\r\n        \"p\": [\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"GET_AIRTABLE_DATA\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"https://airtable.com/apppqwer/tblpoi/viwmnb\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ASK_AI\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"I need an accountability goal achievement\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"B1:B10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COUNTIFS\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            256\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \" \\\">20\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \" B1:B10\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PRODUCT\",\r\n        \"t\": 0,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"HARMEAN\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"HYPGEOMDIST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            5,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"40\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"INTERCEPT\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"KURT\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LARGE\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"STDEVA\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"STDEVP\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"GEOMEAN\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"RANK_EQ\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A1:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"RANK_AVG\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A1:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PERCENTRANK_EXC\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PERCENTRANK_INC\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \" A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"FORECAST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"FISHERINV\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.962\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"FISHER\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.962\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MODE_SNGL\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"WEIBULL_DIST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            4,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"2.4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COUNT\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COUNTA\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"AVEDEV\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"AVERAGE\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"AVERAGEA\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"BINOM_DIST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            4,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.005\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"BINOM_INV\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.005\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.8\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CONFIDENCE_NORM\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.05\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1.6\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"250\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CORREL\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COVARIANCE_P\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COVARIANCE_S\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DEVSQ\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"EXPON_DIST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.5\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"AVERAGEIF\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\">20\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"B1:B10\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"AVERAGEIFS\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \" B1:B10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \" \\\">20\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \" C1:C10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PERMUT\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TRIMMEAN\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"0.1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PERCENTILE_EXC\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.25\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PERCENTILE_INC\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.25\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PEARSON\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"NORM_S_INV\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.75\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"NORM_S_DIST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"2.4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"NORM_INV\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.75\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"NORM_DIST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            4,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"2.4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"NEGBINOM_DIST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            4,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MINA\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MIN\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MEDIAN\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MAXA\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MAX\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LOGNORM_INV\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"6\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LOGNORM_DIST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            4,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"6\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"Z_TEST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"B2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"3\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PROB\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            3,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A3:A6\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"QUARTILE_EXC\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"QUARTILE_INC\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"POISSON_DIST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"RSQ\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"T_DIST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"30\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"T_DIST_2T\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"30\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"T_DIST_RT\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"30\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"T_INV\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.35\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"T_INV_2T\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.35\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"T_TEST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            4,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B1:B4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"F_DIST\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            4,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"15.35\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"6\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"F_DIST_RT\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"15.35\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"6\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"VAR_P\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"VAR_S\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"VARA\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"VARPA\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"STEYX\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"STANDARDIZE\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"96\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"80\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"6.7\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SMALL\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SLOPE\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SKEW\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SKEW_P\",\r\n        \"t\": 1,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"VLOOKUP\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            3,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"10003\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A2:B26\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"HLOOKUP\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            3,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"10003\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A2:Z6\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LOOKUP\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"10003\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A1:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"B1:B100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ADDRESS\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            2,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"Sheet2\\\"\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"INDIRECT\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"Sheet2!\\\"&B10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ROW\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            0,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A9\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ROWS\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A9:A62\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COLUMN\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            0,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A9\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COLUMNS\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A9:W62\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"OFFSET\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            3,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MATCH\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"Sunday\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A2:A9\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"INDEX\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:C20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"5\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"GETPIVOTDATA\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            2,\r\n            254\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"SUM of number of units\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"'Pivot table'!A1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"division\\\"\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"east\\\"\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CHOOSE\",\r\n        \"t\": 2,\r\n        \"m\": [\r\n            2,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"A\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"B\\\"\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"HYPERLINK\",\r\n        \"t\": 2,\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"http://www.luckysheet.com/\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"luckysheet\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TIME\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"11\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"40\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"59\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TIMEVALUE\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"2:15 PM\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"EOMONTH\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"EDATE\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SECOND\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"TIME(11\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MINUTE\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"TIME(11\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"HOUR\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"TIME(11\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"NOW\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            0,\r\n            0\r\n        ],\r\n        \"p\": []\r\n    },\r\n    {\r\n        \"n\": \"NETWORKDAYS\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"16)\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"NETWORKDAYS_INTL\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            2,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"16)\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISOWEEKNUM\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"WEEKNUM\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"WEEKDAY\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DAY\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DAYS\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"2011-3-15\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2011-2-1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DAYS360\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DATE\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DATEVALUE\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"1969-7-20\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DATEDIF\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"16)\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"WORKDAY\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"16)\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"WORKDAY_INTL\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            2,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"16)\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"YEAR\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"YEARFRAC\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"7\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"16)\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TODAY\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            0,\r\n            0\r\n        ],\r\n        \"p\": []\r\n    },\r\n    {\r\n        \"n\": \"MONTH\",\r\n        \"t\": 6,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"EFFECT\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.99\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DOLLAR\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1.2351\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DOLLARDE\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"100.10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"32\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DOLLARFR\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"100.125\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"32\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DB\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            4,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"50\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DDB\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            4,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"50\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2.25\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"RATE\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            6\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"-100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"400\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CUMPRINC\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            6,\r\n            6\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"5\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COUPNUM\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"02\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SYD\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            4,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"50\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TBILLEQ\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2)\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TBILLYIELD\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"95\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TBILLPRICE\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0.09\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PV\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"D2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ACCRINT\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            6,\r\n            8\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0.1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"10000\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ACCRINTM\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            4,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(1969\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0.1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1000\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COUPDAYBS\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COUPDAYS\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COUPDAYSNC\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COUPNCD\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"01)\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2019\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COUPPCD\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"01)\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2019\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"FV\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"400\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"FVSCHEDULE\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"10000\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"YIELD\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            6,\r\n            7\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0.057\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"95\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"YIELDDISC\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            4,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"95\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"NOMINAL\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.85\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"XIRR\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"B2:B25\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"C2:C25\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"250\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MIRR\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A25\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"0.1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"IRR\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A25\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"200\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"NPV\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            2,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"200\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"250\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"XNPV\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B25\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"C2:C25\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CUMIPMT\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            6,\r\n            6\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"5\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PMT\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.08\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \" 100000\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"D2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"IPMT\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            4,\r\n            6\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"80000\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"E2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PPMT\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            4,\r\n            6\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"3*12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"100000\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"INTRATE\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            4,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"100000\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"101200\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PRICE\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            6,\r\n            7\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0.057\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.065\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PRICEDISC\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            4,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0.0525\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PRICEMAT\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            5,\r\n            6\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0.061\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.061\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"RECEIVED\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            4,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"10000000\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.0575\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DISC\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            4,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"97.975\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"NPER\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"0.12\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"500\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"40000\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SLN\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"300000\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"75000\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DURATION\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            5,\r\n            6\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0.08\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.09\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MDURATION\",\r\n        \"t\": 8,\r\n        \"m\": [\r\n            5,\r\n            6\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"DATE(2010\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0.08\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0.09\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"BIN2DEC\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"101\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"BIN2HEX\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"101\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"8\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"BIN2OCT\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"101\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"8\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DEC2BIN\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"8\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DEC2HEX\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"8\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DEC2OCT\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"8\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"HEX2BIN\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"f3\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"8\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"HEX2DEC\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"f3\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"HEX2OCT\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"f3\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"8\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"OCT2BIN\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"37\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"8\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"OCT2DEC\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"37\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"OCT2HEX\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"37\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"8\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COMPLEX\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"j\\\"\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangestring\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"IMREAL\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"4+5i\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"IMAGINARY\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"4+5i\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"IMCONJUGATE\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"3+4i\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"IMABS\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"3+4i\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DELTA\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"IMSUM\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"3+4i\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"5-3i\\\"\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"IMSUB\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"6+5i\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"2+3i\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"IMPRODUCT\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"3+4i\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"5-3i\\\"\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"IMDIV\",\r\n        \"t\": 9,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"11+16i\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"3+2i\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"NOT\",\r\n        \"t\": 10,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TRUE\",\r\n        \"t\": 10,\r\n        \"m\": [\r\n            0,\r\n            0\r\n        ],\r\n        \"p\": []\r\n    },\r\n    {\r\n        \"n\": \"FALSE\",\r\n        \"t\": 10,\r\n        \"m\": [\r\n            0,\r\n            0\r\n        ],\r\n        \"p\": []\r\n    },\r\n    {\r\n        \"n\": \"AND\",\r\n        \"t\": 10,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2 = \\\"foo\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A3 = \\\"bar\\\"\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"IFERROR\",\r\n        \"t\": 10,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"Error in cell A1\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"IF\",\r\n        \"t\": 10,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2 = \\\"foo\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"A2 is foo\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"A2 was false\\\"\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"OR\",\r\n        \"t\": 10,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2 = \\\"foo\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \" A3 = \\\"bar\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"NE\",\r\n        \"t\": 11,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"EQ\",\r\n        \"t\": 11,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"GT\",\r\n        \"t\": 11,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"GTE\",\r\n        \"t\": 11,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LT\",\r\n        \"t\": 11,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LTE\",\r\n        \"t\": 11,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ADD\",\r\n        \"t\": 11,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MINUS\",\r\n        \"t\": 11,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MULTIPLY\",\r\n        \"t\": 11,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DIVIDE\",\r\n        \"t\": 11,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CONCAT\",\r\n        \"t\": 11,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"de\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"mystify\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"UNARY_PERCENT\",\r\n        \"t\": 11,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CONCATENATE\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"Super\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"calla\\\"\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CODE\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"a\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CHAR\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"97\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ARABIC\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"XIV\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ROMAN\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"499\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"REGEXEXTRACT\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"Needle in a haystack\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\".e{2}dle\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"REGEXMATCH\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"Spreadsheets\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"S.r\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"REGEXREPLACE\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"Spreadsheets\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"S.*d\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"Bed\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"T\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"FIXED\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"3.141592653\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"FIND\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"n\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"14\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"FINDB\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"new\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"new year\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"JOIN\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            2,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\" and-a \\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"{1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LEFT\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"RIGHT\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MID\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"get this\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"5\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LEN\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LENB\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LOWER\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"LOREM IPSUM\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"UPPER\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"lorem ipsum\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"EXACT\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"REPLACE\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            4,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"Spreadsheets\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"6\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"Bed\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"REPT\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"ha\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SEARCH\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"n\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"14\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SUBSTITUTE\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            3,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"search for it\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"search for\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"Google\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CLEAN\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"AF\\\"&CHAR(31)\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TEXT\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1.23\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"$0.00\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TRIM\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\" lorem ipsum\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"VALUE\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"123\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PROPER\",\r\n        \"t\": 12,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"united states\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CONVERT\",\r\n        \"t\": 13,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"5.1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"g\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"kg\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SUMX2MY2\",\r\n        \"t\": 14,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SUMX2PY2\",\r\n        \"t\": 14,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SUMXMY2\",\r\n        \"t\": 14,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B100\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TRANSPOSE\",\r\n        \"t\": 14,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"{1,2}\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TREND\",\r\n        \"t\": 14,\r\n        \"m\": [\r\n            1,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"B2:B10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A2:A10\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A11:A13\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"FREQUENCY\",\r\n        \"t\": 14,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A40\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"B2:B5\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"GROWTH\",\r\n        \"t\": 14,\r\n        \"m\": [\r\n            1,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"B2:B10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A2:A10\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A11:A13\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LINEST\",\r\n        \"t\": 14,\r\n        \"m\": [\r\n            1,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"B2:B10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A2:A10\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LOGEST\",\r\n        \"t\": 14,\r\n        \"m\": [\r\n            1,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"B2:B10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"A2:A10\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MDETERM\",\r\n        \"t\": 14,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:D4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MINVERSE\",\r\n        \"t\": 14,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:D4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"MMULT\",\r\n        \"t\": 14,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:B3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"C1:F2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SUMPRODUCT\",\r\n        \"t\": 14,\r\n        \"m\": [\r\n            1,\r\n            255\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:C5\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"D2:F5\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISFORMULA\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CELL\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            2,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"type\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"C2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"NA\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            0,\r\n            0\r\n        ],\r\n        \"p\": []\r\n    },\r\n    {\r\n        \"n\": \"ERROR_TYPE\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A3\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISBLANK\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISERR\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISERROR\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISLOGICAL\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISNA\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISNONTEXT\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISNUMBER\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISREF\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISTEXT\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TYPE\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"C4\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"N\",\r\n        \"t\": 15,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TO_DATE\",\r\n        \"t\": 16,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"25405\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TO_PURE_NUMBER\",\r\n        \"t\": 16,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"50%\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TO_TEXT\",\r\n        \"t\": 16,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"24\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TO_DOLLARS\",\r\n        \"t\": 16,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TO_PERCENT\",\r\n        \"t\": 16,\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DGET\",\r\n        \"t\": 17,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:F20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"G2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A22:D23\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DMAX\",\r\n        \"t\": 17,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:F20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"G2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A22:D23\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DMIN\",\r\n        \"t\": 17,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:F20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"G2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A22:D23\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DAVERAGE\",\r\n        \"t\": 17,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:F20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"G2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A22:D23\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DCOUNT\",\r\n        \"t\": 17,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:F20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"G2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A22:D23\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DCOUNTA\",\r\n        \"t\": 17,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:F20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"G2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A22:D23\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DPRODUCT\",\r\n        \"t\": 17,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:F20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"G2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A22:D23\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DSTDEV\",\r\n        \"t\": 17,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:F20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"G2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A22:D23\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DSTDEVP\",\r\n        \"t\": 17,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:F20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"G2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A22:D23\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DSUM\",\r\n        \"t\": 17,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:F20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"G2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A22:D23\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DVAR\",\r\n        \"t\": 17,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:F20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"G2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A22:D23\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DVARP\",\r\n        \"t\": 17,\r\n        \"m\": [\r\n            3,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:F20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"G2\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"A22:D23\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"AGE_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"2017-10-01\\\"\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangedatetime\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SEX_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"BIRTHDAY_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PROVINCE_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"CITY_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"STAR_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ANIMAL_BY_IDCARD\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISIDCARD\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"31033519900101XXXX\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DM_TEXT_CUTWORD\",\r\n        \"t\": \"4\",\r\n        \"m\": [\r\n            1,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"I came to Beijing Tsinghua University\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DM_TEXT_TFIDF\",\r\n        \"t\": \"4\",\r\n        \"m\": [\r\n            1,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"I came to Beijing Tsinghua University\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"20\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DM_TEXT_TEXTRANK\",\r\n        \"t\": \"4\",\r\n        \"m\": [\r\n            1,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"I came to Beijing Tsinghua University\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"20\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_CLOSE\",\r\n        \"t\": \"5\",\r\n        \"m\": [\r\n            1,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"000001\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2015-01-08\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangedate\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_OPEN\",\r\n        \"t\": \"5\",\r\n        \"m\": [\r\n            1,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"000001\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2015-01-08\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangedate\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_MAX\",\r\n        \"t\": \"5\",\r\n        \"m\": [\r\n            1,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"000001\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2015-01-08\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangedate\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_MIN\",\r\n        \"t\": \"5\",\r\n        \"m\": [\r\n            1,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"000001\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2015-01-08\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangedate\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_VOLUMN\",\r\n        \"t\": \"5\",\r\n        \"m\": [\r\n            1,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"000001\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2015-01-08\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangedate\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DATA_CN_STOCK_AMOUNT\",\r\n        \"t\": \"5\",\r\n        \"m\": [\r\n            1,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"000001\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"2015-01-08\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangedate\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"ISDATE\",\r\n        \"t\": \"6\",\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"1990-01-01\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"LINESPLINES\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            8\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#2ec7c9\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"avg\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#000\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1.5\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"AREASPLINES\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#2ec7c9\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#CCF3F4\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"avg\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#000\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COLUMNSPLINES\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            6\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"STACKCOLUMNSPLINES\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"BARSPLINES\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            6\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"STACKBARSPLINES\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"100\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"DISCRETESPLINES\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#2ec7c9\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"TRISTATESPLINES\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            6\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#fc5c5c\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#999\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"PIESPLINES\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            5\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"0\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#000\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"#97b552\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"BOXSPLINES\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A1:A20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1.5\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"10\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"1.5\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"BULLETSPLINES\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"10\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"8\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"12\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"COMPOSESPLINES\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"PIESPLINES(A1:A20)\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"y\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SORT\",\r\n        \"t\": \"14\",\r\n        \"m\": [\r\n            1,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:A17\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"-1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"FILTER\",\r\n        \"t\": \"14\",\r\n        \"m\": [\r\n            2,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A5:D20\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"range\"\r\n            },\r\n            {\r\n                \"example\": \"\\\"\\\"\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"UNIQUE\",\r\n        \"t\": \"14\",\r\n        \"m\": [\r\n            1,\r\n            3\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"A2:B26\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"TRUE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            },\r\n            {\r\n                \"example\": \"FALSE()\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"RANDARRAY\",\r\n        \"t\": \"14\",\r\n        \"m\": [\r\n            0,\r\n            2\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"SEQUENCE\",\r\n        \"t\": \"14\",\r\n        \"m\": [\r\n            1,\r\n            4\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            },\r\n            {\r\n                \"example\": \"1\",\r\n                \"require\": \"o\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangenumber\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"EVALUATE\",\r\n        \"t\": \"3\",\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"\\\"A1+5*2^2\\\"\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"rangeall\"\r\n            }\r\n        ]\r\n    },\r\n    {\r\n        \"n\": \"REMOTE\",\r\n        \"t\": \"5\",\r\n        \"m\": [\r\n            1,\r\n            1\r\n        ],\r\n        \"p\": [\r\n            {\r\n                \"example\": \"SUM(A1:A10000000)\",\r\n                \"require\": \"m\",\r\n                \"repeat\": \"n\",\r\n                \"type\": \"string\"\r\n            }\r\n        ]\r\n    },\r\n]\r\n"
  },
  {
    "path": "src/function/functionlist.js",
    "content": "import functionImplementation from './functionImplementation';\r\nimport Store from '../store/index'\r\nimport locale from '../locale/locale';\r\nimport getLocalizedFunctionList from '../function/getLocalizedFunctionList';\r\n\r\n//{\"0\":\"数学\",\"1\":\"统计\",\"2\":\"查找\",\"3\":\"Luckysheet内置\",\"4\":\"数据挖掘\",\"5\":\"数据源\",\"6\":\"日期\",\"7\":\"过滤器\",\"8\":\"财务\",\"9\":\"工程计算\",\"10\":\"逻辑\",\"11\":\"运算符\",\"12\":\"文本\",\"13\":\"转换工具\",\"14\":\"数组\"}\r\n\r\nconst functionlist = function(customFunctions){\r\n    let _locale = locale();\r\n    // internationalization,get function list\r\n    let functionListOrigin = [...getLocalizedFunctionList(_locale.functionlist)];\r\n\r\n    // add new property f\r\n    for (let i = 0; i < functionListOrigin.length; i++) {\r\n        let func = functionListOrigin[i];\r\n        func.f = functionImplementation[func.n];\r\n    }\r\n\r\n    if (customFunctions) {\r\n        functionListOrigin.push(...customFunctions);\r\n    }\r\n\r\n    Store.functionlist = functionListOrigin;\r\n    \r\n    // get n property\r\n    const luckysheet_function = {};\r\n\r\n    for (let i = 0; i < functionListOrigin.length; i++) {\r\n        let func = functionListOrigin[i];\r\n        luckysheet_function[func.n] = func;\r\n    }\r\n\r\n    window.luckysheet_function = luckysheet_function; //Mount window for eval() calculation formula\r\n    \r\n    Store.luckysheet_function = luckysheet_function;\r\n}\r\n\r\nexport default functionlist;\r\n"
  },
  {
    "path": "src/function/getLocalizedFunctionList.js",
    "content": "import functionlist from \"./functionListDescriptor\";\r\n\r\nexport default (localeFunctionList) => {\r\n    functionlist.forEach(f => {\r\n        const localeFunction = localeFunctionList[f.n];\r\n        f.d = localeFunction.d;\r\n        f.a = localeFunction.a;\r\n        f.p.forEach((p, i) => {\r\n            Object.assign(p, localeFunction.p[i]);\r\n        });\r\n    });\r\n\r\n    return functionlist;\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/function/luckysheet_function.js",
    "content": "import functionlist from './functionlist';\r\n\r\nconst luckysheet_function = {};\r\n\r\nfor (let i = 0; i < functionlist.length; i++) {\r\n    let func = functionlist[i];\r\n    luckysheet_function[func.n] = func;\r\n}\r\n\r\nwindow.luckysheet_function = luckysheet_function; //挂载window 用于 eval() 计算公式\r\n\r\nexport default luckysheet_function;"
  },
  {
    "path": "src/function/matrix_methods.js",
    "content": "var matrix = ({});\r\n\r\nvar init = function init(matrix){\r\n    var sylvester_matrix = function() {};\r\n\r\n    sylvester_matrix.precision = 1e-6;\r\n\r\n    sylvester_matrix.create = function(elements) {\r\n        var M = new sylvester_matrix();\r\n        return M.setElements(elements);\r\n    };\r\n    var $M = sylvester_matrix.create;\r\n    \r\n    sylvester_matrix.I = function(n) {\r\n        var els = [], i = n, j;\r\n        while (i--) { j = n;\r\n            els[i] = [];\r\n            while (j--) {\r\n                els[i][j] = (i === j) ? 1 : 0;\r\n            }\r\n        }\r\n        return sylvester_matrix.create(els);\r\n    };\r\n\r\n    sylvester_matrix.prototype = {\r\n        e: function(i,j) {\r\n            if (i < 1 || i > this.elements.length || j < 1 || j > this.elements[0].length) { return null; }\r\n            return this.elements[i-1][j-1];\r\n        },\r\n        dimensions: function() {\r\n            var cols = (this.elements.length === 0) ? 0 : this.elements[0].length;\r\n            return {rows: this.elements.length, cols: cols};\r\n        },\r\n        rows: function() {\r\n            return this.elements.length;\r\n        },\r\n        cols: function() {\r\n            if (this.elements.length === 0) { return 0; }\r\n            return this.elements[0].length;\r\n        },\r\n        eql: function(matrix) {\r\n            var M = matrix.elements || matrix;\r\n            if (!M[0] || typeof(M[0][0]) === 'undefined') { M = sylvester_matrix.create(M).elements; }\r\n            if (this.elements.length === 0 || M.length === 0) {\r\n                return this.elements.length === M.length;\r\n            }\r\n            if (this.elements.length !== M.length) { return false; }\r\n            if (this.elements[0].length !== M[0].length) { return false; }\r\n            var i = this.elements.length, nj = this.elements[0].length, j;\r\n            while (i--) { j = nj;\r\n                while (j--) {\r\n                    if (Math.abs(this.elements[i][j] - M[i][j]) > sylvester_matrix.precision) { return false; }\r\n                }\r\n            }\r\n            return true;\r\n        },\r\n        dup: function() {\r\n            return sylvester_matrix.create(this.elements);\r\n        },\r\n        map: function(fn, context) {\r\n            if (this.elements.length === 0) { \r\n                return sylvester_matrix.create([]); \r\n            }\r\n            var els = [], i = this.elements.length, nj = this.elements[0].length, j;\r\n            while (i--) { \r\n                j = nj;\r\n                els[i] = [];\r\n                while (j--) {\r\n                    els[i][j] = fn.call(context, this.elements[i][j], i + 1, j + 1);\r\n                }\r\n            }\r\n            return sylvester_matrix.create(els);\r\n        },\r\n        isSameSizeAs: function(matrix) {\r\n            var M = matrix.elements || matrix;\r\n            if (typeof(M[0][0]) === 'undefined') { \r\n                M = sylvester_matrix.create(M).elements; \r\n            }\r\n            if (this.elements.length === 0) { \r\n                return M.length === 0; \r\n            }\r\n            return (this.elements.length === M.length && this.elements[0].length === M[0].length);\r\n        },\r\n        add: function(matrix) {\r\n            if (this.elements.length === 0) return this.map(function(x) { return x });\r\n            var M = matrix.elements || matrix;\r\n            if (typeof(M[0][0]) === 'undefined') { M = sylvester_matrix.create(M).elements; }\r\n            if (!this.isSameSizeAs(M)) { return null; }\r\n            return this.map(function(x, i, j) { return x + M[i-1][j-1]; });\r\n        },\r\n        subtract: function(matrix) {\r\n            if (this.elements.length === 0) return this.map(function(x) { return x });\r\n            var M = matrix.elements || matrix;\r\n            if (typeof(M[0][0]) === 'undefined') { M = sylvester_matrix.create(M).elements; }\r\n            if (!this.isSameSizeAs(M)) { return null; }\r\n            return this.map(function(x, i, j) { return x - M[i-1][j-1]; });\r\n        },\r\n        canMultiplyFromLeft: function(matrix) {\r\n            if (this.elements.length === 0) { return false; }\r\n            var M = matrix.elements || matrix;\r\n            if (typeof(M[0][0]) === 'undefined') { M = sylvester_matrix.create(M).elements; }\r\n            // this.columns should equal matrix.rows\r\n            return (this.elements[0].length === M.length);\r\n        },\r\n        multiply: function(matrix) {\r\n            if (this.elements.length === 0) { return null; }\r\n            if (!matrix.elements) {\r\n                return this.map(function(x) { return x * matrix; });\r\n            }\r\n            var returnVector = matrix.modulus ? true : false;\r\n            var M = matrix.elements || matrix;\r\n            if (typeof(M[0][0]) === 'undefined') { M = sylvester_matrix.create(M).elements; }\r\n            if (!this.canMultiplyFromLeft(M)) { return null; }\r\n            var i = this.elements.length, nj = M[0].length, j;\r\n            var cols = this.elements[0].length, c, elements = [], sum;\r\n            while (i--) { j = nj;\r\n                elements[i] = [];\r\n                while (j--) { c = cols;\r\n                    sum = 0;\r\n                    while (c--) {\r\n                        sum += this.elements[i][c] * M[c][j];\r\n                    }\r\n                    elements[i][j] = sum;\r\n                }\r\n            }\r\n            var M = sylvester_matrix.create(elements);\r\n            return returnVector ? M.col(1) : M;\r\n        },\r\n        minor: function(a, b, c, d) {\r\n            if (this.elements.length === 0) { return null; }\r\n            var elements = [], ni = c, i, nj, j;\r\n            var rows = this.elements.length, cols = this.elements[0].length;\r\n            while (ni--) { i = c - ni - 1;\r\n                elements[i] = [];\r\n                nj = d;\r\n                while (nj--) { j = d - nj - 1;\r\n                    elements[i][j] = this.elements[(a+i-1)%rows][(b+j-1)%cols];\r\n                }\r\n            }\r\n            return sylvester_matrix.create(elements);\r\n        },\r\n        transpose: function() {\r\n            if (this.elements.length === 0) return sylvester_matrix.create([]);\r\n            var rows = this.elements.length, i, cols = this.elements[0].length, j;\r\n            var elements = [], i = cols;\r\n            while (i--) { j = rows;\r\n                elements[i] = [];\r\n                while (j--) {\r\n                    elements[i][j] = this.elements[j][i];\r\n                }\r\n            }\r\n            return sylvester_matrix.create(elements);\r\n        },\r\n        isSquare: function() {\r\n            var cols = (this.elements.length === 0) ? 0 : this.elements[0].length;\r\n            return (this.elements.length === cols);\r\n        },\r\n        max: function() {\r\n            if (this.elements.length === 0) { return null; }\r\n            var m = 0, i = this.elements.length, nj = this.elements[0].length, j;\r\n            while (i--) { j = nj;\r\n                while (j--) {\r\n                    if (Math.abs(this.elements[i][j]) > Math.abs(m)) { m = this.elements[i][j]; }\r\n                }\r\n            }\r\n            return m;\r\n        },\r\n        indexOf: function(x) {\r\n            if (this.elements.length === 0) { return null; }\r\n            var index = null, ni = this.elements.length, i, nj = this.elements[0].length, j;\r\n            for (i = 0; i < ni; i++) {\r\n                for (j = 0; j < nj; j++) {\r\n                    if (this.elements[i][j] === x) { return {i: i+1, j: j+1}; }\r\n                }\r\n            }\r\n            return null;\r\n        },\r\n        diagonal: function() {\r\n            if (!this.isSquare) { return null; }\r\n            var els = [], n = this.elements.length;\r\n            for (var i = 0; i < n; i++) {\r\n                els.push(this.elements[i][i]);\r\n            }\r\n            return sylvester_matrix.create(els);\r\n        },\r\n        toRightTriangular: function() {\r\n            if (this.elements.length === 0) return sylvester_matrix.create([]);\r\n            var M = this.dup(), els;\r\n            var n = this.elements.length, i, j, np = this.elements[0].length, p;\r\n            for (i = 0; i < n; i++) {\r\n                if (M.elements[i][i] === 0) {\r\n                    for (j = i + 1; j < n; j++) {\r\n                        if (M.elements[j][i] !== 0) {\r\n                            els = [];\r\n                            for (p = 0; p < np; p++) { \r\n                                els.push(M.elements[i][p] + M.elements[j][p]); \r\n                            }\r\n                            M.elements[i] = els;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n                if (M.elements[i][i] !== 0) {\r\n                    for (j = i + 1; j < n; j++) {\r\n                        var multiplier = M.elements[j][i] / M.elements[i][i];\r\n                        els = [];\r\n                        for (p = 0; p < np; p++) {\r\n                            // Elements with column numbers up to an including the number of the\r\n                            // row that we're subtracting can safely be set straight to zero,\r\n                            // since that's the point of this routine and it avoids having to\r\n                            // loop over and correct rounding errors later\r\n                            els.push(p <= i ? 0 : M.elements[j][p] - M.elements[i][p] * multiplier);\r\n                        }\r\n                        M.elements[j] = els;\r\n                    }\r\n                }\r\n            }\r\n            return M;\r\n        },\r\n        determinant: function() {\r\n            if (this.elements.length === 0) { return 1; }\r\n            if (!this.isSquare()) { return null; }\r\n            var M = this.toRightTriangular();\r\n            var det = M.elements[0][0], n = M.elements.length;\r\n            for (var i = 1; i < n; i++) {\r\n                det = det * M.elements[i][i];\r\n            }\r\n            return det;\r\n        },\r\n        isSingular: function() {\r\n            return (this.isSquare() && this.determinant() === 0);\r\n        },\r\n        trace: function() {\r\n            if (this.elements.length === 0) { return 0; }\r\n            if (!this.isSquare()) { return null; }\r\n            var tr = this.elements[0][0], n = this.elements.length;\r\n            for (var i = 1; i < n; i++) {\r\n                tr += this.elements[i][i];\r\n            }\r\n            return tr;\r\n        },\r\n        rank: function() {\r\n            if (this.elements.length === 0) { return 0; }\r\n            var M = this.toRightTriangular(), rank = 0;\r\n            var i = this.elements.length, nj = this.elements[0].length, j;\r\n            while (i--) { j = nj;\r\n                while (j--) {\r\n                    if (Math.abs(M.elements[i][j]) > sylvester_matrix.precision) { rank++; break; }\r\n                }\r\n            }\r\n            return rank;\r\n        },\r\n        augment: function(matrix) {\r\n            if (this.elements.length === 0) { return this.dup(); }\r\n            var M = matrix.elements || matrix;\r\n            if (typeof(M[0][0]) === 'undefined') { M = sylvester_matrix.create(M).elements; }\r\n            var T = this.dup(), cols = T.elements[0].length;\r\n            var i = T.elements.length, nj = M[0].length, j;\r\n            if (i !== M.length) { return null; }\r\n            while (i--) { \r\n                j = nj;\r\n                while (j--) {\r\n                    T.elements[i][cols + j] = M[i][j];\r\n                }\r\n            }\r\n            return T;\r\n        },\r\n        inverse: function() {\r\n            if (this.elements.length === 0) { return null; }\r\n            if (!this.isSquare() || this.isSingular()) { return null; }\r\n            var n = this.elements.length, i= n, j;\r\n            var M = this.augment(sylvester_matrix.I(n)).toRightTriangular();\r\n            var np = M.elements[0].length, p, els, divisor;\r\n            var inverse_elements = [], new_element;\r\n            // Sylvester.Matrix is non-singular so there will be no zeros on the\r\n            // diagonal. Cycle through rows from last to first.\r\n            while (i--) {\r\n                // First, normalise diagonal elements to 1\r\n                els = [];\r\n                inverse_elements[i] = [];\r\n                divisor = M.elements[i][i];\r\n                for (p = 0; p < np; p++) {\r\n                    new_element = M.elements[i][p] / divisor;\r\n                    els.push(new_element);\r\n                    // Shuffle off the current row of the right hand side into the results\r\n                    // array as it will not be modified by later runs through this loop\r\n                    if (p >= n) { inverse_elements[i].push(new_element); }\r\n                }\r\n                M.elements[i] = els;\r\n                // Then, subtract this row from those above it to give the identity matrix\r\n                // on the left hand side\r\n                j = i;\r\n                while (j--) {\r\n                    els = [];\r\n                    for (p = 0; p < np; p++) {\r\n                        els.push(M.elements[j][p] - M.elements[i][p] * M.elements[j][i]);\r\n                    }\r\n                    M.elements[j] = els;\r\n                }\r\n            }\r\n            return sylvester_matrix.create(inverse_elements);\r\n        },\r\n        round: function() {\r\n            return this.map(function(x) { return Math.round(x); });\r\n        },\r\n        snapTo: function(x) {\r\n            return this.map(function(p) {\r\n                return (Math.abs(p - x) <= sylvester_matrix.precision) ? x : p;\r\n            });\r\n        },\r\n        setElements: function(els) {\r\n            var i, j, elements = els.elements || els;\r\n            if (elements[0] && typeof(elements[0][0]) !== 'undefined') {\r\n                i = elements.length;\r\n                this.elements = [];\r\n                while (i--) { j = elements[i].length;\r\n                    this.elements[i] = [];\r\n                    while (j--) {\r\n                        this.elements[i][j] = elements[i][j];\r\n                    }\r\n                }\r\n                return this;\r\n            }\r\n            var n = elements.length;\r\n            this.elements = [];\r\n            for (i = 0; i < n; i++) {\r\n                this.elements.push([elements[i]]);\r\n            }\r\n            return this;\r\n        }\r\n    };\r\n\r\n    matrix.sylvester_matrix = sylvester_matrix;\r\n}\r\ninit(matrix);\r\n\r\nexport function inverse(els){\r\n    var M = matrix.sylvester_matrix.create(els);\r\n    return M.inverse().elements;\r\n}"
  },
  {
    "path": "src/global/analysis.js",
    "content": "import { numFormat } from '../utils/util';\r\n\r\nconst analysis = {\r\n    \"STDEVP\": function (mean, array1d) {\r\n        let cov = 0;\r\n        for (let i = 0; i < array1d.length; i++) {\r\n            let xi = array1d[i];\r\n            cov += Math.pow(xi - mean, 2);\r\n        }\r\n        return numFormat(Math.sqrt(cov / array1d.length));\r\n    },\r\n    \"STDEV\": function (mean, array1d) {\r\n        let cov = 0;\r\n        for (let i = 0; i < array1d.length; i++) {\r\n            let xi = array1d[i];\r\n            cov += Math.pow(xi - mean, 2);\r\n        }\r\n        return numFormat(Math.sqrt(cov / (array1d.length - 1)));\r\n    },\r\n    \"VARP\": function (mean, array1d) {\r\n        let cov = 0;\r\n        for (let i = 0; i < array1d.length; i++) {\r\n            let xi = array1d[i];\r\n            cov += Math.pow(xi - mean, 2);\r\n        }\r\n        return numFormat(cov / array1d.length);\r\n    },\r\n    \"let\": function (mean, array1d) {\r\n        let cov = 0;\r\n        for (let i = 0; i < array1d.length; i++) {\r\n            let xi = array1d[i];\r\n            cov += Math.pow(xi - mean, 2);\r\n        }\r\n        return numFormat(cov / (array1d.length - 1));\r\n    },\r\n};\r\n\r\nexport default analysis;"
  },
  {
    "path": "src/global/api.js",
    "content": "import Store from \"../store\";\r\nimport { replaceHtml, getObjType, chatatABC, luckysheetactiveCell } from \"../utils/util\";\r\nimport { getSheetIndex, getluckysheet_select_save, getluckysheetfile } from \"../methods/get\";\r\nimport locale from \"../locale/locale\";\r\nimport method from './method';\r\nimport formula from './formula';\r\nimport func_methods from \"./func_methods\";\r\nimport tooltip from \"./tooltip\";\r\nimport json from \"./json\";\r\nimport editor from \"./editor\";\r\nimport luckysheetformula from './formula';\r\nimport cleargridelement from './cleargridelement';\r\nimport { genarate, update } from './format';\r\nimport { setAccuracy,setcellvalue } from \"./setdata\";\r\nimport { orderbydata } from \"./sort\";\r\nimport { rowlenByRange } from \"./getRowlen\";\r\nimport { getdatabyselection, getcellvalue } from \"./getdata\";\r\nimport { luckysheetrefreshgrid, jfrefreshgrid, jfrefreshgrid_rhcw } from \"./refresh\";\r\nimport { luckysheetDeleteCell, luckysheetextendtable, luckysheetdeletetable } from \"./extend\";\r\nimport { isRealNull, valueIsError, isRealNum, isEditMode, hasPartMC } from \"./validate\";\r\nimport { isdatetime, diff } from \"./datecontroll\";\r\nimport { getBorderInfoCompute } from './border';\r\nimport { luckysheetDrawMain } from './draw';\r\nimport pivotTable from '../controllers/pivotTable';\r\nimport server from \"../controllers/server\";\r\nimport menuButton from '../controllers/menuButton';\r\nimport selection from \"../controllers/selection\";\r\nimport luckysheetConfigsetting from \"../controllers/luckysheetConfigsetting\";\r\nimport luckysheetFreezen from \"../controllers/freezen\";\r\nimport luckysheetsizeauto from '../controllers/resize';\r\nimport sheetmanage from '../controllers/sheetmanage';\r\nimport conditionformat from '../controllers/conditionformat';\r\nimport { luckysheet_searcharray } from \"../controllers/sheetSearch\";\r\nimport { selectHightlightShow, selectIsOverlap } from '../controllers/select';\r\nimport { sheetHTML, luckysheetdefaultstyle } from '../controllers/constant';\r\nimport { createFilterOptions } from '../controllers/filter';\r\nimport controlHistory from '../controllers/controlHistory';\r\nimport { zoomRefreshView, zoomNumberDomBind } from '../controllers/zoom';\r\nimport dataVerificationCtrl from \"../controllers/dataVerificationCtrl\";\r\nimport imageCtrl from '../controllers/imageCtrl';\r\nimport dayjs from \"dayjs\";\r\nimport {getRangetxt } from '../methods/get';\r\nimport {luckysheetupdateCell} from '../controllers/updateCell';\r\nimport luckysheetSearchReplace from \"../controllers/searchReplace\";\r\n\r\nconst IDCardReg = /^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i;\r\n\r\n/**\r\n * 获取单元格的值\r\n * @param {Number} row 单元格所在行数；从0开始的整数，0表示第一行\r\n * @param {Number} column 单元格所在列数；从0开始的整数，0表示第一列\r\n * @param {Object} options 可选参数\r\n * @param {String} options.type 单元格的值类型，可以设置为原始值\"v\"或者显示值\"m\"；默认值为'v',表示获取单元格的实际值\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n */\r\nexport function getCellValue(row, column, options = {}) {\r\n    if (!isRealNum(row) || !isRealNum(column)) {\r\n        return tooltip.info('Arguments row or column cannot be null or undefined.', '')\r\n    }\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        type = 'v',\r\n        order = curSheetOrder\r\n    } = { ...options };\r\n    let targetSheetData = Store.luckysheetfile[order].data;\r\n    let cellData = targetSheetData[row][column];\r\n    let return_v;\r\n\r\n    if(getObjType(cellData) == \"object\"){\r\n        return_v = cellData[type];\r\n\r\n        if (type == \"f\" && return_v != null) {\r\n            return_v = formula.functionHTMLGenerate(return_v);\r\n        }\r\n        else if(type == \"f\") {\r\n            return_v = cellData[\"v\"];\r\n        }\r\n        else if(cellData && cellData.ct ) {\r\n            if (cellData.ct.fa == 'yyyy-MM-dd') {\r\n                return_v = cellData.m;\r\n            }\r\n            // 修复当单元格内有换行获取不到值的问题\r\n            else if (cellData.ct.hasOwnProperty(\"t\") && cellData.ct.t === 'inlineStr') {\r\n                let inlineStrValueArr = cellData.ct.s;\r\n                if (inlineStrValueArr) {\r\n                    return_v =  inlineStrValueArr.map(i => i.v).join(\"\")\r\n                }\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n    if(return_v == undefined ){\r\n        return_v = null;\r\n    }\r\n\r\n    return return_v;\r\n}\r\n\r\n/**\r\n * 设置单元格的值\r\n *\r\n * 关键点：如果设置了公式，则需要更新公式链insertUpdateFunctionGroup，如果设置了不是公式，判断之前是公式，则需要清除公式delFunctionGroup\r\n *\r\n * @param {Number} row 单元格所在行数；从0开始的整数，0表示第一行\r\n * @param {Number} column 单元格所在列数；从0开始的整数，0表示第一列\r\n * @param {Object | String | Number} value 要设置的值；可以为字符串或数字，或为符合Luckysheet单元格格式的对象\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Boolean} options.isRefresh 是否刷新界面；默认为`true`\r\n * @param {Boolean} options.triggerBeforeUpdate 是否触发更新前hook；默认为`true`\r\n * @param {Boolean} options.triggerUpdated 是否触发更新后hook；默认为`true`\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setCellValue(row, column, value, options = {}) {\r\n    if (!isRealNum(row) || !isRealNum(column)) {\r\n        return tooltip.info('The row or column parameter is invalid.', '');\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        isRefresh = true,\r\n        triggerBeforeUpdate = true,\r\n        triggerUpdated = true,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    /* cell更新前触发  */\r\n    if (triggerBeforeUpdate && !method.createHookFunction(\"cellUpdateBefore\", row, column, value, isRefresh)) {\r\n        /* 如果cellUpdateBefore函数返回false 则不执行后续的更新 */\r\n        return;\r\n    }\r\n\r\n    let data = file.data;\r\n    if(isRefresh) {\r\n      data = $.extend(true, [], file.data);\r\n    }\r\n    if(data.length == 0){\r\n        data = sheetmanage.buildGridData(file);\r\n    }\r\n\r\n    let oldValue\r\n    if (Store.flowdata[row] && Store.flowdata[row][column]) {\r\n      oldValue = JSON.stringify(Store.flowdata[row][column]);\r\n    }\r\n\r\n    // luckysheetformula.updatecell(row, column, value);\r\n    let formatList = {\r\n        //ct:1, //celltype,Cell value format: text, time, etc.\r\n        bg: 1,//background,#fff000\r\n        ff: 1,//fontfamily,\r\n        fc: 1,//fontcolor\r\n        bl: 1,//Bold\r\n        it: 1,//italic\r\n        fs: 1,//font size\r\n        cl: 1,//Cancelline, 0 Regular, 1 Cancelline\r\n        un: 1,//underline, 0 Regular, 1 underlines, fonts\r\n        vt: 1,//Vertical alignment, 0 middle, 1 up, 2 down\r\n        ht: 1,//Horizontal alignment,0 center, 1 left, 2 right\r\n        mc: 1, //Merge Cells\r\n        tr: 1, //Text rotation,0: 0、1: 45 、2: -45、3 Vertical text、4: 90 、5: -90\r\n        tb: 1, //Text wrap,0 truncation, 1 overflow, 2 word wrap\r\n        //v: 1, //Original value\r\n        //m: 1, //Display value\r\n        rt:1, //text rotation angle 0-180 alignment\r\n        //f: 1, //formula\r\n        qp:1 //quotePrefix, show number as string\r\n    }\r\n\r\n    if(value == null || value.toString().length == 0){\r\n        formula.delFunctionGroup(row, column);\r\n        setcellvalue(row, column, data, value);\r\n    }\r\n    else if(value instanceof Object){\r\n        let curv = {};\r\n        if(isRealNull(data[row])){\r\n            data[row] = {};\r\n        }\r\n        if(isRealNull(data[row][column])){\r\n            data[row][column] = {};\r\n        }\r\n        let cell = data[row][column];\r\n        if(value.f!=null && value.v==null){\r\n            curv.f = value.f;\r\n            if(value.ct!=null){\r\n                curv.ct = value.ct;\r\n            }\r\n            data = luckysheetformula.updatecell(row, column, curv, false).data;//update formula value\r\n        }\r\n        else{\r\n            if(value.ct!=null){\r\n                curv.ct = value.ct;\r\n            }\r\n            if(value.f!=null){\r\n                curv.f = value.f;\r\n            } else {\r\n                formula.delFunctionGroup(row, column);\r\n            }\r\n            if(value.v!=null){\r\n                curv.v = value.v;\r\n            }\r\n            else {\r\n                curv.v = cell.v;\r\n            }\r\n            if(value.m!=null){\r\n                curv.m = value.m;\r\n            }\r\n            setcellvalue(row, column, data, curv);//update text value\r\n        }\r\n        for(let attr in value){\r\n            let v = value[attr];\r\n            if(attr in formatList){\r\n                menuButton.updateFormatCell(data, attr, v, row, row, column, column);//change range format\r\n            }\r\n            else {\r\n                cell[attr] = v;\r\n            }\r\n        }\r\n        data[row][column] = cell;\r\n    }\r\n    else{\r\n        if(value.toString().substr(0,1)==\"=\" || value.toString().substr(0,5)==\"<span\"){\r\n            data = luckysheetformula.updatecell(row, column, value, false).data;//update formula value or convert inline string html to object\r\n        }\r\n        else{\r\n            formula.delFunctionGroup(row, column);\r\n            setcellvalue(row, column, data, value);\r\n        }\r\n    }\r\n\r\n    /* cell更新后触发  */\r\n    setTimeout(() => {\r\n        let oldValueObj\r\n        if (oldValue) {\r\n          oldValueObj = JSON.parse(oldValue)\r\n        }\r\n        // Hook function\r\n        if (triggerUpdated) {\r\n            method.createHookFunction(\"cellUpdated\", row, column, oldValueObj, Store.flowdata[row][column], isRefresh);\r\n        }\r\n\r\n    }, 0);\r\n\r\n    if(file.index == Store.currentSheetIndex && isRefresh){\r\n        jfrefreshgrid(data, [{ \"row\": [row, row], \"column\": [column, column] }]);//update data, meanwhile refresh canvas and store data to history\r\n    }\r\n    else{\r\n        file.data = data;//only update data\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success(data);\r\n    }\r\n}\r\n\r\n/**\r\n * 清除指定工作表指定单元格的内容，返回清除掉的数据，不同于删除单元格的功能，不需要设定单元格移动情况\r\n * @param {Number} row 单元格所在行数；从0开始的整数，0表示第一行\r\n * @param {Number} column 单元格所在列数；从0开始的整数，0表示第一列\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function clearCell(row, column, options = {}) {\r\n    if (!isRealNum(row) || !isRealNum(column)) {\r\n        return tooltip.info('Arguments row and column cannot be null or undefined.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let targetSheetData = $.extend(true, [], Store.luckysheetfile[order].data);\r\n    let cell = targetSheetData[row][column];\r\n\r\n    if(getObjType(cell) == \"object\"){\r\n        delete cell[\"m\"];\r\n        delete cell[\"v\"];\r\n\r\n        if(cell[\"f\"] != null){\r\n            delete cell[\"f\"];\r\n            formula.delFunctionGroup(row, column, order);\r\n\r\n            delete cell[\"spl\"];\r\n        }\r\n    }\r\n    else{\r\n        cell = null;\r\n    }\r\n\r\n    // 若操作为当前sheet页，则刷新当前sheet页\r\n    if (order === curSheetOrder) {\r\n        jfrefreshgrid(targetSheetData, [{\r\n            row: [row, row],\r\n            column: [column, column]\r\n        }])\r\n    }\r\n    else{\r\n        Store.luckysheetfile[order].data = targetSheetData;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success(cell)\r\n    }\r\n}\r\n\r\n/**\r\n * 删除指定工作表指定单元格，返回删除掉的数据，同时，指定是右侧单元格左移还是下方单元格上移\r\n * @param {String} move 删除后，右侧还是下方的单元格移动。可选值为 'left'、'up'\r\n * @param {Number} row 单元格所在行数；从0开始的整数，0表示第一行\r\n * @param {Number} column 单元格所在列数；从0开始的整数，0表示第一列\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function deleteCell(move, row, column, options = {}) {\r\n    let moveTypes = ['left', 'up'];\r\n    if (!move || moveTypes.indexOf(move) < 0) {\r\n        return tooltip.info('Arguments move cannot be null or undefined and its value must be \\'left\\' or \\'up\\'', '')\r\n    }\r\n\r\n    if (!isRealNum(row) || !isRealNum(column)) {\r\n        return tooltip.info('Arguments row and column cannot be null or undefined.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let moveType = 'move' + move.replace(move[0], move[0].toUpperCase()); // left-moveLeft;  up-moveUp\r\n\r\n    let sheetIndex;\r\n    if(order){\r\n        if(Store.luckysheetfile[order]){\r\n            sheetIndex = Store.luckysheetfile[order].index;\r\n        }\r\n    }\r\n\r\n    luckysheetDeleteCell(moveType, row, row, column, column, sheetIndex);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success()\r\n    }\r\n}\r\n\r\n/**\r\n * 设置某个单元格的属性，如果要设置单元格的值或者同时设置多个单元格属性，推荐使用setCellValue\r\n * @param {Number} row 单元格所在行数；从0开始的整数，0表示第一行\r\n * @param {Number} column 单元格所在列数；从0开始的整数，0表示第一列\r\n * @param {String} attr\r\n * @param {Number | String | Object} value 具体的设置值，一个属性会对应多个值，参考 单元格属性表的值示例，特殊情况：如果属性类型attr是单元格格式ct，则设置值value应提供ct.fa，比如设置A1单元格的格式为百分比格式：luckysheet.setCellFormat(0, 0, \"ct\", \"0.00%\")\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数, callback参数为改变后的cell对象\r\n */\r\nexport function setCellFormat(row, column, attr, value, options = {}) {\r\n    if (!isRealNum(row) || !isRealNum(column)) {\r\n        return tooltip.info('Arguments row or column cannot be null or undefined.', '')\r\n    }\r\n\r\n    if (!attr) {\r\n        return tooltip.info('Arguments attr cannot be null or undefined.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n        success\r\n    } = { ...options };\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let targetSheetData = $.extend(true, [], file.data);\r\n    if(targetSheetData.length == 0){\r\n        targetSheetData = sheetmanage.buildGridData(file);\r\n    }\r\n\r\n    let cellData = targetSheetData[row][column] || {};\r\n    let cfg = $.extend(true, {}, file.config);\r\n\r\n    // 特殊格式\r\n    if (attr == 'ct' && (!value || !value.hasOwnProperty('fa') || !value.hasOwnProperty('t'))) {\r\n        return new TypeError('While set attribute \\'ct\\' to cell, the value must have property \\'fa\\' and \\'t\\'')\r\n    }\r\n\r\n    if (attr == 'bd') {\r\n        if(cfg[\"borderInfo\"] == null){\r\n            cfg[\"borderInfo\"] = [];\r\n        }\r\n\r\n        let borderInfo = {\r\n            rangeType: \"range\",\r\n            borderType: \"border-all\",\r\n            color: \"#000\",\r\n            style: \"1\",\r\n            range: [{\r\n                column: [column, column],\r\n                row: [row, row]\r\n            }],\r\n            ...value,\r\n        }\r\n\r\n        cfg[\"borderInfo\"].push(borderInfo);\r\n    } else {\r\n        cellData[attr] = value;\r\n    }\r\n\r\n    targetSheetData[row][column] = cellData;\r\n\r\n    // refresh\r\n    if(file.index == Store.currentSheetIndex){\r\n        file.config = cfg;\r\n        Store.config = cfg;\r\n        jfrefreshgrid(targetSheetData, [{ \"row\": [row, row], \"column\": [column, column] }]);\r\n    }\r\n    else {\r\n        file.config = cfg;\r\n        file.data = targetSheetData;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success(cellData);\r\n    }\r\n}\r\n\r\n/**\r\n * 查找一个工作表中的指定内容，返回查找到的内容组成的单元格一位数组，数据格式同celldata\r\n * @param {String} content 要查找的内容 可以为正则表达式（不包含前后'/')\r\n * @param {Object} options 可选参数\r\n * @param {Boolean} options.isRegularExpression 是否正则表达式匹配；默认为 false. 注意：正则中的规则需要转义，如\\S需要写成 \\\\S\r\n * @param {Boolean} options.isWholeWord 是否整词匹配；默认为 false\r\n * @param {Boolean} options.isCaseSensitive 是否区分大小写匹配；默认为 false\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {String} options.type 单元格属性；默认值为m\r\n */\r\nexport function find(content, options = {}) {\r\n    if (!content && content != 0) {\r\n        return tooltip.info('Search content cannot be null or empty', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        isRegularExpression = false,\r\n        isWholeWord = false,\r\n        isCaseSensitive = false,\r\n        order = curSheetOrder,\r\n        type = \"m\"\r\n    } = { ...options };\r\n    let targetSheetData = Store.luckysheetfile[order].data;\r\n\r\n    let result = [];\r\n    for (let i = 0; i < targetSheetData.length; i++) {\r\n        const rowArr = targetSheetData[i];\r\n\r\n        for (let j = 0; j < rowArr.length; j++) {\r\n            const cell = rowArr[j];\r\n\r\n            if (!cell) {\r\n                continue;\r\n            }\r\n\r\n            // 添加cell的row, column属性\r\n            // replace方法中的setCellValue中需要使用该属性\r\n            cell.row = i;\r\n            cell.column = j;\r\n\r\n            if (isWholeWord) {\r\n                if (isCaseSensitive) {\r\n                    if (content.toString() == cell[type]) {\r\n                        result.push(cell)\r\n                    }\r\n                } else {\r\n                    if (cell[type] && content.toString().toLowerCase() == cell[type].toLowerCase()) {\r\n                        result.push(cell)\r\n                    }\r\n                }\r\n            } else if (isRegularExpression) {\r\n                let reg;\r\n                if (isCaseSensitive) {\r\n                    reg = new RegExp(func_methods.getRegExpStr(content), 'g')\r\n                } else {\r\n                    reg = new RegExp(func_methods.getRegExpStr(content), 'ig')\r\n                }\r\n                if (reg.test(cell[type])) {\r\n                    result.push(cell)\r\n                }\r\n            } else if (isCaseSensitive) {\r\n                let reg = new RegExp(func_methods.getRegExpStr(content), 'g');\r\n                if (reg.test(cell[type])) {\r\n                    result.push(cell);\r\n                }\r\n            } else {\r\n                let reg = new RegExp(func_methods.getRegExpStr(content), 'ig');\r\n                if (reg.test(cell[type])) {\r\n                    result.push(cell);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\n/**\r\n * 查找一个工作表中的指定内容并替换成新的内容，返回替换后的内容组成的单元格一位数组，数据格式同celldata。\r\n * @param {String} content 要查找的内容\r\n * @param {String} replaceContent 要替换的内容\r\n * @param {Object} options 可选参数\r\n * @param {Boolean} options.isRegularExpression 是否正则表达式匹配；默认为 false\r\n * @param {Boolean} options.isWholeWord 是否整词匹配；默认为 false\r\n * @param {Boolean} options.isCaseSensitive 是否区分大小写匹配；默认为 false\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数, callback参数为替换后的cell集合\r\n */\r\nexport function replace(content, replaceContent, options = {}) {\r\n    let matchCells = find(content, options)\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n    let sheetData = $.extend(true, [], file.data);\r\n\r\n    matchCells.forEach(cell => {\r\n        cell.m = replaceContent;\r\n        setCellValue(cell.row, cell.column, replaceContent, {order: order, isRefresh: false});\r\n    })\r\n\r\n    let fileData = $.extend(true, [], file.data);\r\n    file.data.length = 0;\r\n    file.data.push(...sheetData);\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        jfrefreshgrid(fileData, undefined, undefined, true, false);\r\n    }\r\n\r\n    luckysheetrefreshgrid();\r\n\r\n    if (options.success && typeof options.success === 'function') {\r\n        options.success(matchCells)\r\n    }\r\n    return matchCells;\r\n}\r\n\r\n\r\n/**\r\n * 手动触发退出编辑模式\r\n * @param {Object} options 可选参数\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function exitEditMode(options = {}){\r\n    if(parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0){\r\n\r\n\r\n        if ($(\"#luckysheet-formula-search-c\").is(\":visible\") && formula.searchFunctionCell != null) {\r\n            formula.searchFunctionEnter($(\"#luckysheet-formula-search-c\").find(\".luckysheet-formula-search-item-active\"));\r\n        }\r\n        else {\r\n            formula.updatecell(Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[1]);\r\n            Store.luckysheet_select_save = [{\r\n                \"row\": [Store.luckysheetCellUpdate[0], Store.luckysheetCellUpdate[0]],\r\n                \"column\": [Store.luckysheetCellUpdate[1], Store.luckysheetCellUpdate[1]],\r\n                \"row_focus\": Store.luckysheetCellUpdate[0],\r\n                \"column_focus\": Store.luckysheetCellUpdate[1]\r\n            }];\r\n        }\r\n\r\n        //若有参数弹出框，隐藏\r\n        if($(\"#luckysheet-search-formula-parm\").is(\":visible\")){\r\n            $(\"#luckysheet-search-formula-parm\").hide();\r\n        }\r\n        //若有参数选取范围弹出框，隐藏\r\n        if($(\"#luckysheet-search-formula-parm-select\").is(\":visible\")){\r\n            $(\"#luckysheet-search-formula-parm-select\").hide();\r\n        }\r\n\r\n    }\r\n\r\n    if (options.success && typeof options.success === 'function') {\r\n        options.success();\r\n    }\r\n}\r\n\r\n/**\r\n * 手动触发进入编辑模式\r\n * @param {Object} options 可选参数\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function enterEditMode(options = {}){\r\n\r\n    if($(\"#luckysheet-conditionformat-dialog\").is(\":visible\")){\r\n        return;\r\n    }\r\n    else if ($(\"#luckysheet-cell-selected\").is(\":visible\")) {\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n        let row_index = last[\"row_focus\"], col_index = last[\"column_focus\"];\r\n\r\n        luckysheetupdateCell(row_index, col_index, Store.flowdata);\r\n    }\r\n\r\n    if (options.success && typeof options.success === 'function') {\r\n        options.success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 冻结首行\r\n * 若设置冻结的sheet不是当前sheet页，只设置参数不渲染\r\n * @param {Number | String} order 工作表索引\r\n */\r\nexport function frozenFirstRow(order) {\r\n    // store frozen\r\n    luckysheetFreezen.saveFrozen(\"freezenRow\", order);\r\n\r\n    // 冻结为当前sheet页\r\n    if (!order || order == getSheetIndex(Store.currentSheetIndex)) {\r\n        let freezenhorizontaldata, row_st, top;\r\n        if (luckysheetFreezen.freezenRealFirstRowColumn) {\r\n            let row_st = 0;\r\n            top = Store.visibledatarow[row_st] - 2 + Store.columnHeaderHeight;\r\n            freezenhorizontaldata = [\r\n                Store.visibledatarow[row_st],\r\n                row_st + 1,\r\n                0,\r\n                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n                top\r\n            ];\r\n        } else {\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n            if(row_st == -1){\r\n                row_st = 0;\r\n            }\r\n\r\n            top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            freezenhorizontaldata = [\r\n                Store.visibledatarow[row_st],\r\n                row_st + 1,\r\n                scrollTop,\r\n                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n                top\r\n            ];\r\n        }\r\n\r\n        luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n        if (luckysheetFreezen.freezenverticaldata != null) {\r\n            luckysheetFreezen.cancelFreezenVertical();\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n\r\n        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n        luckysheetFreezen.createAssistCanvas();\r\n        luckysheetrefreshgrid();\r\n    }\r\n}\r\n\r\n/**\r\n * 冻结首列\r\n * 若设置冻结的sheet不是当前sheet页，只设置参数不渲染\r\n * @param {Number | String} order 工作表索引\r\n */\r\nexport function frozenFirstColumn(order) {\r\n    // store frozen\r\n    luckysheetFreezen.saveFrozen(\"freezenColumn\", order);\r\n\r\n    // 冻结为当前sheet页\r\n    if (!order || order == getSheetIndex(Store.currentSheetIndex)) {\r\n        let freezenverticaldata, col_st, left;\r\n        if (luckysheetFreezen.freezenRealFirstRowColumn) {\r\n            col_st = 0;\r\n            left = Store.visibledatacolumn[col_st] - 2 + Store.rowHeaderWidth;\r\n            freezenverticaldata = [\r\n                Store.visibledatacolumn[col_st],\r\n                col_st + 1,\r\n                0,\r\n                luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n                left\r\n            ];\r\n        } else {\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n\r\n            col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n            if(col_st == -1){\r\n                col_st = 0;\r\n            }\r\n\r\n            left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            freezenverticaldata = [\r\n                Store.visibledatacolumn[col_st],\r\n                col_st + 1,\r\n                scrollLeft,\r\n                luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n                left\r\n            ];\r\n        }\r\n\r\n        luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n            luckysheetFreezen.cancelFreezenHorizontal();\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n\r\n        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n        luckysheetFreezen.createAssistCanvas();\r\n        luckysheetrefreshgrid();\r\n    }\r\n}\r\n\r\n/**\r\n * 冻结行选区\r\n * @param {Object} range 行选区范围的focus单元格的行列值构成的对象；格式为{ row_focus:0, column_focus:0 }\r\n * @param {Number | String} order 工作表索引\r\n */\r\nexport function frozenRowRange(range, order) {\r\n    const locale_frozen = locale().freezen;\r\n\r\n    if (!range || (!range.hasOwnProperty('row_focus') && !formula.iscelldata(range))) {\r\n        if(isEditMode()){\r\n            alert(locale_frozen.noSeletionError);\r\n        } else{\r\n            tooltip.info(locale_frozen.noSeletionError, \"\");\r\n        }\r\n        return\r\n    }\r\n\r\n    if (typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n        range = {\r\n            row_focus: range.row[0],\r\n            column_focus: range.column[0]\r\n        }\r\n    }\r\n    // store frozen\r\n    luckysheetFreezen.saveFrozen(\"freezenRowRange\", order, range);\r\n\r\n    if (!order || order == getSheetIndex(Store.currentSheetIndex)) {\r\n        let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n\r\n        let row_focus = range.row_focus;\r\n        if(row_focus > row_st){\r\n            row_st = row_focus;\r\n        }\r\n        if(row_st == -1){\r\n            row_st = 0;\r\n        }\r\n\r\n        let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n        let freezenhorizontaldata = [\r\n            Store.visibledatarow[row_st],\r\n            row_st + 1,\r\n            scrollTop,\r\n            luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n            top\r\n        ];\r\n        luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n        if (luckysheetFreezen.freezenverticaldata != null) {\r\n            luckysheetFreezen.cancelFreezenVertical();\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n\r\n        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n        luckysheetFreezen.createAssistCanvas();\r\n        luckysheetrefreshgrid();\r\n    }\r\n\r\n}\r\n\r\n/**\r\n * 冻结列选区\r\n * @param {Object} range 列选区范围的focus单元格的行列值构成的对象；格式为{ row_focus:0, column_focus:0 }\r\n * @param {Number | String} order 工作表索引\r\n */\r\nexport function frozenColumnRange(range, order) {\r\n    const locale_frozen = locale().freezen;\r\n    let isStringRange = typeof range === 'string' && formula.iscelldata(range);\r\n\r\n    if (!range || (!range.hasOwnProperty('column_focus') && !isStringRange)) {\r\n        if(isEditMode()){\r\n            alert(locale_frozen.noSeletionError);\r\n        } else{\r\n            tooltip.info(locale_frozen.noSeletionError, \"\");\r\n        }\r\n        return\r\n    }\r\n\r\n    if (isStringRange) {\r\n        range = formula.getcellrange(range)\r\n        range = {\r\n            row_focus: range.row[0],\r\n            column_focus: range.column[0]\r\n        }\r\n    }\r\n    // store frozen\r\n    luckysheetFreezen.saveFrozen(\"freezenColumnRange\", order, range);\r\n\r\n    if (!order || order == getSheetIndex(Store.currentSheetIndex)) {\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n\r\n        let column_focus = range.column_focus;\r\n        if(column_focus > col_st){\r\n            col_st = column_focus;\r\n        }\r\n        if(col_st == -1){\r\n            col_st = 0;\r\n        }\r\n\r\n        let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n        let freezenverticaldata = [\r\n            Store.visibledatacolumn[col_st],\r\n            col_st + 1,\r\n            scrollLeft,\r\n            luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n            left\r\n        ];\r\n        luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n            luckysheetFreezen.cancelFreezenHorizontal();\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n\r\n        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n        luckysheetFreezen.createAssistCanvas();\r\n        luckysheetrefreshgrid();\r\n    }\r\n}\r\n\r\n/**\r\n * 取消冻结\r\n * @param {Number | String} order\r\n */\r\nexport function cancelFrozen(order) {\r\n    luckysheetFreezen.saveFrozen(\"freezenCancel\", order);\r\n\r\n    // 取消当前sheet冻结时，刷新canvas\r\n    if (!order || order == getSheetIndex(Store.currentSheetIndex)) {\r\n        if (luckysheetFreezen.freezenverticaldata != null) {\r\n            luckysheetFreezen.cancelFreezenVertical();\r\n        }\r\n        if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n            luckysheetFreezen.cancelFreezenHorizontal();\r\n        }\r\n        luckysheetFreezen.createAssistCanvas();\r\n        luckysheetrefreshgrid();\r\n    }\r\n}\r\n\r\n/**\r\n * 冻结行操作。特别注意，只有在isRange设置为true的时候，才需要设置setting中的range，且与一般的range格式不同。\r\n * @param {Boolean} isRange 是否冻结行到选区 true-冻结行到选区  false-冻结首行\r\n * @param {Object} options 可选参数\r\n * @param {Object} options.range isRange为true的时候设置，开启冻结的单元格位置，格式为{ row_focus:0, column_focus:0 }，意为当前激活的单元格的行数和列数；默认从当前选区最后的一个选区中取得\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setHorizontalFrozen(isRange, options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        range,\r\n        order = curSheetOrder,\r\n        success\r\n    } = { ...options };\r\n\r\n    // 若已存在冻结，取消之前的冻结效果\r\n    cancelFrozen(order);\r\n\r\n    if (!isRange) {\r\n        frozenFirstRow(order)\r\n    } else { // 选区行冻结\r\n        frozenRowRange(range, order);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success()\r\n    }\r\n}\r\n\r\n/**\r\n * 冻结列操作。特别注意，只有在isRange设置为true的时候，才需要设置setting中的range，且与一般的range格式不同。\r\n * @param {Boolean} isRange 是否冻结列到选区 true-冻结列到选区  false-冻结首列\r\n * @param {Object} options 可选参数\r\n * @param {Object} options.range isRange为true的时候设置，开启冻结的单元格位置，格式为{ row_focus:0, column_focus:0 }，意为当前激活的单元格的行数和列数；默认从当前选区最后的一个选区中取得\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setVerticalFrozen(isRange, options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        range,\r\n        order = curSheetOrder,\r\n        success\r\n    } = { ...options };\r\n\r\n    // 若已存在冻结，取消之前的冻结效果\r\n    cancelFrozen(order);\r\n\r\n    if (!isRange) {\r\n        frozenFirstColumn(order);\r\n    } else {\r\n        frozenColumnRange(range, order);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success()\r\n    }\r\n}\r\n\r\n/**\r\n * 冻结行列操作。特别注意，只有在isRange设置为true的时候，才需要设置setting中的range，且与一般的range格式不同。\r\n * @param {Boolean} isRange 是否冻结行列到选区 true-冻结行列到选区  false-冻结首行列\r\n * @param {Object} options 可选参数\r\n * @param {Object} options.range isRange为true的时候设置，开启冻结的单元格位置，格式为{ row_focus:0, column_focus:0 }，意为当前激活的单元格的行数和列数；默认从当前选区最后的一个选区中取得\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setBothFrozen(isRange, options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        range,\r\n        order = curSheetOrder,\r\n        success\r\n    } = { ...options };\r\n\r\n    let isCurrentSheet = !order || order == getSheetIndex(Store.currentSheetIndex);\r\n    const locale_frozen = locale().freezen;\r\n\r\n    // 若已存在冻结，取消之前的冻结效果\r\n    cancelFrozen(order);\r\n\r\n    // 冻结首行列\r\n    if (!isRange) {\r\n        // store frozen\r\n        luckysheetFreezen.saveFrozen(\"freezenRC\", order)\r\n\r\n        if (isCurrentSheet) {\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n            if(row_st == -1){\r\n                row_st = 0;\r\n            }\r\n            let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            let freezenhorizontaldata = [\r\n                Store.visibledatarow[row_st],\r\n                row_st + 1,\r\n                scrollTop,\r\n                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n                top\r\n            ];\r\n            luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n            luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n            if(col_st == -1){\r\n                col_st = 0;\r\n            }\r\n            let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            let freezenverticaldata = [\r\n                Store.visibledatacolumn[col_st],\r\n                col_st + 1,\r\n                scrollLeft,\r\n                luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n                left\r\n            ];\r\n            luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n            luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n    } else {   // 冻结行列到选区\r\n        // store frozen\r\n        luckysheetFreezen.saveFrozen(\"freezenRCRange\", order, range)\r\n\r\n        let isStringRange = typeof range === 'string' && formula.iscelldata(range);\r\n        if (isCurrentSheet) {\r\n            if ((!range || !(range.hasOwnProperty('column_focus') && range.hasOwnProperty('row_focus'))) && !isStringRange) {\r\n                if(isEditMode()){\r\n                    alert(locale_frozen.noSeletionError);\r\n                } else{\r\n                    tooltip.info(locale_frozen.noSeletionError, \"\");\r\n                }\r\n                return\r\n            }\r\n\r\n            if (isStringRange) {\r\n                range = formula.getcellrange(range)\r\n                range = {\r\n                    row_focus: range.row[0],\r\n                    column_focus: range.column[0]\r\n                }\r\n            }\r\n\r\n            let scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n            let row_st = luckysheet_searcharray(Store.visibledatarow, scrollTop);\r\n\r\n            let row_focus = range.row_focus;\r\n\r\n            if(row_focus > row_st){\r\n                row_st = row_focus;\r\n            }\r\n\r\n            if(row_st == -1){\r\n                row_st = 0;\r\n            }\r\n\r\n            let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n            let freezenhorizontaldata = [\r\n                Store.visibledatarow[row_st],\r\n                row_st + 1,\r\n                scrollTop,\r\n                luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1),\r\n                top\r\n            ];\r\n            luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n\r\n            luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n\r\n            let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft();\r\n            let col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollLeft);\r\n\r\n            let column_focus = range.column_focus;\r\n\r\n            if(column_focus > col_st){\r\n                col_st = column_focus;\r\n            }\r\n\r\n            if(col_st == -1){\r\n                col_st = 0;\r\n            }\r\n\r\n            let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n            let freezenverticaldata = [\r\n                Store.visibledatacolumn[col_st],\r\n                col_st + 1,\r\n                scrollLeft,\r\n                luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1),\r\n                left\r\n            ];\r\n            luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n\r\n            luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n\r\n            luckysheetFreezen.createAssistCanvas();\r\n            luckysheetrefreshgrid();\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * 在第index行或列的位置，插入number行或列\r\n * @param {String} type 插入行或列 row-行  column-列\r\n * @param {Number} index 在第几行插入空白行，从0开始\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.number 插入的空白行数；默认为 1\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function insertRowOrColumn(type, index = 0, options = {}) {\r\n    if(!isRealNum(index)){\r\n        return tooltip.info('The index parameter is invalid.', '');\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        number = 1,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let _locale = locale();\r\n    let locale_info = _locale.info;\r\n    if (!isRealNum(number)) {\r\n        if(isEditMode()){\r\n            alert(locale_info.tipInputNumber);\r\n        } else{\r\n            tooltip.info(locale_info.tipInputNumber, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    number = parseInt(number);\r\n    if (number < 1 || number > 100) {\r\n        if(isEditMode()){\r\n            alert(locale_info.tipInputNumberLimit);\r\n        } else{\r\n            tooltip.info(locale_info.tipInputNumberLimit, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    // 默认在行上方增加行，列左侧增加列\r\n    let sheetIndex;\r\n    if (!isNaN(order)){\r\n        if(Store.luckysheetfile[order]){\r\n            sheetIndex = Store.luckysheetfile[order].index;\r\n        }\r\n    }\r\n\r\n    luckysheetextendtable(type, index, number, \"lefttop\", sheetIndex);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n/**\r\n * 在第index行或列的位置，插入number行或列\r\n * @param {String} type 插入行或列 row-行  column-列\r\n * @param {Number} index 在第几行插入空白行，从0开始\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.number 插入的空白行数；默认为 1\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function insertRowBottomOrColumnRight(type, index = 0, options = {}) {\r\n    if(!isRealNum(index)){\r\n        return tooltip.info('The index parameter is invalid.', '');\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        number = 1,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let _locale = locale();\r\n    let locale_info = _locale.info;\r\n    if (!isRealNum(number)) {\r\n        if(isEditMode()){\r\n            alert(locale_info.tipInputNumber);\r\n        } else{\r\n            tooltip.info(locale_info.tipInputNumber, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    number = parseInt(number);\r\n    if (number < 1 || number > 100) {\r\n        if(isEditMode()){\r\n            alert(locale_info.tipInputNumberLimit);\r\n        } else{\r\n            tooltip.info(locale_info.tipInputNumberLimit, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    // 默认在行上方增加行，列左侧增加列\r\n    let sheetIndex;\r\n    if(order){\r\n        if(Store.luckysheetfile[order]){\r\n            sheetIndex = Store.luckysheetfile[order].index;\r\n        }\r\n    }\r\n\r\n    luckysheetextendtable(type, index, number, \"rightbottom\", sheetIndex);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n/**\r\n * 在第row行的位置，插入number行空白行\r\n * @param {Number} row 在第几行插入空白行，从0开始\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.number 插入的空白行数；默认为 1\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function insertRow(row = 0, options = {}) {\r\n    insertRowOrColumn('row', row, options)\r\n}\r\n/**\r\n * 在第row行的位置，插入number行空白行\r\n * @param {Number} row 在第几行插入空白行，从0开始\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.number 插入的空白行数；默认为 1\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function insertRowBottom(row = 0, options = {}) {\r\n    insertRowBottomOrColumnRight('row', row, options)\r\n}\r\n/**\r\n * 在第column列的位置，插入number列空白列\r\n * @param {Number} column 在第几列插入空白列，从0开始\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.number 插入的空白列数；默认为 1\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function insertColumn(column = 0, options = {}) {\r\n    insertRowOrColumn('column', column, options)\r\n}\r\n/**\r\n * 在第column列的位置，插入number列空白列\r\n * @param {Number} column 在第几列插入空白列，从0开始\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.number 插入的空白列数；默认为 1\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function insertColumnRight(column = 0, options = {}) {\r\n    insertRowBottomOrColumnRight('column', column, options)\r\n}\r\n/**\r\n * 删除指定的行或列。删除行列之后，行列的序号并不会变化，下面的行（右侧的列）会补充到上（左）面，注意观察数据是否被正确删除即可。\r\n * @param {String} type 删除行或列 row-行  column-列\r\n * @param {Number} startIndex 要删除的起始行或列\r\n * @param {Number} endIndex 要删除的结束行或列\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function deleteRowOrColumn(type, startIndex, endIndex, options = {}) {\r\n    if (!isRealNum(startIndex) || !isRealNum(endIndex)) {\r\n        return tooltip.info('Please enter the index for deleting rows or columns correctly.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n\r\n    let sheetIndex;\r\n    if(order){\r\n        if(Store.luckysheetfile[order]){\r\n            sheetIndex = Store.luckysheetfile[order].index;\r\n        }\r\n    }\r\n    luckysheetdeletetable(type, startIndex, endIndex, sheetIndex);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success()\r\n    }\r\n}\r\n\r\n/**\r\n * 删除指定的行。\r\n * @param {Number} rowStart 要删除的起始行\r\n * @param {Number} rowEnd 要删除的结束行\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function deleteRow(rowStart, rowEnd, options = {}) {\r\n    deleteRowOrColumn('row', rowStart, rowEnd, options)\r\n}\r\n\r\n/**\r\n * 删除指定的列。\r\n * @param {Number} columnStart 要删除的起始列\r\n * @param {Number} columnEnd 要删除的结束列\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function deleteColumn(columnStart, columnEnd, options = {}) {\r\n    deleteRowOrColumn('column', columnStart, columnEnd, options)\r\n}\r\n\r\n/**\r\n * 隐藏行或列\r\n * @param {String} type 隐藏行或列  row-隐藏行  column-隐藏列\r\n * @param {Number} startIndex 起始行或列\r\n * @param {Number} endIndex 结束行或列\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function hideRowOrColumn(type, startIndex, endIndex, options = {}) {\r\n    if (!isRealNum(startIndex) || !isRealNum(endIndex)) {\r\n        return tooltip.info('Please enter the index for deleting rows or columns correctly.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n        saveParam = true,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n    let cfgKey = type === 'row' ? 'rowhidden': 'colhidden';\r\n    let cfg = $.extend(true, {}, file.config);\r\n    if(cfg[cfgKey] == null) {\r\n        cfg[cfgKey] = {};\r\n    }\r\n\r\n    for (let i = startIndex; i <= endIndex; i++) {\r\n        cfg[cfgKey][i] = 0;\r\n    }\r\n\r\n    //保存撤销\r\n    if(Store.clearjfundo){\r\n        let redo = {};\r\n        redo[\"type\"] = type === 'row' ? 'showHidRows' : 'showHidCols';\r\n        redo[\"sheetIndex\"] = file.index;\r\n        redo[\"config\"] = $.extend(true, {}, file.config);\r\n        redo[\"curconfig\"] = cfg;\r\n\r\n        Store.jfundo.length  = 0;\r\n        Store.jfredo.push(redo);\r\n    }\r\n\r\n    Store.luckysheetfile[order].config = cfg;\r\n\r\n    if (saveParam) {\r\n        server.saveParam(\"cg\", file.index, cfg[cfgKey], { \"k\": cfgKey });\r\n    }\r\n\r\n    // 若操作sheet为当前sheet页，行高、列宽 刷新\r\n    if (order == curSheetOrder) {\r\n        //config\r\n        Store.config = cfg;\r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * 显示隐藏的行或列\r\n * @param {String} type 显示行或列  row-显示行  column-显示列\r\n * @param {Number} startIndex 起始行或列\r\n * @param {Number} endIndex 结束行或列\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function showRowOrColumn(type, startIndex, endIndex, options = {}) {\r\n    if (!isRealNum(startIndex) || !isRealNum(endIndex)) {\r\n        return tooltip.info('Please enter the index for deleting rows or columns correctly.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curSheetOrder,\r\n        saveParam = true,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n    let cfgKey = type === 'row' ? 'rowhidden': 'colhidden';\r\n    let cfg = $.extend(true, {}, file.config);\r\n    if(cfg[cfgKey] == null) {\r\n        return;\r\n    }\r\n\r\n    for (let i = startIndex; i <= endIndex; i++) {\r\n        delete cfg[cfgKey][i];\r\n    }\r\n\r\n    //保存撤销\r\n    if(Store.clearjfundo){\r\n        let redo = {};\r\n        redo[\"type\"] = type === 'row' ? 'showHidRows' : 'showHidCols';\r\n        redo[\"sheetIndex\"] = file.index;\r\n        redo[\"config\"] = $.extend(true, {}, file.config);\r\n        redo[\"curconfig\"] = cfg;\r\n\r\n        Store.jfundo.length  = 0;\r\n        Store.jfredo.push(redo);\r\n    }\r\n\r\n    //config\r\n    Store.luckysheetfile[order].config = Store.config;\r\n\r\n    if (saveParam) {\r\n        server.saveParam(\"cg\", file.index, cfg[cfgKey], { \"k\": cfgKey });\r\n    }\r\n\r\n    // 若操作sheet为当前sheet页，行高、列宽 刷新\r\n    if (order === curSheetOrder) {\r\n        Store.config = cfg;\r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * 隐藏行\r\n * @param {Number} startIndex 起始行\r\n * @param {Number} endIndex 结束行\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function hideRow(startIndex, endIndex, options = {}) {\r\n    hideRowOrColumn('row', startIndex, endIndex, options);\r\n}\r\n\r\n/**\r\n * 显示行\r\n * @param {Number} startIndex 起始行\r\n * @param {Number} endIndex 结束行\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function showRow(startIndex, endIndex, options = {}) {\r\n    showRowOrColumn('row', startIndex, endIndex, options);\r\n}\r\n\r\n/**\r\n * 隐藏列\r\n * @param {Number} startIndex 起始列\r\n * @param {Number} endIndex 结束列\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function hideColumn(startIndex, endIndex, options = {}) {\r\n    hideRowOrColumn('column', startIndex, endIndex, options);\r\n}\r\n\r\n/**\r\n * 显示列\r\n * @param {Number} startIndex 起始列\r\n * @param {Number} endIndex 结束列\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function showColumn(startIndex, endIndex, options = {}) {\r\n    showRowOrColumn('column', startIndex, endIndex, options);\r\n}\r\n\r\n\r\n/**\r\n * 设置指定行的高度。优先级最高，高于默认行高和用户自定义行高。\r\n * @param {Object} rowInfo 行数和高度对应关系\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setRowHeight(rowInfo, options = {}) {\r\n    if(getObjType(rowInfo) != 'object'){\r\n        return tooltip.info(\"The rowInfo parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let cfg = $.extend(true, {}, file.config);\r\n    if(cfg['rowlen'] == null){\r\n        cfg['rowlen'] = {};\r\n    }\r\n\r\n    for(let r in rowInfo){\r\n        if(parseInt(r) >= 0){\r\n            let len = rowInfo[r];\r\n\r\n            if (len === 'auto') {\r\n                cfg['rowlen'][parseInt(r)] = len\r\n            } else {\r\n                if(Number(len) >= 0){\r\n                    cfg['rowlen'][parseInt(r)] = Number(len);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    file.config = cfg;\r\n\r\n    server.saveParam(\"cg\", file.index, cfg[\"rowlen\"], { \"k\": \"rowlen\" });\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.config = cfg;\r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success()\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 设置指定列的宽度\r\n * @param {Object} columnInfo 行数和高度对应关系\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setColumnWidth(columnInfo, options = {}) {\r\n    if(getObjType(columnInfo) != 'object'){\r\n        return tooltip.info(\"The columnInfo parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let cfg = $.extend(true, {}, file.config);\r\n    if(cfg['columnlen'] == null){\r\n        cfg['columnlen'] = {};\r\n    }\r\n\r\n    for(let c in columnInfo){\r\n        if(parseInt(c) >= 0){\r\n            let len = columnInfo[c];\r\n\r\n            if (len === 'auto') {\r\n                cfg['columnlen'][parseInt(c)] = len\r\n            } else {\r\n                if(Number(len) >= 0){\r\n                    cfg['columnlen'][parseInt(c)] = Number(len);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    file.config = cfg;\r\n\r\n    server.saveParam(\"cg\", file.index, cfg[\"columnlen\"], { \"k\": \"columnlen\" });\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.config = cfg;\r\n        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success()\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 获取指定工作表指定行的高度，得到行号和高度对应关系的对象\r\n * @param {Array} rowInfo 行号下标组成的数组；行号下标从0开始；\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function getRowHeight(rowInfo, options = {}) {\r\n    if(getObjType(rowInfo) != 'array' || rowInfo.length == 0){\r\n        return tooltip.info(\"The rowInfo parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let cfg = $.extend(true, {}, file.config);\r\n    let rowlen = cfg[\"rowlen\"] || {};\r\n\r\n    let rowlenObj = {};\r\n\r\n    rowInfo.forEach((item) => {\r\n        if(parseInt(item) >= 0){\r\n            let size = rowlen[parseInt(item)] || Store.defaultrowlen;\r\n            rowlenObj[parseInt(item)] = size;\r\n        }\r\n    })\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success()\r\n        }\r\n    }, 1)\r\n\r\n    return rowlenObj;\r\n}\r\n\r\n\r\n/**\r\n * 获取指定工作表指定列的宽度，得到列号和宽度对应关系的对象\r\n * @param {Array} columnInfo 行号下标组成的数组；行号下标从0开始；\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function getColumnWidth(columnInfo, options = {}) {\r\n    if(getObjType(columnInfo) != 'array' || columnInfo.length == 0){\r\n        return tooltip.info(\"The columnInfo parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let cfg = $.extend(true, {}, file.config);\r\n    let columnlen = cfg[\"columnlen\"] || {};\r\n\r\n    let columnlenObj = {};\r\n\r\n    columnInfo.forEach((item) => {\r\n        if(parseInt(item) >= 0){\r\n            let size = columnlen[parseInt(item)] || Store.defaultcollen;\r\n            columnlenObj[parseInt(item)] = size;\r\n        }\r\n    })\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success()\r\n        }\r\n    }, 1)\r\n\r\n    return columnlenObj;\r\n}\r\n\r\n\r\n/**\r\n * 获取工作表的默认行高\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function getDefaultRowHeight(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success()\r\n        }\r\n    }, 1)\r\n\r\n    // *返回指定的工作表默认行高，如果未配置就返回全局的默认行高\r\n    return Store.luckysheetfile[order].defaultRowHeight || Store.defaultrowlen;\r\n}\r\n\r\n\r\n/**\r\n * 获取工作表的默认列宽\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function getDefaultColWidth(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success()\r\n        }\r\n    }, 1)\r\n\r\n    // *返回指定的工作表默认列宽，如果未配置就返回全局的默认列宽\r\n    return Store.luckysheetfile[order].defaultColWidth || Store.defaultcollen;\r\n}\r\n\r\n\r\n/**\r\n * 返回当前选区对象的数组，可能存在多个选区。\r\n * 每个选区的格式为row/column信息组成的对象{row:[0,1],column:[0,1]}\r\n * @returns {Array}\r\n */\r\nexport function getRange() {\r\n    let rangeArr = JSON.parse(JSON.stringify(Store.luckysheet_select_save));\r\n\r\n    let result = [];\r\n\r\n    for (let i = 0; i < rangeArr.length; i++) {\r\n        let rangeItem = rangeArr[i];\r\n        let temp = {\r\n            row: rangeItem.row,\r\n            column: rangeItem.column\r\n        }\r\n        result.push(temp)\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\n/**\r\n * 返回表示指定区域内所有单元格位置的数组，区别getRange方法，该方法以cell单元格(而非某块连续的区域)为单位来组织选区的数据\r\n * @param   {Array}   range 可选参数，默认为当前选中区域\r\n * @returns {Array}   对象数组\r\n */\r\nexport function getRangeWithFlatten(range){\r\n    range = range ||  getRange();\r\n\r\n    let result = [];\r\n\r\n    range.forEach(ele=>{\r\n        // 这个data可能是个范围或者是单个cell\r\n        let rs = ele.row;\r\n        let cs = ele.column;\r\n        for(let r = rs[0]; r <= rs[1]; r++){\r\n            for(let c = cs[0]; c <= cs[1]; c++){\r\n                // r c 当前的r和当前的c\r\n                result.push({r,c});\r\n            }\r\n        }\r\n    })\r\n    return result;\r\n}\r\n\r\n/**\r\n * 返回表示指定区域内所有单元格内容的对象数组\r\n * @param   {Array}   range 可选参数，默认为当前选中区域扁平化后的对象，结构形如[{r:0,c:0},{r:0,c:1}...]\r\n * @returns {Array}   对象数组\r\n */\r\nexport function getRangeValuesWithFlatte(range){\r\n    range = range || getRangeWithFlatten();\r\n\r\n    let values = [];\r\n\r\n    // 获取到的这个数据不是最新的数据\r\n    range.forEach(item=> {\r\n        values.push(Store.flowdata[item.r][item.c]);\r\n    });\r\n    return values;\r\n}\r\n\r\n\r\n/**\r\n * 返回对应当前选区的坐标字符串数组，可能存在多个选区。\r\n * 每个选区可能是单个单元格(如 A1)或多个单元格组成的矩形区域(如 D9:E12)\r\n * @returns {Array}\r\n */\r\nexport function getRangeAxis() {\r\n    let result = [];\r\n    let rangeArr = JSON.parse(JSON.stringify(Store.luckysheet_select_save));\r\n    let sheetIndex = Store.currentSheetIndex;\r\n\r\n    rangeArr.forEach(ele=>{\r\n        let axisText = getRangetxt(sheetIndex, {column:ele.column,row:ele.row});\r\n        result.push(axisText);\r\n    })\r\n\r\n    return result;\r\n}\r\n\r\n/**\r\n * 返回指定工作表指定范围的单元格二维数组数据，每个单元格为一个对象\r\n * @param {Object} options 可选参数\r\n * @param {Object | String} options.range 选区范围,支持选区的格式为\"A1:B2\"、\"sheetName!A1:B2\"或者{row:[0,1],column:[0,1]}，只能为单个选区；默认为当前选区\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n */\r\nexport function getRangeValue(options = {}) {\r\n    let curOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        range,\r\n        order = curOrder\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if (!range || typeof range === 'object') {\r\n        return getdatabyselection(range, file.index);\r\n    } else if (typeof range === 'string') {\r\n        if (formula.iscelldata(range)) {\r\n            return getdatabyselection(formula.getcellrange(range), file.index)\r\n        } else {\r\n            tooltip.info('The range is invalid, please check range parameter.', '')\r\n        }\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 复制指定工作表指定单元格区域的数据，返回包含`<table>`html格式的数据，可用于粘贴到excel中保持单元格样式。\r\n * @param {Object} options 可选参数\r\n * @param {Array | Object | String} options.range 选区范围\r\n * @param {order} options.order 工作表下标\r\n */\r\nexport function getRangeHtml(options = {}) {\r\n    let {\r\n        range = Store.luckysheet_select_save,\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n    range = JSON.parse(JSON.stringify(range));\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = [{\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        }]\r\n    }\r\n    else if(getObjType(range) == 'object'){\r\n        if(range.row == null || range.column == null){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        range = [{\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        }];\r\n    }\r\n\r\n    if(getObjType(range) != 'array'){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    //复制范围内包含部分合并单元格，提示\r\n    let cfg = $.extend(true, {}, file.config);\r\n    if (cfg[\"merge\"] != null) {\r\n        let has_PartMC = false;\r\n\r\n        for (let s = 0; s < range.length; s++) {\r\n            let r1 = range[s].row[0],\r\n                r2 = range[s].row[1];\r\n            let c1 = range[s].column[0],\r\n                c2 = range[s].column[1];\r\n\r\n            has_PartMC = hasPartMC(cfg, r1, r2, c1, c2);\r\n\r\n            if (has_PartMC) {\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (has_PartMC) {\r\n            return tooltip.info(\"Cannot perform this operation on partially merged cells\", \"\");\r\n        }\r\n    }\r\n\r\n    //多重选区 有条件格式时 提示\r\n    let cdformat = $.extend(true, [], file.luckysheet_conditionformat_save);\r\n    if (range.length > 1 && cdformat.length > 0) {\r\n        let hasCF = false;\r\n        let cf_compute = conditionformat.getComputeMap(file.index);\r\n\r\n        for (let s = 0; s < range.length; s++) {\r\n            let r1 = range[s].row[0],\r\n                r2 = range[s].row[1];\r\n            let c1 = range[s].column[0],\r\n                c2 = range[s].column[1];\r\n\r\n            for (let r = r1; r <= r2; r++) {\r\n                for (let c = c1; c <= c2; c++) {\r\n                    if (conditionformat.checksCF(r, c, cf_compute) != null) {\r\n                        hasCF = true;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if (hasCF) {\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (hasCF) {\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (hasCF) {\r\n            return tooltip.info(\"Cannot perform this operation on multiple selection areas, please select a single area\", \"\");\r\n        }\r\n    }\r\n\r\n    //多重选区 行不一样且列不一样时 提示\r\n    if (range.length > 1) {\r\n        let isSameRow = true,\r\n            str_r = range[0].row[0],\r\n            end_r = range[0].row[1];\r\n        let isSameCol = true,\r\n            str_c = range[0].column[0],\r\n            end_c = range[0].column[1];\r\n\r\n        for (let s = 1; s < range.length; s++) {\r\n            if (range[s].row[0] != str_r || range[s].row[1] != end_r) {\r\n                isSameRow = false;\r\n            }\r\n\r\n            if (range[s].column[0] != str_c || range[s].column[1] != end_c) {\r\n                isSameCol = false;\r\n            }\r\n        }\r\n\r\n        if ((!isSameRow && !isSameCol) || selectIsOverlap(range)) {\r\n            return tooltip.info(\"Cannot perform this operation on multiple selection areas, please select a single area\", \"\");\r\n        }\r\n    }\r\n\r\n    let rowIndexArr = [], colIndexArr = [];\r\n\r\n    for(let s = 0; s < range.length; s++){\r\n        let r1 = range[s].row[0],\r\n            r2 = range[s].row[1];\r\n        let c1 = range[s].column[0],\r\n            c2 = range[s].column[1];\r\n\r\n        for(let r = r1; r <= r2; r++){\r\n            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][r] != null) {\r\n                continue;\r\n            }\r\n\r\n            if(!rowIndexArr.includes(r)){\r\n                rowIndexArr.push(r);\r\n            }\r\n\r\n            for(let c = c1; c <= c2; c++){\r\n                if (cfg[\"colhidden\"] != null && cfg[\"colhidden\"][c] != null) {\r\n                    continue;\r\n                }\r\n\r\n                if(!colIndexArr.includes(c)){\r\n                    colIndexArr.push(c);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    let borderInfoCompute;\r\n    if(cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0){ //边框\r\n        borderInfoCompute = getBorderInfoCompute(file.index);\r\n    }\r\n\r\n    let d = file.data;\r\n    if(d == null || d.length == 0){\r\n        d = sheetmanage.buildGridData(file);\r\n    }\r\n\r\n    let cpdata = \"\";\r\n    let colgroup = \"\";\r\n\r\n    rowIndexArr = rowIndexArr.sort((a, b) => a - b);\r\n    colIndexArr = colIndexArr.sort((a, b) => a - b);\r\n\r\n    for (let i = 0; i < rowIndexArr.length; i++) {\r\n        let r = rowIndexArr[i];\r\n\r\n        if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][r] != null) {\r\n            continue;\r\n        }\r\n\r\n        cpdata += '<tr>';\r\n\r\n        for (let j = 0; j < colIndexArr.length; j++) {\r\n            let c = colIndexArr[j];\r\n\r\n            if (cfg[\"colhidden\"] != null && cfg[\"colhidden\"][c] != null) {\r\n                continue;\r\n            }\r\n\r\n            let column = '<td ${span} style=\"${style}\">';\r\n\r\n            if (d[r] != null && d[r][c] != null) {\r\n                let style = \"\", span = \"\";\r\n\r\n                if(r == rowIndexArr[0]){\r\n                    if(cfg[\"columnlen\"] == null || cfg[\"columnlen\"][c.toString()] == null){\r\n                        colgroup += '<colgroup width=\"72px\"></colgroup>';\r\n                    }\r\n                    else {\r\n                        colgroup += '<colgroup width=\"'+ cfg[\"columnlen\"][c.toString()] +'px\"></colgroup>';\r\n                    }\r\n                }\r\n\r\n                if(c == colIndexArr[0]){\r\n                    if(cfg[\"rowlen\"] == null || cfg[\"rowlen\"][r.toString()] == null){\r\n                        style += 'height:19px;';\r\n                    }\r\n                    else {\r\n                        style += 'height:'+ cfg[\"rowlen\"][r.toString()] + 'px;';\r\n                    }\r\n                }\r\n\r\n                let reg = /^(w|W)((0?)|(0\\.0+))$/;\r\n                let c_value;\r\n                if(d[r][c].ct != null && d[r][c].ct.fa != null && d[r][c].ct.fa.match(reg)){\r\n                    c_value = getcellvalue(r, c, d);\r\n                }\r\n                else{\r\n                    c_value = getcellvalue(r, c, d, \"m\");\r\n                }\r\n\r\n                style += menuButton.getStyleByCell(d, r, c);\r\n\r\n                if(getObjType(d[r][c]) == \"object\" && (\"mc\" in d[r][c])){\r\n                    if(\"rs\" in d[r][c][\"mc\"]){\r\n                        span = 'rowspan=\"'+ d[r][c][\"mc\"].rs +'\" colspan=\"'+ d[r][c][\"mc\"].cs +'\"';\r\n\r\n                        //边框\r\n                        if(borderInfoCompute && borderInfoCompute[r + \"_\" + c]){\r\n                            let bl_obj = { \"color\": {}, \"style\": {} },\r\n                                br_obj = { \"color\": {}, \"style\": {} },\r\n                                bt_obj = { \"color\": {}, \"style\": {} },\r\n                                bb_obj = { \"color\": {}, \"style\": {} };\r\n\r\n                            for(let bd_r = r; bd_r < (r + d[r][c][\"mc\"].rs); bd_r++){\r\n                                for(let bd_c = c; bd_c < (c + d[r][c][\"mc\"].cs); bd_c++){\r\n                                    if(bd_r == r && borderInfoCompute[bd_r + \"_\" + bd_c] && borderInfoCompute[bd_r + \"_\" + bd_c].t){\r\n                                        let linetype = borderInfoCompute[bd_r + \"_\" + bd_c].t.style;\r\n                                        let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].t.color;\r\n\r\n                                        if(bt_obj[\"style\"][linetype] == null){\r\n                                            bt_obj[\"style\"][linetype] = 1;\r\n                                        }\r\n                                        else{\r\n                                            bt_obj[\"style\"][linetype] = bt_obj[\"style\"][linetype] + 1;\r\n                                        }\r\n\r\n                                        if(bt_obj[\"color\"][bcolor] == null){\r\n                                            bt_obj[\"color\"][bcolor] = 1;\r\n                                        }\r\n                                        else{\r\n                                            bt_obj[\"color\"][bcolor] = bt_obj[\"color\"][bcolor] + 1;\r\n                                        }\r\n                                    }\r\n\r\n                                    if(bd_r == (r + d[r][c][\"mc\"].rs - 1) && borderInfoCompute[bd_r + \"_\" + bd_c] && borderInfoCompute[bd_r + \"_\" + bd_c].b){\r\n                                        let linetype = borderInfoCompute[bd_r + \"_\" + bd_c].b.style;\r\n                                        let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].b.color;\r\n\r\n                                        if(bb_obj[\"style\"][linetype] == null){\r\n                                            bb_obj[\"style\"][linetype] = 1;\r\n                                        }\r\n                                        else{\r\n                                            bb_obj[\"style\"][linetype] = bb_obj[\"style\"][linetype] + 1;\r\n                                        }\r\n\r\n                                        if(bb_obj[\"color\"][bcolor] == null){\r\n                                            bb_obj[\"color\"][bcolor] = 1;\r\n                                        }\r\n                                        else{\r\n                                            bb_obj[\"color\"][bcolor] = bb_obj[\"color\"][bcolor] + 1;\r\n                                        }\r\n                                    }\r\n\r\n                                    if(bd_c == c && borderInfoCompute[bd_r + \"_\" + bd_c] && borderInfoCompute[bd_r + \"_\" + bd_c].l){\r\n                                        let linetype = borderInfoCompute[r + \"_\" + c].l.style;\r\n                                        let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].l.color;\r\n\r\n                                        if(bl_obj[\"style\"][linetype] == null){\r\n                                            bl_obj[\"style\"][linetype] = 1;\r\n                                        }\r\n                                        else{\r\n                                            bl_obj[\"style\"][linetype] = bl_obj[\"style\"][linetype] + 1;\r\n                                        }\r\n\r\n                                        if(bl_obj[\"color\"][bcolor] == null){\r\n                                            bl_obj[\"color\"][bcolor] = 1;\r\n                                        }\r\n                                        else{\r\n                                            bl_obj[\"color\"][bcolor] = bl_obj[\"color\"][bcolor] + 1;\r\n                                        }\r\n                                    }\r\n\r\n                                    if(bd_c == (c + d[r][c][\"mc\"].cs - 1) && borderInfoCompute[bd_r + \"_\" + bd_c] && borderInfoCompute[bd_r + \"_\" + bd_c].r){\r\n                                        let linetype = borderInfoCompute[bd_r + \"_\" + bd_c].r.style;\r\n                                        let bcolor = borderInfoCompute[bd_r + \"_\" + bd_c].r.color;\r\n\r\n                                        if(br_obj[\"style\"][linetype] == null){\r\n                                            br_obj[\"style\"][linetype] = 1;\r\n                                        }\r\n                                        else{\r\n                                            br_obj[\"style\"][linetype] = br_obj[\"style\"][linetype] + 1;\r\n                                        }\r\n\r\n                                        if(br_obj[\"color\"][bcolor] == null){\r\n                                            br_obj[\"color\"][bcolor] = 1;\r\n                                        }\r\n                                        else{\r\n                                            br_obj[\"color\"][bcolor] = br_obj[\"color\"][bcolor] + 1;\r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n\r\n                            let rowlen = d[r][c][\"mc\"].rs, collen = d[r][c][\"mc\"].cs;\r\n\r\n                            if(JSON.stringify(bl_obj).length > 23){\r\n                                let bl_color = null, bl_style = null;\r\n\r\n                                for(let x in bl_obj.color){\r\n                                    if(bl_obj.color[x] >= (rowlen / 2)){\r\n                                        bl_color = x;\r\n                                    }\r\n                                }\r\n\r\n                                for(let x in bl_obj.style){\r\n                                    if(bl_obj.style[x] >= (rowlen / 2)){\r\n                                        bl_style = x;\r\n                                    }\r\n                                }\r\n\r\n                                if(bl_color != null && bl_style != null){\r\n                                    style += \"border-left:\" + selection.getHtmlBorderStyle(bl_style, bl_color);\r\n                                }\r\n                            }\r\n\r\n                            if(JSON.stringify(br_obj).length > 23){\r\n                                let br_color = null, br_style = null;\r\n\r\n                                for(let x in br_obj.color){\r\n                                    if(br_obj.color[x] >= (rowlen / 2)){\r\n                                        br_color = x;\r\n                                    }\r\n                                }\r\n\r\n                                for(let x in br_obj.style){\r\n                                    if(br_obj.style[x] >= (rowlen / 2)){\r\n                                        br_style = x;\r\n                                    }\r\n                                }\r\n\r\n                                if(br_color != null && br_style != null){\r\n                                    style += \"border-right:\" + selection.getHtmlBorderStyle(br_style, br_color);\r\n                                }\r\n                            }\r\n\r\n                            if(JSON.stringify(bt_obj).length > 23){\r\n                                let bt_color = null, bt_style = null;\r\n\r\n                                for(let x in bt_obj.color){\r\n                                    if(bt_obj.color[x] >= (collen / 2)){\r\n                                        bt_color = x;\r\n                                    }\r\n                                }\r\n\r\n                                for(let x in bt_obj.style){\r\n                                    if(bt_obj.style[x] >= (collen / 2)){\r\n                                        bt_style = x;\r\n                                    }\r\n                                }\r\n\r\n                                if(bt_color != null && bt_style != null){\r\n                                    style += \"border-top:\" + selection.getHtmlBorderStyle(bt_style, bt_color);\r\n                                }\r\n                            }\r\n\r\n                            if(JSON.stringify(bb_obj).length > 23){\r\n                                let bb_color = null, bb_style = null;\r\n\r\n                                for(let x in bb_obj.color){\r\n                                    if(bb_obj.color[x] >= (collen / 2)){\r\n                                        bb_color = x;\r\n                                    }\r\n                                }\r\n\r\n                                for(let x in bb_obj.style){\r\n                                    if(bb_obj.style[x] >= (collen / 2)){\r\n                                        bb_style = x;\r\n                                    }\r\n                                }\r\n\r\n                                if(bb_color != null && bb_style != null){\r\n                                    style += \"border-bottom:\" + selection.getHtmlBorderStyle(bb_style, bb_color);\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else{\r\n                        continue;\r\n                    }\r\n                }\r\n                else{\r\n                    //边框\r\n                    if(borderInfoCompute && borderInfoCompute[r + \"_\" + c]){\r\n                        //左边框\r\n                        if(borderInfoCompute[r + \"_\" + c].l){\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].l.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].l.color;\r\n                            style += \"border-left:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n\r\n                        //右边框\r\n                        if(borderInfoCompute[r + \"_\" + c].r){\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].r.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].r.color;\r\n                            style += \"border-right:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n\r\n                        //下边框\r\n                        if(borderInfoCompute[r + \"_\" + c].b){\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].b.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].b.color;\r\n                            style += \"border-bottom:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n\r\n                        //上边框\r\n                        if(borderInfoCompute[r + \"_\" + c].t){\r\n                            let linetype = borderInfoCompute[r + \"_\" + c].t.style;\r\n                            let bcolor = borderInfoCompute[r + \"_\" + c].t.color;\r\n                            style += \"border-top:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                column = replaceHtml(column, {\"style\": style, \"span\": span});\r\n\r\n                if(c_value == null){\r\n                    c_value = getcellvalue(r, c, d);\r\n                }\r\n\r\n                if(c_value == null){\r\n                    c_value = \" \";\r\n                }\r\n\r\n                column += c_value;\r\n            }\r\n            else {\r\n                let style = \"\";\r\n\r\n                //边框\r\n                if(borderInfoCompute && borderInfoCompute[r + \"_\" + c]){\r\n                    //左边框\r\n                    if(borderInfoCompute[r + \"_\" + c].l){\r\n                        let linetype = borderInfoCompute[r + \"_\" + c].l.style;\r\n                        let bcolor = borderInfoCompute[r + \"_\" + c].l.color;\r\n                        style += \"border-left:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                    }\r\n\r\n                    //右边框\r\n                    if(borderInfoCompute[r + \"_\" + c].r){\r\n                        let linetype = borderInfoCompute[r + \"_\" + c].r.style;\r\n                        let bcolor = borderInfoCompute[r + \"_\" + c].r.color;\r\n                        style += \"border-right:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                    }\r\n\r\n                    //下边框\r\n                    if(borderInfoCompute[r + \"_\" + c].b){\r\n                        let linetype = borderInfoCompute[r + \"_\" + c].b.style;\r\n                        let bcolor = borderInfoCompute[r + \"_\" + c].b.color;\r\n                        style += \"border-bottom:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                    }\r\n\r\n                    //上边框\r\n                    if(borderInfoCompute[r + \"_\" + c].t){\r\n                        let linetype = borderInfoCompute[r + \"_\" + c].t.style;\r\n                        let bcolor = borderInfoCompute[r + \"_\" + c].t.color;\r\n                        style += \"border-top:\" + selection.getHtmlBorderStyle(linetype, bcolor);\r\n                    }\r\n                }\r\n\r\n                column += \"\";\r\n\r\n                if(r == rowIndexArr[0]){\r\n                    if(cfg[\"columnlen\"] == null || cfg[\"columnlen\"][c.toString()] == null){\r\n                        colgroup += '<colgroup width=\"72px\"></colgroup>';\r\n                    }\r\n                    else {\r\n                        colgroup += '<colgroup width=\"'+ cfg[\"columnlen\"][c.toString()] +'px\"></colgroup>';\r\n                    }\r\n                }\r\n\r\n                if(c == colIndexArr[0]){\r\n                    if(cfg[\"rowlen\"] == null || cfg[\"rowlen\"][r.toString()] == null){\r\n                        style += 'height:19px;';\r\n                    }\r\n                    else {\r\n                        style += 'height:'+ cfg[\"rowlen\"][r.toString()] + 'px;';\r\n                    }\r\n                }\r\n\r\n                column = replaceHtml(column, {\"style\": style, \"span\": \"\"});\r\n                column += \" \";\r\n            }\r\n\r\n            column += '</td>';\r\n            cpdata += column;\r\n        }\r\n\r\n        cpdata += \"</tr>\";\r\n    }\r\n\r\n    cpdata = '<table data-type=\"luckysheet_copy_action_table\">' + colgroup + cpdata + '</table>';\r\n\r\n    return cpdata;\r\n}\r\n\r\n\r\n/**\r\n * 复制指定工作表指定单元格区域的数据，返回一维、二维或者自定义行列数的二维数组的数据。只有在dimensional设置为custom的时候，才需要设置setting中的row和column\r\n * @param {String} dimensional 数组维度。可选值为：oneDimensional-一维数组；twoDimensional-二维数组； custom-自定义行列数的二维数组\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.row dimensional为custom的时候设置，多维数组的行数\r\n * @param {Number} options.column dimensional为custom的时候设置，多维数组的列数\r\n * @param {Object | String} options.range 选区范围,支持选区的格式为\"A1:B2\"、\"sheetName!A1:B2\"或者{row:[0,1],column:[0,1]}，只能为单个选区；默认为当前选区\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n */\r\nexport function getRangeArray(dimensional, options = {}) {\r\n    let dimensionalValues = ['oneDimensional', 'twoDimensional'];\r\n\r\n    if(!dimensionalValues.includes(dimensional)){\r\n        return tooltip.info(\"The dimensional parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        range = formula.getcellrange(range);\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let r1 = range.row[0],\r\n        r2 = range.row[1];\r\n    let c1 = range.column[0],\r\n        c2 = range.column[1];\r\n\r\n    //复制范围内包含部分合并单元格，提示\r\n    let cfg = $.extend(true, {}, file.config);\r\n    if(cfg[\"merge\"] != null){\r\n        let has_PartMC = hasPartMC(cfg, r1, r2, c1, c2);\r\n\r\n        if(has_PartMC){\r\n            return tooltip.info(\"Cannot perform this operation on partially merged cells\", \"\");\r\n        }\r\n    }\r\n\r\n    let data = file.data;\r\n    if(data == null || data.length == 0){\r\n        data = sheetmanage.buildGridData(file);\r\n    }\r\n\r\n    let dataArr = [];\r\n\r\n    if(dimensional == 'oneDimensional'){//一维数组\r\n        for(let r = r1; r <= r2; r++){\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = data[r][c];\r\n\r\n                if(cell == null || cell.v == null){\r\n                    dataArr.push(null);\r\n                }\r\n                else{\r\n                    dataArr.push(cell.v);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else if(dimensional == 'twoDimensional'){\r\n        for(let r = r1; r <= r2; r++){\r\n            let row = [];\r\n\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = data[r][c];\r\n\r\n                if(cell == null || cell.v == null){\r\n                    row.push(null);\r\n                }\r\n                else{\r\n                    row.push(cell.v);\r\n                }\r\n            }\r\n\r\n            dataArr.push(row);\r\n        }\r\n    }\r\n\r\n    return dataArr;\r\n}\r\n\r\n/**\r\n * 复制指定工作表指定单元格区域的数据，返回json格式的数据\r\n * @param {Boolean} isFirstRowTitle 是否首行为标题\r\n * @param {Object} options 可选参数\r\n * @param {Object | String} options.range 选区范围,支持选区的格式为\"A1:B2\"、\"sheetName!A1:B2\"或者{row:[0,1],column:[0,1]}，只能为单个选区；默认为当前选区\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n */\r\nexport function getRangeJson(isFirstRowTitle, options = {}) {\r\n    let curRange = Store.luckysheet_select_save[0];\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder\r\n    } = {...options}\r\n    let file = Store.luckysheetfile[order];\r\n    let config = file.config;\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    if (!range || range.length > 1) {\r\n        if(isEditMode()){\r\n            alert(locale_drag.noMulti);\r\n        } else{\r\n            tooltip.info(locale_drag.noMulti, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    //复制范围内包含部分合并单元格，提示\r\n    if(config[\"merge\"] != null) {\r\n        let has_PartMC = false;\r\n        let r1 = range.row[0],\r\n        r2 = range.row[1],\r\n        c1 = range.column[0],\r\n        c2 = range.column[1];\r\n        has_PartMC = hasPartMC(config, r1, r2, c1, c2);\r\n\r\n        if(has_PartMC){\r\n            if(isEditMode()){\r\n                alert(locale().drag.noPartMerge);\r\n            } else{\r\n                tooltip.info(locale().drag.noPartMerge, \"\");\r\n            }\r\n            return;\r\n        }\r\n    }\r\n    let getdata = getdatabyselection(range, file.index);\r\n    let arr = [];\r\n    if (getdata.length === 0) {\r\n        return;\r\n    }\r\n    if (isFirstRowTitle) {\r\n        if (getdata.length === 1) {\r\n            let obj = {};\r\n            for (let i = 0; i < getdata[0].length; i++) {\r\n                obj[getcellvalue(0, i, getdata)] = \"\";\r\n            }\r\n            arr.push(obj);\r\n        } else {\r\n            for (let r = 1; r < getdata.length; r++) {\r\n                let obj = {};\r\n                for (let c = 0; c < getdata[0].length; c++) {\r\n                    if(getcellvalue(0, c, getdata) == undefined){\r\n                        obj[\"\"] = getcellvalue(r, c, getdata);\r\n                    }else{\r\n                        obj[getcellvalue(0, c, getdata)] = getcellvalue(r, c, getdata);\r\n                    }\r\n                }\r\n                arr.push(obj);\r\n            }\r\n        }\r\n    } else {\r\n        let st = range[\"column\"][0];\r\n        for (let r = 0; r < getdata.length; r++) {\r\n            let obj = {};\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                obj[chatatABC(c + st)] = getcellvalue(r, c, getdata);\r\n            }\r\n            arr.push(obj);\r\n        }\r\n    }\r\n    // selection.copybyformat(new Event('click'), JSON.stringify(arr));\r\n    return arr;\r\n}\r\n\r\n/**\r\n *\r\n * @param {String} type 对角线还是对角线偏移 \"normal\"-对角线  \"anti\"-反对角线\r\n\"offset\"-对角线偏移\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.column type为offset的时候设置，对角偏移的列数\r\n * @param {Object | String} options.range 选区范围,支持选区的格式为\"A1:B2\"、\"sheetName!A1:B2\"或者{row:[0,1],column:[0,1]}，只能为单个选区；默认为当前选区\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n */\r\nexport function getRangeDiagonal(type, options = {}) {\r\n    let typeValues = ['normal', 'anti', 'offset'];\r\n    if (typeValues.indexOf(type) < 0) {\r\n        return tooltip.info('The type parameter must be included in [\\'normal\\', \\'anti\\', \\'offset\\']', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let curRange = JSON.parse(JSON.stringify(Store.luckysheet_select_save));\r\n    let {\r\n        column = 1,\r\n        range = curRange,\r\n        order = curSheetOrder\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n    let config = file.config;\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    if (!range || range.length > 1) {\r\n        if(isEditMode()){\r\n            alert(locale().drag.noMulti);\r\n        } else{\r\n            tooltip.info(locale().drag.noMulti, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    //复制范围内包含部分合并单元格，提示\r\n    if(config[\"merge\"] != null) {\r\n        let has_PartMC = false;\r\n        let r1 = range[0].row[0],\r\n        r2 = range[0].row[1],\r\n        c1 = range[0].column[0],\r\n        c2 = range[0].column[1];\r\n        has_PartMC = hasPartMC(config, r1, r2, c1, c2);\r\n\r\n        if(has_PartMC){\r\n            if(isEditMode()){\r\n                alert(locale().drag.noPartMerge);\r\n            } else{\r\n                tooltip.info(locale().drag.noPartMerge, \"\");\r\n            }\r\n            return;\r\n        }\r\n    }\r\n    let getdata = getdatabyselection(range, order);\r\n    let arr = [];\r\n    if (getdata.length === 0) {\r\n        return;\r\n    }\r\n\r\n    let clen = getdata[0].length;\r\n    switch (type) {\r\n        case 'normal':\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                if (r >= clen) {\r\n                    break;\r\n                }\r\n                arr.push(getdata[r][r]);\r\n            }\r\n            break;\r\n        case 'anti':\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                if (r >= clen) {\r\n                    break;\r\n                }\r\n                arr.push(getdata[r][clen - r - 1]);\r\n            }\r\n            break;\r\n        case 'offset':\r\n            if(column.toString() == \"NaN\"){\r\n                if(isEditMode()){\r\n                    alert(locale().drag.inputCorrect);\r\n                } else{\r\n                    tooltip.info(locale().drag.inputCorrect, \"\");\r\n                }\r\n                return;\r\n            }\r\n\r\n            if(column < 0){\r\n                if(isEditMode()){\r\n                    alert(locale().drag.offsetColumnLessZero);\r\n                } else{\r\n                    tooltip.info(locale().drag.offsetColumnLessZero, \"\");\r\n                }\r\n                return;\r\n            }\r\n\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                if (r + column >= clen) {\r\n                    break;\r\n                }\r\n                arr.push(getdata[r][r + column]);\r\n            }\r\n            break;\r\n    }\r\n    selection.copybyformat(new Event(), JSON.stringify(arr));\r\n}\r\n\r\n/**\r\n * 复制指定工作表指定单元格区域的数据，返回布尔值的数据\r\n * @param {Object} options 可选参数\r\n * @param {Object | String} options.range 选区范围,支持选区的格式为\"A1:B2\"、\"sheetName!A1:B2\"或者{row:[0,1],column:[0,1]}，只能为单个选区；默认为当前选区\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n */\r\nexport function getRangeBoolean(options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let curRange = JSON.parse(JSON.stringify(Store.luckysheet_select_save));\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n    let config = file.config;\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    if (!range || range.length > 1) {\r\n        if(isEditMode()){\r\n            alert(locale().drag.noMulti);\r\n        } else{\r\n            tooltip.info(locale().drag.noMulti, \"\");\r\n        }\r\n        return;\r\n    }\r\n\r\n    //复制范围内包含部分合并单元格，提示\r\n    if(config[\"merge\"] != null) {\r\n        let has_PartMC = false;\r\n        let r1 = range[0].row[0],\r\n        r2 = range[0].row[1],\r\n        c1 = range[0].column[0],\r\n        c2 = range[0].column[1];\r\n        has_PartMC = hasPartMC(config, r1, r2, c1, c2);\r\n\r\n        if(has_PartMC){\r\n            if(isEditMode()){\r\n                alert(locale().drag.noPartMerge);\r\n            } else{\r\n                tooltip.info(locale().drag.noPartMerge, \"\");\r\n            }\r\n            return;\r\n        }\r\n    }\r\n    let getdata = getdatabyselection(range, order);\r\n    let arr = [];\r\n    if (getdata.length === 0) {\r\n        return;\r\n    }\r\n    for (let r = 0; r < getdata.length; r++) {\r\n        let a = [];\r\n        for (let c = 0; c < getdata[0].length; c++) {\r\n            let bool = false;\r\n\r\n            let v;\r\n            if(getObjType(getdata[r][c]) == \"object\"){\r\n                v = getdata[r][c].v;\r\n            } else{\r\n                v = getdata[r][c];\r\n            }\r\n\r\n            if (v == null || v == \"\") {\r\n                bool = false;\r\n            } else {\r\n                v = parseInt(v);\r\n                if (v == null || v > 0) {\r\n                    bool = true;\r\n                } else {\r\n                    bool = false;\r\n                }\r\n            }\r\n            a.push(bool);\r\n        }\r\n        arr.push(a);\r\n    }\r\n\r\n    selection.copybyformat(event, JSON.stringify(arr));\r\n}\r\n\r\n\r\n/**\r\n * 指定工作表选中一个或多个选区为选中状态并选择是否高亮，支持多种格式设置。\r\n * @param {Array | Object | String} range 选区范围\r\n * @param {Object} options 可选参数\r\n * @param {Boolean} options.show 是否显示高亮选中效果；默认值为 `true`\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setRangeShow(range, options = {}) {\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = [{\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        }]\r\n    }\r\n    else if(getObjType(range) == 'object'){\r\n        if(range.row == null || range.column == null){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        range = [{\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        }];\r\n    }\r\n\r\n    if(getObjType(range) == 'array'){\r\n        for(let i = 0; i < range.length; i++){\r\n            if(getObjType(range[i]) === 'string'){\r\n                if(!formula.iscelldata(range[i])){\r\n                    return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n                }\r\n                let cellrange = formula.getcellrange(range[i]);\r\n                range[i] = {\r\n                    \"row\": cellrange.row,\r\n                    \"column\": cellrange.column\r\n                }\r\n            }\r\n            else if(getObjType(range) == 'object'){\r\n                if(range.row == null || range.column == null){\r\n                    return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n                }\r\n                range = {\r\n                    \"row\": range.row,\r\n                    \"column\": range.column\r\n                };\r\n            }\r\n        }\r\n    }\r\n\r\n    if(getObjType(range) != 'array'){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        show = true,\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    for(let i = 0; i < range.length; i++){\r\n        let changeparam = menuButton.mergeMoveMain(range[i].column, range[i].row, range[i]);\r\n        if(changeparam) {\r\n            range[i] = {\r\n                \"row\": changeparam[1],\r\n                \"column\": changeparam[0]\r\n            }\r\n        }\r\n    }\r\n\r\n    file.luckysheet_select_save = range;\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.luckysheet_select_save = range;\r\n        selectHightlightShow();\r\n\r\n        if(!show){\r\n            $(\"#luckysheet-cell-selected-boxs\").hide();\r\n            $(\"#luckysheet-cell-selected-focus\").hide();\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n            $(\"#luckysheet-rows-h-selected\").empty();\r\n            $(\"#luckysheet-cols-h-selected\").empty();\r\n        }\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 将一个单元格数组数据赋值到指定的区域，数据格式同getRangeValue方法取到的数据。\r\n * @param {Array[Array]} data 要赋值的单元格二维数组数据，每个单元格的值，可以为字符串或数字，或为符合Luckysheet格式的对象\r\n * @param {Object} options 可选参数\r\n * @param {Object | String} options.range 选区范围,支持选区的格式为\"A1:B2\"、\"sheetName!A1:B2\"或者{row:[0,1],column:[0,1]}，只能为单个选区；默认为当前选区\r\n * @param {Boolean} options.isRefresh 是否刷新界面；默认为true\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setRangeValue(data, options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let curRange = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n    let {\r\n        range = curRange,\r\n        isRefresh = true,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    if (data == null) {\r\n        return tooltip.info('The data which will be set to range cannot be null.', '')\r\n    }\r\n\r\n    if (range instanceof Array) {\r\n        return tooltip.info('setRangeValue only supports a single selection.', '')\r\n    }\r\n\r\n    if (typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    let rowCount = range.row[1] - range.row[0] + 1,\r\n        columnCount = range.column[1] - range.column[0] + 1;\r\n\r\n    if (data.length !== rowCount || data[0].length !== columnCount) {\r\n        return tooltip.info('The data to be set does not match the selection.', '')\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n    let sheetData = $.extend(true, [], file.data);\r\n\r\n    for (let i = 0; i < rowCount; i++) {\r\n        for (let j = 0; j < columnCount; j++) {\r\n            let row = range.row[0] + i,\r\n                column = range.column[0] + j;\r\n            setCellValue(row, column, data[i][j], {order: order, isRefresh: false})\r\n        }\r\n    }\r\n\r\n    let fileData = $.extend(true, [], file.data);\r\n    file.data.length = 0;\r\n    file.data.push(...sheetData);\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        jfrefreshgrid(fileData, [{\r\n            row: range.row,\r\n            column: range.column,\r\n        }], undefined, true, false);\r\n    }\r\n\r\n    if(isRefresh) {\r\n        luckysheetrefreshgrid();\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * 设置指定范围的单元格格式，一般用作处理格式，赋值操作推荐使用setRangeValue方法\r\n * @param {String} attr 要赋值的单元格二维数组数据，每个单元格的值，可以为字符串或数字，或为符合Luckysheet格式的对象\r\n * @param {Number | String | Object} value 具体的设置值\r\n * @param {Object} options 可选参数\r\n * @param {Object | String} options.range 设置参数的目标选区范围，支持选区的格式为\"A1:B2\"、\"sheetName!A1:B2\"或者{row:[0,1],column:[0,1]}，只能为单个选区；默认为当前选区\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n */\r\nexport function setSingleRangeFormat(attr, value, options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let curRange = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder,\r\n    } = {...options}\r\n\r\n    if (!attr) {\r\n        tooltip.info('Arguments attr cannot be null or undefined.', '')\r\n        return 'error';\r\n    }\r\n\r\n    if (range instanceof Array) {\r\n        tooltip.info('setRangeValue only supports a single selection.', '')\r\n        return 'error';\r\n    }\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            tooltip.info(\"The range parameter is invalid.\", \"\");\r\n            return 'error';\r\n        }\r\n\r\n        range = formula.getcellrange(range);\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        return 'error';\r\n    }\r\n\r\n    for (let r = range.row[0]; r <= range.row[1]; r++) {\r\n        for (let c = range.column[0]; c <= range.column[1]; c++) {\r\n            console.log('r',r);\r\n            console.log('c',c);\r\n            setCellValue(r, c, {[attr]: value}, {\r\n                order: order,\r\n                isRefresh: false,\r\n              })\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * 设置指定范围的单元格格式，一般用作处理格式。支持多选区设置\r\n * @param {String} attr 要赋值的单元格二维数组数据，每个单元格的值，可以为字符串或数字，或为符合Luckysheet格式的对象\r\n * @param {Number | String | Object} value 具体的设置值\r\n * @param {Object} options 可选参数\r\n * @param {Array | Object | String} options.range 设置参数的目标选区范围，支持选区的格式为\"A1:B2\"、\"sheetName!A1:B2\"或者{row:[0,1],column:[0,1]}，只能为单个选区；默认为当前选区\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\n export function setRangeFormat(attr, value, options = {}) {\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let curRange = JSON.parse(JSON.stringify(Store.luckysheet_select_save));\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = [{\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        }]\r\n    }\r\n    else if(getObjType(range) == 'object'){\r\n        if(range.row == null || range.column == null){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        range = [{\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        }];\r\n    }\r\n\r\n    if(getObjType(range) != 'array'){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    let result = []\r\n\r\n    for (let i = 0; i < range.length; i++) {\r\n        result.push(setSingleRangeFormat(attr, value, { range: range[i], order: order }));\r\n    }\r\n\r\n    let fileData = $.extend(true, [], file.data);\r\n    if(result.some(i => i === 'error')) {\r\n        file.data.length = 0;\r\n        file.data.push(...fileData);\r\n        return false;\r\n    }\r\n\r\n    file.data.length = 0;\r\n    file.data.push(...fileData);\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        jfrefreshgrid(fileData, undefined, undefined, true, false);\r\n    }\r\n\r\n    luckysheetrefreshgrid();\r\n\r\n    if (success && typeof success === 'function') {\r\n    }\r\n}\r\n\r\n/**\r\n * 为指定索引的工作表，选定的范围开启或关闭筛选功能\r\n * @param {String} type 打开还是关闭筛选功能  open-打开筛选功能，返回当前筛选的范围对象；close-关闭筛选功能，返回关闭前筛选的范围对象\r\n * @param {Object} options 可选参数\r\n * @param {Object | String} options.range 选区范围\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Object} options.success 操作结束的回调函数\r\n */\r\nexport function setRangeFilter(type, options = {}) {\r\n    let typeValues = ['open', 'close'];\r\n\r\n    if(!typeValues.includes(type)){\r\n        return tooltip.info(\"The type parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        range = formula.getcellrange(range);\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    if(type == 'open'){\r\n        file.filter_select = range;\r\n\r\n        if(file.index == Store.currentSheetIndex){\r\n            createFilterOptions(range, file.filter);\r\n        }\r\n\r\n        return {\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        };\r\n    }\r\n    else if(type == 'close'){\r\n        let luckysheet_filter_save = $.extend(true, {}, file.filter_select);\r\n\r\n        file.filter_select = null;\r\n\r\n        $(\"#luckysheet-filter-selected-sheet\" + file.index).remove();\r\n        $(\"#luckysheet-filter-options-sheet\" + file.index).remove();\r\n\r\n        return {\r\n            \"row\": luckysheet_filter_save.row,\r\n            \"column\": luckysheet_filter_save.column\r\n        };\r\n    }\r\n}\r\n\r\n/**\r\n * 为指定索引的工作表，选定的范围设定合并单元格\r\n * @param {String} type 合并类型 all-全部合并  horizontal-水平合并  vertical-垂直合并\r\n * @param {Object} options 可选参数\r\n * @param {Object | String} options.range 选区范围\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Object} options.success 操作结束的回调函数\r\n */\r\nexport function setRangeMerge(type, options = {}) {\r\n    let typeValues = ['all', 'horizontal', 'vertical'];\r\n    if (typeValues.indexOf(type) < 0) {\r\n        return tooltip.info('The type parameter must be included in [\\'all\\', \\'horizontal\\', \\'vertical\\']', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex),\r\n        curRange = JSON.parse(JSON.stringify(Store.luckysheet_select_save));\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order],\r\n        cfg = $.extend(true, {}, file.config),\r\n        data = $.extend(true, [], file.data);\r\n\r\n    if(data.length == 0){\r\n        data = $.extend(true, [], sheetmanage.buildGridData(file));\r\n    }\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info('Incorrect selection format', '');\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = [{\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        }]\r\n    }\r\n    else if(getObjType(range) == 'object'){\r\n        if(!range.hasOwnProperty(\"row\") || !range.hasOwnProperty(\"column\")){\r\n            return tooltip.info('Incorrect selection format', '');\r\n        }\r\n\r\n        range = [{\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        }]\r\n    }\r\n\r\n    //不能合并重叠区域\r\n    if(selectIsOverlap(range)){\r\n        return tooltip.info('Cannot merge overlapping range', '');\r\n    }\r\n\r\n    //选区是否含有 部分合并单元格\r\n    if(cfg[\"merge\"] != null){\r\n        let has_PartMC = false;\r\n\r\n        for(let s = 0; s < range.length; s++){\r\n            let r1 = range[s].row[0],\r\n                r2 = range[s].row[1];\r\n            let c1 = range[s].column[0],\r\n                c2 = range[s].column[1];\r\n\r\n            has_PartMC = hasPartMC(cfg, r1, r2, c1, c2);\r\n\r\n            if(has_PartMC){\r\n                break;\r\n            }\r\n        }\r\n\r\n        if(has_PartMC){\r\n            return tooltip.info('Cannot perform this operation on partially merged cells', '');\r\n        }\r\n    }else {\r\n        cfg.merge = {}\r\n    }\r\n\r\n    //选区是否含有 合并的单元格\r\n    let isHasMc = false;\r\n\r\n    for(let i = 0; i < range.length; i++){\r\n        let r1 = range[i].row[0],\r\n            r2 = range[i].row[1];\r\n        let c1 = range[i].column[0],\r\n            c2 = range[i].column[1];\r\n\r\n        for(let r = r1; r <= r2; r++){\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = data[r][c];\r\n\r\n                if(getObjType(cell) == \"object\" && (\"mc\" in cell)){\r\n                    isHasMc = true;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if(isHasMc){\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    if(isHasMc){//选区有合并单元格（选区都执行 取消合并）\r\n        cancelRangeMerge({\r\n            range: range,\r\n            order: order\r\n        })\r\n    }\r\n    else{\r\n        for(let i = 0; i < range.length; i++){\r\n            let r1 = range[i].row[0],\r\n                r2 = range[i].row[1];\r\n            let c1 = range[i].column[0],\r\n                c2 = range[i].column[1];\r\n\r\n            if(r1 == r2 && c1 == c2){\r\n                continue;\r\n            }\r\n\r\n            if(type == \"all\"){\r\n                let fv = {}, isfirst = false;\r\n\r\n                for(let r = r1; r <= r2; r++){\r\n                    for(let c = c1; c <= c2; c++){\r\n                        let cell = data[r][c];\r\n\r\n                        if(cell != null && (!isRealNull(cell.v) || cell.f != null) && !isfirst){\r\n                            fv = $.extend(true, {}, cell);\r\n                            isfirst = true;\r\n                        }\r\n\r\n                        data[r][c] = { \"mc\": { \"r\": r1, \"c\": c1 } };\r\n                    }\r\n                }\r\n\r\n                data[r1][c1] = fv;\r\n                data[r1][c1].mc = { \"r\": r1, \"c\": c1, \"rs\": r2 - r1 + 1, \"cs\": c2 - c1 + 1 };\r\n\r\n                cfg[\"merge\"][r1 + \"_\" + c1] = { \"r\": r1, \"c\": c1, \"rs\": r2 - r1 + 1, \"cs\": c2 - c1 + 1 };\r\n            }\r\n            else if(type == \"vertical\"){\r\n                for(let c = c1; c <= c2; c++){\r\n                    let fv = {}, isfirst = false;\r\n\r\n                    for(let r = r1; r <= r2; r++){\r\n                        let cell = data[r][c];\r\n\r\n                        if(cell != null && (!isRealNull(cell.v) || cell.f != null) && !isfirst){\r\n                            fv = $.extend(true, {}, cell);\r\n                            isfirst = true;\r\n                        }\r\n\r\n                        data[r][c] = { \"mc\": { \"r\": r1, \"c\": c } };\r\n                    }\r\n\r\n                    data[r1][c] = fv;\r\n                    data[r1][c].mc = { \"r\": r1, \"c\": c, \"rs\": r2 - r1 + 1, \"cs\": 1 };\r\n\r\n                    cfg[\"merge\"][r1 + \"_\" + c] = { \"r\": r1, \"c\": c, \"rs\": r2 - r1 + 1, \"cs\": 1 };\r\n                }\r\n            }\r\n            else if(type == \"horizontal\"){\r\n                for(let r = r1; r <= r2; r++){\r\n                    let fv = {}, isfirst = false;\r\n\r\n                    for(let c = c1; c <= c2; c++){\r\n                        let cell = data[r][c];\r\n\r\n                        if(cell != null && (!isRealNull(cell.v) || cell.f != null) && !isfirst){\r\n                            fv = $.extend(true, {}, cell);\r\n                            isfirst = true;\r\n                        }\r\n\r\n                        data[r][c] = { \"mc\": { \"r\": r, \"c\": c1 } };\r\n                    }\r\n\r\n                    data[r][c1] = fv;\r\n                    data[r][c1].mc = { \"r\": r, \"c\": c1, \"rs\": 1, \"cs\": c2 - c1 + 1 };\r\n\r\n                    cfg[\"merge\"][r + \"_\" + c1] = { \"r\": r, \"c\": c1, \"rs\": 1, \"cs\": c2 - c1 + 1 };\r\n                }\r\n            }\r\n        }\r\n\r\n        if(order == curSheetOrder){\r\n            if (Store.clearjfundo) {\r\n                Store.jfundo.length  = 0;\r\n                Store.jfredo.push({\r\n                    \"type\": \"mergeChange\",\r\n                    \"sheetIndex\": file.index,\r\n                    \"data\": $.extend(true, [], file.data),\r\n                    \"curData\": data,\r\n                    \"range\": range,\r\n                    \"config\": $.extend(true, {}, file.config),\r\n                    \"curConfig\": cfg\r\n                });\r\n            }\r\n\r\n            Store.clearjfundo = false;\r\n            jfrefreshgrid(data, range, {\"cfg\": cfg});\r\n            Store.clearjfundo = true;\r\n        }\r\n        else{\r\n            file.data = data;\r\n            file.config = cfg;\r\n        }\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * 为指定索引的工作表，选定的范围取消合并单元格\r\n * @param {Object} options 可选参数\r\n * @param {Array | Object | String} options.range 选区范围\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Object} options.success 操作结束的回调函数\r\n */\r\nexport function cancelRangeMerge(options = {}) {\r\n    let curRange = Store.luckysheet_select_save,\r\n        curSheetOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order],\r\n        cfg = $.extend(true, {}, file.config),\r\n        data = $.extend(true, [], file.data);\r\n\r\n    if(data.length == 0){\r\n        data = $.extend(true, [], sheetmanage.buildGridData(file));\r\n    }\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info('Incorrect selection format', '');\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = [{\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        }]\r\n    }\r\n    else if(getObjType(range) == 'object'){\r\n        if(!range.hasOwnProperty(\"row\") || !range.hasOwnProperty(\"column\")){\r\n            return tooltip.info('Incorrect selection format', '');\r\n        }\r\n\r\n        range = [{\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        }]\r\n    }\r\n\r\n    //不能合并重叠区域\r\n    if(selectIsOverlap(range)){\r\n        return tooltip.info('Cannot merge overlapping range', '');\r\n    }\r\n\r\n    //选区是否含有 部分合并单元格\r\n    if(cfg[\"merge\"] != null){\r\n        let has_PartMC = false;\r\n\r\n        for(let s = 0; s < range.length; s++){\r\n            let r1 = range[s].row[0],\r\n                r2 = range[s].row[1];\r\n            let c1 = range[s].column[0],\r\n                c2 = range[s].column[1];\r\n\r\n            has_PartMC = hasPartMC(cfg, r1, r2, c1, c2);\r\n\r\n            if(has_PartMC){\r\n                break;\r\n            }\r\n        }\r\n\r\n        if(has_PartMC){\r\n            return tooltip.info('Cannot perform this operation on partially merged cells', '');\r\n        }\r\n    }\r\n\r\n    for(let i = 0; i < range.length; i++){\r\n        let r1 = range[i].row[0],\r\n            r2 = range[i].row[1];\r\n        let c1 = range[i].column[0],\r\n            c2 = range[i].column[1];\r\n\r\n        if(r1 == r2 && c1 == c2){\r\n            continue;\r\n        }\r\n\r\n        let fv = {};\r\n\r\n        for(let r = r1; r <= r2; r++){\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = data[r][c];\r\n\r\n                if(cell != null && cell.mc != null){\r\n                    let mc_r = cell.mc.r, mc_c = cell.mc.c;\r\n\r\n                    if(\"rs\" in cell.mc){\r\n                        delete cell.mc;\r\n                        delete cfg[\"merge\"][mc_r + \"_\" + mc_c];\r\n\r\n                        fv[mc_r + \"_\" + mc_c] = $.extend(true, {}, cell);\r\n                    }\r\n                    else{\r\n                        // let cell_clone = fv[mc_r + \"_\" + mc_c];\r\n                        let cell_clone = JSON.parse(JSON.stringify(fv[mc_r + \"_\" + mc_c]));\r\n\r\n                        delete cell_clone.v;\r\n                        delete cell_clone.m;\r\n                        delete cell_clone.ct;\r\n                        delete cell_clone.f;\r\n                        delete cell_clone.spl;\r\n\r\n                        data[r][c] = cell_clone;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if(order == curSheetOrder){\r\n        if (Store.clearjfundo) {\r\n            Store.jfundo.length  = 0;\r\n            Store.jfredo.push({\r\n                \"type\": \"mergeChange\",\r\n                \"sheetIndex\": file.index,\r\n                \"data\": $.extend(true, [], file.data),\r\n                \"curData\": data,\r\n                \"range\": range,\r\n                \"config\": $.extend(true, {}, file.config),\r\n                \"curConfig\": cfg\r\n            });\r\n        }\r\n\r\n        Store.clearjfundo = false;\r\n        jfrefreshgrid(data, range, {\"cfg\": cfg});\r\n        Store.clearjfundo = true;\r\n    }\r\n    else{\r\n        file.data = data;\r\n        file.config = cfg;\r\n    }\r\n}\r\n\r\n/**\r\n * 为指定索引的工作表，选定的范围开启排序功能，返回选定范围排序后的数据。\r\n * @param {String} type 排序类型 asc-升序 desc-降序\r\n * @param {Object} options 可选参数\r\n * @param {Object | String} options.range 选区范围,支持选区的格式为\"A1:B2\"、\"sheetName!A1:B2\"或者{row:[0,1],column:[0,1]}，只能为单个选区；默认为当前选区\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setRangeSort(type, options = {}) {\r\n    let typeValues = ['asc', 'desc']\r\n    if (typeValues.indexOf(type) < 0) {\r\n        return tooltip.info('The type parameter must be included in [\\'asc\\', \\'desc\\'', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex),\r\n        curRange = Store.luckysheet_select_save[0];\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order],\r\n        cfg = $.extend(true, {}, file.config),\r\n        fileData = $.extend(true, [], file.data);\r\n\r\n    if(fileData.length == 0){\r\n        fileData = $.extend(true, [], sheetmanage.buildGridData(file));\r\n    }\r\n\r\n    if(range instanceof Array && range.length > 1){\r\n        tooltip.info(locale().sort.noRangeError, \"\");\r\n        return;\r\n    }\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    let r1 = range.row[0],\r\n        r2 = range.row[1],\r\n        c1 = range.column[0],\r\n        c2 = range.column[1];\r\n\r\n    let hasMc = false; //Whether the sort selection has merged cells\r\n    let data = [];\r\n    for(let r = r1; r <= r2; r++){\r\n        let data_row = [];\r\n        for(let c = c1; c <= c2; c++){\r\n            if(fileData[r][c] != null && fileData[r][c].mc != null){\r\n                hasMc = true;\r\n                break;\r\n            }\r\n            data_row.push(fileData[r][c]);\r\n        }\r\n        data.push(data_row);\r\n    }\r\n\r\n    if(hasMc){\r\n        tooltip.info(locale().sort.mergeError, \"\");\r\n        return;\r\n    }\r\n\r\n    data = orderbydata([].concat(data), 0, type === 'asc');\r\n\r\n    for(let r = r1; r <= r2; r++){\r\n        for(let c = c1; c <= c2; c++){\r\n            fileData[r][c] = data[r - r1][c - c1];\r\n        }\r\n    }\r\n\r\n    let allParam = {};\r\n    if(cfg[\"rowlen\"] != null){\r\n        cfg = rowlenByRange(fileData, r1, r2, cfg);\r\n\r\n        allParam = {\r\n            \"cfg\": cfg,\r\n            \"RowlChange\": true\r\n        }\r\n    }\r\n\r\n    if (file.index == Store.currentSheetIndex) {\r\n        jfrefreshgrid(fileData, [{ \"row\": [r1, r2], \"column\": [c1, c2] }], allParam);\r\n    }\r\n    else{\r\n        file.data = fileData;\r\n        file.config = cfg;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * 为指定索引的工作表，选定的范围开启多列自定义排序功能，返回选定范围排序后的数据。\r\n * @param {Boolean} hasTitle 数据是否具有标题行\r\n * @param {Array} sort 列设置，设置需要排序的列索引和排序方式，格式如：[{ i:0,sort:'asc' },{ i:1,sort:'des' }]\r\n * @param {Object} options 可选参数\r\n * @param {Object | String} options.range 选区范围,支持选区的格式为\"A1:B2\"、\"sheetName!A1:B2\"或者{row:[0,1],column:[0,1]}，只能为单个选区；默认为当前选区\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setRangeSortMulti(hasTitle, sort, options = {}) {\r\n    if (!sort || !(sort instanceof Array)) {\r\n        return tooltip.info('The sort parameter is invalid.', '')\r\n    }\r\n\r\n    let curSheetOrder = getSheetIndex(Store.currentSheetIndex),\r\n        curRange = Store.luckysheet_select_save[0];\r\n    let {\r\n        range = curRange,\r\n        order = curSheetOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order],\r\n        cfg = $.extend(true, {}, file.config),\r\n        fileData = $.extend(true, [], file.data);\r\n\r\n    if(fileData.length == 0){\r\n        fileData = $.extend(true, [], sheetmanage.buildGridData(file));\r\n    }\r\n\r\n    if(range instanceof Array && range.length > 1){\r\n        tooltip.info(locale().sort.noRangeError, \"\");\r\n        return;\r\n    }\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    let r1 = range.row[0],\r\n        r2 = range.row[1],\r\n        c1 = range.column[0],\r\n        c2 = range.column[1];\r\n\r\n    let str;\r\n    if(hasTitle){\r\n        str = r1 + 1;\r\n    } else{\r\n        str = r1;\r\n    }\r\n\r\n    let hasMc = false; //Whether the sort selection has merged cells\r\n    let data = [];\r\n    for(let r = str; r <= r2; r++){\r\n        let data_row = [];\r\n        for(let c = c1; c <= c2; c++){\r\n            if(fileData[r][c] != null && fileData[r][c].mc != null){\r\n                hasMc = true;\r\n                break;\r\n            }\r\n            data_row.push(fileData[r][c]);\r\n        }\r\n        data.push(data_row);\r\n    }\r\n\r\n    if(hasMc){\r\n        tooltip.info(locale().sort.mergeError, \"\");\r\n        return;\r\n    }\r\n\r\n    sort.forEach(sortItem => {\r\n        let i = sortItem.i;\r\n        i -= c1;\r\n        data = orderbydata([].concat(data), i, sortItem.sort === 'asc');\r\n    })\r\n\r\n    for(let r = str; r <= r2; r++){\r\n        for(let c = c1; c <= c2; c++){\r\n            fileData[r][c] = data[r - str][c - c1];\r\n        }\r\n    }\r\n\r\n    let allParam = {};\r\n    if(cfg[\"rowlen\"] != null){\r\n        cfg = rowlenByRange(fileData, str, r2, cfg);\r\n\r\n        allParam = {\r\n            \"cfg\": cfg,\r\n            \"RowlChange\": true\r\n        }\r\n    }\r\n\r\n    if (file.index === Store.currentSheetIndex) {\r\n        jfrefreshgrid(fileData, [{ \"row\": [str, r2], \"column\": [c1, c2] }], allParam);\r\n    }\r\n    else{\r\n        file.data = fileData;\r\n        file.config = cfg;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n *  为指定索引的工作表，选定的范围开启条件格式，根据设置的条件格式规则突出显示部分单元格，返回开启条件格式后的数据。\r\n * @param {String} conditionName 条件格式规则类型\r\n * @param {Object} conditionValue 可以设置条件单元格或者条件值\r\n * @param {Object} options 可选参数\r\n * @param {Object} options.format 颜色设置\r\n * @param {Array | Object | String} options.cellrange 选区范围\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setRangeConditionalFormatDefault(conditionName, conditionValue, options = {}) {\r\n    let conditionNameValues = [\r\n        'greaterThan',\r\n        'lessThan',\r\n        'betweenness',\r\n        'equal',\r\n        'textContains',\r\n        'occurrenceDate',\r\n        'duplicateValue',\r\n        'top10',\r\n        'top10%',\r\n        'last10',\r\n        'last10%',\r\n        'AboveAverage',\r\n        'SubAverage',\r\n        'regExp',\r\n        'sort',\r\n    ];\r\n\r\n    if(!conditionName || !conditionNameValues.includes(conditionName)){\r\n        return tooltip.info('The conditionName parameter is invalid.', '');\r\n    }\r\n\r\n    if(getObjType(conditionValue) != 'array' || conditionValue.length == 0){\r\n        return tooltip.info('The conditionValue parameter is invalid.', '');\r\n    }\r\n\r\n    let {\r\n        format = {\r\n            \"textColor\": \"#000000\",\r\n            \"cellColor\": \"#ff0000\"\r\n        },\r\n        cellrange = Store.luckysheet_select_save,\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    cellrange = JSON.parse(JSON.stringify(cellrange));\r\n\r\n    let file = Store.luckysheetfile[order];\r\n    let data = file.data;\r\n\r\n    if(data == null || data.length == 0){\r\n        data = sheetmanage.buildGridData(file);\r\n    }\r\n\r\n    if(file == null){\r\n        return tooltip.info('Incorrect worksheet index', '');\r\n    }\r\n\r\n    const conditionformat_Text = locale().conditionformat;\r\n\r\n    let conditionRange = [], conditionValue2 = [];\r\n\r\n    if(conditionName == 'betweenness'){\r\n        let v1 = conditionValue[0];\r\n        let v2 = conditionValue[1];\r\n\r\n        //条件值是否是选区\r\n        let rangeArr1 = conditionformat.getRangeByTxt(v1);\r\n        if(rangeArr1.length > 1){\r\n            conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n            return;\r\n        }\r\n        else if(rangeArr1.length == 1){\r\n            let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1];\r\n            let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1];\r\n\r\n            if(r1 == r2 && c1 == c2){\r\n                v1 = getcellvalue(r1, c1, data);\r\n\r\n                conditionRange.push({ \"row\": rangeArr1[0].row, \"column\": rangeArr1[0].column });\r\n                conditionValue2.push(v1);\r\n            }\r\n            else{\r\n                conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                return;\r\n            }\r\n        }\r\n        else if(rangeArr1.length == 0){\r\n            if(isNaN(v1) || v1 == \"\"){\r\n                conditionformat.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                return;\r\n            }\r\n            else{\r\n                conditionValue2.push(v1);\r\n            }\r\n        }\r\n\r\n        let rangeArr2 = conditionformat.getRangeByTxt(v2);\r\n        if(rangeArr2.length > 1){\r\n            conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n            return;\r\n        }\r\n        else if(rangeArr2.length == 1){\r\n            let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1];\r\n            let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1];\r\n\r\n            if(r1 == r2 && c1 == c2){\r\n                v2 = getcellvalue(r1, c1, data);\r\n\r\n                conditionRange.push({ \"row\": rangeArr2[0].row, \"column\": rangeArr2[0].column });\r\n                conditionValue2.push(v2);\r\n            }\r\n            else{\r\n                conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                return;\r\n            }\r\n        }\r\n        else if(rangeArr2.length == 0){\r\n            if(isNaN(v2) || v2 == \"\"){\r\n                conditionformat.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                return;\r\n            }\r\n            else{\r\n                conditionValue2.push(v2);\r\n            }\r\n        }\r\n    }\r\n    else if(conditionName == 'greaterThan' || conditionName == 'lessThan' || conditionName == 'equal'){\r\n        let v = conditionValue[0];\r\n\r\n        //条件值是否是选区\r\n        let rangeArr = conditionformat.getRangeByTxt(v);\r\n        if(rangeArr.length > 1){\r\n            conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n            return;\r\n        }\r\n        else if(rangeArr.length == 1){\r\n            let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n            let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n            if(r1 == r2 && c1 == c2){\r\n                v = getcellvalue(r1, c1, data);\r\n\r\n                conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                conditionValue2.push(v);\r\n            }\r\n            else{\r\n                conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                return;\r\n            }\r\n        }\r\n        else if(rangeArr.length == 0){\r\n            if(isNaN(v) || v == \"\"){\r\n                conditionformat.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                return;\r\n            }\r\n            else{\r\n                conditionValue2.push(v);\r\n            }\r\n        }\r\n    }\r\n    else if(conditionName == 'textContains'){\r\n        let v = conditionValue[0];\r\n\r\n        //条件值是否是选区\r\n        let rangeArr = conditionformat.getRangeByTxt(v);\r\n        if(rangeArr.length > 1){\r\n            conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n            return;\r\n        }\r\n        else if(rangeArr.length == 1){\r\n            let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1];\r\n            let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1];\r\n\r\n            if(r1 == r2 && c1 == c2){\r\n                v = getcellvalue(r1, c1, data);\r\n\r\n                conditionRange.push({ \"row\": rangeArr[0].row, \"column\": rangeArr[0].column });\r\n                conditionValue2.push(v);\r\n            }\r\n            else{\r\n                conditionformat.infoDialog(conditionformat_Text.onlySingleCell, \"\");\r\n                return;\r\n            }\r\n        }\r\n        else if(rangeArr.length == 0){\r\n            if(v == \"\"){\r\n                conditionformat.infoDialog(conditionformat_Text.conditionValueCanOnly, \"\");\r\n                return;\r\n            }\r\n            else{\r\n                conditionValue2.push(v);\r\n            }\r\n        }\r\n    }\r\n    else if(conditionName == 'occurrenceDate'){\r\n        let v1 = conditionValue[0];\r\n        let v2 = conditionValue[1];\r\n\r\n        if(!isdatetime(v1) || !isdatetime(v2)){\r\n            return tooltip.info('The conditionValue parameter is invalid.', '');\r\n        }\r\n\r\n        let v;\r\n        if(diff(v1, v2) > 0){\r\n            v = dayjs(v2).format(\"YYYY/MM/DD\") + \"-\" + dayjs(v1).format(\"YYYY/MM/DD\");\r\n        }\r\n        else{\r\n            v = dayjs(v1).format(\"YYYY/MM/DD\") + \"-\" + dayjs(v2).format(\"YYYY/MM/DD\");\r\n        }\r\n\r\n        conditionValue2.push(v);\r\n    }\r\n    else if(conditionName == 'duplicateValue'){\r\n        let v = conditionValue[0];\r\n\r\n        if(v != '0' || v != '1'){\r\n            return tooltip.info('The conditionValue parameter is invalid.', '');\r\n        }\r\n\r\n        conditionValue2.push(v);\r\n    }\r\n    else if(conditionName == 'top10' || conditionName == 'top10%' || conditionName == 'last10' || conditionName == 'last10%'){\r\n        let v = conditionValue[0];\r\n\r\n        if(parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000){\r\n            conditionformat.infoDialog(conditionformat_Text.pleaseEnterInteger, \"\");\r\n            return;\r\n        }\r\n\r\n        conditionValue2.push(parseInt(v));\r\n    }\r\n    else if(conditionName == 'AboveAverage' || conditionName == 'SubAverage'){\r\n        conditionValue2.push(conditionName);\r\n    }\r\n    else if(conditionName == 'regExp') {\r\n        conditionValue2.push(...conditionValue);\r\n    }\r\n    else if(conditionName == 'sort') {\r\n        conditionValue2.push(...conditionValue);\r\n    }\r\n\r\n    if(!format.hasOwnProperty(\"textColor\") || !format.hasOwnProperty(\"cellColor\")){\r\n        return tooltip.info('The format parameter is invalid.', '');\r\n    }\r\n\r\n    if(getObjType(cellrange) == 'string'){\r\n        cellrange = conditionformat.getRangeByTxt(cellrange);\r\n    }\r\n    else if(getObjType(cellrange) == 'object'){\r\n        cellrange = [cellrange];\r\n    }\r\n\r\n    if(getObjType(cellrange) != 'array'){\r\n        return tooltip.info('The cellrange parameter is invalid.', '');\r\n    }\r\n\r\n    let rule = {\r\n        \"type\": \"default\",\r\n        \"cellrange\": cellrange,\r\n        \"format\": format,\r\n        \"conditionName\": conditionName,\r\n        \"conditionRange\": conditionRange,\r\n        \"conditionValue\": conditionValue2\r\n    };\r\n\r\n    //保存之前的规则\r\n    let fileH = $.extend(true, [], Store.luckysheetfile);\r\n    let historyRules = conditionformat.getHistoryRules(fileH);\r\n\r\n    //保存当前的规则\r\n    let ruleArr = file[\"luckysheet_conditionformat_save\"] || [];\r\n    ruleArr.push(rule);\r\n    file[\"luckysheet_conditionformat_save\"] = ruleArr;\r\n\r\n    let fileC = $.extend(true, [], Store.luckysheetfile);\r\n    let currentRules = conditionformat.getCurrentRules(fileC);\r\n\r\n    //刷新一次表格\r\n    conditionformat.ref(historyRules, currentRules);\r\n\r\n    //发送给后台\r\n    if(server.allowUpdate){\r\n        server.saveParam(\"all\", file.index, ruleArr, { \"k\": \"luckysheet_conditionformat_save\" });\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 为指定索引的工作表，选定的范围开启条件格式，返回开启条件格式后的数据。\r\n * @param {String} type 条件格式规则类型\r\n * @param {Object} options 可选参数\r\n * @param {Array | String} options.format 颜色设置\r\n * @param {Array | Object | String} options.cellrange 选区范围\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setRangeConditionalFormat(type, options = {}) {\r\n    let typeValues = [\r\n        'dataBar',\r\n        'colorGradation',\r\n        'icons'\r\n    ];\r\n\r\n    if(!type || !typeValues.includes(type)){\r\n        return tooltip.info('The type parameter is invalid.', '');\r\n    }\r\n\r\n    let {\r\n        format,\r\n        cellrange = Store.luckysheet_select_save,\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    cellrange = JSON.parse(JSON.stringify(cellrange));\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info('Incorrect worksheet index', '');\r\n    }\r\n\r\n    if(type == 'dataBar'){\r\n        if(format == null){\r\n            format = [\"#638ec6\", \"#ffffff\"];\r\n        }\r\n\r\n        if(getObjType(format) != 'array' || format.length < 1 || format.length > 2){\r\n            return tooltip.info('The format parameter is invalid.', '');\r\n        }\r\n    }\r\n    else if(type == 'colorGradation'){\r\n        if(format == null){\r\n            format = [\"rgb(99, 190, 123)\", \"rgb(255, 235, 132)\", \"rgb(248, 105, 107)\"];\r\n        }\r\n\r\n        if(getObjType(format) != 'array' || format.length < 2 || format.length > 3){\r\n            return tooltip.info('The format parameter is invalid.', '');\r\n        }\r\n    }\r\n    else if(type == 'icons'){\r\n        if(format == null){\r\n            format = \"threeWayArrowMultiColor\";\r\n        }\r\n\r\n        let formatValues = [\r\n            'threeWayArrowMultiColor',\r\n            'threeTriangles',\r\n            'fourWayArrowMultiColor',\r\n            'fiveWayArrowMultiColor',\r\n            'threeWayArrowGrayColor',\r\n            'fourWayArrowGrayColor',\r\n            'fiveWayArrowGrayColor',\r\n            'threeColorTrafficLightRimless',\r\n            'threeSigns',\r\n            'greenRedBlackGradient',\r\n            'threeColorTrafficLightBordered',\r\n            'fourColorTrafficLight',\r\n            'threeSymbolsCircled',\r\n            'tricolorFlag',\r\n            'threeSymbolsnoCircle',\r\n            'threeStars',\r\n            'fiveQuadrantDiagram',\r\n            'fiveBoxes',\r\n            'grade4',\r\n            'grade5'\r\n        ];\r\n\r\n        if(getObjType(format) != 'string' || !formatValues.includes(format)){\r\n            return tooltip.info('The format parameter is invalid.', '');\r\n        }\r\n\r\n        switch (format) {\r\n            case 'threeWayArrowMultiColor':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 0\r\n                };\r\n                break;\r\n            case 'threeTriangles':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 1\r\n                };\r\n                break;\r\n            case 'fourWayArrowMultiColor':\r\n                format = {\r\n                    \"len\": 4,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 2\r\n                };\r\n                break;\r\n            case 'fiveWayArrowMultiColor':\r\n                format = {\r\n                    \"len\": 5,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 3\r\n                };\r\n                break;\r\n            case 'threeWayArrowGrayColor':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 0\r\n                };\r\n                break;\r\n            case 'fourWayArrowGrayColor':\r\n                format = {\r\n                    \"len\": 4,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 1\r\n                };\r\n                break;\r\n            case 'fiveWayArrowGrayColor':\r\n                format = {\r\n                    \"len\": 5,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 2\r\n                };\r\n                break;\r\n            case 'threeColorTrafficLightRimless':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 4\r\n                };\r\n                break;\r\n            case 'threeSigns':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 5\r\n                };\r\n                break;\r\n            case 'greenRedBlackGradient':\r\n                format = {\r\n                    \"len\": 4,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 6\r\n                };\r\n                break;\r\n            case 'threeColorTrafficLightBordered':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 4\r\n                };\r\n                break;\r\n            case 'fourColorTrafficLight':\r\n                format = {\r\n                    \"len\": 4,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 5\r\n                };\r\n                break;\r\n            case 'threeSymbolsCircled':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 7\r\n                };\r\n                break;\r\n            case 'tricolorFlag':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 8\r\n                };\r\n                break;\r\n            case 'threeSymbolsnoCircle':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 7\r\n                };\r\n                break;\r\n            case 'threeStars':\r\n                format = {\r\n                    \"len\": 3,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 9\r\n                };\r\n                break;\r\n            case 'fiveQuadrantDiagram':\r\n                format = {\r\n                    \"len\": 5,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 10\r\n                };\r\n                break;\r\n            case 'fiveBoxes':\r\n                format = {\r\n                    \"len\": 5,\r\n                    \"leftMin\": 0,\r\n                    \"top\": 11\r\n                };\r\n                break;\r\n            case 'grade4':\r\n                format = {\r\n                    \"len\": 4,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 9\r\n                };\r\n                break;\r\n            case 'grade5':\r\n                format = {\r\n                    \"len\": 5,\r\n                    \"leftMin\": 5,\r\n                    \"top\": 10\r\n                };\r\n                break;\r\n        }\r\n    }\r\n\r\n    if(getObjType(cellrange) == 'string'){\r\n        cellrange = conditionformat.getRangeByTxt(cellrange);\r\n    }\r\n    else if(getObjType(cellrange) == 'object'){\r\n        cellrange = [cellrange];\r\n    }\r\n\r\n    if(getObjType(cellrange) != 'array'){\r\n        return tooltip.info('The cellrange parameter is invalid.', '');\r\n    }\r\n\r\n    let rule = {\r\n        \"type\": type,\r\n        \"cellrange\": cellrange,\r\n        \"format\": format\r\n    };\r\n\r\n    //保存之前的规则\r\n    let fileH = $.extend(true, [], Store.luckysheetfile);\r\n    let historyRules = conditionformat.getHistoryRules(fileH);\r\n\r\n    //保存当前的规则\r\n    let ruleArr = file[\"luckysheet_conditionformat_save\"] || [];\r\n    ruleArr.push(rule);\r\n    file[\"luckysheet_conditionformat_save\"] = ruleArr;\r\n\r\n    let fileC = $.extend(true, [], Store.luckysheetfile);\r\n    let currentRules = conditionformat.getCurrentRules(fileC);\r\n\r\n    //刷新一次表格\r\n    conditionformat.ref(historyRules, currentRules);\r\n\r\n    //发送给后台\r\n    if(server.allowUpdate){\r\n        server.saveParam(\"all\", file.index, ruleArr, { \"k\": \"luckysheet_conditionformat_save\" });\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 为指定下标的工作表，删除条件格式规则，返回被删除的条件格式规则\r\n * @param {Number} itemIndex 条件格式规则索引\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function deleteRangeConditionalFormat(itemIndex, options = {}) {\r\n    if(!isRealNum(itemIndex)){\r\n        return tooltip.info('The itemIndex parameter is invalid.', '');\r\n    }\r\n\r\n    itemIndex = Number(itemIndex);\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info('The order parameter is invalid.', '');\r\n    }\r\n\r\n    let cdformat = $.extend(true, [], file.luckysheet_conditionformat_save);\r\n\r\n    if(cdformat.length == 0){\r\n        return tooltip.info('This worksheet has no conditional format to delete', '');\r\n    }\r\n    else if(cdformat[itemIndex] == null){\r\n        return tooltip.info('The conditional format of the index cannot be found', '');\r\n    }\r\n\r\n    let cdformatItem = cdformat.splice(itemIndex, 1);\r\n\r\n    //保存之前的规则\r\n    let fileH = $.extend(true, [], Store.luckysheetfile);\r\n    let historyRules = conditionformat.getHistoryRules(fileH);\r\n\r\n    //保存当前的规则\r\n    file[\"luckysheet_conditionformat_save\"] = cdformat;\r\n\r\n    let fileC = $.extend(true, [], Store.luckysheetfile);\r\n    let currentRules = conditionformat.getCurrentRules(fileC);\r\n\r\n    //刷新一次表格\r\n    conditionformat.ref(historyRules, currentRules);\r\n\r\n    //发送给后台\r\n    if(server.allowUpdate){\r\n        server.saveParam(\"all\", file.index, ruleArr, { \"k\": \"luckysheet_conditionformat_save\" });\r\n    }\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return cdformatItem;\r\n}\r\n\r\n\r\n/**\r\n * 清除指定工作表指定单元格区域的内容，不同于删除选区的功能，不需要设定单元格移动情况\r\n * @param {Object} options 可选参数\r\n * @param {Array | Object | String} options.range 要清除的选区范围\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function clearRange(options = {}) {\r\n    let {\r\n        range = Store.luckysheet_select_save,\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    range = JSON.parse(JSON.stringify(range));\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = [{\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        }]\r\n    }\r\n    else if(getObjType(range) == 'object'){\r\n        if(range.row == null || range.column == null){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        range = [{\r\n            \"row\": range.row,\r\n            \"column\": range.column\r\n        }];\r\n    }\r\n\r\n    if(getObjType(range) != 'array'){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let cfg = $.extend(true, {}, file.config);\r\n    let has_PartMC = false;\r\n\r\n    for(let s = 0; s < range.length; s++){\r\n        let r1 = range[s].row[0],\r\n            r2 = range[s].row[1];\r\n        let c1 = range[s].column[0],\r\n            c2 = range[s].column[1];\r\n\r\n        has_PartMC = hasPartMC(cfg, r1, r2, c1, c2);\r\n\r\n        if(has_PartMC){\r\n            break;\r\n        }\r\n    }\r\n\r\n    if(has_PartMC){\r\n        return tooltip.info('Cannot perform this operation on partially merged cells', '');\r\n    }\r\n\r\n    let d = $.extend(true, [], file.data);\r\n\r\n    if(d.length == 0){\r\n        d = $.extend(true, [], sheetmanage.buildGridData(file));\r\n    }\r\n\r\n    for(let s = 0; s < range.length; s++){\r\n        let r1 = range[s].row[0],\r\n            r2 = range[s].row[1];\r\n        let c1 = range[s].column[0],\r\n            c2 = range[s].column[1];\r\n\r\n        for(let r = r1; r <= r2; r++){\r\n            for(let c = c1; c <= c2; c++){\r\n                let cell = d[r][c];\r\n\r\n                if(getObjType(cell) == \"object\"){\r\n                    delete cell[\"m\"];\r\n                    delete cell[\"v\"];\r\n\r\n                    if(cell[\"f\"] != null){\r\n                        delete cell[\"f\"];\r\n                        formula.delFunctionGroup(r, c, file.index);\r\n\r\n                        delete cell[\"spl\"];\r\n                    }\r\n\r\n                    if(cell[\"ct\"] != null && cell[\"ct\"].t == 'inlineStr'){\r\n                        delete cell[\"ct\"];\r\n                    }\r\n                }\r\n                else{\r\n                    d[r][c] = null;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        jfrefreshgrid(d, range);\r\n    }\r\n    else{\r\n        file.data = d;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 删除指定工作表指定单元格区域，返回删除掉的数据，同时，指定是右侧单元格左移还是下方单元格上移\r\n * @param {String} move 删除后，单元格左移/上移\r\n * @param {Object} options 可选参数\r\n * @param {Object | String} options.range 要删除的选区范围\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function deleteRange(move, options = {}) {\r\n    let moveList = ['left', 'up'];\r\n\r\n    if(!moveList.includes(move)){\r\n        return tooltip.info(\"The move parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = {\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        };\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let str = range.row[0],\r\n        edr = range.row[1],\r\n        stc = range.column[0],\r\n        edc = range.column[1];\r\n\r\n    if(move == 'left'){\r\n        luckysheetDeleteCell('moveLeft', str, edr, stc, edc, order);\r\n    }\r\n    else if(move == 'up'){\r\n        luckysheetDeleteCell('moveUp', str, edr, stc, edc, order);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 指定工作表指定单元格区域的数据进行矩阵操作，返回操作成功后的结果数据\r\n * @param {String} type 矩阵操作的类型\r\n * @param {Object} options 可选参数\r\n * @param {Object | String} options.range 选区范围,支持选区的格式为\"A1:B2\"、\"sheetName!A1:B2\"或者{row:[0,1],column:[0,1]}，只能为单个选区；默认为当前选区\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function matrixOperation(type, options = {}) {\r\n    let typeValues = [\r\n        'flipUpDown',               // 上下翻转\r\n        'flipLeftRight',            // 左右翻转\r\n        'flipClockwise',            // 顺时针旋转\r\n        'flipCounterClockwise',     // 逆时针旋转\r\n        'transpose',                // 转置\r\n        'deleteZeroByRow',          // 按行删除两端0值\r\n        'deleteZeroByColumn',       // 按列删除两端0值\r\n        'removeDuplicateByRow',     // 按行删除重复值\r\n        'removeDuplicateByColumn',  // 按列删除重复值\r\n        'newMatrix'                 // 生产新矩阵\r\n    ]\r\n\r\n    if (!type || typeValues.indexOf(type) < 0) {\r\n        return tooltip.info('The type parameter is invalid.', '')\r\n    }\r\n\r\n    let curRange = Store.luckysheet_select_save[0];\r\n    let {\r\n        range = curRange,\r\n        success\r\n    } = {...options}\r\n\r\n    if(range instanceof Array && range.length > 1){\r\n        tooltip.info(locale().drag.noMulti, \"\");\r\n        return;\r\n    }\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    let getdata = getdatabyselection(range);\r\n    let arr = [];\r\n    if (getdata.length === 0) {\r\n        return;\r\n    }\r\n\r\n    let getdatalen, collen, arr1;\r\n    switch (type) {\r\n        case 'flipUpDown':\r\n            for (let r = getdata.length - 1; r >= 0; r--) {\r\n                let a = [];\r\n                for (let c = 0; c < getdata[0].length; c++) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr.push(a);\r\n            }\r\n            break;\r\n        case 'flipLeftRight':\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                let a = [];\r\n                for (let c = getdata[0].length - 1; c >= 0; c--) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr.push(a);\r\n            }\r\n            break;\r\n        case 'flipClockwise':\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                let a = [];\r\n                for (let r = getdata.length - 1; r >= 0; r--) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr.push(a);\r\n            }\r\n            break;\r\n        case 'flipCounterClockwise':\r\n            for (let c = getdata[0].length - 1; c >= 0; c--) {\r\n                let a = [];\r\n                for (let r = 0; r < getdata.length; r++) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr.push(a);\r\n            }\r\n            break;\r\n        case 'transpose':\r\n            for (let c = 0; c < getdata[0].length; c++) {\r\n                let a = [];\r\n                for (let r = 0; r < getdata.length; r++) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr.push(a);\r\n            }\r\n            break;\r\n        case 'deleteZeroByRow':\r\n            getdatalen = getdata[0].length;\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                let a = [], stdel = true, eddel = true;\r\n                for (let c = 0; c < getdatalen; c++) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                        if ((value.v == \"0\" || value.v == 0) && stdel) {\r\n                            continue;\r\n                        }\r\n                        else {\r\n                            stdel = false;\r\n                        }\r\n                    }\r\n                    a.push(value);\r\n                }\r\n\r\n                let a1 = [];\r\n                if (a.length == getdatalen) {\r\n                    a1 = a;\r\n                } else {\r\n                    for (let c = a.length - 1; c >= 0; c--) {\r\n                        let value = \"\";\r\n                        if (a[c] != null) {\r\n                            value = a[c];\r\n                            if ((value.v == \"0\" || value.v == 0) && eddel) {\r\n                                continue;\r\n                            }\r\n                            else {\r\n                                eddel = false;\r\n                            }\r\n                        }\r\n                        a1.unshift(value);\r\n                    }\r\n\r\n                    let l = getdatalen - a1.length;\r\n                    for (let c1 = 0; c1 < l; c1++) {\r\n                        a1.push(\"\");\r\n                    }\r\n                }\r\n                arr.push(a1);\r\n            }\r\n            break;\r\n        case 'deleteZeroByColumn':\r\n            getdatalen = getdata.length;\r\n            collen = getdata[0].length;\r\n            for (let c = 0; c < collen; c++) {\r\n                let a = [], stdel = true, eddel = true;\r\n                for (let r = 0; r < getdatalen; r++) {\r\n                    let value = \"\";\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n                        if ((value.v == \"0\" || value.v == 0) && stdel) {\r\n                            continue;\r\n                        }\r\n                        else {\r\n                            stdel = false;\r\n                        }\r\n                    }\r\n                    a.push(value);\r\n                }\r\n\r\n                let a1 = [];\r\n                if (a.length == getdatalen) {\r\n                    a1 = a;\r\n                }\r\n                else {\r\n                    for (let r = a.length - 1; r >= 0; r--) {\r\n                        let value = \"\";\r\n                        if (a[r] != null) {\r\n                            value = a[r];\r\n                            if ((value.v == \"0\" || value.v == 0) && eddel) {\r\n                                continue;\r\n                            }\r\n                            else {\r\n                                eddel = false;\r\n                            }\r\n                        }\r\n                        a1.unshift(value);\r\n                    }\r\n\r\n                    let l = getdatalen - a1.length;\r\n                    for (let r1 = 0; r1 < l; r1++) {\r\n                        a1.push(\"\");\r\n                    }\r\n                }\r\n                arr.push(a1);\r\n            }\r\n\r\n            arr1 = [];\r\n            for (let c = 0; c < arr[0].length; c++) {\r\n                let a = [];\r\n                for (let r = 0; r < arr.length; r++) {\r\n                    let value = \"\";\r\n                    if (arr[r] != null && arr[r][c] != null) {\r\n                        value = arr[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr1.push(a);\r\n            }\r\n            break;\r\n        case 'removeDuplicateByRow':\r\n            getdatalen = getdata[0].length;\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                let a = [], repeat = {};\r\n\r\n                for (let c = 0; c < getdatalen; c++) {\r\n                    let value = null;\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n\r\n                        if(value.v in repeat){\r\n                            repeat[value.v].push(value);\r\n                        }\r\n                        else{\r\n                            repeat[value.v] = [];\r\n                            repeat[value.v].push(value);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                for (let c = 0; c < getdatalen; c++) {\r\n                    let value = null;\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n\r\n                        if(repeat[value.v].length == 1){\r\n                            a.push(value);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                let l = getdatalen - a.length;\r\n                for (let c1 = 0; c1 < l; c1++) {\r\n                    a.push(null);\r\n                }\r\n                arr.push(a);\r\n            }\r\n            break;\r\n        case 'removeDuplicateByColumn':\r\n            collen = getdata[0].length;\r\n            getdatalen = getdata.length;\r\n            for (let c = 0; c < collen; c++) {\r\n                let a = [], repeat = {};\r\n\r\n                for (let r = 0; r < getdatalen; r++) {\r\n                    let value = null;\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n\r\n                        if(value.v in repeat){\r\n                            repeat[value.v].push(value);\r\n                        }\r\n                        else{\r\n                            repeat[value.v] = [];\r\n                            repeat[value.v].push(value);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                for (let r = 0; r < getdatalen; r++) {\r\n                    let value = null;\r\n                    if (getdata[r] != null && getdata[r][c] != null) {\r\n                        value = getdata[r][c];\r\n\r\n                        if(repeat[value.v].length == 1){\r\n                            a.push(value);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                a1 = a;\r\n                let l = getdatalen - a1.length;\r\n                for (let r1 = 0; r1 < l; r1++) {\r\n                    a1.push(null);\r\n                }\r\n                arr.push(a1);\r\n            }\r\n\r\n            arr1 = [];\r\n            for (let c = 0; c < arr[0].length; c++) {\r\n                let a = [];\r\n                for (let r = 0; r < arr.length; r++) {\r\n                    let value = null;\r\n                    if (arr[r] != null && arr[r][c] != null) {\r\n                        value = arr[r][c];\r\n                    }\r\n                    a.push(value);\r\n                }\r\n                arr1.push(a);\r\n            }\r\n            break;\r\n        case 'newMatrix':\r\n            // TODO\r\n            console.log(\"TODO\")\r\n            break;\r\n    }\r\n    editor.controlHandler(arr, range)\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * 指定工作表指定单元格区域的数据进行矩阵计算，返回计算成功后的结果数据\r\n * @param {String} type 计算方式\r\n * @param {Number} number 计算数值\r\n * @param {Object} options 可选参数\r\n * @param {Object | String} options.range 选区范围,支持选区的格式为\"A1:B2\"、\"sheetName!A1:B2\"或者{row:[0,1],column:[0,1]}，只能为单个选区；默认为当前选区\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function matrixCalculation(type, number, options = {}) {\r\n    let typeValues = [\r\n        'plus',     // 加\r\n        'minus',    // 减\r\n        'multiply', // 乘\r\n        'divided',  // 除\r\n        'power',    // 幂\r\n        'root',     // 次方根\r\n        'log'       // 对数log\r\n    ]\r\n\r\n    if (!type || typeValues.indexOf(type) < 0) {\r\n        return tooltip.info('The type parameter is invalid.', '')\r\n    }\r\n\r\n    if(!isRealNum(number)){\r\n        return tooltip.info('The number parameter is invalid.', '')\r\n    }\r\n\r\n    let curRange = Store.luckysheet_select_save[0];\r\n    let {\r\n        range = curRange,\r\n        success\r\n    } = {...options}\r\n\r\n    if(range instanceof Array && range.length > 1){\r\n        tooltip.info(locale().drag.noMulti, \"\");\r\n        return;\r\n    }\r\n\r\n    if (range && typeof range === 'string' && formula.iscelldata(range)) {\r\n        range = formula.getcellrange(range)\r\n    }\r\n\r\n    let getdata = getdatabyselection(range);\r\n    if (getdata.length == 0) {\r\n        return;\r\n    }\r\n\r\n    let arr = [];\r\n    for (let r = 0; r < getdata.length; r++) {\r\n        let a = [];\r\n        for (let c = 0; c < getdata[0].length; c++) {\r\n            let value = \"\";\r\n            if (getdata[r] != null && getdata[r][c] != null) {\r\n                value = getdata[r][c];\r\n                if (parseInt(value) != null && getdata[r][c].ct != undefined && getdata[r][c].ct.t == \"n\") {\r\n                    if (type == \"minus\") {\r\n                        value.v = value.v - number;\r\n                    }\r\n                    else if (type == \"multiply\") {\r\n                        value.v = value.v * number;\r\n                    }\r\n                    else if (type == \"divided\") {\r\n                        value.v = numFormat(value.v / number, 4);\r\n                    }\r\n                    else if (type == \"power\") {\r\n                        value.v = Math.pow(value.v, number);\r\n                    }\r\n                    else if (type == \"root\") {\r\n                        if (number == 2) {\r\n                            value.v = numFormat(Math.sqrt(value.v), 4);\r\n                        }\r\n                        else if (number == 3 && Math.cbrt) {\r\n                            value.v = numFormat(Math.cbrt(value.v), 4);\r\n                        }\r\n                        else {\r\n                            value.v = numFormat(jfnqrt(value.v, number), 4);\r\n                        }\r\n                    }\r\n                    else if (type == \"log\") {\r\n                        value.v = numFormat(Math.log(value.v) * 10000 / Math.log(Math.abs(number)), 4);\r\n                    }\r\n                    else {\r\n                        value.v = value.v + number;\r\n                    }\r\n\r\n                    if(value.v == null){\r\n                        value.m = \"\";\r\n                    }\r\n                    else{\r\n                        value.m = value.v.toString();\r\n                    }\r\n                }\r\n            }\r\n            a.push(value);\r\n        }\r\n        arr.push(a);\r\n    }\r\n\r\n    editor.controlHandler(arr, range);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 新增一个sheet，返回新增的工作表对象\r\n * @param {Object} options 可选参数\r\n * @param {Object} options.sheetObject 新增的工作表的数据；默认值为空对象\r\n * @param {Number} options.order 新增的工作表索引；默认值为最后一个索引位置\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setSheetAdd(options = {}) {\r\n    let lastOrder = Store.luckysheetfile.length - 1;\r\n    let {\r\n        sheetObject = {},\r\n        order = lastOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    if(!isRealNum(order)){\r\n        return tooltip.info(\"Parameter is not a table index\", \"\");\r\n    }\r\n\r\n    order = Number(order);\r\n\r\n    let index = sheetmanage.generateRandomSheetIndex();\r\n    // calcChain公式链里的index也要跟着变化\r\n    if (sheetObject.calcChain && sheetObject.calcChain.length > 0) {\r\n        sheetObject.calcChain.forEach((item) => {\r\n            item.index = index\r\n        })\r\n    }\r\n    let sheetname = sheetmanage.generateRandomSheetName(Store.luckysheetfile, false);\r\n    if(!!sheetObject.name){\r\n        let sameName = false;\r\n\r\n        for(let i = 0; i < Store.luckysheetfile.length; i++){\r\n            if(Store.luckysheetfile[i].name == sheetObject.name){\r\n                sameName = true;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if(!sameName){\r\n            sheetname = sheetObject.name;\r\n        }\r\n    }\r\n\r\n    $(\"#luckysheet-sheet-container-c\").append(replaceHtml(sheetHTML, {\r\n        \"index\": index,\r\n        \"active\": \"\",\r\n        \"name\": sheetname,\r\n        \"style\": \"\",\r\n        \"colorset\": \"\"\r\n    }));\r\n\r\n    let sheetconfig = {\r\n        \"name\": \"\",\r\n        \"color\": \"\",\r\n        \"status\": \"0\",\r\n        \"order\": \"\",\r\n        \"index\": \"\",\r\n        \"celldata\": [],\r\n        \"row\": Store.defaultrowNum,\r\n        \"column\": Store.defaultcolumnNum,\r\n        \"config\": {},\r\n        \"pivotTable\": null,\r\n        \"isPivotTable\": false\r\n    };\r\n    sheetconfig = $.extend(true, sheetconfig, sheetObject);\r\n\r\n    sheetconfig.index = index;\r\n    sheetconfig.name = sheetname;\r\n    sheetconfig.order = order;\r\n\r\n    if(order <= 0){\r\n        let beforeIndex = Store.luckysheetfile[0].index;\r\n        let beforeObj = $(\"#luckysheet-sheets-item\" + beforeIndex);\r\n        $(\"#luckysheet-sheets-item\" + index).insertBefore(beforeObj);\r\n\r\n        Store.luckysheetfile.splice(0, 0, sheetconfig);\r\n    }\r\n    else{\r\n        if(order > Store.luckysheetfile.length){\r\n            order = Store.luckysheetfile.length;\r\n        }\r\n\r\n        let afterIndex = Store.luckysheetfile[order - 1].index;\r\n        let afterObj = $(\"#luckysheet-sheets-item\" + afterIndex);\r\n        $(\"#luckysheet-sheets-item\" + index).insertAfter(afterObj);\r\n\r\n        Store.luckysheetfile.splice(order, 0, sheetconfig);\r\n    }\r\n\r\n    let orders = {};\r\n\r\n    Store.luckysheetfile.forEach((item, i, arr) => {\r\n        arr[i].order = i;\r\n        orders[item.index.toString()] = i;\r\n    })\r\n\r\n    $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n    $(\"#luckysheet-sheets-item\" + index).addClass(\"luckysheet-sheets-item-active\");\r\n    $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-datavisual-selection-set-' + index + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n    cleargridelement(true);\r\n\r\n    server.saveParam(\"sha\", null, $.extend(true, {}, sheetconfig));\r\n    server.saveParam(\"shr\", null, orders);\r\n\r\n    if (Store.clearjfundo) {\r\n        Store.jfundo.length  = 0;\r\n        let redo = {};\r\n        redo[\"type\"] = \"addSheet\";\r\n        redo[\"sheetconfig\"] = $.extend(true, {}, sheetconfig);\r\n        redo[\"index\"] = index;\r\n        redo[\"currentSheetIndex\"] = Store.currentSheetIndex;\r\n        Store.jfredo.push(redo);\r\n    }\r\n\r\n    sheetmanage.changeSheetExec(index, false, true);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n    return sheetconfig;\r\n}\r\n\r\n\r\n/**\r\n * 删除指定下标的工作表，返回已删除的工作表对象\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setSheetDelete(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(Store.luckysheetfile.length === 1){\r\n        return tooltip.info(locale().sheetconfig.noMoreSheet, \"\");\r\n    }\r\n\r\n    sheetmanage.deleteSheet(file.index);\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return file;\r\n}\r\n\r\n\r\n/**\r\n * 复制指定下标的工作表到指定下标位置\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.targetOrder 新复制的工作表目标下标位置；默认值为当前工作表下标的下一个下标位置（递增）\r\n * @param {Number} options.order 被复制的工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setSheetCopy(options = {}) {\r\n    let {\r\n        targetOrder,\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(targetOrder == null){\r\n        targetOrder = order + 1;\r\n    }\r\n\r\n    if(!isRealNum(targetOrder)){\r\n        return tooltip.info(\"The targetOrder parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let copyindex = file.index;\r\n    let index = sheetmanage.generateRandomSheetIndex();\r\n\r\n    let copyjson = $.extend(true, {}, file);\r\n    copyjson.order = Store.luckysheetfile.length;\r\n    copyjson.index = index;\r\n    copyjson.name = sheetmanage.generateCopySheetName(Store.luckysheetfile, copyjson.name);\r\n\r\n    let colorset = '';\r\n    if(copyjson.color != null){\r\n        colorset = '<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + copyjson.color + ';\"></div>';\r\n    }\r\n\r\n    let afterObj = $(\"#luckysheet-sheets-item\" + copyindex);\r\n    if(isRealNum(targetOrder)){\r\n        afterObj = $(\"#luckysheet-sheets-item\" + Store.luckysheetfile[targetOrder - 1].index);\r\n    }\r\n\r\n    $(\"#luckysheet-sheet-container-c\").append(replaceHtml(sheetHTML, {\r\n        \"index\": copyjson.index,\r\n        \"active\": \"\",\r\n        \"name\": copyjson.name,\r\n        \"order\": copyjson.order,\r\n        \"style\": \"\",\r\n        \"colorset\": colorset\r\n    }));\r\n    $(\"#luckysheet-sheets-item\" + copyjson.index).insertAfter(afterObj);\r\n    Store.luckysheetfile.splice(targetOrder, 0, copyjson);\r\n\r\n    $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n    $(\"#luckysheet-sheets-item\" + index).addClass(\"luckysheet-sheets-item-active\");\r\n    $(\"#luckysheet-cell-main\").append('<div id=\"luckysheet-datavisual-selection-set-' + index + '\" class=\"luckysheet-datavisual-selection-set\"></div>');\r\n    cleargridelement(true);\r\n\r\n    server.saveParam(\"shc\", index, { \"copyindex\": copyindex, \"name\": copyjson.name });\r\n\r\n    sheetmanage.changeSheetExec(index);\r\n    sheetmanage.reOrderAllSheet();\r\n\r\n    if (Store.clearjfundo) {\r\n        Store.jfredo.push({\r\n            \"type\": \"copySheet\",\r\n            \"copyindex\": copyindex,\r\n            \"index\": copyjson.index,\r\n            \"sheetIndex\": copyjson.index\r\n        });\r\n    }\r\n    else if (Store.jfredo.length > 0) {\r\n        let jfredostr = Store.jfredo[Store.jfredo.length - 1];\r\n\r\n        if (jfredostr.type == \"copySheet\") {\r\n            jfredostr.index = copyjson.index;\r\n            jfredostr.sheetIndex = copyjson.index;\r\n        }\r\n    }\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return copyjson;\r\n}\r\n\r\n\r\n/**\r\n * 隐藏指定下标的工作表，返回被隐藏的工作表对象\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setSheetHide(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    sheetmanage.setSheetHide(file.index);\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return file;\r\n}\r\n\r\n\r\n/**\r\n * 取消隐藏指定下标的工作表，返回被取消隐藏的工作表对象\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setSheetShow(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    sheetmanage.setSheetShow(file.index);\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return file;\r\n}\r\n\r\n\r\n/**\r\n * 设置指定下标的工作表为当前工作表（激活态），即切换到指定的工作表，返回被激活的工作表对象\r\n * @param {Number} order 要激活的工作表下标\r\n * @param {Object} options 可选参数\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setSheetActive(order, options = {}) {\r\n    if(order == null || !isRealNum(order) || Store.luckysheetfile[order] == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    $(\"#luckysheet-sheet-area div.luckysheet-sheets-item\").removeClass(\"luckysheet-sheets-item-active\");\r\n    $(\"#luckysheet-sheets-item\" + file.index).addClass(\"luckysheet-sheets-item-active\");\r\n\r\n    sheetmanage.changeSheet(file.index);\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n    server.multipleRangeShow()\r\n    return file;\r\n}\r\n\r\n\r\n/**\r\n * 修改工作表名称\r\n * @param {String} name 工作表名称\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setSheetName(name, options = {}) {\r\n    if(getObjType(name) != 'string' || name.toString().length == 0){\r\n        return tooltip.info(\"The name parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let oldtxt = file.name;\r\n    file.name = name;\r\n\r\n    $(\"#luckysheet-sheets-item\" + file.index + \" .luckysheet-sheets-item-name\").text(name);\r\n\r\n    server.saveParam(\"all\", file.index, name, { \"k\": \"name\" });\r\n\r\n    if (Store.clearjfundo) {\r\n        let redo = {};\r\n        redo[\"type\"] = \"sheetName\";\r\n        redo[\"sheetIndex\"] = file.index;\r\n\r\n        redo[\"oldtxt\"] = oldtxt;\r\n        redo[\"txt\"] = name;\r\n\r\n        Store.jfundo.length  = 0;\r\n        Store.jfredo.push(redo);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 设置工作表名称处的颜色\r\n * @param {String} color 工作表颜色\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setSheetColor(color, options = {}) {\r\n    if(getObjType(color) != 'string' || color.toString().length == 0){\r\n        return tooltip.info(\"The color parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let oldcolor = file.color;\r\n    file.color = color;\r\n\r\n    $(\"#luckysheet-sheets-item\" + file.index).find(\".luckysheet-sheets-item-color\").remove();\r\n    $(\"#luckysheet-sheets-item\" + file.index).append('<div class=\"luckysheet-sheets-item-color\" style=\" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' + color + ';\"></div>');\r\n\r\n    server.saveParam(\"all\", file.index, color, { \"k\": \"color\" });\r\n\r\n    if (Store.clearjfundo) {\r\n        let redo = {};\r\n        redo[\"type\"] = \"sheetColor\";\r\n        redo[\"sheetIndex\"] = file.index;\r\n\r\n        redo[\"oldcolor\"] = oldcolor;\r\n        redo[\"color\"] = color;\r\n\r\n        Store.jfundo.length  = 0;\r\n        Store.jfredo.push(redo);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 指定工作表向左边或右边移动一个位置，或者指定索引，返回指定的工作表对象\r\n * @param {String | Number} type 工作表移动方向或者移动的目标索引\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表索引；默认值为当前工作表索引\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setSheetMove(type, options = {}) {\r\n    if(type != 'left' && type != 'right' && !isRealNum(type)){\r\n        return tooltip.info(\"Type parameter not available\", \"\");\r\n    }\r\n\r\n    if(isRealNum(type)){\r\n        type = parseInt(type);\r\n    }\r\n\r\n    let curOrder = getSheetIndex(Store.currentSheetIndex);\r\n    let {\r\n        order = curOrder,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"ncorrect worksheet index\", \"\");\r\n    }\r\n\r\n    let sheetIndex = file.index;\r\n\r\n    if(type == 'left'){\r\n        if(order == 0){\r\n            return;\r\n        }\r\n\r\n        let prevIndex = Store.luckysheetfile[order - 1].index;\r\n        $(\"#luckysheet-sheets-item\" + sheetIndex).insertBefore($(\"#luckysheet-sheets-item\" + prevIndex));\r\n\r\n        Store.luckysheetfile.splice(order, 1);\r\n        Store.luckysheetfile.splice(order - 1, 0, file);\r\n    }\r\n    else if(type == 'right'){\r\n        if(order == Store.luckysheetfile.length - 1){\r\n            return;\r\n        }\r\n\r\n        let nextIndex = Store.luckysheetfile[order + 1].index;\r\n        $(\"#luckysheet-sheets-item\" + sheetIndex).insertAfter($(\"#luckysheet-sheets-item\" + nextIndex));\r\n\r\n        Store.luckysheetfile.splice(order, 1);\r\n        Store.luckysheetfile.splice(order + 1, 0, file);\r\n    }\r\n    else{\r\n        if(type < 0){\r\n            type = 0;\r\n        }\r\n\r\n        if(type > Store.luckysheetfile.length - 1){\r\n            type = Store.luckysheetfile.length - 1;\r\n        }\r\n\r\n        if(type == order){\r\n            return;\r\n        }\r\n\r\n        if(type < order){\r\n            let prevIndex = Store.luckysheetfile[type].index;\r\n            $(\"#luckysheet-sheets-item\" + sheetIndex).insertBefore($(\"#luckysheet-sheets-item\" + prevIndex));\r\n        }\r\n        else{\r\n            let nextIndex = Store.luckysheetfile[type].index;\r\n            $(\"#luckysheet-sheets-item\" + sheetIndex).insertAfter($(\"#luckysheet-sheets-item\" + nextIndex));\r\n        }\r\n\r\n        Store.luckysheetfile.splice(order, 1);\r\n        Store.luckysheetfile.splice(type, 0, file);\r\n    }\r\n\r\n    let orders = {};\r\n\r\n    Store.luckysheetfile.forEach((item, i, arr) => {\r\n        arr[i].order = i;\r\n        orders[item.index.toString()] = i;\r\n    })\r\n\r\n    server.saveParam(\"shr\", null, orders);\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 重新排序所有工作表的位置，指定工作表顺序的数组。\r\n * @param {Array} orderList 工作表顺序，设置工作表的index和order来指定位置\r\n * @param {Object} options 可选参数\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setSheetOrder(orderList, options = {}) {\r\n    if(orderList == null || orderList.length == 0){\r\n        return tooltip.info(\"Type orderList not available\", \"\");\r\n    }\r\n\r\n    let orderListMap = {};\r\n    orderList.forEach((item) => {\r\n        orderListMap[item.index.toString()] = item.order;\r\n    })\r\n\r\n    Store.luckysheetfile.sort((x, y) => {\r\n        let order_x = orderListMap[x.index.toString()];\r\n        let order_y = orderListMap[y.index.toString()];\r\n\r\n        if(order_x != null && order_y != null){\r\n            return order_x - order_y;\r\n        }\r\n        else if(order_x != null){\r\n            return -1;\r\n        }\r\n        else if(order_y != null){\r\n            return 1;\r\n        }\r\n        else{\r\n            return 1;\r\n        }\r\n    })\r\n\r\n    let orders = {};\r\n\r\n    Store.luckysheetfile.forEach((item, i, arr) => {\r\n        arr[i].order = i;\r\n        orders[item.index.toString()] = i;\r\n\r\n        if(i > 0){\r\n            let preIndex = arr[i - 1].index;\r\n            $(\"#luckysheet-sheets-item\" + item.index).insertAfter($(\"#luckysheet-sheets-item\" + preIndex));\r\n        }\r\n    })\r\n\r\n    server.saveParam(\"shr\", null, orders);\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 设置工作表缩放比例\r\n * @param {Number} zoom 工作表缩放比例，值范围为0.1 ~ 4；\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setSheetZoom(zoom, options = {}) {\r\n    if(!isRealNum(zoom) || zoom < 0.1 || zoom > 4){\r\n        return tooltip.info(\"The zoom parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    file[\"zoomRatio\"] = zoom;\r\n\r\n    server.saveParam(\"all\", file.index, zoom, { \"k\": \"zoomRatio\" });\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.zoomRatio = zoom;\r\n        // 图片\r\n        let currentSheet = sheetmanage.getSheetByIndex();\r\n        imageCtrl.images = currentSheet.images;\r\n        imageCtrl.allImagesShow();\r\n        imageCtrl.init();\r\n\r\n        zoomNumberDomBind();\r\n        zoomRefreshView();\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 显示指定下标工作表的网格线，返回操作的工作表对象\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 需要显示网格线的工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function showGridLines(options = {}){\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    file.showGridLines = true;\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.showGridLines = true;\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return file;\r\n}\r\n\r\n\r\n/**\r\n * 隐藏指定下标工作表的网格线，返回操作的工作表对象\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 需要显示网格线的工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function hideGridLines(options = {}){\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    file.showGridLines = false;\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.showGridLines = false;\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return file;\r\n}\r\n\r\n\r\n/**\r\n * 刷新canvas\r\n * @param {Object} options 可选参数\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function refresh(options = {}) {\r\n    // luckysheetrefreshgrid();\r\n    jfrefreshgrid();\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 滚动当前工作表位置\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.scrollLeft 横向滚动值\r\n * @param {Number} options.scrollTop 纵向滚动值\r\n * @param {Number} options.targetRow 纵向滚动到指定的行号\r\n * @param {Number} options.targetColumn 横向滚动到指定的列号\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function scroll(options = {}){\r\n    let {\r\n        scrollLeft,\r\n        scrollTop,\r\n        targetRow,\r\n        targetColumn,\r\n        success\r\n    } = {...options}\r\n\r\n    if(scrollLeft != null){\r\n        if(!isRealNum(scrollLeft)){\r\n            return tooltip.info(\"The scrollLeft parameter is invalid.\", \"\");\r\n        }\r\n\r\n        $(\"#luckysheet-scrollbar-x\").scrollLeft(scrollLeft);\r\n    }\r\n    else if(targetColumn != null){\r\n        if(!isRealNum(targetColumn)){\r\n            return tooltip.info(\"The targetColumn parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let col = Store.visibledatacolumn[targetColumn],\r\n            col_pre = targetColumn <= 0 ? 0 : Store.visibledatacolumn[targetColumn - 1];\r\n\r\n        $(\"#luckysheet-scrollbar-x\").scrollLeft(col_pre);\r\n    }\r\n\r\n\r\n    if(scrollTop != null){\r\n        if(!isRealNum(scrollTop)){\r\n            return tooltip.info(\"The scrollTop parameter is invalid.\", \"\");\r\n        }\r\n\r\n        $(\"#luckysheet-scrollbar-y\").scrollTop(scrollTop);\r\n    }\r\n    else if(targetRow != null){\r\n        if(!isRealNum(targetRow)){\r\n            return tooltip.info(\"The targetRow parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let row = Store.visibledatarow[targetRow],\r\n            row_pre = targetRow <= 0 ? 0 : Store.visibledatarow[targetRow - 1];\r\n\r\n        $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 根据窗口大小自动resize画布\r\n * @param {Object} options 可选参数\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function resize(options = {}){\r\n    luckysheetsizeauto();\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 返回指定选区截图后生成的base64格式的图片\r\n * @param {Object} options 可选参数\r\n * @param {Object | String} options.range 选区范围，只能为单个选区；默认为当前选区\r\n */\r\nexport function getScreenshot(options = {}) {\r\n    let {\r\n        range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n    } = {...options}\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = {\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        };\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let str = range.row[0],\r\n        edr = range.row[1],\r\n        stc = range.column[0],\r\n        edc = range.column[1];\r\n\r\n    let has_PartMC = hasPartMC(Store.config, str, edr, stc, edc);\r\n\r\n    if(has_PartMC){\r\n        return tooltip.info('Cannot perform this operation on partially merged cells', '');\r\n    }\r\n\r\n    let visibledatarow = Store.visibledatarow;\r\n    let visibledatacolumn = Store.visibledatacolumn;\r\n\r\n    let scrollHeight, rh_height;\r\n    if (str - 1 < 0) {\r\n        scrollHeight = 0;\r\n        rh_height = visibledatarow[edr];\r\n    }\r\n    else {\r\n        scrollHeight = visibledatarow[str - 1];\r\n        rh_height = visibledatarow[edr] - visibledatarow[str - 1];\r\n    }\r\n\r\n    let scrollWidth, ch_width;\r\n    if (stc - 1 < 0) {\r\n        scrollWidth = 0;\r\n        ch_width = visibledatacolumn[edc];\r\n    }\r\n    else {\r\n        scrollWidth = visibledatacolumn[stc - 1];\r\n        ch_width = visibledatacolumn[edc] - visibledatacolumn[stc - 1];\r\n    }\r\n\r\n    let newCanvas = $(\"<canvas>\").attr({\r\n        width: Math.ceil(ch_width * Store.devicePixelRatio),\r\n        height: Math.ceil(rh_height * Store.devicePixelRatio)\r\n    }).css({ width: ch_width, height: rh_height });\r\n\r\n    luckysheetDrawMain(scrollWidth, scrollHeight, ch_width, rh_height, 1, 1, null, null, newCanvas);\r\n    let ctx_newCanvas = newCanvas.get(0).getContext(\"2d\");\r\n\r\n    //补上 左边框和上边框\r\n    ctx_newCanvas.beginPath();\r\n    ctx_newCanvas.moveTo(\r\n        0,\r\n        0\r\n    );\r\n    ctx_newCanvas.lineTo(\r\n        0,\r\n        Store.devicePixelRatio * rh_height\r\n    );\r\n    ctx_newCanvas.lineWidth = Store.devicePixelRatio * 2;\r\n    ctx_newCanvas.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n    ctx_newCanvas.stroke();\r\n    ctx_newCanvas.closePath();\r\n\r\n    ctx_newCanvas.beginPath();\r\n    ctx_newCanvas.moveTo(\r\n        0,\r\n        0\r\n    );\r\n    ctx_newCanvas.lineTo(\r\n        Store.devicePixelRatio * ch_width,\r\n        0\r\n    );\r\n    ctx_newCanvas.lineWidth = Store.devicePixelRatio * 2;\r\n    ctx_newCanvas.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n    ctx_newCanvas.stroke();\r\n    ctx_newCanvas.closePath();\r\n\r\n    let url = newCanvas.get(0).toDataURL(\"image/png\");\r\n\r\n    return url;\r\n}\r\n\r\n\r\n/**\r\n * 设置工作簿名称\r\n * @param {String} name 工作簿名称\r\n * @param {Object} options 可选参数\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setWorkbookName(name, options = {}) {\r\n    if(name == null || name.toString().length == 0){\r\n        return tooltip.info(\"The name parameter is invalid.\", \"\");\r\n    }\r\n\r\n    $(\"#luckysheet_info_detail_input\").val(name);\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * 获取工作簿名称\r\n * @param   {Object}    options         可选参数\r\n * @param   {Function}  options.success 操作结束的回调函数\r\n * @returns {String}    返回工作簿名称，如果读取失败则返回空字符串并弹窗提示\r\n */\r\nexport function getWorkbookName(options = {}) {\r\n\r\n    let name = \"\";\r\n    let element = $(\"#luckysheet_info_detail_input\");\r\n\r\n    if(element.length == 0){\r\n\r\n        tooltip.info('Failed to get workbook name, label loading failed!');\r\n        return name;\r\n\r\n    }\r\n\r\n    name = $.trim(element.val());\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success()\r\n        }\r\n    }, 1)\r\n\r\n    return name;\r\n}\r\n\r\n\r\n/**\r\n * 撤销当前操作，返回刚刚撤销的操作对象\r\n * @param {Object} options 可选参数\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function undo(options = {}) {\r\n    let ctr = $.extend(true, {}, Store.jfredo[Store.jfredo.length - 1]);\r\n\r\n    controlHistory.redo(new Event('custom'));\r\n    luckysheetactiveCell();\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return ctr;\r\n}\r\n\r\n\r\n/**\r\n * 重做当前操作，返回刚刚重做的操作对象\r\n * @param {Object} options 可选参数\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function redo(options = {}) {\r\n    let ctr = $.extend(true, {}, Store.jfundo[Store.jfundo.length - 1]);\r\n\r\n    controlHistory.undo(new Event('custom'));\r\n    luckysheetactiveCell();\r\n\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n\r\n    return ctr;\r\n}\r\n\r\n\r\n/**\r\n * 返回所有工作表配置\r\n */\r\nexport function getAllSheets() {\r\n    let data = $.extend(true, [], Store.luckysheetfile);\r\n\r\n    data.forEach((item, index, arr) => {\r\n        if(item.data != null && item.data.length > 0){\r\n            item.celldata = sheetmanage.getGridData(item.data);\r\n        }\r\n\r\n        delete item.load;\r\n        delete item.freezen;\r\n    })\r\n\r\n    return data;\r\n}\r\n\r\nexport function getAllChartsBase64(cb) {\r\n    let data = $.extend(true, [], Store.luckysheetfile);\r\n    const chartMap = {}\r\n\r\n    data.forEach((item, index, arr) => {\r\n        if(item.hasOwnProperty('chart') && item.chart.length > 0){\r\n            chartMap[item.index] = {}\r\n            item.chart.forEach((chartInfo) => {\r\n                const chartDom = document.querySelector(`#${chartInfo.chart_id}`);\r\n                const chartInstance = echarts.getInstanceByDom(chartDom);\r\n                chartInstance.resize({width:chartInfo.width,height: chartInfo.height,animation: {\r\n                    duration: 0\r\n                }})\r\n\r\n                chartMap[item.index][chartInfo.chart_id] = chartInstance\r\n                \r\n            });\r\n\r\n        }\r\n    })\r\n\r\n    setTimeout(() => {\r\n        for (const index in chartMap) {\r\n            if (Object.hasOwnProperty.call(chartMap, index)) {\r\n                const sheet = chartMap[index];\r\n                for (const chart_id in sheet) {\r\n                    if (Object.hasOwnProperty.call(sheet, chart_id)) {\r\n                        const chartInstance = sheet[chart_id];\r\n                        sheet[chart_id] = chartInstance.getDataURL();\r\n                    }\r\n                }\r\n                \r\n            }\r\n        }\r\n        cb && cb(chartMap)\r\n        \r\n    }, 500);\r\n    \r\n}\r\n\r\n/**\r\n * 根据index获取sheet页配置\r\n *\r\n * @param {Object} options 可选参数\r\n * @param {String} options.index 工作表index\r\n * @param {Number} options.order 工作表order\r\n * @param {String} options.name 工作表name\r\n */\r\nexport function getSheet(options = {}){\r\n\r\n    let {\r\n        index,\r\n        order,\r\n        name\r\n    } = {...options};\r\n\r\n    if(index != null){\r\n        return sheetmanage.getSheetByIndex(index);\r\n    }else if(order != null){\r\n        return Store.luckysheetfile[order];\r\n    }else if(name != null){\r\n        return sheetmanage.getSheetByName(name);\r\n    }\r\n\r\n    return sheetmanage.getSheetByIndex();\r\n\r\n}\r\n\r\n/**\r\n * 快捷返回指定工作表的数据\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n */\r\nexport function getSheetData(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex)\r\n    } = {...options};\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let data = $.extend(true, [], file.data);\r\n\r\n    if(data == null || data.length == 0){\r\n        data = $.extend(true, [], sheetmanage.buildGridData(file));\r\n    }\r\n\r\n    return data;\r\n}\r\n\r\n/**\r\n * 快捷返回指定工作表的config配置\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n */\r\nexport function getConfig(options = {}) {\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex)\r\n    } = {...options};\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let config = $.extend(true, {}, file.config);\r\n\r\n    return config;\r\n}\r\n\r\n/**\r\n * 快捷设置指定工作表config配置\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setConfig(cfg, options = {}) {\r\n    if(getObjType(cfg) != 'object'){\r\n        return tooltip.info(\"The cfg parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options};\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    file.config = cfg;\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        Store.config = cfg;\r\n\r\n        if(\"rowhidden\" in cfg || \"colhidden\" in cfg || \"rowlen\" in cfg || \"columnlen\" in cfg){\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n\r\n        setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n/**\r\n * 返回所有表格数据结构的一维数组luckysheetfile\r\n */\r\nexport function getLuckysheetfile(){\r\n    return getluckysheetfile();\r\n}\r\n\r\n\r\n/**\r\n * 指定工作表范围设置数据验证功能，并设置参数\r\n * @param {Object} optionItem 数据验证的配置信息\r\n * @param {String} optionItem.type 类型\r\n * @param {String | Null} optionItem.type2 条件类型\r\n * @param {String | Number} optionItem.value1 条件值1\r\n * @param {String | Number} optionItem.value2 条件值2\r\n * @param {Boolean} optionItem.checked 选中状态\r\n * @param {Boolean} optionItem.remote 自动远程获取选项\r\n * @param {Boolean} optionItem.prohibitInput 输入数据无效时禁止输入\r\n * @param {Boolean} optionItem.hintShow 选中单元格时显示提示语\r\n * @param {String} optionItem.hintText 提示语文本\r\n * @param {Object} options 可选参数\r\n * @param {Array | Object | String} options.range 选区范围；默认为当前选区\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function setDataVerification(optionItem, options = {}) {\r\n    if(getObjType(optionItem) != 'object'){\r\n        return tooltip.info(\"The optionItem parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        type,\r\n        type2 = null,\r\n        value1 = '',\r\n        value2 = '',\r\n        remote = false,\r\n        prohibitInput = false,\r\n        hintShow = false,\r\n        hintText = '',\r\n        checked = false\r\n    } = {...optionItem}\r\n\r\n    let typeValues = [\"dropdown\", \"checkbox\", \"number\", \"number_integer\", \"number_decimal\", \"text_content\", \"text_length\", \"date\", \"validity\"];\r\n    let type2Values_1 = [\"bw\", \"nb\", \"eq\", \"ne\", \"gt\", \"lt\", \"gte\", \"lte\"];\r\n    let type2Values_2 = [\"include\", \"exclude\", \"equal\"];\r\n    let type2Values_3 = [\"bw\", \"nb\", \"eq\", \"ne\", \"bf\", \"nbf\", \"af\", \"naf\"];\r\n    let type2Values_4 = [\"card\", \"phone\"];\r\n\r\n    if(!typeValues.includes(type)){\r\n        return tooltip.info(\"The optionItem.type parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let dvText = locale().dataVerification;\r\n\r\n    if(type == 'dropdown'){\r\n        if(value1.length == 0){\r\n            tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo1);\r\n            return;\r\n        }\r\n    }\r\n    else if(type == 'checkbox'){\r\n        if(value1.length == 0 || value2.length == 0){\r\n            tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo2);\r\n            return;\r\n        }\r\n    }\r\n    else if(type == 'number' || type == 'number_integer' || type == 'number_decimal'){\r\n        if(!type2Values_1.includes(type2)){\r\n            return tooltip.info(\"The optionItem.type2 parameter is invalid.\", \"\");\r\n        }\r\n\r\n        if(!isRealNum(value1)){\r\n            tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n            return;\r\n        }\r\n\r\n        if(type2 == 'bw' || type2 == 'nb'){\r\n            if(!isRealNum(value2)){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n                return;\r\n            }\r\n\r\n            if(Number(value2) < Number(value1)){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo4);\r\n                return;\r\n            }\r\n        }\r\n    }\r\n    else if(type == 'text_content'){\r\n        if(!type2Values_2.includes(type2)){\r\n            return tooltip.info(\"The optionItem.type2 parameter is invalid.\", \"\");\r\n        }\r\n\r\n        if(value1.length == 0){\r\n            tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo5);\r\n            return;\r\n        }\r\n    }\r\n    else if(type == 'text_length'){\r\n        if(!type2Values_1.includes(type2)){\r\n            return tooltip.info(\"The optionItem.type2 parameter is invalid.\", \"\");\r\n        }\r\n\r\n        if(!isRealNum(value1)){\r\n            tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n            return;\r\n        }\r\n\r\n        if(type2 == 'bw' || type2 == 'nb'){\r\n            if(!isRealNum(value2)){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo3);\r\n                return;\r\n            }\r\n\r\n            if(Number(value2) < Number(value1)){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo4);\r\n                return;\r\n            }\r\n        }\r\n    }\r\n    else if(type == 'date'){\r\n        if(!type2Values_3.includes(type2)){\r\n            return tooltip.info(\"The optionItem.type2 parameter is invalid.\", \"\");\r\n        }\r\n\r\n        if(!isdatetime(value1)){\r\n            tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo6);\r\n            return;\r\n        }\r\n\r\n        if(type2 == 'bw' || type2 == 'nb'){\r\n            if(!isdatetime(value2)){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo6);\r\n                return;\r\n            }\r\n\r\n            if(diff(value1, value2) > 0){\r\n                tooltip.info('<i class=\"fa fa-exclamation-triangle\"></i>', dvText.tooltipInfo7);\r\n                return;\r\n            }\r\n        }\r\n    }\r\n    else if(type == 'validity'){\r\n        if(!type2Values_4.includes(type2)){\r\n            return tooltip.info(\"The optionItem.type2 parameter is invalid.\", \"\");\r\n        }\r\n    }\r\n\r\n    if(getObjType(remote) != 'boolean'){\r\n        return tooltip.info(\"The optionItem.remote parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(getObjType(prohibitInput) != 'boolean'){\r\n        return tooltip.info(\"The optionItem.prohibitInput parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(getObjType(hintShow) != 'boolean'){\r\n        return tooltip.info(\"The optionItem.hintShow parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let {\r\n        range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = {\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        };\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let item = {\r\n        type: type,\r\n        type2: type2,\r\n        value1: value1,\r\n        value2: value2,\r\n        checked: checked,\r\n        remote: remote,\r\n        prohibitInput: prohibitInput,\r\n        hintShow: hintShow,\r\n        hintText: hintText,\r\n    }\r\n\r\n    let currentDataVerification = $.extend(true, {}, file.dataVerification);\r\n\r\n    let data = $.extend(true, [], file.data);\r\n    if(data.length == 0){\r\n        data = sheetmanage.buildGridData(file);\r\n    }\r\n\r\n    let str = range.row[0],\r\n        edr = range.row[1],\r\n        stc = range.column[0],\r\n        edc = range.column[1];\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        for(let c = stc; c <= edc; c++){\r\n            currentDataVerification[r + '_' + c] = item;\r\n\r\n            if(type == 'checkbox'){\r\n                item.checked ? setcellvalue(r, c, data, item.value1) : setcellvalue(r, c, data, item.value2);\r\n            }\r\n        }\r\n    }\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        let historyDataVerification = $.extend(true, {}, file.dataVerification);\r\n\r\n        if(type == 'checkbox'){\r\n            dataVerificationCtrl.refOfCheckbox(historyDataVerification, currentDataVerification, Store.currentSheetIndex, data, range);\r\n        }\r\n        else{\r\n            dataVerificationCtrl.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex);\r\n        }\r\n    }\r\n    else{\r\n        file.dataVerification = currentDataVerification;\r\n        file.data = data;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 指定工作表范围删除数据验证功能\r\n * @param {Object} options 可选参数\r\n * @param {Array | Object | String} options.range 选区范围；默认为当前选区\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function deleteDataVerification(options = {}) {\r\n    let {\r\n        range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    if(getObjType(range) == 'string'){\r\n        if(!formula.iscelldata(range)){\r\n            return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n        }\r\n\r\n        let cellrange = formula.getcellrange(range);\r\n        range = {\r\n            \"row\": cellrange.row,\r\n            \"column\": cellrange.column\r\n        };\r\n    }\r\n\r\n    if(getObjType(range) != 'object' || range.row == null || range.column == null){\r\n        return tooltip.info(\"The range parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let currentDataVerification = $.extend(true, {}, file.dataVerification);\r\n\r\n    let str = range.row[0],\r\n        edr = range.row[1],\r\n        stc = range.column[0],\r\n        edc = range.column[1];\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        for(let c = stc; c <= edc; c++){\r\n            delete currentDataVerification[r + '_' + c];\r\n        }\r\n    }\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        let historyDataVerification = $.extend(true, {}, file.dataVerification);\r\n        dataVerificationCtrl.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex);\r\n    }\r\n    else{\r\n        file.dataVerification = currentDataVerification;\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 在指定的工作表中指定单元格位置插入图片\r\n * @param {String} src 图片src\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Number} options.rowIndex 要插入图片的单元格行下标；默认为0\r\n * @param {Number} options.colIndex 要插入图片的单元格列下标；默认为0\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function insertImage(src, options = {}){\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        rowIndex,\r\n        colIndex,\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n\r\n        if(rowIndex == null){\r\n            rowIndex = last.row_focus || 0;\r\n        }\r\n\r\n        if(rowIndex < 0){\r\n            rowIndex = 0;\r\n        }\r\n\r\n        if(rowIndex > Store.visibledatarow.length){\r\n            rowIndex = Store.visibledatarow.length;\r\n        }\r\n\r\n        if(colIndex == null){\r\n            colIndex = last.column_focus || 0;\r\n        }\r\n\r\n        if(colIndex < 0){\r\n            colIndex = 0;\r\n        }\r\n\r\n        if(colIndex > Store.visibledatacolumn.length){\r\n            colIndex = Store.visibledatacolumn.length;\r\n        }\r\n\r\n        let left = colIndex == 0 ? 0 : Store.visibledatacolumn[colIndex - 1];\r\n        let top = rowIndex == 0 ? 0 : Store.visibledatarow[rowIndex - 1];\r\n\r\n        let image = new Image();\r\n        image.onload = function(){\r\n            let width = image.width,\r\n                height = image.height;\r\n\r\n            let img = {\r\n                src: src,\r\n                left: left,\r\n                top: top,\r\n                originWidth: width,\r\n                originHeight: height\r\n            }\r\n\r\n            imageCtrl.addImgItem(img);\r\n\r\n            if (success && typeof success === 'function') {\r\n                success();\r\n            }\r\n        }\r\n        image.src = src;\r\n    }\r\n    else {\r\n        let images = file.images || {};\r\n        let config = file.config;\r\n        let zoomRatio = file.zoomRatio || 1;\r\n\r\n        let rowheight = file.row;\r\n        let visibledatarow = file.visibledatarow || [];\r\n        if(visibledatarow.length === 0){\r\n            let rh_height = 0;\r\n\r\n            for (let r = 0; r < rowheight; r++) {\r\n                let rowlen = Store.defaultrowlen;\r\n\r\n                if (config[\"rowlen\"] != null && config[\"rowlen\"][r] != null) {\r\n                    rowlen = config[\"rowlen\"][r];\r\n                }\r\n\r\n                if (config[\"rowhidden\"] != null && config[\"rowhidden\"][r] != null) {\r\n                    visibledatarow.push(rh_height);\r\n                    continue;\r\n                }\r\n\r\n                rh_height += Math.round((rowlen + 1) * zoomRatio);\r\n\r\n                visibledatarow.push(rh_height); //行的临时长度分布\r\n            }\r\n        }\r\n\r\n        let colwidth = file.column;\r\n        let visibledatacolumn = file.visibledatacolumn || [];\r\n        if(visibledatacolumn.length === 0){\r\n            let ch_width = 0;\r\n\r\n            for (let c = 0; c < colwidth; c++) {\r\n                let firstcolumnlen = Store.defaultcollen;\r\n\r\n                if (config[\"columnlen\"] != null && config[\"columnlen\"][c] != null) {\r\n                    firstcolumnlen = config[\"columnlen\"][c];\r\n                }\r\n\r\n                if(config[\"colhidden\"] != null && config[\"colhidden\"][c] != null){\r\n                    visibledatacolumn.push(ch_width);\r\n                    continue;\r\n                }\r\n\r\n                ch_width += Math.round((firstcolumnlen + 1)*zoomRatio);\r\n\r\n                visibledatacolumn.push(ch_width);//列的临时长度分布\r\n            }\r\n        }\r\n\r\n        if(rowIndex == null){\r\n            rowIndex = 0;\r\n        }\r\n\r\n        if(rowIndex < 0){\r\n            rowIndex = 0;\r\n        }\r\n\r\n        if(rowIndex > visibledatarow.length){\r\n            rowIndex = visibledatarow.length;\r\n        }\r\n\r\n        if(colIndex == null){\r\n            colIndex = 0;\r\n        }\r\n\r\n        if(colIndex < 0){\r\n            colIndex = 0;\r\n        }\r\n\r\n        if(colIndex > visibledatacolumn.length){\r\n            colIndex = visibledatacolumn.length;\r\n        }\r\n\r\n        let left = colIndex == 0 ? 0 : visibledatacolumn[colIndex - 1];\r\n        let top = rowIndex == 0 ? 0 : visibledatarow[rowIndex - 1];\r\n\r\n        let image = new Image();\r\n        image.onload = function(){\r\n            let img = {\r\n                src: src,\r\n                left: left,\r\n                top: top,\r\n                originWidth: image.width,\r\n                originHeight: image.height\r\n            }\r\n\r\n            let width, height;\r\n            let max = 400;\r\n\r\n            if(img.originHeight < img.originWidth){\r\n                height = Math.round(img.originHeight * (max / img.originWidth));\r\n                width = max;\r\n            }\r\n            else{\r\n                width = Math.round(img.originWidth * (max / img.originHeight));\r\n                height = max;\r\n            }\r\n\r\n            let imgItem = $.extend(true, {}, imageCtrl.imgItem);\r\n            imgItem.src = img.src;\r\n            imgItem.originWidth = img.originWidth;\r\n            imgItem.originHeight = img.originHeight;\r\n            imgItem.default.width = width;\r\n            imgItem.default.height = height;\r\n            imgItem.default.left = img.left;\r\n            imgItem.default.top = img.top;\r\n            imgItem.crop.width = width;\r\n            imgItem.crop.height = height;\r\n\r\n            let id = imageCtrl.generateRandomId();\r\n            images[id] = imgItem;\r\n\r\n            file.images = images;\r\n\r\n            if (success && typeof success === 'function') {\r\n                success();\r\n            }\r\n        }\r\n        image.src = src;\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 删除指定工作表中的图片\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {String | Array} options.idList 要删除图片的id集合，也可为字符串`\"all\"`，all为所有的字符串；默认为`\"all\"`\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function deleteImage(options = {}){\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        idList = 'all',\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let images = file.images;\r\n\r\n    if(images == null){\r\n        return tooltip.info(\"The worksheet has no pictures to delete.\", \"\");\r\n    }\r\n\r\n    if(idList != 'all' && getObjType(idList) != 'array'){\r\n        return tooltip.info(\"The idList parameter is invalid.\", \"\");\r\n    }\r\n\r\n    if(getObjType(idList) == 'array'){\r\n        idList.forEach(item => {\r\n            delete images[item];\r\n        })\r\n    }\r\n    else {\r\n        images = null;\r\n    }\r\n\r\n    file.images = images;\r\n\r\n    if(file.index == Store.currentSheetIndex){\r\n        if(imageCtrl.currentImgId != null && (idList == 'all' || idList.includes(imageCtrl.currentImgId))){\r\n            $(\"#luckysheet-modal-dialog-activeImage\").hide();\r\n            $(\"#luckysheet-modal-dialog-cropping\").hide();\r\n            $(\"#luckysheet-modal-dialog-slider-imageCtrl\").hide();\r\n        }\r\n\r\n        imageCtrl.images = images;\r\n        imageCtrl.allImagesShow();\r\n        imageCtrl.init();\r\n    }\r\n\r\n    if (success && typeof success === 'function') {\r\n        success();\r\n    }\r\n}\r\n\r\n\r\n/**\r\n * 获取指定工作表的图片配置\r\n * @param {Object} options 可选参数\r\n * @param {Number} options.order 工作表下标；默认值为当前工作表下标\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function getImageOption(options = {}){\r\n    let {\r\n        order = getSheetIndex(Store.currentSheetIndex),\r\n        success\r\n    } = {...options}\r\n\r\n    let file = Store.luckysheetfile[order];\r\n\r\n    if(file == null){\r\n        return tooltip.info(\"The order parameter is invalid.\", \"\");\r\n    }\r\n\r\n    setTimeout(function(){\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1)\r\n\r\n    return file.images;\r\n}\r\n\r\n\r\n/**\r\n * data => celldata ，data二维数组数据转化成 {r, c, v}格式一维数组\r\n *\r\n * @param {Array} data 二维数组数据\r\n * @param {Object} options 可选参数\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function transToCellData(data, options = {}){\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(()=>{\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    },0)\r\n\r\n    return sheetmanage.getGridData(data)\r\n}\r\n\r\n\r\n/**\r\n * celldata => data ，celldata一维数组数据转化成表格所需二维数组\r\n *\r\n * @param {Array} celldata 二维数组数据\r\n * @param {Object} options 可选参数\r\n * @param {Function} options.success 操作结束的回调函数\r\n */\r\nexport function transToData(celldata, options = {}){\r\n    let {\r\n        success\r\n    } = {...options}\r\n\r\n    setTimeout(()=>{\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    },0)\r\n\r\n    return sheetmanage.buildGridData({\r\n        celldata: celldata\r\n    })\r\n}\r\n\r\n/**\r\n * 导出的json字符串可以直接当作`luckysheet.create(options)`初始化工作簿时的参数`options`使用\r\n *\r\n */\r\nexport function toJson(){\r\n\r\n    const toJsonOptions = Store.toJsonOptions;\r\n\r\n    // Workbook name\r\n    toJsonOptions.title = $(\"#luckysheet_info_detail_input\").val();\r\n\r\n    toJsonOptions.data = getAllSheets();\r\n\r\n    // row and column\r\n    getluckysheetfile().forEach((file,index)=>{\r\n\r\n        if(file.data == undefined){\r\n            return;\r\n        }\r\n        toJsonOptions.data[index].row = getObjType(file.data) === 'array' ? file.data.length : 0;\r\n        toJsonOptions.data[index].column = getObjType(file.data[0]) === 'array' ? file.data[0].length : 0;\r\n\r\n    })\r\n\r\n    return toJsonOptions;\r\n}\r\n\r\n\r\n/**\r\n * 传入目标语言，切换到对应的语言界面\r\n * @param {String} lang 可选参数；暂支持`\"zh\"`、`\"en\"`、`\"es\"`；默认为`\"zh\"`；\r\n */\r\nexport function changLang(lang = 'zh'){\r\n    if(!['zh', 'en', 'es'].includes(lang)){\r\n        return tooltip.info(\"The lang parameter is invalid.\", \"\");\r\n    }\r\n\r\n    let options = toJson();\r\n    options.lang = lang;\r\n    luckysheet.create(options);\r\n}\r\n\r\n\r\n/**\r\n * 关闭websocket连接\r\n */\r\nexport function closeWebsocket(){\r\n    if(server.websocket == null){\r\n        return;\r\n    }\r\n    server.websocket.close(1000);\r\n}\r\n\r\n\r\n/**\r\n * 根据范围字符串转换为range数组\r\n * @param {String} txt 范围字符串\r\n */\r\nexport function getRangeByTxt(txt){\r\n\r\n    // 默认取当前第一个范围\r\n    if(txt == null){\r\n        return {\r\n            column:Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1].column,\r\n            row:Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1].row\r\n        }\r\n    }\r\n\r\n    const range = conditionformat.getRangeByTxt(txt);\r\n\r\n    return {\r\n        column:range[0].column,\r\n        row:range[0].row\r\n    };\r\n}\r\n\r\n\r\n/**\r\n * 根据范围数组转换为范围字符串\r\n * @param {Object | Array} range 范围数组\r\n */\r\nexport function getTxtByRange(range=Store.luckysheet_select_save){\r\n\r\n    // 单个范围\r\n    if(getObjType(range) === 'object'){\r\n        range = [range];\r\n    }\r\n    return conditionformat.getTxtByRange(range);\r\n}\r\n\r\n/**\r\n * 初始化分页器\r\n * @param {Object} config 分页器配置\r\n * @param {Number} config.pageIndex 当前的页码\r\n * @param {Number} config.pageSize 每页显示多少条数据\r\n * @param {Array} config.selectOption 选择每页的条数\r\n * @param {Number} config.total 总条数\r\n */\r\nexport function pagerInit (config) {\r\n    const {prevPage, nextPage, total} = locale().button;\r\n    $('#luckysheet-bottom-pager').remove()\r\n    $('#luckysheet-sheet-content').after('<div id=\"luckysheet-bottom-pager\" style=\"font-size: 14px; margin-left: 10px; display: inline-block;\"></div>')\r\n    $(\"#luckysheet-bottom-pager\").sPage({\r\n        page: config.pageIndex, //当前页码，必填\r\n        total: config.total, //数据总条数，必填\r\n        selectOption: config.selectOption, // 选择每页的行数，\r\n        pageSize: config.pageSize, //每页显示多少条数据，默认10条\r\n        showTotal: config.showTotal, // 是否显示总数，默认关闭：false\r\n        showSkip: config.showSkip, //是否显示跳页，默认关闭：false\r\n        showPN: config.showPN, //是否显示上下翻页，默认开启：true\r\n        prevPage: config.prevPage || prevPage, //上翻页文字描述，默认\"上一页\"\r\n        nextPage: config.nextPage || nextPage, //下翻页文字描述，默认\"下一页\"\r\n        totalTxt: config.totalTxt || total + config.total, // 数据总条数文字描述，{total}为占位符，默认\"总共：{total}\"\r\n        backFun: function (page) {\r\n            page.pageIndex = page.page\r\n            if(!method.createHookFunction(\"onTogglePager\", page)){ return; }\r\n        }\r\n    });\r\n}\r\n\r\n/**\r\n * 刷新公式\r\n * @param {Function} success 回调函数\r\n */\r\nexport function refreshFormula (success) {\r\n    formula.execFunctionGroupForce(true);\r\n    luckysheetrefreshgrid()\r\n    setTimeout(() => {\r\n      if (success && typeof success === 'function') {\r\n          success();\r\n      }\r\n    })\r\n}\r\n\r\n/**\r\n * 更新sheet数据\r\n * @param {Array} data 工作簿配置，可以包含多个表\r\n * @param {Object} options 可选参数\r\n * @param {Function} options.success 操作结束的回调函数\r\n *\r\n */\r\nexport function updataSheet (options = {}) {\r\n    let {data, success} = options\r\n    let files = Store.luckysheetfile\r\n    for (let i = 0; i < data.length; i++) {\r\n        for (let j = 0; j < files.length; j++) {\r\n            if (files[j].index === data[i].index) {\r\n                files[j] = data[i]\r\n            }\r\n        }\r\n    }\r\n    let file = files[sheetmanage.getSheetIndex(Store.currentSheetIndex)],\r\n        sheetData = sheetmanage.buildGridData(file);\r\n    file.data = sheetData\r\n\r\n    if (!!file.isPivotTable) {\r\n        Store.luckysheetcurrentisPivotTable = true;\r\n        if (!isPivotInitial) {\r\n            pivotTable.changePivotTable(index);\r\n        }\r\n    }\r\n    else{\r\n        Store.luckysheetcurrentisPivotTable = false;\r\n        $(\"#luckysheet-modal-dialog-slider-pivot\").hide();\r\n        luckysheetsizeauto(false);\r\n    }\r\n    sheetmanage.mergeCalculation(file[\"index\"]);\r\n    sheetmanage.setSheetParam();\r\n    setTimeout(function () {\r\n        sheetmanage.showSheet();\r\n        sheetmanage.restoreCache();\r\n        formula.execFunctionGroupForce(luckysheetConfigsetting.forceCalculation);\r\n        sheetmanage.restoreSheetAll(Store.currentSheetIndex);\r\n        luckysheetrefreshgrid();\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    }, 1);\r\n    server.saveParam(\"shs\", null, Store.currentSheetIndex);\r\n}\r\n\r\n/**\r\n * 刷新状态栏的状态\r\n * @param {Array}  data             操作数据\r\n * @param {Number} r                指定的行\r\n * @param {Number} c                指定的列\r\n * @param {Function} success        回调函数\r\n */\r\nexport function refreshMenuButtonFocus(data ,r,c , success){\r\n    data = data || Store.flowdata;\r\n    if(r == null && c == null){\r\n        /* 获取选取范围 */\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length -1];\r\n\r\n        r = last.row_focus || last.row[0];\r\n        c = last.column_focus || last.column[0];\r\n    }\r\n\r\n    menuButton.menuButtonFocus(data, r, c);\r\n\r\n    setTimeout(() => {\r\n        if (success && typeof success === 'function') {\r\n            success();\r\n        }\r\n    })\r\n}\r\n\r\n/**\r\n * 检查选区内所有cell指定类型的状态是否满足条件（主要是粗体、斜体、删除线和下划线等等）\r\n * @param {String}  type            类型\r\n * @param {String}  status          目标状态值\r\n */\r\nexport function checkTheStatusOfTheSelectedCells(type,status){\r\n\r\n    /* 获取选区内所有的单元格-扁平后的处理 */\r\n    let cells = getRangeWithFlatten();\r\n\r\n    let flag = cells.every(({r,c})=>{\r\n        let cell = Store.flowdata[r][c];\r\n        if(cell == null){\r\n            return false;\r\n        }\r\n        return cell[type] == status;\r\n    })\r\n\r\n    return flag;\r\n}\r\n\r\n/**\r\n * 调用查找/替换 dialog\r\n * @param {Number} source              0:搜索 1:替换\r\n */\r\nexport function openSearchDialog(source = 1){\r\n    luckysheetSearchReplace.createDialog(source);\r\n    luckysheetSearchReplace.init();\r\n    $(\"#luckysheet-search-replace #searchInput input\").focus();\r\n}\r\n"
  },
  {
    "path": "src/global/array.js",
    "content": "import { getcellvalue } from './getdata';\r\n\r\nconst luckysheetArray = {\r\n    transpose: function (getdata, useGetcellValue=true) {\r\n        let arr = [];\r\n        if (getdata.length == 0) {\r\n            return [];\r\n        }\r\n\r\n        if (getdata[0].length == 0) {\r\n            return [];\r\n        }\r\n\r\n        for (let c = 0; c < getdata[0].length; c++) {\r\n            let a = [];\r\n            for (let r = 0; r < getdata.length; r++) {\r\n                let value = \"\";\r\n                if (getdata[r] != null && getdata[r][c] != null) {\r\n                    if(useGetcellValue){\r\n                        value = getcellvalue(r, c, getdata);\r\n                    }\r\n                    else{\r\n                        value = getdata[r][c];\r\n                    }\r\n                }\r\n                a.push(value);\r\n            }\r\n            arr.push(a);\r\n        }\r\n\r\n        return arr;\r\n    },\r\n    minusClear: function(p, m){\r\n        if(m.row[0] > p.row[1] || m.row[1] < p.row[0] || m.column[0] > p.column[1] || m.column[1] < p.column[0]){\r\n            return null;\r\n        }\r\n\r\n        if(m.row[0] == p.row[0] && m.row[1] < p.row[1] && m.column[0] > p.column[0] && m.column[1] < p.column[1]){\r\n            return [];\r\n        }\r\n\r\n        let ret = [], range = {row:[], column:[]};\r\n\r\n        let row1 = null, column1 = [p.column[0], p.column[1]];\r\n        if(m.row[1] > p.row[0] && m.row[1] < p.row[1]){\r\n            row1 = [m.row[1] + 1, p.row[1]];\r\n        }\r\n        else if(m.row[0] > p.row[0] && m.row[0] < p.row[1]){\r\n            row1 = [p.row[0], m.row[0] - 1];\r\n        }\r\n\r\n        if(row1 != null){\r\n            ret.push({\"row\": row1, \"column\": column1});\r\n        }\r\n\r\n        let row2 = [p.row[0], p.row[1]], column2 = null;\r\n        if(m.column[1] > p.column[0] && m.column[1] < p.column[1]){\r\n            column2 = [m.column[1] + 1, p.column[1]];\r\n        }\r\n        else if(m.column[0] > p.column[0] && m.column[0] < p.column[1]){\r\n            column2 = [p.column[0], m.column[0] - 1];\r\n        }\r\n\r\n        if(column2 != null){\r\n            ret.push({\"row\": row2, \"column\": column2});\r\n        }\r\n\r\n        return ret;\r\n    }\r\n}\r\n\r\nexport default luckysheetArray;"
  },
  {
    "path": "src/global/border.js",
    "content": "import { getSheetIndex } from '../methods/get';\r\nimport { getObjType } from '../utils/util';\r\nimport Store from '../store';\r\n\r\n//获取表格边框数据计算值\r\nfunction getBorderInfoComputeRange(dataset_row_st,dataset_row_ed,dataset_col_st,dataset_col_ed,sheetIndex) {\r\n    let borderInfoCompute = {};\r\n\r\n    let cfg, data; \r\n    if(sheetIndex == null){\r\n        cfg = Store.config;\r\n        data = Store.flowdata;\r\n    }\r\n    else{\r\n        cfg = Store.luckysheetfile[getSheetIndex(sheetIndex)].config;\r\n        data = Store.luckysheetfile[getSheetIndex(sheetIndex)].data;\r\n    }\r\n\r\n    let borderInfo = cfg[\"borderInfo\"];\r\n\r\n    if(borderInfo != null && borderInfo.length > 0){\r\n        for(let i = 0; i < borderInfo.length; i++){\r\n            let rangeType = borderInfo[i].rangeType;\r\n\r\n            if(rangeType == \"range\"){\r\n                let borderType = borderInfo[i].borderType;\r\n                let borderColor = borderInfo[i].color;\r\n                let borderStyle = borderInfo[i].style;\r\n\r\n                let borderRange = borderInfo[i].range;\r\n\r\n                for(let j = 0; j < borderRange.length; j++){\r\n                    let bd_r1 = borderRange[j].row[0], bd_r2 = borderRange[j].row[1];\r\n                    let bd_c1 = borderRange[j].column[0], bd_c2 = borderRange[j].column[1];\r\n\r\n                    if(bd_r1<dataset_row_st){\r\n                        bd_r1 = dataset_row_st;\r\n                    }\r\n\r\n                    if(bd_r2>dataset_row_ed){\r\n                        bd_r2 = dataset_row_ed;\r\n                    }\r\n\r\n                    if(bd_c1<dataset_col_st){\r\n                        bd_c1 = dataset_col_st;\r\n                    }\r\n\r\n                    if(bd_c2>dataset_col_ed){\r\n                        bd_c2 = dataset_col_ed;\r\n                    }\r\n\r\n                    if(borderType == \"border-left\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n                            \r\n                            if(borderInfoCompute[bd_r + \"_\" + bd_c1] == null){\r\n                                borderInfoCompute[bd_r + \"_\" + bd_c1] = {};\r\n                            }\r\n\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c1].l = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                            let bd_c_left = bd_c1 - 1;\r\n\r\n                            if(bd_c_left >= 0 && borderInfoCompute[bd_r + \"_\" + bd_c_left]){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == \"object\" && data[bd_r][bd_c_left].mc != null){\r\n                                    let cell_left = data[bd_r][bd_c_left];\r\n\r\n                                    let mc = cfg[\"merge\"][cell_left.mc.r + \"_\" + cell_left.mc.c];\r\n\r\n                                    if(mc.c + mc.cs - 1 == bd_c_left){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                }\r\n                            }\r\n\r\n                            let mc = cfg[\"merge\"] || {};  \r\n                            for (const key in mc) {\r\n                                let {c,r,cs,rs} = mc[key];\r\n                                if(bd_c1 <= c + cs - 1 && bd_c1 > c && bd_r >= r && bd_r <= r + rs -1){\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c1].l = null;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-right\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n                            \r\n                            if(borderInfoCompute[bd_r + \"_\" + bd_c2] == null){\r\n                                borderInfoCompute[bd_r + \"_\" + bd_c2] = {};\r\n                            }\r\n\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c2].r = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                            let bd_c_right = bd_c2 + 1;\r\n\r\n                            if(bd_c_right < data[0].length && borderInfoCompute[bd_r + \"_\" + bd_c_right]){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == \"object\" && data[bd_r][bd_c_right].mc != null){\r\n                                    let cell_right = data[bd_r][bd_c_right];\r\n\r\n                                    let mc = cfg[\"merge\"][cell_right.mc.r + \"_\" + cell_right.mc.c];\r\n\r\n                                    if(mc.c == bd_c_right){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                }\r\n                            }\r\n                            let mc = cfg[\"merge\"] || {};  \r\n                            for (const key in mc) {\r\n                                let {c,r,cs,rs} = mc[key];\r\n                                if(bd_c2 < c + cs - 1 && bd_c2 >= c && bd_r >= r && bd_r <= r + rs -1){\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c2].r = null;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-top\"){\r\n                        if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r1] != null) {\r\n                            continue;\r\n                        }\r\n\r\n                        for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                            if(borderInfoCompute[bd_r1 + \"_\" + bd_c] == null){\r\n                                borderInfoCompute[bd_r1 + \"_\" + bd_c] = {};\r\n                            }\r\n\r\n                            borderInfoCompute[bd_r1 + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                            let bd_r_top = bd_r1 - 1;\r\n\r\n                            if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + \"_\" + bd_c]){\r\n                                if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == \"object\" && data[bd_r_top][bd_c].mc != null){\r\n                                    let cell_top = data[bd_r_top][bd_c];\r\n\r\n                                    let mc = cfg[\"merge\"][cell_top.mc.r + \"_\" + cell_top.mc.c];\r\n\r\n                                    if(mc.r + mc.rs - 1 == bd_r_top){\r\n                                        borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                }\r\n                            }\r\n\r\n                            let mc = cfg[\"merge\"] || {};  \r\n                            for (const key in mc) {\r\n                                let {c,r,cs,rs} = mc[key];\r\n                                if(bd_r1 <= r + rs - 1 && bd_r1 > r && bd_c >= c && bd_c <= c + cs -1){\r\n                                    borderInfoCompute[bd_r1 + \"_\" + bd_c].t = null;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-bottom\"){\r\n                        if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r2] != null) {\r\n                            continue;\r\n                        }\r\n\r\n                        for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                            if(borderInfoCompute[bd_r2 + \"_\" + bd_c] == null){\r\n                                borderInfoCompute[bd_r2 + \"_\" + bd_c] = {};\r\n                            }\r\n\r\n                            borderInfoCompute[bd_r2 + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                            let bd_r_bottom = bd_r2 + 1;\r\n\r\n                            if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + \"_\" + bd_c]){\r\n                                if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == \"object\" && data[bd_r_bottom][bd_c].mc != null){\r\n                                    let cell_bottom = data[bd_r_bottom][bd_c];\r\n\r\n                                    let mc = cfg[\"merge\"][cell_bottom.mc.r + \"_\" + cell_bottom.mc.c];\r\n\r\n                                    if(mc.r == bd_r_bottom){\r\n                                        borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                }\r\n                            }\r\n\r\n                            let mc = cfg[\"merge\"] || {};  \r\n                            for (const key in mc) {\r\n                                let {c,r,cs,rs} = mc[key];\r\n                                if(bd_r2 < r + rs - 1 && bd_r2 >= r && bd_c >= c && bd_c <= c + cs -1){\r\n                                    borderInfoCompute[bd_r2 + \"_\" + bd_c].b = null;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-all\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n\r\n                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                    let cell = data[bd_r][bd_c];\r\n\r\n                                    let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                    if(mc.r == bd_r){\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                    \r\n                                    if(mc.r + mc.rs - 1 == bd_r){\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n\r\n                                    if(mc.c == bd_c){\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                    \r\n                                    if(mc.c + mc.cs - 1 == bd_c){\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                    }\r\n\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                }\r\n\r\n                                if(bd_r == bd_r1){\r\n                                    let bd_r_top = bd_r1 - 1;\r\n\r\n                                    if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + \"_\" + bd_c]){\r\n                                        if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == \"object\" && data[bd_r_top][bd_c].mc != null){\r\n                                            let cell_top = data[bd_r_top][bd_c];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_top.mc.r + \"_\" + cell_top.mc.c];\r\n\r\n                                            if(mc.r + mc.rs - 1 == bd_r_top){\r\n                                                borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                }\r\n                                \r\n                                if(bd_r == bd_r2){\r\n                                    let bd_r_bottom = bd_r2 + 1;\r\n\r\n                                    if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + \"_\" + bd_c]){\r\n                                        if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == \"object\" && data[bd_r_bottom][bd_c].mc != null){\r\n                                            let cell_bottom = data[bd_r_bottom][bd_c];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_bottom.mc.r + \"_\" + cell_bottom.mc.c];\r\n\r\n                                            if(mc.r == bd_r_bottom){\r\n                                                borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                        }\r\n                                    }\r\n                                }\r\n                                \r\n                                if(bd_c == bd_c1){\r\n                                    let bd_c_left = bd_c1 - 1;\r\n\r\n                                    if(bd_c_left >= 0 && borderInfoCompute[bd_r + \"_\" + bd_c_left]){\r\n                                        if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == \"object\" && data[bd_r][bd_c_left].mc != null){\r\n                                            let cell_left = data[bd_r][bd_c_left];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_left.mc.r + \"_\" + cell_left.mc.c];\r\n\r\n                                            if(mc.c + mc.cs - 1 == bd_c_left){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                        }\r\n                                    }\r\n                                }\r\n                                \r\n                                if(bd_c == bd_c2){\r\n                                    let bd_c_right = bd_c2 + 1;\r\n\r\n                                    if(bd_c_right < data[0].length && borderInfoCompute[bd_r + \"_\" + bd_c_right]){\r\n                                        if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == \"object\" && data[bd_r][bd_c_right].mc != null){\r\n                                            let cell_right = data[bd_r][bd_c_right];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_right.mc.r + \"_\" + cell_right.mc.c];\r\n\r\n                                            if(mc.c == bd_c_right){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-outside\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n\r\n                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                                if(!(bd_r == bd_r1 || bd_r == bd_r2 || bd_c == bd_c1 || bd_c == bd_c2)){\r\n                                    continue;\r\n                                }\r\n\r\n                                if(bd_r == bd_r1){\r\n                                    if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                    }\r\n\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                                    let bd_r_top = bd_r1 - 1;\r\n\r\n                                    if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + \"_\" + bd_c]){\r\n                                        if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == \"object\" && data[bd_r_top][bd_c].mc != null){\r\n                                            let cell_top = data[bd_r_top][bd_c];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_top.mc.r + \"_\" + cell_top.mc.c];\r\n\r\n                                            if(mc.r + mc.rs - 1 == bd_r_top){\r\n                                                borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                }\r\n\r\n                                if(bd_r == bd_r2){\r\n                                    if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                    }\r\n\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                                    let bd_r_bottom = bd_r2 + 1;\r\n\r\n                                    if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + \"_\" + bd_c]){\r\n                                        if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == \"object\" && data[bd_r_bottom][bd_c].mc != null){\r\n                                            let cell_bottom = data[bd_r_bottom][bd_c];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_bottom.mc.r + \"_\" + cell_bottom.mc.c];\r\n\r\n                                            if(mc.r == bd_r_bottom){\r\n                                                borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                        }\r\n                                    }\r\n                                }\r\n\r\n                                if(bd_c == bd_c1){\r\n                                    if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                    }\r\n\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                                    let bd_c_left = bd_c1 - 1;\r\n\r\n                                    if(bd_c_left >= 0 && borderInfoCompute[bd_r + \"_\" + bd_c_left]){\r\n                                        if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == \"object\" && data[bd_r][bd_c_left].mc != null){\r\n                                            let cell_left = data[bd_r][bd_c_left];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_left.mc.r + \"_\" + cell_left.mc.c];\r\n\r\n                                            if(mc.c + mc.cs - 1 == bd_c_left){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                        }\r\n                                    }\r\n                                }\r\n\r\n                                if(bd_c == bd_c2){\r\n                                    if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                    }\r\n\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n\r\n                                    let bd_c_right = bd_c2 + 1;\r\n\r\n                                    if(bd_c_right < data[0].length && borderInfoCompute[bd_r + \"_\" + bd_c_right]){\r\n                                        if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == \"object\" && data[bd_r][bd_c_right].mc != null){\r\n                                            let cell_right = data[bd_r][bd_c_right];\r\n\r\n                                            let mc = cfg[\"merge\"][cell_right.mc.r + \"_\" + cell_right.mc.c];\r\n\r\n                                            if(mc.c == bd_c_right){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                            }\r\n                                        }\r\n                                        else{\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": borderColor, \"style\": borderStyle }; \r\n                                        }\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-inside\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n\r\n                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                                if(bd_r == bd_r1 && bd_c == bd_c1){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_r == bd_r2 && bd_c == bd_c1){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_r == bd_r1 && bd_c == bd_c2){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_r == bd_r2 && bd_c == bd_c2){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_r == bd_r1){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                        if(mc.c == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.c + mc.cs - 1 == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_r == bd_r2){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                        if(mc.c == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.c + mc.cs - 1 == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_c == bd_c1){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                        if(mc.r == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.r + mc.rs - 1 == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_c == bd_c2){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                        if(mc.r == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.r + mc.rs - 1 == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                        if(mc.r == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.r + mc.rs - 1 == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n\r\n                                        if(mc.c == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.c + mc.cs - 1 == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }    \r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-horizontal\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n\r\n                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                                if(bd_r == bd_r1){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_r == bd_r2){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c];\r\n\r\n                                        if(mc.r == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.r + mc.rs - 1 == bd_r){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-vertical\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n\r\n                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                                if(bd_c == bd_c1){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else if(bd_c == bd_c2){\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                                        let cell = data[bd_r][bd_c];\r\n\r\n                                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c] || {};\r\n\r\n                                        if(mc.c == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                        else if(mc.c + mc.cs - 1 == bd_c){\r\n                                            if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                                borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                            }\r\n\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        }\r\n                                    }\r\n                                    else{\r\n                                        if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                                            borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                                        }\r\n\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": borderColor, \"style\": borderStyle };\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": borderColor, \"style\": borderStyle };\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    else if(borderType == \"border-none\"){\r\n                        for(let bd_r = bd_r1; bd_r <= bd_r2; bd_r++){\r\n                            if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                                continue;\r\n                            }\r\n\r\n                            for(let bd_c = bd_c1; bd_c <= bd_c2; bd_c++){\r\n                                if(borderInfoCompute[bd_r + \"_\" + bd_c] != null){\r\n                                    delete borderInfoCompute[bd_r + \"_\" + bd_c];\r\n                                }\r\n\r\n                                if(bd_r == bd_r1){\r\n                                    let bd_r_top = bd_r1 - 1;\r\n\r\n                                    if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + \"_\" + bd_c]){\r\n                                        delete borderInfoCompute[bd_r_top + \"_\" + bd_c].b;\r\n                                    }\r\n                                }\r\n                                \r\n                                if(bd_r == bd_r2){\r\n                                    let bd_r_bottom = bd_r2 + 1;\r\n\r\n                                    if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + \"_\" + bd_c]){\r\n                                        delete borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t;\r\n                                    }\r\n                                }\r\n                                \r\n                                if(bd_c == bd_c1){\r\n                                    let bd_c_left = bd_c1 - 1;\r\n\r\n                                    if(bd_c_left >= 0 && borderInfoCompute[bd_r + \"_\" + bd_c_left]){\r\n                                        delete borderInfoCompute[bd_r + \"_\" + bd_c_left].r;\r\n                                    }\r\n                                }\r\n                                \r\n                                if(bd_c == bd_c2){\r\n                                    let bd_c_right = bd_c2 + 1;\r\n\r\n                                    if(bd_c_right < data[0].length && borderInfoCompute[bd_r + \"_\" + bd_c_right]){\r\n                                        delete borderInfoCompute[bd_r + \"_\" + bd_c_right].l;\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else if(rangeType == \"cell\"){\r\n                let value = borderInfo[i].value;\r\n\r\n                let bd_r = value.row_index, bd_c = value.col_index;\r\n\r\n                if(bd_r < dataset_row_st || bd_r > dataset_row_ed || bd_c < dataset_col_st || bd_c > dataset_col_ed){\r\n                    continue;\r\n                }\r\n\r\n                if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][bd_r] != null) {\r\n                    continue;\r\n                }\r\n\r\n                if(value.l != null || value.r != null || value.t != null || value.b != null){\r\n                    if(borderInfoCompute[bd_r + \"_\" + bd_c] == null){\r\n                        borderInfoCompute[bd_r + \"_\" + bd_c] = {};\r\n                    }\r\n\r\n                    if(data[bd_r] != null && getObjType(data[bd_r][bd_c]) == \"object\" && data[bd_r][bd_c].mc != null){\r\n                        let cell = data[bd_r][bd_c];\r\n                        let mc = cfg[\"merge\"][cell.mc.r + \"_\" + cell.mc.c] || {};\r\n\r\n                        if(value.l != null && bd_c == mc.c){ //左边框\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": value.l.color, \"style\": value.l.style };\r\n\r\n                            let bd_c_left = bd_c - 1;\r\n\r\n                            if(bd_c_left >= 0 && borderInfoCompute[bd_r + \"_\" + bd_c_left]){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == \"object\" && data[bd_r][bd_c_left].mc != null){\r\n                                    let cell_left = data[bd_r][bd_c_left];\r\n\r\n                                    let mc_l = cfg[\"merge\"][cell_left.mc.r + \"_\" + cell_left.mc.c];\r\n\r\n                                    if(mc_l.c + mc_l.cs - 1 == bd_c_left){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": value.l.color, \"style\": value.l.style }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": value.l.color, \"style\": value.l.style }; \r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].l = null;\r\n                        }\r\n\r\n                        if(value.r != null && bd_c == mc.c + mc.cs - 1){ //右边框\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": value.r.color, \"style\": value.r.style };\r\n\r\n                            let bd_c_right = bd_c + 1;\r\n\r\n                            if(bd_c_right < data[0].length && borderInfoCompute[bd_r + \"_\" + bd_c_right]){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == \"object\" && data[bd_r][bd_c_right].mc != null){\r\n                                    let cell_right = data[bd_r][bd_c_right];\r\n\r\n                                    let mc_r = cfg[\"merge\"][cell_right.mc.r + \"_\" + cell_right.mc.c];\r\n\r\n                                    if(mc_r.c == bd_c_right){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": value.r.color, \"style\": value.r.style }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": value.r.color, \"style\": value.r.style }; \r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].r = null;\r\n                        }\r\n\r\n                        if(value.t != null && bd_r == mc.r){ //上边框\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": value.t.color, \"style\": value.t.style };\r\n\r\n                            let bd_r_top = bd_r - 1;\r\n\r\n                            if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + \"_\" + bd_c]){\r\n                                if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == \"object\" && data[bd_r_top][bd_c].mc != null){\r\n                                    let cell_top = data[bd_r_top][bd_c];\r\n\r\n                                    let mc_t = cfg[\"merge\"][cell_top.mc.r + \"_\" + cell_top.mc.c];\r\n\r\n                                    if(mc_t.r + mc_t.rs - 1 == bd_r_top){\r\n                                        borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": value.t.color, \"style\": value.t.style };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": value.t.color, \"style\": value.t.style };\r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].t = null;\r\n                        }\r\n\r\n                        if(value.b != null && bd_r == mc.r + mc.rs - 1){ //下边框\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": value.b.color, \"style\": value.b.style };\r\n\r\n                            let bd_r_bottom = bd_r + 1;\r\n\r\n                            if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + \"_\" + bd_c]){\r\n                                if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == \"object\" && data[bd_r_bottom][bd_c].mc != null){\r\n                                    let cell_bottom = data[bd_r_bottom][bd_c];\r\n                                    \r\n                                    let mc_b = cfg[\"merge\"][cell_bottom.mc.r + \"_\" + cell_bottom.mc.c];\r\n\r\n                                    if(mc_b.r == bd_r_bottom){\r\n                                        borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": value.b.color, \"style\": value.b.style }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": value.b.color, \"style\": value.b.style }; \r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].b = null;\r\n                        }\r\n                    }\r\n                    else{\r\n                        if(value.l != null){ //左边框\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].l = { \"color\": value.l.color, \"style\": value.l.style };\r\n\r\n                            let bd_c_left = bd_c - 1;\r\n\r\n                            if(bd_c_left >= 0 && borderInfoCompute[bd_r + \"_\" + bd_c_left]){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_left]) == \"object\" && data[bd_r][bd_c_left].mc != null){\r\n                                    let cell_left = data[bd_r][bd_c_left];\r\n\r\n                                    let mc_l = cfg[\"merge\"][cell_left.mc.r + \"_\" + cell_left.mc.c];\r\n\r\n                                    if(mc_l.c + mc_l.cs - 1 == bd_c_left){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": value.l.color, \"style\": value.l.style }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c_left].r = { \"color\": value.l.color, \"style\": value.l.style }; \r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].l = null;\r\n                        }\r\n\r\n                        if(value.r != null){ //右边框\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].r = { \"color\": value.r.color, \"style\": value.r.style };\r\n\r\n                            let bd_c_right = bd_c + 1;\r\n\r\n                            if(bd_c_right < data[0].length && borderInfoCompute[bd_r + \"_\" + bd_c_right]){\r\n                                if(data[bd_r] != null && getObjType(data[bd_r][bd_c_right]) == \"object\" && data[bd_r][bd_c_right].mc != null){\r\n                                    let cell_right = data[bd_r][bd_c_right];\r\n\r\n                                    let mc_r = cfg[\"merge\"][cell_right.mc.r + \"_\" + cell_right.mc.c];\r\n\r\n                                    if(mc_r.c == bd_c_right){\r\n                                        borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": value.r.color, \"style\": value.r.style }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r + \"_\" + bd_c_right].l = { \"color\": value.r.color, \"style\": value.r.style }; \r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].r = null;\r\n                        }\r\n\r\n                        if(value.t != null){ //上边框\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].t = { \"color\": value.t.color, \"style\": value.t.style };\r\n\r\n                            let bd_r_top = bd_r - 1;\r\n\r\n                            if(bd_r_top >= 0 && borderInfoCompute[bd_r_top + \"_\" + bd_c]){\r\n                                if(data[bd_r_top] != null && getObjType(data[bd_r_top][bd_c]) == \"object\" && data[bd_r_top][bd_c].mc != null){\r\n                                    let cell_top = data[bd_r_top][bd_c];\r\n\r\n                                    let mc_t = cfg[\"merge\"][cell_top.mc.r + \"_\" + cell_top.mc.c];\r\n\r\n                                    if(mc_t.r + mc_t.rs - 1 == bd_r_top){\r\n                                        borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": value.t.color, \"style\": value.t.style };\r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r_top + \"_\" + bd_c].b = { \"color\": value.t.color, \"style\": value.t.style };\r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].t = null;\r\n                        }\r\n\r\n                        if(value.b != null){ //下边框\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].b = { \"color\": value.b.color, \"style\": value.b.style };\r\n\r\n                            let bd_r_bottom = bd_r + 1;\r\n\r\n                            if(bd_r_bottom < data.length && borderInfoCompute[bd_r_bottom + \"_\" + bd_c]){\r\n                                if(data[bd_r_bottom] != null && getObjType(data[bd_r_bottom][bd_c]) == \"object\" && data[bd_r_bottom][bd_c].mc != null){\r\n                                    let cell_bottom = data[bd_r_bottom][bd_c];\r\n                                    \r\n                                    let mc_b = cfg[\"merge\"][cell_bottom.mc.r + \"_\" + cell_bottom.mc.c];\r\n\r\n                                    if(mc_b.r == bd_r_bottom){\r\n                                        borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": value.b.color, \"style\": value.b.style }; \r\n                                    }\r\n                                }\r\n                                else{\r\n                                    borderInfoCompute[bd_r_bottom + \"_\" + bd_c].t = { \"color\": value.b.color, \"style\": value.b.style }; \r\n                                }\r\n                            }\r\n                        }\r\n                        else{\r\n                            borderInfoCompute[bd_r + \"_\" + bd_c].b = null;\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    delete borderInfoCompute[bd_r + \"_\" + bd_c];\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return borderInfoCompute;\r\n}\r\n\r\nfunction getBorderInfoCompute(sheetIndex) {\r\n    let borderInfoCompute = {};\r\n\r\n    let cfg, data; \r\n    if(sheetIndex == null){\r\n        cfg = Store.config;\r\n        data = Store.flowdata;\r\n    }\r\n    else{\r\n        cfg = Store.luckysheetfile[getSheetIndex(sheetIndex)].config;\r\n        data = Store.luckysheetfile[getSheetIndex(sheetIndex)].data;\r\n    }\r\n\r\n    borderInfoCompute = getBorderInfoComputeRange(0, data.length,0, data[0].length, sheetIndex);\r\n\r\n    return borderInfoCompute;\r\n}\r\n\r\nexport {\r\n    getBorderInfoCompute,\r\n    getBorderInfoComputeRange\r\n}"
  },
  {
    "path": "src/global/browser.js",
    "content": "const browser = {\r\n    mobilecheck: function() {\r\n        var a = !1;\r\n        return function(b) {\r\n            ('ongestureend' in window || /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(b) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(b.substr(0, 4))) && (a = !0);\r\n        }(navigator.userAgent || navigator.vendor || window.opera), document.body && document.body.clientWidth && document.body.clientHeight && document.body.clientWidth < 350 && document.body.clientHeight < 500 && (a = !0), a;\r\n    },\r\n    iphoneCheck: function() {\r\n        var a = !1;\r\n        return /iPhone/i.test(navigator.userAgent) && (a = !0), !0;\r\n    },\r\n    isWeixin:function() {\r\n        var a = navigator.userAgent.toLowerCase();\r\n        return \"micromessenger\" == a.match(/MicroMessenger/i) ? !0 : !1;\r\n    },\r\n    isAndroid:function() {\r\n        var a = navigator.userAgent,\r\n            b = (navigator.appVersion, a.indexOf(\"Android\") > -1 || a.indexOf(\"Linux\") > -1);\r\n        return b;\r\n    },\r\n    tabletCheck:function() {\r\n        var a = /ipad|android|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase());\r\n        return a;\r\n    },\r\n    BrowserType: function() {\r\n        var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串\r\n        var isOpera = userAgent.indexOf(\"Opera\") > -1; //判断是否Opera浏览器\r\n        var isIE = userAgent.indexOf(\"compatible\") > -1 && userAgent.indexOf(\"MSIE\") > -1 && !isOpera; //判断是否IE浏览器\r\n        var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf(\"rv:11.0\") > -1;\r\n        var isEdge = userAgent.indexOf(\"Edge\") > -1; //判断是否IE的Edge浏览器\r\n        var isFF = userAgent.indexOf(\"Firefox\") > -1; //判断是否Firefox浏览器\r\n        var isSafari = userAgent.indexOf(\"Safari\") > -1 && userAgent.indexOf(\"Chrome\") == -1; //判断是否Safari浏览器\r\n        var isChrome = userAgent.indexOf(\"Chrome\") > -1 && userAgent.indexOf(\"Safari\") > -1; //判断Chrome浏览器\r\n        if (isIE) {\r\n            var reIE = new RegExp(\"MSIE (\\\\d+\\\\.\\\\d+);\");\r\n            reIE.test(userAgent);\r\n            var fIEVersion = parseFloat(RegExp[\"$1\"]);\r\n            if (fIEVersion == 7) {\r\n                return \"IE7\";\r\n            } else if (fIEVersion == 8) {\r\n                return \"IE8\";\r\n            } else if (fIEVersion == 9) {\r\n                return \"IE9\";\r\n            } else if (fIEVersion == 10) {\r\n                return \"IE10\";\r\n            // } else if (fIEVersion == 11) {\r\n            //     return \"IE11\";\r\n            } else {\r\n                return \"0\";\r\n            } //IE版本过低\r\n        } //isIE end\r\n        if (isFF) {\r\n            return \"FF\";\r\n        }\r\n        if (isOpera) {\r\n            return \"Opera\";\r\n        }\r\n        if (isSafari) {\r\n            return \"Safari\";\r\n        }\r\n        if (isChrome) {\r\n            return \"Chrome\";\r\n        }\r\n        if (isEdge) {\r\n            return \"Edge\";\r\n        }\r\n        if (isIE11) {\r\n            return \"IE11\";\r\n        }\r\n    }, //myBrowser() end\r\n    //判断是否是IE浏览器\r\n    isIE: function() {\r\n        var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串\r\n        var isOpera = userAgent.indexOf(\"Opera\") > -1; //判断是否Opera浏览器\r\n        var isIE = userAgent.indexOf(\"compatible\") > -1 && userAgent.indexOf(\"MSIE\") > -1 && !isOpera; //判断是否IE浏览器\r\n        var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf(\"rv:11.0\") > -1;\r\n        if (isIE || isIE11) {\r\n            return \"1\";\r\n        } else {\r\n            return \"-1\";\r\n        }\r\n    },\r\n    //判断是否是IE浏览器，包括Edge浏览器\r\n    IEVersion: function() {\r\n        var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串\r\n        var isOpera = userAgent.indexOf(\"Opera\") > -1; //判断是否Opera浏览器\r\n        var isIE = userAgent.indexOf(\"compatible\") > -1 && userAgent.indexOf(\"MSIE\") > -1 && !isOpera; //判断是否IE浏览器\r\n        var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf(\"rv:11.0\") > -1;\r\n        var isEdge = userAgent.indexOf(\"Windows NT 6.1; Trident/7.0;\") > -1 && !isIE; //判断是否IE的Edge浏览器\r\n        if (isIE) {\r\n            var reIE = new RegExp(\"MSIE (\\\\d+\\\\.\\\\d+);\");\r\n            reIE.test(userAgent);\r\n            var fIEVersion = parseFloat(RegExp[\"$1\"]);\r\n            if (fIEVersion == 7) {\r\n                return \"IE7\";\r\n            } else if (fIEVersion == 8) {\r\n                return \"IE8\";\r\n            } else if (fIEVersion == 9) {\r\n                return \"IE9\";\r\n            } else if (fIEVersion == 10) {\r\n                return \"IE10\";\r\n            // } else if (fIEVersion == 11) {\r\n            //     return \"IE11\";\r\n            } else {\r\n                return \"0\";\r\n            } //IE版本过低\r\n        } else if (isEdge) {\r\n            return \"Edge\";\r\n        } else if (isIE11) {\r\n            return \"IE11\";\r\n        } else {\r\n            return \"-1\"; //非IE\r\n        }\r\n    },\r\n    luckysheetrefreshfixednum:null,\r\n    luckysheetrefreshfixed:function(){\r\n        var _this = this;\r\n        if(_this.luckysheetrefreshfixednum==null){\r\n            if(_this.BrowserType()==\"FF\"){\r\n                _this.luckysheetrefreshfixednum = 5;\r\n            }\r\n            else{\r\n                _this.luckysheetrefreshfixednum = 0;\r\n            }\r\n        }\r\n\r\n        return _this.luckysheetrefreshfixednum;\r\n    },\r\n    detectOS() {\r\n        var userAgent = navigator.userAgent;\r\n        var isWin = (navigator.platform == \"Win32\") || (navigator.platform == \"Windows\");\r\n        var isMac = (navigator.platform == \"Mac68K\") || (navigator.platform == \"MacPPC\") || (navigator.platform == \"Macintosh\") || (navigator.platform == \"MacIntel\");\r\n        if (isMac) return \"Mac\";\r\n        var isUnix = (navigator.platform == \"X11\") && !isWin && !isMac;\r\n        if (isUnix) return \"Unix\";\r\n        var isLinux = (String(navigator.platform).indexOf(\"Linux\") > -1);\r\n        if (isLinux) return \"Linux\";\r\n        if (isWin) {\r\n            var isWin2K = userAgent.indexOf(\"Windows NT 5.0\") > -1 || userAgent.indexOf(\"Windows 2000\") > -1;\r\n            if (isWin2K) return \"Win2000\";\r\n            var isWinXP = userAgent.indexOf(\"Windows NT 5.1\") > -1 || userAgent.indexOf(\"Windows XP\") > -1;\r\n            if (isWinXP) return \"WinXP\";\r\n            var isWin2003 = userAgent.indexOf(\"Windows NT 5.2\") > -1 || userAgent.indexOf(\"Windows 2003\") > -1;\r\n            if (isWin2003) return \"Win2003\";\r\n            var isWinVista= userAgent.indexOf(\"Windows NT 6.0\") > -1 || userAgent.indexOf(\"Windows Vista\") > -1;\r\n            if (isWinVista) return \"WinVista\";\r\n            var isWin7 = userAgent.indexOf(\"Windows NT 6.1\") > -1 || userAgent.indexOf(\"Windows 7\") > -1;\r\n            if (isWin7) return \"Win7\";\r\n        }\r\n        return \"other\";\r\n    }\r\n};\r\n\r\nexport default browser;"
  },
  {
    "path": "src/global/cleargridelement.js",
    "content": "import selection from '../controllers/selection';\r\nimport menuButton from '../controllers/menuButton';\r\n\r\nexport default function cleargridelement(event) {\r\n    $(\"#luckysheet-cols-h-hover\").hide();\r\n    $(\"#luckysheet-rightclick-menu\").hide();\r\n\r\n    $(\"#luckysheet-cell-selected-boxs .luckysheet-cell-selected\").hide();\r\n    $(\"#luckysheet-cols-h-selected .luckysheet-cols-h-selected\").hide();\r\n    $(\"#luckysheet-rows-h-selected .luckysheet-rows-h-selected\").hide();\r\n\r\n    $(\"#luckysheet-cell-selected-focus\").hide();\r\n    $(\"#luckysheet-rows-h-hover\").hide();\r\n    $(\"#luckysheet-selection-copy .luckysheet-selection-copy\").hide();\r\n    $(\"#luckysheet-cols-menu-btn\").hide();\r\n    $(\"#luckysheet-row-count-show, #luckysheet-column-count-show\").hide();\r\n    if (!event) {\r\n        selection.clearcopy(event);\r\n    }\r\n    //else{\r\n    //\tselection.clearcopy();\r\n    //}\r\n\r\n    //选区下拉icon隐藏\r\n    if($(\"#luckysheet-dropCell-icon\").is(\":visible\")){\r\n        if(event){\r\n            $(\"#luckysheet-dropCell-icon\").remove();\r\n        }\r\n    }\r\n    //格式刷\r\n    if(menuButton.luckysheetPaintModelOn && !event){\r\n        menuButton.cancelPaintModel();\r\n    }\r\n}"
  },
  {
    "path": "src/global/count.js",
    "content": "import Store from '../store';\r\nimport { getdatabyselectionNoCopy } from './getdata';\r\nimport { isRealNull, isRealNum } from './validate';\r\nimport { update } from './format';\r\nimport locale from '../locale/locale';\r\n\r\n//表格计数栏\r\nexport function countfunc() {\r\n    if(Store.luckysheet_select_save.length == 0){\r\n        return;\r\n    }\r\n\r\n    let min = Infinity,   //最小值\r\n    \tmax = -Infinity,  //最大值\r\n    \tsum = 0,          //求和 \r\n    \tcount = 0,        //计数（非空单元格）\r\n    \tmean = 0;         //平均值\r\n\r\n    for(let s = 0; s < Store.luckysheet_select_save.length; s++){\r\n        let data = getdatabyselectionNoCopy(Store.luckysheet_select_save[s]);\r\n\r\n        for (let r = 0; r < data.length; r++) {\r\n            for (let c = 0; c < data[0].length; c++) {\r\n                if(isRealNull(data[r][c])){\r\n                    continue;\r\n                }\r\n\r\n                count++;\r\n\r\n                if(data[r][c].ct != null && data[r][c].ct.t == \"d\"){\r\n                    continue;\r\n                }\r\n\r\n                let value = data[r][c].v;\r\n\r\n                if(!isRealNum(value)){\r\n                    continue;\r\n                }\r\n\r\n                value = parseFloat(value);\r\n\r\n                sum += value;\r\n\r\n                if(value < min){\r\n                    min = value;\r\n                }\r\n\r\n                if(value > max){\r\n                    max = value;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    let locale_formula = locale().formula;\r\n\r\n    let ret = \"\";\r\n    ret += \"<span>\"+locale_formula.count+\":\" + count + \"</span>\";\r\n\r\n    //处理成亿万格式\r\n    if (isFinite(max) || isFinite(min)) {\r\n        ret += \"<span>\"+locale_formula.sum+\":\" + sum + \"</span>\";\r\n        ret += \"<span>\"+locale_formula.average+\":\" +  Math.round(sum / count * 10000) / 10000 + \"</span>\";\r\n    }\r\n\r\n    if (isFinite(max)) {\r\n        ret += \"<span>\"+locale_formula.max+\":\" +  max + \"</span>\";\r\n    }\r\n\r\n    if (isFinite(min)) {\r\n        ret += \"<span>\"+locale_formula.min+\":\" +  min + \"</span>\";\r\n    }\r\n\r\n    $(\"#luckysheet-sta-content\").html(ret);\r\n}\r\n"
  },
  {
    "path": "src/global/createdom.js",
    "content": "import { \r\n    gridHTML, \r\n    menuToolBar, \r\n    flow, \r\n    columnHeaderHTML,\r\n    maskHTML,\r\n    colsmenuHTML,\r\n    rightclickHTML,\r\n    inputHTML,\r\n    filtermenuHTML,\r\n    filtersubmenuHTML,\r\n    sheetconfigHTML,\r\n} from '../controllers/constant';\r\nimport luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';\r\nimport luckysheetPostil from '../controllers/postil';\r\nimport { datagridgrowth } from './getdata';\r\nimport editor from './editor';\r\nimport rhchInit from './rhchInit';\r\nimport { replaceHtml } from '../utils/util';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\n\r\nexport default function luckysheetcreatedom(colwidth, rowheight, data, menu, title) {\r\n    // //最少30行\r\n    // if(rowheight < 30){\r\n    //     rowheight = 30;\r\n    // }\r\n\r\n    // //最少22列\r\n    // if(colwidth < 22){\r\n    //     colwidth = 22;\r\n    // }\r\n\r\n    let gh = gridHTML();\r\n    gh = replaceHtml(gh, { \"logotitle\": title });//设置title\r\n    gh = replaceHtml(gh, { \"menu\": menuToolBar() });//设置需要显示的菜单\r\n\r\n    // if (data.length == 0) {\r\n    //     Store.flowdata = datagridgrowth(data, rowheight, colwidth);\r\n    // }\r\n    // else if (data.length < rowheight && data[0].length < colwidth) {\r\n    //     Store.flowdata = datagridgrowth(data, rowheight - data.length, colwidth - data[0].length);\r\n    // }\r\n    // else if (data.length < rowheight) {\r\n    //     Store.flowdata = datagridgrowth(data, rowheight - data.length, 0);\r\n    // }\r\n    // else if (data[0].length < colwidth) {\r\n    //     Store.flowdata = datagridgrowth(data, 0, colwidth - data[0].length);\r\n    // }\r\n    // else {\r\n    //     Store.flowdata = data;\r\n    // }\r\n    \r\n    let flowHTML = flow;\r\n    if(Store.config == null){\r\n        Store.config = {};\r\n    }\r\n\r\n    rhchInit(rowheight, colwidth);\r\n\r\n    const _locale = locale();\r\n    const locale_info = _locale.info;\r\n\r\n    let addControll = '<button id=\"luckysheet-bottom-add-row\" class=\"btn btn-default\">'+locale_info.add+'</button><input id=\"luckysheet-bottom-add-row-input\" type=\"text\" class=\"luckysheet-datavisual-config-input luckysheet-mousedown-cancel\" placeholder=\"'+(luckysheetConfigsetting.addRowCount || 100)+'\"><span style=\"font-size: 14px;\">'+ locale_info.row +'</span><span style=\"font-size: 14px;color: #9c9c9c;\">('+locale_info.addLast+')</span>';\r\n    let backControll = ' <button id=\"luckysheet-bottom-bottom-top\" class=\"btn btn-default\" style=\"\">'+ locale_info.backTop +'</button>';\r\n    // let pageControll = ' <span id=\"luckysheet-bottom-page-info\" style=\"font-size: 14px;color: #f34141;\">共'+ luckysheetConfigsetting.pageInfo.totalPage +'页，当前已显示'+ (luckysheetConfigsetting.pageInfo.currentPage) +'页，每页'+ luckysheetConfigsetting.pageInfo.pageSize +'条</span> <button id=\"luckysheet-bottom-page-next\" class=\"btn btn-danger\" style=\"\">下一页</button>';\r\n    let pageInfo = replaceHtml(locale_info.pageInfo,{\r\n        total:luckysheetConfigsetting.total?luckysheetConfigsetting.total:\"\",\r\n        totalPage:luckysheetConfigsetting.pageInfo.totalPage?luckysheetConfigsetting.pageInfo.totalPage:\"\",\r\n        currentPage:luckysheetConfigsetting.pageInfo.currentPage?luckysheetConfigsetting.pageInfo.currentPage:\"\",\r\n    });\r\n    let pageControll = ' <span id=\"luckysheet-bottom-page-info\" style=\"font-size: 14px;color: #f34141;\">'+ pageInfo +'</span> <button id=\"luckysheet-bottom-page-next\" class=\"btn btn-danger\" style=\"\">下一页</button>';\r\n    let pageControll2 = ' <span id=\"luckysheet-bottom-page-info\" style=\"font-size: 14px;color: #f34141;\">'+pageInfo+'</span>';\r\n\r\n    let bottomControll = \"\";\r\n    if(luckysheetConfigsetting.enableAddRow){\r\n        bottomControll += addControll;\r\n    }\r\n\r\n    if(luckysheetConfigsetting.enablePage){\r\n        if(parseInt(luckysheetConfigsetting.pageInfo.totalPage) == 1){\r\n            bottomControll += pageControll2;\r\n        }\r\n        else{\r\n            bottomControll += pageControll;\r\n        }\r\n    }\r\n\r\n    if(luckysheetConfigsetting.enableAddBackTop){\r\n        bottomControll += backControll;\r\n    }\r\n\r\n    let flowstr = replaceHtml('<div id=\"luckysheetcoltable_0\" class=\"luckysheet-cell-flow-col\"> <div id =\"luckysheet-sheettable_0\" class=\"luckysheet-cell-sheettable\" style=\"height:${height}px;width:${width}px;\"></div><div id=\"luckysheet-bottom-controll-row\" class=\"luckysheet-bottom-controll-row\"> '+ bottomControll +' </div> </div>', { \"height\": Store.rh_height, \"width\": Store.ch_width - 1 });\r\n\r\n    let colsheader = replaceHtml(columnHeaderHTML, { \"width\": Store.ch_width, \"index\": 0, \"column\": \"\" });\r\n\r\n    flowHTML = replaceHtml(flowHTML, { \"width\": Store.ch_width, \"flow\": flowstr, \"index\": 0 });\r\n\r\n    gh = replaceHtml(gh, { \"flow\": flowHTML, \"rowHeader\": \"<div style='height:\" + Store.rh_height + \"px' id='luckysheetrowHeader_0' class='luckysheetsheetchange'></div>\", \"columnHeader\": colsheader, \"functionButton\": luckysheetConfigsetting.functionButton });//设置需要显示的菜单\r\n\r\n    $(\"#\" + Store.container).append(gh);\r\n\r\n    $(\"#luckysheet-scrollbar-x div\").width(Store.ch_width);\r\n    $(\"#luckysheet-scrollbar-y div\").height(Store.rh_height + Store.columnHeaderHeight - Store.cellMainSrollBarSize - 3);\r\n\r\n    //新建行菜单\r\n    $(\"body\").append(maskHTML);\r\n    $(\"body\").append(colsmenuHTML);\r\n    $(\"body\").append(rightclickHTML());\r\n    $(\"body\").append(inputHTML);\r\n    $(\"body\").append(replaceHtml(filtermenuHTML(), { \"menuid\": \"filter\" }));\r\n    $(\"body\").append(replaceHtml(filtersubmenuHTML(), { \"menuid\": \"filter\" }));\r\n    $(\"body\").append(sheetconfigHTML());\r\n\r\n    $(\"#luckysheet-rows-h\").width((Store.rowHeaderWidth-1.5));\r\n    $(\"#luckysheet-cols-h-c\").height((Store.columnHeaderHeight-1.5));\r\n    $(\"#luckysheet-left-top\").css({width:Store.rowHeaderWidth-1.5, height:Store.columnHeaderHeight-1.5});\r\n\r\n    // //批注\r\n    // luckysheetPostil.buildAllPs(Store.flowdata);\r\n\r\n    $(\"#luckysheet_info_detail_input\").val(luckysheetConfigsetting.title);\r\n}"
  },
  {
    "path": "src/global/createsheet.js",
    "content": "import { datagridgrowth } from './getdata';\r\nimport editor from './editor';\r\nimport rhchInit from './rhchInit';\r\nimport formula from './formula';\r\nimport { luckysheetrefreshgrid } from './refresh';\r\nimport sheetmanage from '../controllers/sheetmanage';\r\nimport Store from '../store';\r\n\r\nexport default function luckysheetcreatesheet(colwidth, rowheight, data, cfg, active) {\r\n    if(active == null){\r\n        active = true;\r\n    }\r\n\r\n    Store.visibledatarow = [];\r\n    Store.visibledatacolumn = [];\r\n    Store.ch_width = 0;\r\n    Store.rh_height = 0;\r\n    Store.zoomRatio = 1;\r\n\r\n    if(cfg != null){\r\n        Store.config = cfg;\r\n    }\r\n    else{\r\n        Store.config = {};\r\n    }\r\n\r\n    if (data.length == 0) {\r\n        Store.flowdata = datagridgrowth(data, rowheight, colwidth);\r\n    }\r\n    else if (data.length < rowheight && data[0].length < colwidth) {\r\n        Store.flowdata = datagridgrowth(data, rowheight - data.length, colwidth - data[0].length);\r\n    }\r\n    else if (data.length < rowheight) {\r\n        Store.flowdata = datagridgrowth(data, rowheight - data.length, 0);\r\n    }\r\n    else if (data[0].length < colwidth) {\r\n        Store.flowdata = datagridgrowth(data, 0, colwidth - data[0].length);\r\n    }\r\n    else {\r\n        Store.flowdata = data;\r\n    }\r\n\r\n    editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n\r\n    rhchInit(rowheight, colwidth);\r\n\r\n    if(active){\r\n        sheetmanage.showSheet();\r\n\r\n        setTimeout(function () {\r\n            sheetmanage.restoreCache();\r\n            formula.execFunctionGroup();\r\n            sheetmanage.restoreSheetAll(Store.currentSheetIndex);\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n}\r\n"
  },
  {
    "path": "src/global/cursorPos.js",
    "content": "import Store from '../store';\r\n\r\nfunction luckysheetRangeLast(obj) {\r\n    let range;\r\n    \r\n    if(document.createRange){ //chrome, firefox, opera, safari, ie9+\r\n        if(obj.innerHTML != obj.innerText || obj.innerHTML == \"\"){\r\n            obj.focus(); //解决ff不获取焦点无法定位问题\r\n            range = window.getSelection();//创建range\r\n            range.selectAllChildren(obj);//range 选择obj下所有子内容\r\n            range.collapseToEnd();//光标移至最后\r\n        }\r\n        else{\r\n            let len = obj.innerText.length;\r\n\r\n            range = document.createRange();\r\n            range.selectNodeContents(obj);\r\n            range.setStart(obj.childNodes[0], len);\r\n            range.collapse(true);\r\n\r\n            let selection = window.getSelection();\r\n            selection.removeAllRanges();\r\n            selection.addRange(range);    \r\n        }\r\n    }\r\n    else if(document.selection){ //ie8 and lower\r\n        range = document.body.createTextRange();\r\n        range.moveToElementText(obj);\r\n        range.collapse(false);\r\n        range.select();\r\n    }\r\n}\r\n\r\nfunction getCursortPosition(textDom){\r\n    let cursorPos = 0;\r\n    \r\n    if(document.selection){\r\n        textDom.focus();\r\n        let selectRange = document.selection.createRange();\r\n        selectRange.moveStart(\"character\", -textDom.value.length);\r\n        cursorPos = selectRange.text.length;\r\n    }\r\n    else if(textDom.selectionStart || textDom.selectionStart == \"0\"){\r\n        cursorPos = textDom.selectionStart;\r\n    }\r\n\r\n    return cursorPos;\r\n}\r\n\r\nfunction hideMenuByCancel(event){\r\n\r\n    // Right-click the menu in the title bar, and click on the elements whose class is luckysheet-cols-rows-shift-left and luckysheet-cols-rows-shift-right will trigger the hiding of the menu bar. It should be prohibited. Exclude these two elements. There may be more Other elements will also jump here for more testing\r\n\r\n    if(event.target.classList && (event.target.classList.contains('luckysheet-cols-rows-shift-left') || event.target.classList.contains('luckysheet-cols-rows-shift-right'))){\r\n        return;\r\n    }\r\n\r\n    if (!$(event.target).hasClass(\"luckysheet-mousedown-cancel\") && $(event.target).filter(\"[class*='sp-palette']\").length == 0 && $(event.target).filter(\"[class*='sp-thumb']\").length == 0 && $(event.target).filter(\"[class*='sp-']\").length == 0) {\r\n        $(\"#luckysheet-rightclick-menu\").hide();\r\n        $(\"#luckysheet-cols-h-hover\").hide();\r\n        $(\"#luckysheet-cols-menu-btn\").hide();\r\n        // $(\"#luckysheet-rightclick-menu\").hide();\r\n        $(\"#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu, #luckysheet-user-menu\").hide();\r\n        $(\"body > .luckysheet-filter-menu, body > .luckysheet-filter-submenu, body > .luckysheet-cols-menu\").hide();\r\n        //$(\"body > luckysheet-menuButton\").hide();\r\n        Store.luckysheet_cols_menu_status = false;\r\n    }\r\n}\r\n\r\nfunction selectTextDom(ele){\r\n    if (window.getSelection) {\r\n        let range = document.createRange();\r\n        range.selectNodeContents(ele);\r\n        if(range.startContainer && isInPage(range.startContainer)){\r\n            window.getSelection().removeAllRanges();\r\n            window.getSelection().addRange(range);\r\n        }\r\n    }\r\n    else if (document.selection) {\r\n        let range = document.body.createTextRange();\r\n        range.moveToElementText(ele);\r\n        range.select();\r\n    } \r\n}\r\n\r\nfunction selectTextContent(ele){\r\n    if (window.getSelection) {\r\n        let range = document.createRange();\r\n        var content=ele.firstChild;\r\n        range.setStart(content,0);\r\n        range.setEnd(content,content.length);\r\n        if(range.startContainer && isInPage(range.startContainer)){\r\n            window.getSelection().removeAllRanges();\r\n            window.getSelection().addRange(range);\r\n        }\r\n    }\r\n    else if (document.selection) {\r\n        let range = document.body.createTextRange();\r\n        range.moveToElementText(ele);\r\n        range.select();\r\n    } \r\n}\r\n\r\nfunction selectTextContentCross(sEle, eEle){\r\n    if (window.getSelection) {\r\n        let range = document.createRange();\r\n        var sContent=sEle.firstChild, eContent=eEle.firstChild;\r\n        range.setStart(sContent,0);\r\n        range.setEnd(eContent,eContent.length);\r\n        if(range.startContainer && isInPage(range.startContainer)){\r\n            window.getSelection().removeAllRanges();\r\n            window.getSelection().addRange(range);\r\n        }\r\n    }\r\n}\r\n\r\nfunction selectTextContentCollapse(sEle, index){\r\n    if (window.getSelection) {\r\n        let range = document.createRange();\r\n        var sContent=sEle.firstChild;\r\n        if(index>sContent.length){\r\n            index=sContent.length;\r\n        }\r\n        else if(index<0){\r\n            index = 0;\r\n        }\r\n        range.setStart(sContent,index);\r\n        range.collapse(true);\r\n        if(range.startContainer && isInPage(range.startContainer)){\r\n            window.getSelection().removeAllRanges();\r\n            window.getSelection().addRange(range);\r\n        }\r\n\r\n    }\r\n}\r\n\r\nfunction isInPage(node) {\r\n    return (node === document.body) ? false : document.body.contains(node);\r\n}\r\n\r\nexport {\r\n    luckysheetRangeLast,\r\n    getCursortPosition,\r\n    hideMenuByCancel,\r\n    selectTextContent,\r\n    selectTextDom,\r\n    selectTextContentCross,\r\n    selectTextContentCollapse\r\n}"
  },
  {
    "path": "src/global/datecontroll.js",
    "content": "import { hasChinaword } from './validate';\r\nimport dayjs from 'dayjs'\r\n\r\nfunction isdatetime(s) {\r\n    if (s == null || s.toString().length < 5) {\r\n        return false;\r\n    }\r\n    else if(checkDateTime(s)){\r\n        return true;\r\n    }\r\n    else {\r\n        return false;\r\n    }\r\n\r\n    function checkDateTime(str){\r\n        var reg1 = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})(\\s(\\d{1,2}):(\\d{1,2})(:(\\d{1,2}))?)?$/;\r\n        var reg2 = /^(\\d{4})\\/(\\d{1,2})\\/(\\d{1,2})(\\s(\\d{1,2}):(\\d{1,2})(:(\\d{1,2}))?)?$/;\r\n\r\n        if(!reg1.test(str) && !reg2.test(str)){\r\n            return false;\r\n        }\r\n\r\n        var year = RegExp.$1,\r\n            month = RegExp.$2,\r\n            day = RegExp.$3;\r\n\r\n        if(year < 1900){\r\n            return false;\r\n        }\r\n\r\n        if(month > 12){\r\n            return false;\r\n        }\r\n\r\n        if(day > 31){\r\n            return false;\r\n        }\r\n\r\n        if(month == 2){\r\n            if(new Date(year, 1, 29).getDate() == 29 && day > 29){\r\n                return false;\r\n            }\r\n            else if(new Date(year, 1, 29).getDate() != 29 && day > 28){\r\n                return false;\r\n            }\r\n        }\r\n\r\n        return true;\r\n    }\r\n}\r\n\r\nfunction diff(now, then) {\r\n    return dayjs(now).diff(dayjs(then));\r\n}\r\n\r\nfunction isdatatypemulti(s) {\r\n    let type = {};\r\n\r\n    if (isdatetime(s)) {\r\n        type[\"date\"] = true;\r\n    }\r\n\r\n    if (!isNaN(parseFloat(s)) && !hasChinaword(s)) {\r\n        type[\"num\"] = true;\r\n    }\r\n\r\n    return type;\r\n}\r\n\r\nfunction isdatatype(s) {\r\n    let type = \"string\";\r\n\r\n    if (isdatetime(s)) {\r\n        type = \"date\";\r\n    }\r\n    else if (!isNaN(parseFloat(s)) && !hasChinaword(s)) {\r\n        type = \"num\";\r\n    }\r\n\r\n    return type;\r\n}\r\n\r\nexport {\r\n    isdatetime,\r\n    diff,\r\n    isdatatypemulti,\r\n    isdatatype,\r\n}\r\n"
  },
  {
    "path": "src/global/draw.js",
    "content": "import pivotTable from \"../controllers/pivotTable\";\r\nimport conditionformat from \"../controllers/conditionformat\";\r\nimport alternateformat from \"../controllers/alternateformat\";\r\nimport luckysheetSparkline from \"../controllers/sparkline\";\r\nimport menuButton from \"../controllers/menuButton\";\r\nimport dataVerificationCtrl from \"../controllers/dataVerificationCtrl\";\r\nimport { luckysheetdefaultstyle, luckysheet_CFiconsImg, luckysheetdefaultFont } from \"../controllers/constant\";\r\nimport { luckysheet_searcharray } from \"../controllers/sheetSearch\";\r\nimport { dynamicArrayCompute } from \"./dynamicArray\";\r\nimport browser from \"./browser\";\r\nimport { isRealNull, isRealNum } from \"./validate\";\r\nimport { getMeasureText, getCellTextInfo } from \"./getRowlen\";\r\nimport { getRealCellValue } from \"./getdata\";\r\nimport { getBorderInfoComputeRange } from \"./border\";\r\nimport { getSheetIndex } from \"../methods/get\";\r\nimport { getObjType, chatatABC, luckysheetfontformat } from \"../utils/util\";\r\nimport { isInlineStringCell } from \"../controllers/inlineString\";\r\nimport method from \"./method\";\r\nimport Store from \"../store\";\r\nimport locale from \"../locale/locale\";\r\nimport sheetmanage from \"../controllers/sheetmanage\";\r\n\r\nfunction luckysheetDrawgridRowTitle(scrollHeight, drawHeight, offsetTop) {\r\n    if (scrollHeight == null) {\r\n        scrollHeight = $(\"#luckysheet-cell-main\").scrollTop();\r\n    }\r\n\r\n    if (drawHeight == null) {\r\n        drawHeight = Store.luckysheetTableContentHW[1];\r\n    }\r\n\r\n    if (offsetTop == null) {\r\n        offsetTop = Store.columnHeaderHeight;\r\n    }\r\n\r\n    let luckysheetTableContent = $(\"#luckysheetTableContent\")\r\n        .get(0)\r\n        .getContext(\"2d\");\r\n    luckysheetTableContent.save();\r\n    luckysheetTableContent.scale(Store.devicePixelRatio, Store.devicePixelRatio);\r\n\r\n    luckysheetTableContent.clearRect(0, offsetTop, Store.rowHeaderWidth - 1, drawHeight);\r\n\r\n    luckysheetTableContent.font = luckysheetdefaultFont();\r\n    luckysheetTableContent.textBaseline = luckysheetdefaultstyle.textBaseline; //基准线 垂直居中\r\n    luckysheetTableContent.fillStyle = luckysheetdefaultstyle.fillStyle;\r\n\r\n    let dataset_row_st, dataset_row_ed;\r\n    dataset_row_st = luckysheet_searcharray(Store.visibledatarow, scrollHeight);\r\n    dataset_row_ed = luckysheet_searcharray(Store.visibledatarow, scrollHeight + drawHeight);\r\n\r\n    if (dataset_row_st == -1) {\r\n        dataset_row_st = 0;\r\n    }\r\n    if (dataset_row_ed == -1) {\r\n        dataset_row_ed = Store.visibledatarow.length - 1;\r\n    }\r\n\r\n    luckysheetTableContent.save();\r\n    luckysheetTableContent.beginPath();\r\n    luckysheetTableContent.rect(0, offsetTop - 1, Store.rowHeaderWidth - 1, drawHeight - 2);\r\n    luckysheetTableContent.clip();\r\n\r\n    let end_r, start_r;\r\n    let bodrder05 = 0.5; //Default 0.5\r\n    let preEndR;\r\n    for (let r = dataset_row_st; r <= dataset_row_ed; r++) {\r\n        if (r == 0) {\r\n            start_r = -scrollHeight - 1;\r\n        } else {\r\n            start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;\r\n        }\r\n        end_r = Store.visibledatarow[r] - scrollHeight;\r\n\r\n        //若超出绘制区域终止\r\n        // if(end_r > scrollHeight + drawHeight){\r\n        //     break;\r\n        // }\r\n        let firstOffset = dataset_row_st == r ? -2 : 0;\r\n        let lastOffset = dataset_row_ed == r ? -2 : 0;\r\n        //列标题单元格渲染前触发，return false 则不渲染该单元格\r\n        if (\r\n            !method.createHookFunction(\r\n                \"rowTitleCellRenderBefore\",\r\n                r + 1,\r\n                {\r\n                    r: r,\r\n                    top: start_r + offsetTop + firstOffset,\r\n                    width: Store.rowHeaderWidth - 1,\r\n                    height: end_r - start_r + 1 + lastOffset - firstOffset,\r\n                },\r\n                luckysheetTableContent,\r\n            )\r\n        ) {\r\n            continue;\r\n        }\r\n\r\n        if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n        } else {\r\n            luckysheetTableContent.fillStyle = \"#ffffff\";\r\n            luckysheetTableContent.fillRect(\r\n                0,\r\n                start_r + offsetTop + firstOffset,\r\n                Store.rowHeaderWidth - 1,\r\n                end_r - start_r + 1 + lastOffset - firstOffset,\r\n            );\r\n            luckysheetTableContent.fillStyle = \"#000000\";\r\n\r\n            //行标题栏序列号\r\n            luckysheetTableContent.save(); //save scale before draw text\r\n            luckysheetTableContent.scale(Store.zoomRatio, Store.zoomRatio);\r\n            let textMetrics = getMeasureText(r + 1, luckysheetTableContent);\r\n            //luckysheetTableContent.measureText(r + 1);\r\n\r\n            let horizonAlignPos = (Store.rowHeaderWidth - textMetrics.width) / 2;\r\n            let verticalAlignPos = start_r + (end_r - start_r) / 2 + offsetTop;\r\n\r\n            luckysheetTableContent.fillText(\r\n                r + 1,\r\n                horizonAlignPos / Store.zoomRatio,\r\n                verticalAlignPos / Store.zoomRatio,\r\n            );\r\n            luckysheetTableContent.restore(); //restore scale after draw text\r\n        }\r\n\r\n        //vertical\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(Store.rowHeaderWidth - 2 + bodrder05, start_r + offsetTop - 2);\r\n        luckysheetTableContent.lineTo(Store.rowHeaderWidth - 2 + bodrder05, end_r + offsetTop - 2);\r\n        luckysheetTableContent.lineWidth = 1;\r\n\r\n        luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n        luckysheetTableContent.stroke();\r\n        luckysheetTableContent.closePath();\r\n\r\n        //行标题栏横线,horizen\r\n        if (\r\n            Store.config[\"rowhidden\"] != null &&\r\n            Store.config[\"rowhidden\"][r] == null &&\r\n            Store.config[\"rowhidden\"][r + 1] != null\r\n        ) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(-1, end_r + offsetTop - 4 + bodrder05);\r\n            luckysheetTableContent.lineTo(Store.rowHeaderWidth - 1, end_r + offsetTop - 4 + bodrder05);\r\n            // luckysheetTableContent.lineWidth = 1;\r\n            // luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.closePath();\r\n            luckysheetTableContent.stroke();\r\n        } else if (Store.config[\"rowhidden\"] == null || Store.config[\"rowhidden\"][r] == null) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(-1, end_r + offsetTop - 2 + bodrder05);\r\n            luckysheetTableContent.lineTo(Store.rowHeaderWidth - 1, end_r + offsetTop - 2 + bodrder05);\r\n\r\n            // luckysheetTableContent.lineWidth = 1;\r\n            // luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.closePath();\r\n            luckysheetTableContent.stroke();\r\n        }\r\n\r\n        if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r - 1] != null && preEndR != null) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(-1, preEndR + offsetTop + bodrder05);\r\n            luckysheetTableContent.lineTo(Store.rowHeaderWidth - 1, preEndR + offsetTop + bodrder05);\r\n            luckysheetTableContent.closePath();\r\n            luckysheetTableContent.stroke();\r\n        }\r\n\r\n        preEndR = end_r;\r\n\r\n        //列标题单元格渲染前触发，return false 则不渲染该单元格\r\n        method.createHookFunction(\r\n            \"rowTitleCellRenderAfter\",\r\n            r + 1,\r\n            {\r\n                r: r,\r\n                top: start_r + offsetTop + firstOffset,\r\n                width: Store.rowHeaderWidth - 1,\r\n                height: end_r - start_r + 1 + lastOffset - firstOffset,\r\n            },\r\n            luckysheetTableContent,\r\n        );\r\n    }\r\n\r\n    //行标题栏竖线\r\n    // luckysheetTableContent.beginPath();\r\n    // luckysheetTableContent.moveTo(\r\n    //     (Store.rowHeaderWidth - 2 + 0.5) ,\r\n    //     (offsetTop - 1)\r\n    // );\r\n    // luckysheetTableContent.lineTo(\r\n    //     (Store.rowHeaderWidth - 2 + 0.5) ,\r\n    //     (Store.rh_height + offsetTop)\r\n    // );\r\n    // luckysheetTableContent.lineWidth = 1;\r\n    // luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n    // luckysheetTableContent.closePath();\r\n    // luckysheetTableContent.stroke();\r\n\r\n    //清除canvas左上角区域 防止列标题栏序列号溢出显示\r\n    // luckysheetTableContent.clearRect(0, 0, Store.rowHeaderWidth , Store.columnHeaderHeight );\r\n\r\n    // Must be restored twice, otherwise it will be enlarged under window.devicePixelRatio = 1.5\r\n    luckysheetTableContent.restore();\r\n    luckysheetTableContent.restore();\r\n}\r\n\r\nfunction luckysheetDrawgridColumnTitle(scrollWidth, drawWidth, offsetLeft) {\r\n    if (scrollWidth == null) {\r\n        scrollWidth = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    }\r\n\r\n    if (drawWidth == null) {\r\n        drawWidth = Store.luckysheetTableContentHW[0];\r\n    }\r\n\r\n    if (offsetLeft == null) {\r\n        offsetLeft = Store.rowHeaderWidth;\r\n    }\r\n\r\n    let luckysheetTableContent = $(\"#luckysheetTableContent\")\r\n        .get(0)\r\n        .getContext(\"2d\");\r\n    luckysheetTableContent.save();\r\n    luckysheetTableContent.scale(Store.devicePixelRatio, Store.devicePixelRatio);\r\n    luckysheetTableContent.clearRect(offsetLeft, 0, drawWidth, Store.columnHeaderHeight - 1);\r\n\r\n    luckysheetTableContent.font = luckysheetdefaultFont();\r\n    luckysheetTableContent.textBaseline = luckysheetdefaultstyle.textBaseline; //基准线 垂直居中\r\n    luckysheetTableContent.fillStyle = luckysheetdefaultstyle.fillStyle;\r\n\r\n    let dataset_col_st, dataset_col_ed;\r\n    dataset_col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth);\r\n    dataset_col_ed = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth + drawWidth);\r\n\r\n    if (dataset_col_st == -1) {\r\n        dataset_col_st = 0;\r\n    }\r\n    if (dataset_col_ed == -1) {\r\n        dataset_col_ed = Store.visibledatacolumn.length - 1;\r\n    }\r\n\r\n    luckysheetTableContent.save();\r\n    luckysheetTableContent.beginPath();\r\n    luckysheetTableContent.rect(offsetLeft - 1, 0, drawWidth, Store.columnHeaderHeight - 1);\r\n    luckysheetTableContent.clip();\r\n\r\n    // console.log(offsetLeft, 0, drawWidth, Store.columnHeaderHeight -1);\r\n\r\n    let end_c, start_c;\r\n    let bodrder05 = 0.5; //Default 0.5\r\n    let preEndC;\r\n    for (let c = dataset_col_st; c <= dataset_col_ed; c++) {\r\n        if (c == 0) {\r\n            start_c = -scrollWidth;\r\n        } else {\r\n            start_c = Store.visibledatacolumn[c - 1] - scrollWidth;\r\n        }\r\n        end_c = Store.visibledatacolumn[c] - scrollWidth;\r\n\r\n        //若超出绘制区域终止\r\n        // if(end_c > scrollWidth + drawWidth+1){\r\n        //     break;\r\n        // }\r\n        let abc = chatatABC(c);\r\n        //列标题单元格渲染前触发，return false 则不渲染该单元格\r\n        if (\r\n            !method.createHookFunction(\r\n                \"columnTitleCellRenderBefore\",\r\n                abc,\r\n                {\r\n                    c: c,\r\n                    left: start_c + offsetLeft - 1,\r\n                    width: end_c - start_c,\r\n                    height: Store.columnHeaderHeight - 1,\r\n                },\r\n                luckysheetTableContent,\r\n            )\r\n        ) {\r\n            continue;\r\n        }\r\n\r\n        if (Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c] != null) {\r\n        } else {\r\n            luckysheetTableContent.fillStyle = \"#ffffff\";\r\n            luckysheetTableContent.fillRect(start_c + offsetLeft - 1, 0, end_c - start_c, Store.columnHeaderHeight - 1);\r\n            luckysheetTableContent.fillStyle = \"#000000\";\r\n\r\n            //列标题栏序列号\r\n            luckysheetTableContent.save(); //save scale before draw text\r\n            luckysheetTableContent.scale(Store.zoomRatio, Store.zoomRatio);\r\n\r\n            let textMetrics = getMeasureText(abc, luckysheetTableContent);\r\n            //luckysheetTableContent.measureText(abc);\r\n\r\n            let horizonAlignPos = Math.round(start_c + (end_c - start_c) / 2 + offsetLeft - textMetrics.width / 2);\r\n            let verticalAlignPos = Math.round(Store.columnHeaderHeight / 2);\r\n\r\n            luckysheetTableContent.fillText(abc, horizonAlignPos / Store.zoomRatio, verticalAlignPos / Store.zoomRatio);\r\n            luckysheetTableContent.restore(); //restore scale after draw text\r\n        }\r\n\r\n        //列标题栏竖线 vertical\r\n        if (\r\n            Store.config[\"colhidden\"] != null &&\r\n            Store.config[\"colhidden\"][c] == null &&\r\n            Store.config[\"colhidden\"][c + 1] != null\r\n        ) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(end_c + offsetLeft - 4 + bodrder05, 0);\r\n            luckysheetTableContent.lineTo(end_c + offsetLeft - 4 + bodrder05, Store.columnHeaderHeight - 2);\r\n            luckysheetTableContent.lineWidth = 1;\r\n            luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.closePath();\r\n            luckysheetTableContent.stroke();\r\n        } else if (Store.config[\"colhidden\"] == null || Store.config[\"colhidden\"][c] == null) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(end_c + offsetLeft - 2 + bodrder05, 0);\r\n            luckysheetTableContent.lineTo(end_c + offsetLeft - 2 + bodrder05, Store.columnHeaderHeight - 2);\r\n\r\n            luckysheetTableContent.lineWidth = 1;\r\n            luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.closePath();\r\n            luckysheetTableContent.stroke();\r\n        }\r\n\r\n        if (Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c - 1] != null && preEndC != null) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(preEndC + offsetLeft + bodrder05, 0);\r\n            luckysheetTableContent.lineTo(preEndC + offsetLeft + bodrder05, Store.columnHeaderHeight - 2);\r\n            // luckysheetTableContent.lineWidth = 1;\r\n            // luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.closePath();\r\n            luckysheetTableContent.stroke();\r\n        }\r\n\r\n        //horizen\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(start_c + offsetLeft - 1, Store.columnHeaderHeight - 2 + bodrder05);\r\n        luckysheetTableContent.lineTo(end_c + offsetLeft - 1, Store.columnHeaderHeight - 2 + bodrder05);\r\n        // luckysheetTableContent.lineWidth = 1;\r\n\r\n        // luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n        luckysheetTableContent.stroke();\r\n        luckysheetTableContent.closePath();\r\n\r\n        preEndC = end_c;\r\n\r\n        method.createHookFunction(\r\n            \"columnTitleCellRenderAfter\",\r\n            abc,\r\n            {\r\n                c: c,\r\n                left: start_c + offsetLeft - 1,\r\n                width: end_c - start_c,\r\n                height: Store.columnHeaderHeight - 1,\r\n            },\r\n            luckysheetTableContent,\r\n        );\r\n    }\r\n\r\n    //列标题栏横线\r\n    // luckysheetTableContent.beginPath();\r\n    // luckysheetTableContent.moveTo(\r\n    //     (offsetLeft - 1) ,\r\n    //     (Store.columnHeaderHeight - 2 + 0.5)\r\n    // );\r\n    // luckysheetTableContent.lineTo(\r\n    //     (Store.ch_width + offsetLeft - 2) ,\r\n    //     (Store.columnHeaderHeight - 2 + 0.5)\r\n    // );\r\n    // luckysheetTableContent.lineWidth = 1;\r\n    // luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n    // luckysheetTableContent.closePath();\r\n    // luckysheetTableContent.stroke();\r\n\r\n    //清除canvas左上角区域 防止列标题栏序列号溢出显示\r\n    // luckysheetTableContent.clearRect(0, 0, Store.rowHeaderWidth , Store.columnHeaderHeight );\r\n\r\n    // Must be restored twice, otherwise it will be enlarged under window.devicePixelRatio = 1.5\r\n    luckysheetTableContent.restore();\r\n    luckysheetTableContent.restore();\r\n}\r\n\r\nfunction luckysheetDrawMain(\r\n    scrollWidth,\r\n    scrollHeight,\r\n    drawWidth,\r\n    drawHeight,\r\n    offsetLeft,\r\n    offsetTop,\r\n    columnOffsetCell,\r\n    rowOffsetCell,\r\n    mycanvas,\r\n) {\r\n    if (Store.flowdata == null) {\r\n        return;\r\n    }\r\n\r\n    let sheetFile = sheetmanage.getSheetByIndex();\r\n\r\n    // console.trace();\r\n    clearTimeout(Store.measureTextCacheTimeOut);\r\n\r\n    //参数未定义处理\r\n    if (scrollWidth == null) {\r\n        scrollWidth = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    }\r\n    if (scrollHeight == null) {\r\n        scrollHeight = $(\"#luckysheet-cell-main\").scrollTop();\r\n    }\r\n\r\n    if (drawWidth == null) {\r\n        drawWidth = Store.luckysheetTableContentHW[0];\r\n    }\r\n    if (drawHeight == null) {\r\n        drawHeight = Store.luckysheetTableContentHW[1];\r\n    }\r\n\r\n    if (offsetLeft == null) {\r\n        offsetLeft = Store.rowHeaderWidth;\r\n    }\r\n    if (offsetTop == null) {\r\n        offsetTop = Store.columnHeaderHeight;\r\n    }\r\n\r\n    if (columnOffsetCell == null) {\r\n        columnOffsetCell = 0;\r\n    }\r\n    if (rowOffsetCell == null) {\r\n        rowOffsetCell = 0;\r\n    }\r\n\r\n    //表格canvas\r\n    let luckysheetTableContent = null;\r\n    if (mycanvas == null) {\r\n        luckysheetTableContent = $(\"#luckysheetTableContent\")\r\n            .get(0)\r\n            .getContext(\"2d\");\r\n    } else {\r\n        if (getObjType(mycanvas) == \"object\") {\r\n            try {\r\n                luckysheetTableContent = mycanvas.get(0).getContext(\"2d\");\r\n            } catch (err) {\r\n                luckysheetTableContent = mycanvas;\r\n            }\r\n        } else {\r\n            luckysheetTableContent = $(\"#\" + mycanvas)\r\n                .get(0)\r\n                .getContext(\"2d\");\r\n        }\r\n    }\r\n\r\n    luckysheetTableContent.save();\r\n    luckysheetTableContent.scale(Store.devicePixelRatio, Store.devicePixelRatio);\r\n\r\n    luckysheetTableContent.clearRect(0, 0, Store.luckysheetTableContentHW[0], Store.luckysheetTableContentHW[1]);\r\n\r\n    //表格渲染区域 起止行列下标\r\n    let dataset_row_st, dataset_row_ed, dataset_col_st, dataset_col_ed;\r\n\r\n    dataset_row_st = luckysheet_searcharray(Store.visibledatarow, scrollHeight);\r\n    dataset_row_ed = luckysheet_searcharray(Store.visibledatarow, scrollHeight + drawHeight);\r\n\r\n    if (dataset_row_st == -1) {\r\n        dataset_row_st = 0;\r\n    }\r\n\r\n    dataset_row_st += rowOffsetCell;\r\n\r\n    if (dataset_row_ed == -1) {\r\n        dataset_row_ed = Store.visibledatarow.length - 1;\r\n    }\r\n\r\n    dataset_row_ed += rowOffsetCell;\r\n\r\n    if (dataset_row_ed >= Store.visibledatarow.length) {\r\n        dataset_row_ed = Store.visibledatarow.length - 1;\r\n    }\r\n\r\n    dataset_col_st = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth);\r\n    dataset_col_ed = luckysheet_searcharray(Store.visibledatacolumn, scrollWidth + drawWidth);\r\n\r\n    if (dataset_col_st == -1) {\r\n        dataset_col_st = 0;\r\n    }\r\n\r\n    dataset_col_st += columnOffsetCell;\r\n\r\n    if (dataset_col_ed == -1) {\r\n        dataset_col_ed = Store.visibledatacolumn.length - 1;\r\n    }\r\n\r\n    dataset_col_ed += columnOffsetCell;\r\n\r\n    if (dataset_col_ed >= Store.visibledatacolumn.length) {\r\n        dataset_col_ed = Store.visibledatacolumn.length - 1;\r\n    }\r\n\r\n    //表格渲染区域 起止行列坐标\r\n    let fill_row_st, fill_row_ed, fill_col_st, fill_col_ed;\r\n\r\n    if (dataset_row_st == 0) {\r\n        fill_row_st = 0;\r\n    } else {\r\n        fill_row_st = Store.visibledatarow[dataset_row_st - 1];\r\n    }\r\n\r\n    fill_row_ed = Store.visibledatarow[dataset_row_ed];\r\n\r\n    if (dataset_col_st == 0) {\r\n        fill_col_st = 0;\r\n    } else {\r\n        fill_col_st = Store.visibledatacolumn[dataset_col_st - 1];\r\n    }\r\n\r\n    fill_col_ed = Store.visibledatacolumn[dataset_col_ed];\r\n\r\n    //表格canvas 初始化处理\r\n    luckysheetTableContent.fillStyle = \"#ffffff\";\r\n    luckysheetTableContent.fillRect(\r\n        offsetLeft - 1,\r\n        offsetTop - 1,\r\n        fill_col_ed - scrollWidth,\r\n        fill_row_ed - scrollHeight,\r\n    );\r\n    luckysheetTableContent.font = luckysheetdefaultFont();\r\n    // luckysheetTableContent.textBaseline = \"top\";\r\n    luckysheetTableContent.fillStyle = luckysheetdefaultstyle.fillStyle;\r\n\r\n    //表格渲染区域 非空单元格行列 起止坐标\r\n    let cellupdate = [];\r\n    let mergeCache = {};\r\n    let borderOffset = {};\r\n\r\n    let bodrder05 = 0.5; //Default 0.5\r\n\r\n    // 钩子函数\r\n    method.createHookFunction(\"cellAllRenderBefore\", Store.flowdata, sheetFile, luckysheetTableContent);\r\n\r\n    for (let r = dataset_row_st; r <= dataset_row_ed; r++) {\r\n        let start_r;\r\n        if (r == 0) {\r\n            start_r = -scrollHeight - 1;\r\n        } else {\r\n            start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;\r\n        }\r\n\r\n        let end_r = Store.visibledatarow[r] - scrollHeight;\r\n\r\n        if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n            continue;\r\n        }\r\n\r\n        for (let c = dataset_col_st; c <= dataset_col_ed; c++) {\r\n            let start_c;\r\n            if (c == 0) {\r\n                start_c = -scrollWidth;\r\n            } else {\r\n                start_c = Store.visibledatacolumn[c - 1] - scrollWidth;\r\n            }\r\n\r\n            let end_c = Store.visibledatacolumn[c] - scrollWidth;\r\n\r\n            if (Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c] != null) {\r\n                continue;\r\n            }\r\n\r\n            let firstcolumnlen = Store.defaultcollen;\r\n            if (Store.config[\"columnlen\"] != null && Store.config[\"columnlen\"][c] != null) {\r\n                firstcolumnlen = Store.config[\"columnlen\"][c];\r\n            }\r\n\r\n            if (Store.flowdata[r] != null && Store.flowdata[r][c] != null) {\r\n                let value = Store.flowdata[r][c];\r\n\r\n                if (getObjType(value) == \"object\" && \"mc\" in value) {\r\n                    borderOffset[r + \"_\" + c] = {\r\n                        start_r: start_r,\r\n                        start_c: start_c,\r\n                        end_r: end_r,\r\n                        end_c: end_c,\r\n                    };\r\n\r\n                    if (\"rs\" in value[\"mc\"]) {\r\n                        let key = \"r\" + r + \"c\" + c;\r\n                        mergeCache[key] = cellupdate.length;\r\n                    } else {\r\n                        let key = \"r\" + value[\"mc\"].r + \"c\" + value[\"mc\"].c;\r\n                        let margeMain = cellupdate[mergeCache[key]];\r\n\r\n                        if (margeMain == null) {\r\n                            mergeCache[key] = cellupdate.length;\r\n                            cellupdate.push({\r\n                                r: r,\r\n                                c: c,\r\n                                start_c: start_c,\r\n                                start_r: start_r,\r\n                                end_r: end_r,\r\n                                end_c: end_c,\r\n                                firstcolumnlen: firstcolumnlen,\r\n                            });\r\n                        } else {\r\n                            if (margeMain.c == c) {\r\n                                margeMain.end_r += end_r - start_r - 1;\r\n                            }\r\n\r\n                            if (margeMain.r == r) {\r\n                                margeMain.end_c += end_c - start_c;\r\n                                margeMain.firstcolumnlen += firstcolumnlen;\r\n                            }\r\n                        }\r\n\r\n                        continue;\r\n                    }\r\n                }\r\n            } else {\r\n                //空单元格渲染前\r\n                // if(!method.createHookFunction(\"cellRenderBefore\", Store.flowdata[r][c], {\r\n                //     r:r,\r\n                //     c:c,\r\n                //     \"start_r\": cellsize[1],\r\n                //     \"start_c\":cellsize[0],\r\n                //     \"end_r\": cellsize[3],\r\n                //     \"end_c\": cellsize[2]\r\n                // }, sheetFile,luckysheetTableContent)){ continue; }\r\n            }\r\n\r\n            cellupdate.push({\r\n                r: r,\r\n                c: c,\r\n                start_r: start_r,\r\n                start_c: start_c,\r\n                end_r: end_r,\r\n                end_c: end_c,\r\n                firstcolumnlen: firstcolumnlen,\r\n            });\r\n            borderOffset[r + \"_\" + c] = {\r\n                start_r: start_r,\r\n                start_c: start_c,\r\n                end_r: end_r,\r\n                end_c: end_c,\r\n            };\r\n        }\r\n    }\r\n\r\n    //动态数组公式计算\r\n    let dynamicArray_compute = dynamicArrayCompute(\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray\"],\r\n    );\r\n\r\n    //交替颜色计算\r\n    let af_compute = alternateformat.getComputeMap();\r\n\r\n    //条件格式计算\r\n    let cf_compute = conditionformat.getComputeMap();\r\n\r\n    //表格渲染区域 溢出单元格配置保存\r\n    let cellOverflowMap = getCellOverflowMap(\r\n        luckysheetTableContent,\r\n        dataset_col_st,\r\n        dataset_col_ed,\r\n        dataset_row_st,\r\n        dataset_row_ed,\r\n    );\r\n\r\n    let mcArr = [];\r\n\r\n    for (let cud = 0; cud < cellupdate.length; cud++) {\r\n        let item = cellupdate[cud];\r\n        let r = item.r,\r\n            c = item.c,\r\n            start_r = item.start_r,\r\n            start_c = item.start_c,\r\n            end_r = item.end_r,\r\n            end_c = item.end_c;\r\n        let firstcolumnlen = item.firstcolumnlen;\r\n\r\n        if (Store.flowdata[r] == null) {\r\n            continue;\r\n        }\r\n\r\n        // //有值单元格渲染前\r\n        // if(!method.createHookFunction(\"cellRenderBefore\", Store.flowdata[r][c], {\r\n        //     r:r,\r\n        //     c:c,\r\n        //     \"start_r\": cellsize[1],\r\n        //     \"start_c\":cellsize[0],\r\n        //     \"end_r\": cellsize[3],\r\n        //     \"end_c\": cellsize[2]\r\n        // }, sheetFile,luckysheetTableContent)){ continue; }\r\n\r\n        if (Store.flowdata[r][c] == null) {\r\n            //空单元格\r\n            nullCellRender(\r\n                r,\r\n                c,\r\n                start_r,\r\n                start_c,\r\n                end_r,\r\n                end_c,\r\n                luckysheetTableContent,\r\n                af_compute,\r\n                cf_compute,\r\n                offsetLeft,\r\n                offsetTop,\r\n                dynamicArray_compute,\r\n                cellOverflowMap,\r\n                dataset_col_st,\r\n                dataset_col_ed,\r\n                scrollHeight,\r\n                scrollWidth,\r\n                bodrder05,\r\n            );\r\n        } else {\r\n            let cell = Store.flowdata[r][c];\r\n            let value = null;\r\n\r\n            if (typeof cell == \"object\" && \"mc\" in cell) {\r\n                mcArr.push(cellupdate[cud]);\r\n                // continue;\r\n            } else {\r\n                value = getRealCellValue(r, c);\r\n            }\r\n\r\n            if (value == null || value.toString().length == 0) {\r\n                nullCellRender(\r\n                    r,\r\n                    c,\r\n                    start_r,\r\n                    start_c,\r\n                    end_r,\r\n                    end_c,\r\n                    luckysheetTableContent,\r\n                    af_compute,\r\n                    cf_compute,\r\n                    offsetLeft,\r\n                    offsetTop,\r\n                    dynamicArray_compute,\r\n                    cellOverflowMap,\r\n                    dataset_col_st,\r\n                    dataset_col_ed,\r\n                    scrollHeight,\r\n                    scrollWidth,\r\n                    bodrder05,\r\n                );\r\n\r\n                //sparklines渲染\r\n                let borderfix = menuButton.borderfix(Store.flowdata, r, c);\r\n                let cellsize = [\r\n                    start_c + offsetLeft + borderfix[0],\r\n                    start_r + offsetTop + borderfix[1],\r\n                    end_c - start_c - 3 + borderfix[2],\r\n                    end_r - start_r - 3 - 1 + borderfix[3],\r\n                ];\r\n                sparklinesRender(r, c, cellsize[0], cellsize[1], \"luckysheetTableContent\", luckysheetTableContent);\r\n            } else {\r\n                if (r + \"_\" + c in dynamicArray_compute) {\r\n                    //动态数组公式\r\n                    value = dynamicArray_compute[r + \"_\" + c].v;\r\n                }\r\n\r\n                cellRender(\r\n                    r,\r\n                    c,\r\n                    start_r,\r\n                    start_c,\r\n                    end_r,\r\n                    end_c,\r\n                    value,\r\n                    luckysheetTableContent,\r\n                    af_compute,\r\n                    cf_compute,\r\n                    offsetLeft,\r\n                    offsetTop,\r\n                    dynamicArray_compute,\r\n                    cellOverflowMap,\r\n                    dataset_col_st,\r\n                    dataset_col_ed,\r\n                    scrollHeight,\r\n                    scrollWidth,\r\n                    bodrder05,\r\n                );\r\n            }\r\n        }\r\n\r\n        // method.createHookFunction(\"cellRenderAfter\", Store.flowdata[r][c], {\r\n        //     r:r,\r\n        //     c:c,\r\n        //     \"start_r\": start_r,\r\n        //     \"start_c\": start_c,\r\n        //     \"end_r\": end_r,\r\n        //     \"end_c\": end_c\r\n        // }, sheetFile,luckysheetTableContent)\r\n    }\r\n\r\n    //合并单元格再处理\r\n    for (let m = 0; m < mcArr.length; m++) {\r\n        let item = mcArr[m];\r\n        let r = item.r,\r\n            c = item.c,\r\n            start_r = item.start_r,\r\n            start_c = item.start_c,\r\n            end_r = item.end_r - 1,\r\n            end_c = item.end_c - 1;\r\n        let firstcolumnlen = item.firstcolumnlen;\r\n\r\n        let cell = Store.flowdata[r][c];\r\n        let value = null;\r\n\r\n        let margeMaindata = cell[\"mc\"];\r\n\r\n        value = getRealCellValue(margeMaindata.r, margeMaindata.c);\r\n\r\n        r = margeMaindata.r;\r\n        c = margeMaindata.c;\r\n\r\n        let mainCell = Store.flowdata[r][c];\r\n\r\n        if (c == 0) {\r\n            start_c = -scrollWidth;\r\n        } else {\r\n            start_c = Store.visibledatacolumn[c - 1] - scrollWidth;\r\n        }\r\n\r\n        if (r == 0) {\r\n            start_r = -scrollHeight - 1;\r\n        } else {\r\n            start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;\r\n        }\r\n\r\n        end_r = Store.visibledatarow[r + mainCell[\"mc\"].rs - 1] - scrollHeight;\r\n        end_c = Store.visibledatacolumn[c + mainCell[\"mc\"].cs - 1] - scrollWidth;\r\n\r\n        if (value == null || value.toString().length == 0) {\r\n            nullCellRender(\r\n                r,\r\n                c,\r\n                start_r,\r\n                start_c,\r\n                end_r,\r\n                end_c,\r\n                luckysheetTableContent,\r\n                af_compute,\r\n                cf_compute,\r\n                offsetLeft,\r\n                offsetTop,\r\n                dynamicArray_compute,\r\n                cellOverflowMap,\r\n                dataset_col_st,\r\n                dataset_col_ed,\r\n                scrollHeight,\r\n                scrollWidth,\r\n                bodrder05,\r\n                true,\r\n            );\r\n\r\n            //sparklines渲染\r\n            let borderfix = menuButton.borderfix(Store.flowdata, r, c);\r\n            let cellsize = [\r\n                start_c + offsetLeft + borderfix[0],\r\n                start_r + offsetTop + borderfix[1],\r\n                end_c - start_c - 3 + borderfix[2],\r\n                end_r - start_r - 3 - 1 + borderfix[3],\r\n            ];\r\n            sparklinesRender(r, c, cellsize[0], cellsize[1], \"luckysheetTableContent\", luckysheetTableContent);\r\n        } else {\r\n            if (r + \"_\" + c in dynamicArray_compute) {\r\n                //动态数组公式\r\n                value = dynamicArray_compute[r + \"_\" + c].v;\r\n            }\r\n            cellRender(\r\n                r,\r\n                c,\r\n                start_r,\r\n                start_c,\r\n                end_r,\r\n                end_c,\r\n                value,\r\n                luckysheetTableContent,\r\n                af_compute,\r\n                cf_compute,\r\n                offsetLeft,\r\n                offsetTop,\r\n                dynamicArray_compute,\r\n                cellOverflowMap,\r\n                dataset_col_st,\r\n                dataset_col_ed,\r\n                scrollHeight,\r\n                scrollWidth,\r\n                bodrder05,\r\n                true,\r\n            );\r\n        }\r\n    }\r\n\r\n    //数据透视表边框渲染\r\n    for (let r = dataset_row_st; r <= dataset_row_ed; r++) {\r\n        let start_r;\r\n        if (r == 0) {\r\n            start_r = -scrollHeight - 1;\r\n        } else {\r\n            start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;\r\n        }\r\n\r\n        let end_r = Store.visibledatarow[r] - scrollHeight;\r\n\r\n        for (let c = dataset_col_st; c <= dataset_col_ed; c++) {\r\n            let start_c;\r\n            if (c == 0) {\r\n                start_c = -scrollWidth;\r\n            } else {\r\n                start_c = Store.visibledatacolumn[c - 1] - scrollWidth;\r\n            }\r\n\r\n            let end_c = Store.visibledatacolumn[c] - scrollWidth;\r\n\r\n            //数据透视表\r\n            if (!!Store.luckysheetcurrentisPivotTable && pivotTable.drawPivotTable) {\r\n                if ((c == 0 || c == 5) && r <= 11) {\r\n                    luckysheetTableContent.beginPath();\r\n                    luckysheetTableContent.moveTo(end_c - 2 + bodrder05 + offsetLeft, start_r + offsetTop);\r\n                    luckysheetTableContent.lineTo(\r\n                        end_c - 2 + bodrder05 + offsetLeft,\r\n                        end_r - 2 + bodrder05 + offsetTop,\r\n                    );\r\n                    luckysheetTableContent.lineWidth = 1;\r\n                    luckysheetTableContent.strokeStyle = \"#000000\";\r\n                    luckysheetTableContent.closePath();\r\n                    luckysheetTableContent.stroke();\r\n                }\r\n\r\n                if ((r == 2 || r == 11) && c <= 5) {\r\n                    luckysheetTableContent.beginPath();\r\n                    luckysheetTableContent.moveTo(start_c - 1 + offsetLeft, end_r - 2 + bodrder05 + offsetTop);\r\n                    luckysheetTableContent.lineTo(\r\n                        end_c - 2 + bodrder05 + offsetLeft,\r\n                        end_r - 2 + bodrder05 + offsetTop,\r\n                    );\r\n                    luckysheetTableContent.lineWidth = 1;\r\n                    luckysheetTableContent.strokeStyle = \"#000000\";\r\n                    luckysheetTableContent.closePath();\r\n                    luckysheetTableContent.stroke();\r\n                }\r\n\r\n                if (r == 6 && c == 3) {\r\n                    luckysheetTableContent.save();\r\n                    luckysheetTableContent.font = \"bold 30px Arial\";\r\n                    luckysheetTableContent.fillStyle = \"#626675\";\r\n                    luckysheetTableContent.textAlign = \"center\";\r\n                    luckysheetTableContent.fillText(\r\n                        locale().pivotTable.title,\r\n                        start_c + (end_c - start_c) / 2 + 4 + offsetLeft,\r\n                        start_r + (end_r - start_r) / 2 - 1 + offsetTop,\r\n                    );\r\n                    luckysheetTableContent.restore();\r\n                }\r\n            } else if (!!Store.luckysheetcurrentisPivotTable) {\r\n                if (c < pivotTable.pivotTableBoundary[1] && r < pivotTable.pivotTableBoundary[0]) {\r\n                    luckysheetTableContent.beginPath();\r\n                    luckysheetTableContent.moveTo(end_c - 2 + bodrder05 + offsetLeft, start_r + offsetTop);\r\n                    luckysheetTableContent.lineTo(\r\n                        end_c - 2 + bodrder05 + offsetLeft,\r\n                        end_r - 2 + bodrder05 + offsetTop,\r\n                    );\r\n                    luckysheetTableContent.lineWidth = 1;\r\n                    luckysheetTableContent.strokeStyle = \"#000000\";\r\n                    luckysheetTableContent.closePath();\r\n                    luckysheetTableContent.stroke();\r\n\r\n                    luckysheetTableContent.beginPath();\r\n                    luckysheetTableContent.moveTo(start_c - 1 + offsetLeft, end_r - 2 + bodrder05 + offsetTop);\r\n                    luckysheetTableContent.lineTo(end_c - 2 + offsetLeft, end_r - 2 + bodrder05 + offsetTop);\r\n                    luckysheetTableContent.lineWidth = 1;\r\n                    luckysheetTableContent.strokeStyle = \"#000000\";\r\n                    luckysheetTableContent.closePath();\r\n                    luckysheetTableContent.stroke();\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //边框单独渲染\r\n    if (Store.config[\"borderInfo\"] != null && Store.config[\"borderInfo\"].length > 0) {\r\n        //边框渲染\r\n        let borderLeftRender = function(style, color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, canvas) {\r\n            let linetype = style;\r\n\r\n            let m_st = start_c - 2 + bodrder05 + offsetLeft;\r\n            let m_ed = start_r + offsetTop - 1;\r\n            let line_st = start_c - 2 + bodrder05 + offsetLeft;\r\n            let line_ed = end_r - 2 + bodrder05 + offsetTop;\r\n            canvas.save();\r\n            menuButton.setLineDash(canvas, linetype, \"v\", m_st, m_ed, line_st, line_ed);\r\n\r\n            canvas.strokeStyle = color;\r\n\r\n            canvas.stroke();\r\n            canvas.closePath();\r\n            canvas.restore();\r\n        };\r\n\r\n        let borderRightRender = function(style, color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, canvas) {\r\n            let linetype = style;\r\n\r\n            let m_st = end_c - 2 + bodrder05 + offsetLeft;\r\n            let m_ed = start_r + offsetTop - 1;\r\n            let line_st = end_c - 2 + bodrder05 + offsetLeft;\r\n            let line_ed = end_r - 2 + bodrder05 + offsetTop;\r\n            canvas.save();\r\n            menuButton.setLineDash(canvas, linetype, \"v\", m_st, m_ed, line_st, line_ed);\r\n\r\n            canvas.strokeStyle = color;\r\n\r\n            canvas.stroke();\r\n            canvas.closePath();\r\n            canvas.restore();\r\n        };\r\n\r\n        let borderBottomRender = function(style, color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, canvas) {\r\n            let linetype = style;\r\n\r\n            let m_st = start_c - 2 + bodrder05 + offsetLeft;\r\n            let m_ed = end_r - 2 + bodrder05 + offsetTop;\r\n            let line_st = end_c - 2 + bodrder05 + offsetLeft;\r\n            let line_ed = end_r - 2 + bodrder05 + offsetTop;\r\n            canvas.save();\r\n            menuButton.setLineDash(canvas, linetype, \"h\", m_st, m_ed, line_st, line_ed);\r\n\r\n            canvas.strokeStyle = color;\r\n\r\n            canvas.stroke();\r\n            canvas.closePath();\r\n            canvas.restore();\r\n        };\r\n\r\n        let borderTopRender = function(style, color, start_r, start_c, end_r, end_c, offsetLeft, offsetTop, canvas) {\r\n            let linetype = style;\r\n\r\n            let m_st = start_c - 2 + bodrder05 + offsetLeft;\r\n            let m_ed = start_r - 1 + bodrder05 + offsetTop;\r\n            let line_st = end_c - 2 + bodrder05 + offsetLeft;\r\n            let line_ed = start_r - 1 + bodrder05 + offsetTop;\r\n            canvas.save();\r\n            menuButton.setLineDash(canvas, linetype, \"h\", m_st, m_ed, line_st, line_ed);\r\n\r\n            canvas.strokeStyle = color;\r\n\r\n            canvas.stroke();\r\n            canvas.closePath();\r\n            canvas.restore();\r\n        };\r\n\r\n        let borderInfoCompute = getBorderInfoComputeRange(\r\n            dataset_row_st,\r\n            dataset_row_ed,\r\n            dataset_col_st,\r\n            dataset_col_ed,\r\n        );\r\n\r\n        for (let x in borderInfoCompute) {\r\n            //let bd_r = x.split(\"_\")[0], bd_c = x.split(\"_\")[1];\r\n\r\n            let bd_r = x.substr(0, x.indexOf(\"_\"));\r\n            let bd_c = x.substr(x.indexOf(\"_\") + 1);\r\n\r\n            // if(bd_r < dataset_row_st || bd_r > dataset_row_ed || bd_c < dataset_col_st || bd_c > dataset_col_ed){\r\n            //     continue;\r\n            // }\r\n\r\n            if (borderOffset[bd_r + \"_\" + bd_c]) {\r\n                let start_r = borderOffset[bd_r + \"_\" + bd_c].start_r;\r\n                let start_c = borderOffset[bd_r + \"_\" + bd_c].start_c;\r\n                let end_r = borderOffset[bd_r + \"_\" + bd_c].end_r;\r\n                let end_c = borderOffset[bd_r + \"_\" + bd_c].end_c;\r\n\r\n                let cellOverflow_colInObj = cellOverflow_colIn(\r\n                    cellOverflowMap,\r\n                    bd_r,\r\n                    bd_c,\r\n                    dataset_col_st,\r\n                    dataset_col_ed,\r\n                );\r\n\r\n                let borderLeft = borderInfoCompute[x].l;\r\n                if (borderLeft != null && (!cellOverflow_colInObj.colIn || cellOverflow_colInObj.stc == bd_c)) {\r\n                    borderLeftRender(\r\n                        borderLeft.style,\r\n                        borderLeft.color,\r\n                        start_r,\r\n                        start_c,\r\n                        end_r,\r\n                        end_c,\r\n                        offsetLeft,\r\n                        offsetTop,\r\n                        luckysheetTableContent,\r\n                    );\r\n                }\r\n\r\n                let borderRight = borderInfoCompute[x].r;\r\n                if (borderRight != null && (!cellOverflow_colInObj.colIn || cellOverflow_colInObj.colLast)) {\r\n                    borderRightRender(\r\n                        borderRight.style,\r\n                        borderRight.color,\r\n                        start_r,\r\n                        start_c,\r\n                        end_r,\r\n                        end_c,\r\n                        offsetLeft,\r\n                        offsetTop,\r\n                        luckysheetTableContent,\r\n                    );\r\n                }\r\n\r\n                let borderTop = borderInfoCompute[x].t;\r\n                if (borderTop != null) {\r\n                    borderTopRender(\r\n                        borderTop.style,\r\n                        borderTop.color,\r\n                        start_r,\r\n                        start_c,\r\n                        end_r,\r\n                        end_c,\r\n                        offsetLeft,\r\n                        offsetTop,\r\n                        luckysheetTableContent,\r\n                    );\r\n                }\r\n\r\n                let borderBottom = borderInfoCompute[x].b;\r\n                if (borderBottom != null) {\r\n                    borderBottomRender(\r\n                        borderBottom.style,\r\n                        borderBottom.color,\r\n                        start_r,\r\n                        start_c,\r\n                        end_r,\r\n                        end_c,\r\n                        offsetLeft,\r\n                        offsetTop,\r\n                        luckysheetTableContent,\r\n                    );\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //渲染表格时有尾列时，清除右边灰色区域，防止表格有值溢出\r\n    if (dataset_col_ed == Store.visibledatacolumn.length - 1) {\r\n        luckysheetTableContent.clearRect(\r\n            fill_col_ed - scrollWidth + offsetLeft - 1,\r\n            offsetTop - 1,\r\n            Store.ch_width - Store.visibledatacolumn[dataset_col_ed],\r\n            fill_row_ed - scrollHeight,\r\n        );\r\n    }\r\n\r\n    luckysheetTableContent.restore();\r\n\r\n    Store.measureTextCacheTimeOut = setTimeout(() => {\r\n        Store.measureTextCache = {};\r\n        Store.measureTextCellInfoCache = {};\r\n        Store.cellOverflowMapCache = {};\r\n    }, 100);\r\n}\r\n\r\n//sparklines渲染\r\nlet sparklinesRender = function(r, c, offsetX, offsetY, canvasid, ctx) {\r\n    if (Store.flowdata[r] == null || Store.flowdata[r][c] == null) {\r\n        return;\r\n    }\r\n\r\n    let sparklines = Store.flowdata[r][c].spl;\r\n    if (sparklines != null) {\r\n        if (typeof sparklines == \"string\") {\r\n            sparklines = new Function(\"return \" + sparklines)();\r\n        }\r\n\r\n        if (getObjType(sparklines) == \"object\") {\r\n            let temp1 = sparklines;\r\n            let x = temp1.offsetX;\r\n            let y = temp1.offsetY;\r\n            x = x == null ? 0 : x;\r\n            y = y == null ? 0 : y;\r\n            luckysheetSparkline.render(\r\n                temp1.shapeseq,\r\n                temp1.shapes,\r\n                offsetX + x,\r\n                offsetY + y,\r\n                temp1.pixelWidth,\r\n                temp1.pixelHeight,\r\n                canvasid,\r\n                ctx,\r\n            );\r\n        } else if (getObjType(sparklines) == \"array\" && getObjType(sparklines[0]) == \"object\") {\r\n            for (let i = 0; i < sparklines.length; i++) {\r\n                let temp1 = sparklines[i];\r\n                let x = temp1.offsetX;\r\n                let y = temp1.offsetY;\r\n                x = x == null ? 0 : x;\r\n                y = y == null ? 0 : y;\r\n                luckysheetSparkline.render(\r\n                    temp1.shapeseq,\r\n                    temp1.shapes,\r\n                    offsetX + x,\r\n                    offsetY + y,\r\n                    temp1.pixelWidth,\r\n                    temp1.pixelHeight,\r\n                    canvasid,\r\n                    ctx,\r\n                );\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n//空白单元格渲染\r\nlet nullCellRender = function(\r\n    r,\r\n    c,\r\n    start_r,\r\n    start_c,\r\n    end_r,\r\n    end_c,\r\n    luckysheetTableContent,\r\n    af_compute,\r\n    cf_compute,\r\n    offsetLeft,\r\n    offsetTop,\r\n    dynamicArray_compute,\r\n    cellOverflowMap,\r\n    dataset_col_st,\r\n    dataset_col_ed,\r\n    scrollHeight,\r\n    scrollWidth,\r\n    bodrder05,\r\n    isMerge,\r\n) {\r\n    let checksAF = alternateformat.checksAF(r, c, af_compute); //交替颜色\r\n    let checksCF = conditionformat.checksCF(r, c, cf_compute); //条件格式\r\n\r\n    let borderfix = menuButton.borderfix(Store.flowdata, r, c);\r\n\r\n    //背景色\r\n    let fillStyle = menuButton.checkstatus(Store.flowdata, r, c, \"bg\");\r\n\r\n    if (checksAF != null && checksAF[1] != null) {\r\n        //交替颜色\r\n        fillStyle = checksAF[1];\r\n    }\r\n\r\n    if (checksCF != null && checksCF[\"cellColor\"] != null) {\r\n        //条件格式\r\n        fillStyle = checksCF[\"cellColor\"];\r\n    }\r\n\r\n    if (Store.flowdata[r][c] != null && Store.flowdata[r][c].tc != null) {\r\n        //标题色\r\n        fillStyle = Store.flowdata[r][c].tc;\r\n    }\r\n\r\n    if (fillStyle == null) {\r\n        luckysheetTableContent.fillStyle = \"#FFFFFF\";\r\n    } else {\r\n        luckysheetTableContent.fillStyle = fillStyle;\r\n    }\r\n\r\n    // 这里计算canvas需要绘制的矩形范围时,需要留下原本单元格边框的位置\r\n    // 让 fillRect 绘制矩形的起始xy坐标增加1,绘制长宽减少1\r\n\r\n    let cellsize = [\r\n        start_c + offsetLeft + borderfix[0] + 1,\r\n        start_r + offsetTop + borderfix[1] + 1,\r\n        end_c - start_c + borderfix[2] - (!!isMerge ? 1 : 0) - 1,\r\n        end_r - start_r + borderfix[3] - 1,\r\n    ];\r\n\r\n    //单元格渲染前，考虑到合并单元格会再次渲染一遍，统一放到这里\r\n    if (\r\n        !method.createHookFunction(\r\n            \"cellRenderBefore\",\r\n            Store.flowdata[r][c],\r\n            {\r\n                r: r,\r\n                c: c,\r\n                start_r: cellsize[1],\r\n                start_c: cellsize[0],\r\n                end_r: cellsize[3] + cellsize[1],\r\n                end_c: cellsize[2] + cellsize[0],\r\n            },\r\n            sheetmanage.getSheetByIndex(),\r\n            luckysheetTableContent,\r\n        )\r\n    ) {\r\n        return;\r\n    }\r\n\r\n    luckysheetTableContent.fillRect(cellsize[0], cellsize[1], cellsize[2], cellsize[3]);\r\n\r\n    if (r + \"_\" + c in dynamicArray_compute) {\r\n        let value = dynamicArray_compute[r + \"_\" + c].v;\r\n\r\n        luckysheetTableContent.fillStyle = \"#000000\";\r\n        //文本宽度和高度\r\n        let fontset = luckysheetdefaultFont();\r\n        luckysheetTableContent.font = fontset;\r\n\r\n        //水平对齐 (默认为1，左对齐)\r\n        let horizonAlignPos = start_c + 4 + offsetLeft;\r\n\r\n        //垂直对齐 (默认为2，下对齐)\r\n        let verticalFixed = browser.luckysheetrefreshfixed();\r\n        let verticalAlignPos = end_r + offsetTop - 2;\r\n        luckysheetTableContent.textBaseline = \"bottom\";\r\n\r\n        luckysheetTableContent.fillText(value == null ? \"\" : value, horizonAlignPos, verticalAlignPos);\r\n    }\r\n\r\n    //若单元格有批注\r\n    if (Store.flowdata[r][c] != null && Store.flowdata[r][c].ps != null) {\r\n        let ps_w = 8 * Store.zoomRatio,\r\n            ps_h = 8 * Store.zoomRatio;\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(end_c + offsetLeft - 1 - ps_w, start_r + offsetTop);\r\n        luckysheetTableContent.lineTo(end_c + offsetLeft - 1, start_r + offsetTop);\r\n        luckysheetTableContent.lineTo(end_c + offsetLeft - 1, start_r + offsetTop + ps_h);\r\n        luckysheetTableContent.fillStyle = \"#FC6666\";\r\n        luckysheetTableContent.fill();\r\n        luckysheetTableContent.closePath();\r\n    }\r\n\r\n    //此单元格 与  溢出单元格关系\r\n    let cellOverflow_colInObj = cellOverflow_colIn(cellOverflowMap, r, c, dataset_col_st, dataset_col_ed);\r\n\r\n    //此单元格 为 溢出单元格渲染范围最后一列，绘制溢出单元格内容\r\n    if (cellOverflow_colInObj.colLast) {\r\n        cellOverflowRender(\r\n            cellOverflow_colInObj.rowIndex,\r\n            cellOverflow_colInObj.colIndex,\r\n            cellOverflow_colInObj.stc,\r\n            cellOverflow_colInObj.edc,\r\n            luckysheetTableContent,\r\n            scrollHeight,\r\n            scrollWidth,\r\n            offsetLeft,\r\n            offsetTop,\r\n            af_compute,\r\n            cf_compute,\r\n        );\r\n    }\r\n\r\n    //即溢出单元格跨此单元格，此单元格不绘制右边框\r\n    if (!cellOverflow_colInObj.colIn || cellOverflow_colInObj.colLast) {\r\n        // 右边框\r\n        // 无论是否有背景色，都默认绘制右边框\r\n        if (!Store.luckysheetcurrentisPivotTable && Store.showGridLines) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(end_c + offsetLeft - 2 + bodrder05, start_r + offsetTop);\r\n            luckysheetTableContent.lineTo(end_c + offsetLeft - 2 + bodrder05, end_r + offsetTop);\r\n            luckysheetTableContent.lineWidth = 1;\r\n\r\n            luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.stroke();\r\n            luckysheetTableContent.closePath();\r\n        }\r\n    }\r\n\r\n    // 下边框\r\n    // 无论是否有背景色，都默认绘制下边框\r\n    if (!Store.luckysheetcurrentisPivotTable && Store.showGridLines) {\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(start_c + offsetLeft - 1, end_r + offsetTop - 2 + bodrder05);\r\n        luckysheetTableContent.lineTo(end_c + offsetLeft - 1, end_r + offsetTop - 2 + bodrder05);\r\n        luckysheetTableContent.lineWidth = 1;\r\n\r\n        luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n        luckysheetTableContent.stroke();\r\n        luckysheetTableContent.closePath();\r\n    }\r\n\r\n    // 单元格渲染后\r\n    method.createHookFunction(\r\n        \"cellRenderAfter\",\r\n        Store.flowdata[r][c],\r\n        {\r\n            r: r,\r\n            c: c,\r\n            start_r: cellsize[1],\r\n            start_c: cellsize[0],\r\n            end_r: cellsize[3] + cellsize[1],\r\n            end_c: cellsize[2] + cellsize[0],\r\n        },\r\n        sheetmanage.getSheetByIndex(),\r\n        luckysheetTableContent,\r\n    );\r\n};\r\n\r\nlet cellRender = function(\r\n    r,\r\n    c,\r\n    start_r,\r\n    start_c,\r\n    end_r,\r\n    end_c,\r\n    value,\r\n    luckysheetTableContent,\r\n    af_compute,\r\n    cf_compute,\r\n    offsetLeft,\r\n    offsetTop,\r\n    dynamicArray_compute,\r\n    cellOverflowMap,\r\n    dataset_col_st,\r\n    dataset_col_ed,\r\n    scrollHeight,\r\n    scrollWidth,\r\n    bodrder05,\r\n    isMerge,\r\n) {\r\n    let cell = Store.flowdata[r][c];\r\n    let cellWidth = end_c - start_c - 2;\r\n    let cellHeight = end_r - start_r - 2;\r\n    let space_width = 2,\r\n        space_height = 2; //宽高方向 间隙\r\n\r\n    //水平对齐\r\n    let horizonAlign = menuButton.checkstatus(Store.flowdata, r, c, \"ht\");\r\n    //垂直对齐\r\n    let verticalAlign = menuButton.checkstatus(Store.flowdata, r, c, \"vt\");\r\n\r\n    //交替颜色\r\n    let checksAF = alternateformat.checksAF(r, c, af_compute);\r\n    //条件格式\r\n    let checksCF = conditionformat.checksCF(r, c, cf_compute);\r\n\r\n    //单元格 背景颜色\r\n    let fillStyle = menuButton.checkstatus(Store.flowdata, r, c, \"bg\");\r\n    if (checksAF != null && checksAF[1] != null) {\r\n        //若单元格有交替颜色 背景颜色\r\n        fillStyle = checksAF[1];\r\n    }\r\n    if (checksCF != null && checksCF[\"cellColor\"] != null) {\r\n        //若单元格有条件格式 背景颜色\r\n        fillStyle = checksCF[\"cellColor\"];\r\n    }\r\n    // luckysheetTableContent.textBaseline = 'top';\r\n    if (fillStyle == null) {\r\n        luckysheetTableContent.fillStyle = \"#FFFFFF\";\r\n    } else {\r\n        luckysheetTableContent.fillStyle = fillStyle;\r\n    }\r\n\r\n    let borderfix = menuButton.borderfix(Store.flowdata, r, c);\r\n\r\n    // 这里计算canvas需要绘制的矩形范围时,需要留下原本单元格边框的位置\r\n    // 让 fillRect 绘制矩形的起始xy坐标增加1,绘制长宽减少1\r\n\r\n    let cellsize = [\r\n        start_c + offsetLeft + borderfix[0] + 1,\r\n        start_r + offsetTop + borderfix[1] + 1,\r\n        end_c - start_c + borderfix[2] - (!!isMerge ? 1 : 0) - 1,\r\n        end_r - start_r + borderfix[3] + 1,\r\n    ];\r\n\r\n    //单元格渲染前，考虑到合并单元格会再次渲染一遍，统一放到这里\r\n    if (\r\n        !method.createHookFunction(\r\n            \"cellRenderBefore\",\r\n            Store.flowdata[r][c],\r\n            {\r\n                r: r,\r\n                c: c,\r\n                start_r: cellsize[1],\r\n                start_c: cellsize[0],\r\n                end_r: cellsize[3] + cellsize[1],\r\n                end_c: cellsize[2] + cellsize[0],\r\n            },\r\n            sheetmanage.getSheetByIndex(),\r\n            luckysheetTableContent,\r\n        )\r\n    ) {\r\n        return;\r\n    }\r\n\r\n    luckysheetTableContent.fillRect(cellsize[0], cellsize[1], cellsize[2], cellsize[3]);\r\n\r\n    let dataVerification = dataVerificationCtrl.dataVerification;\r\n\r\n    if (\r\n        dataVerification != null &&\r\n        dataVerification[r + \"_\" + c] != null &&\r\n        !dataVerificationCtrl.validateCellData(value, dataVerification[r + \"_\" + c])\r\n    ) {\r\n        //单元格左上角红色小三角标示\r\n        let dv_w = 5 * Store.zoomRatio,\r\n            dv_h = 5 * Store.zoomRatio; //红色小三角宽高\r\n\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(start_c + offsetLeft, start_r + offsetTop);\r\n        luckysheetTableContent.lineTo(start_c + offsetLeft + dv_w, start_r + offsetTop);\r\n        luckysheetTableContent.lineTo(start_c + offsetLeft, start_r + offsetTop + dv_h);\r\n        luckysheetTableContent.fillStyle = \"#FC6666\";\r\n        luckysheetTableContent.fill();\r\n        luckysheetTableContent.closePath();\r\n    }\r\n\r\n    //若单元格有批注（单元格右上角红色小三角标示）\r\n    if (cell.ps != null) {\r\n        let ps_w = 8 * Store.zoomRatio,\r\n            ps_h = 8 * Store.zoomRatio; //红色小三角宽高\r\n\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(end_c + offsetLeft - ps_w, start_r + offsetTop);\r\n        luckysheetTableContent.lineTo(end_c + offsetLeft, start_r + offsetTop);\r\n        luckysheetTableContent.lineTo(end_c + offsetLeft, start_r + offsetTop + ps_h);\r\n        luckysheetTableContent.fillStyle = \"#FC6666\";\r\n        luckysheetTableContent.fill();\r\n        luckysheetTableContent.closePath();\r\n    }\r\n\r\n    //若单元格强制为字符串，则显示绿色小三角\r\n    if (cell.qp == 1 && isRealNum(cell.v)) {\r\n        let ps_w = 6 * Store.zoomRatio,\r\n            ps_h = 6 * Store.zoomRatio; //红色小三角宽高\r\n\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(start_c + offsetLeft + ps_w - 1, start_r + offsetTop);\r\n        luckysheetTableContent.lineTo(start_c + offsetLeft - 1, start_r + offsetTop);\r\n        luckysheetTableContent.lineTo(start_c + offsetLeft - 1, start_r + offsetTop + ps_h);\r\n        luckysheetTableContent.fillStyle = \"#487f1e\";\r\n        luckysheetTableContent.fill();\r\n        luckysheetTableContent.closePath();\r\n    }\r\n\r\n    //溢出单元格\r\n    let cellOverflow_bd_r_render = true; //溢出单元格右边框是否需要绘制\r\n    let cellOverflow_colInObj = cellOverflow_colIn(cellOverflowMap, r, c, dataset_col_st, dataset_col_ed);\r\n\r\n    if (cell.tb == \"1\" && cellOverflow_colInObj.colIn) {\r\n        //此单元格 为 溢出单元格渲染范围最后一列，绘制溢出单元格内容\r\n        if (cellOverflow_colInObj.colLast) {\r\n            cellOverflowRender(\r\n                cellOverflow_colInObj.rowIndex,\r\n                cellOverflow_colInObj.colIndex,\r\n                cellOverflow_colInObj.stc,\r\n                cellOverflow_colInObj.edc,\r\n                luckysheetTableContent,\r\n                scrollHeight,\r\n                scrollWidth,\r\n                offsetLeft,\r\n                offsetTop,\r\n                af_compute,\r\n                cf_compute,\r\n            );\r\n        } else {\r\n            cellOverflow_bd_r_render = false;\r\n        }\r\n    }\r\n    //数据验证 复选框\r\n    else if (\r\n        dataVerification != null &&\r\n        dataVerification[r + \"_\" + c] != null &&\r\n        dataVerification[r + \"_\" + c].type == \"checkbox\"\r\n    ) {\r\n        let pos_x = start_c + offsetLeft;\r\n        let pos_y = start_r + offsetTop + 1;\r\n\r\n        luckysheetTableContent.save();\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.rect(pos_x, pos_y, cellWidth, cellHeight);\r\n        luckysheetTableContent.clip();\r\n        luckysheetTableContent.scale(Store.zoomRatio, Store.zoomRatio);\r\n\r\n        let measureText = getMeasureText(value, luckysheetTableContent);\r\n        let textMetrics = measureText.width + 14;\r\n        let oneLineTextHeight = measureText.actualBoundingBoxDescent + measureText.actualBoundingBoxAscent;\r\n\r\n        let horizonAlignPos = pos_x + space_width; //默认为1，左对齐\r\n        if (horizonAlign == \"0\") {\r\n            //居中对齐\r\n            horizonAlignPos = pos_x + cellWidth / 2 - textMetrics / 2;\r\n        } else if (horizonAlign == \"2\") {\r\n            //右对齐\r\n            horizonAlignPos = pos_x + cellWidth - space_width - textMetrics;\r\n        }\r\n\r\n        let verticalCellHeight = cellHeight > oneLineTextHeight ? cellHeight : oneLineTextHeight;\r\n\r\n        let verticalAlignPos_text = pos_y + verticalCellHeight - space_height; //文本垂直方向基准线\r\n        luckysheetTableContent.textBaseline = \"bottom\";\r\n        let verticalAlignPos_checkbox = verticalAlignPos_text - 13 * Store.zoomRatio;\r\n\r\n        if (verticalAlign == \"0\") {\r\n            //居中对齐\r\n            verticalAlignPos_text = pos_y + verticalCellHeight / 2;\r\n            luckysheetTableContent.textBaseline = \"middle\";\r\n            verticalAlignPos_checkbox = verticalAlignPos_text - 6 * Store.zoomRatio;\r\n        } else if (verticalAlign == \"1\") {\r\n            //上对齐\r\n            verticalAlignPos_text = pos_y + space_height;\r\n            luckysheetTableContent.textBaseline = \"top\";\r\n            verticalAlignPos_checkbox = verticalAlignPos_text + 1 * Store.zoomRatio;\r\n        }\r\n\r\n        horizonAlignPos = horizonAlignPos / Store.zoomRatio;\r\n        verticalAlignPos_text = verticalAlignPos_text / Store.zoomRatio;\r\n        verticalAlignPos_checkbox = verticalAlignPos_checkbox / Store.zoomRatio;\r\n\r\n        //复选框\r\n        luckysheetTableContent.lineWidth = 1;\r\n        luckysheetTableContent.strokeStyle = \"#000\";\r\n        luckysheetTableContent.strokeRect(horizonAlignPos, verticalAlignPos_checkbox, 10, 10);\r\n\r\n        if (dataVerification[r + \"_\" + c].checked) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.lineTo(horizonAlignPos + 1, verticalAlignPos_checkbox + 6);\r\n            luckysheetTableContent.lineTo(horizonAlignPos + 4, verticalAlignPos_checkbox + 9);\r\n            luckysheetTableContent.lineTo(horizonAlignPos + 9, verticalAlignPos_checkbox + 2);\r\n            luckysheetTableContent.stroke();\r\n            luckysheetTableContent.closePath();\r\n        }\r\n\r\n        //文本\r\n        luckysheetTableContent.fillStyle = menuButton.checkstatus(Store.flowdata, r, c, \"fc\");\r\n        luckysheetTableContent.fillText(value == null ? \"\" : value, horizonAlignPos + 14, verticalAlignPos_text);\r\n\r\n        luckysheetTableContent.restore();\r\n    } else {\r\n        //若单元格有条件格式数据条\r\n        if (\r\n            checksCF != null &&\r\n            checksCF[\"dataBar\"] != null &&\r\n            checksCF[\"dataBar\"][\"valueLen\"] &&\r\n            checksCF[\"dataBar\"][\"valueLen\"].toString() !== \"NaN\"\r\n        ) {\r\n            let x = start_c + offsetLeft + space_width;\r\n            let y = start_r + offsetTop + space_height;\r\n            let w = cellWidth - space_width * 2;\r\n            let h = cellHeight - space_height * 2;\r\n\r\n            let valueType = checksCF[\"dataBar\"][\"valueType\"];\r\n            let valueLen = checksCF[\"dataBar\"][\"valueLen\"];\r\n            let format = checksCF[\"dataBar\"][\"format\"];\r\n\r\n            if (valueType == \"minus\") {\r\n                //负数\r\n                let minusLen = checksCF[\"dataBar\"][\"minusLen\"];\r\n\r\n                if (format.length > 1) {\r\n                    //渐变\r\n                    let my_gradient = luckysheetTableContent.createLinearGradient(\r\n                        x + w * minusLen * (1 - valueLen),\r\n                        y,\r\n                        x + w * minusLen,\r\n                        y,\r\n                    );\r\n                    my_gradient.addColorStop(0, \"#ffffff\");\r\n                    my_gradient.addColorStop(1, \"#ff0000\");\r\n\r\n                    luckysheetTableContent.fillStyle = my_gradient;\r\n                } else {\r\n                    //单色\r\n                    luckysheetTableContent.fillStyle = \"#ff0000\";\r\n                }\r\n\r\n                luckysheetTableContent.fillRect(x + w * minusLen * (1 - valueLen), y, w * minusLen * valueLen, h);\r\n\r\n                luckysheetTableContent.beginPath();\r\n                luckysheetTableContent.moveTo(x + w * minusLen * (1 - valueLen), y);\r\n                luckysheetTableContent.lineTo(x + w * minusLen * (1 - valueLen), y + h);\r\n                luckysheetTableContent.lineTo(x + w * minusLen, y + h);\r\n                luckysheetTableContent.lineTo(x + w * minusLen, y);\r\n                luckysheetTableContent.lineTo(x + w * minusLen * (1 - valueLen), y);\r\n                luckysheetTableContent.lineWidth = 1;\r\n                luckysheetTableContent.strokeStyle = \"#ff0000\";\r\n                luckysheetTableContent.stroke();\r\n                luckysheetTableContent.closePath();\r\n            } else if (valueType == \"plus\") {\r\n                //正数\r\n                let plusLen = checksCF[\"dataBar\"][\"plusLen\"];\r\n\r\n                if (plusLen == 1) {\r\n                    if (format.length > 1) {\r\n                        //渐变\r\n                        let my_gradient = luckysheetTableContent.createLinearGradient(x, y, x + w * valueLen, y);\r\n                        my_gradient.addColorStop(0, format[0]);\r\n                        my_gradient.addColorStop(1, format[1]);\r\n\r\n                        luckysheetTableContent.fillStyle = my_gradient;\r\n                    } else {\r\n                        //单色\r\n                        luckysheetTableContent.fillStyle = format[0];\r\n                    }\r\n\r\n                    luckysheetTableContent.fillRect(x, y, w * valueLen, h);\r\n\r\n                    luckysheetTableContent.beginPath();\r\n                    luckysheetTableContent.moveTo(x, y);\r\n                    luckysheetTableContent.lineTo(x, y + h);\r\n                    luckysheetTableContent.lineTo(x + w * valueLen, y + h);\r\n                    luckysheetTableContent.lineTo(x + w * valueLen, y);\r\n                    luckysheetTableContent.lineTo(x, y);\r\n                    luckysheetTableContent.lineWidth = 1;\r\n                    luckysheetTableContent.strokeStyle = format[0];\r\n                    luckysheetTableContent.stroke();\r\n                    luckysheetTableContent.closePath();\r\n                } else {\r\n                    let minusLen = checksCF[\"dataBar\"][\"minusLen\"];\r\n\r\n                    if (format.length > 1) {\r\n                        //渐变\r\n                        let my_gradient = luckysheetTableContent.createLinearGradient(\r\n                            x + w * minusLen,\r\n                            y,\r\n                            x + w * minusLen + w * plusLen * valueLen,\r\n                            y,\r\n                        );\r\n                        my_gradient.addColorStop(0, format[0]);\r\n                        my_gradient.addColorStop(1, format[1]);\r\n\r\n                        luckysheetTableContent.fillStyle = my_gradient;\r\n                    } else {\r\n                        //单色\r\n                        luckysheetTableContent.fillStyle = format[0];\r\n                    }\r\n\r\n                    luckysheetTableContent.fillRect(x + w * minusLen, y, w * plusLen * valueLen, h);\r\n\r\n                    luckysheetTableContent.beginPath();\r\n                    luckysheetTableContent.moveTo(x + w * minusLen, y);\r\n                    luckysheetTableContent.lineTo(x + w * minusLen, y + h);\r\n                    luckysheetTableContent.lineTo(x + w * minusLen + w * plusLen * valueLen, y + h);\r\n                    luckysheetTableContent.lineTo(x + w * minusLen + w * plusLen * valueLen, y);\r\n                    luckysheetTableContent.lineTo(x + w * minusLen, y);\r\n                    luckysheetTableContent.lineWidth = 1;\r\n                    luckysheetTableContent.strokeStyle = format[0];\r\n                    luckysheetTableContent.stroke();\r\n                    luckysheetTableContent.closePath();\r\n                }\r\n            }\r\n        }\r\n\r\n        let pos_x = start_c + offsetLeft;\r\n        let pos_y = start_r + offsetTop + 1;\r\n\r\n        luckysheetTableContent.save();\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.rect(pos_x, pos_y, cellWidth, cellHeight);\r\n        luckysheetTableContent.clip();\r\n        luckysheetTableContent.scale(Store.zoomRatio, Store.zoomRatio);\r\n\r\n        let textInfo = getCellTextInfo(cell, luckysheetTableContent, {\r\n            cellWidth: cellWidth,\r\n            cellHeight: cellHeight,\r\n            space_width: space_width,\r\n            space_height: space_height,\r\n            r: r,\r\n            c: c,\r\n        });\r\n\r\n        //若单元格有条件格式图标集\r\n        if (checksCF != null && checksCF[\"icons\"] != null && textInfo.type == \"plain\") {\r\n            let l = checksCF[\"icons\"][\"left\"];\r\n            let t = checksCF[\"icons\"][\"top\"];\r\n\r\n            let value = textInfo.values[0];\r\n            let horizonAlignPos = pos_x + value.left;\r\n            let verticalAlignPos = pos_y + value.top - textInfo.textHeightAll;\r\n\r\n            if (verticalAlign == \"0\") {\r\n                //居中对齐\r\n                verticalAlignPos = pos_y + cellHeight / 2 - textInfo.textHeightAll / 2;\r\n            } else if (verticalAlign == \"1\") {\r\n                //上对齐\r\n                verticalAlignPos = pos_y;\r\n            } else if (verticalAlign == \"2\") {\r\n                //下对齐\r\n                verticalAlignPos = verticalAlignPos - textInfo.desc;\r\n            }\r\n\r\n            verticalAlignPos = verticalAlignPos / Store.zoomRatio;\r\n            horizonAlignPos = horizonAlignPos / Store.zoomRatio;\r\n\r\n            luckysheetTableContent.drawImage(\r\n                luckysheet_CFiconsImg,\r\n                l * 42,\r\n                t * 32,\r\n                32,\r\n                32,\r\n                pos_x / Store.zoomRatio,\r\n                verticalAlignPos,\r\n                textInfo.textHeightAll / Store.zoomRatio,\r\n                textInfo.textHeightAll / Store.zoomRatio,\r\n            );\r\n\r\n            if (horizonAlign != \"0\" && horizonAlign != \"2\") {\r\n                //左对齐时 文本渲染空出一个图标的距离\r\n                horizonAlignPos = horizonAlignPos + textInfo.textHeightAll / Store.zoomRatio;\r\n            }\r\n        }\r\n\r\n        //单元格 文本颜色\r\n        luckysheetTableContent.fillStyle = menuButton.checkstatus(Store.flowdata, r, c, \"fc\");\r\n\r\n        //若单元格有交替颜色 文本颜色\r\n        if (checksAF != null && checksAF[0] != null) {\r\n            luckysheetTableContent.fillStyle = checksAF[0];\r\n        }\r\n        //若单元格有条件格式 文本颜色\r\n        if (checksCF != null && checksCF[\"textColor\"] != null) {\r\n            luckysheetTableContent.fillStyle = checksCF[\"textColor\"];\r\n        }\r\n\r\n        //若单元格格式为自定义数字格式（[red]） 文本颜色为红色\r\n        if (cell.ct && cell.ct.fa && cell.ct.fa.indexOf(\"[Red]\") > -1 && cell.ct.t == \"n\" && cell.v < 0) {\r\n            luckysheetTableContent.fillStyle = \"#ff0000\";\r\n        }\r\n\r\n        cellTextRender(textInfo, luckysheetTableContent, {\r\n            pos_x: pos_x,\r\n            pos_y: pos_y,\r\n        });\r\n\r\n        luckysheetTableContent.restore();\r\n    }\r\n\r\n    if (cellOverflow_bd_r_render) {\r\n        // 右边框\r\n        // 无论是否有背景色，都默认绘制右边框\r\n        if (!Store.luckysheetcurrentisPivotTable && Store.showGridLines) {\r\n            luckysheetTableContent.beginPath();\r\n            luckysheetTableContent.moveTo(end_c + offsetLeft - 2 + bodrder05, start_r + offsetTop);\r\n            luckysheetTableContent.lineTo(end_c + offsetLeft - 2 + bodrder05, end_r + offsetTop);\r\n            luckysheetTableContent.lineWidth = 1;\r\n            luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n            luckysheetTableContent.stroke();\r\n            luckysheetTableContent.closePath();\r\n        }\r\n    }\r\n\r\n    // 下边框\r\n    // 无论是否有背景色，都默认绘制下边框\r\n    if (!Store.luckysheetcurrentisPivotTable && Store.showGridLines) {\r\n        luckysheetTableContent.beginPath();\r\n        luckysheetTableContent.moveTo(start_c + offsetLeft - 1, end_r + offsetTop - 2 + bodrder05);\r\n        luckysheetTableContent.lineTo(end_c + offsetLeft - 1, end_r + offsetTop - 2 + bodrder05);\r\n        luckysheetTableContent.lineWidth = 1;\r\n        luckysheetTableContent.strokeStyle = luckysheetdefaultstyle.strokeStyle;\r\n        luckysheetTableContent.stroke();\r\n        luckysheetTableContent.closePath();\r\n    }\r\n\r\n    // 单元格渲染后\r\n    method.createHookFunction(\r\n        \"cellRenderAfter\",\r\n        Store.flowdata[r][c],\r\n        {\r\n            r: r,\r\n            c: c,\r\n            start_r: cellsize[1],\r\n            start_c: cellsize[0],\r\n            end_r: cellsize[3] + cellsize[1],\r\n            end_c: cellsize[2] + cellsize[0],\r\n        },\r\n        sheetmanage.getSheetByIndex(),\r\n        luckysheetTableContent,\r\n    );\r\n};\r\n\r\n//溢出单元格渲染\r\nlet cellOverflowRender = function(\r\n    r,\r\n    c,\r\n    stc,\r\n    edc,\r\n    luckysheetTableContent,\r\n    scrollHeight,\r\n    scrollWidth,\r\n    offsetLeft,\r\n    offsetTop,\r\n    af_compute,\r\n    cf_compute,\r\n) {\r\n    //溢出单元格 起止行列坐标\r\n    let start_r;\r\n    if (r == 0) {\r\n        start_r = -scrollHeight - 1;\r\n    } else {\r\n        start_r = Store.visibledatarow[r - 1] - scrollHeight - 1;\r\n    }\r\n\r\n    let end_r = Store.visibledatarow[r] - scrollHeight;\r\n\r\n    let start_c;\r\n    if (stc == 0) {\r\n        start_c = -scrollWidth;\r\n    } else {\r\n        start_c = Store.visibledatacolumn[stc - 1] - scrollWidth;\r\n    }\r\n\r\n    let end_c = Store.visibledatacolumn[edc] - scrollWidth;\r\n\r\n    //\r\n    let cell = Store.flowdata[r][c];\r\n    let cellWidth = end_c - start_c - 2;\r\n    let cellHeight = end_r - start_r - 2;\r\n    let space_width = 2,\r\n        space_height = 2; //宽高方向 间隙\r\n\r\n    let pos_x = start_c + offsetLeft;\r\n    let pos_y = start_r + offsetTop + 1;\r\n\r\n    let fontset = luckysheetfontformat(cell);\r\n    luckysheetTableContent.font = fontset;\r\n\r\n    luckysheetTableContent.save();\r\n    luckysheetTableContent.beginPath();\r\n    luckysheetTableContent.rect(pos_x, pos_y, cellWidth, cellHeight);\r\n    luckysheetTableContent.clip();\r\n    luckysheetTableContent.scale(Store.zoomRatio, Store.zoomRatio);\r\n\r\n    let textInfo = getCellTextInfo(cell, luckysheetTableContent, {\r\n        cellWidth: cellWidth,\r\n        cellHeight: cellHeight,\r\n        space_width: space_width,\r\n        space_height: space_height,\r\n        r: r,\r\n        c: c,\r\n    });\r\n\r\n    //交替颜色\r\n    let checksAF = alternateformat.checksAF(r, c, af_compute);\r\n    //条件格式\r\n    let checksCF = conditionformat.checksCF(r, c, cf_compute);\r\n\r\n    //单元格 文本颜色\r\n    luckysheetTableContent.fillStyle = menuButton.checkstatus(Store.flowdata, r, c, \"fc\");\r\n\r\n    //若单元格有交替颜色 文本颜色\r\n    if (checksAF != null && checksAF[0] != null) {\r\n        luckysheetTableContent.fillStyle = checksAF[0];\r\n    }\r\n    //若单元格有条件格式 文本颜色\r\n    if (checksCF != null && checksCF[\"textColor\"] != null) {\r\n        luckysheetTableContent.fillStyle = checksCF[\"textColor\"];\r\n    }\r\n\r\n    cellTextRender(textInfo, luckysheetTableContent, {\r\n        pos_x: pos_x,\r\n        pos_y: pos_y,\r\n    });\r\n\r\n    luckysheetTableContent.restore();\r\n};\r\n\r\n//获取表格渲染范围 溢出单元格\r\nfunction getCellOverflowMap(canvas, col_st, col_ed, row_st, row_end) {\r\n    let map = {};\r\n\r\n    let data = Store.flowdata;\r\n\r\n    for (let r = row_st; r <= row_end; r++) {\r\n        if (data[r] == null) {\r\n            continue;\r\n        }\r\n\r\n        if (Store.cellOverflowMapCache[r] != null) {\r\n            map[r] = Store.cellOverflowMapCache[r];\r\n            continue;\r\n        }\r\n\r\n        let hasCellOver = false;\r\n\r\n        for (let c = 0; c < data[r].length; c++) {\r\n            let cell = data[r][c];\r\n\r\n            // if(Store.cellOverflowMapCache[r + '_' + c]!=null){\r\n            //     map[r + '_' + c] = Store.cellOverflowMapCache[r + '_' + c];\r\n            //     continue;\r\n            // }\r\n\r\n            if (Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c] != null) {\r\n                continue;\r\n            }\r\n\r\n            if (\r\n                cell != null &&\r\n                (!isRealNull(cell.v) || isInlineStringCell(cell)) &&\r\n                cell.mc == null &&\r\n                cell.tb == \"1\"\r\n            ) {\r\n                //水平对齐\r\n                let horizonAlign = menuButton.checkstatus(data, r, c, \"ht\");\r\n\r\n                let textMetricsObj = getCellTextInfo(cell, canvas, {\r\n                    r: r,\r\n                    c: c,\r\n                });\r\n                let textMetrics = 0;\r\n                if (textMetricsObj != null) {\r\n                    textMetrics = textMetricsObj.textWidthAll;\r\n                }\r\n\r\n                //canvas.measureText(value).width;\r\n\r\n                let start_c = c - 1 < 0 ? 0 : Store.visibledatacolumn[c - 1];\r\n                let end_c = Store.visibledatacolumn[c];\r\n\r\n                let stc, edc;\r\n\r\n                if (end_c - start_c < textMetrics) {\r\n                    if (horizonAlign == \"0\") {\r\n                        //居中对齐\r\n                        let trace_forward = cellOverflow_trace(r, c, c - 1, \"forward\", horizonAlign, textMetrics);\r\n                        let trace_backward = cellOverflow_trace(r, c, c + 1, \"backward\", horizonAlign, textMetrics);\r\n\r\n                        if (trace_forward.success) {\r\n                            stc = trace_forward.c;\r\n                        } else {\r\n                            stc = trace_forward.c + 1;\r\n                        }\r\n\r\n                        if (trace_backward.success) {\r\n                            edc = trace_backward.c;\r\n                        } else {\r\n                            edc = trace_backward.c - 1;\r\n                        }\r\n                    } else if (horizonAlign == \"1\") {\r\n                        //左对齐\r\n                        let trace = cellOverflow_trace(r, c, c + 1, \"backward\", horizonAlign, textMetrics);\r\n                        stc = c;\r\n\r\n                        if (trace.success) {\r\n                            edc = trace.c;\r\n                        } else {\r\n                            edc = trace.c - 1;\r\n                        }\r\n                    } else if (horizonAlign == \"2\") {\r\n                        //右对齐\r\n                        let trace = cellOverflow_trace(r, c, c - 1, \"forward\", horizonAlign, textMetrics);\r\n                        edc = c;\r\n\r\n                        if (trace.success) {\r\n                            stc = trace.c;\r\n                        } else {\r\n                            stc = trace.c + 1;\r\n                        }\r\n                    }\r\n                } else {\r\n                    stc = c;\r\n                    edc = c;\r\n                }\r\n\r\n                // if(((stc >= col_st && stc <= col_ed) || (edc >= col_st && edc <= col_ed)) && stc < edc){\r\n                if ((stc <= col_ed || edc >= col_st) && stc < edc) {\r\n                    let item = {\r\n                        r: r,\r\n                        stc: stc,\r\n                        edc: edc,\r\n                    };\r\n\r\n                    if (map[r] == null) {\r\n                        map[r] = {};\r\n                    }\r\n\r\n                    map[r][c] = item;\r\n\r\n                    // Store.cellOverflowMapCache[r + '_' + c] = item;\r\n\r\n                    hasCellOver = true;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (hasCellOver) {\r\n            Store.cellOverflowMapCache[r] = map[r];\r\n        }\r\n    }\r\n\r\n    return map;\r\n}\r\n\r\nfunction cellOverflow_trace(r, curC, traceC, traceDir, horizonAlign, textMetrics) {\r\n    let data = Store.flowdata;\r\n\r\n    //追溯单元格列超出数组范围 则追溯终止\r\n    if (traceDir == \"forward\" && traceC < 0) {\r\n        return {\r\n            success: false,\r\n            r: r,\r\n            c: traceC,\r\n        };\r\n    }\r\n\r\n    if (traceDir == \"backward\" && traceC > data[r].length - 1) {\r\n        return {\r\n            success: false,\r\n            r: r,\r\n            c: traceC,\r\n        };\r\n    }\r\n\r\n    //追溯单元格是 非空单元格或合并单元格 则追溯终止\r\n    let cell = data[r][traceC];\r\n    if (cell != null && (!isRealNull(cell.v) || cell.mc != null)) {\r\n        return {\r\n            success: false,\r\n            r: r,\r\n            c: traceC,\r\n        };\r\n    }\r\n\r\n    let start_curC = curC - 1 < 0 ? 0 : Store.visibledatacolumn[curC - 1];\r\n    let end_curC = Store.visibledatacolumn[curC];\r\n\r\n    let w = textMetrics - (end_curC - start_curC);\r\n\r\n    if (horizonAlign == \"0\") {\r\n        //居中对齐\r\n        start_curC -= w / 2;\r\n        end_curC += w / 2;\r\n    } else if (horizonAlign == \"1\") {\r\n        //左对齐\r\n        end_curC += w;\r\n    } else if (horizonAlign == \"2\") {\r\n        //右对齐\r\n        start_curC -= w;\r\n    }\r\n\r\n    let start_traceC = traceC - 1 < 0 ? 0 : Store.visibledatacolumn[traceC - 1];\r\n    let end_traceC = Store.visibledatacolumn[traceC];\r\n\r\n    if (traceDir == \"forward\") {\r\n        if (start_curC < start_traceC) {\r\n            return cellOverflow_trace(r, curC, traceC - 1, traceDir, horizonAlign, textMetrics);\r\n        } else if (start_curC < end_traceC) {\r\n            return {\r\n                success: true,\r\n                r: r,\r\n                c: traceC,\r\n            };\r\n        } else {\r\n            return {\r\n                success: false,\r\n                r: r,\r\n                c: traceC,\r\n            };\r\n        }\r\n    }\r\n\r\n    if (traceDir == \"backward\") {\r\n        if (end_curC > end_traceC) {\r\n            return cellOverflow_trace(r, curC, traceC + 1, traceDir, horizonAlign, textMetrics);\r\n        } else if (end_curC > start_traceC) {\r\n            return {\r\n                success: true,\r\n                r: r,\r\n                c: traceC,\r\n            };\r\n        } else {\r\n            return {\r\n                success: false,\r\n                r: r,\r\n                c: traceC,\r\n            };\r\n        }\r\n    }\r\n}\r\n\r\nfunction cellOverflow_colIn(map, r, c, col_st, col_ed) {\r\n    let colIn = false, //此单元格 是否在 某个溢出单元格的渲染范围\r\n        colLast = false, //此单元格 是否是 某个溢出单元格的渲染范围的最后一列\r\n        rowIndex, //溢出单元格 行下标\r\n        colIndex, //溢出单元格 列下标\r\n        stc,\r\n        edc;\r\n\r\n    for (let rkey in map) {\r\n        for (let ckey in map[rkey]) {\r\n            rowIndex = rkey;\r\n            colIndex = ckey;\r\n            // rowIndex = key.substr(0, key.indexOf('_'));\r\n            // colIndex = key.substr(key.indexOf('_') + 1);\r\n            let mapItem = map[rkey][ckey];\r\n            stc = mapItem.stc;\r\n            edc = mapItem.edc;\r\n\r\n            if (rowIndex == r) {\r\n                if (c >= stc && c <= edc) {\r\n                    colIn = true;\r\n\r\n                    if (c == edc || c == col_ed) {\r\n                        colLast = true;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        if (colLast) {\r\n            break;\r\n        }\r\n    }\r\n\r\n    return {\r\n        colIn: colIn,\r\n        colLast: colLast,\r\n        rowIndex: rowIndex,\r\n        colIndex: colIndex,\r\n        stc: stc,\r\n        edc: edc,\r\n    };\r\n}\r\n\r\nfunction cellTextRender(textInfo, ctx, option) {\r\n    if (textInfo == null) {\r\n        return;\r\n    }\r\n    let values = textInfo.values;\r\n    let pos_x = option.pos_x,\r\n        pos_y = option.pos_y;\r\n    if (values == null) {\r\n        return;\r\n    }\r\n    // console.log(textInfo, pos_x, pos_y, values[0].width, values[0].left, ctx);\r\n\r\n    // for(let i=0;i<values.length;i++){\r\n    //     let word = values[i];\r\n    //     ctx.font = word.style;\r\n    //     ctx.fillText(word.content, (pos_x + word.left)/Store.zoomRatio, (pos_y+word.top)/Store.zoomRatio);\r\n    // }\r\n\r\n    // ctx.fillStyle = \"rgba(255,255,0,0.2)\";\r\n    // ctx.fillRect((pos_x + values[0].left)/Store.zoomRatio, (pos_y+values[0].top-values[0].asc)/Store.zoomRatio, textInfo.textWidthAll, textInfo.textHeightAll)\r\n\r\n    if (textInfo.rotate != 0 && textInfo.type != \"verticalWrap\") {\r\n        ctx.save();\r\n        ctx.translate(\r\n            (pos_x + textInfo.textLeftAll) / Store.zoomRatio,\r\n            (pos_y + textInfo.textTopAll) / Store.zoomRatio,\r\n        );\r\n        ctx.rotate((-textInfo.rotate * Math.PI) / 180);\r\n        ctx.translate(\r\n            -(textInfo.textLeftAll + pos_x) / Store.zoomRatio,\r\n            -(pos_y + textInfo.textTopAll) / Store.zoomRatio,\r\n        );\r\n    }\r\n\r\n    // ctx.fillStyle = \"rgb(0,0,0)\";\r\n    for (let i = 0; i < values.length; i++) {\r\n        let word = values[i];\r\n        if (word.inline === true && word.style != null) {\r\n            ctx.font = word.style.fontset;\r\n            ctx.fillStyle = word.style.fc;\r\n        } else {\r\n            ctx.font = word.style;\r\n        }\r\n\r\n        // 暂时未排查到word.content第一次会是object，先做下判断来渲染，后续找到问题再复原\r\n        let txt = typeof word.content === \"object\" ? word.content.m : word.content;\r\n        ctx.fillText(txt, (pos_x + word.left) / Store.zoomRatio, (pos_y + word.top) / Store.zoomRatio);\r\n\r\n        if (word.cancelLine != null) {\r\n            let c = word.cancelLine;\r\n            ctx.beginPath();\r\n            ctx.moveTo(\r\n                Math.floor((pos_x + c.startX) / Store.zoomRatio) + 0.5,\r\n                Math.floor((pos_y + c.startY) / Store.zoomRatio) + 0.5,\r\n            );\r\n            ctx.lineTo(\r\n                Math.floor((pos_x + c.endX) / Store.zoomRatio) + 0.5,\r\n                Math.floor((pos_y + c.endY) / Store.zoomRatio) + 0.5,\r\n            );\r\n            ctx.lineWidth = Math.floor(c.fs / 9);\r\n            ctx.strokeStyle = ctx.fillStyle;\r\n            ctx.stroke();\r\n            ctx.closePath();\r\n        }\r\n\r\n        if (word.underLine != null) {\r\n            let underLines = word.underLine;\r\n            for (let a = 0; a < underLines.length; a++) {\r\n                let item = underLines[a];\r\n                ctx.beginPath();\r\n                ctx.moveTo(\r\n                    Math.floor((pos_x + item.startX) / Store.zoomRatio) + 0.5,\r\n                    Math.floor((pos_y + item.startY) / Store.zoomRatio),\r\n                );\r\n                ctx.lineTo(\r\n                    Math.floor((pos_x + item.endX) / Store.zoomRatio) + 0.5,\r\n                    Math.floor((pos_y + item.endY) / Store.zoomRatio) + 0.5,\r\n                );\r\n                ctx.lineWidth = Math.floor(item.fs / 9);\r\n                ctx.strokeStyle = ctx.fillStyle;\r\n                ctx.stroke();\r\n                ctx.closePath();\r\n            }\r\n        }\r\n    }\r\n    // ctx.fillStyle = \"rgba(0,0,0,0.2)\";\r\n    // ctx.fillRect((pos_x + values[0].left)/Store.zoomRatio, (pos_y+values[0].top-values[0].asc)/Store.zoomRatio, textInfo.textWidthAll, textInfo.textHeightAll)\r\n    // ctx.fillStyle = \"rgba(255,0,0,1)\";\r\n    // ctx.fillRect(pos_x+textInfo.textLeftAll-2, pos_y+textInfo.textTopAll-2, 4,4);\r\n    if (textInfo.rotate != 0 && textInfo.type != \"verticalWrap\") {\r\n        ctx.restore();\r\n    }\r\n}\r\n\r\nexport {\r\n    luckysheetDrawgridRowTitle,\r\n    luckysheetDrawgridColumnTitle,\r\n    luckysheetDrawMain,\r\n    getCellOverflowMap,\r\n    sparklinesRender,\r\n    cellOverflow_colIn,\r\n    cellOverflowRender,\r\n    cellTextRender,\r\n};\r\n"
  },
  {
    "path": "src/global/dynamicArray.js",
    "content": "import { getObjType } from '../utils/util';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport Store from '../store';\r\n\r\n//动态数组计算\r\nfunction dynamicArrayCompute(dynamicArray) {\r\n    let dynamicArray_compute = {};\r\n\r\n    if(getObjType(dynamicArray) == \"array\"){\r\n        for(let i = 0; i < dynamicArray.length; i++){\r\n            let d_row = dynamicArray[i].r;\r\n            let d_col = dynamicArray[i].c;\r\n            let d_f = dynamicArray[i].f;\r\n            \r\n            if(Store.flowdata[d_row][d_col] != null && Store.flowdata[d_row][d_col].f != null && Store.flowdata[d_row][d_col].f == d_f){\r\n                if((d_row + \"_\" + d_col) in dynamicArray_compute){\r\n                    dynamicArray_compute = dynamicArraySpillEditCompute(dynamicArray_compute, d_row , d_col);\r\n                }\r\n\r\n                let d_data = dynamicArray[i].data;\r\n                let d_rowlen = d_data.length;\r\n                let d_collen = 1;\r\n\r\n                if(getObjType(d_data[0]) == \"array\"){\r\n                    d_collen = d_data[0].length;\r\n                }\r\n\r\n                if(dynamicArrayRangeIsAllNull({ \"row\": [d_row, d_row + d_rowlen - 1], \"column\": [d_col, d_col + d_collen - 1] }, Store.flowdata)){\r\n                    for(let x = 0; x < d_rowlen; x++){\r\n                        for(let y = 0; y < d_collen; y++){\r\n                            let rowIndex = d_row + x;\r\n                            let colIndex = d_col + y;\r\n\r\n                            if(getObjType(d_data[0]) == \"array\"){\r\n                                dynamicArray_compute[rowIndex + \"_\" + colIndex] = {\"v\": d_data[x][y], \"r\": d_row, \"c\": d_col};\r\n                            }\r\n                            else{\r\n                                dynamicArray_compute[rowIndex + \"_\" + colIndex] = {\"v\": d_data[x], \"r\": d_row, \"c\": d_col};\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    dynamicArray_compute[d_row + \"_\" + d_col] = {\"v\": \"#SPILL!\", \"r\": d_row, \"c\": d_col};\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return dynamicArray_compute;       \r\n}\r\n\r\nfunction dynamicArraySpillEditCompute(computeObj, r, c) {\r\n    let rowIndex = computeObj[r + \"_\" + c].r;\r\n    let colIndex = computeObj[r + \"_\" + c].c;\r\n\r\n    for(let x in computeObj){\r\n        if(x == (rowIndex + \"_\" + colIndex)){\r\n            computeObj[x].v = \"#SPILL!\";\r\n        }\r\n        else if(computeObj[x].r == rowIndex && computeObj[x].c == colIndex){\r\n            delete computeObj[x];\r\n        }\r\n    }\r\n\r\n    return computeObj;\r\n}\r\n\r\n//范围是否都是空单元格(除第一个单元格)\r\nfunction dynamicArrayRangeIsAllNull(range, data) {\r\n    let r1 = range[\"row\"][0], r2 = range[\"row\"][1];\r\n    let c1 = range[\"column\"][0], c2 = range[\"column\"][1];\r\n\r\n    let isAllNull = true;\r\n    for(let r = r1; r <= r2; r++){\r\n        for(let c = c1; c <= c2; c++){\r\n            if(!(r == r1 && c == c1) && data[r][c] != null && data[r][c].v != null && data[r][c].v.toString() != \"\"){\r\n                isAllNull = false;\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    return isAllNull;\r\n}\r\n\r\n//点击表格区域是否属于动态数组区域\r\nfunction dynamicArrayHightShow(r, c) {\r\n    let dynamicArray = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray\"] == null ? [] : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray\"];\r\n    let dynamicArray_compute = dynamicArrayCompute(dynamicArray);\r\n\r\n    if((r + \"_\" + c) in dynamicArray_compute && dynamicArray_compute[r + \"_\" + c].v != \"#SPILL!\"){\r\n        let d_row = dynamicArray_compute[r + \"_\" + c].r;\r\n        let d_col = dynamicArray_compute[r + \"_\" + c].c;\r\n\r\n        let d_f = Store.flowdata[d_row][d_col].f;\r\n\r\n        let rlen, clen;\r\n        for(let i = 0; i < dynamicArray.length; i++){\r\n            if(dynamicArray[i].f == d_f){\r\n                rlen = dynamicArray[i].data.length;\r\n\r\n                if(getObjType(dynamicArray[i].data[0]) == \"array\"){\r\n                    clen = dynamicArray[i].data[0].length;\r\n                }\r\n                else{\r\n                    clen = 1;\r\n                }\r\n            }\r\n        }\r\n\r\n        let d_row_end = d_row + rlen - 1;\r\n        let d_col_end = d_col + clen - 1;\r\n\r\n        let row = Store.visibledatarow[d_row_end], \r\n            row_pre = d_row - 1 == -1 ? 0 : Store.visibledatarow[d_row - 1];\r\n        let col = Store.visibledatacolumn[d_col_end], \r\n            col_pre = d_col - 1 == -1 ? 0 : Store.visibledatacolumn[d_col - 1];\r\n\r\n        $(\"#luckysheet-dynamicArray-hightShow\").css({ \r\n            \"left\": col_pre, \r\n            \"width\": col - col_pre - 1, \r\n            \"top\": row_pre, \r\n            \"height\": row - row_pre - 1, \r\n            \"display\": \"block\" \r\n        });\r\n    }\r\n    else{\r\n        $(\"#luckysheet-dynamicArray-hightShow\").hide();\r\n    }\r\n}\r\n\r\nexport {\r\n    dynamicArrayCompute,\r\n    dynamicArraySpillEditCompute,\r\n    dynamicArrayRangeIsAllNull,\r\n    dynamicArrayHightShow,\r\n}"
  },
  {
    "path": "src/global/editor.js",
    "content": "import browser from './browser';\r\nimport formula from './formula';\r\nimport { datagridgrowth } from './getdata';\r\nimport { jfrefreshgrid, jfrefreshgridall, jfrefreshrange } from './refresh';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport Store from '../store';\r\n\r\nconst editor = {\r\n    //worker+blob实现深拷贝替换extend\r\n    deepCopyFlowDataState:false,\r\n    deepCopyFlowDataCache:\"\",\r\n    deepCopyFlowDataWorker:null,\r\n    deepCopyFlowData:function(flowData){\r\n        let _this = this;\r\n\r\n        if(_this.deepCopyFlowDataState){\r\n            if(_this.deepCopyFlowDataWorker != null){\r\n                _this.deepCopyFlowDataWorker.terminate();  \r\n            }\r\n            return _this.deepCopyFlowDataCache;\r\n        }\r\n        else{\r\n            if(flowData == null){\r\n                flowData = Store.flowdata;\r\n            }\r\n\r\n            return $.extend(true, [], flowData);\r\n        }\r\n    },\r\n    webWorkerFlowDataCache:function(flowData){\r\n        let _this = this;\r\n\r\n        try{\r\n            if(_this.deepCopyFlowDataWorker != null){//存新的webwork前先销毁以前的\r\n                _this.deepCopyFlowDataWorker.terminate();\r\n            }\r\n\r\n            let funcTxt = 'data:text/javascript;chartset=US-ASCII,onmessage = function (e) { postMessage(e.data); };';\r\n            _this.deepCopyFlowDataState = false;\r\n\r\n            //适配IE\r\n            let worker;\r\n            if(browser.isIE() == 1){\r\n                let response = \"self.onmessage=function(e){postMessage(e.data);}\";\r\n                worker = new Worker('./plugins/Worker-helper.js');\r\n                worker.postMessage(response);\r\n            }\r\n            else{\r\n                worker = new Worker(funcTxt);\r\n            }\r\n\r\n            _this.deepCopyFlowDataWorker = worker;\r\n            worker.postMessage(flowData);\r\n            worker.onmessage = function(e) { \r\n                _this.deepCopyFlowDataCache = e.data;\r\n                _this.deepCopyFlowDataState = true;\r\n            };\r\n        }\r\n        catch(e){\r\n            _this.deepCopyFlowDataCache = $.extend(true, [], flowData);\r\n        }\r\n    },\r\n\r\n    /**\r\n     * @param {Array} dataChe \r\n     * @param {Object} range 是否指定选区，默认为当前选区\r\n     * @since Add range parameter. Update by siwei@2020-09-10. \r\n     */\r\n    controlHandler: function (dataChe, range) {\r\n        let _this = this;\r\n\r\n        let d = _this.deepCopyFlowData(Store.flowdata);//取数据\r\n\r\n        // let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let last = range || Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let curR = last[\"row\"] == null ? 0 : last[\"row\"][0];\r\n        let curC = last[\"column\"] == null ? 0 : last[\"column\"][0];\r\n        let rlen = dataChe.length, clen = dataChe[0].length;\r\n\r\n        let addr = curR + rlen - d.length, addc = curC + clen - d[0].length;\r\n        if(addr > 0 || addc > 0){\r\n            d = datagridgrowth([].concat(d), addr, addc, true);\r\n        }\r\n\r\n        for (let r = 0; r < rlen; r++) {\r\n            let x = [].concat(d[r + curR]);\r\n            for (let c = 0; c < clen; c++) {\r\n                let value = \"\";\r\n                if (dataChe[r] != null && dataChe[r][c] != null) {\r\n                    value = dataChe[r][c];\r\n                }\r\n                x[c + curC] = value;\r\n            }\r\n            d[r + curR] = x;\r\n        }\r\n\r\n        if (addr > 0 || addc > 0) {\r\n            jfrefreshgridall(d[0].length, d.length, d, null, Store.luckysheet_select_save, \"datachangeAll\");\r\n        }\r\n        else {\r\n            jfrefreshrange(d, Store.luckysheet_select_save);\r\n        }\r\n    },\r\n    clearRangeByindex: function (st_r, ed_r, st_c, ed_c, sheetIndex) {\r\n        let index = getSheetIndex(sheetIndex);\r\n        let d = $.extend(true, [], Store.luckysheetfile[index][\"data\"]);\r\n        \r\n        for (let r = st_r; r <= ed_r; r++) {\r\n            let x = [].concat(d[r]);\r\n            for (let c = st_c; c <= ed_c; c++) {\r\n                formula.delFunctionGroup(r, c);\r\n                formula.execFunctionGroup(r, c, \"\");\r\n                x[c] = null;\r\n            }\r\n            d[r] = x;\r\n        }\r\n\r\n        if(sheetIndex == Store.currentSheetIndex){\r\n            let rlen = ed_r - st_r + 1, \r\n                clen = ed_c - st_c + 1;\r\n            \r\n            if (rlen > 5000) {\r\n                jfrefreshgrid(d, [{ \"row\": [st_r, ed_r], \"column\": [st_c, ed_c] }]);\r\n            }\r\n            else {\r\n                jfrefreshrange(d, { \"row\": [st_r, ed_r], \"column\": [st_c, ed_c] });\r\n            }\r\n        }\r\n        else{\r\n            Store.luckysheetfile[index][\"data\"] = d;\r\n        }\r\n    },\r\n    controlHandlerD: function (dataChe) {\r\n        let _this = this;\r\n\r\n        let d = _this.deepCopyFlowData(Store.flowdata);//取数据\r\n\r\n        let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];\r\n        let r1 = last[\"row\"][0], r2 = last[\"row\"][1];\r\n        let c1 = last[\"column\"][0], c2 = last[\"column\"][1];\r\n        let rlen = dataChe.length, clen = dataChe[0].length;\r\n\r\n        let addr = r1 + rlen - d.length, addc = c1 + clen - d[0].length;\r\n        if(addr >0 || addc > 0){\r\n            d = datagridgrowth([].concat(d), addr, addc, true);\r\n        }\r\n\r\n        for(let r = r1; r <= r2; r++){\r\n            for(let c = c1; c <= c2; c++){\r\n                d[r][c] = null;\r\n            }\r\n        }\r\n\r\n        for(let i = 0; i < rlen; i++){\r\n            for(let j = 0; j < clen; j++){\r\n                d[r1 + i][c1 + j] = dataChe[i][j];\r\n            }\r\n        }\r\n\r\n        let range = [\r\n            { \"row\": [r1, r2], \"column\": [c1, c2] },\r\n            { \"row\": [r1, r1 + rlen - 1], \"column\": [c1, c1 + clen - 1] }\r\n        ];\r\n\r\n        jfrefreshgrid(d, range);\r\n    }\r\n};\r\n\r\nexport default editor;"
  },
  {
    "path": "src/global/extend.js",
    "content": "import editor from \"./editor\";\r\nimport formula from \"./formula\";\r\nimport { jfrefreshgrid_adRC, jfrefreshgrid_deleteCell, jfrefreshgrid_rhcw } from \"./refresh\";\r\nimport { datagridgrowth, getcellFormula } from \"./getdata\";\r\nimport { setcellvalue } from \"./setdata\";\r\nimport conditionformat from \"../controllers/conditionformat\";\r\nimport luckysheetFreezen from \"../controllers/freezen\";\r\nimport { selectHightlightShow } from \"../controllers/select\";\r\nimport { luckysheet_searcharray } from \"../controllers/sheetSearch\";\r\nimport { checkProtectionAuthorityNormal, checkProtectionNotEnable } from \"../controllers/protection\";\r\nimport { getSheetIndex } from \"../methods/get\";\r\nimport Store from \"../store\";\r\nimport method from \"./method\";\r\n\r\n/**\r\n * 增加行列\r\n * @param {string} type 行或列 ['row', 'column'] 之一\r\n * @param {number} index 插入的位置 index\r\n * @param {number} value 插入 多少 行（列）\r\n * @param {string} direction 哪个方向插入 ['lefttop','rightbottom'] 之一\r\n * @param {string | number} sheetIndex 操作的 sheet 的 index 属性\r\n * @returns\r\n */\r\nfunction luckysheetextendtable(type, index, value, direction, sheetIndex) {\r\n    sheetIndex = sheetIndex ?? Store.currentSheetIndex;\r\n\r\n    if (type == \"row\" && !checkProtectionAuthorityNormal(sheetIndex, \"insertRows\")) {\r\n        return;\r\n    } else if (type == \"column\" && !checkProtectionAuthorityNormal(sheetIndex, \"insertColumns\")) {\r\n        return;\r\n    }\r\n\r\n    let curOrder = getSheetIndex(sheetIndex);\r\n    let file = Store.luckysheetfile[curOrder];\r\n    let d = $.extend(true, [], file.data);\r\n\r\n    value = Math.floor(value);\r\n    let cfg = $.extend(true, {}, file.config);\r\n\r\n    //合并单元格配置变动\r\n    if (cfg[\"merge\"] == null) {\r\n        cfg[\"merge\"] = {};\r\n    }\r\n\r\n    let merge_new = {};\r\n    for (let m in cfg[\"merge\"]) {\r\n        let mc = cfg[\"merge\"][m];\r\n\r\n        let r = mc.r,\r\n            c = mc.c,\r\n            rs = mc.rs,\r\n            cs = mc.cs;\r\n\r\n        if (type == \"row\") {\r\n            if (index < r) {\r\n                merge_new[r + value + \"_\" + c] = { r: r + value, c: c, rs: rs, cs: cs };\r\n            }\r\n            // *这里要判断一下rs是否等于1,因为如果这个合并单元格的行数只有一行时r = r+ rs-1,这种情况不应该进行单元格的加高\r\n            else if (index == r && rs != 1) {\r\n                if (direction == \"lefttop\") {\r\n                    merge_new[r + value + \"_\" + c] = { r: r + value, c: c, rs: rs, cs: cs };\r\n                } else {\r\n                    merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs + value, cs: cs };\r\n                }\r\n            } else if (index < r + rs - 1) {\r\n                merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs + value, cs: cs };\r\n            } else if (index == r + rs - 1) {\r\n                if (direction == \"lefttop\") {\r\n                    if (rs == 1) {\r\n                        merge_new[r + value + \"_\" + c] = { r: r + value, c: c, rs: rs, cs: cs };\r\n                    } else {\r\n                        merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs + value, cs: cs };\r\n                    }\r\n                } else {\r\n                    merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs, cs: cs };\r\n                }\r\n            } else {\r\n                merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs, cs: cs };\r\n            }\r\n        } else if (type == \"column\") {\r\n            if (index < c) {\r\n                merge_new[r + \"_\" + (c + value)] = { r: r, c: c + value, rs: rs, cs: cs };\r\n            } else if (index == c && cs != 1) {\r\n                if (direction == \"lefttop\") {\r\n                    merge_new[r + \"_\" + (c + value)] = { r: r, c: c + value, rs: rs, cs: cs };\r\n                } else {\r\n                    merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs, cs: cs + value };\r\n                }\r\n            } else if (index < c + cs - 1) {\r\n                merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs, cs: cs + value };\r\n            } else if (index == c + cs - 1) {\r\n                if (direction == \"lefttop\") {\r\n                    // *这是要判断一下这个合并单元格的列宽是否=1,如果cs等于1的情况下,向左插入列，这个合并单元格会右移\r\n                    if (cs == 1) {\r\n                        merge_new[r + \"_\" + (c + value)] = { r: r, c: c + value, rs: rs, cs: cs };\r\n                    } else {\r\n                        merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs, cs: cs + value };\r\n                    }\r\n                } else {\r\n                    merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs, cs: cs };\r\n                }\r\n            } else {\r\n                merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs, cs: cs };\r\n            }\r\n        }\r\n    }\r\n    cfg[\"merge\"] = merge_new;\r\n\r\n    //公式配置变动\r\n    let calcChain = file.calcChain;\r\n    let newCalcChain = [];\r\n    if (calcChain != null && calcChain.length > 0) {\r\n        for (let i = 0; i < calcChain.length; i++) {\r\n            let calc = $.extend(true, {}, calcChain[i]);\r\n            let calc_r = calc.r,\r\n                calc_c = calc.c,\r\n                calc_i = calc.index,\r\n                calc_funcStr = getcellFormula(calc_r, calc_c, calc_i);\r\n\r\n                // 添加进公式后，可能又直接覆盖了单元格值\r\n                if(!calc_funcStr) continue\r\n\r\n            if (type == \"row\") {\r\n                let functionStr = \"=\" + formula.functionStrChange(calc_funcStr, \"add\", \"row\", direction, index, value);\r\n\r\n                if (d[calc_r][calc_c] && d[calc_r][calc_c].f == calc_funcStr) {\r\n                    d[calc_r][calc_c].f = functionStr;\r\n                }\r\n\r\n                if (direction == \"lefttop\") {\r\n                    if (calc_r >= index) {\r\n                        calc.r += value;\r\n                    }\r\n                } else if (direction == \"rightbottom\") {\r\n                    if (calc_r > index) {\r\n                        calc.r += value;\r\n                    }\r\n                }\r\n\r\n                newCalcChain.push(calc);\r\n            } else if (type == \"column\") {\r\n                let functionStr = \"=\" + formula.functionStrChange(calc_funcStr, \"add\", \"col\", direction, index, value);\r\n\r\n                if (d[calc_r][calc_c] && d[calc_r][calc_c].f == calc_funcStr) {\r\n                    d[calc_r][calc_c].f = functionStr;\r\n                }\r\n\r\n                if (direction == \"lefttop\") {\r\n                    if (calc_c >= index) {\r\n                        calc.c += value;\r\n                    }\r\n                } else if (direction == \"rightbottom\") {\r\n                    if (calc_c > index) {\r\n                        calc.c += value;\r\n                    }\r\n                }\r\n\r\n                newCalcChain.push(calc);\r\n            }\r\n        }\r\n    }\r\n\r\n    //筛选配置变动\r\n    let filter_select = file.filter_select;\r\n    let filter = file.filter;\r\n    let newFilterObj = null;\r\n    if (filter_select != null && JSON.stringify(filter_select) != \"{}\") {\r\n        newFilterObj = { filter_select: null, filter: null };\r\n\r\n        let f_r1 = filter_select.row[0],\r\n            f_r2 = filter_select.row[1];\r\n        let f_c1 = filter_select.column[0],\r\n            f_c2 = filter_select.column[1];\r\n\r\n        if (type == \"row\") {\r\n            if (f_r1 < index) {\r\n                if (f_r2 == index && direction == \"lefttop\") {\r\n                    f_r2 += value;\r\n                } else if (f_r2 > index) {\r\n                    f_r2 += value;\r\n                }\r\n            } else if (f_r1 == index) {\r\n                if (direction == \"lefttop\") {\r\n                    f_r1 += value;\r\n                    f_r2 += value;\r\n                } else if (direction == \"rightbottom\" && f_r2 > index) {\r\n                    f_r2 += value;\r\n                }\r\n            } else {\r\n                f_r1 += value;\r\n                f_r2 += value;\r\n            }\r\n\r\n            if (filter != null) {\r\n                newFilterObj.filter = {};\r\n\r\n                for (let k in filter) {\r\n                    let f_rowhidden = filter[k].rowhidden;\r\n                    let f_rowhidden_new = {};\r\n\r\n                    for (let n in f_rowhidden) {\r\n                        n = parseFloat(n);\r\n\r\n                        if (n < index) {\r\n                            f_rowhidden_new[n] = 0;\r\n                        } else if (n == index) {\r\n                            if (direction == \"lefttop\") {\r\n                                f_rowhidden_new[n + value] = 0;\r\n                            } else if (direction == \"rightbottom\") {\r\n                                f_rowhidden_new[n] = 0;\r\n                            }\r\n                        } else {\r\n                            f_rowhidden_new[n + value] = 0;\r\n                        }\r\n                    }\r\n\r\n                    newFilterObj.filter[k] = $.extend(true, {}, filter[k]);\r\n                    newFilterObj.filter[k].rowhidden = f_rowhidden_new;\r\n                    newFilterObj.filter[k].str = f_r1;\r\n                    newFilterObj.filter[k].edr = f_r2;\r\n                }\r\n            }\r\n        } else if (type == \"column\") {\r\n            if (f_c1 < index) {\r\n                if (f_c2 == index && direction == \"lefttop\") {\r\n                    f_c2 += value;\r\n                } else if (f_c2 > index) {\r\n                    f_c2 += value;\r\n                }\r\n            } else if (f_c1 == index) {\r\n                if (direction == \"lefttop\") {\r\n                    f_c1 += value;\r\n                    f_c2 += value;\r\n                } else if (direction == \"rightbottom\" && f_c2 > index) {\r\n                    f_c2 += value;\r\n                }\r\n            } else {\r\n                f_c1 += value;\r\n                f_c2 += value;\r\n            }\r\n\r\n            if (filter != null) {\r\n                newFilterObj.filter = {};\r\n\r\n                for (let k in filter) {\r\n                    let f_cindex = filter[k].cindex;\r\n\r\n                    if (f_cindex == index && direction == \"lefttop\") {\r\n                        f_cindex += value;\r\n                    } else if (f_cindex > index) {\r\n                        f_cindex += value;\r\n                    }\r\n\r\n                    newFilterObj.filter[f_cindex - f_c1] = $.extend(true, {}, filter[k]);\r\n                    newFilterObj.filter[f_cindex - f_c1].cindex = f_cindex;\r\n                    newFilterObj.filter[f_cindex - f_c1].stc = f_c1;\r\n                    newFilterObj.filter[f_cindex - f_c1].edc = f_c2;\r\n                }\r\n            }\r\n        }\r\n\r\n        newFilterObj.filter_select = { row: [f_r1, f_r2], column: [f_c1, f_c2] };\r\n    }\r\n\r\n    if (newFilterObj != null && newFilterObj.filter != null) {\r\n        if (cfg[\"rowhidden\"] == null) {\r\n            cfg[\"rowhidden\"] = {};\r\n        }\r\n\r\n        for (let k in newFilterObj.filter) {\r\n            let f_rowhidden = newFilterObj.filter[k].rowhidden;\r\n\r\n            for (let n in f_rowhidden) {\r\n                cfg[\"rowhidden\"][n] = 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    //条件格式配置变动\r\n    let CFarr = file.luckysheet_conditionformat_save;\r\n    let newCFarr = [];\r\n    if (CFarr != null && CFarr.length > 0) {\r\n        for (let i = 0; i < CFarr.length; i++) {\r\n            let cf_range = CFarr[i].cellrange;\r\n            let cf_new_range = [];\r\n\r\n            for (let j = 0; j < cf_range.length; j++) {\r\n                let CFr1 = cf_range[j].row[0],\r\n                    CFr2 = cf_range[j].row[1],\r\n                    CFc1 = cf_range[j].column[0],\r\n                    CFc2 = cf_range[j].column[1];\r\n\r\n                if (type == \"row\") {\r\n                    if (CFr1 < index) {\r\n                        if (CFr2 == index && direction == \"lefttop\") {\r\n                            CFr2 += value;\r\n                        } else if (CFr2 > index) {\r\n                            CFr2 += value;\r\n                        }\r\n                    } else if (CFr1 == index) {\r\n                        if (direction == \"lefttop\") {\r\n                            CFr1 += value;\r\n                            CFr2 += value;\r\n                        } else if (direction == \"rightbottom\" && CFr2 > index) {\r\n                            CFr2 += value;\r\n                        }\r\n                    } else {\r\n                        CFr1 += value;\r\n                        CFr2 += value;\r\n                    }\r\n                } else if (type == \"column\") {\r\n                    if (CFc1 < index) {\r\n                        if (CFc2 == index && direction == \"lefttop\") {\r\n                            CFc2 += value;\r\n                        } else if (CFc2 > index) {\r\n                            CFc2 += value;\r\n                        }\r\n                    } else if (CFc1 == index) {\r\n                        if (direction == \"lefttop\") {\r\n                            CFc1 += value;\r\n                            CFc2 += value;\r\n                        } else if (direction == \"rightbottom\" && CFc2 > index) {\r\n                            CFc2 += value;\r\n                        }\r\n                    } else {\r\n                        CFc1 += value;\r\n                        CFc2 += value;\r\n                    }\r\n                }\r\n\r\n                cf_new_range.push({ row: [CFr1, CFr2], column: [CFc1, CFc2] });\r\n            }\r\n\r\n            let cf = $.extend(true, {}, CFarr[i]);\r\n            cf.cellrange = cf_new_range;\r\n\r\n            newCFarr.push(cf);\r\n        }\r\n    }\r\n\r\n    //交替颜色配置变动\r\n    let AFarr = file.luckysheet_alternateformat_save;\r\n    let newAFarr = [];\r\n    if (AFarr != null && AFarr.length > 0) {\r\n        for (let i = 0; i < AFarr.length; i++) {\r\n            let AFr1 = AFarr[i].cellrange.row[0],\r\n                AFr2 = AFarr[i].cellrange.row[1],\r\n                AFc1 = AFarr[i].cellrange.column[0],\r\n                AFc2 = AFarr[i].cellrange.column[1];\r\n\r\n            let af = $.extend(true, {}, AFarr[i]);\r\n\r\n            if (type == \"row\") {\r\n                if (AFr1 < index) {\r\n                    if (AFr2 == index && direction == \"lefttop\") {\r\n                        AFr2 += value;\r\n                    } else if (AFr2 > index) {\r\n                        AFr2 += value;\r\n                    }\r\n                } else if (AFr1 == index) {\r\n                    if (direction == \"lefttop\") {\r\n                        AFr1 += value;\r\n                        AFr2 += value;\r\n                    } else if (direction == \"rightbottom\" && AFr2 > index) {\r\n                        AFr2 += value;\r\n                    }\r\n                } else {\r\n                    AFr1 += value;\r\n                    AFr2 += value;\r\n                }\r\n            } else if (type == \"column\") {\r\n                if (AFc1 < index) {\r\n                    if (AFc2 == index && direction == \"lefttop\") {\r\n                        AFc2 += value;\r\n                    } else if (AFc2 > index) {\r\n                        AFc2 += value;\r\n                    }\r\n                } else if (AFc1 == index) {\r\n                    if (direction == \"lefttop\") {\r\n                        AFc1 += value;\r\n                        AFc2 += value;\r\n                    } else if (direction == \"rightbottom\" && AFc2 > index) {\r\n                        AFc2 += value;\r\n                    }\r\n                } else {\r\n                    AFc1 += value;\r\n                    AFc2 += value;\r\n                }\r\n            }\r\n\r\n            af.cellrange = { row: [AFr1, AFr2], column: [AFc1, AFc2] };\r\n\r\n            newAFarr.push(af);\r\n        }\r\n    }\r\n\r\n    //冻结配置变动\r\n    let newFreezen = { freezenhorizontaldata: null, freezenverticaldata: null };\r\n    if (luckysheetFreezen.freezenhorizontaldata != null && type == \"row\") {\r\n        let freezen_scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n        let freezen_row_st = luckysheetFreezen.freezenhorizontaldata[1] - 1;\r\n\r\n        if (freezen_row_st == index && direction == \"lefttop\") {\r\n            freezen_row_st += value;\r\n        } else if (freezen_row_st > index) {\r\n            freezen_row_st += value;\r\n        }\r\n\r\n        let freezen_top = Store.visibledatarow[freezen_row_st] - 2 - freezen_scrollTop + Store.columnHeaderHeight;\r\n\r\n        newFreezen.freezenhorizontaldata = [\r\n            Store.visibledatarow[freezen_row_st],\r\n            freezen_row_st + 1,\r\n            freezen_scrollTop,\r\n            luckysheetFreezen.cutVolumn(Store.visibledatarow, freezen_row_st + 1),\r\n            freezen_top,\r\n        ];\r\n    } else {\r\n        newFreezen.freezenhorizontaldata = luckysheetFreezen.freezenhorizontaldata;\r\n    }\r\n\r\n    if (luckysheetFreezen.freezenverticaldata != null && type == \"column\") {\r\n        let freezen_scrollLeft = luckysheetFreezen.freezenverticaldata[2];\r\n        let freezen_col_st = luckysheetFreezen.freezenverticaldata[1] - 1;\r\n\r\n        if (freezen_col_st == index && direction == \"lefttop\") {\r\n            freezen_col_st += value;\r\n        } else if (freezen_col_st > index) {\r\n            freezen_col_st += value;\r\n        }\r\n\r\n        let freezen_left = Store.visibledatacolumn[freezen_col_st] - 2 - freezen_scrollLeft + Store.rowHeaderWidth;\r\n\r\n        newFreezen.freezenverticaldata = [\r\n            Store.visibledatacolumn[freezen_col_st],\r\n            freezen_col_st + 1,\r\n            freezen_scrollLeft,\r\n            luckysheetFreezen.cutVolumn(Store.visibledatacolumn, freezen_col_st + 1),\r\n            freezen_left,\r\n        ];\r\n    } else {\r\n        newFreezen.freezenverticaldata = luckysheetFreezen.freezenverticaldata;\r\n    }\r\n\r\n    //数据验证配置变动\r\n    let dataVerification = file.dataVerification;\r\n    let newDataVerification = {};\r\n    if (dataVerification != null) {\r\n        for (let key in dataVerification) {\r\n            let r = Number(key.split(\"_\")[0]),\r\n                c = Number(key.split(\"_\")[1]);\r\n            let item = dataVerification[key];\r\n\r\n            if (type == \"row\") {\r\n                if (index < r) {\r\n                    newDataVerification[r + value + \"_\" + c] = item;\r\n                } else if (index == r) {\r\n                    if (direction == \"lefttop\") {\r\n                        newDataVerification[r + value + \"_\" + c] = item;\r\n\r\n                        for (let i = 0; i < value; i++) {\r\n                            newDataVerification[r + i + \"_\" + c] = item;\r\n                        }\r\n                    } else {\r\n                        newDataVerification[r + \"_\" + c] = item;\r\n\r\n                        for (let i = 0; i < value; i++) {\r\n                            newDataVerification[r + i + 1 + \"_\" + c] = item;\r\n                        }\r\n                    }\r\n                } else {\r\n                    newDataVerification[r + \"_\" + c] = item;\r\n                }\r\n            } else if (type == \"column\") {\r\n                if (index < c) {\r\n                    newDataVerification[r + \"_\" + (c + value)] = item;\r\n                } else if (index == c) {\r\n                    if (direction == \"lefttop\") {\r\n                        newDataVerification[r + \"_\" + (c + value)] = item;\r\n\r\n                        for (let i = 0; i < value; i++) {\r\n                            newDataVerification[r + \"_\" + (c + i)] = item;\r\n                        }\r\n                    } else {\r\n                        newDataVerification[r + \"_\" + c] = item;\r\n\r\n                        for (let i = 0; i < value; i++) {\r\n                            newDataVerification[r + \"_\" + (c + i + 1)] = item;\r\n                        }\r\n                    }\r\n                } else {\r\n                    newDataVerification[r + \"_\" + c] = item;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //超链接配置变动\r\n    let hyperlink = file.hyperlink;\r\n    let newHyperlink = {};\r\n    if (hyperlink != null) {\r\n        for (let key in hyperlink) {\r\n            let r = Number(key.split(\"_\")[0]),\r\n                c = Number(key.split(\"_\")[1]);\r\n            let item = hyperlink[key];\r\n\r\n            if (type == \"row\") {\r\n                if (index < r) {\r\n                    newHyperlink[r + value + \"_\" + c] = item;\r\n                } else if (index == r) {\r\n                    if (direction == \"lefttop\") {\r\n                        newHyperlink[r + value + \"_\" + c] = item;\r\n                    } else {\r\n                        newHyperlink[r + \"_\" + c] = item;\r\n                    }\r\n                } else {\r\n                    newHyperlink[r + \"_\" + c] = item;\r\n                }\r\n            } else if (type == \"column\") {\r\n                if (index < c) {\r\n                    newHyperlink[r + \"_\" + (c + value)] = item;\r\n                } else if (index == c) {\r\n                    if (direction == \"lefttop\") {\r\n                        newHyperlink[r + \"_\" + (c + value)] = item;\r\n                    } else {\r\n                        newHyperlink[r + \"_\" + c] = item;\r\n                    }\r\n                } else {\r\n                    newHyperlink[r + \"_\" + c] = item;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    let type1;\r\n    if (type == \"row\") {\r\n        type1 = \"r\";\r\n\r\n        //行高配置变动\r\n        if (cfg[\"rowlen\"] != null) {\r\n            let rowlen_new = {};\r\n\r\n            for (let r in cfg[\"rowlen\"]) {\r\n                r = parseFloat(r);\r\n\r\n                if (r < index) {\r\n                    rowlen_new[r] = cfg[\"rowlen\"][r];\r\n                } else if (r == index) {\r\n                    if (direction == \"lefttop\") {\r\n                        rowlen_new[r + value] = cfg[\"rowlen\"][r];\r\n                    } else if (direction == \"rightbottom\") {\r\n                        rowlen_new[r] = cfg[\"rowlen\"][r];\r\n                    }\r\n                } else {\r\n                    rowlen_new[r + value] = cfg[\"rowlen\"][r];\r\n                }\r\n            }\r\n\r\n            cfg[\"rowlen\"] = rowlen_new;\r\n        }\r\n\r\n        //隐藏行配置变动\r\n        if (cfg[\"rowhidden\"] != null) {\r\n            let rowhidden_new = {};\r\n\r\n            for (let r in cfg[\"rowhidden\"]) {\r\n                r = parseFloat(r);\r\n\r\n                if (r < index) {\r\n                    rowhidden_new[r] = cfg[\"rowhidden\"][r];\r\n                } else if (r == index) {\r\n                    if (direction == \"lefttop\") {\r\n                        rowhidden_new[r + value] = cfg[\"rowhidden\"][r];\r\n                    } else if (direction == \"rightbottom\") {\r\n                        rowhidden_new[r] = cfg[\"rowhidden\"][r];\r\n                    }\r\n                } else {\r\n                    rowhidden_new[r + value] = cfg[\"rowhidden\"][r];\r\n                }\r\n            }\r\n\r\n            cfg[\"rowhidden\"] = rowhidden_new;\r\n        }\r\n\r\n        // *添加空行模板这里请保持为push null;\r\n        let row = [];\r\n        for (let c = 0; c < d[0].length; c++) {\r\n            row.push(null);\r\n        }\r\n\r\n        var cellBorderConfig = [];\r\n        //边框\r\n        if (cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0) {\r\n            let borderInfo = [];\r\n\r\n            for (let i = 0; i < cfg[\"borderInfo\"].length; i++) {\r\n                let rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n                if (rangeType == \"range\") {\r\n                    let borderRange = cfg[\"borderInfo\"][i].range;\r\n\r\n                    let emptyRange = [];\r\n\r\n                    for (let j = 0; j < borderRange.length; j++) {\r\n                        let bd_r1 = borderRange[j].row[0],\r\n                            bd_r2 = borderRange[j].row[1];\r\n\r\n                        if (direction == \"lefttop\") {\r\n                            if (index <= bd_r1) {\r\n                                bd_r1 += value;\r\n                                bd_r2 += value;\r\n                            } else if (index <= bd_r2) {\r\n                                bd_r2 += value;\r\n                            }\r\n                        } else {\r\n                            if (index < bd_r1) {\r\n                                bd_r1 += value;\r\n                                bd_r2 += value;\r\n                            } else if (index < bd_r2) {\r\n                                bd_r2 += value;\r\n                            }\r\n                        }\r\n\r\n                        if (bd_r2 >= bd_r1) {\r\n                            emptyRange.push({ row: [bd_r1, bd_r2], column: borderRange[j].column });\r\n                        }\r\n                    }\r\n\r\n                    if (emptyRange.length > 0) {\r\n                        let bd_obj = {\r\n                            rangeType: \"range\",\r\n                            borderType: cfg[\"borderInfo\"][i].borderType,\r\n                            style: cfg[\"borderInfo\"][i].style,\r\n                            color: cfg[\"borderInfo\"][i].color,\r\n                            range: emptyRange,\r\n                        };\r\n\r\n                        borderInfo.push(bd_obj);\r\n                    }\r\n                } else if (rangeType == \"cell\") {\r\n                    let row_index = cfg[\"borderInfo\"][i].value.row_index;\r\n                    // 位置相同标识边框相关 先缓存\r\n                    if (row_index === index) {\r\n                        cellBorderConfig.push(JSON.parse(JSON.stringify(cfg[\"borderInfo\"][i])));\r\n                    }\r\n\r\n                    if (direction == \"lefttop\") {\r\n                        if (index <= row_index) {\r\n                            row_index += value;\r\n                        }\r\n                    } else {\r\n                        if (index < row_index) {\r\n                            row_index += value;\r\n                        }\r\n                    }\r\n\r\n                    cfg[\"borderInfo\"][i].value.row_index = row_index;\r\n                    borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                }\r\n            }\r\n\r\n            cfg[\"borderInfo\"] = borderInfo;\r\n        }\r\n\r\n        let arr = [];\r\n        for (let r = 0; r < value; r++) {\r\n            arr.push(JSON.stringify(row));\r\n            // 同步拷贝 type 为 cell 类型的边框\r\n            if (cellBorderConfig.length) {\r\n                var cellBorderConfigCopy = JSON.parse(JSON.stringify(cellBorderConfig));\r\n                cellBorderConfigCopy.forEach((item) => {\r\n                    if (direction === \"rightbottom\") {\r\n                        // 向下插入时 基于模板行位置直接递增即可\r\n                        item.value.row_index += r + 1;\r\n                    } else if (direction === \"lefttop\") {\r\n                        // 向上插入时 目标行移动到后面 新增n行到前面 对于新增的行来说 也是递增，不过是从0开始\r\n                        item.value.row_index += r;\r\n                    }\r\n                });\r\n                cfg[\"borderInfo\"].push(...cellBorderConfigCopy);\r\n            }\r\n        }\r\n\r\n        if (direction == \"lefttop\") {\r\n            if (index == 0) {\r\n                new Function(\"d\", \"return \" + \"d.unshift(\" + arr.join(\",\") + \")\")(d);\r\n            } else {\r\n                new Function(\"d\", \"return \" + \"d.splice(\" + index + \", 0, \" + arr.join(\",\") + \")\")(d);\r\n            }\r\n        } else {\r\n            new Function(\"d\", \"return \" + \"d.splice(\" + (index + 1) + \", 0, \" + arr.join(\",\") + \")\")(d);\r\n        }\r\n    } else {\r\n        type1 = \"c\";\r\n\r\n        //行高配置变动\r\n        if (cfg[\"columnlen\"] != null) {\r\n            let columnlen_new = {};\r\n\r\n            for (let c in cfg[\"columnlen\"]) {\r\n                c = parseFloat(c);\r\n\r\n                if (c < index) {\r\n                    columnlen_new[c] = cfg[\"columnlen\"][c];\r\n                } else if (c == index) {\r\n                    if (direction == \"lefttop\") {\r\n                        columnlen_new[c + value] = cfg[\"columnlen\"][c];\r\n                    } else if (direction == \"rightbottom\") {\r\n                        columnlen_new[c] = cfg[\"columnlen\"][c];\r\n                    }\r\n                } else {\r\n                    columnlen_new[c + value] = cfg[\"columnlen\"][c];\r\n                }\r\n            }\r\n\r\n            cfg[\"columnlen\"] = columnlen_new;\r\n        }\r\n\r\n        //隐藏列配置变动\r\n        if (cfg[\"colhidden\"] != null) {\r\n            let colhidden_new = {};\r\n\r\n            for (let c in cfg[\"colhidden\"]) {\r\n                c = parseFloat(c);\r\n\r\n                if (c < index) {\r\n                    colhidden_new[c] = cfg[\"colhidden\"][c];\r\n                } else if (c == index) {\r\n                    if (direction == \"lefttop\") {\r\n                        colhidden_new[c + value] = cfg[\"colhidden\"][c];\r\n                    } else if (direction == \"rightbottom\") {\r\n                        colhidden_new[c] = cfg[\"colhidden\"][c];\r\n                    }\r\n                } else {\r\n                    colhidden_new[c + value] = cfg[\"colhidden\"][c];\r\n                }\r\n            }\r\n\r\n            cfg[\"colhidden\"] = colhidden_new;\r\n        }\r\n\r\n        // *添加空列模板这里请保持为push null;\r\n        let col = [];\r\n        for (let r = 0; r < d.length; r++) {\r\n            col.push(null);\r\n        }\r\n\r\n        var cellBorderConfig = [];\r\n        //边框\r\n        if (cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0) {\r\n            let borderInfo = [];\r\n\r\n            for (let i = 0; i < cfg[\"borderInfo\"].length; i++) {\r\n                let rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n                if (rangeType == \"range\") {\r\n                    let borderRange = cfg[\"borderInfo\"][i].range;\r\n\r\n                    let emptyRange = [];\r\n\r\n                    for (let j = 0; j < borderRange.length; j++) {\r\n                        let bd_c1 = borderRange[j].column[0],\r\n                            bd_c2 = borderRange[j].column[1];\r\n\r\n                        if (direction == \"lefttop\") {\r\n                            if (index <= bd_c1) {\r\n                                bd_c1 += value;\r\n                                bd_c2 += value;\r\n                            } else if (index <= bd_c2) {\r\n                                bd_c2 += value;\r\n                            }\r\n                        } else {\r\n                            if (index < bd_c1) {\r\n                                bd_c1 += value;\r\n                                bd_c2 += value;\r\n                            } else if (index < bd_c2) {\r\n                                bd_c2 += value;\r\n                            }\r\n                        }\r\n\r\n                        if (bd_c2 >= bd_c1) {\r\n                            emptyRange.push({ row: borderRange[j].row, column: [bd_c1, bd_c2] });\r\n                        }\r\n                    }\r\n\r\n                    if (emptyRange.length > 0) {\r\n                        let bd_obj = {\r\n                            rangeType: \"range\",\r\n                            borderType: cfg[\"borderInfo\"][i].borderType,\r\n                            style: cfg[\"borderInfo\"][i].style,\r\n                            color: cfg[\"borderInfo\"][i].color,\r\n                            range: emptyRange,\r\n                        };\r\n\r\n                        borderInfo.push(bd_obj);\r\n                    }\r\n                } else if (rangeType == \"cell\") {\r\n                    let col_index = cfg[\"borderInfo\"][i].value.col_index;\r\n                    // 位置相同标识边框相关 先缓存\r\n                    if (col_index === index) {\r\n                        cellBorderConfig.push(JSON.parse(JSON.stringify(cfg[\"borderInfo\"][i])));\r\n                    }\r\n\r\n                    if (direction == \"lefttop\") {\r\n                        if (index <= col_index) {\r\n                            col_index += value;\r\n                        }\r\n                    } else {\r\n                        if (index < col_index) {\r\n                            col_index += value;\r\n                        }\r\n                    }\r\n\r\n                    cfg[\"borderInfo\"][i].value.col_index = col_index;\r\n                    borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                }\r\n            }\r\n\r\n            cfg[\"borderInfo\"] = borderInfo;\r\n        }\r\n\r\n        // 处理相关的 type 为 cell 类型的边框\r\n        if (cellBorderConfig.length) {\r\n            for (let i = 0; i < value; i++) {\r\n                var cellBorderConfigCopy = JSON.parse(JSON.stringify(cellBorderConfig));\r\n                cellBorderConfigCopy.forEach((item) => {\r\n                    if (direction === \"rightbottom\") {\r\n                        // 向右插入时 基于模板列位置直接递增即可\r\n                        item.value.col_index += i + 1;\r\n                    } else if (direction === \"lefttop\") {\r\n                        // 向左插入时 目标列移动到后面 新增n列到前面 对于新增的列来说 也是递增，不过是从0开始\r\n                        item.value.col_index += i;\r\n                    }\r\n                });\r\n                cfg[\"borderInfo\"].push(...cellBorderConfigCopy);\r\n            }\r\n        }\r\n\r\n        for (let r = 0; r < d.length; r++) {\r\n            let row = d[r];\r\n\r\n            for (let i = 0; i < value; i++) {\r\n                // *这里不能是引用,不然添加多列时添加的都是同一个引用,修改一个cell会同步到多个\r\n                const COLR = JSON.parse(JSON.stringify(col[r]));\r\n                if (direction == \"lefttop\") {\r\n                    if (index == 0) {\r\n                        row.unshift(COLR);\r\n                    } else {\r\n                        row.splice(index, 0, COLR);\r\n                    }\r\n                } else {\r\n                    row.splice(index + 1, 0, COLR);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // 修改当前sheet页时刷新\r\n    if (file.index == Store.currentSheetIndex) {\r\n        jfrefreshgrid_adRC(\r\n            d,\r\n            cfg,\r\n            \"addRC\",\r\n            { index: index, len: value, direction: direction, rc: type1, restore: false },\r\n            newCalcChain,\r\n            newFilterObj,\r\n            newCFarr,\r\n            newAFarr,\r\n            newFreezen,\r\n            newDataVerification,\r\n            newHyperlink,\r\n        );\r\n    } else {\r\n        file.data = d;\r\n        file.config = cfg;\r\n        file.calcChain = newCalcChain;\r\n        file.filter = newFilterObj.filter;\r\n        file.filter_select = newFilterObj.filter_select;\r\n        file.luckysheet_conditionformat_save = newCFarr;\r\n        file.luckysheet_alternateformat_save = newAFarr;\r\n        file.dataVerification = newDataVerification;\r\n        file.hyperlink = newHyperlink;\r\n    }\r\n\r\n    let range = null;\r\n    if (type == \"row\") {\r\n        if (direction == \"lefttop\") {\r\n            range = [{ row: [index, index + value - 1], column: [0, d[0].length - 1] }];\r\n        } else {\r\n            range = [{ row: [index + 1, index + value], column: [0, d[0].length - 1] }];\r\n        }\r\n    } else {\r\n        if (direction == \"lefttop\") {\r\n            range = [{ row: [0, d.length - 1], column: [index, index + value - 1] }];\r\n        } else {\r\n            range = [{ row: [0, d.length - 1], column: [index + 1, index + value] }];\r\n        }\r\n    }\r\n\r\n    file.luckysheet_select_save = range;\r\n    if (file.index == Store.currentSheetIndex) {\r\n        Store.luckysheet_select_save = range;\r\n        selectHightlightShow();\r\n    }\r\n\r\n    if (type == \"row\") {\r\n        let scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft(),\r\n            scrollTop = $(\"#luckysheet-cell-main\").scrollTop();\r\n        let winH = $(\"#luckysheet-cell-main\").height(),\r\n            winW = $(\"#luckysheet-cell-main\").width();\r\n\r\n        let row = Store.visibledatarow[range[0].row[1]],\r\n            row_pre = range[0].row[0] - 1 == -1 ? 0 : Store.visibledatarow[range[0].row[0] - 1];\r\n\r\n        if (row - scrollTop - winH + 20 > 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row - winH + 20);\r\n        } else if (row_pre - scrollTop - 20 < 0) {\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(row_pre - 20);\r\n        }\r\n\r\n        if (value > 30) {\r\n            $(\"#luckysheet-row-count-show\").hide();\r\n            $(\"#luckysheet-column-count-show\").hide();\r\n        }\r\n    }\r\n}\r\n\r\nfunction luckysheetextendData(rowlen, newData) {\r\n    let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n    let cfg = $.extend(true, {}, Store.config);\r\n    if (cfg[\"merge\"] == null) {\r\n        cfg[\"merge\"] = {};\r\n    }\r\n\r\n    let collen = d[0].length;\r\n    let addNullData = datagridgrowth([], rowlen, collen);\r\n\r\n    d = d.concat(addNullData);\r\n\r\n    for (let i = 0; i < newData.length; i++) {\r\n        let r = newData[i].r,\r\n            c = newData[i].c,\r\n            v = newData[i].v;\r\n\r\n        setcellvalue(r, c, d, v);\r\n\r\n        if (v != null && v.mc != null && v.mc.rs != null) {\r\n            cfg[\"merge\"][v.mc.r + \"_\" + v.mc.c] = $.extend(true, {}, v.mc);\r\n        }\r\n    }\r\n\r\n    //luckysheet.flowdata\r\n    Store.flowdata = d;\r\n    editor.webWorkerFlowDataCache(Store.flowdata); //worker存数据\r\n    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = d;\r\n\r\n    //config\r\n    Store.config = cfg;\r\n    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n    //行高、列宽刷新\r\n    jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n}\r\n\r\n//删除行列\r\nfunction luckysheetdeletetable(type, st, ed, sheetIndex) {\r\n    sheetIndex = sheetIndex || Store.currentSheetIndex;\r\n\r\n    if (type == \"row\" && !checkProtectionAuthorityNormal(sheetIndex, \"deleteRows\")) {\r\n        return;\r\n    } else if (type == \"column\" && !checkProtectionAuthorityNormal(sheetIndex, \"deleteColumns\")) {\r\n        return;\r\n    }\r\n\r\n    let curOrder = getSheetIndex(sheetIndex);\r\n\r\n    let file = Store.luckysheetfile[curOrder];\r\n    let d = $.extend(true, [], file.data);\r\n\r\n    if (st < 0) {\r\n        st = 0;\r\n    }\r\n\r\n    if (ed < 0) {\r\n        ed = 0;\r\n    }\r\n\r\n    if (type == \"row\") {\r\n        if (st > d.length - 1) {\r\n            st = d.length - 1;\r\n        }\r\n\r\n        if (ed > d.length - 1) {\r\n            ed = d.length - 1;\r\n        }\r\n    } else {\r\n        if (st > d[0].length - 1) {\r\n            st = d[0].length - 1;\r\n        }\r\n\r\n        if (ed > d[0].length - 1) {\r\n            ed = d[0].length - 1;\r\n        }\r\n    }\r\n\r\n    if (st > ed) {\r\n        return;\r\n    }\r\n\r\n    let slen = ed - st + 1;\r\n    let cfg = $.extend(true, {}, file.config);\r\n\r\n    //合并单元格配置变动\r\n    if (cfg[\"merge\"] == null) {\r\n        cfg[\"merge\"] = {};\r\n    }\r\n\r\n    let merge_new = {};\r\n    for (let m in cfg[\"merge\"]) {\r\n        let mc = cfg[\"merge\"][m];\r\n\r\n        let r = mc.r,\r\n            c = mc.c,\r\n            rs = mc.rs,\r\n            cs = mc.cs;\r\n\r\n        if (type == \"row\") {\r\n            if (r < st) {\r\n                if (r + rs - 1 < st) {\r\n                    merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs, cs: cs };\r\n                } else if (r + rs - 1 >= st && r + rs - 1 < ed) {\r\n                    merge_new[r + \"_\" + c] = { r: r, c: c, rs: st - r, cs: cs };\r\n                } else if (r + rs - 1 >= ed) {\r\n                    merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs - slen, cs: cs };\r\n                }\r\n            } else if (r >= st && r <= ed) {\r\n                if (r + rs - 1 > ed) {\r\n                    merge_new[st + \"_\" + c] = { r: st, c: c, rs: r + rs - 1 - ed, cs: cs };\r\n                }\r\n            } else if (r > ed) {\r\n                merge_new[r - slen + \"_\" + c] = { r: r - slen, c: c, rs: rs, cs: cs };\r\n            }\r\n        } else if (type == \"column\") {\r\n            if (c < st) {\r\n                if (c + cs - 1 < st) {\r\n                    merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs, cs: cs };\r\n                } else if (c + cs - 1 >= st && c + cs - 1 < ed) {\r\n                    merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs, cs: st - c };\r\n                } else if (c + cs - 1 >= ed) {\r\n                    merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs, cs: cs - slen };\r\n                }\r\n            } else if (c >= st && c <= ed) {\r\n                if (c + cs - 1 > ed) {\r\n                    merge_new[r + \"_\" + st] = { r: r, c: st, rs: rs, cs: c + cs - 1 - ed };\r\n                }\r\n            } else if (c > ed) {\r\n                merge_new[r + \"_\" + (c - slen)] = { r: r, c: c - slen, rs: rs, cs: cs };\r\n            }\r\n        }\r\n    }\r\n    cfg[\"merge\"] = merge_new;\r\n\r\n    //公式配置变动\r\n    let calcChain = file.calcChain;\r\n    let newCalcChain = [];\r\n    if (calcChain != null && calcChain.length > 0) {\r\n        for (let i = 0; i < calcChain.length; i++) {\r\n            let calc = $.extend(true, {}, calcChain[i]);\r\n            let calc_r = calc.r,\r\n                calc_c = calc.c,\r\n                calc_i = calc.index,\r\n                calc_funcStr = getcellFormula(calc_r, calc_c, calc_i);\r\n\r\n                // 添加进公式后，可能又直接覆盖了单元格值\r\n                if(!calc_funcStr) continue\r\n\r\n            if (type == \"row\") {\r\n                if (calc_r < st || calc_r > ed) {\r\n                    let functionStr = \"=\" + formula.functionStrChange(calc_funcStr, \"del\", \"row\", null, st, slen);\r\n\r\n                    if (d[calc_r][calc_c] && d[calc_r][calc_c].f == calc_funcStr) {\r\n                        d[calc_r][calc_c].f = functionStr;\r\n                    }\r\n\r\n                    if (calc_r > ed) {\r\n                        calc.r = calc_r - slen;\r\n                    }\r\n\r\n                    newCalcChain.push(calc);\r\n                }\r\n            } else if (type == \"column\") {\r\n                if (calc_c < st || calc_c > ed) {\r\n                    let functionStr = \"=\" + formula.functionStrChange(calc_funcStr, \"del\", \"col\", null, st, slen);\r\n\r\n                    if (d[calc_r][calc_c] && d[calc_r][calc_c].f == calc_funcStr) {\r\n                        d[calc_r][calc_c].f = functionStr;\r\n                    }\r\n\r\n                    if (calc_c > ed) {\r\n                        calc.c = calc_c - slen;\r\n                    }\r\n\r\n                    newCalcChain.push(calc);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //筛选配置变动\r\n    let filter_select = file.filter_select;\r\n    let filter = file.filter;\r\n    let newFilterObj = null;\r\n    if (filter_select != null && JSON.stringify(filter_select) != \"{}\") {\r\n        newFilterObj = { filter_select: null, filter: null };\r\n\r\n        let f_r1 = filter_select.row[0],\r\n            f_r2 = filter_select.row[1];\r\n        let f_c1 = filter_select.column[0],\r\n            f_c2 = filter_select.column[1];\r\n\r\n        if (type == \"row\") {\r\n            if (f_r1 > ed) {\r\n                f_r1 -= slen;\r\n                f_r2 -= slen;\r\n\r\n                newFilterObj.filter_select = { row: [f_r1, f_r2], column: [f_c1, f_c2] };\r\n            } else if (f_r1 < st) {\r\n                if (f_r2 < st) {\r\n                } else if (f_r2 <= ed) {\r\n                    f_r2 = st - 1;\r\n                } else {\r\n                    f_r2 -= slen;\r\n                }\r\n\r\n                newFilterObj.filter_select = { row: [f_r1, f_r2], column: [f_c1, f_c2] };\r\n            }\r\n\r\n            if (newFilterObj.filter_select != null && filter != null) {\r\n                for (let k in filter) {\r\n                    let f_rowhidden = filter[k].rowhidden;\r\n                    let f_rowhidden_new = {};\r\n\r\n                    for (let n in f_rowhidden) {\r\n                        if (n < st) {\r\n                            f_rowhidden_new[n] = 0;\r\n                        } else if (n > ed) {\r\n                            f_rowhidden_new[n - slen] = 0;\r\n                        }\r\n                    }\r\n\r\n                    if (JSON.stringify(f_rowhidden_new) != \"{}\") {\r\n                        if (newFilterObj.filter == null) {\r\n                            newFilterObj.filter = {};\r\n                        }\r\n\r\n                        newFilterObj.filter[k] = $.extend(true, {}, filter[k]);\r\n                        newFilterObj.filter[k].rowhidden = f_rowhidden_new;\r\n                        newFilterObj.filter[k].str = f_r1;\r\n                        newFilterObj.filter[k].edr = f_r2;\r\n                    }\r\n                }\r\n            }\r\n        } else if (type == \"column\") {\r\n            if (f_c1 > ed) {\r\n                f_c1 -= slen;\r\n                f_c2 -= slen;\r\n\r\n                newFilterObj.filter_select = { row: [f_r1, f_r2], column: [f_c1, f_c2] };\r\n            } else if (f_c1 < st) {\r\n                if (f_c2 < st) {\r\n                } else if (f_c2 <= ed) {\r\n                    f_c2 = st - 1;\r\n                } else {\r\n                    f_c2 -= slen;\r\n                }\r\n\r\n                newFilterObj.filter_select = { row: [f_r1, f_r2], column: [f_c1, f_c2] };\r\n            } else {\r\n                if (f_c2 > ed) {\r\n                    f_c1 = st;\r\n                    f_c2 -= slen;\r\n\r\n                    newFilterObj.filter_select = { row: [f_r1, f_r2], column: [f_c1, f_c2] };\r\n                }\r\n            }\r\n\r\n            if (newFilterObj.filter_select != null && filter != null) {\r\n                for (let k in filter) {\r\n                    let f_cindex = filter[k].cindex;\r\n\r\n                    if (f_cindex < st) {\r\n                        if (newFilterObj.filter == null) {\r\n                            newFilterObj.filter = {};\r\n                        }\r\n\r\n                        newFilterObj.filter[f_cindex - f_c1] = $.extend(true, {}, filter[k]);\r\n                        newFilterObj.filter[f_cindex - f_c1].edc = f_c2;\r\n                    } else if (f_cindex > ed) {\r\n                        f_cindex -= slen;\r\n\r\n                        if (newFilterObj.filter == null) {\r\n                            newFilterObj.filter = {};\r\n                        }\r\n\r\n                        newFilterObj.filter[f_cindex - f_c1] = $.extend(true, {}, filter[k]);\r\n                        newFilterObj.filter[f_cindex - f_c1].cindex = f_cindex;\r\n                        newFilterObj.filter[f_cindex - f_c1].stc = f_c1;\r\n                        newFilterObj.filter[f_cindex - f_c1].edc = f_c2;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if (newFilterObj != null && newFilterObj.filter != null) {\r\n        if (cfg[\"rowhidden\"] == null) {\r\n            cfg[\"rowhidden\"] = {};\r\n        }\r\n\r\n        for (let k in newFilterObj.filter) {\r\n            let f_rowhidden = newFilterObj.filter[k].rowhidden;\r\n\r\n            for (let n in f_rowhidden) {\r\n                cfg[\"rowhidden\"][n] = 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    //条件格式配置变动\r\n    let CFarr = file.luckysheet_conditionformat_save;\r\n    let newCFarr = [];\r\n    if (CFarr != null && CFarr.length > 0) {\r\n        for (let i = 0; i < CFarr.length; i++) {\r\n            let cf_range = CFarr[i].cellrange;\r\n            let cf_new_range = [];\r\n\r\n            for (let j = 0; j < cf_range.length; j++) {\r\n                let CFr1 = cf_range[j].row[0],\r\n                    CFr2 = cf_range[j].row[1],\r\n                    CFc1 = cf_range[j].column[0],\r\n                    CFc2 = cf_range[j].column[1];\r\n\r\n                if (type == \"row\") {\r\n                    if (!(CFr1 >= st && CFr2 <= ed)) {\r\n                        if (CFr1 > ed) {\r\n                            CFr1 -= slen;\r\n                            CFr2 -= slen;\r\n                        } else if (CFr1 < st) {\r\n                            if (CFr2 < st) {\r\n                            } else if (CFr2 <= ed) {\r\n                                CFr2 = st - 1;\r\n                            } else {\r\n                                CFr2 -= slen;\r\n                            }\r\n                        } else {\r\n                            if (CFr2 > ed) {\r\n                                CFr1 = st;\r\n                                CFr2 -= slen;\r\n                            }\r\n                        }\r\n\r\n                        cf_new_range.push({ row: [CFr1, CFr2], column: [CFc1, CFc2] });\r\n                    }\r\n                } else if (type == \"column\") {\r\n                    if (!(CFc1 >= st && CFc2 <= ed)) {\r\n                        if (CFc1 > ed) {\r\n                            CFc1 -= slen;\r\n                            CFc2 -= slen;\r\n                        } else if (CFc1 < st) {\r\n                            if (CFc2 < st) {\r\n                            } else if (CFc2 <= ed) {\r\n                                CFc2 = st - 1;\r\n                            } else {\r\n                                CFc2 -= slen;\r\n                            }\r\n                        } else {\r\n                            if (CFc2 > ed) {\r\n                                CFc1 = st;\r\n                                CFc2 -= slen;\r\n                            }\r\n                        }\r\n\r\n                        cf_new_range.push({ row: [CFr1, CFr2], column: [CFc1, CFc2] });\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (cf_new_range.length > 0) {\r\n                let cf = $.extend(true, {}, CFarr[i]);\r\n                cf.cellrange = cf_new_range;\r\n\r\n                newCFarr.push(cf);\r\n            }\r\n        }\r\n    }\r\n\r\n    //交替颜色配置变动\r\n    let AFarr = file.luckysheet_alternateformat_save;\r\n    let newAFarr = [];\r\n    if (AFarr != null && AFarr.length > 0) {\r\n        for (let i = 0; i < AFarr.length; i++) {\r\n            let AFr1 = AFarr[i].cellrange.row[0],\r\n                AFr2 = AFarr[i].cellrange.row[1],\r\n                AFc1 = AFarr[i].cellrange.column[0],\r\n                AFc2 = AFarr[i].cellrange.column[1];\r\n\r\n            if (type == \"row\") {\r\n                if (!(AFr1 >= st && AFr2 <= ed)) {\r\n                    let af = $.extend(true, {}, AFarr[i]);\r\n\r\n                    if (AFr1 > ed) {\r\n                        AFr1 -= slen;\r\n                        AFr2 -= slen;\r\n                    } else if (AFr1 < st) {\r\n                        if (AFr2 < st) {\r\n                        } else if (AFr2 <= ed) {\r\n                            AFr2 = st - 1;\r\n                        } else {\r\n                            AFr2 -= slen;\r\n                        }\r\n                    } else {\r\n                        if (AFr2 > ed) {\r\n                            AFr1 = st;\r\n                            AFr2 -= slen;\r\n                        }\r\n                    }\r\n\r\n                    af.cellrange = { row: [AFr1, AFr2], column: [AFc1, AFc2] };\r\n\r\n                    newAFarr.push(af);\r\n                }\r\n            } else if (type == \"column\") {\r\n                if (!(AFc1 >= st && AFc2 <= ed)) {\r\n                    let af = $.extend(true, {}, AFarr[i]);\r\n\r\n                    if (AFc1 > ed) {\r\n                        AFc1 -= slen;\r\n                        AFc2 -= slen;\r\n                    } else if (AFc1 < st) {\r\n                        if (AFc2 < st) {\r\n                        } else if (AFc2 <= ed) {\r\n                            AFc2 = st - 1;\r\n                        } else {\r\n                            AFc2 -= slen;\r\n                        }\r\n                    } else {\r\n                        if (AFc2 > ed) {\r\n                            AFc1 = st;\r\n                            AFc2 -= slen;\r\n                        }\r\n                    }\r\n\r\n                    af.cellrange = { row: [AFr1, AFr2], column: [AFc1, AFc2] };\r\n\r\n                    newAFarr.push(af);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //冻结配置变动\r\n    let newFreezen = { freezenhorizontaldata: null, freezenverticaldata: null };\r\n    if (luckysheetFreezen.freezenhorizontaldata != null && type == \"row\") {\r\n        let freezen_scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n        let freezen_st = luckysheet_searcharray(Store.visibledatarow, freezen_scrollTop);\r\n        if (freezen_st == -1) {\r\n            freezen_st = 0;\r\n        }\r\n\r\n        let freezen_row_st = luckysheetFreezen.freezenhorizontaldata[1] - 1;\r\n\r\n        if (freezen_row_st >= st) {\r\n            if (freezen_row_st < ed) {\r\n                freezen_row_st = st - 1;\r\n            } else {\r\n                freezen_row_st -= slen;\r\n            }\r\n        }\r\n\r\n        if (freezen_row_st < freezen_st) {\r\n            freezen_row_st = freezen_st;\r\n        }\r\n\r\n        let freezen_top = Store.visibledatarow[freezen_row_st] - 2 - freezen_scrollTop + Store.columnHeaderHeight;\r\n\r\n        newFreezen.freezenhorizontaldata = [\r\n            Store.visibledatarow[freezen_row_st],\r\n            freezen_row_st + 1,\r\n            freezen_scrollTop,\r\n            luckysheetFreezen.cutVolumn(Store.visibledatarow, freezen_row_st + 1),\r\n            freezen_top,\r\n        ];\r\n    } else {\r\n        newFreezen.freezenhorizontaldata = luckysheetFreezen.freezenhorizontaldata;\r\n    }\r\n\r\n    if (luckysheetFreezen.freezenverticaldata != null && type == \"column\") {\r\n        let freezen_scrollLeft = luckysheetFreezen.freezenverticaldata[2];\r\n        let freezen_st2 = luckysheet_searcharray(Store.visibledatacolumn, freezen_scrollLeft);\r\n        if (freezen_st2 == -1) {\r\n            freezen_st2 = 0;\r\n        }\r\n\r\n        let freezen_col_st = luckysheetFreezen.freezenverticaldata[1] - 1;\r\n\r\n        if (freezen_col_st >= st) {\r\n            if (freezen_col_st < ed) {\r\n                freezen_col_st = st - 1;\r\n            } else {\r\n                freezen_col_st -= slen;\r\n            }\r\n        }\r\n\r\n        if (freezen_col_st < freezen_st2) {\r\n            freezen_col_st = freezen_st2;\r\n        }\r\n\r\n        let freezen_left = Store.visibledatacolumn[freezen_col_st] - 2 - freezen_scrollLeft + Store.rowHeaderWidth;\r\n\r\n        newFreezen.freezenverticaldata = [\r\n            Store.visibledatacolumn[freezen_col_st],\r\n            freezen_col_st + 1,\r\n            freezen_scrollLeft,\r\n            luckysheetFreezen.cutVolumn(Store.visibledatacolumn, freezen_col_st + 1),\r\n            freezen_left,\r\n        ];\r\n    } else {\r\n        newFreezen.freezenverticaldata = luckysheetFreezen.freezenverticaldata;\r\n    }\r\n\r\n    //数据验证配置变动\r\n    let dataVerification = file.dataVerification;\r\n    let newDataVerification = {};\r\n    if (dataVerification != null) {\r\n        for (let key in dataVerification) {\r\n            let r = Number(key.split(\"_\")[0]),\r\n                c = Number(key.split(\"_\")[1]);\r\n            let item = dataVerification[key];\r\n\r\n            if (type == \"row\") {\r\n                if (r < st) {\r\n                    newDataVerification[r + \"_\" + c] = item;\r\n                } else if (r > ed) {\r\n                    newDataVerification[r - slen + \"_\" + c] = item;\r\n                }\r\n            } else if (type == \"column\") {\r\n                if (c < st) {\r\n                    newDataVerification[r + \"_\" + c] = item;\r\n                } else if (c > ed) {\r\n                    newDataVerification[r + \"_\" + (c - slen)] = item;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //超链接配置变动\r\n    let hyperlink = file.hyperlink;\r\n    let newHyperlink = {};\r\n    if (hyperlink != null) {\r\n        for (let key in hyperlink) {\r\n            let r = Number(key.split(\"_\")[0]),\r\n                c = Number(key.split(\"_\")[1]);\r\n            let item = hyperlink[key];\r\n\r\n            if (type == \"row\") {\r\n                if (r < st) {\r\n                    newHyperlink[r + \"_\" + c] = item;\r\n                } else if (r > ed) {\r\n                    newHyperlink[r - slen + \"_\" + c] = item;\r\n                }\r\n            } else if (type == \"column\") {\r\n                if (c < st) {\r\n                    newHyperlink[r + \"_\" + c] = item;\r\n                } else if (c > ed) {\r\n                    newHyperlink[r + \"_\" + (c - slen)] = item;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //主逻辑\r\n    let type1;\r\n    if (type == \"row\") {\r\n        type1 = \"r\";\r\n\r\n        //行高配置变动\r\n        if (cfg[\"rowlen\"] == null) {\r\n            cfg[\"rowlen\"] = {};\r\n        }\r\n\r\n        let rowlen_new = {};\r\n        for (let r in cfg[\"rowlen\"]) {\r\n            if (r < st) {\r\n                rowlen_new[r] = cfg[\"rowlen\"][r];\r\n            } else if (r > ed) {\r\n                rowlen_new[r - slen] = cfg[\"rowlen\"][r];\r\n            }\r\n        }\r\n\r\n        cfg[\"rowlen\"] = rowlen_new;\r\n\r\n        //隐藏行配置变动\r\n        if (cfg[\"rowhidden\"] == null) {\r\n            cfg[\"rowhidden\"] = {};\r\n        }\r\n\r\n        let rowhidden_new = {};\r\n        for (let r in cfg[\"rowhidden\"]) {\r\n            if (r < st) {\r\n                rowhidden_new[r] = cfg[\"rowhidden\"][r];\r\n            } else if (r > ed) {\r\n                rowhidden_new[r - slen] = cfg[\"rowhidden\"][r];\r\n            }\r\n        }\r\n\r\n        cfg[\"rowhidden\"] = rowhidden_new;\r\n\r\n        //边框配置变动\r\n        if (cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0) {\r\n            let borderInfo = [];\r\n\r\n            for (let i = 0; i < cfg[\"borderInfo\"].length; i++) {\r\n                let rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n                if (rangeType == \"range\") {\r\n                    let borderRange = cfg[\"borderInfo\"][i].range;\r\n\r\n                    let emptyRange = [];\r\n\r\n                    for (let j = 0; j < borderRange.length; j++) {\r\n                        let bd_r1 = borderRange[j].row[0],\r\n                            bd_r2 = borderRange[j].row[1];\r\n\r\n                        for (let r = st; r <= ed; r++) {\r\n                            if (r < borderRange[j].row[0]) {\r\n                                bd_r1 -= 1;\r\n                                bd_r2 -= 1;\r\n                            } else if (r <= borderRange[j].row[1]) {\r\n                                bd_r2 -= 1;\r\n                            }\r\n                        }\r\n\r\n                        if (bd_r2 >= bd_r1) {\r\n                            emptyRange.push({ row: [bd_r1, bd_r2], column: borderRange[j].column });\r\n                        }\r\n                    }\r\n\r\n                    if (emptyRange.length > 0) {\r\n                        let bd_obj = {\r\n                            rangeType: \"range\",\r\n                            borderType: cfg[\"borderInfo\"][i].borderType,\r\n                            style: cfg[\"borderInfo\"][i].style,\r\n                            color: cfg[\"borderInfo\"][i].color,\r\n                            range: emptyRange,\r\n                        };\r\n\r\n                        borderInfo.push(bd_obj);\r\n                    }\r\n                } else if (rangeType == \"cell\") {\r\n                    let row_index = cfg[\"borderInfo\"][i].value.row_index;\r\n\r\n                    if (row_index < st) {\r\n                        borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                    } else if (row_index > ed) {\r\n                        cfg[\"borderInfo\"][i].value.row_index = row_index - (ed - st + 1);\r\n                        borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            cfg[\"borderInfo\"] = borderInfo;\r\n        }\r\n\r\n        // 备注：该处理方式会在删除多行的时候会存在bug\r\n        // 说明：删除多行后，会把同一个row空数组(引用类型)添加成为data多行的数据源，导致设置这些行数据时产生错误。\r\n        //空白行模板\r\n        // let row = [];\r\n        // for (let c = 0; c < d[0].length; c++) {\r\n        //     row.push(null);\r\n        // }\r\n\r\n        // //删除选中行\r\n        // d.splice(st, slen);\r\n\r\n        // //删除多少行，增加多少行空白行\r\n        // for (let r = 0; r < slen; r++) {\r\n        //     d.push(row);\r\n        // }\r\n\r\n        //删除选中行\r\n        d.splice(st, slen);\r\n\r\n        //删除多少行，增加多少行空白行\r\n        // for (let r = 0; r < slen; r++) {\r\n        //     let row = [];\r\n        //     for (let c = 0; c < d[0].length; c++) {\r\n        //         row.push(null);\r\n        //     }\r\n        //     d.push(row);\r\n        // }\r\n    } else {\r\n        type1 = \"c\";\r\n\r\n        //列宽配置变动\r\n        if (cfg[\"columnlen\"] == null) {\r\n            cfg[\"columnlen\"] = {};\r\n        }\r\n\r\n        let columnlen_new = {};\r\n        for (let c in cfg[\"columnlen\"]) {\r\n            if (c < st) {\r\n                columnlen_new[c] = cfg[\"columnlen\"][c];\r\n            } else if (c > ed) {\r\n                columnlen_new[c - slen] = cfg[\"columnlen\"][c];\r\n            }\r\n        }\r\n\r\n        cfg[\"columnlen\"] = columnlen_new;\r\n\r\n        //隐藏列配置变动\r\n        if (cfg[\"colhidden\"] == null) {\r\n            cfg[\"colhidden\"] = {};\r\n        }\r\n\r\n        let colhidden_new = {};\r\n        for (let c in cfg[\"colhidden\"]) {\r\n            if (c < st) {\r\n                colhidden_new[c] = cfg[\"colhidden\"][c];\r\n            } else if (c > ed) {\r\n                colhidden_new[c - slen] = cfg[\"colhidden\"][c];\r\n            }\r\n        }\r\n\r\n        cfg[\"colhidden\"] = colhidden_new;\r\n\r\n        //边框配置变动\r\n        if (cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0) {\r\n            let borderInfo = [];\r\n\r\n            for (let i = 0; i < cfg[\"borderInfo\"].length; i++) {\r\n                let rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n                if (rangeType == \"range\") {\r\n                    let borderRange = cfg[\"borderInfo\"][i].range;\r\n\r\n                    let emptyRange = [];\r\n\r\n                    for (let j = 0; j < borderRange.length; j++) {\r\n                        let bd_c1 = borderRange[j].column[0],\r\n                            bd_c2 = borderRange[j].column[1];\r\n\r\n                        for (let c = st; c <= ed; c++) {\r\n                            if (c < borderRange[j].column[0]) {\r\n                                bd_c1 -= 1;\r\n                                bd_c2 -= 1;\r\n                            } else if (c <= borderRange[j].column[1]) {\r\n                                bd_c2 -= 1;\r\n                            }\r\n                        }\r\n\r\n                        if (bd_c2 >= bd_c1) {\r\n                            emptyRange.push({ row: borderRange[j].row, column: [bd_c1, bd_c2] });\r\n                        }\r\n                    }\r\n\r\n                    if (emptyRange.length > 0) {\r\n                        let bd_obj = {\r\n                            rangeType: \"range\",\r\n                            borderType: cfg[\"borderInfo\"][i].borderType,\r\n                            style: cfg[\"borderInfo\"][i].style,\r\n                            color: cfg[\"borderInfo\"][i].color,\r\n                            range: emptyRange,\r\n                        };\r\n\r\n                        borderInfo.push(bd_obj);\r\n                    }\r\n                } else if (rangeType == \"cell\") {\r\n                    let col_index = cfg[\"borderInfo\"][i].value.col_index;\r\n\r\n                    if (col_index < st) {\r\n                        borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                    } else if (col_index > ed) {\r\n                        cfg[\"borderInfo\"][i].value.col_index = col_index - (ed - st + 1);\r\n                        borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                    }\r\n                }\r\n            }\r\n\r\n            cfg[\"borderInfo\"] = borderInfo;\r\n        }\r\n\r\n        // //空白列模板\r\n        // let addcol = [];\r\n        // for (let r = 0; r < slen; r++) {\r\n        //     addcol.push(null);\r\n        // }\r\n\r\n        for (let r = 0; r < d.length; r++) {\r\n            let row = [].concat(JSON.parse((JSON.stringify(d[r]))));\r\n           //删除该行选中列\r\n           row.splice(st, slen);\r\n           d[r] = row;//将删除列的行数据        赋值给sheet的对应行\r\n       }\r\n    }\r\n\r\n    // 修改当前sheet页时刷新\r\n    if (file.index == Store.currentSheetIndex) {\r\n        jfrefreshgrid_adRC(\r\n            d,\r\n            cfg,\r\n            \"delRC\",\r\n            { index: st, len: ed - st + 1, rc: type1 },\r\n            newCalcChain,\r\n            newFilterObj,\r\n            newCFarr,\r\n            newAFarr,\r\n            newFreezen,\r\n            newDataVerification,\r\n            newHyperlink,\r\n        );\r\n    } else {\r\n        file.data = d;\r\n        file.config = cfg;\r\n        file.calcChain = newCalcChain;\r\n        file.filter = newFilterObj.filter;\r\n        file.filter_select = newFilterObj.filter_select;\r\n        file.luckysheet_conditionformat_save = newCFarr;\r\n        file.luckysheet_alternateformat_save = newAFarr;\r\n        file.dataVerification = newDataVerification;\r\n        file.hyperlink = newHyperlink;\r\n    }\r\n}\r\n\r\n//删除单元格\r\nfunction luckysheetDeleteCell(type, str, edr, stc, edc, sheetIndex) {\r\n    sheetIndex = sheetIndex || Store.currentSheetIndex;\r\n    if (!checkProtectionNotEnable(sheetIndex)) {\r\n        return;\r\n    }\r\n\r\n    // Hook function\r\n    if (!method.createHookFunction(\"rangeDeleteBefore\", str, stc)) {\r\n        return;\r\n    }\r\n\r\n    let curOrder = getSheetIndex(sheetIndex);\r\n    let file = Store.luckysheetfile[curOrder];\r\n\r\n    let d = $.extend(true, [], file.data);\r\n\r\n    let rlen = edr - str + 1;\r\n    let clen = edc - stc + 1;\r\n    let cfg = $.extend(true, {}, Store.config);\r\n\r\n    //合并单元格配置变动\r\n    if (cfg[\"merge\"] == null) {\r\n        cfg[\"merge\"] = {};\r\n    }\r\n\r\n    let merge_new = {};\r\n    for (let m in cfg[\"merge\"]) {\r\n        let mc = cfg[\"merge\"][m];\r\n\r\n        let r = mc.r,\r\n            c = mc.c,\r\n            rs = mc.rs,\r\n            cs = mc.cs;\r\n\r\n        if (type == \"moveLeft\") {\r\n            if (str > r + rs - 1 || edr < r || stc > c + cs - 1) {\r\n                merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs, cs: cs };\r\n            } else if (str <= r && edr >= r + rs - 1 && edc < c) {\r\n                merge_new[r + \"_\" + (c - clen)] = { r: r, c: c - clen, rs: rs, cs: cs };\r\n            } else {\r\n                for (let r_i = r; r_i <= r + rs - 1; r_i++) {\r\n                    for (let c_i = c; c_i <= c + cs - 1; c_i++) {\r\n                        delete d[r_i][c_i].mc;\r\n                    }\r\n                }\r\n            }\r\n        } else if (type == \"moveUp\") {\r\n            if (stc > c + cs - 1 || edc < c || str > r + rs - 1) {\r\n                merge_new[r + \"_\" + c] = { r: r, c: c, rs: rs, cs: cs };\r\n            } else if (stc <= c && edc >= c + cs - 1 && edr < r) {\r\n                merge_new[r - rlen + \"_\" + c] = { r: r - rlen, c: c, rs: rs, cs: cs };\r\n            } else {\r\n                for (let r_i = r; r_i <= r + rs - 1; r_i++) {\r\n                    for (let c_i = c; c_i <= c + cs - 1; c_i++) {\r\n                        delete d[r_i][c_i].mc;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n    cfg[\"merge\"] = merge_new;\r\n\r\n    //公式配置变动\r\n    let calcChain = file.calcChain;\r\n    let newCalcChain = [];\r\n    if (calcChain != null && calcChain.length > 0) {\r\n        for (let i = 0; i < calcChain.length; i++) {\r\n            let calc = $.extend(true, {}, calcChain[i]);\r\n            let calc_r = calc.r,\r\n                calc_c = calc.c,\r\n                calc_i = calc.index,\r\n                calc_funcStr = getcellFormula(calc_r, calc_c, calc_i);\r\n\r\n                // 添加进公式后，可能又直接覆盖了单元格值\r\n                if(!calc_funcStr) continue\r\n\r\n            if (calc_r < str || calc_r > edr || calc_c < stc || calc_c > edc) {\r\n                let functionStr;\r\n\r\n                if (type == \"moveLeft\") {\r\n                    functionStr = \"=\" + formula.functionStrChange(calc_funcStr, \"del\", \"col\", null, stc, clen);\r\n\r\n                    if (calc_c > edc && calc_r >= str && calc_r <= edr) {\r\n                        calc.c = calc_c - clen;\r\n                    }\r\n                } else if (type == \"moveUp\") {\r\n                    functionStr = \"=\" + formula.functionStrChange(calc_funcStr, \"del\", \"row\", null, str, rlen);\r\n\r\n                    if (calc_r > edr && calc_c >= stc && calc_c <= edc) {\r\n                        calc.r = calc_r - rlen;\r\n                    }\r\n                }\r\n\r\n                if (d[calc_r][calc_c] && d[calc_r][calc_c].f == calc_funcStr) {\r\n                    d[calc_r][calc_c].f = functionStr;\r\n                }\r\n\r\n                newCalcChain.push(calc);\r\n            }\r\n        }\r\n    }\r\n\r\n    //筛选配置变动\r\n    let filter_select = file.filter_select;\r\n    let filter = file.filter;\r\n    let newFilterObj = null;\r\n    if (filter_select != null && JSON.stringify(filter_select) != \"{}\") {\r\n        newFilterObj = { filter_select: null, filter: null };\r\n\r\n        let f_r1 = filter_select.row[0],\r\n            f_r2 = filter_select.row[1];\r\n        let f_c1 = filter_select.column[0],\r\n            f_c2 = filter_select.column[1];\r\n\r\n        if (type == \"moveUp\") {\r\n            if (f_c1 >= stc && f_c2 <= edc) {\r\n                if (f_r1 > edr) {\r\n                    newFilterObj.filter_select = {\r\n                        row: [f_r1 - rlen, f_r2 - rlen],\r\n                        column: [f_c1, f_c2],\r\n                    };\r\n                } else if (f_r2 < str) {\r\n                    newFilterObj.filter_select = {\r\n                        row: [f_r1, f_r2],\r\n                        column: [f_c1, f_c2],\r\n                    };\r\n                } else if (f_r1 < str) {\r\n                    if (f_r2 > edr) {\r\n                        newFilterObj.filter_select = {\r\n                            row: [f_r1, f_r2 - rlen],\r\n                            column: [f_c1, f_c2],\r\n                        };\r\n                    } else {\r\n                        newFilterObj.filter_select = {\r\n                            row: [f_r1, str - 1],\r\n                            column: [f_c1, f_c2],\r\n                        };\r\n                    }\r\n                }\r\n\r\n                if (newFilterObj.filter_select != null && filter != null) {\r\n                    for (let k in filter) {\r\n                        let f_rowhidden = filter[k].rowhidden;\r\n                        let f_rowhidden_new = {};\r\n\r\n                        for (let n in f_rowhidden) {\r\n                            if (n < str) {\r\n                                f_rowhidden_new[n] = 0;\r\n                            } else if (n > edr) {\r\n                                f_rowhidden_new[n - slen] = 0;\r\n                            }\r\n                        }\r\n\r\n                        if (newFilterObj.filter == null) {\r\n                            newFilterObj.filter = {};\r\n                        }\r\n                        newFilterObj.filter[k] = $.extend(true, {}, filter[k]);\r\n\r\n                        if (JSON.stringify(f_rowhidden_new) != \"{}\") {\r\n                            newFilterObj.filter[k].rowhidden = f_rowhidden_new;\r\n                        }\r\n\r\n                        newFilterObj.filter[k].str = newFilterObj.filter_select.row[0];\r\n                        newFilterObj.filter[k].edr = newFilterObj.filter_select.row[1];\r\n                    }\r\n                }\r\n            } else if (f_r1 >= str && f_r2 <= edr) {\r\n                if (f_c1 > edc) {\r\n                    newFilterObj.filter_select = {\r\n                        row: [f_r1, f_r2],\r\n                        column: [f_c1, f_c2],\r\n                    };\r\n                } else if (f_c1 >= stc) {\r\n                    if (f_c2 > edc) {\r\n                        newFilterObj.filter_select = {\r\n                            row: [f_r1, f_r2],\r\n                            column: [stc, f_c2 - clen],\r\n                        };\r\n                    }\r\n                } else {\r\n                    if (f_c2 < stc) {\r\n                        newFilterObj.filter_select = {\r\n                            row: [f_r1, f_r2],\r\n                            column: [f_c1, f_c2],\r\n                        };\r\n                    } else if (f_c2 <= edc) {\r\n                        newFilterObj.filter_select = {\r\n                            row: [f_r1, f_r2],\r\n                            column: [f_c1, stc - 1],\r\n                        };\r\n                    } else {\r\n                        newFilterObj.filter_select = {\r\n                            row: [f_r1, f_r2],\r\n                            column: [f_c1, f_c2 - clen],\r\n                        };\r\n                    }\r\n                }\r\n\r\n                if (newFilterObj.filter_select != null && filter != null) {\r\n                    for (let k in filter) {\r\n                        let f_stc = newFilterObj.filter_select.column[0];\r\n                        let f_edc = newFilterObj.filter_select.column[1];\r\n                        let f_cindex = filter[k].cindex;\r\n\r\n                        if (f_cindex < stc || f_cindex > edc) {\r\n                            if (newFilterObj.filter == null) {\r\n                                newFilterObj.filter = {};\r\n                            }\r\n\r\n                            if (f_cindex > edc) {\r\n                                f_cindex -= clen;\r\n                            }\r\n\r\n                            let k2 = f_cindex - f_stc;\r\n\r\n                            newFilterObj.filter[k2] = $.extend(true, {}, filter[k]);\r\n                            newFilterObj.filter[k2].cindex = f_cindex;\r\n                            newFilterObj.filter[k2].stc = f_stc;\r\n                            newFilterObj.filter[k2].edc = f_edc;\r\n                        }\r\n                    }\r\n                }\r\n            } else {\r\n                newFilterObj.filter_select = {\r\n                    row: [f_r1, f_r2],\r\n                    column: [f_c1, f_c2],\r\n                };\r\n\r\n                if (filter != null) {\r\n                    newFilterObj.filter = filter;\r\n                }\r\n            }\r\n        } else if (type == \"moveLeft\") {\r\n            if (f_r1 >= str && f_r2 <= edr) {\r\n                if (f_c1 > edc) {\r\n                    newFilterObj.filter_select = {\r\n                        row: [f_r1, f_r2],\r\n                        column: [f_c1 - clen, f_c2 - clen],\r\n                    };\r\n                } else if (f_c2 < stc) {\r\n                    newFilterObj.filter_select = {\r\n                        row: [f_r1, f_r2],\r\n                        column: [f_c1, f_c2],\r\n                    };\r\n                } else if (f_c1 < stc) {\r\n                    if (f_c2 > edc) {\r\n                        newFilterObj.filter_select = {\r\n                            row: [f_r1, f_r2],\r\n                            column: [f_c1, f_c2 - clen],\r\n                        };\r\n                    } else {\r\n                        newFilterObj.filter_select = {\r\n                            row: [f_r1, f_r2],\r\n                            column: [f_c1, stc - 1],\r\n                        };\r\n                    }\r\n                }\r\n\r\n                if (newFilterObj.filter_select != null && filter != null) {\r\n                    for (let k in filter) {\r\n                        let f_stc = newFilterObj.filter_select.column[0];\r\n                        let f_edc = newFilterObj.filter_select.column[1];\r\n                        let f_cindex = filter[k].cindex;\r\n\r\n                        if (f_cindex < stc || f_cindex > edc) {\r\n                            if (newFilterObj.filter == null) {\r\n                                newFilterObj.filter = {};\r\n                            }\r\n\r\n                            if (f_cindex > edc) {\r\n                                f_cindex -= clen;\r\n                            }\r\n\r\n                            let k2 = f_cindex - f_stc;\r\n\r\n                            newFilterObj.filter[k2] = $.extend(true, {}, filter[k]);\r\n                            newFilterObj.filter[k2].cindex = f_cindex;\r\n                            newFilterObj.filter[k2].stc = f_stc;\r\n                            newFilterObj.filter[k2].edc = f_edc;\r\n                        }\r\n                    }\r\n                }\r\n            } else if (f_c1 >= stc && f_c2 <= edc) {\r\n                if (f_r1 < str || f_r1 > edr) {\r\n                    newFilterObj.filter_select = {\r\n                        row: [f_r1, f_r2],\r\n                        column: [f_c1, f_c2],\r\n                    };\r\n\r\n                    if (filter != null) {\r\n                        newFilterObj.filter = filter;\r\n                    }\r\n                }\r\n            } else {\r\n                newFilterObj.filter_select = {\r\n                    row: [f_r1, f_r2],\r\n                    column: [f_c1, f_c2],\r\n                };\r\n\r\n                if (filter != null) {\r\n                    newFilterObj.filter = filter;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if (newFilterObj != null && newFilterObj.filter != null) {\r\n        if (cfg[\"rowhidden\"] == null) {\r\n            cfg[\"rowhidden\"] = {};\r\n        }\r\n\r\n        for (let k in newFilterObj.filter) {\r\n            let f_rowhidden = newFilterObj.filter[k].rowhidden;\r\n\r\n            for (let n in f_rowhidden) {\r\n                cfg[\"rowhidden\"][n] = 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    //条件格式配置变动\r\n    let CFarr = file.luckysheet_conditionformat_save;\r\n    let newCFarr = [];\r\n    if (CFarr != null && CFarr.length > 0) {\r\n        for (let i = 0; i < CFarr.length; i++) {\r\n            let cf_range = CFarr[i].cellrange;\r\n            let cf_new_range = [];\r\n\r\n            for (let j = 0; j < cf_range.length; j++) {\r\n                let CFr1 = cf_range[j].row[0],\r\n                    CFr2 = cf_range[j].row[1],\r\n                    CFc1 = cf_range[j].column[0],\r\n                    CFc2 = cf_range[j].column[1];\r\n\r\n                if (!(str <= CFr1 && edr >= CFr2 && stc <= CFc1 && edc >= CFc2)) {\r\n                    cf_new_range = getMoveRange(type, str, edr, stc, edc, CFr1, CFr2, CFc1, CFc2, rlen, clen);\r\n                }\r\n            }\r\n\r\n            if (cf_new_range.length > 0) {\r\n                let cf = $.extend(true, {}, CFarr[i]);\r\n                cf.cellrange = cf_new_range;\r\n\r\n                newCFarr.push(cf);\r\n            }\r\n        }\r\n    }\r\n\r\n    //数据验证配置变动\r\n    let dataVerification = file.dataVerification;\r\n    let newDataVerification = {};\r\n    if (dataVerification != null) {\r\n        for (let key in dataVerification) {\r\n            let r = Number(key.split(\"_\")[0]),\r\n                c = Number(key.split(\"_\")[1]);\r\n            let item = dataVerification[key];\r\n\r\n            if (r < str || r > edr || c < stc || c > edc) {\r\n                if (type == \"moveLeft\") {\r\n                    if (c > edc && r >= str && r <= edr) {\r\n                        newDataVerification[r + \"_\" + (c - clen)] = item;\r\n                    } else {\r\n                        newDataVerification[r + \"_\" + c] = item;\r\n                    }\r\n                } else if (type == \"moveUp\") {\r\n                    if (r > edr && c >= stc && c <= edc) {\r\n                        newDataVerification[r - rlen + \"_\" + c] = item;\r\n                    } else {\r\n                        newDataVerification[r + \"_\" + c] = item;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //超链接配置变动\r\n    let hyperlink = file.hyperlink;\r\n    let newHyperlink = {};\r\n    if (hyperlink != null) {\r\n        for (let key in hyperlink) {\r\n            let r = Number(key.split(\"_\")[0]),\r\n                c = Number(key.split(\"_\")[1]);\r\n            let item = hyperlink[key];\r\n\r\n            if (r < str || r > edr || c < stc || c > edc) {\r\n                if (type == \"moveLeft\") {\r\n                    if (c > edc && r >= str && r <= edr) {\r\n                        newHyperlink[r + \"_\" + (c - clen)] = item;\r\n                    } else {\r\n                        newHyperlink[r + \"_\" + c] = item;\r\n                    }\r\n                } else if (type == \"moveUp\") {\r\n                    if (r > edr && c >= stc && c <= edc) {\r\n                        newHyperlink[r - rlen + \"_\" + c] = item;\r\n                    } else {\r\n                        newHyperlink[r + \"_\" + c] = item;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //边框配置变动\r\n    if (cfg[\"borderInfo\"] && cfg[\"borderInfo\"].length > 0) {\r\n        let borderInfo = [];\r\n\r\n        for (let i = 0; i < cfg[\"borderInfo\"].length; i++) {\r\n            let rangeType = cfg[\"borderInfo\"][i].rangeType;\r\n\r\n            if (rangeType == \"range\") {\r\n                let borderRange = cfg[\"borderInfo\"][i].range;\r\n\r\n                let emptyRange = [];\r\n\r\n                for (let j = 0; j < borderRange.length; j++) {\r\n                    let bd_r1 = borderRange[j].row[0],\r\n                        bd_r2 = borderRange[j].row[1],\r\n                        bd_c1 = borderRange[j].column[0],\r\n                        bd_c2 = borderRange[j].column[1];\r\n\r\n                    if (!(str <= bd_r1 && edr >= bd_r2 && stc <= bd_c1 && edc >= bd_c2)) {\r\n                        emptyRange = getMoveRange(type, str, edr, stc, edc, bd_r1, bd_r2, bd_c1, bd_c2, rlen, clen);\r\n                    }\r\n                }\r\n\r\n                if (emptyRange.length > 0) {\r\n                    let bd_obj = {\r\n                        rangeType: \"range\",\r\n                        borderType: cfg[\"borderInfo\"][i].borderType,\r\n                        style: cfg[\"borderInfo\"][i].style,\r\n                        color: cfg[\"borderInfo\"][i].color,\r\n                        range: emptyRange,\r\n                    };\r\n\r\n                    borderInfo.push(bd_obj);\r\n                }\r\n            } else if (rangeType == \"cell\") {\r\n                let row_index = cfg[\"borderInfo\"][i].value.row_index;\r\n                let col_index = cfg[\"borderInfo\"][i].value.col_index;\r\n\r\n                if (row_index < str || row_index > edr || col_index < stc || col_index > edc) {\r\n                    if (type == \"moveLeft\") {\r\n                        if (col_index > edc && row_index >= str && row_index <= edr) {\r\n                            col_index -= clen;\r\n                            cfg[\"borderInfo\"][i].value.col_index = col_index;\r\n                        }\r\n                    } else if (type == \"moveUp\") {\r\n                        if (row_index > edr && col_index >= stc && col_index <= edc) {\r\n                            row_index -= rlen;\r\n                            cfg[\"borderInfo\"][i].value.row_index = row_index;\r\n                        }\r\n                    }\r\n\r\n                    borderInfo.push(cfg[\"borderInfo\"][i]);\r\n                }\r\n            }\r\n        }\r\n\r\n        cfg[\"borderInfo\"] = borderInfo;\r\n    }\r\n\r\n    //空白列模板\r\n    let addcol = [];\r\n    for (let c = stc; c <= edc; c++) {\r\n        addcol.push(null);\r\n    }\r\n\r\n    if (type == \"moveUp\") {\r\n        //上移\r\n        let data = [];\r\n\r\n        for (let r = str; r <= d.length - 1; r++) {\r\n            let row = [];\r\n\r\n            for (let c = stc; c <= edc; c++) {\r\n                row.push(d[r][c]);\r\n            }\r\n\r\n            data.push(row);\r\n        }\r\n\r\n        data.splice(0, rlen);\r\n\r\n        //空白行模板\r\n        let addrow = [];\r\n        for (let r = str; r <= edr; r++) {\r\n            addrow.push(addcol);\r\n        }\r\n\r\n        data = data.concat(addrow);\r\n\r\n        for (let r = str; r <= d.length - 1; r++) {\r\n            for (let c = stc; c <= edc; c++) {\r\n                d[r][c] = data[r - str][c - stc];\r\n            }\r\n        }\r\n    } else if (type == \"moveLeft\") {\r\n        //左移\r\n        for (let r = str; r <= edr; r++) {\r\n            d[r].splice(stc, clen);\r\n            d[r] = d[r].concat(addcol);\r\n        }\r\n    }\r\n\r\n    if (file.index == Store.currentSheetIndex) {\r\n        jfrefreshgrid_deleteCell(\r\n            d,\r\n            cfg,\r\n            { type: type, str: str, edr: edr, stc: stc, edc: edc },\r\n            newCalcChain,\r\n            newFilterObj,\r\n            newCFarr,\r\n            newDataVerification,\r\n            newHyperlink,\r\n        );\r\n    } else {\r\n        file.data = d;\r\n        file.config = cfg;\r\n        file.calcChain = newCalcChain;\r\n        file.filter = newFilterObj.filter;\r\n        file.filter_select = newFilterObj.filter_select;\r\n        file.luckysheet_conditionformat_save = newCFarr;\r\n        file.dataVerification = newDataVerification;\r\n        file.hyperlink = newHyperlink;\r\n    }\r\n}\r\n\r\nfunction getMoveRange(type, str, edr, stc, edc, r1, r2, c1, c2, rlen, clen) {\r\n    let newRange = [];\r\n\r\n    if (type == \"moveLeft\") {\r\n        if (str > r2 || edr < r1 || stc > c2) {\r\n            newRange.push({\r\n                row: [r1, r2],\r\n                column: [c1, c2],\r\n            });\r\n        } else if (edc < c1) {\r\n            if (str <= r1 && edr >= r2) {\r\n                newRange.push({\r\n                    row: [r1, r2],\r\n                    column: [c1 - clen, c2 - clen],\r\n                });\r\n            } else if (str > r1 && edr < r2) {\r\n                let range = [\r\n                    { row: [r1, str - 1], column: [c1, c2] },\r\n                    { row: [edr + 1, r2], column: [c1, c2] },\r\n                    { row: [str, edr], column: [c1 - clen, c2 - clen] },\r\n                ];\r\n                newRange = newRange.concat(range);\r\n            } else if (str > r1) {\r\n                let range = [\r\n                    { row: [r1, str - 1], column: [c1, c2] },\r\n                    { row: [str, r2], column: [c1 - clen, c2 - clen] },\r\n                ];\r\n                newRange = newRange.concat(range);\r\n            } else if (edr < r2) {\r\n                let range = [\r\n                    { row: [r1, edr], column: [c1 - clen, c2 - clen] },\r\n                    { row: [edr + 1, r2], column: [c1, c2] },\r\n                ];\r\n                newRange = newRange.concat(range);\r\n            }\r\n        } else if (edc >= c1) {\r\n            if (stc <= c1 && edc >= c2) {\r\n                if (str > r1 && edr < r2) {\r\n                    let range = [\r\n                        { row: [r1, str - 1], column: [c1, c2] },\r\n                        { row: [edr + 1, r2], column: [c1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (str > r1) {\r\n                    let range = [{ row: [r1, str - 1], column: [c1, c2] }];\r\n                    newRange = newRange.concat(range);\r\n                } else if (edr < r2) {\r\n                    let range = [{ row: [edr + 1, r2], column: [c1, c2] }];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            } else if (stc > c1 && edc < c2) {\r\n                if (str <= r1 && edr >= r2) {\r\n                    newRange.push({\r\n                        row: [r1, r2],\r\n                        column: [c1, c2 - clen],\r\n                    });\r\n                } else if (str > r1 && edr < r2) {\r\n                    let range = [\r\n                        { row: [r1, str - 1], column: [c1, c2] },\r\n                        { row: [edr + 1, r2], column: [c1, c2] },\r\n                        { row: [str, edr], column: [c1, c2 - clen] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (str > r1) {\r\n                    let range = [\r\n                        { row: [r1, str - 1], column: [c1, c2] },\r\n                        { row: [str, r2], column: [c1, c2 - clen] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (edr < r2) {\r\n                    let range = [\r\n                        { row: [r1, edr], column: [c1, c2 - clen] },\r\n                        { row: [edr + 1, r2], column: [c1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            } else if (stc > c1) {\r\n                if (str <= r1 && edr >= r2) {\r\n                    newRange.push({\r\n                        row: [r1, r2],\r\n                        column: [c1, stc - 1],\r\n                    });\r\n                } else if (str > r1 && edr < r2) {\r\n                    let range = [\r\n                        { row: [r1, str - 1], column: [c1, c2] },\r\n                        { row: [edr + 1, r2], column: [c1, c2] },\r\n                        { row: [str, edr], column: [c1, stc - 1] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (str > r1) {\r\n                    let range = [\r\n                        { row: [r1, str - 1], column: [c1, c2] },\r\n                        { row: [str, r2], column: [c1, stc - 1] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (edr < r2) {\r\n                    let range = [\r\n                        { row: [r1, edr], column: [c1, stc - 1] },\r\n                        { row: [edr + 1, r2], column: [c1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            } else if (edc < c2) {\r\n                if (str <= r1 && edr >= r2) {\r\n                    newRange.push({\r\n                        row: [r1, r2],\r\n                        column: [c1 - clen, c2 - clen],\r\n                    });\r\n                } else if (str > r1 && edr < r2) {\r\n                    let range = [\r\n                        { row: [r1, str - 1], column: [c1, c2] },\r\n                        { row: [edr + 1, r2], column: [c1, c2] },\r\n                        { row: [str, edr], column: [c1 - clen, c2 - clen] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (str > r1) {\r\n                    let range = [\r\n                        { row: [r1, str - 1], column: [c1, c2] },\r\n                        { row: [str, r2], column: [c1 - clen, c2 - clen] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (edr < r2) {\r\n                    let range = [\r\n                        { row: [r1, edr], column: [c1 - clen, c2 - clen] },\r\n                        { row: [edr + 1, r2], column: [c1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            }\r\n        }\r\n    } else if (type == \"moveUp\") {\r\n        if (stc > c2 || edc < c1 || str > r2) {\r\n            newRange.push({\r\n                row: [r1, r2],\r\n                column: [c1, c2],\r\n            });\r\n        } else if (edr < r1) {\r\n            if (stc <= c1 && edc >= c2) {\r\n                newRange.push({\r\n                    row: [r1 - rlen, r2 - rlen],\r\n                    column: [c1, c2],\r\n                });\r\n            } else if (stc > c1 && edc < c2) {\r\n                let range = [\r\n                    { row: [r1, r2], column: [c1, stc - 1] },\r\n                    { row: [r1, r2], column: [edc + 1, c2] },\r\n                    { row: [r1 - rlen, r2 - rlen], column: [stc, edc] },\r\n                ];\r\n                newRange = newRange.concat(range);\r\n            } else if (stc > c1) {\r\n                let range = [\r\n                    { row: [r1, r2], column: [c1, stc - 1] },\r\n                    { row: [r1 - rlen, r2 - rlen], column: [stc, c2] },\r\n                ];\r\n                newRange = newRange.concat(range);\r\n            } else if (edc < c2) {\r\n                let range = [\r\n                    { row: [r1 - rlen, r2 - rlen], column: [c1, edc] },\r\n                    { row: [r1, r2], column: [edc + 1, c2] },\r\n                ];\r\n                newRange = newRange.concat(range);\r\n            }\r\n        } else if (edr >= r1) {\r\n            if (str <= r1 && edr >= r2) {\r\n                if (stc > c1 && edc < c2) {\r\n                    let range = [\r\n                        { row: [r1, r2], column: [c1, stc - 1] },\r\n                        { row: [r1, r2], column: [edc + 1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (stc > c1) {\r\n                    let range = [{ row: [r1, r2], column: [c1, stc - 1] }];\r\n                    newRange = newRange.concat(range);\r\n                } else if (edc < c2) {\r\n                    let range = [{ row: [r1, r2], column: [edc + 1, c2] }];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            } else if (str > r1 && edr < r2) {\r\n                if (stc <= c1 && edc >= c2) {\r\n                    newRange.push({\r\n                        row: [r1, r2 - rlen],\r\n                        column: [c1, c2],\r\n                    });\r\n                } else if (stc > c1 && edc < c2) {\r\n                    let range = [\r\n                        { row: [r1, r2], column: [c1, stc - 1] },\r\n                        { row: [r1, r2], column: [edc + 1, c2] },\r\n                        { row: [r1, r2 - rlen], column: [stc, edc] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (stc > c1) {\r\n                    let range = [\r\n                        { row: [r1, r2], column: [c1, stc - 1] },\r\n                        { row: [r1, r2 - rlen], column: [stc, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (edc < c2) {\r\n                    let range = [\r\n                        { row: [r1, r2 - rlen], column: [c1, edc] },\r\n                        { row: [r1, r2], column: [edc + 1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            } else if (str > r1) {\r\n                if (stc <= c1 && edc >= c2) {\r\n                    newRange.push({\r\n                        row: [r1, str - 1],\r\n                        column: [c1, c2],\r\n                    });\r\n                } else if (stc > c1 && edc < c2) {\r\n                    let range = [\r\n                        { row: [r1, r2], column: [c1, stc - 1] },\r\n                        { row: [r1, r2], column: [edc + 1, c2] },\r\n                        { row: [r1, str - 1], column: [stc, edc] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (stc > c1) {\r\n                    let range = [\r\n                        { row: [r1, r2], column: [c1, stc - 1] },\r\n                        { row: [r1, str - 1], column: [stc, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (edc < c2) {\r\n                    let range = [\r\n                        { row: [r1, str - 1], column: [c1, edc] },\r\n                        { row: [r1, r2], column: [edc + 1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            } else if (edr < r2) {\r\n                if (stc <= c1 && edc >= c2) {\r\n                    newRange.push({\r\n                        row: [r1 - rlen, r2 - rlen],\r\n                        column: [c1, c2],\r\n                    });\r\n                } else if (stc > c1 && edc < c2) {\r\n                    let range = [\r\n                        { row: [r1, r2], column: [c1, stc - 1] },\r\n                        { row: [r1, r2], column: [edc + 1, c2] },\r\n                        { row: [r1 - rlen, r2 - rlen], column: [stc, edc] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (stc > c1) {\r\n                    let range = [\r\n                        { row: [r1, r2], column: [c1, stc - 1] },\r\n                        { row: [r1 - rlen, r2 - rlen], column: [stc, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                } else if (edc < c2) {\r\n                    let range = [\r\n                        { row: [r1 - rlen, r2 - rlen], column: [c1, edc] },\r\n                        { row: [r1, r2], column: [edc + 1, c2] },\r\n                    ];\r\n                    newRange = newRange.concat(range);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return newRange;\r\n}\r\n\r\nexport { luckysheetextendtable, luckysheetextendData, luckysheetdeletetable, luckysheetDeleteCell };\r\n"
  },
  {
    "path": "src/global/format.js",
    "content": "import { isRealNum, valueIsError } from './validate';\r\nimport { isdatetime } from './datecontroll';\r\nimport { getcellvalue } from './getdata';\r\nimport numeral from 'numeral';\r\n\r\nvar SSF = ({});\r\nvar make_ssf = function make_ssf(SSF) {\r\n    SSF.version = '0.11.2';\r\n\r\n    function _strrev(x) {\r\n        var o = \"\",\r\n            i = x.length - 1;\r\n        while (i >= 0) o += x.charAt(i--);\r\n        return o;\r\n    }\r\n\r\n    function fill(c, l) {\r\n        var o = \"\";\r\n        while (o.length < l) o += c;\r\n        return o;\r\n    }\r\n\r\n    function pad0(v, d) {\r\n        var t = \"\" + v;\r\n        return t.length >= d ? t : fill('0', d - t.length) + t;\r\n    }\r\n\r\n    function pad_(v, d) {\r\n        var t = \"\" + v;\r\n        return t.length >= d ? t : fill(' ', d - t.length) + t;\r\n    }\r\n\r\n    function rpad_(v, d) {\r\n        var t = \"\" + v;\r\n        return t.length >= d ? t : t + fill(' ', d - t.length);\r\n    }\r\n\r\n    function pad0r1(v, d) {\r\n        var t = \"\" + Math.round(v);\r\n        return t.length >= d ? t : fill('0', d - t.length) + t;\r\n    }\r\n\r\n    function pad0r2(v, d) {\r\n        var t = \"\" + v;\r\n        return t.length >= d ? t : fill('0', d - t.length) + t;\r\n    }\r\n    var p2_32 = Math.pow(2, 32);\r\n\r\n    function pad0r(v, d) {\r\n        if (v > p2_32 || v < -p2_32) return pad0r1(v, d);\r\n        var i = Math.round(v);\r\n        return pad0r2(i, d);\r\n    }\r\n\r\n    function isgeneral(s, i) {\r\n        i = i || 0;\r\n        return s.length >= 7 + i && (s.charCodeAt(i) | 32) === 103 && (s.charCodeAt(i + 1) | 32) === 101 && (s.charCodeAt(i + 2) | 32) === 110 && (s.charCodeAt(i + 3) | 32) === 101 && (s.charCodeAt(i + 4) | 32) === 114 && (s.charCodeAt(i + 5) | 32) === 97 && (s.charCodeAt(i + 6) | 32) === 108;\r\n    }\r\n    var days = [\r\n        ['Sun', 'Sunday'],\r\n        ['Mon', 'Monday'],\r\n        ['Tue', 'Tuesday'],\r\n        ['Wed', 'Wednesday'],\r\n        ['Thu', 'Thursday'],\r\n        ['Fri', 'Friday'],\r\n        ['Sat', 'Saturday']\r\n    ];\r\n    var months = [\r\n        ['J', 'Jan', 'January'],\r\n        ['F', 'Feb', 'February'],\r\n        ['M', 'Mar', 'March'],\r\n        ['A', 'Apr', 'April'],\r\n        ['M', 'May', 'May'],\r\n        ['J', 'Jun', 'June'],\r\n        ['J', 'Jul', 'July'],\r\n        ['A', 'Aug', 'August'],\r\n        ['S', 'Sep', 'September'],\r\n        ['O', 'Oct', 'October'],\r\n        ['N', 'Nov', 'November'],\r\n        ['D', 'Dec', 'December']\r\n    ];\r\n\r\n    function init_table(t) {\r\n        t[0] = 'General';\r\n        t[1] = '0';\r\n        t[2] = '0.00';\r\n        t[3] = '#,##0';\r\n        t[4] = '#,##0.00';\r\n        t[9] = '0%';\r\n        t[10] = '0.00%';\r\n        t[11] = '0.00E+00';\r\n        t[12] = '# ?/?';\r\n        t[13] = '# ??/??';\r\n        t[14] = 'm/d/yy';\r\n        t[15] = 'd-mmm-yy';\r\n        t[16] = 'd-mmm';\r\n        t[17] = 'mmm-yy';\r\n        t[18] = 'h:mm AM/PM';\r\n        t[19] = 'h:mm:ss AM/PM';\r\n        t[20] = 'h:mm';\r\n        t[21] = 'h:mm:ss';\r\n        t[22] = 'm/d/yy h:mm';\r\n        t[37] = '#,##0 ;(#,##0)';\r\n        t[38] = '#,##0 ;[Red](#,##0)';\r\n        t[39] = '#,##0.00;(#,##0.00)';\r\n        t[40] = '#,##0.00;[Red](#,##0.00)';\r\n        t[45] = 'mm:ss';\r\n        t[46] = '[h]:mm:ss';\r\n        t[47] = 'mmss.0';\r\n        t[48] = '##0.0E+0';\r\n        t[49] = '@';\r\n        t[56] = '\"上午/下午 \"hh\"時\"mm\"分\"ss\"秒 \"';\r\n        t[65535] = 'General';\r\n    }\r\n    var table_fmt = {};\r\n    init_table(table_fmt);\r\n    /* Defaults determined by systematically testing in Excel 2019 */\r\n    /* These formats appear to default to other formats in the table */\r\n    var default_map = [];\r\n    var defi = 0;\r\n    //  5 -> 37 ...  8 -> 40\r\n    for (defi = 5; defi <= 8; ++defi) default_map[defi] = 32 + defi;\r\n    // 23 ->  0 ... 26 ->  0\r\n    for (defi = 23; defi <= 26; ++defi) default_map[defi] = 0;\r\n    // 27 -> 14 ... 31 -> 14\r\n    for (defi = 27; defi <= 31; ++defi) default_map[defi] = 14;\r\n    // 50 -> 14 ... 58 -> 14\r\n    for (defi = 50; defi <= 58; ++defi) default_map[defi] = 14;\r\n    // 59 ->  1 ... 62 ->  4\r\n    for (defi = 59; defi <= 62; ++defi) default_map[defi] = defi - 58;\r\n    // 67 ->  9 ... 68 -> 10\r\n    for (defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 58;\r\n    // 72 -> 14 ... 75 -> 17\r\n    for (defi = 72; defi <= 75; ++defi) default_map[defi] = defi - 58;\r\n    // 69 -> 12 ... 71 -> 14\r\n    for (defi = 67; defi <= 68; ++defi) default_map[defi] = defi - 57;\r\n    // 76 -> 20 ... 78 -> 22\r\n    for (defi = 76; defi <= 78; ++defi) default_map[defi] = defi - 56;\r\n    // 79 -> 45 ... 81 -> 47\r\n    for (defi = 79; defi <= 81; ++defi) default_map[defi] = defi - 34;\r\n    // 82 ->  0 ... 65536 -> 0 (omitted)\r\n    /* These formats technically refer to Accounting formats with no equivalent */\r\n    var default_str = [];\r\n    //  5 -- Currency,   0 decimal, black negative\r\n    default_str[5] = default_str[63] = '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)';\r\n    //  6 -- Currency,   0 decimal, red   negative\r\n    default_str[6] = default_str[64] = '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)';\r\n    //  7 -- Currency,   2 decimal, black negative\r\n    default_str[7] = default_str[65] = '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)';\r\n    //  8 -- Currency,   2 decimal, red   negative\r\n    default_str[8] = default_str[66] = '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)';\r\n    // 41 -- Accounting, 0 decimal, No Symbol\r\n    default_str[41] = '_(* #,##0_);_(* \\\\(#,##0\\\\);_(* \"-\"_);_(@_)';\r\n    // 42 -- Accounting, 0 decimal, $  Symbol\r\n    default_str[42] = '_(\"$\"* #,##0_);_(\"$\"* \\\\(#,##0\\\\);_(\"$\"* \"-\"_);_(@_)';\r\n    // 43 -- Accounting, 2 decimal, No Symbol\r\n    default_str[43] = '_(* #,##0.00_);_(* \\\\(#,##0.00\\\\);_(* \"-\"??_);_(@_)';\r\n    // 44 -- Accounting, 2 decimal, $  Symbol\r\n    default_str[44] = '_(\"$\"* #,##0.00_);_(\"$\"* \\\\(#,##0.00\\\\);_(\"$\"* \"-\"??_);_(@_)';\r\n\r\n    function frac(x, D, mixed) {\r\n        var sgn = x < 0 ? -1 : 1;\r\n        var B = x * sgn;\r\n        var P_2 = 0,\r\n            P_1 = 1,\r\n            P = 0;\r\n        var Q_2 = 1,\r\n            Q_1 = 0,\r\n            Q = 0;\r\n        var A = Math.floor(B);\r\n        while (Q_1 < D) {\r\n            A = Math.floor(B);\r\n            P = A * P_1 + P_2;\r\n            Q = A * Q_1 + Q_2;\r\n            if ((B - A) < 0.00000005) break;\r\n            B = 1 / (B - A);\r\n            P_2 = P_1;\r\n            P_1 = P;\r\n            Q_2 = Q_1;\r\n            Q_1 = Q;\r\n        }\r\n        if (Q > D) {\r\n            if (Q_1 > D) {\r\n                Q = Q_2;\r\n                P = P_2;\r\n            } else {\r\n                Q = Q_1;\r\n                P = P_1;\r\n            }\r\n        }\r\n        if (!mixed) return [0, sgn * P, Q];\r\n        var q = Math.floor(sgn * P / Q);\r\n        return [q, sgn * P - q * Q, Q];\r\n    }\r\n\r\n    function parse_date_code(v, opts, b2) {\r\n        if (v > 2958465 || v < 0) return null;\r\n        var date = (v | 0),\r\n            time = Math.floor(86400 * (v - date)),\r\n            dow = 0;\r\n        var dout = [];\r\n        var out = {\r\n            D: date,\r\n            T: time,\r\n            u: 86400 * (v - date) - time,\r\n            y: 0,\r\n            m: 0,\r\n            d: 0,\r\n            H: 0,\r\n            M: 0,\r\n            S: 0,\r\n            q: 0\r\n        };\r\n        if (Math.abs(out.u) < 1e-6) out.u = 0;\r\n        if (opts && opts.date1904) date += 1462;\r\n        if (out.u > 0.9999) {\r\n            out.u = 0;\r\n            if (++time == 86400) {\r\n                out.T = time = 0;\r\n                ++date;\r\n                ++out.D;\r\n            }\r\n        }\r\n        if (date === 60) {\r\n            dout = b2 ? [1317, 10, 29] : [1900, 2, 29];\r\n            dow = 3;\r\n        } else if (date === 0) {\r\n            dout = b2 ? [1317, 8, 29] : [1900, 1, 0];\r\n            dow = 6;\r\n        } else {\r\n            if (date > 60) --date;\r\n            /* 1 = Jan 1 1900 in Gregorian */\r\n            var d = new Date(1900, 0, 1);\r\n            d.setDate(d.getDate() + date - 1);\r\n            dout = [d.getFullYear(), d.getMonth() + 1, d.getDate()];\r\n            dow = d.getDay();\r\n            if (date < 60) dow = (dow + 6) % 7;\r\n            if (b2) dow = fix_hijri(d, dout);\r\n        }\r\n        out.y = dout[0];\r\n        out.m = dout[1];\r\n        out.d = dout[2];\r\n        out.S = time % 60;\r\n        time = Math.floor(time / 60);\r\n        out.M = time % 60;\r\n        time = Math.floor(time / 60);\r\n        out.H = time;\r\n        out.q = dow;\r\n        return out;\r\n    }\r\n    SSF.parse_date_code = parse_date_code;\r\n    var basedate = new Date(1899, 11, 31, 0, 0, 0);\r\n    var dnthresh = basedate.getTime();\r\n    var base1904 = new Date(1900, 2, 1, 0, 0, 0);\r\n\r\n    function datenum_local(v, date1904) {\r\n        var epoch = v.getTime();\r\n        if (date1904) epoch -= 1461 * 24 * 60 * 60 * 1000;\r\n        else if (v >= base1904) epoch += 24 * 60 * 60 * 1000;\r\n        return (epoch - (dnthresh + (v.getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);\r\n    }\r\n    /* The longest 32-bit integer text is \"-4294967296\", exactly 11 chars */\r\n    function general_fmt_int(v) {\r\n        return v.toString(10);\r\n    }\r\n    SSF._general_int = general_fmt_int;\r\n    /* ECMA-376 18.8.30 numFmt*/\r\n    /* Note: `toPrecision` uses standard form when prec > E and E >= -6 */\r\n    var general_fmt_num = (function make_general_fmt_num() {\r\n        var trailing_zeroes_and_decimal = /(?:\\.0*|(\\.\\d*[1-9])0+)$/;\r\n\r\n        function strip_decimal(o) {\r\n            return (o.indexOf(\".\") == -1) ? o : o.replace(trailing_zeroes_and_decimal, \"$1\");\r\n        }\r\n        /* General Exponential always shows 2 digits exp and trims the mantissa */\r\n        var mantissa_zeroes_and_decimal = /(?:\\.0*|(\\.\\d*[1-9])0+)[Ee]/;\r\n        var exp_with_single_digit = /(E[+-])(\\d)$/;\r\n\r\n        function normalize_exp(o) {\r\n            if (o.indexOf(\"E\") == -1) return o;\r\n            return o.replace(mantissa_zeroes_and_decimal, \"$1E\").replace(exp_with_single_digit, \"$10$2\");\r\n        }\r\n        /* exponent >= -9 and <= 9 */\r\n        function small_exp(v) {\r\n            var w = (v < 0 ? 12 : 11);\r\n            var o = strip_decimal(v.toFixed(12));\r\n            if (o.length <= w) return o;\r\n            o = v.toPrecision(10);\r\n            if (o.length <= w) return o;\r\n            return v.toExponential(5);\r\n        }\r\n        /* exponent >= 11 or <= -10 likely exponential */\r\n        function large_exp(v) {\r\n            var o = strip_decimal(v.toFixed(11));\r\n            return (o.length > (v < 0 ? 12 : 11) || o === \"0\" || o === \"-0\") ? v.toPrecision(6) : o;\r\n        }\r\n\r\n        function general_fmt_num_base(v) {\r\n            var V = Math.floor(Math.log(Math.abs(v)) * Math.LOG10E),\r\n                o;\r\n            if (V >= -4 && V <= -1) o = v.toPrecision(10 + V);\r\n            else if (Math.abs(V) <= 9) o = small_exp(v);\r\n            else if (V === 10) o = v.toFixed(10).substr(0, 12);\r\n            else o = large_exp(v);\r\n            return strip_decimal(normalize_exp(o.toUpperCase()));\r\n        }\r\n        return general_fmt_num_base;\r\n    })();\r\n    SSF._general_num = general_fmt_num;\r\n    /*\r\n        \"General\" rules:\r\n        - text is passed through (\"@\")\r\n        - booleans are rendered as TRUE/FALSE\r\n        - \"up to 11 characters\" displayed for numbers\r\n        - Default date format (code 14) used for Dates\r\n        TODO: technically the display depends on the width of the cell\r\n    */\r\n    function general_fmt(v, opts) {\r\n        switch (typeof v) {\r\n            case 'string':\r\n                return v;\r\n            case 'boolean':\r\n                return v ? \"TRUE\" : \"FALSE\";\r\n            case 'number':\r\n                return (v | 0) === v ? v.toString(10) : general_fmt_num(v);\r\n            case 'undefined':\r\n                return \"\";\r\n            case 'object':\r\n                if (v == null) return \"\";\r\n                if (v instanceof Date) return format(14, datenum_local(v, opts && opts.date1904), opts);\r\n        }\r\n        throw new Error(\"unsupported value in General format: \" + v);\r\n    }\r\n    SSF._general = general_fmt;\r\n\r\n    function fix_hijri(date, o) {\r\n        /* TODO: properly adjust y/m/d and  */\r\n        o[0] -= 581;\r\n        var dow = date.getDay();\r\n        if (date < 60) dow = (dow + 6) % 7;\r\n        return dow;\r\n    }\r\n    var THAI_DIGITS = \"\\u0E50\\u0E51\\u0E52\\u0E53\\u0E54\\u0E55\\u0E56\\u0E57\\u0E58\\u0E59\".split(\"\");\r\n    /*jshint -W086 */\r\n    function write_date(type, fmt, val, ss0) {\r\n        var o = \"\",\r\n            ss = 0,\r\n            tt = 0,\r\n            y = val.y,\r\n            out, outl = 0;\r\n        switch (type) {\r\n            case 98:\r\n                /* 'b' buddhist year */ y = val.y + 543;\r\n                /* falls through */\r\n            case 121:\r\n                /* 'y' year */ switch (fmt.length) {\r\n                    case 1:\r\n                    case 2:\r\n                        out = y % 100;\r\n                        outl = 2;\r\n                        break;\r\n                    default:\r\n                        out = y % 10000;\r\n                        outl = 4;\r\n                        break;\r\n                }\r\n                break;\r\n            case 109:\r\n                /* 'm' month */ switch (fmt.length) {\r\n                    case 1:\r\n                    case 2:\r\n                        out = val.m;\r\n                        outl = fmt.length;\r\n                        break;\r\n                    case 3:\r\n                        return months[val.m - 1][1];\r\n                    case 5:\r\n                        return months[val.m - 1][0];\r\n                    default:\r\n                        return months[val.m - 1][2];\r\n                }\r\n                break;\r\n            case 100:\r\n                /* 'd' day */ switch (fmt.length) {\r\n                    case 1:\r\n                    case 2:\r\n                        out = val.d;\r\n                        outl = fmt.length;\r\n                        break;\r\n                    case 3:\r\n                        return days[val.q][0];\r\n                    default:\r\n                        return days[val.q][1];\r\n                }\r\n                break;\r\n            case 104:\r\n                /* 'h' 12-hour */ switch (fmt.length) {\r\n                    case 1:\r\n                    case 2:\r\n                        out = 1 + (val.H + 11) % 12;\r\n                        outl = fmt.length;\r\n                        break;\r\n                    default:\r\n                        throw 'bad hour format: ' + fmt;\r\n                }\r\n                break;\r\n            case 72:\r\n                /* 'H' 24-hour */ switch (fmt.length) {\r\n                    case 1:\r\n                    case 2:\r\n                        out = val.H;\r\n                        outl = fmt.length;\r\n                        break;\r\n                    default:\r\n                        throw 'bad hour format: ' + fmt;\r\n                }\r\n                break;\r\n            case 77:\r\n                /* 'M' minutes */ switch (fmt.length) {\r\n                    case 1:\r\n                    case 2:\r\n                        out = val.M;\r\n                        outl = fmt.length;\r\n                        break;\r\n                    default:\r\n                        throw 'bad minute format: ' + fmt;\r\n                }\r\n                break;\r\n            case 115:\r\n                /* 's' seconds */ if (fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt;\r\n                if (val.u === 0 && (fmt == \"s\" || fmt == \"ss\")) return pad0(val.S, fmt.length);\r\n                if (ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;\r\n                else tt = ss0 === 1 ? 10 : 1;\r\n                ss = Math.round((tt) * (val.S + val.u));\r\n                if (ss >= 60 * tt) ss = 0;\r\n                if (fmt === 's') return ss === 0 ? \"0\" : \"\" + ss / tt;\r\n                o = pad0(ss, 2 + ss0);\r\n                if (fmt === 'ss') return o.substr(0, 2);\r\n                return \".\" + o.substr(2, fmt.length - 1);\r\n            case 90:\r\n                /* 'Z' absolute time */ switch (fmt) {\r\n                    case '[h]':\r\n                    case '[hh]':\r\n                        out = val.D * 24 + val.H;\r\n                        break;\r\n                    case '[m]':\r\n                    case '[mm]':\r\n                        out = (val.D * 24 + val.H) * 60 + val.M;\r\n                        break;\r\n                    case '[s]':\r\n                    case '[ss]':\r\n                        out = ((val.D * 24 + val.H) * 60 + val.M) * 60 + Math.round(val.S + val.u);\r\n                        break;\r\n                    default:\r\n                        throw 'bad abstime format: ' + fmt;\r\n                }\r\n                outl = fmt.length === 3 ? 1 : 2;\r\n                break;\r\n            case 101:\r\n                /* 'e' era */ out = y;\r\n                outl = 1;\r\n                break;\r\n        }\r\n        var outstr = outl > 0 ? pad0(out, outl) : \"\";\r\n        return outstr;\r\n    }\r\n    /*jshint +W086 */\r\n    function commaify(s) {\r\n        var w = 3;\r\n        if (s.length <= w) return s;\r\n        var j = (s.length % w),\r\n            o = s.substr(0, j);\r\n        for (; j != s.length; j += w) o += (o.length > 0 ? \",\" : \"\") + s.substr(j, w);\r\n        return o;\r\n    }\r\n    var write_num = (function make_write_num() {\r\n        var pct1 = /%/g;\r\n\r\n        function write_num_pct(type, fmt, val) {\r\n            var sfmt = fmt.replace(pct1, \"\"),\r\n                mul = fmt.length - sfmt.length;\r\n            return write_num(type, sfmt, val * Math.pow(10, 2 * mul)) + fill(\"%\", mul);\r\n        }\r\n\r\n        function write_num_cm(type, fmt, val) {\r\n            var idx = fmt.length - 1;\r\n            while (fmt.charCodeAt(idx - 1) === 44) --idx;\r\n            return write_num(type, fmt.substr(0, idx), val / Math.pow(10, 3 * (fmt.length - idx)));\r\n        }\r\n\r\n        function write_num_exp(fmt, val) {\r\n            var o;\r\n            var idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\r\n            if (fmt.match(/^#+0.0E\\+0$/)) {\r\n                if (val == 0) return \"0.0E+0\";\r\n                else if (val < 0) return \"-\" + write_num_exp(fmt, -val);\r\n                var period = fmt.indexOf(\".\");\r\n                if (period === -1) period = fmt.indexOf('E');\r\n                var ee = Math.floor(Math.log(val) * Math.LOG10E) % period;\r\n                if (ee < 0) ee += period;\r\n                o = (val / Math.pow(10, ee)).toPrecision(idx + 1 + (period + ee) % period);\r\n                if (o.indexOf(\"e\") === -1) {\r\n                    var fakee = Math.floor(Math.log(val) * Math.LOG10E);\r\n                    if (o.indexOf(\".\") === -1) o = o.charAt(0) + \".\" + o.substr(1) + \"E+\" + (fakee - o.length + ee);\r\n                    else o += \"E+\" + (fakee - ee);\r\n                    while (o.substr(0, 2) === \"0.\") {\r\n                        o = o.charAt(0) + o.substr(2, period) + \".\" + o.substr(2 + period);\r\n                        o = o.replace(/^0+([1-9])/, \"$1\").replace(/^0+\\./, \"0.\");\r\n                    }\r\n                    o = o.replace(/\\+-/, \"-\");\r\n                }\r\n                o = o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/, function($$, $1, $2, $3) {\r\n                    return $1 + $2 + $3.substr(0, (period + ee) % period) + \".\" + $3.substr(ee) + \"E\";\r\n                });\r\n            } else o = val.toExponential(idx);\r\n            if (fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) o = o.substr(0, o.length - 1) + \"0\" + o.charAt(o.length - 1);\r\n            if (fmt.match(/E\\-/) && o.match(/e\\+/)) o = o.replace(/e\\+/, \"e\");\r\n            return o.replace(\"e\", \"E\");\r\n        }\r\n        var frac1 = /# (\\?+)( ?)\\/( ?)(\\d+)/;\r\n\r\n        function write_num_f1(r, aval, sign) {\r\n            var den = parseInt(r[4], 10),\r\n                rr = Math.round(aval * den),\r\n                base = Math.floor(rr / den);\r\n            var myn = (rr - base * den),\r\n                myd = den;\r\n            return sign + (base === 0 ? \"\" : \"\" + base) + \" \" + (myn === 0 ? fill(\" \", r[1].length + 1 + r[4].length) : pad_(myn, r[1].length) + r[2] + \"/\" + r[3] + pad0(myd, r[4].length));\r\n        }\r\n\r\n        function write_num_f2(r, aval, sign) {\r\n            return sign + (aval === 0 ? \"\" : \"\" + aval) + fill(\" \", r[1].length + 2 + r[4].length);\r\n        }\r\n        var dec1 = /^#*0*\\.([0#]+)/;\r\n        var closeparen = /\\).*[0#]/;\r\n        var phone = /\\(###\\) ###\\\\?-####/;\r\n\r\n        function hashq(str) {\r\n            var o = \"\",\r\n                cc;\r\n            for (var i = 0; i != str.length; ++i) switch ((cc = str.charCodeAt(i))) {\r\n                case 35:\r\n                    break;\r\n                case 63:\r\n                    o += \" \";\r\n                    break;\r\n                case 48:\r\n                    o += \"0\";\r\n                    break;\r\n                default:\r\n                    o += String.fromCharCode(cc);\r\n            }\r\n            return o;\r\n        }\r\n\r\n        function rnd(val, d) {\r\n            var dd = Math.pow(10, d);\r\n            return \"\" + (Math.round(val * dd) / dd);\r\n        }\r\n\r\n        function dec(val, d) {\r\n            var _frac = val - Math.floor(val),\r\n                dd = Math.pow(10, d);\r\n            if (d < ('' + Math.round(_frac * dd)).length) return 0;\r\n            return Math.round(_frac * dd);\r\n        }\r\n\r\n        function carry(val, d) {\r\n            if (d < ('' + Math.round((val - Math.floor(val)) * Math.pow(10, d))).length) {\r\n                return 1;\r\n            }\r\n            return 0;\r\n        }\r\n\r\n        function flr(val) {\r\n            if (val < 2147483647 && val > -2147483648) return \"\" + (val >= 0 ? (val | 0) : (val - 1 | 0));\r\n            return \"\" + Math.floor(val);\r\n        }\r\n\r\n        function write_num_flt(type, fmt, val) {\r\n            if (type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\r\n                var ffmt = fmt.replace(/\\( */, \"\").replace(/ \\)/, \"\").replace(/\\)/, \"\");\r\n                if (val >= 0) return write_num_flt('n', ffmt, val);\r\n                return '(' + write_num_flt('n', ffmt, -val) + ')';\r\n            }\r\n            if (fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);\r\n            if (fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);\r\n            if (fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);\r\n            if (fmt.charCodeAt(0) === 36) return \"$\" + write_num_flt(type, fmt.substr(fmt.charAt(1) == ' ' ? 2 : 1), val);\r\n            var o;\r\n            var r, ri, ff, aval = Math.abs(val),\r\n                sign = val < 0 ? \"-\" : \"\";\r\n            if (fmt.match(/^00+$/)) return sign + pad0r(aval, fmt.length);\r\n            if (fmt.match(/^[#?]+$/)) {\r\n                o = pad0r(val, 0);\r\n                if (o === \"0\") o = \"\";\r\n                return o.length > fmt.length ? o : hashq(fmt.substr(0, fmt.length - o.length)) + o;\r\n            }\r\n            if ((r = fmt.match(frac1))) return write_num_f1(r, aval, sign);\r\n            if (fmt.match(/^#+0+$/)) return sign + pad0r(aval, fmt.length - fmt.indexOf(\"0\"));\r\n            if ((r = fmt.match(dec1))) {\r\n                o = rnd(val, r[1].length).replace(/^([^\\.]+)$/, \"$1.\" + hashq(r[1])).replace(/\\.$/, \".\" + hashq(r[1])).replace(/\\.(\\d*)$/, function($$, $1) {\r\n                    return \".\" + $1 + fill(\"0\", hashq(r[1]).length - $1.length);\r\n                });\r\n                return fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./, \".\");\r\n            }\r\n            fmt = fmt.replace(/^#+([0.])/, \"$1\");\r\n            if ((r = fmt.match(/^(0*)\\.(#*)$/))) {\r\n                return sign + rnd(aval, r[2].length).replace(/\\.(\\d*[1-9])0*$/, \".$1\").replace(/^(-?\\d*)$/, \"$1.\").replace(/^0\\./, r[1].length ? \"0.\" : \".\");\r\n            }\r\n            if ((r = fmt.match(/^#{1,3},##0(\\.?)$/))) return sign + commaify(pad0r(aval, 0));\r\n            if ((r = fmt.match(/^#,##0\\.([#0]*0)$/))) {\r\n                return val < 0 ? \"-\" + write_num_flt(type, fmt, -val) : commaify(\"\" + (Math.floor(val) + carry(val, r[1].length))) + \".\" + pad0(dec(val, r[1].length), r[1].length);\r\n            }\r\n            if ((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type, fmt.replace(/^#,#*,/, \"\"), val);\r\n            if ((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))) {\r\n                o = _strrev(write_num_flt(type, fmt.replace(/[\\\\-]/g, \"\"), val));\r\n                ri = 0;\r\n                return _strrev(_strrev(fmt.replace(/\\\\/g, \"\")).replace(/[0#]/g, function(x) {\r\n                    return ri < o.length ? o.charAt(ri++) : x === '0' ? '0' : \"\";\r\n                }));\r\n            }\r\n            if (fmt.match(phone)) {\r\n                o = write_num_flt(type, \"##########\", val);\r\n                return \"(\" + o.substr(0, 3) + \") \" + o.substr(3, 3) + \"-\" + o.substr(6);\r\n            }\r\n            var oa = \"\";\r\n            if ((r = fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/))) {\r\n                ri = Math.min(r[4].length, 7);\r\n                ff = frac(aval, Math.pow(10, ri) - 1, false);\r\n                o = \"\" + sign;\r\n                oa = write_num(\"n\", r[1], ff[1]);\r\n                if (oa.charAt(oa.length - 1) == \" \") oa = oa.substr(0, oa.length - 1) + \"0\";\r\n                o += oa + r[2] + \"/\" + r[3];\r\n                oa = rpad_(ff[2], ri);\r\n                if (oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length - oa.length)) + oa;\r\n                o += oa;\r\n                return o;\r\n            }\r\n            if ((r = fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/))) {\r\n                ri = Math.min(Math.max(r[1].length, r[4].length), 7);\r\n                ff = frac(aval, Math.pow(10, ri) - 1, true);\r\n                return sign + (ff[0] || (ff[1] ? \"\" : \"0\")) + \" \" + (ff[1] ? pad_(ff[1], ri) + r[2] + \"/\" + r[3] + rpad_(ff[2], ri) : fill(\" \", 2 * ri + 1 + r[2].length + r[3].length));\r\n            }\r\n            if ((r = fmt.match(/^[#0?]+$/))) {\r\n                o = pad0r(val, 0);\r\n                if (fmt.length <= o.length) return o;\r\n                return hashq(fmt.substr(0, fmt.length - o.length)) + o;\r\n            }\r\n            if ((r = fmt.match(/^([#0?]+)\\.([#0]+)$/))) {\r\n                o = \"\" + val.toFixed(Math.min(r[2].length, 10)).replace(/([^0])0+$/, \"$1\");\r\n                ri = o.indexOf(\".\");\r\n                var lres = fmt.indexOf(\".\") - ri,\r\n                    rres = fmt.length - o.length - lres;\r\n                return hashq(fmt.substr(0, lres) + o + fmt.substr(fmt.length - rres));\r\n            }\r\n            if ((r = fmt.match(/^00,000\\.([#0]*0)$/))) {\r\n                ri = dec(val, r[1].length);\r\n                return val < 0 ? \"-\" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\\d,\\d{3}$/, \"0$&\").replace(/^\\d*$/, function($$) {\r\n                    return \"00,\" + ($$.length < 3 ? pad0(0, 3 - $$.length) : \"\") + $$;\r\n                }) + \".\" + pad0(ri, r[1].length);\r\n            }\r\n            switch (fmt) {\r\n                case \"###,##0.00\":\r\n                    return write_num_flt(type, \"#,##0.00\", val);\r\n                case \"###,###\":\r\n                case \"##,###\":\r\n                case \"#,###\":\r\n                    var x = commaify(pad0r(aval, 0));\r\n                    return x !== \"0\" ? sign + x : \"\";\r\n                case \"###,###.00\":\r\n                    return write_num_flt(type, \"###,##0.00\", val).replace(/^0\\./, \".\");\r\n                case \"#,###.00\":\r\n                    return write_num_flt(type, \"#,##0.00\", val).replace(/^0\\./, \".\");\r\n                default:\r\n            }\r\n            throw new Error(\"unsupported format |\" + fmt + \"|\");\r\n        }\r\n\r\n        function write_num_cm2(type, fmt, val) {\r\n            var idx = fmt.length - 1;\r\n            while (fmt.charCodeAt(idx - 1) === 44) --idx;\r\n            return write_num(type, fmt.substr(0, idx), val / Math.pow(10, 3 * (fmt.length - idx)));\r\n        }\r\n\r\n        function write_num_pct2(type, fmt, val) {\r\n            var sfmt = fmt.replace(pct1, \"\"),\r\n                mul = fmt.length - sfmt.length;\r\n            return write_num(type, sfmt, val * Math.pow(10, 2 * mul)) + fill(\"%\", mul);\r\n        }\r\n\r\n        function write_num_exp2(fmt, val) {\r\n            var o;\r\n            var idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\r\n            if (fmt.match(/^#+0.0E\\+0$/)) {\r\n                if (val == 0) return \"0.0E+0\";\r\n                else if (val < 0) return \"-\" + write_num_exp2(fmt, -val);\r\n                var period = fmt.indexOf(\".\");\r\n                if (period === -1) period = fmt.indexOf('E');\r\n                var ee = Math.floor(Math.log(val) * Math.LOG10E) % period;\r\n                if (ee < 0) ee += period;\r\n                o = (val / Math.pow(10, ee)).toPrecision(idx + 1 + (period + ee) % period);\r\n                if (!o.match(/[Ee]/)) {\r\n                    var fakee = Math.floor(Math.log(val) * Math.LOG10E);\r\n                    if (o.indexOf(\".\") === -1) o = o.charAt(0) + \".\" + o.substr(1) + \"E+\" + (fakee - o.length + ee);\r\n                    else o += \"E+\" + (fakee - ee);\r\n                    o = o.replace(/\\+-/, \"-\");\r\n                }\r\n                o = o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/, function($$, $1, $2, $3) {\r\n                    return $1 + $2 + $3.substr(0, (period + ee) % period) + \".\" + $3.substr(ee) + \"E\";\r\n                });\r\n            } else o = val.toExponential(idx);\r\n            if (fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) o = o.substr(0, o.length - 1) + \"0\" + o.charAt(o.length - 1);\r\n            if (fmt.match(/E\\-/) && o.match(/e\\+/)) o = o.replace(/e\\+/, \"e\");\r\n            return o.replace(\"e\", \"E\");\r\n        }\r\n\r\n        function write_num_int(type, fmt, val) {\r\n            if (type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\r\n                var ffmt = fmt.replace(/\\( */, \"\").replace(/ \\)/, \"\").replace(/\\)/, \"\");\r\n                if (val >= 0) return write_num_int('n', ffmt, val);\r\n                return '(' + write_num_int('n', ffmt, -val) + ')';\r\n            }\r\n            if (fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);\r\n            if (fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);\r\n            if (fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);\r\n            if (fmt.charCodeAt(0) === 36) return \"$\" + write_num_int(type, fmt.substr(fmt.charAt(1) == ' ' ? 2 : 1), val);\r\n            var o;\r\n            var r, ri, ff, aval = Math.abs(val),\r\n                sign = val < 0 ? \"-\" : \"\";\r\n            if (fmt.match(/^00+$/)) return sign + pad0(aval, fmt.length);\r\n            if (fmt.match(/^[#?]+$/)) {\r\n                o = (\"\" + val);\r\n                if (val === 0) o = \"\";\r\n                return o.length > fmt.length ? o : hashq(fmt.substr(0, fmt.length - o.length)) + o;\r\n            }\r\n            if ((r = fmt.match(frac1))) return write_num_f2(r, aval, sign);\r\n            if (fmt.match(/^#+0+$/)) return sign + pad0(aval, fmt.length - fmt.indexOf(\"0\"));\r\n            if ((r = fmt.match(dec1))) {\r\n                o = (\"\" + val).replace(/^([^\\.]+)$/, \"$1.\" + hashq(r[1])).replace(/\\.$/, \".\" + hashq(r[1]));\r\n                o = o.replace(/\\.(\\d*)$/, function($$, $1) {\r\n                    return \".\" + $1 + fill(\"0\", hashq(r[1]).length - $1.length);\r\n                });\r\n                return fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./, \".\");\r\n            }\r\n            fmt = fmt.replace(/^#+([0.])/, \"$1\");\r\n            if ((r = fmt.match(/^(0*)\\.(#*)$/))) {\r\n                return sign + (\"\" + aval).replace(/\\.(\\d*[1-9])0*$/, \".$1\").replace(/^(-?\\d*)$/, \"$1.\").replace(/^0\\./, r[1].length ? \"0.\" : \".\");\r\n            }\r\n            if ((r = fmt.match(/^#{1,3},##0(\\.?)$/))) return sign + commaify((\"\" + aval));\r\n            if ((r = fmt.match(/^#,##0\\.([#0]*0)$/))) {\r\n                return val < 0 ? \"-\" + write_num_int(type, fmt, -val) : commaify((\"\" + val)) + \".\" + fill('0', r[1].length);\r\n            }\r\n            if ((r = fmt.match(/^#,#*,#0/))) return write_num_int(type, fmt.replace(/^#,#*,/, \"\"), val);\r\n            if ((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))) {\r\n                o = _strrev(write_num_int(type, fmt.replace(/[\\\\-]/g, \"\"), val));\r\n                ri = 0;\r\n                return _strrev(_strrev(fmt.replace(/\\\\/g, \"\")).replace(/[0#]/g, function(x) {\r\n                    return ri < o.length ? o.charAt(ri++) : x === '0' ? '0' : \"\";\r\n                }));\r\n            }\r\n            if (fmt.match(phone)) {\r\n                o = write_num_int(type, \"##########\", val);\r\n                return \"(\" + o.substr(0, 3) + \") \" + o.substr(3, 3) + \"-\" + o.substr(6);\r\n            }\r\n            var oa = \"\";\r\n            if ((r = fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/))) {\r\n                ri = Math.min(r[4].length, 7);\r\n                ff = frac(aval, Math.pow(10, ri) - 1, false);\r\n                o = \"\" + sign;\r\n                oa = write_num(\"n\", r[1], ff[1]);\r\n                if (oa.charAt(oa.length - 1) == \" \") oa = oa.substr(0, oa.length - 1) + \"0\";\r\n                o += oa + r[2] + \"/\" + r[3];\r\n                oa = rpad_(ff[2], ri);\r\n                if (oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length - oa.length)) + oa;\r\n                o += oa;\r\n                return o;\r\n            }\r\n            if ((r = fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/))) {\r\n                ri = Math.min(Math.max(r[1].length, r[4].length), 7);\r\n                ff = frac(aval, Math.pow(10, ri) - 1, true);\r\n                return sign + (ff[0] || (ff[1] ? \"\" : \"0\")) + \" \" + (ff[1] ? pad_(ff[1], ri) + r[2] + \"/\" + r[3] + rpad_(ff[2], ri) : fill(\" \", 2 * ri + 1 + r[2].length + r[3].length));\r\n            }\r\n            if ((r = fmt.match(/^[#0?]+$/))) {\r\n                o = \"\" + val;\r\n                if (fmt.length <= o.length) return o;\r\n                return hashq(fmt.substr(0, fmt.length - o.length)) + o;\r\n            }\r\n            if ((r = fmt.match(/^([#0]+)\\.([#0]+)$/))) {\r\n                o = \"\" + val.toFixed(Math.min(r[2].length, 10)).replace(/([^0])0+$/, \"$1\");\r\n                ri = o.indexOf(\".\");\r\n                var lres = fmt.indexOf(\".\") - ri,\r\n                    rres = fmt.length - o.length - lres;\r\n                return hashq(fmt.substr(0, lres) + o + fmt.substr(fmt.length - rres));\r\n            }\r\n            if ((r = fmt.match(/^00,000\\.([#0]*0)$/))) {\r\n                return val < 0 ? \"-\" + write_num_int(type, fmt, -val) : commaify(\"\" + val).replace(/^\\d,\\d{3}$/, \"0$&\").replace(/^\\d*$/, function($$) {\r\n                    return \"00,\" + ($$.length < 3 ? pad0(0, 3 - $$.length) : \"\") + $$;\r\n                }) + \".\" + pad0(0, r[1].length);\r\n            }\r\n            switch (fmt) {\r\n                case \"###,###\":\r\n                case \"##,###\":\r\n                case \"#,###\":\r\n                    var x = commaify(\"\" + aval);\r\n                    return x !== \"0\" ? sign + x : \"\";\r\n                default:\r\n                    if (fmt.match(/\\.[0#?]*$/)) return write_num_int(type, fmt.slice(0, fmt.lastIndexOf(\".\")), val) + hashq(fmt.slice(fmt.lastIndexOf(\".\")));\r\n            }\r\n            throw new Error(\"unsupported format |\" + fmt + \"|\");\r\n        }\r\n        return function write_num(type, fmt, val) {\r\n            return (val | 0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);\r\n        };\r\n    })();\r\n\r\n    function split_fmt(fmt) {\r\n        var out = [];\r\n        var in_str = false /*, cc*/ ;\r\n        for (var i = 0, j = 0; i < fmt.length; ++i) switch (( /*cc=*/ fmt.charCodeAt(i))) {\r\n            case 34:\r\n                /* '\"' */ in_str = !in_str;\r\n                break;\r\n            case 95:\r\n            case 42:\r\n            case 92:\r\n                /* '_' '*' '\\\\' */\r\n                ++i;\r\n                break;\r\n            case 59:\r\n                /* ';' */ out[out.length] = fmt.substr(j, i - j);\r\n                j = i + 1;\r\n        }\r\n        out[out.length] = fmt.substr(j);\r\n        if (in_str === true) throw new Error(\"Format |\" + fmt + \"| unterminated string \");\r\n        return out;\r\n    }\r\n    SSF._split = split_fmt;\r\n    var abstime = /\\[[HhMmSs\\u0E0A\\u0E19\\u0E17]*\\]/;\r\n\r\n    function fmt_is_date(fmt) {\r\n        var i = 0,\r\n            /*cc = 0,*/ c = \"\",\r\n            o = \"\";\r\n        while (i < fmt.length) {\r\n            switch ((c = fmt.charAt(i))) {\r\n                case 'G':\r\n                    if (isgeneral(fmt, i)) i += 6;\r\n                    i++;\r\n                    break;\r\n                case '\"':\r\n                    for (;\r\n                        ( /*cc=*/ fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) { /*empty*/ }++i;\r\n                    break;\r\n                case '\\\\':\r\n                    i += 2;\r\n                    break;\r\n                case '_':\r\n                    i += 2;\r\n                    break;\r\n                case '@':\r\n                    ++i;\r\n                    break;\r\n                case 'B':\r\n                case 'b':\r\n                    if (fmt.charAt(i + 1) === \"1\" || fmt.charAt(i + 1) === \"2\") return true;\r\n                    /* falls through */\r\n                case 'M':\r\n                case 'D':\r\n                case 'Y':\r\n                case 'H':\r\n                case 'S':\r\n                case 'E':\r\n                    /* falls through */\r\n                case 'm':\r\n                case 'd':\r\n                case 'y':\r\n                case 'h':\r\n                case 's':\r\n                case 'e':\r\n                case 'g':\r\n                    return true;\r\n                case 'A':\r\n                case 'a':\r\n                case '上':\r\n                    if (fmt.substr(i, 3).toUpperCase() === \"A/P\") return true;\r\n                    if (fmt.substr(i, 5).toUpperCase() === \"AM/PM\") return true;\r\n                    if (fmt.substr(i, 5).toUpperCase() === \"上午/下午\") return true;\r\n                    ++i;\r\n                    break;\r\n                case '[':\r\n                    o = c;\r\n                    while (fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);\r\n                    if (o.match(abstime)) return true;\r\n                    break;\r\n                case '.':\r\n                    /* falls through */\r\n                case '0':\r\n                case '#':\r\n                    while (i < fmt.length && (\"0#?.,E+-%\".indexOf(c = fmt.charAt(++i)) > -1 || (c == '\\\\' && fmt.charAt(i + 1) == \"-\" && \"0#\".indexOf(fmt.charAt(i + 2)) > -1))) { /* empty */ }\r\n                    break;\r\n                case '?':\r\n                    while (fmt.charAt(++i) === c) { /* empty */ }\r\n                    break;\r\n                case '*':\r\n                    ++i;\r\n                    if (fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i;\r\n                    break;\r\n                case '(':\r\n                case ')':\r\n                    ++i;\r\n                    break;\r\n                case '1':\r\n                case '2':\r\n                case '3':\r\n                case '4':\r\n                case '5':\r\n                case '6':\r\n                case '7':\r\n                case '8':\r\n                case '9':\r\n                    while (i < fmt.length && \"0123456789\".indexOf(fmt.charAt(++i)) > -1) { /* empty */ }\r\n                    break;\r\n                case ' ':\r\n                    ++i;\r\n                    break;\r\n                default:\r\n                    ++i;\r\n                    break;\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n    SSF.is_date = fmt_is_date;\r\n\r\n    function eval_fmt(fmt, v, opts, flen) {\r\n        var out = [],\r\n            o = \"\",\r\n            i = 0,\r\n            c = \"\",\r\n            lst = 't',\r\n            dt, j, cc;\r\n        var hr = 'H';\r\n        /* Tokenize */\r\n        while (i < fmt.length) {\r\n            switch ((c = fmt.charAt(i))) {\r\n                case 'G':\r\n                    /* General */ if (!isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' + fmt);\r\n                    out[out.length] = {\r\n                        t: 'G',\r\n                        v: 'General'\r\n                    };\r\n                    i += 7;\r\n                    break;\r\n                case '\"':\r\n                    /* Literal text */ for (o = \"\";\r\n                        (cc = fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);\r\n                    out[out.length] = {\r\n                        t: 't',\r\n                        v: o\r\n                    };\r\n                    ++i;\r\n                    break;\r\n                case '\\\\':\r\n                    var w = fmt.charAt(++i),\r\n                        t = (w === \"(\" || w === \")\") ? w : 't';\r\n                    out[out.length] = {\r\n                        t: t,\r\n                        v: w\r\n                    };\r\n                    ++i;\r\n                    break;\r\n                case '_':\r\n                    out[out.length] = {\r\n                        t: 't',\r\n                        v: \" \"\r\n                    };\r\n                    i += 2;\r\n                    break;\r\n                case '@':\r\n                    /* Text Placeholder */ out[out.length] = {\r\n                        t: 'T',\r\n                        v: v\r\n                    };\r\n                    ++i;\r\n                    break;\r\n                case 'B':\r\n                case 'b':\r\n                    if (fmt.charAt(i + 1) === \"1\" || fmt.charAt(i + 1) === \"2\") {\r\n                        if (dt == null) {\r\n                            dt = parse_date_code(v, opts, fmt.charAt(i + 1) === \"2\");\r\n                            if (dt == null) return \"\";\r\n                        }\r\n                        out[out.length] = {\r\n                            t: 'X',\r\n                            v: fmt.substr(i, 2)\r\n                        };\r\n                        lst = c;\r\n                        i += 2;\r\n                        break;\r\n                    }\r\n                    /* falls through */\r\n                case 'M':\r\n                case 'D':\r\n                case 'Y':\r\n                case 'H':\r\n                case 'S':\r\n                case 'E':\r\n                    c = c.toLowerCase();\r\n                    /* falls through */\r\n                case 'm':\r\n                case 'd':\r\n                case 'y':\r\n                case 'h':\r\n                case 's':\r\n                case 'e':\r\n                case 'g':\r\n                    if (v < 0) return \"\";\r\n                    if (dt == null) {\r\n                        dt = parse_date_code(v, opts);\r\n                        if (dt == null) return \"#####\";\r\n                    }\r\n                    o = c;\r\n                    while (++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o += c;\r\n                    if (c === 'm' && lst.toLowerCase() === 'h') c = 'M';\r\n                    if (c === 'h') c = hr;\r\n                    out[out.length] = {\r\n                        t: c,\r\n                        v: o\r\n                    };\r\n                    lst = c;\r\n                    break;\r\n                case 'A':\r\n                case 'a':\r\n                case '上':\r\n                    var q = {\r\n                        t: c,\r\n                        v: c\r\n                    };\r\n                    if (dt == null) dt = parse_date_code(v, opts);\r\n                    if (fmt.substr(i, 3).toUpperCase() === \"A/P\") {\r\n                        if (dt != null) q.v = dt.H >= 12 ? \"P\" : \"A\";\r\n                        q.t = 'T';\r\n                        hr = 'h';\r\n                        i += 3;\r\n                    } else if (fmt.substr(i, 5).toUpperCase() === \"AM/PM\") {\r\n                        if (dt != null) q.v = dt.H >= 12 ? \"PM\" : \"AM\";\r\n                        q.t = 'T';\r\n                        i += 5;\r\n                        hr = 'h';\r\n                    } else if (fmt.substr(i, 5).toUpperCase() === \"上午/下午\") {\r\n                        if (dt != null) q.v = dt.H >= 12 ? \"下午\" : \"上午\";\r\n                        q.t = 'T';\r\n                        i += 5;\r\n                        hr = 'h';\r\n                    } else {\r\n                        q.t = \"t\";\r\n                        ++i;\r\n                    }\r\n                    if (dt == null && q.t === 'T') return \"\";\r\n                    out[out.length] = q;\r\n                    lst = c;\r\n                    break;\r\n                case '[':\r\n                    o = c;\r\n                    while (fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);\r\n                    if (o.slice(-1) !== ']') throw 'unterminated \"[\" block: |' + o + '|';\r\n                    if (o.match(abstime)) {\r\n                        if (dt == null) {\r\n                            dt = parse_date_code(v, opts);\r\n                            if (dt == null) return \"\";\r\n                        }\r\n                        out[out.length] = {\r\n                            t: 'Z',\r\n                            v: o.toLowerCase()\r\n                        };\r\n                        lst = o.charAt(1);\r\n                    } else if (o.indexOf(\"$\") > -1) {\r\n                        o = (o.match(/\\$([^-\\[\\]]*)/) || [])[1] || \"$\";\r\n                        if (!fmt_is_date(fmt)) out[out.length] = {\r\n                            t: 't',\r\n                            v: o\r\n                        };\r\n                    }\r\n                    break;\r\n                    /* Numbers */\r\n                case '.':\r\n                    if (dt != null) {\r\n                        o = c;\r\n                        while (++i < fmt.length && (c = fmt.charAt(i)) === \"0\") o += c;\r\n                        out[out.length] = {\r\n                            t: 's',\r\n                            v: o\r\n                        };\r\n                        break;\r\n                    }\r\n                    /* falls through */\r\n                case '0':\r\n                case '#':\r\n                    o = c;\r\n                    while (++i < fmt.length && \"0#?.,E+-%\".indexOf(c = fmt.charAt(i)) > -1) o += c;\r\n                    out[out.length] = {\r\n                        t: 'n',\r\n                        v: o\r\n                    };\r\n                    break;\r\n                case '?':\r\n                    o = c;\r\n                    while (fmt.charAt(++i) === c) o += c;\r\n                    out[out.length] = {\r\n                        t: c,\r\n                        v: o\r\n                    };\r\n                    lst = c;\r\n                    break;\r\n                case '*':\r\n                    ++i;\r\n                    if (fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i;\r\n                    break; // **\r\n                case '(':\r\n                case ')':\r\n                    out[out.length] = {\r\n                        t: (flen === 1 ? 't' : c),\r\n                        v: c\r\n                    };\r\n                    ++i;\r\n                    break;\r\n                case '1':\r\n                case '2':\r\n                case '3':\r\n                case '4':\r\n                case '5':\r\n                case '6':\r\n                case '7':\r\n                case '8':\r\n                case '9':\r\n                    o = c;\r\n                    while (i < fmt.length && \"0123456789\".indexOf(fmt.charAt(++i)) > -1) o += fmt.charAt(i);\r\n                    out[out.length] = {\r\n                        t: 'D',\r\n                        v: o\r\n                    };\r\n                    break;\r\n                case ' ':\r\n                    out[out.length] = {\r\n                        t: c,\r\n                        v: c\r\n                    };\r\n                    ++i;\r\n                    break;\r\n                case '$':\r\n                    out[out.length] = {\r\n                        t: 't',\r\n                        v: '$'\r\n                    };\r\n                    ++i;\r\n                    break;\r\n                default:\r\n                    // if (\"¤฿BsBr₵₡₫ƒFtRs.₭kr£₤Lm₥₦₱PQRSkRp৲৳R$S/.〒₮₩¥NT￥zł₴₪៛руб€＄,$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP\".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);\r\n                    if (\"¤฿BsBr₵₡₫ƒFtRs.₭kr£₤Lm₥₦₱PQRSkRp৲৳R$S/.〒₮₩¥NT￥zł₴₪៛руб€＄,$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP$￥LekdinAf$dhAflRial?￡BirrKzMOPPGKRsGsB/R$ррlevkrKMzBsPNuFBuKPkrRD$NfkCFA?CVEGMDFrCDHTGNAfLFdjKGSFGGHSRielKCFknKshLSLL￡LtRFRONArRfMWKRMMURsMROS/KMDLMTnRC$kr€GELCHFSLLSCRDbSZLSDGSOSSomFCFPTShT$VUVQUGXгрнsomWSTNT$FtDramRpZMWFCFA\".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);\r\n                    out[out.length] = {\r\n                        t: 't',\r\n                        v: c\r\n                    };\r\n                    ++i;\r\n                    break;\r\n            }\r\n        }\r\n        /* Scan for date/time parts */\r\n        var bt = 0,\r\n            ss0 = 0,\r\n            ssm;\r\n        for (i = out.length - 1, lst = 't'; i >= 0; --i) {\r\n            switch (out[i].t) {\r\n                case 'h':\r\n                case 'H':\r\n                    out[i].t = hr;\r\n                    lst = 'h';\r\n                    if (bt < 1) bt = 1;\r\n                    break;\r\n                case 's':\r\n                    if ((ssm = out[i].v.match(/\\.0+$/))) ss0 = Math.max(ss0, ssm[0].length - 1);\r\n                    if (bt < 3) bt = 3;\r\n                    /* falls through */\r\n                case 'd':\r\n                case 'y':\r\n                case 'M':\r\n                case 'e':\r\n                    lst = out[i].t;\r\n                    break;\r\n                case 'm':\r\n                    if (lst === 's') {\r\n                        out[i].t = 'M';\r\n                        if (bt < 2) bt = 2;\r\n                    }\r\n                    break;\r\n                case 'X':\r\n                    /*if(out[i].v === \"B2\");*/ break;\r\n                case 'Z':\r\n                    if (bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;\r\n                    if (bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;\r\n                    if (bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;\r\n            }\r\n        }\r\n        /* time rounding depends on presence of minute / second / usec fields */\r\n        switch (bt) {\r\n            case 0:\r\n                break;\r\n            case 1:\r\n                if (dt.u >= 0.5) {\r\n                    dt.u = 0;\r\n                    ++dt.S;\r\n                }\r\n                if (dt.S >= 60) {\r\n                    dt.S = 0;\r\n                    ++dt.M;\r\n                }\r\n                if (dt.M >= 60) {\r\n                    dt.M = 0;\r\n                    ++dt.H;\r\n                }\r\n                break;\r\n            case 2:\r\n                if (dt.u >= 0.5) {\r\n                    dt.u = 0;\r\n                    ++dt.S;\r\n                }\r\n                if (dt.S >= 60) {\r\n                    dt.S = 0;\r\n                    ++dt.M;\r\n                }\r\n                break;\r\n        }\r\n        /* replace fields */\r\n        var nstr = \"\",\r\n            jj;\r\n        for (i = 0; i < out.length; ++i) {\r\n            switch (out[i].t) {\r\n                case 't':\r\n                case 'T':\r\n                case ' ':\r\n                case 'D':\r\n                    break;\r\n                case 'X':\r\n                    out[i].v = \"\";\r\n                    out[i].t = \";\";\r\n                    break;\r\n                case 'd':\r\n                case 'm':\r\n                case 'y':\r\n                case 'h':\r\n                case 'H':\r\n                case 'M':\r\n                case 's':\r\n                case 'e':\r\n                case 'b':\r\n                case 'Z':\r\n                    out[i].v = write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);\r\n                    out[i].t = 't';\r\n                    break;\r\n                case 'n':\r\n                case '?':\r\n                    jj = i + 1;\r\n                    while (out[jj] != null && (\r\n                            (c = out[jj].t) === \"?\" || c === \"D\" || ((c === \" \" || c === \"t\") && out[jj + 1] != null && (out[jj + 1].t === '?' || out[jj + 1].t === \"t\" && out[jj + 1].v === '/')) || (out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) || (c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj + 1] != null && out[jj + 1].t == '?')))) {\r\n                        out[i].v += out[jj].v;\r\n                        out[jj] = {\r\n                            v: \"\",\r\n                            t: \";\"\r\n                        };\r\n                        ++jj;\r\n                    }\r\n                    nstr += out[i].v;\r\n                    i = jj - 1;\r\n                    break;\r\n                case 'G':\r\n                    out[i].t = 't';\r\n                    out[i].v = general_fmt(v, opts);\r\n                    break;\r\n            }\r\n        }\r\n        var vv = \"\",\r\n            myv, ostr;\r\n        if (nstr.length > 0) {\r\n            if (nstr.charCodeAt(0) == 40) /* '(' */ {\r\n                myv = (v < 0 && nstr.charCodeAt(0) === 45 ? -v : v);\r\n                ostr = write_num('n', nstr, myv);\r\n            } else {\r\n                myv = (v < 0 && flen > 1 ? -v : v);\r\n                ostr = write_num('n', nstr, myv);\r\n                if (myv < 0 && out[0] && out[0].t == 't') {\r\n                    ostr = ostr.substr(1);\r\n                    out[0].v = \"-\" + out[0].v;\r\n                }\r\n            }\r\n            jj = ostr.length - 1;\r\n            var decpt = out.length;\r\n            for (i = 0; i < out.length; ++i)\r\n                if (out[i] != null && out[i].t != 't' && out[i].v.indexOf(\".\") > -1) {\r\n                    decpt = i;\r\n                    break;\r\n                }\r\n            var lasti = out.length;\r\n            if (decpt === out.length && ostr.indexOf(\"E\") === -1) {\r\n                for (i = out.length - 1; i >= 0; --i) {\r\n                    if (out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;\r\n                    if (jj >= out[i].v.length - 1) {\r\n                        jj -= out[i].v.length;\r\n                        out[i].v = ostr.substr(jj + 1, out[i].v.length);\r\n                    } else if (jj < 0) out[i].v = \"\";\r\n                    else {\r\n                        out[i].v = ostr.substr(0, jj + 1);\r\n                        jj = -1;\r\n                    }\r\n                    out[i].t = 't';\r\n                    lasti = i;\r\n                }\r\n                if (jj >= 0 && lasti < out.length) out[lasti].v = ostr.substr(0, jj + 1) + out[lasti].v;\r\n            } else if (decpt !== out.length && ostr.indexOf(\"E\") === -1) {\r\n                jj = ostr.indexOf(\".\") - 1;\r\n                for (i = decpt; i >= 0; --i) {\r\n                    if (out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;\r\n                    j = out[i].v.indexOf(\".\") > -1 && i === decpt ? out[i].v.indexOf(\".\") - 1 : out[i].v.length - 1;\r\n                    vv = out[i].v.substr(j + 1);\r\n                    for (; j >= 0; --j) {\r\n                        if (jj >= 0 && (out[i].v.charAt(j) === \"0\" || out[i].v.charAt(j) === \"#\")) vv = ostr.charAt(jj--) + vv;\r\n                    }\r\n                    out[i].v = vv;\r\n                    out[i].t = 't';\r\n                    lasti = i;\r\n                }\r\n                if (jj >= 0 && lasti < out.length) out[lasti].v = ostr.substr(0, jj + 1) + out[lasti].v;\r\n                jj = ostr.indexOf(\".\") + 1;\r\n                for (i = decpt; i < out.length; ++i) {\r\n                    if (out[i] == null || ('n?('.indexOf(out[i].t) === -1 && i !== decpt)) continue;\r\n                    j = out[i].v.indexOf(\".\") > -1 && i === decpt ? out[i].v.indexOf(\".\") + 1 : 0;\r\n                    vv = out[i].v.substr(0, j);\r\n                    for (; j < out[i].v.length; ++j) {\r\n                        if (jj < ostr.length) vv += ostr.charAt(jj++);\r\n                    }\r\n                    out[i].v = vv;\r\n                    out[i].t = 't';\r\n                    lasti = i;\r\n                }\r\n            }\r\n        }\r\n        for (i = 0; i < out.length; ++i)\r\n            if (out[i] != null && 'n?'.indexOf(out[i].t) > -1) {\r\n                myv = (flen > 1 && v < 0 && i > 0 && out[i - 1].v === \"-\" ? -v : v);\r\n                out[i].v = write_num(out[i].t, out[i].v, myv);\r\n                out[i].t = 't';\r\n            }\r\n        var retval = \"\";\r\n        for (i = 0; i !== out.length; ++i)\r\n            if (out[i] != null) retval += out[i].v;\r\n   \r\n        return retval;\r\n    }\r\n    SSF._eval = eval_fmt;\r\n    var cfregex = /\\[[=<>]/;\r\n    var cfregex2 = /\\[(=|>[=]?|<[>=]?)(-?\\d+(?:\\.\\d*)?)\\]/;\r\n\r\n    function chkcond(v, rr) {\r\n        if (rr == null) return false;\r\n        var thresh = parseFloat(rr[2]);\r\n        switch (rr[1]) {\r\n            case \"=\":\r\n                if (v == thresh) return true;\r\n                break;\r\n            case \">\":\r\n                if (v > thresh) return true;\r\n                break;\r\n            case \"<\":\r\n                if (v < thresh) return true;\r\n                break;\r\n            case \"<>\":\r\n                if (v != thresh) return true;\r\n                break;\r\n            case \">=\":\r\n                if (v >= thresh) return true;\r\n                break;\r\n            case \"<=\":\r\n                if (v <= thresh) return true;\r\n                break;\r\n        }\r\n        return false;\r\n    }\r\n\r\n    function choose_fmt(f, v) {\r\n        var fmt = split_fmt(f);\r\n        var l = fmt.length,\r\n            lat = fmt[l - 1].indexOf(\"@\");\r\n        if (l < 4 && lat > -1) --l;\r\n        if (fmt.length > 4) throw new Error(\"cannot find right format for |\" + fmt.join(\"|\") + \"|\");\r\n        if (typeof v !== \"number\") return [4, fmt.length === 4 || lat > -1 ? fmt[fmt.length - 1] : \"@\"];\r\n        switch (fmt.length) {\r\n            case 1:\r\n                fmt = lat > -1 ? [\"General\", \"General\", \"General\", fmt[0]] : [fmt[0], fmt[0], fmt[0], \"@\"];\r\n                break;\r\n            case 2:\r\n                fmt = lat > -1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], \"@\"];\r\n                break;\r\n            case 3:\r\n                fmt = lat > -1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], \"@\"];\r\n                break;\r\n            case 4:\r\n                break;\r\n        }\r\n        var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];\r\n        if (fmt[0].indexOf(\"[\") === -1 && fmt[1].indexOf(\"[\") === -1) return [l, ff];\r\n        if (fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {\r\n            var m1 = fmt[0].match(cfregex2);\r\n            var m2 = fmt[1].match(cfregex2);\r\n            return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];\r\n        }\r\n        return [l, ff];\r\n    }\r\n\r\n    function format(fmt, v, o) {\r\n        if (o == null) o = {};\r\n        var sfmt = \"\";\r\n        switch (typeof fmt) {\r\n            case \"string\":\r\n                if (fmt == \"m/d/yy\" && o.dateNF) sfmt = o.dateNF;\r\n                else sfmt = fmt;\r\n                break;\r\n            case \"number\":\r\n                if (fmt == 14 && o.dateNF) sfmt = o.dateNF;\r\n                else sfmt = (o.table != null ? (o.table) : table_fmt)[fmt];\r\n                if (sfmt == null) sfmt = (o.table && o.table[default_map[fmt]]) || table_fmt[default_map[fmt]];\r\n                if (sfmt == null) sfmt = default_str[fmt] || \"General\";\r\n                break;\r\n        }\r\n\r\n        //new runze 增加万 亿 格式  \r\n        //注：\"w\":2万2500  \"w0\":2万2500  \"w0.0\":2万2500.2  \"w0.00\":2万2500.23......自定义精确度\r\n        var reg = /^(w|W)((0?)|(0\\.0+))$/;\r\n        if(!!sfmt.match(reg)){\r\n            if(isNaN(v)){\r\n                return v;\r\n            }\r\n\r\n             //var v =300101886.436;\r\n            var acc = sfmt.slice(1); //取得0/0.0/0.00\r\n            var isNegative = false;\r\n            if(!isNaN(v) && Number(v) < 0){\r\n                isNegative = true;\r\n                v = Math.abs(v);\r\n            }\r\n            var vInt = parseInt(v);\r\n             \r\n            var vlength = vInt.toString().length;\r\n            if( vlength> 4){\r\n                if(vlength > 8){\r\n                    var y =parseInt (v / 100000000);  //亿\r\n                    var w = parseInt(parseFloat(v).subtract(y*100000000) / 10000); //万\r\n                    var q = parseFloat(v).subtract(y*100000000 + w*10000); //千以后\r\n                    if(acc != \"\"){\r\n                        q = numeral(q).format(acc); //处理精确度\r\n                    }\r\n                    v = y + \"亿\" + w + \"万\" + q;\r\n                }else{\r\n                    var w = parseInt(v / 10000); //万\r\n                    var q = parseFloat(v).subtract(w*10000) //千以后\r\n                    if(acc != \"\"){\r\n                        q = numeral(q).format(acc); //处理精确度\r\n                    }\r\n                    v = w + \"万\" + q;\r\n                }\r\n                \r\n\r\n                if(v.indexOf(\"亿0万0\") != -1){\r\n                    v = v.replace(\"0万0\",\"\");\r\n                }else if(v.indexOf(\"亿0万\") != -1){\r\n                    v = v.replace(\"0万\",\"\");\r\n                }else if(v.indexOf(\"万0\") != -1){\r\n                    v = v.replace(\"万0\",\"万\");\r\n                }\r\n\r\n                //舍弃正则后顾断言写法，旧浏览器不识别（360 V9）\r\n                if (v.indexOf(\"亿\") != -1 && v.indexOf(\"万\") == -1) { //1亿/1亿111 => 1亿/1亿0111\r\n                    var afterYi = v.substring(v.indexOf(\"亿\") + 1);\r\n                    if (afterYi.substring(0, 1) !== \".\" && afterYi != \"\") {\r\n                        switch ((parseInt(afterYi) + \"\").length) {\r\n                            case 1:\r\n                                afterYi = \"000\" + afterYi;\r\n                                break;\r\n                            case 2:\r\n                                afterYi = \"00\" + afterYi;\r\n                                break;\r\n                            case 3:\r\n                                afterYi = \"0\" + afterYi;\r\n                                break;\r\n                        }\r\n                        v = v.substring(0, v.indexOf(\"亿\") + 1) + afterYi;\r\n                    }\r\n                } else if (v.indexOf(\"亿\") == -1 && v.indexOf(\"万\") != -1) { //3万0011\r\n                    var afterWan = v.substring(v.indexOf(\"万\") + 1);\r\n                    if (afterWan.substring(0, 1) !== \".\" && afterWan != \"\") {\r\n                        switch ((parseInt(afterWan) + \"\").length) {\r\n                            case 1:\r\n                                afterWan = \"000\" + afterWan;\r\n                                break;\r\n                            case 2:\r\n                                afterWan = \"00\" + afterWan;\r\n                                break;\r\n                            case 3:\r\n                                afterWan = \"0\" + afterWan;\r\n                                break;\r\n                        }\r\n                        v = v.substring(0, v.indexOf(\"万\") + 1) + afterWan;\r\n                    }\r\n                } else if (v.indexOf(\"亿\") != -1 && v.indexOf(\"万\") != -1) { //1亿0053万0611\r\n                    var afterYi = v.substring(v.indexOf(\"亿\") + 1,v.indexOf(\"万\")),\r\n                        afterWan = v.substring(v.indexOf(\"万\") + 1);\r\n\r\n                    switch ((parseInt(afterYi) + \"\").length) {\r\n                        case 1:\r\n                            afterYi = \"000\" + afterYi;\r\n                            break;\r\n                        case 2:\r\n                            afterYi = \"00\" + afterYi;\r\n                            break;\r\n                        case 3:\r\n                            afterYi = \"0\" + afterYi;\r\n                            break;\r\n                    }\r\n                    v = v.substring(0, v.indexOf(\"亿\") + 1) + afterYi + v.substring(v.indexOf(\"万\"))\r\n                    \r\n\r\n                    if (afterWan.substring(0, 1) !== \".\" && afterWan != \"\") {\r\n                        switch ((parseInt(afterWan) + \"\").length) {\r\n                            case 1:\r\n                                afterWan = \"000\" + afterWan;\r\n                                break;\r\n                            case 2:\r\n                                afterWan = \"00\" + afterWan;\r\n                                break;\r\n                            case 3:\r\n                                afterWan = \"0\" + afterWan;\r\n                                break;\r\n                        }\r\n                        v = v.substring(0, v.indexOf(\"万\") + 1) + afterWan\r\n                    }\r\n                }\r\n\r\n            }else{\r\n                if(acc != \"\"){\r\n                    v = numeral(v).format(acc); //处理精确度\r\n                }\r\n            }\r\n            if(isNegative){\r\n                return '-' + v;\r\n            }else{\r\n                return v;\r\n            }\r\n            \r\n        }\r\n\r\n\r\n        if (isgeneral(sfmt, 0)) return general_fmt(v, o);\r\n        if (v instanceof Date) v = datenum_local(v, o.date1904);\r\n        var f = choose_fmt(sfmt, v);\r\n        if (isgeneral(f[1])) return general_fmt(v, o);\r\n        if (v === true) v = \"TRUE\";\r\n        else if (v === false) v = \"FALSE\";\r\n        else if (v === \"\" || v == null) return \"\";\r\n        return eval_fmt(f[1], v, o, f[0]);\r\n    }\r\n\r\n    function load_entry(fmt, idx) {\r\n        if (typeof idx != 'number') {\r\n            idx = +idx || -1;\r\n            for (var i = 0; i < 0x0188; ++i) {\r\n                if (table_fmt[i] == undefined) {\r\n                    if (idx < 0) idx = i;\r\n                    continue;\r\n                }\r\n                if (table_fmt[i] == fmt) {\r\n                    idx = i;\r\n                    break;\r\n                }\r\n            }\r\n            if (idx < 0) idx = 0x187;\r\n        }\r\n        table_fmt[idx] = fmt;\r\n        return idx;\r\n    }\r\n    SSF.load = load_entry;\r\n    SSF._table = table_fmt;\r\n    SSF.get_table = function get_table() {\r\n        return table_fmt;\r\n    };\r\n    SSF.load_table = function load_table(tbl) {\r\n        for (var i = 0; i != 0x0188; ++i)\r\n            if (tbl[i] !== undefined) load_entry(tbl[i], i);\r\n    };\r\n    SSF.init_table = init_table;\r\n    SSF.format = format;\r\n};\r\nmake_ssf(SSF);\r\n\r\nvar XLMLFormatMap /*{[string]:string}*/ = ({\r\n    \"General Number\": \"General\",\r\n    \"General Date\": SSF._table[22],\r\n    \"Long Date\": \"dddd, mmmm dd, yyyy\",\r\n    \"Medium Date\": SSF._table[15],\r\n    \"Short Date\": SSF._table[14],\r\n    \"Long Time\": SSF._table[19],\r\n    \"Medium Time\": SSF._table[18],\r\n    \"Short Time\": SSF._table[20],\r\n    \"Currency\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\r\n    \"Fixed\": SSF._table[2],\r\n    \"Standard\": SSF._table[4],\r\n    \"Percent\": SSF._table[10],\r\n    \"Scientific\": SSF._table[11],\r\n    \"Yes/No\": '\"Yes\";\"Yes\";\"No\";@',\r\n    \"True/False\": '\"True\";\"True\";\"False\";@',\r\n    \"On/Off\": '\"Yes\";\"Yes\";\"No\";@'\r\n});\r\n\r\nvar unescapexml = (function() {\r\n    /* 22.4.2.4 bstr (Basic String) */\r\n    var encregex = /&(?:quot|apos|gt|lt|amp|#x?([\\da-fA-F]+));/g,\r\n        coderegex = /_x([\\da-fA-F]{4})_/g;\r\n    return function unescapexml(text) {\r\n        var s = text + '',\r\n            i = s.indexOf(\"<![CDATA[\");\r\n        if (i == -1) return s.replace(encregex, function($$, $1) {\r\n            return encodings[$$] || String.fromCharCode(parseInt($1, $$.indexOf(\"x\") > -1 ? 16 : 10)) || $$;\r\n        }).replace(coderegex, function(m, c) {\r\n            return String.fromCharCode(parseInt(c, 16));\r\n        });\r\n        var j = s.indexOf(\"]]>\");\r\n        return unescapexml(s.slice(0, i)) + s.slice(i + 9, j) + unescapexml(s.slice(j + 3));\r\n    };\r\n})();\r\n\r\nfunction xlml_format(format, value) {\r\n    var fmt = XLMLFormatMap[format] || unescapexml(format);\r\n    if (fmt === \"General\") return SSF._general(value);\r\n    return SSF.format(fmt, value);\r\n}\r\n\r\nvar basedate = new Date(1899, 11, 31, 0, 0, 0);\r\nvar dnthresh = basedate.getTime();\r\nvar base1904 = new Date(1900, 2, 1, 0, 0, 0);\r\n\r\nfunction datenum(v, date1904) {\r\n    var epoch = v.getTime();\r\n    if (date1904) epoch -= 1462 * 24 * 60 * 60 * 1000;\r\n    return (epoch - dnthresh) / (24 * 60 * 60 * 1000);\r\n}\r\n\r\nexport function datenum_local(v, date1904) {\r\n    var epoch = Date.UTC(v.getFullYear(), v.getMonth(), v.getDate(), v.getHours(), v.getMinutes(), v.getSeconds());\r\n    var dnthresh_utc = Date.UTC(1899, 11, 31, 0, 0, 0);\r\n\r\n    if (date1904) epoch -= 1461 * 24 * 60 * 60 * 1000;\r\n    else if (v >= base1904) epoch += 24 * 60 * 60 * 1000;\r\n    return (epoch - dnthresh_utc) / (24 * 60 * 60 * 1000);\r\n}\r\n\r\nfunction numdate(v) {\r\n    var out = new Date();\r\n    out.setTime(v * 24 * 60 * 60 * 1000 + dnthresh);\r\n    return out;\r\n}\r\n/* ISO 8601 Duration */\r\nfunction parse_isodur(s) {\r\n    var sec = 0,\r\n        mt = 0,\r\n        time = false;\r\n    var m = s.match(/P([0-9\\.]+Y)?([0-9\\.]+M)?([0-9\\.]+D)?T([0-9\\.]+H)?([0-9\\.]+M)?([0-9\\.]+S)?/);\r\n    if (!m) throw new Error(\"|\" + s + \"| is not an ISO8601 Duration\");\r\n    for (var i = 1; i != m.length; ++i) {\r\n        if (!m[i]) continue;\r\n        mt = 1;\r\n        if (i > 3) time = true;\r\n        switch (m[i].slice(m[i].length - 1)) {\r\n            case 'Y':\r\n                throw new Error(\"Unsupported ISO Duration Field: \" + m[i].slice(m[i].length - 1));\r\n            case 'D':\r\n                mt *= 24;\r\n                /* falls through */\r\n            case 'H':\r\n                mt *= 60;\r\n                /* falls through */\r\n            case 'M':\r\n                if (!time) throw new Error(\"Unsupported ISO Duration Field: M\");\r\n                else mt *= 60;\r\n                /* falls through */\r\n            case 'S':\r\n                break;\r\n        }\r\n        sec += mt * parseInt(m[i], 10);\r\n    }\r\n    return sec;\r\n}\r\nvar good_pd_date = new Date('2017-02-19T19:06:09.000Z');\r\nif (isNaN(good_pd_date.getFullYear())) good_pd_date = new Date('2/19/17');\r\nvar good_pd = good_pd_date.getFullYear() == 2017;\r\n/* parses a date as a local date */\r\nfunction parseDate(str, fixdate) {\r\n    var d = new Date(str);\r\n    if (good_pd) {\r\n        if (fixdate > 0) d.setTime(d.getTime() + d.getTimezoneOffset() * 60 * 1000);\r\n        else if (fixdate < 0) d.setTime(d.getTime() - d.getTimezoneOffset() * 60 * 1000);\r\n        return d;\r\n    }\r\n    if (str instanceof Date) return str;\r\n    if (good_pd_date.getFullYear() == 1917 && !isNaN(d.getFullYear())) {\r\n        var s = d.getFullYear();\r\n        if (str.indexOf(\"\" + s) > -1) return d;\r\n        d.setFullYear(d.getFullYear() + 100);\r\n        return d;\r\n    }\r\n    var n = str.match(/\\d+/g) || [\"2017\", \"2\", \"19\", \"0\", \"0\", \"0\"];\r\n    var out = new Date(+n[0], +n[1] - 1, +n[2], (+n[3] || 0), (+n[4] || 0), (+n[5] || 0));\r\n    if (str.indexOf(\"Z\") > -1) out = new Date(out.getTime() - out.getTimezoneOffset() * 60 * 1000);\r\n    return out;\r\n}\r\n\r\n/* TODO: stress test */\r\nfunction fuzzynum(s) {\r\n    var v = Number(s);\r\n    if(typeof s == \"number\"){\r\n        return s;\r\n    }\r\n    if (!isNaN(v)) return v;\r\n    var wt = 1;\r\n    var ss = s.replace(/([\\d]),([\\d])/g, \"$1$2\").replace(/[$]/g, \"\").replace(/[%]/g, function() {\r\n        wt *= 100;\r\n        return \"\";\r\n    });\r\n    if (!isNaN(v = Number(ss))) return v / wt;\r\n    ss = ss.replace(/[(](.*)[)]/, function($$, $1) {\r\n        wt = -wt;\r\n        return $1;\r\n    });\r\n    if (!isNaN(v = Number(ss))) return v / wt;\r\n    return v;\r\n}\r\n\r\nfunction fuzzydate(s) {\r\n    var o = new Date(s),\r\n        n = new Date(NaN);\r\n    var y = o.getYear(),\r\n        m = o.getMonth(),\r\n        d = o.getDate();\r\n    if (isNaN(d)) return n;\r\n    if (y < 0 || y > 8099) return n;\r\n    if ((m > 0 || d > 1) && y != 101) return o;\r\n    if (s.toLowerCase().match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) return o;\r\n    if (s.match(/[^-0-9:,\\/\\\\]/)) return n;\r\n    return o;\r\n}\r\n\r\nexport function genarate(value) {//万 单位格式增加！！！\r\n    var ret = [];\r\n    var m = null, ct = {}, v = value;\r\n    \r\n    if(value == null){\r\n        return null;\r\n    }\r\n\r\n    if (/^-?[0-9]{1,}[,][0-9]{3}(.[0-9]{1,2})?$/.test(value)) { // 表述金额的字符串，如：12,000.00 或者 -12,000.00\r\n        m = value\r\n        v = Number(value.split('.')[0].replace(',', ''))\r\n        let fa = \"#,##0\"\r\n        if (value.split('.')[1]) {\r\n            fa = \"#,##0.\"\r\n            for (let i = 0; i < value.split('.')[1].length; i++) {\r\n                fa += 0\r\n            }\r\n        }\r\n        ct= {fa, t: \"n\"}\r\n    } else if(value.toString().substr(0, 1) === \"'\"){\r\n        m = value.toString().substr(1);\r\n        ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n    }\r\n    else if(value.toString().toUpperCase() === \"TRUE\"){\r\n        m = \"TRUE\";\r\n        ct = { \"fa\": \"General\", \"t\": \"b\" };\r\n        v = true;\r\n    }\r\n    else if(value.toString().toUpperCase() === \"FALSE\"){\r\n        m = \"FALSE\";\r\n        ct = { \"fa\": \"General\", \"t\": \"b\" };\r\n        v = false;\r\n    }\r\n    else if(valueIsError(value)){\r\n        m = value.toString();\r\n        ct = { \"fa\": \"General\", \"t\": \"e\" };\r\n    }\r\n    else if(/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(value)){\r\n        m = value.toString();\r\n        ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n    }\r\n    else if(isRealNum(value) && Math.abs(parseFloat(value)) > 0 && (Math.abs(parseFloat(value)) >= 1e+11 || Math.abs(parseFloat(value)) < 1e-9)){\r\n        if (value.length > 16) {\r\n            v = value;\r\n            ct = { 'fa': '@', 't': 's' }\r\n            m = SSF.format(ct.fa, v);\r\n        }\r\n        else {\r\n            v = numeral(value).value();\r\n            var str = v.toExponential();\r\n            if(str.indexOf(\".\") > -1){\r\n                var strlen = str.split(\".\")[1].split(\"e\")[0].length;\r\n                if(strlen > 5){\r\n                    strlen = 5;\r\n                }\r\n                ct = { \"fa\": \"#0.\"+ new Array(strlen + 1).join(\"0\") +\"E+00\", \"t\": \"n\" }; \r\n            }\r\n            else{\r\n                ct = { \"fa\": \"#0.E+00\", \"t\": \"n\" };\r\n            }\r\n            m = SSF.format(ct.fa, v);\r\n        }\r\n    }\r\n    else if(value.toString().indexOf(\"%\") > -1){\r\n        var index = value.toString().indexOf(\"%\");\r\n        var value2 = value.toString().substr(0, index);\r\n        var value3 = value2.replace(/,/g, \"\");\r\n\r\n        if(index == value.toString().length - 1 && isRealNum(value3)){\r\n            if(value2.indexOf(\".\") > -1){\r\n                if(value2.indexOf(\".\") == value2.lastIndexOf(\".\")){\r\n                    var value4 = value2.split(\".\")[0];\r\n                    var value5 = value2.split(\".\")[1];\r\n\r\n                    var len = value5.length;\r\n                    if(len > 9){\r\n                        len = 9;\r\n                    }\r\n\r\n                    if(value4.indexOf(\",\") > -1){\r\n                        var isThousands = true;\r\n                        var ThousandsArr = value4.split(\",\");\r\n\r\n                        for(var i = 1; i < ThousandsArr.length; i++){\r\n                            if(ThousandsArr[i].length < 3){\r\n                                isThousands = false;\r\n                                break;\r\n                            }\r\n                        }\r\n\r\n                        if(isThousands){\r\n                            ct = { \"fa\": \"#,##0.\" + new Array(len + 1).join(\"0\") + \"%\", \"t\": \"n\" };\r\n                            v = numeral(value).value();\r\n                            m = SSF.format(ct.fa, v);\r\n                        }\r\n                        else{\r\n                            m = value.toString();\r\n                            ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n                        }\r\n                    }\r\n                    else{\r\n                        ct = { \"fa\": \"0.\" + new Array(len + 1).join(\"0\") + \"%\", \"t\": \"n\" };\r\n                        v = numeral(value).value();\r\n                        m = SSF.format(ct.fa, v);\r\n                    }\r\n                }\r\n                else{\r\n                    m = value.toString();\r\n                    ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n                }\r\n            }\r\n            else if(value2.indexOf(\",\") > -1){\r\n                var isThousands = true;\r\n                var ThousandsArr = value2.split(\",\");\r\n\r\n                for(var i = 1; i < ThousandsArr.length; i++){\r\n                    if(ThousandsArr[i].length < 3){\r\n                        isThousands = false;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if(isThousands){\r\n                    ct = { \"fa\": \"#,##0%\", \"t\": \"n\" };\r\n                    v = numeral(value).value();\r\n                    m = SSF.format(ct.fa, v);\r\n                }\r\n                else{\r\n                    m = value.toString();\r\n                    ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n                }\r\n            }\r\n            else{\r\n                ct = { \"fa\": \"0%\", \"t\": \"n\" };\r\n                v = numeral(value).value();\r\n                m = SSF.format(ct.fa, v);\r\n            }\r\n        }\r\n        else{\r\n            m = value.toString();\r\n            ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n        }\r\n    }\r\n    else if(value.toString().indexOf(\".\") > -1){\r\n        if(value.toString().indexOf(\".\") == value.toString().lastIndexOf(\".\")){\r\n            var value1 = value.toString().split(\".\")[0];\r\n            var value2 = value.toString().split(\".\")[1];\r\n\r\n            var len = value2.length;\r\n            if(len > 9){\r\n                len = 9;\r\n            }\r\n\r\n            if(value1.indexOf(\",\") > -1){\r\n                var isThousands = true;\r\n                var ThousandsArr = value1.split(\",\");\r\n\r\n                for(var i = 1; i < ThousandsArr.length; i++){\r\n                    if(!isRealNum(ThousandsArr[i]) || ThousandsArr[i].length < 3){\r\n                        isThousands = false;\r\n                        break;\r\n                    }\r\n                }\r\n\r\n                if(isThousands){\r\n                    ct = { \"fa\": \"#,##0.\" + new Array(len + 1).join(\"0\"), \"t\": \"n\" };\r\n                    v = numeral(value).value();\r\n                    m = SSF.format(ct.fa, v);\r\n                }\r\n                else{\r\n                    m = value.toString();\r\n                    ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n                }\r\n            }\r\n            else{\r\n                if(isRealNum(value1) && isRealNum(value2)){\r\n                    ct = { \"fa\": \"0.\" + new Array(len + 1).join(\"0\"), \"t\": \"n\" };\r\n                    v = numeral(value).value();\r\n                    m = SSF.format(ct.fa, v);\r\n                }\r\n                else{\r\n                    m = value.toString();\r\n                    ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            m = value.toString();\r\n            ct = { \"fa\": \"@\", \"t\": \"s\" };\r\n        }\r\n    }\r\n    else if(isRealNum(value)){\r\n        m = value.toString();\r\n        ct = { \"fa\": \"General\", \"t\": \"n\" };\r\n        v = parseFloat(value);\r\n    }\r\n    else if (isdatetime(value) && (value.toString().indexOf(\".\") > -1 || value.toString().indexOf(\":\") > -1 || value.toString().length < 16)){\r\n        v = datenum_local(parseDate(value.toString().replace(/-/g, \"/\")));\r\n\r\n        if(v.toString().indexOf(\".\") > -1){\r\n            if(value.toString().length > 18){\r\n                ct.fa = \"yyyy-MM-dd hh:mm:ss\";\r\n            }\r\n            else if(value.toString().length > 11){\r\n                ct.fa = \"yyyy-MM-dd hh:mm\";\r\n            }\r\n            else{\r\n                ct.fa = \"yyyy-MM-dd\";\r\n            }\r\n        }\r\n        else{\r\n            ct.fa = \"yyyy-MM-dd\";\r\n        }\r\n        \r\n        ct.t = \"d\";\r\n        m = SSF.format(ct.fa, v);\r\n    }\r\n    else{\r\n        m = value;\r\n        ct.fa = \"General\";\r\n        ct.t = \"g\";\r\n    }\r\n\r\n    return [m, ct, v];\r\n}\r\n\r\nexport function update(fmt, v) {\r\n    return SSF.format(fmt, v);\r\n}\r\n\r\nexport function is_date(fmt, v) {\r\n    return SSF.is_date(fmt, v);\r\n}\r\n\r\nexport function valueShowEs(r, c, d) {\r\n    var value = getcellvalue(r, c, d, \"m\");\r\n    if(value == null){\r\n        value = getcellvalue(r, c, d, \"v\");\r\n    }\r\n    else{\r\n        if (!isNaN(fuzzynum(value))){\r\n            if(typeof(value) == \"string\" && value.indexOf(\"%\") > -1){\r\n                \r\n            }\r\n            else{\r\n                value = getcellvalue(r, c, d, \"v\");\r\n            }\r\n        }\r\n        // else if (!isNaN(parseDate(value).getDate())){\r\n        else if (d[r][c].ct != null && d[r][c].ct.t == \"d\"){\r\n\r\n        }\r\n        else if (d[r][c].ct != null && d[r][c].ct.t == \"b\"){\r\n\r\n        }\r\n        else{\r\n            value = getcellvalue(r, c, d, \"v\");\r\n        }\r\n    }\r\n    return value;\r\n}\r\n"
  },
  {
    "path": "src/global/formula.js",
    "content": "import { replaceHtml, getObjType, chatatABC, ABCatNum, luckysheetfontformat } from \"../utils/util\";\r\nimport { getSheetIndex, getRangetxt, getluckysheetfile } from \"../methods/get\";\r\nimport { setluckysheetfile } from \"../methods/set\";\r\nimport { luckyColor } from \"../controllers/constant\";\r\nimport sheetmanage from \"../controllers/sheetmanage\";\r\nimport menuButton from \"../controllers/menuButton\";\r\nimport server from \"../controllers/server\";\r\nimport luckysheetFreezen from \"../controllers/freezen\";\r\nimport { checkProtectionLocked, checkProtectionCellHidden } from \"../controllers/protection\";\r\nimport dataVerificationCtrl from \"../controllers/dataVerificationCtrl\";\r\nimport { seletedHighlistByindex, luckysheet_count_show } from \"../controllers/select\";\r\nimport { isRealNum, isRealNull, valueIsError, isEditMode } from \"./validate\";\r\nimport { isdatetime, isdatatype } from \"./datecontroll\";\r\nimport { getCellTextSplitArr, getCellTextInfo } from \"../global/getRowlen\";\r\nimport { getcellvalue, getcellFormula, getInlineStringNoStyle, getOrigincell } from \"./getdata\";\r\nimport { setcellvalue } from \"./setdata\";\r\nimport { genarate, valueShowEs } from \"./format\";\r\nimport editor from \"./editor\";\r\nimport tooltip from \"./tooltip\";\r\nimport { rowLocation, colLocation, colLocationByIndex, mouseposition } from \"./location\";\r\nimport { luckysheetRangeLast } from \"./cursorPos\";\r\nimport { jfrefreshgrid } from \"./refresh\";\r\nimport { isInlineStringCell, convertSpanToShareString } from \"../controllers/inlineString\";\r\n// import luckysheet_function from '../function/luckysheet_function';\r\n// import functionlist from '../function/functionlist';\r\nimport {\r\n    luckysheet_compareWith,\r\n    luckysheet_getarraydata,\r\n    luckysheet_getcelldata,\r\n    luckysheet_parseData,\r\n    luckysheet_getValue,\r\n    luckysheet_indirect_check,\r\n    luckysheet_indirect_check_return,\r\n    luckysheet_offset_check,\r\n    luckysheet_calcADPMM,\r\n    luckysheet_getSpecialReference,\r\n} from \"../function/func\";\r\nimport Store from \"../store\";\r\nimport locale from \"../locale/locale\";\r\nimport json from \"./json\";\r\nimport method from \"./method\";\r\n\r\nconst luckysheetformula = {\r\n    error: {\r\n        v: \"#VALUE!\", //错误的参数或运算符\r\n        n: \"#NAME?\", //公式名称错误\r\n        na: \"#N/A\", //函数或公式中没有可用数值\r\n        r: \"#REF!\", //删除了由其他公式引用的单元格\r\n        d: \"#DIV/0!\", //除数是0或空单元格\r\n        nm: \"#NUM!\", //当公式或函数中某个数字有问题时\r\n        nl: \"#NULL!\", //交叉运算符（空格）使用不正确\r\n        sp: \"#SPILL!\", //数组范围有其它值\r\n    },\r\n    errorInfo: function(err) {\r\n        return err;\r\n    },\r\n    errorParamCheck: function(thisp, data, i) {\r\n        let type, require;\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n        if (i < thisp.length) {\r\n            type = thisp[i].type;\r\n            require = thisp[i].require;\r\n        } else {\r\n            type = thisp[thisp.length - 1].type;\r\n            require = thisp[thisp.length - 1].require;\r\n        }\r\n\r\n        if (require == \"o\" && (data == null || data == \"\")) {\r\n            return [true, locale_formulaMore.tipSuccessText];\r\n        }\r\n\r\n        if (type.indexOf(\"all\") > -1) {\r\n            return [true, locale_formulaMore.tipSuccessText];\r\n        } else {\r\n            if (type.indexOf(\"range\") > -1 && (getObjType(data) == \"object\" || getObjType(data) == \"array\")) {\r\n                return [true, locale_formulaMore.tipSuccessText];\r\n            }\r\n\r\n            if (type.indexOf(\"number\") > -1 && (isRealNum(data) || getObjType(data) == \"boolean\")) {\r\n                return [true, locale_formulaMore.tipSuccessText];\r\n            }\r\n\r\n            if (type.indexOf(\"string\") > -1 && getObjType(data) == \"string\") {\r\n                return [true, locale_formulaMore.tipSuccessText];\r\n            }\r\n\r\n            if (type.indexOf(\"date\") > -1 && isdatetime(data)) {\r\n                return [true, locale_formulaMore.tipSuccessText];\r\n            }\r\n\r\n            return [false, locale_formulaMore.tipParamErrorText];\r\n        }\r\n    },\r\n    getPureValueByData: function(data) {\r\n        if (data.length == 0) {\r\n            return [];\r\n        }\r\n\r\n        let output = [];\r\n\r\n        if (getObjType(data) == \"array\") {\r\n            if (getObjType(data[0]) == \"array\") {\r\n                for (let r = 0; r < data.length; r++) {\r\n                    let row = [];\r\n\r\n                    for (let c = 0; c < data[0].length; c++) {\r\n                        let cell = data[r][c];\r\n\r\n                        if (getObjType(cell) == \"object\") {\r\n                            row.push(cell.v);\r\n                        } else {\r\n                            row.push(cell);\r\n                        }\r\n                    }\r\n\r\n                    output.push(row);\r\n                }\r\n            } else {\r\n                for (let i = 0; i < data.length; i++) {\r\n                    let cell = data[i];\r\n\r\n                    if (getObjType(cell) == \"object\") {\r\n                        output.push(cell.v);\r\n                    } else {\r\n                        output.push(cell);\r\n                    }\r\n                }\r\n            }\r\n        } else {\r\n            let cell = data;\r\n\r\n            if (getObjType(cell) == \"object\") {\r\n                output.push(cell.v);\r\n            } else {\r\n                output.push(cell);\r\n            }\r\n        }\r\n\r\n        return output;\r\n    },\r\n    //sparklines添加\r\n    readCellDataToOneArray: function(rangeValue) {\r\n        let _this = this;\r\n\r\n        if (rangeValue == null) {\r\n            return [];\r\n        }\r\n\r\n        if (getObjType(rangeValue) != \"object\") {\r\n            return [rangeValue];\r\n        }\r\n\r\n        let dataformat = [];\r\n        let data = [];\r\n\r\n        if (rangeValue != null && rangeValue.data != null) {\r\n            data = rangeValue.data;\r\n        } else if (rangeValue != null && !isRealNull(rangeValue.v)) {\r\n            return [rangeValue.v];\r\n        } else {\r\n            return [];\r\n        }\r\n\r\n        //适配excel的动态数组格式，{1，2，3，4，5}或者{{1，2，3}，{4，5，6}，{7，8，9}}\r\n        if (getObjType(data) == \"array\") {\r\n            data = _this.getPureValueByData(data);\r\n        } else if (getObjType(data) == \"object\") {\r\n            data = data.v;\r\n\r\n            return [data];\r\n        } else {\r\n            if (/\\{.*?\\}/.test(data)) {\r\n                data = data.replace(/\\{/g, \"[\").replace(/\\}/g, \"]\");\r\n            }\r\n\r\n            data = new Function(\"return \" + data)();\r\n        }\r\n\r\n        //把二维数组转换为一维数组，sparklines要求数据格式为一维数组\r\n        //let dataformat = [];\r\n        if (getObjType(data[0]) == \"array\") {\r\n            for (let i = 0; i < data.length; i++) {\r\n                dataformat = dataformat.concat(data[i]);\r\n            }\r\n        } else {\r\n            dataformat = data;\r\n        }\r\n\r\n        return dataformat;\r\n    },\r\n    //sparklines添加\r\n    //获得函数里某个参数的值，使用此函数需要在函数中执行luckysheet_getValue方法\r\n    getValueByFuncData: function(value, arg) {\r\n        if (value == null) {\r\n            return null;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        if (getObjType(value) == \"array\") {\r\n            if (arg == \"avg\") {\r\n                return luckysheet_function.AVERAGE.f.apply(luckysheet_function.AVERAGE, value);\r\n            } else if (arg == \"sum\") {\r\n                return luckysheet_function.SUM.f.apply(luckysheet_function.SUM, value);\r\n            } else {\r\n                if (getObjType(value[0]) == \"object\") {\r\n                    return luckysheet.mask.getValueByFormat(value[0]);\r\n                } else {\r\n                    return value[0];\r\n                }\r\n            }\r\n        } else if (getObjType(value) == \"object\") {\r\n            return luckysheet.mask.getValueByFormat(value);\r\n        } else {\r\n            return value;\r\n        }\r\n    },\r\n    //sparklines添加\r\n    sparklinesColorMap: function(args, len) {\r\n        let _this = this;\r\n        let colorLists = null;\r\n\r\n        if (len == null) {\r\n            len = 5;\r\n        }\r\n\r\n        let index = 0;\r\n\r\n        if (args.length > len) {\r\n            for (let i = len; i < args.length; i++) {\r\n                let colorMap = args[i];\r\n                let colorListArray = _this.readCellDataToOneArray(colorMap);\r\n\r\n                for (let a = 0; a < colorListArray.length; a++) {\r\n                    let ca = colorListArray[a];\r\n\r\n                    if (ca.indexOf(\":\") > -1) {\r\n                        if (!colorLists) {\r\n                            colorLists = {};\r\n                        }\r\n\r\n                        let calist = ca.split(\":\");\r\n\r\n                        if (calist.length == 2) {\r\n                            colorLists[calist[0]] = calist[1];\r\n                        } else if (calist.length > 1) {\r\n                            colorLists[calist[0] + \":\" + calist[1]] = calist[2];\r\n                        }\r\n                    } else {\r\n                        if (!colorLists) {\r\n                            colorLists = [];\r\n                        }\r\n\r\n                        colorLists.push(ca);\r\n                    }\r\n                }\r\n\r\n                index++;\r\n            }\r\n        }\r\n\r\n        return colorLists;\r\n    },\r\n    //sparklines添加\r\n    colorList: [\r\n        \"#2ec7c9\",\r\n        \"#fc5c5c\",\r\n        \"#5ab1ef\",\r\n        \"#ffb980\",\r\n        \"#d87a80\",\r\n        \"#8d98b3\",\r\n        \"#e5cf0d\",\r\n        \"#97b552\",\r\n        \"#95706d\",\r\n        \"#dc69aa\",\r\n        \"#07a2a4\",\r\n        \"#9a7fd1\",\r\n        \"#588dd5\",\r\n        \"#f5994e\",\r\n        \"#c05050\",\r\n        \"#59678c\",\r\n        \"#c9ab00\",\r\n        \"#7eb00a\",\r\n        \"#6f5553\",\r\n        \"#c14089\",\r\n    ],\r\n    classlist: {\r\n        province: {\r\n            11: \"北京\",\r\n            12: \"天津\",\r\n            13: \"河北\",\r\n            14: \"山西\",\r\n            15: \"内蒙古\",\r\n            21: \"辽宁\",\r\n            22: \"吉林\",\r\n            23: \"黑龙江\",\r\n            31: \"上海\",\r\n            32: \"江苏\",\r\n            33: \"浙江\",\r\n            34: \"安徽\",\r\n            35: \"福建\",\r\n            36: \"江西\",\r\n            37: \"山东\",\r\n            41: \"河南\",\r\n            42: \"湖北\",\r\n            43: \"湖南\",\r\n            44: \"广东\",\r\n            45: \"广西\",\r\n            46: \"海南\",\r\n            50: \"重庆\",\r\n            51: \"四川\",\r\n            52: \"贵州\",\r\n            53: \"云南\",\r\n            54: \"西藏\",\r\n            61: \"陕西\",\r\n            62: \"甘肃\",\r\n            63: \"青海\",\r\n            64: \"宁夏\",\r\n            65: \"新疆\",\r\n            71: \"台湾\",\r\n            81: \"香港\",\r\n            82: \"澳门\",\r\n            91: \"国外\",\r\n        },\r\n    },\r\n    oldvalue: null,\r\n    dontupdate: function() {\r\n        let _this = this;\r\n        Store.luckysheetCellUpdate.length = 0; //clear array\r\n        $(\"#luckysheet-functionbox-cell, #luckysheet-rich-text-editor\").html(_this.oldvalue);\r\n        _this.cancelNormalSelected();\r\n        if (_this.rangetosheet != Store.currentSheetIndex) {\r\n            sheetmanage.changeSheetExec(_this.rangetosheet);\r\n        }\r\n    },\r\n    xssDeal: function(str) {\r\n        if (typeof str !== \"string\") return str;\r\n        return str.replace(/<script>/g, \"&lt;script&gt;\").replace(/<\\/script>/, \"&lt;/script&gt;\");\r\n    },\r\n    ltGtSignDeal: function(str) {\r\n        if (typeof str !== \"string\") return str;\r\n        if (str.substr(0, 5) === \"<span\" || str.startsWith(\"=\")) {\r\n            return str;\r\n        }\r\n        return str.replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\r\n    },\r\n    fucntionboxshow: function(r, c) {\r\n        if (!checkProtectionCellHidden(r, c, Store.currentSheetIndex)) {\r\n            $(\"#luckysheet-functionbox-cell\").html(\"\");\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        let d = Store.flowdata;\r\n        let value = \"\";\r\n        // && d[r][c].v != null\r\n        if (d[r] != null && d[r][c] != null) {\r\n            let cell = $.extend(true, {}, d[r][c]);\r\n            /**\r\n             * fix #1010\r\n             */\r\n            if (isInlineStringCell(cell)) {\r\n                value = getInlineStringNoStyle(r, c);\r\n                if (typeof value === \"string\") {\r\n                    value = value.replace(/\\</g, \"&lt;\").replace(/\\>/g, \"&gt;\");\r\n                }\r\n            } else if (cell.f != null) {\r\n                value = getcellvalue(r, c, d, \"f\");\r\n            } else {\r\n                value = valueShowEs(r, c, d);\r\n                if (typeof value === \"string\") {\r\n                    value = value.replace(/\\</g, \"&lt;\").replace(/\\>/g, \"&gt;\");\r\n                }\r\n            }\r\n        }\r\n        value = this.xssDeal(value);\r\n        _this.oldvalue = value;\r\n        $(\"#luckysheet-functionbox-cell\").html(value);\r\n    },\r\n    //获得某个单元格或区域的偏移一定距离后的单元格( Sheet1!B6:C8 格式)\r\n    cellOffset: function(range, rows, cols, height, width) {\r\n        // 参数：range or cell , rows,cols,height,width\r\n        let startCell = range.startCell;\r\n        let rowl = range.rowl;\r\n        let coll = range.coll;\r\n        let startCellRow = parseInt(startCell.replace(/[^0-9]/g, \"\"));\r\n        let startCellCol = ABCatNum(startCell.replace(/[^A-Za-z]/g, \"\"));\r\n\r\n        let row = [],\r\n            col = [],\r\n            offsetRange;\r\n        row[0] = startCellRow + rows;\r\n        col[0] = startCellCol + cols;\r\n\r\n        row[1] = row[0] + height - 1;\r\n        col[1] = col[0] + width - 1;\r\n\r\n        col[0] = chatatABC(col[0]);\r\n        col[1] = chatatABC(col[1]);\r\n\r\n        let cellF = col[0] + row[0];\r\n        let cellL = col[1] + row[1];\r\n\r\n        if (cellF == cellL) {\r\n            offsetRange = range.sheetName + \"!\" + cellF;\r\n        } else {\r\n            offsetRange = range.sheetName + \"!\" + cellF + \":\" + cellL;\r\n        }\r\n\r\n        return offsetRange;\r\n    },\r\n    parseDatetoNum: function(date) {\r\n        //函数中获取到时间格式或者数字形式统一转化为数字进行运算\r\n        let _this = this;\r\n\r\n        if (typeof date == \"object\" && typeof date.v == \"number\") {\r\n            date = date.v;\r\n        } else if (isdatatype(date) == \"num\") {\r\n            date = parseFloat(date);\r\n        } else if (isdatatype(date) == \"date\") {\r\n            date = genarate(date)[2];\r\n        } else {\r\n            return _this.error.v;\r\n        }\r\n\r\n        return date;\r\n    },\r\n    //获取一维数组\r\n    getRangeArray: function(range) {\r\n        let rangeNow = [];\r\n        let fmt = \"General\";\r\n\r\n        if (range.length == 1) {\r\n            //一行\r\n            for (let c = 0; c < range[0].length; c++) {\r\n                if (range[0][c] != null && range[0][c].v) {\r\n                    rangeNow.push(range[0][c].v);\r\n                    let f = range[0][c].ct?.fa;\r\n                    fmt = fmt == \"General\" ? f : fmt;\r\n                } else {\r\n                    //若单元格为null或为空，此处推入null（待考虑是否使用\"null\"）\r\n                    rangeNow.push(null);\r\n                }\r\n            }\r\n        } else if (range[0].length == 1) {\r\n            //一列\r\n            for (let r = 0; r < range.length; r++) {\r\n                if (range[r][0] != null && range[r][0].v) {\r\n                    rangeNow.push(range[r][0].v);\r\n                    let f = range[r][0].ct?.fa;\r\n                    fmt = fmt == \"General\" ? f : fmt;\r\n                } else {\r\n                    rangeNow.push(null);\r\n                }\r\n            }\r\n        } else {\r\n            for (let r = 0; r < range.length; r++) {\r\n                for (let c = 0; c < range[r].length; c++) {\r\n                    if (range[r][c] != null && range[r][c].v) {\r\n                        rangeNow.push(range[r][c].v);\r\n                        let f = range[r][c].ct?.fa;\r\n                        fmt = fmt == \"General\" ? f : fmt;\r\n                    } else {\r\n                        rangeNow.push(null);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        fmt = fmt ?? \"General\";\r\n\r\n        range = rangeNow;\r\n\r\n        return [range, fmt];\r\n    },\r\n    //获取二维数组：qksheet格式[[{v,m,ct}] ==> [1]\r\n    getRangeArrayTwo: function(range) {\r\n        let data = $.extend(true, [], range);\r\n\r\n        if (data.length == 1) {\r\n            //一行\r\n            for (let c = 0; c < data[0].length; c++) {\r\n                if (data[0][c] instanceof Object) {\r\n                    if (data[0][c] != null && data[0][c] instanceof Object && !!data[0][c].m) {\r\n                        data[0][c] = data[0][c].m;\r\n                    } else {\r\n                        if (data[0][c] != null && data[0][c] instanceof Object && !!data[0][c].v) {\r\n                            data[0][c] = data[0][c].v;\r\n                        } else {\r\n                            data[0][c] = null;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        } else if (data[0].length == 1) {\r\n            //一列\r\n            for (let r = 0; r < data.length; r++) {\r\n                if (data[r][0] instanceof Object) {\r\n                    if (data[r][0] != null && data[r][0] instanceof Object && !!data[r][0].m) {\r\n                        data[r][0] = data[r][0].m;\r\n                    } else {\r\n                        if (data[r][0] != null && data[r][0] instanceof Object && !!data[r][0].v) {\r\n                            data[r][0] = data[r][0].v;\r\n                        } else {\r\n                            data[r][0] = null;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        } else {\r\n            for (let r = 0; r < data.length; r++) {\r\n                for (let c = 0; c < data[r].length; c++) {\r\n                    if (data[r][c] instanceof Object) {\r\n                        if (data[r][c] != null && data[r][c] instanceof Object && !!data[r][c].m) {\r\n                            data[r][c] = data[r][c].m;\r\n                        } else {\r\n                            if (data[r][c] != null && data[r][c] instanceof Object && !!data[r][c].v) {\r\n                                data[r][c] = data[r][c].v;\r\n                            } else {\r\n                                data[r][c] = null;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return data;\r\n    },\r\n    isWildcard: function(a, b) {\r\n        //正则匹配通配符: * ? ~* ~?,a目标参数，b通配符\r\n        let _this = this;\r\n\r\n        a = a.toString();\r\n        b = b.toString();\r\n\r\n        if (_this.isCompareOperator(b).flag) {\r\n            b = _this.isCompareOperator(b).num;\r\n        }\r\n\r\n        let str = \"\";\r\n        for (let i = 0; i < b.length; i++) {\r\n            let v = b.charAt(i);\r\n\r\n            if (v == \"*\") {\r\n                str += \".*\";\r\n            } else if (v == \"?\") {\r\n                str += \".\";\r\n            } else if (v == \"~\") {\r\n                if (b.charAt(i + 1) == \"*\") {\r\n                    str += \"\\\\*\";\r\n                    i++;\r\n                } else if (b.charAt(i + 1) == \"?\") {\r\n                    str += \"\\\\?\";\r\n                    i++;\r\n                } else {\r\n                    str += \"~\";\r\n                }\r\n            } else {\r\n                str += v;\r\n            }\r\n        }\r\n\r\n        let reg = new RegExp(\"^\" + str + \"$\", \"g\");\r\n\r\n        return !!a.match(reg);\r\n    },\r\n    isCompareOperator: function(str) {\r\n        //判断前一个或者两个字符是否是比较运算符\r\n        str = str.toString();\r\n        let ope = \"\"; //存放比较运算符\r\n        let num = \"\"; //截取比较运算符之后的数字用于实际比较\r\n        let strOne = str.substr(0, 1);\r\n        let strTwo = str.substr(1, 1);\r\n        let flag = false;\r\n        let ret;\r\n\r\n        if (strOne == \">\") {\r\n            if (strTwo == \"=\") {\r\n                ope = str.substr(0, 2);\r\n                num = str.substr(2);\r\n                flag = true;\r\n            } else if (strTwo != \"=\") {\r\n                ope = str.substr(0, 1);\r\n                num = str.substr(1);\r\n                flag = true;\r\n            }\r\n        } else if (strOne == \"<\") {\r\n            if (strTwo == \"=\" || strTwo == \">\") {\r\n                ope = str.substr(0, 2);\r\n                num = str.substr(2);\r\n                flag = true;\r\n            } else if (strTwo != \"=\" && strTwo != \">\") {\r\n                ope = str.substr(0, 1);\r\n                num = str.substr(1);\r\n                flag = true;\r\n            }\r\n        } else if (strOne == \"=\" && strTwo != \"=\") {\r\n            ope = str.substr(0, 1);\r\n            num = str.substr(1);\r\n            flag = true;\r\n        }\r\n\r\n        ret = { flag: flag, ope: ope, num: num };\r\n\r\n        return ret;\r\n    },\r\n    acompareb: function(a, b) {\r\n        //a 与 b比较，b可为含比较符，通配符\r\n        let _this = this;\r\n        let flag = false;\r\n\r\n        if (isRealNum(b)) {\r\n            flag = luckysheet_compareWith(a, \"==\", b);\r\n        } else if (typeof b == \"string\") {\r\n            //条件输入字符串，如：\">233\"\r\n            if (b.indexOf(\"*\") != -1 || b.indexOf(\"?\") != -1) {\r\n                // 正则匹配：输入通配符：\"黑*\",\"白?\",以及\"白?黑*~*\"\r\n                //通配符函数\r\n                return _this.isWildcard(a, b);\r\n            } else if (_this.isCompareOperator(b).flag) {\r\n                //\"黑糖\"\r\n                let ope = _this.isCompareOperator(b).ope;\r\n                let num = _this.isCompareOperator(b).num;\r\n                flag = luckysheet_compareWith(a, ope, num);\r\n            } else {\r\n                flag = luckysheet_compareWith(a, \"==\", b);\r\n            }\r\n        }\r\n\r\n        return flag;\r\n    },\r\n    compareParams: function(fp, sp, sym) {\r\n        //比较两个字符串或者数字的大小，支持比较对象,暂不支持数组\r\n        let flag = false;\r\n\r\n        //判断a和b的数据类型\r\n        let classNameA = toString.call(fp),\r\n            classNameB = toString.call(sp);\r\n\r\n        if (sym == \">\" && fp > sp) {\r\n            flag = true;\r\n        } else if (sym == \">=\" && fp >= sp) {\r\n            flag = true;\r\n        } else if (sym == \"<\" && fp < sp) {\r\n            flag = true;\r\n        } else if (sym == \"<=\" && fp <= sp) {\r\n            flag = true;\r\n        } else if (sym == \"=\" && fp == sp) {\r\n            flag = true;\r\n        } else if (sym == \"<>\" && fp != sp) {\r\n            flag = true;\r\n        }\r\n\r\n        //对象类型比较相等\r\n        if (classNameA == \"[object Object]\" && classNameB == \"[object Object]\") {\r\n            //获取a和b的属性长度\r\n            let propsA = Object.getOwnPropertyNames(fp),\r\n                propsB = Object.getOwnPropertyNames(sp);\r\n\r\n            if (propsA.length != propsB.length) {\r\n                return false;\r\n            }\r\n\r\n            for (let i = 0; i < propsA.length; i++) {\r\n                let propName = propsA[i];\r\n                //如果对应属性对应值不相等，则返回false\r\n                if (fp[propName] !== sp[propName]) {\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            return true;\r\n        }\r\n\r\n        //数组类型\r\n        if (classNameA == \"[object Array]\" && classNameB == \"[object Array]\") {\r\n            if (fp.toString() == sp.toString()) {\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        return flag;\r\n    },\r\n    parseDecimal: function(num) {\r\n        num = parseFloat(num);\r\n        let d = parseInt(num, 10);\r\n\r\n        if (d == 0) {\r\n            return num;\r\n        }\r\n\r\n        num = num % d;\r\n        return num;\r\n    },\r\n    getcellrange: function(txt, formulaIndex) {\r\n        if (txt == null || txt.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let sheettxt = \"\",\r\n            rangetxt = \"\",\r\n            sheetIndex = null,\r\n            sheetdata = null;\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n\r\n        if (txt.indexOf(\"!\") > -1) {\r\n            if (txt in this.cellTextToIndexList) {\r\n                return this.cellTextToIndexList[txt];\r\n            }\r\n\r\n            let val = txt.split(\"!\");\r\n            sheettxt = val[0];\r\n            rangetxt = val[1];\r\n\r\n            sheettxt = sheettxt.replace(/\\\\'/g, \"'\").replace(/''/g, \"'\");\r\n            if (sheettxt.substr(0, 1) == \"'\" && sheettxt.substr(sheettxt.length - 1, 1) == \"'\") {\r\n                sheettxt = sheettxt.substring(1, sheettxt.length - 1);\r\n            }\r\n            for (let i in luckysheetfile) {\r\n                if (sheettxt == luckysheetfile[i].name) {\r\n                    sheetIndex = luckysheetfile[i].index;\r\n                    sheetdata = luckysheetfile[i].data;\r\n                    break;\r\n                }\r\n            }\r\n        } else {\r\n            let i = formulaIndex;\r\n            if (i == null) {\r\n                i = Store.currentSheetIndex;\r\n            }\r\n            if (txt + \"_\" + i in this.cellTextToIndexList) {\r\n                return this.cellTextToIndexList[txt + \"_\" + i];\r\n            }\r\n            let index = getSheetIndex(i);\r\n            sheettxt = luckysheetfile[index].name;\r\n            sheetIndex = luckysheetfile[index].index;\r\n            sheetdata = Store.flowdata;\r\n            rangetxt = txt;\r\n        }\r\n\r\n        // fix =VLOOKUP(D9,数据透视表!A:D,2,0)\r\n        if(sheetdata == null){\r\n            return null\r\n        }\r\n\r\n        if (rangetxt.indexOf(\":\") == -1) {\r\n            let row = parseInt(rangetxt.replace(/[^0-9]/g, \"\")) - 1;\r\n            let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, \"\"));\r\n\r\n            if (!isNaN(row) && !isNaN(col)) {\r\n                let item = {\r\n                    row: [row, row],\r\n                    column: [col, col],\r\n                    sheetIndex: sheetIndex,\r\n                };\r\n                this.addToCellIndexList(txt, item);\r\n                return item;\r\n            } else {\r\n                return null;\r\n            }\r\n        } else {\r\n            rangetxt = rangetxt.split(\":\");\r\n            let row = [],\r\n                col = [];\r\n            row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, \"\")) - 1;\r\n            row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, \"\")) - 1;\r\n            if (isNaN(row[0])) {\r\n                row[0] = 0;\r\n            }\r\n            if (isNaN(row[1])) {\r\n                row[1] = sheetdata.length - 1;\r\n            }\r\n            if (row[0] > row[1]) {\r\n                return null;\r\n            }\r\n            col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, \"\"));\r\n            col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, \"\"));\r\n            if (isNaN(col[0])) {\r\n                col[0] = 0;\r\n            }\r\n            if (isNaN(col[1])) {\r\n                col[1] = sheetdata[0].length - 1;\r\n            }\r\n            if (col[0] > col[1]) {\r\n                return null;\r\n            }\r\n\r\n            let item = {\r\n                row: row,\r\n                column: col,\r\n                sheetIndex: sheetIndex,\r\n            };\r\n            this.addToCellIndexList(txt, item);\r\n            return item;\r\n        }\r\n    },\r\n    rangeHightlightHTML:\r\n        '<div id=\"luckysheet-formula-functionrange-highlight-${id}\" rangeindex=\"${id}\"  class=\"luckysheet-selection-highlight luckysheet-formula-functionrange-highlight\"><div data-type=\"top\" class=\"luckysheet-selection-copy-top luckysheet-copy\"></div><div data-type=\"right\" class=\"luckysheet-selection-copy-right luckysheet-copy\"></div><div data-type=\"bottom\" class=\"luckysheet-selection-copy-bottom luckysheet-copy\"></div><div data-type=\"left\" class=\"luckysheet-selection-copy-left luckysheet-copy\"></div><div class=\"luckysheet-selection-copy-hc\"></div><div data-type=\"lt\" class=\"luckysheet-selection-highlight-topleft luckysheet-highlight\"></div><div data-type=\"rt\" class=\"luckysheet-selection-highlight-topright luckysheet-highlight\"></div><div data-type=\"lb\" class=\"luckysheet-selection-highlight-bottomleft luckysheet-highlight\"></div><div data-type=\"rb\" class=\"luckysheet-selection-highlight-bottomright luckysheet-highlight\"></div></div>',\r\n    createRangeHightlight: function() {\r\n        let _this = this;\r\n\r\n        let $span = $(\"#luckysheet-rich-text-editor\").find(\"span.luckysheet-formula-functionrange-cell\");\r\n        $(\"#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight\").remove();\r\n\r\n        $span.each(function() {\r\n            let rangeindex = $(this).attr(\"rangeindex\"),\r\n                range = $(this).text();\r\n\r\n            $(\"#luckysheet-formula-functionrange\").append(\r\n                replaceHtml(_this.rangeHightlightHTML, {\r\n                    id: rangeindex,\r\n                }),\r\n            );\r\n\r\n            let cellrange = _this.getcellrange(range);\r\n            let rangeid = \"luckysheet-formula-functionrange-highlight-\" + rangeindex;\r\n\r\n            if (cellrange == null) {\r\n            } else if (\r\n                cellrange.sheetIndex == Store.currentSheetIndex ||\r\n                (cellrange.sheetIndex == -1 && _this.rangetosheet == Store.currentSheetIndex)\r\n            ) {\r\n                $(\"#\" + rangeid)\r\n                    .data(\"range\", cellrange)\r\n                    .find(\".luckysheet-copy\")\r\n                    .css({ background: luckyColor[rangeindex] })\r\n                    .end()\r\n                    .find(\".luckysheet-highlight\")\r\n                    .css({ background: luckyColor[rangeindex] })\r\n                    .end()\r\n                    .find(\".luckysheet-selection-copy-hc\")\r\n                    .css({ background: luckyColor[rangeindex] });\r\n\r\n                seletedHighlistByindex(\r\n                    rangeid,\r\n                    cellrange.row[0],\r\n                    cellrange.row[1],\r\n                    cellrange.column[0],\r\n                    cellrange.column[1],\r\n                );\r\n            }\r\n        });\r\n\r\n        $(\"#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight\").show();\r\n    },\r\n    searchHTML: '<div id=\"luckysheet-formula-search-c\" class=\"luckysheet-formula-search-c\"></div>',\r\n    helpHTML:\r\n        '<div id=\"luckysheet-formula-help-c\" class=\"luckysheet-formula-help-c\"> <div class=\"luckysheet-formula-help-close\" title=\"${helpClose}\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></div> <div class=\"luckysheet-formula-help-collapse\" title=\"${helpCollapse}\"><i class=\"fa fa-angle-up\" aria-hidden=\"true\"></i></div> <div class=\"luckysheet-formula-help-title\"><div class=\"luckysheet-formula-help-title-formula\"> <span class=\"luckysheet-arguments-help-function-name\">SUM</span> <span class=\"luckysheet-arguments-paren\">(</span> <span class=\"luckysheet-arguments-parameter-holder\"> <span class=\"luckysheet-arguments-help-parameter luckysheet-arguments-help-parameter-active\" dir=\"auto\">A2:A100</span>, <span class=\"luckysheet-arguments-help-parameter\" dir=\"auto\">101</span> </span> <span class=\"luckysheet-arguments-paren\">)</span> </div></div> <div class=\"luckysheet-formula-help-content\"> <div class=\"luckysheet-formula-help-content-example\"> <div class=\"luckysheet-arguments-help-section-title\">${helpExample}</div> <div class=\"luckysheet-arguments-help-formula\"> <span class=\"luckysheet-arguments-help-function-name\">SUM</span> <span class=\"luckysheet-arguments-paren\">(</span> <span class=\"luckysheet-arguments-parameter-holder\"> <span class=\"luckysheet-arguments-help-parameter luckysheet-arguments-help-parameter-active\" dir=\"auto\">A2:A100</span>, <span class=\"luckysheet-arguments-help-parameter\" dir=\"auto\">101</span> </span> <span class=\"luckysheet-arguments-paren\">)</span> </div> </div> <div class=\"luckysheet-formula-help-content-detail\"> <div class=\"luckysheet-arguments-help-section\"> <div class=\"luckysheet-arguments-help-section-title luckysheet-arguments-help-parameter-name\">${helpAbstract}</div> <span class=\"luckysheet-arguments-help-parameter-content\">${helpAbstract}</span> </div> </div> <div class=\"luckysheet-formula-help-content-param\"> ${param} </div> </div> <div class=\"luckysheet-formula-help-foot\"></div></div>',\r\n    getrangeseleciton: function() {\r\n        let currSelection = window.getSelection();\r\n        let anchor = $(currSelection.anchorNode);\r\n        let anchorOffset = currSelection.anchorOffset;\r\n\r\n        if (anchor.parent().is(\"span\") && anchorOffset != 0) {\r\n            let txt = $.trim(anchor.text()),\r\n                lasttxt = \"\";\r\n\r\n            if (txt.length == 0 && anchor.parent().prev().length > 0) {\r\n                let ahr = anchor.parent().prev();\r\n                txt = $.trim(ahr.text());\r\n                lasttxt = txt.substr(txt.length - 1, 1);\r\n                return ahr;\r\n            } else {\r\n                lasttxt = txt.substr(anchorOffset - 1, 1);\r\n                return anchor.parent();\r\n            }\r\n        } else if (anchor.is(\"#luckysheet-rich-text-editor\") || anchor.is(\"#luckysheet-functionbox-cell\")) {\r\n            let txt = $.trim(\r\n                anchor\r\n                    .find(\"span\")\r\n                    .last()\r\n                    .text(),\r\n            );\r\n\r\n            if (txt.length == 0 && anchor.find(\"span\").length > 1) {\r\n                let ahr = anchor.find(\"span\");\r\n                txt = $.trim(ahr.eq(ahr.length - 2).text());\r\n                return ahr;\r\n            } else {\r\n                return anchor.find(\"span\").last();\r\n            }\r\n        } else if (\r\n            anchor.parent().is(\"#luckysheet-rich-text-editor\") ||\r\n            anchor.parent().is(\"#luckysheet-functionbox-cell\") ||\r\n            anchorOffset == 0\r\n        ) {\r\n            if (anchorOffset == 0) {\r\n                anchor = anchor.parent();\r\n            }\r\n\r\n            if (anchor.prev().length > 0) {\r\n                let txt = $.trim(anchor.prev().text());\r\n                let lasttxt = txt.substr(txt.length - 1, 1);\r\n                return anchor.prev();\r\n            }\r\n        }\r\n\r\n        return null;\r\n    },\r\n    searchFunctionPosition: function($menu, $editor, x, y, isparam) {\r\n        let winH = $(window).height(),\r\n            winW = $(window).width();\r\n        let menuW = $menu.outerWidth(),\r\n            menuH = $menu.outerHeight();\r\n\r\n        if (isparam == null) {\r\n            isparam = false;\r\n        }\r\n\r\n        let left = x;\r\n        if (x + menuW > winW) {\r\n            left = x - menuW + $editor.outerWidth();\r\n        } else {\r\n            left = x;\r\n        }\r\n\r\n        let top = y;\r\n        if (y + menuH > winH) {\r\n            top = y - menuH;\r\n        } else {\r\n            top = y + $editor.outerHeight();\r\n            if (!isparam) {\r\n                $menu.html(\r\n                    $menu\r\n                        .find(\".luckysheet-formula-search-item\")\r\n                        .get()\r\n                        .reverse(),\r\n                );\r\n            }\r\n        }\r\n\r\n        if (top < 0) {\r\n            top = 0;\r\n        }\r\n        if (left < 0) {\r\n            left = 0;\r\n        }\r\n\r\n        $menu\r\n            .css({\r\n                top: top,\r\n                left: left,\r\n            })\r\n            .show();\r\n    },\r\n    searchFunctionCell: null,\r\n    searchFunction: function($editer) {\r\n        let _this = this;\r\n        let functionlist = Store.functionlist;\r\n\r\n        let $cell = _this.getrangeseleciton();\r\n        _this.searchFunctionCell = $cell;\r\n\r\n        if ($cell == null || $editer == null) {\r\n            return;\r\n        }\r\n        let inputContent = $editer.text();\r\n        let searchtxt = $cell.text().toUpperCase();\r\n        let reg = /^[a-zA-Z]|[a-zA-Z_]+$/;\r\n\r\n        if (!reg.test(searchtxt) || inputContent.substr(0, 1) != \"=\") {\r\n            return;\r\n        }\r\n\r\n        let result = {\r\n                f: [],\r\n                s: [],\r\n                t: [],\r\n            },\r\n            result_i = 0;\r\n\r\n        for (let i = 0; i < functionlist.length; i++) {\r\n            let item = functionlist[i],\r\n                n = item.n;\r\n\r\n            if (n == searchtxt) {\r\n                result.f.unshift(item);\r\n                result_i++;\r\n            } else if (n.substr(0, searchtxt.length) == searchtxt) {\r\n                result.s.unshift(item);\r\n                result_i++;\r\n            } else if (n.indexOf(searchtxt) > -1) {\r\n                result.t.unshift(item);\r\n                result_i++;\r\n            }\r\n\r\n            if (result_i >= 10) {\r\n                break;\r\n            }\r\n        }\r\n\r\n        let list = result.t.concat(result.s.concat(result.f));\r\n        if (list.length <= 0) {\r\n            return;\r\n        }\r\n\r\n        let listHTML = _this.searchFunctionHTML(list);\r\n        $(\"#luckysheet-formula-search-c\")\r\n            .html(listHTML)\r\n            .show();\r\n        $(\"#luckysheet-formula-help-c\").hide();\r\n\r\n        let $c = $editer.parent(),\r\n            offset = $c.offset();\r\n        _this.searchFunctionPosition($(\"#luckysheet-formula-search-c\"), $c, offset.left, offset.top);\r\n    },\r\n    searchFunctionEnter: function($obj) {\r\n        let _this = this;\r\n\r\n        let functxt = $obj.data(\"func\");\r\n        _this.searchFunctionCell.text(functxt).after('<span dir=\"auto\" class=\"luckysheet-formula-text-color\">(</span>');\r\n        _this.setCaretPosition(_this.searchFunctionCell.next().get(0), 0, 1);\r\n        $(\"#luckysheet-formula-search-c\").hide();\r\n        _this.helpFunctionExe(_this.searchFunctionCell.closest(\"div\"), _this.searchFunctionCell.next());\r\n    },\r\n    searchFunctionHTML: function(list) {\r\n        let _this = this;\r\n\r\n        if ($(\"#luckysheet-formula-search-c\").length == 0) {\r\n            $(\"body\").append(_this.searchHTML);\r\n            $(\"#luckysheet-formula-search-c\")\r\n                .on(\"mouseover\", \".luckysheet-formula-search-item\", function() {\r\n                    $(\"#luckysheet-formula-search-c\")\r\n                        .find(\".luckysheet-formula-search-item\")\r\n                        .removeClass(\"luckysheet-formula-search-item-active\");\r\n                    $(this).addClass(\"luckysheet-formula-search-item-active\");\r\n                })\r\n                .on(\"mouseout\", \".luckysheet-formula-search-item\", function() {})\r\n                .on(\"click\", \".luckysheet-formula-search-item\", function() {\r\n                    if (_this.searchFunctionCell == null) {\r\n                        return;\r\n                    }\r\n                    _this.searchFunctionEnter($(this));\r\n                });\r\n        }\r\n\r\n        let itemHTML =\r\n            '<div data-func=\"${n}\" class=\"luckysheet-formula-search-item ${class}\"><div class=\"luckysheet-formula-search-func\">${n}</div><div class=\"luckysheet-formula-search-detail\">${a}</div></div>';\r\n        let retHTML = \"\";\r\n\r\n        for (let i = 0; i < list.length; i++) {\r\n            let item = list[i];\r\n\r\n            if (i == list.length - 1) {\r\n                retHTML += replaceHtml(itemHTML, {\r\n                    class: \"luckysheet-formula-search-item-active\",\r\n                    n: item.n,\r\n                    a: item.a,\r\n                });\r\n            } else {\r\n                retHTML += replaceHtml(itemHTML, {\r\n                    class: \"\",\r\n                    n: item.n,\r\n                    a: item.a,\r\n                });\r\n            }\r\n        }\r\n\r\n        return retHTML;\r\n    },\r\n    functionlistPosition: {},\r\n    helpFunction: function($editer, funcname, paramIndex) {\r\n        let _this = this;\r\n        let functionlist = Store.functionlist;\r\n\r\n        let $func = functionlist[_this.functionlistPosition[$.trim(funcname).toUpperCase()]];\r\n        if ($func == null) {\r\n            return;\r\n        }\r\n\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n\r\n        $(\"#luckysheet-formula-help-c .luckysheet-arguments-help-function-name\").html($func.n);\r\n        $(\"#luckysheet-formula-help-c .luckysheet-arguments-help-parameter-content\").html($func.d);\r\n\r\n        let helpformula =\r\n            '<span class=\"luckysheet-arguments-help-function-name\">${name}</span> <span class=\"luckysheet-arguments-paren\">(</span> <span class=\"luckysheet-arguments-parameter-holder\"> ${param} </span> <span class=\"luckysheet-arguments-paren\">)</span>';\r\n        let helpformulaItem = '<span class=\"luckysheet-arguments-help-parameter\" dir=\"auto\">${param}</span>';\r\n        let helpformulaArg =\r\n            '<div class=\"luckysheet-arguments-help-section\"><div class=\"luckysheet-arguments-help-section-title\">${param}</div><span class=\"luckysheet-arguments-help-parameter-content\">${content}</span></div>';\r\n\r\n        //\"n\": \"AVERAGE\",\r\n        //\"t\": \"1\",\r\n        //\"d\": \"返回数据集的算术平均值，对文本忽略不计。\",\r\n        //\"a\": \"返回数据集的算术平均值\",\r\n        //\"p\": [{ \"name\": \"数值1\", \"example\": \"A2:A100\", \"detail\": \"计算平均值时用到的第一个数值或范围。\", \"require\": \"m\", \"repeat\": \"n\", \"type\": \"rangenumber\" },\r\n        //    { \"name\": \"数值2\", \"example\": \"B2:B100\", \"detail\": \"计算平均值时用到的其他数值或范围。\", \"require\": \"o\", \"repeat\": \"y\", \"type\": \"rangenumber\" }\r\n        //]\r\n        let fht = \"\",\r\n            ahf = \"\",\r\n            fhcp = \"\";\r\n\r\n        for (let i = 0; i < $func.p.length; i++) {\r\n            let paramitem = $func.p[i];\r\n            let name = paramitem.name,\r\n                nameli = paramitem.name;\r\n\r\n            if (paramitem.repeat == \"y\") {\r\n                name += \", ...\";\r\n                nameli +=\r\n                    '<span class=\"luckysheet-arguments-help-argument-info\">...-' +\r\n                    locale_formulaMore.allowRepeatText +\r\n                    \"</span>\";\r\n            }\r\n            if (paramitem.require == \"o\") {\r\n                name = \"[\" + name + \"]\";\r\n                nameli +=\r\n                    '<span class=\"luckysheet-arguments-help-argument-info\">-[' +\r\n                    locale_formulaMore.allowOptionText +\r\n                    \"]</span>\";\r\n            }\r\n\r\n            fht += '<span class=\"luckysheet-arguments-help-parameter\" dir=\"auto\">' + name + \"</span>, \";\r\n            ahf += '<span class=\"luckysheet-arguments-help-parameter\" dir=\"auto\">' + paramitem.example + \"</span>, \";\r\n            fhcp += replaceHtml(helpformulaArg, {\r\n                param: nameli,\r\n                content: paramitem.detail,\r\n            });\r\n        }\r\n\r\n        fht = fht.substr(0, fht.length - 2);\r\n        ahf = ahf.substr(0, ahf.length - 2);\r\n\r\n        $(\"#luckysheet-formula-help-c .luckysheet-formula-help-title .luckysheet-arguments-parameter-holder\").html(fht); //介绍\r\n        $(\"#luckysheet-formula-help-c .luckysheet-arguments-help-formula .luckysheet-arguments-parameter-holder\").html(\r\n            ahf,\r\n        ); //示例\r\n        $(\"#luckysheet-formula-help-c .luckysheet-formula-help-content-param\").html(fhcp); //参数\r\n\r\n        if (paramIndex == null) {\r\n            $(\r\n                \"#luckysheet-formula-help-c .luckysheet-formula-help-title-formula .luckysheet-arguments-help-function-name\",\r\n            ).css(\"font-weight\", \"bold\");\r\n        } else {\r\n            $(\r\n                \"#luckysheet-formula-help-c .luckysheet-formula-help-title-formula .luckysheet-arguments-help-function-name\",\r\n            ).css(\"font-weight\", \"normal\");\r\n            let index = paramIndex >= $func.p.length ? $func.p.length - 1 : paramIndex;\r\n            $(\r\n                \"#luckysheet-formula-help-c .luckysheet-formula-help-title .luckysheet-arguments-parameter-holder .luckysheet-arguments-help-parameter\",\r\n            ).removeClass(\"luckysheet-arguments-help-parameter-active\");\r\n            $(\r\n                \"#luckysheet-formula-help-c .luckysheet-formula-help-title .luckysheet-arguments-parameter-holder .luckysheet-arguments-help-parameter\",\r\n            )\r\n                .eq(index)\r\n                .addClass(\"luckysheet-arguments-help-parameter-active\");\r\n            $(\r\n                \"#luckysheet-formula-help-c .luckysheet-arguments-help-formula .luckysheet-arguments-parameter-holder .luckysheet-arguments-help-parameter\",\r\n            ).removeClass(\"luckysheet-arguments-help-parameter-active\");\r\n            $(\r\n                \"#luckysheet-formula-help-c .luckysheet-arguments-help-formula .luckysheet-arguments-parameter-holder .luckysheet-arguments-help-parameter\",\r\n            )\r\n                .eq(index)\r\n                .addClass(\"luckysheet-arguments-help-parameter-active\");\r\n            $(\r\n                \"#luckysheet-formula-help-c .luckysheet-formula-help-content-param .luckysheet-arguments-help-section\",\r\n            ).removeClass(\"luckysheet-arguments-help-parameter-active\");\r\n            $(\"#luckysheet-formula-help-c .luckysheet-formula-help-content-param .luckysheet-arguments-help-section\")\r\n                .eq(index)\r\n                .addClass(\"luckysheet-arguments-help-parameter-active\");\r\n        }\r\n\r\n        let $c = $editer.parent(),\r\n            offset = $c.offset();\r\n        _this.searchFunctionPosition($(\"#luckysheet-formula-help-c\"), $c, offset.left, offset.top, true);\r\n    },\r\n    helpFunctionExe: function($editer, currSelection) {\r\n        let _this = this;\r\n        let functionlist = Store.functionlist;\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n        if ($(\"#luckysheet-formula-help-c\").length == 0) {\r\n            $(\"body\").after(\r\n                replaceHtml(_this.helpHTML, {\r\n                    helpClose: locale_formulaMore.helpClose,\r\n                    helpCollapse: locale_formulaMore.helpCollapse,\r\n                    helpExample: locale_formulaMore.helpExample,\r\n                    helpAbstract: locale_formulaMore.helpAbstract,\r\n                }),\r\n            );\r\n            $(\"#luckysheet-formula-help-c .luckysheet-formula-help-close\").click(function() {\r\n                $(\"#luckysheet-formula-help-c\").hide();\r\n            });\r\n            $(\"#luckysheet-formula-help-c .luckysheet-formula-help-collapse\").click(function() {\r\n                let $content = $(\"#luckysheet-formula-help-c .luckysheet-formula-help-content\");\r\n                $content.slideToggle(100, function() {\r\n                    let $c = _this.rangeResizeTo.parent(),\r\n                        offset = $c.offset();\r\n                    _this.searchFunctionPosition($(\"#luckysheet-formula-help-c\"), $c, offset.left, offset.top, true);\r\n                });\r\n\r\n                if ($content.is(\":hidden\")) {\r\n                    $(this).html('<i class=\"fa fa-angle-up\" aria-hidden=\"true\"></i>');\r\n                } else {\r\n                    $(this).html('<i class=\"fa fa-angle-down\" aria-hidden=\"true\"></i>');\r\n                }\r\n            });\r\n\r\n            for (let i = 0; i < functionlist.length; i++) {\r\n                _this.functionlistPosition[functionlist[i].n] = i;\r\n            }\r\n        }\r\n\r\n        if (!currSelection) {\r\n            return;\r\n        }\r\n\r\n        let $prev = currSelection,\r\n            funcLen = $editer.length,\r\n            $span = $editer.find(\"span\"),\r\n            currentIndex = currSelection.index(),\r\n            i = currentIndex;\r\n\r\n        if ($prev == null) {\r\n            return;\r\n        }\r\n\r\n        let funcName = null,\r\n            paramindex = null;\r\n\r\n        if ($span.eq(i).is(\".luckysheet-formula-text-func\")) {\r\n            funcName = $span.eq(i).text();\r\n        } else {\r\n            let $cur = null,\r\n                exceptIndex = [-1, -1];\r\n\r\n            while (--i > 0) {\r\n                $cur = $span.eq(i);\r\n\r\n                if (\r\n                    $cur.is(\".luckysheet-formula-text-func\") ||\r\n                    $.trim($cur.text()).toUpperCase() in _this.functionlistPosition\r\n                ) {\r\n                    funcName = $cur.text();\r\n                    paramindex = null;\r\n                    let endstate = true;\r\n\r\n                    for (let a = i; a <= currentIndex; a++) {\r\n                        if (!paramindex) {\r\n                            paramindex = 0;\r\n                        }\r\n\r\n                        if (a >= exceptIndex[0] && a <= exceptIndex[1]) {\r\n                            continue;\r\n                        }\r\n\r\n                        $cur = $span.eq(a);\r\n                        if ($cur.is(\".luckysheet-formula-text-rpar\")) {\r\n                            exceptIndex = [i, a];\r\n                            funcName = null;\r\n                            endstate = false;\r\n                            break;\r\n                        }\r\n\r\n                        if ($cur.is(\".luckysheet-formula-text-comma\")) {\r\n                            paramindex++;\r\n                        }\r\n                    }\r\n\r\n                    if (endstate) {\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        if (funcName == null) {\r\n            return;\r\n        }\r\n\r\n        _this.helpFunction($editer, funcName, paramindex);\r\n    },\r\n    rangeHightlightselected: function($editer, kcode) {\r\n        let _this = this;\r\n\r\n        let currSelection = _this.getrangeseleciton();\r\n        $(\"#luckysheet-formula-search-c, #luckysheet-formula-help-c\").hide();\r\n        $(\r\n            \"#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight .luckysheet-selection-copy-hc\",\r\n        ).css(\"opacity\", \"0.03\");\r\n        $(\"#luckysheet-formula-search-c, #luckysheet-formula-help-c\").hide();\r\n        _this.helpFunctionExe($editer, currSelection);\r\n\r\n        // console.log(currSelection, $(currSelection).closest(\".luckysheet-formula-functionrange-cell\").length);\r\n        if ($(currSelection).closest(\".luckysheet-formula-functionrange-cell\").length == 0) {\r\n            _this.searchFunction($editer);\r\n            return;\r\n        }\r\n\r\n        let $anchorOffset = $(currSelection).closest(\".luckysheet-formula-functionrange-cell\");\r\n        let rangeindex = $anchorOffset.attr(\"rangeindex\");\r\n        let rangeid = \"luckysheet-formula-functionrange-highlight-\" + rangeindex;\r\n\r\n        $(\"#\" + rangeid)\r\n            .find(\".luckysheet-selection-copy-hc\")\r\n            .css({\r\n                opacity: \"0.13\",\r\n            });\r\n    },\r\n    updatecell: function(r, c, value, isRefresh = true) {\r\n        let _this = this;\r\n\r\n        let $input = $(\"#luckysheet-rich-text-editor\");\r\n        let inputText = $input.text(),\r\n            inputHtml = $input.html();\r\n\r\n        if (_this.rangetosheet != null && _this.rangetosheet != Store.currentSheetIndex) {\r\n            sheetmanage.changeSheetExec(_this.rangetosheet);\r\n        }\r\n\r\n        if (!checkProtectionLocked(r, c, Store.currentSheetIndex)) {\r\n            return;\r\n        }\r\n\r\n        //数据验证 输入数据无效时禁止输入\r\n        if (dataVerificationCtrl.dataVerification != null) {\r\n            let dvItem = dataVerificationCtrl.dataVerification[r + \"_\" + c];\r\n\r\n            if (dvItem != null && dvItem.prohibitInput && !dataVerificationCtrl.validateCellData(inputText, dvItem)) {\r\n                let failureText = dataVerificationCtrl.getFailureText(dvItem);\r\n                tooltip.info(failureText, \"\");\r\n                _this.cancelNormalSelected();\r\n                return;\r\n            }\r\n        }\r\n\r\n        let curv = Store.flowdata[r][c];\r\n\r\n        // Store old value for hook function\r\n        const oldValue = JSON.stringify(curv);\r\n\r\n        let isPrevInline = isInlineStringCell(curv);\r\n        let isCurInline = inputText.slice(0, 1) != \"=\" && inputHtml.substr(0, 5) == \"<span\";\r\n\r\n        let isCopyVal = false;\r\n        if (!isCurInline && inputText && inputText.length > 0) {\r\n            let splitArr = inputText\r\n                .replace(/\\r\\n/g, \"_x000D_\")\r\n                .replace(/&#13;&#10;/g, \"_x000D_\")\r\n                .replace(/\\r/g, \"_x000D_\")\r\n                .replace(/\\n/g, \"_x000D_\")\r\n                .split(\"_x000D_\");\r\n            if (splitArr.length > 1) {\r\n                isCopyVal = true;\r\n                isCurInline = true;\r\n                inputText = splitArr.join(\"\\r\\n\");\r\n            }\r\n        }\r\n\r\n        if (!value && !isCurInline && isPrevInline) {\r\n            delete curv.ct.s;\r\n            curv.ct.t = \"g\";\r\n            curv.ct.fa = \"General\";\r\n            value = \"\";\r\n        } else if (isCurInline) {\r\n            if (getObjType(curv) != \"object\") {\r\n                curv = {};\r\n            }\r\n            delete curv.f;\r\n            delete curv.v;\r\n            delete curv.m;\r\n\r\n            if (curv.ct == null) {\r\n                curv.ct = {};\r\n                curv.ct.fa = \"General\";\r\n            }\r\n\r\n            curv.ct.t = \"inlineStr\";\r\n            curv.ct.s = convertSpanToShareString($input.find(\"span\"));\r\n            if (isCopyVal) {\r\n                curv.ct.s = [\r\n                    {\r\n                        v: inputText,\r\n                    },\r\n                ];\r\n            }\r\n        }\r\n\r\n        // API, we get value from user\r\n        value = value || $input.text();\r\n\r\n        // Hook function\r\n        if (!method.createHookFunction(\"cellUpdateBefore\", r, c, value, isRefresh)) {\r\n            _this.cancelNormalSelected();\r\n            return;\r\n        }\r\n\r\n        if (!isCurInline) {\r\n            if (isRealNull(value) && !isPrevInline) {\r\n                if (curv == null || (isRealNull(curv.v) && curv.spl == null && curv.f == null)) {\r\n                    _this.cancelNormalSelected();\r\n                    return;\r\n                }\r\n            } else if (curv != null && curv.qp != 1) {\r\n                if (getObjType(curv) == \"object\" && (value == curv.f || value == curv.v || value == curv.m)) {\r\n                    _this.cancelNormalSelected();\r\n                    return;\r\n                } else if (value == curv) {\r\n                    _this.cancelNormalSelected();\r\n                    return;\r\n                }\r\n            }\r\n\r\n            if (getObjType(value) == \"string\" && value.slice(0, 1) == \"=\" && value.length > 1) {\r\n            } else if (\r\n                getObjType(curv) == \"object\" &&\r\n                curv.ct != null &&\r\n                curv.ct.fa != null &&\r\n                curv.ct.fa != \"@\" &&\r\n                !isRealNull(value)\r\n            ) {\r\n                delete curv.m; //更新时间m处理 ， 会实际删除单元格数据的参数（flowdata时已删除）\r\n                if (curv.f != null) {\r\n                    //如果原来是公式，而更新的数据不是公式，则把公式删除\r\n                    delete curv.f;\r\n                    delete curv.spl; //删除单元格的sparklines的配置串\r\n                }\r\n            }\r\n        }\r\n\r\n        window.luckysheet_getcelldata_cache = null;\r\n\r\n        let isRunExecFunction = true;\r\n\r\n        let d = editor.deepCopyFlowData(Store.flowdata);\r\n        let dynamicArrayItem = null; //动态数组\r\n\r\n        if (getObjType(curv) == \"object\") {\r\n            if (!isCurInline) {\r\n                if (getObjType(value) == \"string\" && value.slice(0, 1) == \"=\" && value.length > 1) {\r\n                    let v = _this.execfunction(value, r, c, undefined, true);\r\n                    isRunExecFunction = false;\r\n                    curv = $.extend(true, {}, d[r][c]);\r\n                    curv.v = v[1];\r\n                    curv.f = v[2];\r\n\r\n                    //打进单元格的sparklines的配置串， 报错需要单独处理。\r\n                    if (v.length == 4 && v[3].type == \"sparklines\") {\r\n                        delete curv.m;\r\n                        delete curv.v;\r\n\r\n                        let curCalv = v[3].data;\r\n\r\n                        if (getObjType(curCalv) == \"array\" && getObjType(curCalv[0]) != \"object\") {\r\n                            curv.v = curCalv[0];\r\n                        } else {\r\n                            curv.spl = v[3].data;\r\n                        }\r\n                    } else if (v.length == 4 && v[3].type == \"dynamicArrayItem\") {\r\n                        dynamicArrayItem = v[3].data;\r\n                    }\r\n                }\r\n                // from API setCellValue,luckysheet.setCellValue(0, 0, {f: \"=sum(D1)\", bg:\"#0188fb\"}),value is an object, so get attribute f as value\r\n                else if (getObjType(value) == \"object\") {\r\n                    let valueFunction = value.f;\r\n\r\n                    if (\r\n                        getObjType(valueFunction) == \"string\" &&\r\n                        valueFunction.slice(0, 1) == \"=\" &&\r\n                        valueFunction.length > 1\r\n                    ) {\r\n                        let v = _this.execfunction(valueFunction, r, c, undefined, true);\r\n                        isRunExecFunction = false;\r\n                        // get v/m/ct\r\n\r\n                        curv = $.extend(true, {}, d[r][c]);\r\n                        curv.v = v[1];\r\n                        curv.f = v[2];\r\n\r\n                        //打进单元格的sparklines的配置串， 报错需要单独处理。\r\n                        if (v.length == 4 && v[3].type == \"sparklines\") {\r\n                            delete curv.m;\r\n                            delete curv.v;\r\n\r\n                            let curCalv = v[3].data;\r\n\r\n                            if (getObjType(curCalv) == \"array\" && getObjType(curCalv[0]) != \"object\") {\r\n                                curv.v = curCalv[0];\r\n                            } else {\r\n                                curv.spl = v[3].data;\r\n                            }\r\n                        } else if (v.length == 4 && v[3].type == \"dynamicArrayItem\") {\r\n                            dynamicArrayItem = v[3].data;\r\n                        }\r\n                    }\r\n                    // from API setCellValue,luckysheet.setCellValue(0, 0, {f: \"=sum(D1)\", bg:\"#0188fb\"}),value is an object, so get attribute f as value\r\n                    else {\r\n                        for (let attr in value) {\r\n                            curv[attr] = value[attr];\r\n                        }\r\n                        // let valueFunction = value.f;\r\n\r\n                        // if(getObjType(valueFunction) == \"string\" && valueFunction.slice(0, 1) == \"=\" && valueFunction.length > 1){\r\n                        //     let v = _this.execfunction(valueFunction, r, c, undefined, true);\r\n                        //     isRunExecFunction = false;\r\n                        //     // get v/m/ct\r\n                        //     curv = d[r][c];\r\n                        //     curv.v = v[1];\r\n                        //     // get f\r\n                        //     curv.f = v[2];\r\n\r\n                        //     // get other cell style attribute\r\n                        //     delete value.v;\r\n                        //     delete value.m;\r\n                        //     delete value.f;\r\n                        //     Object.assign(curv,value);\r\n\r\n                        //     //打进单元格的sparklines的配置串， 报错需要单独处理。\r\n                        //     if(v.length == 4 && v[3].type == \"sparklines\"){\r\n                        //         delete curv.m;\r\n                        //         delete curv.v;\r\n\r\n                        //         let curCalv = v[3].data;\r\n\r\n                        //         if(getObjType(curCalv) == \"array\" && getObjType(curCalv[0]) != \"object\"){\r\n                        //             curv.v = curCalv[0];\r\n                        //         }\r\n                        //         else{\r\n                        //             curv.spl = v[3].data;\r\n                        //         }\r\n                        //     }\r\n                        // }\r\n                    }\r\n                } else {\r\n                    _this.delFunctionGroup(r, c);\r\n                    _this.execFunctionGroup(r, c, value);\r\n                    isRunExecFunction = false;\r\n\r\n                    curv = $.extend(true, {}, d[r][c]);\r\n                    // let gd = _this.execFunctionGlobalData[r+\"_\"+c+\"_\"+Store.currentSheetIndex];\r\n                    // if(gd!=null){\r\n                    //     curv.v = gd.v;\r\n                    // }\r\n                    curv.v = value;\r\n\r\n                    delete curv.f;\r\n                    delete curv.spl;\r\n\r\n                    if (curv.qp == 1 && (\"\" + value).substr(0, 1) != \"'\") {\r\n                        //if quotePrefix is 1, cell is force string, cell clear quotePrefix when it is updated\r\n                        curv.qp = 0;\r\n                        if (curv.ct != null) {\r\n                            curv.ct.fa = \"General\";\r\n                            curv.ct.t = \"n\";\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            value = curv;\r\n        } else {\r\n            if (getObjType(value) == \"string\" && value.slice(0, 1) == \"=\" && value.length > 1) {\r\n                let v = _this.execfunction(value, r, c, undefined, true);\r\n                isRunExecFunction = false;\r\n                value = {\r\n                    v: v[1],\r\n                    f: v[2],\r\n                };\r\n\r\n                //打进单元格的sparklines的配置串， 报错需要单独处理。\r\n                if (v.length == 4 && v[3].type == \"sparklines\") {\r\n                    let curCalv = v[3].data;\r\n\r\n                    if (getObjType(curCalv) == \"array\" && getObjType(curCalv[0]) != \"object\") {\r\n                        value.v = curCalv[0];\r\n                    } else {\r\n                        value.spl = v[3].data;\r\n                    }\r\n                } else if (v.length == 4 && v[3].type == \"dynamicArrayItem\") {\r\n                    dynamicArrayItem = v[3].data;\r\n                }\r\n            }\r\n            // from API setCellValue,luckysheet.setCellValue(0, 0, {f: \"=sum(D1)\", bg:\"#0188fb\"}),value is an object, so get attribute f as value\r\n            else if (getObjType(value) == \"object\") {\r\n                let valueFunction = value.f;\r\n\r\n                if (\r\n                    getObjType(valueFunction) == \"string\" &&\r\n                    valueFunction.slice(0, 1) == \"=\" &&\r\n                    valueFunction.length > 1\r\n                ) {\r\n                    let v = _this.execfunction(valueFunction, r, c, undefined, true);\r\n                    isRunExecFunction = false;\r\n                    // value = {\r\n                    //     \"v\": v[1],\r\n                    //     \"f\": v[2]\r\n                    // };\r\n\r\n                    // update attribute v\r\n                    value.v = v[1];\r\n                    value.f = v[2];\r\n\r\n                    //打进单元格的sparklines的配置串， 报错需要单独处理。\r\n                    if (v.length == 4 && v[3].type == \"sparklines\") {\r\n                        let curCalv = v[3].data;\r\n\r\n                        if (getObjType(curCalv) == \"array\" && getObjType(curCalv[0]) != \"object\") {\r\n                            value.v = curCalv[0];\r\n                        } else {\r\n                            value.spl = v[3].data;\r\n                        }\r\n                    } else if (v.length == 4 && v[3].type == \"dynamicArrayItem\") {\r\n                        dynamicArrayItem = v[3].data;\r\n                    }\r\n                } else {\r\n                    let v = curv;\r\n                    if (value.v == null) {\r\n                        value.v = v;\r\n                    }\r\n                }\r\n            } else {\r\n                _this.delFunctionGroup(r, c);\r\n                _this.execFunctionGroup(r, c, value);\r\n                isRunExecFunction = false;\r\n            }\r\n        }\r\n\r\n        // value maybe an object\r\n        setcellvalue(r, c, d, value);\r\n        _this.cancelNormalSelected();\r\n\r\n        let RowlChange = false;\r\n        let cfg = $.extend(true, {}, getluckysheetfile()[getSheetIndex(Store.currentSheetIndex)][\"config\"]);\r\n        if (cfg[\"rowlen\"] == null) {\r\n            cfg[\"rowlen\"] = {};\r\n        }\r\n\r\n        // 单元格行高自适应,只有在单元格不是合并单元格时才能生效\r\n        if (\r\n            (d[r][c].tb == \"2\" && d[r][c].v != null) ||\r\n            (isInlineStringCell(d[r][c]) && typeof d[r][c][\"mc\"] == \"undefined\")\r\n        ) {\r\n            //自动换行\r\n            let defaultrowlen = Store.defaultrowlen;\r\n\r\n            let canvas = $(\"#luckysheetTableContent\")\r\n                .get(0)\r\n                .getContext(\"2d\");\r\n            // offlinecanvas.textBaseline = 'top'; //textBaseline以top计算\r\n\r\n            // let fontset = luckysheetfontformat(d[r][c]);\r\n            // offlinecanvas.font = fontset;\r\n\r\n            if (cfg[\"customHeight\"] && cfg[\"customHeight\"][r] == 1) {\r\n            } else {\r\n                // let currentRowLen = defaultrowlen;\r\n                // if(cfg[\"rowlen\"][r] != null){\r\n                //     currentRowLen = cfg[\"rowlen\"][r];\r\n                // }\r\n\r\n                let cellWidth = colLocationByIndex(c)[1] - colLocationByIndex(c)[0] - 2;\r\n\r\n                let textInfo = getCellTextInfo(d[r][c], canvas, {\r\n                    r: r,\r\n                    c: c,\r\n                    cellWidth: cellWidth,\r\n                });\r\n\r\n                let currentRowLen = defaultrowlen;\r\n                // console.log(\"rowlen\", textInfo);\r\n                if (textInfo != null) {\r\n                    currentRowLen = textInfo.textHeightAll + 2;\r\n                }\r\n\r\n                // let strValue = getcellvalue(r, c, d).toString();\r\n                // let measureText = offlinecanvas.measureText(strValue);\r\n\r\n                // let textMetrics = measureText.width;\r\n                // let cellWidth = colLocationByIndex(c)[1] - colLocationByIndex(c)[0] - 4;\r\n                // let oneLineTextHeight = measureText.actualBoundingBoxDescent - measureText.actualBoundingBoxAscent;\r\n\r\n                // if(textMetrics > cellWidth){\r\n                //     let strArr = [];//文本截断数组\r\n                //     strArr = getCellTextSplitArr(strValue, strArr, cellWidth, offlinecanvas);\r\n\r\n                //     let computeRowlen = oneLineTextHeight * strArr.length + 4;\r\n                //     //比较计算高度和当前高度取最大高度\r\n                //     if(computeRowlen > currentRowLen){\r\n                //         currentRowLen = computeRowlen;\r\n                //     }\r\n                // }\r\n\r\n                if (currentRowLen > defaultrowlen) {\r\n                    cfg[\"rowlen\"][r] = currentRowLen;\r\n                    RowlChange = true;\r\n                }\r\n            }\r\n        }\r\n\r\n        //动态数组\r\n        let dynamicArray = null;\r\n        if (!!dynamicArrayItem) {\r\n            // let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n            dynamicArray = $.extend(true, [], this.insertUpdateDynamicArray(dynamicArrayItem));\r\n            // dynamicArray.push(dynamicArrayItem);\r\n        }\r\n\r\n        let allParam = {\r\n            dynamicArray: dynamicArray,\r\n        };\r\n\r\n        if (RowlChange) {\r\n            allParam = {\r\n                cfg: cfg,\r\n                dynamicArray: dynamicArray,\r\n                RowlChange: RowlChange,\r\n            };\r\n        }\r\n\r\n        setTimeout(() => {\r\n            // Hook function\r\n            method.createHookFunction(\"cellUpdated\", r, c, JSON.parse(oldValue), Store.flowdata[r][c], isRefresh);\r\n        }, 0);\r\n\r\n        if (isRefresh) {\r\n            jfrefreshgrid(d, [{ row: [r, r], column: [c, c] }], allParam, isRunExecFunction);\r\n            // Store.luckysheetCellUpdate.length = 0; //clear array\r\n            _this.execFunctionGlobalData = null; //销毁\r\n        } else {\r\n            return {\r\n                data: d,\r\n                allParam: allParam,\r\n            };\r\n        }\r\n    },\r\n    cancelNormalSelected: function() {\r\n        let _this = this;\r\n\r\n        _this.canceFunctionrangeSelected();\r\n\r\n        $(\"#luckysheet-formula-functionrange .luckysheet-formula-functionrange-highlight\").remove();\r\n        $(\"#luckysheet-input-box\").removeAttr(\"style\");\r\n        $(\"#luckysheet-input-box-index\").hide();\r\n        $(\"#luckysheet-wa-functionbox-cancel, #luckysheet-wa-functionbox-confirm\").removeClass(\r\n            \"luckysheet-wa-calculate-active\",\r\n        );\r\n\r\n        _this.rangestart = false;\r\n        _this.rangedrag_column_start = false;\r\n        _this.rangedrag_row_start = false;\r\n    },\r\n    canceFunctionrangeSelected: function() {\r\n        $(\"#luckysheet-formula-functionrange-select\").hide();\r\n        $(\"#luckysheet-row-count-show, #luckysheet-column-count-show\").hide();\r\n        // $(\"#luckysheet-cols-h-selected, #luckysheet-rows-h-selected\").hide();\r\n        $(\"#luckysheet-formula-search-c, #luckysheet-formula-help-c\").hide();\r\n    },\r\n    iscellformat: function(txt) {\r\n        let re_abc = /[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][123456789]/;\r\n    },\r\n    iscelldata: function(txt) {\r\n        //判断是否为单元格格式\r\n        let val = txt.split(\"!\"),\r\n            rangetxt;\r\n\r\n        if (val.length > 1) {\r\n            // Supports cross-table references\r\n            rangetxt = val[1];\r\n        } else {\r\n            rangetxt = val[0];\r\n        }\r\n\r\n        let reg_cell = /^(([a-zA-Z]+)|([$][a-zA-Z]+))(([0-9]+)|([$][0-9]+))$/g; //增加正则判断单元格为字母+数字的格式：如 A1:B3\r\n        let reg_cellRange = /^(((([a-zA-Z]+)|([$][a-zA-Z]+))(([0-9]+)|([$][0-9]+)))|((([a-zA-Z]+)|([$][a-zA-Z]+))))$/g; //增加正则判断单元格为字母+数字或字母的格式：如 A1:B3，A:A\r\n\r\n        if (rangetxt.indexOf(\":\") == -1) {\r\n            let row = parseInt(rangetxt.replace(/[^0-9]/g, \"\")) - 1;\r\n            let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, \"\"));\r\n\r\n            if (!isNaN(row) && !isNaN(col) && rangetxt.toString().match(reg_cell)) {\r\n                return true;\r\n            } else if (!isNaN(row)) {\r\n                return false;\r\n            } else if (!isNaN(col)) {\r\n                return false;\r\n            } else {\r\n                return false;\r\n            }\r\n        } else {\r\n            reg_cellRange = /^(((([a-zA-Z]+)|([$][a-zA-Z]+))(([0-9]+)|([$][0-9]+)))|((([a-zA-Z]+)|([$][a-zA-Z]+)))|((([0-9]+)|([$][0-9]+s))))$/g;\r\n\r\n            rangetxt = rangetxt.split(\":\");\r\n\r\n            let row = [],\r\n                col = [];\r\n            row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, \"\")) - 1;\r\n            row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, \"\")) - 1;\r\n            if (row[0] > row[1]) {\r\n                return false;\r\n            }\r\n\r\n            col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, \"\"));\r\n            col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, \"\"));\r\n            if (col[0] > col[1]) {\r\n                return false;\r\n            }\r\n\r\n            if (rangetxt[0].toString().match(reg_cellRange) && rangetxt[1].toString().match(reg_cellRange)) {\r\n                return true;\r\n            } else {\r\n                return false;\r\n            }\r\n        }\r\n    },\r\n    operator: \"==|!=|<>|<=|>=|=|+|-|>|<|/|*|%|&|^\",\r\n    operatorjson: null,\r\n    functionCopy: function(txt, mode, step) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (mode == null) {\r\n            mode = \"down\";\r\n        }\r\n\r\n        if (step == null) {\r\n            step = 1;\r\n        }\r\n\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\",\r\n            ispassby = true;\r\n\r\n        let matchConfig = {\r\n            bracket: 0,\r\n            comma: 0,\r\n            squote: 0,\r\n            dquote: 0,\r\n        };\r\n\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.dquote == 0) {\r\n                matchConfig.bracket += 1;\r\n\r\n                if (str.length > 0) {\r\n                    function_str += str + \"(\";\r\n                } else {\r\n                    function_str += \"(\";\r\n                }\r\n\r\n                str = \"\";\r\n            } else if (s == \")\" && matchConfig.dquote == 0) {\r\n                matchConfig.bracket -= 1;\r\n                function_str += _this.functionCopy(str, mode, step) + \")\";\r\n                str = \"\";\r\n            } else if (s == '\"' && matchConfig.squote == 0) {\r\n                if (matchConfig.dquote > 0) {\r\n                    function_str += str + '\"';\r\n                    matchConfig.dquote -= 1;\r\n                    str = \"\";\r\n                } else {\r\n                    matchConfig.dquote += 1;\r\n                    str += '\"';\r\n                }\r\n            } else if (s == \",\" && matchConfig.dquote == 0) {\r\n                function_str += _this.functionCopy(str, mode, step) + \",\";\r\n                str = \"\";\r\n            } else if (s == \"&\" && matchConfig.dquote == 0) {\r\n                if (str.length > 0) {\r\n                    function_str += _this.functionCopy(str, mode, step) + \"&\";\r\n                    str = \"\";\r\n                } else {\r\n                    function_str += \"&\";\r\n                }\r\n            } else if (s in _this.operatorjson && matchConfig.dquote == 0) {\r\n                let s_next = \"\";\r\n\r\n                if (i + 1 < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                let p = i - 1,\r\n                    s_pre = null;\r\n\r\n                if (p >= 0) {\r\n                    do {\r\n                        s_pre = funcstack[p--];\r\n                    } while (p >= 0 && s_pre == \" \");\r\n                }\r\n\r\n                if (s + s_next in _this.operatorjson) {\r\n                    if (str.length > 0) {\r\n                        function_str += _this.functionCopy(str, mode, step) + s + s_next;\r\n                        str = \"\";\r\n                    } else {\r\n                        function_str += s + s_next;\r\n                    }\r\n\r\n                    i++;\r\n                } else if (\r\n                    !/[^0-9]/.test(s_next) &&\r\n                    s == \"-\" &&\r\n                    (s_pre == \"(\" || s_pre == null || s_pre == \",\" || s_pre == \" \" || s_pre in _this.operatorjson)\r\n                ) {\r\n                    str += s;\r\n                } else {\r\n                    if (str.length > 0) {\r\n                        function_str += _this.functionCopy(str, mode, step) + s;\r\n                        str = \"\";\r\n                    } else {\r\n                        function_str += s;\r\n                    }\r\n                }\r\n            } else {\r\n                str += s;\r\n            }\r\n\r\n            if (i == funcstack.length - 1) {\r\n                if (_this.iscelldata($.trim(str))) {\r\n                    if (mode == \"down\") {\r\n                        function_str += _this.downparam($.trim(str), step);\r\n                    } else if (mode == \"up\") {\r\n                        function_str += _this.upparam($.trim(str), step);\r\n                    } else if (mode == \"left\") {\r\n                        function_str += _this.leftparam($.trim(str), step);\r\n                    } else if (mode == \"right\") {\r\n                        function_str += _this.rightparam($.trim(str), step);\r\n                    }\r\n                } else {\r\n                    function_str += $.trim(str);\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n\r\n        return function_str;\r\n    },\r\n    isfreezonFuc: function(txt) {\r\n        let row = txt.replace(/[^0-9]/g, \"\");\r\n        let col = txt.replace(/[^A-Za-z]/g, \"\");\r\n        let row$ = txt.substr(txt.indexOf(row) - 1, 1);\r\n        let col$ = txt.substr(txt.indexOf(col) - 1, 1);\r\n        let ret = [false, false];\r\n\r\n        if (row$ == \"$\") {\r\n            ret[0] = true;\r\n        }\r\n        if (col$ == \"$\") {\r\n            ret[1] = true;\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    setfreezonFuceExe: function(rangetxt) {\r\n        let row = parseInt(rangetxt.replace(/[^0-9]/g, \"\"));\r\n        let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, \"\"));\r\n        let $row = \"$\",\r\n            $col = \"$\";\r\n\r\n        if (!isNaN(row) && !isNaN(col)) {\r\n            return $col + chatatABC(col) + $row + row;\r\n        } else if (!isNaN(row)) {\r\n            return $row + row;\r\n        } else if (!isNaN(col)) {\r\n            return $col + chatatABC(col);\r\n        } else {\r\n            return rangetxt;\r\n        }\r\n    },\r\n    setfreezonFuc: function(event) {\r\n        let _this = this;\r\n\r\n        let obj = _this.getrangeseleciton();\r\n        if (!_this.iscelldata(obj.text())) {\r\n            return;\r\n        }\r\n\r\n        let txt = obj.text(),\r\n            pos = window.getSelection().anchorOffset;\r\n        let val = txt.split(\"!\"),\r\n            rangetxt,\r\n            prefix = \"\";\r\n\r\n        if (val.length > 1) {\r\n            rangetxt = val[1];\r\n            prefix = val[0] + \"!\";\r\n        } else {\r\n            rangetxt = val[0];\r\n        }\r\n\r\n        let newtxt = \"\",\r\n            newpos = \"\";\r\n        let rangetxtIndex = rangetxt.indexOf(\":\");\r\n\r\n        if (rangetxtIndex == -1) {\r\n            newtxt = prefix + _this.setfreezonFuceExe(rangetxt);\r\n            newpos = newtxt.length;\r\n        } else {\r\n            rangetxt = rangetxt.split(\":\");\r\n\r\n            if (pos > rangetxtIndex) {\r\n                let ret = prefix + rangetxt[0] + \":\" + _this.setfreezonFuceExe(rangetxt[1]);\r\n                newtxt = ret;\r\n                newpos = ret.length;\r\n            } else {\r\n                let firsttxt = prefix + _this.setfreezonFuceExe(rangetxt[0]);\r\n                let ret = firsttxt + \":\" + rangetxt[1];\r\n                newtxt = ret;\r\n                newpos = firsttxt.length;\r\n            }\r\n        }\r\n\r\n        obj.text(prefix + newtxt);\r\n        _this.setCaretPosition(obj.get(0), 0, newpos);\r\n    },\r\n    updateparam: function(orient, txt, step) {\r\n        let _this = this;\r\n\r\n        let val = txt.split(\"!\"),\r\n            rangetxt,\r\n            prefix = \"\";\r\n\r\n        if (val.length > 1) {\r\n            rangetxt = val[1];\r\n            prefix = val[0] + \"!\";\r\n        } else {\r\n            rangetxt = val[0];\r\n        }\r\n\r\n        if (rangetxt.indexOf(\":\") == -1) {\r\n            let row = parseInt(rangetxt.replace(/[^0-9]/g, \"\"));\r\n            let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, \"\"));\r\n            let freezonFuc = _this.isfreezonFuc(rangetxt);\r\n            let $row = freezonFuc[0] ? \"$\" : \"\",\r\n                $col = freezonFuc[1] ? \"$\" : \"\";\r\n\r\n            if (orient == \"u\" && !freezonFuc[0]) {\r\n                row -= step;\r\n            } else if (orient == \"r\" && !freezonFuc[1]) {\r\n                col += step;\r\n            } else if (orient == \"l\" && !freezonFuc[1]) {\r\n                col -= step;\r\n            } else if (orient == \"d\" && !freezonFuc[0]) {\r\n                row += step;\r\n            }\r\n\r\n            if (row < 0 || col < 0) {\r\n                return _this.error.r;\r\n            }\r\n\r\n            if (!isNaN(row) && !isNaN(col)) {\r\n                return prefix + $col + chatatABC(col) + $row + row;\r\n            } else if (!isNaN(row)) {\r\n                return prefix + $row + row;\r\n            } else if (!isNaN(col)) {\r\n                return prefix + $col + chatatABC(col);\r\n            } else {\r\n                return txt;\r\n            }\r\n        } else {\r\n            rangetxt = rangetxt.split(\":\");\r\n            let row = [],\r\n                col = [];\r\n\r\n            row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, \"\"));\r\n            row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, \"\"));\r\n            if (row[0] > row[1]) {\r\n                return txt;\r\n            }\r\n\r\n            col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, \"\"));\r\n            col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, \"\"));\r\n            if (col[0] > col[1]) {\r\n                return txt;\r\n            }\r\n\r\n            let freezonFuc0 = _this.isfreezonFuc(rangetxt[0]);\r\n            let freezonFuc1 = _this.isfreezonFuc(rangetxt[1]);\r\n            let $row0 = freezonFuc0[0] ? \"$\" : \"\",\r\n                $col0 = freezonFuc0[1] ? \"$\" : \"\";\r\n            let $row1 = freezonFuc1[0] ? \"$\" : \"\",\r\n                $col1 = freezonFuc1[1] ? \"$\" : \"\";\r\n\r\n            if (orient == \"u\") {\r\n                if (!freezonFuc0[0]) {\r\n                    row[0] -= step;\r\n                }\r\n\r\n                if (!freezonFuc1[0]) {\r\n                    row[1] -= step;\r\n                }\r\n            } else if (orient == \"r\") {\r\n                if (!freezonFuc0[1]) {\r\n                    col[0] += step;\r\n                }\r\n\r\n                if (!freezonFuc1[1]) {\r\n                    col[1] += step;\r\n                }\r\n            } else if (orient == \"l\") {\r\n                if (!freezonFuc0[1]) {\r\n                    col[0] -= step;\r\n                }\r\n\r\n                if (!freezonFuc1[1]) {\r\n                    col[1] -= step;\r\n                }\r\n            } else if (orient == \"d\") {\r\n                if (!freezonFuc0[0]) {\r\n                    row[0] += step;\r\n                }\r\n\r\n                if (!freezonFuc1[0]) {\r\n                    row[1] += step;\r\n                }\r\n            }\r\n\r\n            if (row[0] < 0 || col[0] < 0) {\r\n                return _this.error.r;\r\n            }\r\n\r\n            if (isNaN(col[0]) && isNaN(col[1])) {\r\n                return prefix + $row0 + row[0] + \":\" + $row1 + row[1];\r\n            } else if (isNaN(row[0]) && isNaN(row[1])) {\r\n                return prefix + $col0 + chatatABC(col[0]) + \":\" + $col1 + chatatABC(col[1]);\r\n            } else {\r\n                return (\r\n                    prefix +\r\n                    $col0 +\r\n                    chatatABC(col[0]) +\r\n                    $row0 +\r\n                    row[0] +\r\n                    \":\" +\r\n                    $col1 +\r\n                    chatatABC(col[1]) +\r\n                    $row1 +\r\n                    row[1]\r\n                );\r\n            }\r\n        }\r\n    },\r\n    downparam: function(txt, step) {\r\n        return this.updateparam(\"d\", txt, step);\r\n    },\r\n    upparam: function(txt, step) {\r\n        return this.updateparam(\"u\", txt, step);\r\n    },\r\n    leftparam: function(txt, step) {\r\n        return this.updateparam(\"l\", txt, step);\r\n    },\r\n    rightparam: function(txt, step) {\r\n        return this.updateparam(\"r\", txt, step);\r\n    },\r\n    functionStrChange: function(txt, type, rc, orient, stindex, step) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\",\r\n            ispassby = true;\r\n\r\n        let matchConfig = {\r\n            bracket: 0, //括号\r\n            comma: 0, //逗号\r\n            squote: 0, //单引号\r\n            dquote: 0, //双引号\r\n        };\r\n\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.dquote == 0) {\r\n                matchConfig.bracket += 1;\r\n\r\n                if (str.length > 0) {\r\n                    function_str += str + \"(\";\r\n                } else {\r\n                    function_str += \"(\";\r\n                }\r\n\r\n                str = \"\";\r\n            } else if (s == \")\" && matchConfig.dquote == 0) {\r\n                matchConfig.bracket -= 1;\r\n                function_str += _this.functionStrChange(str, type, rc, orient, stindex, step) + \")\";\r\n                str = \"\";\r\n            } else if (s == '\"' && matchConfig.squote == 0) {\r\n                if (matchConfig.dquote > 0) {\r\n                    function_str += str + '\"';\r\n                    matchConfig.dquote -= 1;\r\n                    str = \"\";\r\n                } else {\r\n                    matchConfig.dquote += 1;\r\n                    str += '\"';\r\n                }\r\n            } else if (s == \",\" && matchConfig.dquote == 0) {\r\n                function_str += _this.functionStrChange(str, type, rc, orient, stindex, step) + \",\";\r\n                str = \"\";\r\n            } else if (s == \"&\" && matchConfig.dquote == 0) {\r\n                if (str.length > 0) {\r\n                    function_str += _this.functionStrChange(str, type, rc, orient, stindex, step) + \"&\";\r\n                    str = \"\";\r\n                } else {\r\n                    function_str += \"&\";\r\n                }\r\n            } else if (s in _this.operatorjson && matchConfig.dquote == 0) {\r\n                let s_next = \"\";\r\n\r\n                if (i + 1 < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                let p = i - 1,\r\n                    s_pre = null;\r\n\r\n                if (p >= 0) {\r\n                    do {\r\n                        s_pre = funcstack[p--];\r\n                    } while (p >= 0 && s_pre == \" \");\r\n                }\r\n\r\n                if (s + s_next in _this.operatorjson) {\r\n                    if (str.length > 0) {\r\n                        function_str += _this.functionStrChange(str, type, rc, orient, stindex, step) + s + s_next;\r\n                        str = \"\";\r\n                    } else {\r\n                        function_str += s + s_next;\r\n                    }\r\n\r\n                    i++;\r\n                } else if (\r\n                    !/[^0-9]/.test(s_next) &&\r\n                    s == \"-\" &&\r\n                    (s_pre == \"(\" || s_pre == null || s_pre == \",\" || s_pre == \" \" || s_pre in _this.operatorjson)\r\n                ) {\r\n                    str += s;\r\n                } else {\r\n                    if (str.length > 0) {\r\n                        function_str += _this.functionStrChange(str, type, rc, orient, stindex, step) + s;\r\n                        str = \"\";\r\n                    } else {\r\n                        function_str += s;\r\n                    }\r\n                }\r\n            } else {\r\n                str += s;\r\n            }\r\n\r\n            if (i == funcstack.length - 1) {\r\n                if (!str.includes(\"!\") && _this.iscelldata($.trim(str))) {\r\n                    function_str += _this.functionStrChange_range($.trim(str), type, rc, orient, stindex, step);\r\n                } else {\r\n                    function_str += $.trim(str);\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n\r\n        return function_str;\r\n    },\r\n    functionStrChange_range: function(txt, type, rc, orient, stindex, step) {\r\n        let _this = this;\r\n\r\n        let val = txt.split(\"!\"),\r\n            rangetxt,\r\n            prefix = \"\";\r\n\r\n        if (val.length > 1) {\r\n            rangetxt = val[1];\r\n            prefix = val[0] + \"!\";\r\n        } else {\r\n            rangetxt = val[0];\r\n        }\r\n\r\n        let r1, r2, c1, c2;\r\n        let $row0, $row1, $col0, $col1;\r\n\r\n        if (rangetxt.indexOf(\":\") == -1) {\r\n            r1 = r2 = parseInt(rangetxt.replace(/[^0-9]/g, \"\")) - 1;\r\n            c1 = c2 = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, \"\"));\r\n\r\n            let freezonFuc = _this.isfreezonFuc(rangetxt);\r\n\r\n            ($row0 = $row1 = freezonFuc[0] ? \"$\" : \"\"), ($col0 = $col1 = freezonFuc[1] ? \"$\" : \"\");\r\n        } else {\r\n            rangetxt = rangetxt.split(\":\");\r\n\r\n            r1 = parseInt(rangetxt[0].replace(/[^0-9]/g, \"\")) - 1;\r\n            r2 = parseInt(rangetxt[1].replace(/[^0-9]/g, \"\")) - 1;\r\n            if (r1 > r2) {\r\n                return txt;\r\n            }\r\n\r\n            c1 = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, \"\"));\r\n            c2 = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, \"\"));\r\n            if (c1 > c2) {\r\n                return txt;\r\n            }\r\n\r\n            let freezonFuc0 = _this.isfreezonFuc(rangetxt[0]);\r\n            $row0 = freezonFuc0[0] ? \"$\" : \"\";\r\n            $col0 = freezonFuc0[1] ? \"$\" : \"\";\r\n\r\n            let freezonFuc1 = _this.isfreezonFuc(rangetxt[1]);\r\n            $row1 = freezonFuc1[0] ? \"$\" : \"\";\r\n            $col1 = freezonFuc1[1] ? \"$\" : \"\";\r\n        }\r\n\r\n        if (type == \"del\") {\r\n            if (rc == \"row\") {\r\n                if (r1 >= stindex && r2 <= stindex + step - 1) {\r\n                    return _this.error.r;\r\n                }\r\n\r\n                if (r1 > stindex + step - 1) {\r\n                    r1 -= step;\r\n                } else if (r1 >= stindex) {\r\n                    r1 = stindex;\r\n                }\r\n\r\n                if (r2 > stindex + step - 1) {\r\n                    r2 -= step;\r\n                } else if (r2 >= stindex) {\r\n                    r2 = stindex - 1;\r\n                }\r\n\r\n                if (r1 < 0) {\r\n                    r1 = 0;\r\n                }\r\n\r\n                if (r2 < r1) {\r\n                    r2 = r1;\r\n                }\r\n            } else if (rc == \"col\") {\r\n                if (c1 >= stindex && c2 <= stindex + step - 1) {\r\n                    return _this.error.r;\r\n                }\r\n\r\n                if (c1 > stindex + step - 1) {\r\n                    c1 -= step;\r\n                } else if (c1 >= stindex) {\r\n                    c1 = stindex;\r\n                }\r\n\r\n                if (c2 > stindex + step - 1) {\r\n                    c2 -= step;\r\n                } else if (c2 >= stindex) {\r\n                    c2 = stindex - 1;\r\n                }\r\n\r\n                if (c1 < 0) {\r\n                    c1 = 0;\r\n                }\r\n\r\n                if (c2 < c1) {\r\n                    c2 = c1;\r\n                }\r\n            }\r\n\r\n            if (r1 == r2 && c1 == c2) {\r\n                if (!isNaN(r1) && !isNaN(c1)) {\r\n                    return prefix + $col0 + chatatABC(c1) + $row0 + (r1 + 1);\r\n                } else if (!isNaN(r1)) {\r\n                    return prefix + $row0 + (r1 + 1);\r\n                } else if (!isNaN(c1)) {\r\n                    return prefix + $col0 + chatatABC(c1);\r\n                } else {\r\n                    return txt;\r\n                }\r\n            } else {\r\n                if (isNaN(c1) && isNaN(c2)) {\r\n                    return prefix + $row0 + (r1 + 1) + \":\" + $row1 + (r2 + 1);\r\n                } else if (isNaN(r1) && isNaN(r2)) {\r\n                    return prefix + $col0 + chatatABC(c1) + \":\" + $col1 + chatatABC(c2);\r\n                } else {\r\n                    return (\r\n                        prefix +\r\n                        $col0 +\r\n                        chatatABC(c1) +\r\n                        $row0 +\r\n                        (r1 + 1) +\r\n                        \":\" +\r\n                        $col1 +\r\n                        chatatABC(c2) +\r\n                        $row1 +\r\n                        (r2 + 1)\r\n                    );\r\n                }\r\n            }\r\n        } else if (type == \"add\") {\r\n            if (rc == \"row\") {\r\n                if (orient == \"lefttop\") {\r\n                    if (r1 >= stindex) {\r\n                        r1 += step;\r\n                    }\r\n\r\n                    if (r2 >= stindex) {\r\n                        r2 += step;\r\n                    }\r\n                } else if (orient == \"rightbottom\") {\r\n                    if (r1 > stindex) {\r\n                        r1 += step;\r\n                    }\r\n\r\n                    if (r2 > stindex) {\r\n                        r2 += step;\r\n                    }\r\n                }\r\n            } else if (rc == \"col\") {\r\n                if (orient == \"lefttop\") {\r\n                    if (c1 >= stindex) {\r\n                        c1 += step;\r\n                    }\r\n\r\n                    if (c2 >= stindex) {\r\n                        c2 += step;\r\n                    }\r\n                } else if (orient == \"rightbottom\") {\r\n                    if (c1 > stindex) {\r\n                        c1 += step;\r\n                    }\r\n\r\n                    if (c2 > stindex) {\r\n                        c2 += step;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (r1 == r2 && c1 == c2) {\r\n                if (!isNaN(r1) && !isNaN(c1)) {\r\n                    return prefix + $col0 + chatatABC(c1) + $row0 + (r1 + 1);\r\n                } else if (!isNaN(r1)) {\r\n                    return prefix + $row0 + (r1 + 1);\r\n                } else if (!isNaN(c1)) {\r\n                    return prefix + $col0 + chatatABC(c1);\r\n                } else {\r\n                    return txt;\r\n                }\r\n            } else {\r\n                if (isNaN(c1) && isNaN(c2)) {\r\n                    return prefix + $row0 + (r1 + 1) + \":\" + $row1 + (r2 + 1);\r\n                } else if (isNaN(r1) && isNaN(r2)) {\r\n                    return prefix + $col0 + chatatABC(c1) + \":\" + $col1 + chatatABC(c2);\r\n                } else {\r\n                    return (\r\n                        prefix +\r\n                        $col0 +\r\n                        chatatABC(c1) +\r\n                        $row0 +\r\n                        (r1 + 1) +\r\n                        \":\" +\r\n                        $col1 +\r\n                        chatatABC(c2) +\r\n                        $row1 +\r\n                        (r2 + 1)\r\n                    );\r\n                }\r\n            }\r\n        }\r\n    },\r\n    israngeseleciton: function(istooltip) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (istooltip == null) {\r\n            istooltip = false;\r\n        }\r\n\r\n        let currSelection = window.getSelection();\r\n        let anchor = $(currSelection.anchorNode);\r\n        let anchorOffset = currSelection.anchorOffset;\r\n\r\n        if (anchor.parent().is(\"span\") && anchorOffset != 0) {\r\n            let txt = $.trim(anchor.text()),\r\n                lasttxt = \"\";\r\n\r\n            if (txt.length == 0 && anchor.parent().prev().length > 0) {\r\n                let ahr = anchor.parent().prev();\r\n                txt = $.trim(ahr.text());\r\n                lasttxt = txt.substr(txt.length - 1, 1);\r\n                _this.rangeSetValueTo = ahr;\r\n            } else {\r\n                lasttxt = txt.substr(anchorOffset - 1, 1);\r\n                _this.rangeSetValueTo = anchor.parent();\r\n            }\r\n\r\n            if (\r\n                (istooltip && (lasttxt == \"(\" || lasttxt == \",\")) ||\r\n                (!istooltip &&\r\n                    (lasttxt == \"(\" ||\r\n                        lasttxt == \",\" ||\r\n                        lasttxt == \"=\" ||\r\n                        lasttxt in _this.operatorjson ||\r\n                        lasttxt == \"&\"))\r\n            ) {\r\n                return true;\r\n            }\r\n        } else if (anchor.is(\"#luckysheet-rich-text-editor\") || anchor.is(\"#luckysheet-functionbox-cell\")) {\r\n            let txt = $.trim(\r\n                    anchor\r\n                        .find(\"span\")\r\n                        .last()\r\n                        .text(),\r\n                ),\r\n                lasttxt;\r\n\r\n            _this.rangeSetValueTo = anchor.find(\"span\").last();\r\n\r\n            if (txt.length == 0 && anchor.find(\"span\").length > 1) {\r\n                let ahr = anchor.find(\"span\");\r\n                txt = $.trim(ahr.eq(ahr.length - 2).text());\r\n                _this.rangeSetValueTo = ahr;\r\n            }\r\n\r\n            lasttxt = txt.substr(txt.length - 1, 1);\r\n\r\n            if (\r\n                (istooltip && (lasttxt == \"(\" || lasttxt == \",\")) ||\r\n                (!istooltip &&\r\n                    (lasttxt == \"(\" ||\r\n                        lasttxt == \",\" ||\r\n                        lasttxt == \"=\" ||\r\n                        lasttxt in _this.operatorjson ||\r\n                        lasttxt == \"&\"))\r\n            ) {\r\n                return true;\r\n            }\r\n        } else if (\r\n            anchor.parent().is(\"#luckysheet-rich-text-editor\") ||\r\n            anchor.parent().is(\"#luckysheet-functionbox-cell\") ||\r\n            anchorOffset == 0\r\n        ) {\r\n            if (anchorOffset == 0) {\r\n                anchor = anchor.parent();\r\n            }\r\n\r\n            if (anchor.prev().length > 0) {\r\n                let txt = $.trim(anchor.prev().text());\r\n                let lasttxt = txt.substr(txt.length - 1, 1);\r\n\r\n                _this.rangeSetValueTo = anchor.prev();\r\n\r\n                if (\r\n                    (istooltip && (lasttxt == \"(\" || lasttxt == \",\")) ||\r\n                    (!istooltip &&\r\n                        (lasttxt == \"(\" ||\r\n                            lasttxt == \",\" ||\r\n                            lasttxt == \"=\" ||\r\n                            lasttxt in _this.operatorjson ||\r\n                            lasttxt == \"&\"))\r\n                ) {\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n\r\n        return false;\r\n    },\r\n    rangechangeindex: null,\r\n    rangestart: false,\r\n    rangetosheet: null,\r\n    rangeSetValueTo: null,\r\n    func_selectedrange: {}, //函数选区范围\r\n    rangeSetValue: function(selected, obj) {\r\n        let _this = this;\r\n\r\n        let range = \"\",\r\n            rf = selected[\"row\"][0],\r\n            cf = selected[\"column\"][0];\r\n        if (Store.config[\"merge\"] != null && rf + \"_\" + cf in Store.config[\"merge\"]) {\r\n            range = getRangetxt(\r\n                Store.currentSheetIndex,\r\n                {\r\n                    column: [cf, cf],\r\n                    row: [rf, rf],\r\n                },\r\n                _this.rangetosheet,\r\n            );\r\n        } else {\r\n            range = getRangetxt(Store.currentSheetIndex, selected, _this.rangetosheet);\r\n        }\r\n\r\n        let $editor;\r\n\r\n        if (_this.rangestart || _this.rangedrag_column_start || _this.rangedrag_row_start) {\r\n            if (\r\n                $(\"#luckysheet-search-formula-parm\").is(\":visible\") ||\r\n                $(\"#luckysheet-search-formula-parm-select\").is(\":visible\")\r\n            ) {\r\n                //公式参数框选取范围\r\n                $editor = $(\"#luckysheet-rich-text-editor\");\r\n                $(\"#luckysheet-search-formula-parm-select-input\").val(range);\r\n                $(\"#luckysheet-search-formula-parm .parmBox\")\r\n                    .eq(_this.data_parm_index)\r\n                    .find(\".txt input\")\r\n                    .val(range);\r\n\r\n                //参数对应值显示\r\n                let txtdata = luckysheet_getcelldata(range).data;\r\n                if (txtdata instanceof Array) {\r\n                    //参数为多个单元格选区\r\n                    let txtArr = [];\r\n\r\n                    for (let i = 0; i < txtdata.length; i++) {\r\n                        for (let j = 0; j < txtdata[i].length; j++) {\r\n                            if (txtdata[i][j] == null) {\r\n                                txtArr.push(null);\r\n                            } else {\r\n                                txtArr.push(txtdata[i][j].v);\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    $(\"#luckysheet-search-formula-parm .parmBox\")\r\n                        .eq(_this.data_parm_index)\r\n                        .find(\".val\")\r\n                        .text(\" = {\" + txtArr.join(\",\") + \"}\");\r\n                } else {\r\n                    //参数为单个单元格选区\r\n                    $(\"#luckysheet-search-formula-parm .parmBox\")\r\n                        .eq(_this.data_parm_index)\r\n                        .find(\".val\")\r\n                        .text(\" = {\" + txtdata.v + \"}\");\r\n                }\r\n\r\n                //计算结果显示\r\n                let isVal = true; //参数不为空\r\n                let parmValArr = []; //参数值集合\r\n                let lvi = -1; //最后一个有值的参数索引\r\n                $(\"#luckysheet-search-formula-parm .parmBox\").each(function(i, e) {\r\n                    let parmtxt = $(e)\r\n                        .find(\".txt input\")\r\n                        .val();\r\n                    if (\r\n                        parmtxt == \"\" &&\r\n                        $(e)\r\n                            .find(\".txt input\")\r\n                            .attr(\"data_parm_require\") == \"m\"\r\n                    ) {\r\n                        isVal = false;\r\n                    }\r\n                    if (parmtxt != \"\") {\r\n                        lvi = i;\r\n                    }\r\n                });\r\n\r\n                //单元格显示\r\n                let functionHtmlTxt;\r\n                if (lvi == -1) {\r\n                    functionHtmlTxt =\r\n                        \"=\" + $(\"#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text\").text() + \"()\";\r\n                } else if (lvi == 0) {\r\n                    functionHtmlTxt =\r\n                        \"=\" +\r\n                        $(\"#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text\").text() +\r\n                        \"(\" +\r\n                        $(\"#luckysheet-search-formula-parm .parmBox\")\r\n                            .eq(0)\r\n                            .find(\".txt input\")\r\n                            .val() +\r\n                        \")\";\r\n                } else {\r\n                    for (let j = 0; j <= lvi; j++) {\r\n                        parmValArr.push(\r\n                            $(\"#luckysheet-search-formula-parm .parmBox\")\r\n                                .eq(j)\r\n                                .find(\".txt input\")\r\n                                .val(),\r\n                        );\r\n                    }\r\n                    functionHtmlTxt =\r\n                        \"=\" +\r\n                        $(\"#luckysheet-search-formula-parm .luckysheet-modal-dialog-title-text\").text() +\r\n                        \"(\" +\r\n                        parmValArr.join(\",\") +\r\n                        \")\";\r\n                }\r\n\r\n                let function_str = _this.functionHTMLGenerate(functionHtmlTxt);\r\n                $(\"#luckysheet-rich-text-editor\").html(function_str);\r\n                $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n\r\n                if (isVal) {\r\n                    //公式计算\r\n                    let fp = $.trim(_this.functionParserExe($(\"#luckysheet-rich-text-editor\").text()));\r\n                    let result = new Function(\"return \" + fp)();\r\n                    $(\"#luckysheet-search-formula-parm .result span\").text(result);\r\n                }\r\n            } else {\r\n                let currSelection = window.getSelection();\r\n                let anchorOffset = currSelection.anchorNode;\r\n                $editor = $(anchorOffset).closest(\"div\");\r\n\r\n                let $span = $editor.find(\"span[rangeindex='\" + _this.rangechangeindex + \"']\").html(range);\r\n\r\n                _this.setCaretPosition($span.get(0), 0, range.length);\r\n            }\r\n        } else {\r\n            let function_str =\r\n                '<span class=\"luckysheet-formula-functionrange-cell\" rangeindex=\"' +\r\n                _this.functionHTMLIndex +\r\n                '\" dir=\"auto\" style=\"color:' +\r\n                luckyColor[_this.functionHTMLIndex] +\r\n                ';\">' +\r\n                range +\r\n                \"</span>\";\r\n            let $t = $(function_str).insertAfter(_this.rangeSetValueTo);\r\n            _this.rangechangeindex = _this.functionHTMLIndex;\r\n            $editor = $(_this.rangeSetValueTo).closest(\"div\");\r\n\r\n            _this.setCaretPosition(\r\n                $editor.find(\"span[rangeindex='\" + _this.rangechangeindex + \"']\").get(0),\r\n                0,\r\n                range.length,\r\n            );\r\n            _this.functionHTMLIndex++;\r\n        }\r\n\r\n        if ($editor.attr(\"id\") == \"luckysheet-rich-text-editor\") {\r\n            $(\"#luckysheet-functionbox-cell\").html($(\"#luckysheet-rich-text-editor\").html());\r\n        } else {\r\n            $(\"#luckysheet-rich-text-editor\").html($(\"#luckysheet-functionbox-cell\").html());\r\n        }\r\n    },\r\n    rangedrag: function(event) {\r\n        let _this = this;\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n        let row_location = rowLocation(y),\r\n            row = row_location[1],\r\n            row_pre = row_location[0],\r\n            row_index = row_location[2];\r\n\r\n        let col_location = colLocation(x),\r\n            col = col_location[1],\r\n            col_pre = col_location[0],\r\n            col_index = col_location[2];\r\n\r\n        let top = 0,\r\n            height = 0,\r\n            rowseleted = [];\r\n\r\n        if (_this.func_selectedrange.top > row_pre) {\r\n            top = row_pre;\r\n            height = _this.func_selectedrange.top + _this.func_selectedrange.height - row_pre;\r\n            rowseleted = [row_index, _this.func_selectedrange.row[1]];\r\n        } else if (_this.func_selectedrange.top == row_pre) {\r\n            top = row_pre;\r\n            height = _this.func_selectedrange.top + _this.func_selectedrange.height - row_pre;\r\n            rowseleted = [row_index, _this.func_selectedrange.row[0]];\r\n        } else {\r\n            top = _this.func_selectedrange.top;\r\n            height = row - _this.func_selectedrange.top - 1;\r\n            rowseleted = [_this.func_selectedrange.row[0], row_index];\r\n        }\r\n\r\n        let left = 0,\r\n            width = 0,\r\n            columnseleted = [];\r\n\r\n        if (_this.func_selectedrange.left > col_pre) {\r\n            left = col_pre;\r\n            width = _this.func_selectedrange.left + _this.func_selectedrange.width - col_pre;\r\n            columnseleted = [col_index, _this.func_selectedrange.column[1]];\r\n        } else if (_this.func_selectedrange.left == col_pre) {\r\n            left = col_pre;\r\n            width = _this.func_selectedrange.left + _this.func_selectedrange.width - col_pre;\r\n            columnseleted = [col_index, _this.func_selectedrange.column[0]];\r\n        } else {\r\n            left = _this.func_selectedrange.left;\r\n            width = col - _this.func_selectedrange.left - 1;\r\n            columnseleted = [_this.func_selectedrange.column[0], col_index];\r\n        }\r\n\r\n        rowseleted[0] = luckysheetFreezen.changeFreezenIndex(rowseleted[0], \"h\");\r\n        rowseleted[1] = luckysheetFreezen.changeFreezenIndex(rowseleted[1], \"h\");\r\n        columnseleted[0] = luckysheetFreezen.changeFreezenIndex(columnseleted[0], \"v\");\r\n        columnseleted[1] = luckysheetFreezen.changeFreezenIndex(columnseleted[1], \"v\");\r\n\r\n        let changeparam = menuButton.mergeMoveMain(\r\n            columnseleted,\r\n            rowseleted,\r\n            _this.func_selectedrange,\r\n            top,\r\n            height,\r\n            left,\r\n            width,\r\n        );\r\n        if (changeparam != null) {\r\n            columnseleted = changeparam[0];\r\n            rowseleted = changeparam[1];\r\n            top = changeparam[2];\r\n            height = changeparam[3];\r\n            left = changeparam[4];\r\n            width = changeparam[5];\r\n        }\r\n\r\n        _this.func_selectedrange[\"row\"] = rowseleted;\r\n        _this.func_selectedrange[\"column\"] = columnseleted;\r\n\r\n        _this.func_selectedrange[\"left_move\"] = left;\r\n        _this.func_selectedrange[\"width_move\"] = width;\r\n        _this.func_selectedrange[\"top_move\"] = top;\r\n        _this.func_selectedrange[\"height_move\"] = height;\r\n\r\n        luckysheet_count_show(left, top, width, height, rowseleted, columnseleted);\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\")\r\n            .css({\r\n                left: left,\r\n                width: width,\r\n                top: top,\r\n                height: height,\r\n            })\r\n            .show();\r\n\r\n        if ($(\"#luckysheet-ifFormulaGenerator-multiRange-dialog\").is(\":visible\")) {\r\n            //if公式生成器 选择范围\r\n            let range = getRangetxt(\r\n                Store.currentSheetIndex,\r\n                { row: rowseleted, column: columnseleted },\r\n                Store.currentSheetIndex,\r\n            );\r\n            $(\"#luckysheet-ifFormulaGenerator-multiRange-dialog input\").val(range);\r\n        } else {\r\n            _this.rangeSetValue({\r\n                row: rowseleted,\r\n                column: columnseleted,\r\n            });\r\n        }\r\n\r\n        luckysheetFreezen.scrollFreezen(rowseleted, columnseleted);\r\n    },\r\n    rangedrag_column_start: false,\r\n    rangedrag_row_start: false,\r\n    rangedrag_column: function(event) {\r\n        let _this = this;\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n        let visibledatarow = Store.visibledatarow;\r\n        let row_index = visibledatarow.length - 1,\r\n            row = visibledatarow[row_index],\r\n            row_pre = 0;\r\n\r\n        let col_location = colLocation(x),\r\n            col = col_location[1],\r\n            col_pre = col_location[0],\r\n            col_index = col_location[2];\r\n\r\n        let left = 0,\r\n            width = 0,\r\n            columnseleted = [];\r\n\r\n        if (_this.func_selectedrange.left > col_pre) {\r\n            left = col_pre;\r\n            width = _this.func_selectedrange.left + _this.func_selectedrange.width - col_pre;\r\n            columnseleted = [col_index, _this.func_selectedrange.column[1]];\r\n        } else if (_this.func_selectedrange.left == col_pre) {\r\n            left = col_pre;\r\n            width = _this.func_selectedrange.left + _this.func_selectedrange.width - col_pre;\r\n            columnseleted = [col_index, _this.func_selectedrange.column[0]];\r\n        } else {\r\n            left = _this.func_selectedrange.left;\r\n            width = col - _this.func_selectedrange.left - 1;\r\n            columnseleted = [_this.func_selectedrange.column[0], col_index];\r\n        }\r\n\r\n        //rowseleted[0] = luckysheetFreezen.changeFreezenIndex(rowseleted[0], \"h\");\r\n        //rowseleted[1] = luckysheetFreezen.changeFreezenIndex(rowseleted[1], \"h\");\r\n        columnseleted[0] = luckysheetFreezen.changeFreezenIndex(columnseleted[0], \"v\");\r\n        columnseleted[1] = luckysheetFreezen.changeFreezenIndex(columnseleted[1], \"v\");\r\n\r\n        let changeparam = menuButton.mergeMoveMain(\r\n            columnseleted,\r\n            [0, row_index],\r\n            _this.func_selectedrange,\r\n            row_pre,\r\n            row - row_pre - 1,\r\n            left,\r\n            width,\r\n        );\r\n        if (changeparam != null) {\r\n            columnseleted = changeparam[0];\r\n            // rowseleted= changeparam[1];\r\n            // top = changeparam[2];\r\n            // height = changeparam[3];\r\n            left = changeparam[4];\r\n            width = changeparam[5];\r\n        }\r\n\r\n        _this.func_selectedrange[\"column\"] = columnseleted;\r\n        _this.func_selectedrange[\"left_move\"] = left;\r\n        _this.func_selectedrange[\"width_move\"] = width;\r\n\r\n        luckysheet_count_show(left, row_pre, width, row - row_pre - 1, [0, row_index], columnseleted);\r\n\r\n        _this.rangeSetValue({\r\n            row: [null, null],\r\n            column: columnseleted,\r\n        });\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\")\r\n            .css({\r\n                left: left,\r\n                width: width,\r\n                top: row_pre,\r\n                height: row - row_pre - 1,\r\n            })\r\n            .show();\r\n\r\n        luckysheetFreezen.scrollFreezen([0, row_index], columnseleted);\r\n    },\r\n    rangedrag_row: function(event) {\r\n        let _this = this;\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + $(\"#luckysheet-cell-main\").scrollLeft();\r\n        let y = mouse[1] + $(\"#luckysheet-cell-main\").scrollTop();\r\n\r\n        let row_location = rowLocation(y),\r\n            row = row_location[1],\r\n            row_pre = row_location[0],\r\n            row_index = row_location[2];\r\n\r\n        let visibledatacolumn = Store.visibledatacolumn;\r\n        let col_index = visibledatacolumn.length - 1,\r\n            col = visibledatacolumn[col_index],\r\n            col_pre = 0;\r\n\r\n        let top = 0,\r\n            height = 0,\r\n            rowseleted = [];\r\n\r\n        if (_this.func_selectedrange.top > row_pre) {\r\n            top = row_pre;\r\n            height = _this.func_selectedrange.top + _this.func_selectedrange.height - row_pre;\r\n            rowseleted = [row_index, _this.func_selectedrange.row[1]];\r\n        } else if (_this.func_selectedrange.top == row_pre) {\r\n            top = row_pre;\r\n            height = _this.func_selectedrange.top + _this.func_selectedrange.height - row_pre;\r\n            rowseleted = [row_index, _this.func_selectedrange.row[0]];\r\n        } else {\r\n            top = _this.func_selectedrange.top;\r\n            height = row - _this.func_selectedrange.top - 1;\r\n            rowseleted = [_this.func_selectedrange.row[0], row_index];\r\n        }\r\n\r\n        rowseleted[0] = luckysheetFreezen.changeFreezenIndex(rowseleted[0], \"h\");\r\n        rowseleted[1] = luckysheetFreezen.changeFreezenIndex(rowseleted[1], \"h\");\r\n        // columnseleted[0] = luckysheetFreezen.changeFreezenIndex(columnseleted[0], \"v\");\r\n        // columnseleted[1] = luckysheetFreezen.changeFreezenIndex(columnseleted[1], \"v\");\r\n\r\n        let changeparam = menuButton.mergeMoveMain(\r\n            [0, col_index],\r\n            rowseleted,\r\n            _this.func_selectedrange,\r\n            top,\r\n            height,\r\n            col_pre,\r\n            col - col_pre - 1,\r\n        );\r\n        if (changeparam != null) {\r\n            // columnseleted = changeparam[0];\r\n            rowseleted = changeparam[1];\r\n            top = changeparam[2];\r\n            height = changeparam[3];\r\n            // left = changeparam[4];\r\n            // width = changeparam[5];\r\n        }\r\n\r\n        _this.func_selectedrange[\"row\"] = rowseleted;\r\n        _this.func_selectedrange[\"top_move\"] = top;\r\n        _this.func_selectedrange[\"height_move\"] = height;\r\n\r\n        luckysheet_count_show(col_pre, top, col - col_pre - 1, height, rowseleted, [0, col_index]);\r\n\r\n        _this.rangeSetValue({\r\n            row: rowseleted,\r\n            column: [null, null],\r\n        });\r\n\r\n        $(\"#luckysheet-formula-functionrange-select\")\r\n            .css({\r\n                left: col_pre,\r\n                width: col - col_pre - 1,\r\n                top: top,\r\n                height: height,\r\n            })\r\n            .show();\r\n\r\n        luckysheetFreezen.scrollFreezen(rowseleted, [0, col_index]);\r\n    },\r\n    rangedragged: function() {},\r\n    rangeResizeObj: null,\r\n    rangeResize: null,\r\n    rangeResizeIndex: null,\r\n    rangeResizexy: null,\r\n    rangeResizeWinH: null,\r\n    rangeResizeWinW: null,\r\n    rangeResizeTo: null,\r\n    rangeResizeDraging: function(\r\n        event,\r\n        luckysheetCurrentChartResizeObj,\r\n        luckysheetCurrentChartResizeXy,\r\n        luckysheetCurrentChartResize,\r\n        luckysheetCurrentChartResizeWinW,\r\n        luckysheetCurrentChartResizeWinH,\r\n        ch_width,\r\n        rh_height,\r\n    ) {\r\n        let _this = this;\r\n\r\n        let scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop(),\r\n            scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft();\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let x = mouse[0] + scrollLeft;\r\n        let y = mouse[1] + scrollTop;\r\n\r\n        let row_location = rowLocation(y),\r\n            row = row_location[1],\r\n            row_pre = row_location[0],\r\n            row_index = row_location[2];\r\n        let col_location = colLocation(x),\r\n            col = col_location[1],\r\n            col_pre = col_location[0],\r\n            col_index = col_location[2];\r\n\r\n        if (x < 0 || y < 0) {\r\n            return false;\r\n        }\r\n\r\n        let topchange = row_pre - luckysheetCurrentChartResizeXy[1],\r\n            leftchange = col_pre - luckysheetCurrentChartResizeXy[0];\r\n        let top = luckysheetCurrentChartResizeXy[5],\r\n            height = luckysheetCurrentChartResizeXy[3],\r\n            left = luckysheetCurrentChartResizeXy[4],\r\n            width = luckysheetCurrentChartResizeXy[2];\r\n\r\n        if (luckysheetCurrentChartResize == \"lt\" || luckysheetCurrentChartResize == \"lb\") {\r\n            if (luckysheetCurrentChartResizeXy[0] + luckysheetCurrentChartResizeXy[2] < col_pre) {\r\n                return;\r\n            }\r\n\r\n            left = col_pre;\r\n            width = luckysheetCurrentChartResizeXy[2] - leftchange;\r\n\r\n            if (left > luckysheetCurrentChartResizeXy[2] + luckysheetCurrentChartResizeXy[4] - col + col_pre) {\r\n                left = luckysheetCurrentChartResizeXy[2] + luckysheetCurrentChartResizeXy[4] - col + col_pre;\r\n                width =\r\n                    luckysheetCurrentChartResizeXy[2] -\r\n                    (luckysheetCurrentChartResizeXy[2] +\r\n                        luckysheetCurrentChartResizeXy[4] -\r\n                        col +\r\n                        col_pre -\r\n                        luckysheetCurrentChartResizeXy[0]);\r\n            } else if (left <= 0) {\r\n                left = 0;\r\n                width = luckysheetCurrentChartResizeXy[2] + luckysheetCurrentChartResizeXy[0];\r\n            }\r\n        }\r\n\r\n        if (luckysheetCurrentChartResize == \"rt\" || luckysheetCurrentChartResize == \"rb\") {\r\n            if (luckysheetCurrentChartResizeXy[6] - luckysheetCurrentChartResizeXy[2] > col) {\r\n                return;\r\n            }\r\n\r\n            width = luckysheetCurrentChartResizeXy[2] + col - luckysheetCurrentChartResizeXy[6];\r\n\r\n            if (width < col - col_pre - 1) {\r\n                width = col - col_pre - 1;\r\n            } else if (width >= ch_width - left) {\r\n                width = ch_width - left;\r\n            }\r\n        }\r\n\r\n        if (luckysheetCurrentChartResize == \"lt\" || luckysheetCurrentChartResize == \"rt\") {\r\n            if (luckysheetCurrentChartResizeXy[1] + luckysheetCurrentChartResizeXy[3] < row_pre) {\r\n                return;\r\n            }\r\n\r\n            top = row_pre;\r\n            height = luckysheetCurrentChartResizeXy[3] - topchange;\r\n\r\n            if (top > luckysheetCurrentChartResizeXy[3] + luckysheetCurrentChartResizeXy[5] - row + row_pre) {\r\n                top = luckysheetCurrentChartResizeXy[3] + luckysheetCurrentChartResizeXy[5] - row + row_pre;\r\n                height =\r\n                    luckysheetCurrentChartResizeXy[3] -\r\n                    (luckysheetCurrentChartResizeXy[3] +\r\n                        luckysheetCurrentChartResizeXy[5] -\r\n                        row +\r\n                        row_pre -\r\n                        luckysheetCurrentChartResizeXy[1]);\r\n            } else if (top <= 0) {\r\n                top = 0;\r\n                height = luckysheetCurrentChartResizeXy[3] + luckysheetCurrentChartResizeXy[1];\r\n            }\r\n        }\r\n\r\n        if (luckysheetCurrentChartResize == \"lb\" || luckysheetCurrentChartResize == \"rb\") {\r\n            if (luckysheetCurrentChartResizeXy[7] - luckysheetCurrentChartResizeXy[3] > row) {\r\n                return;\r\n            }\r\n\r\n            height = luckysheetCurrentChartResizeXy[3] + row - luckysheetCurrentChartResizeXy[7];\r\n\r\n            if (height < row - row_pre - 1) {\r\n                height = row - row_pre - 1;\r\n            } else if (height >= rh_height - top) {\r\n                height = rh_height - top;\r\n            }\r\n        }\r\n\r\n        let rangeindex = _this.rangeResizeIndex;\r\n        let selected = {\r\n            top: top,\r\n            left: left,\r\n            height: height,\r\n            width: width,\r\n        };\r\n        let range = _this.getSelectedFromRange(selected);\r\n        let rangetxt = getRangetxt(Store.currentSheetIndex, range, _this.rangetosheet);\r\n        let $span = _this.rangeResizeTo.find(\"span[rangeindex='\" + rangeindex + \"']\").html(rangetxt);\r\n        luckysheetRangeLast(_this.rangeResizeTo[0]);\r\n        luckysheetCurrentChartResizeObj.css(selected).data(\"range\", range);\r\n    },\r\n    getSelectedFromRange: function(obj) {\r\n        let row_st = obj.top + 2,\r\n            row_ed = obj.top + obj.height - 2;\r\n        let col_st = obj.left + 2,\r\n            col_ed = obj.left + obj.width - 2;\r\n\r\n        let ret = {\r\n            row: [rowLocation(row_st)[2], rowLocation(row_ed)[2]],\r\n            column: [colLocation(col_st)[2], colLocation(col_ed)[2]],\r\n        };\r\n\r\n        return ret;\r\n    },\r\n    rangeResizeDragged: function(\r\n        event,\r\n        luckysheetCurrentChartResizeObj,\r\n        luckysheetCurrentChartResizeXy,\r\n        luckysheetCurrentChartResize,\r\n        luckysheetCurrentChartResizeWinW,\r\n        luckysheetCurrentChartResizeWinH,\r\n    ) {\r\n        let _this = this;\r\n\r\n        _this.rangeResize = null;\r\n        $(\"#luckysheet-formula-functionrange-highlight-\" + _this.rangeResizeIndex)\r\n            .find(\".luckysheet-selection-copy-hc\")\r\n            .css(\"opacity\", 0.03);\r\n    },\r\n    rangeMovexy: null,\r\n    rangeMove: false,\r\n    rangeMoveObj: null,\r\n    rangeMoveIndex: null,\r\n    rangeMoveRangedata: null,\r\n    rangeMoveDraging: function(\r\n        event,\r\n        luckysheet_cell_selected_move_index,\r\n        luckysheet_select_save,\r\n        obj,\r\n        sheetBarHeight,\r\n        statisticBarHeight,\r\n    ) {\r\n        let _this = this;\r\n\r\n        let mouse = mouseposition(event.pageX, event.pageY);\r\n        let scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft();\r\n        let scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n        let x = mouse[0] + scrollLeft;\r\n        let y = mouse[1] + scrollTop;\r\n\r\n        let winH = $(window).height() + scrollTop - sheetBarHeight - statisticBarHeight,\r\n            winW = $(window).width() + scrollLeft;\r\n\r\n        let row_index_original = luckysheet_cell_selected_move_index[0],\r\n            col_index_original = luckysheet_cell_selected_move_index[1];\r\n        let row_s = luckysheet_select_save[\"row\"][0] - row_index_original + rowLocation(y)[2],\r\n            row_e = luckysheet_select_save[\"row\"][1] - row_index_original + rowLocation(y)[2];\r\n        let col_s = luckysheet_select_save[\"column\"][0] - col_index_original + colLocation(x)[2],\r\n            col_e = luckysheet_select_save[\"column\"][1] - col_index_original + colLocation(x)[2];\r\n\r\n        if (row_s < 0 || y < 0) {\r\n            row_s = 0;\r\n            row_e = luckysheet_select_save[\"row\"][1] - luckysheet_select_save[\"row\"][0];\r\n        }\r\n        if (col_s < 0 || x < 0) {\r\n            col_s = 0;\r\n            col_e = luckysheet_select_save[\"column\"][1] - luckysheet_select_save[\"column\"][0];\r\n        }\r\n\r\n        let visibledatarow = Store.visibledatarow;\r\n        if (row_e >= visibledatarow[visibledatarow.length - 1] || y > winH) {\r\n            row_s = visibledatarow.length - 1 - luckysheet_select_save[\"row\"][1] + luckysheet_select_save[\"row\"][0];\r\n            row_e = visibledatarow.length - 1;\r\n        }\r\n        let visibledatacolumn = Store.visibledatacolumn;\r\n        if (col_e >= visibledatacolumn[visibledatacolumn.length - 1] || x > winW) {\r\n            col_s =\r\n                visibledatacolumn.length -\r\n                1 -\r\n                luckysheet_select_save[\"column\"][1] +\r\n                luckysheet_select_save[\"column\"][0];\r\n            col_e = visibledatacolumn.length - 1;\r\n        }\r\n\r\n        let col_pre = col_s - 1 == -1 ? 0 : visibledatacolumn[col_s - 1],\r\n            col = visibledatacolumn[col_e];\r\n        let row_pre = row_s - 1 == -1 ? 0 : visibledatarow[row_s - 1],\r\n            row = visibledatarow[row_e];\r\n        let rangeindex = _this.rangeMoveIndex;\r\n        let selected = {\r\n            left: col_pre,\r\n            width: col - col_pre - 2,\r\n            top: row_pre,\r\n            height: row - row_pre - 2,\r\n            display: \"block\",\r\n        };\r\n        let range = _this.getSelectedFromRange(selected);\r\n        let rangetxt = getRangetxt(Store.currentSheetIndex, range, _this.rangetosheet);\r\n        let $span = _this.rangeResizeTo.find(\"span[rangeindex='\" + rangeindex + \"']\").html(rangetxt);\r\n        luckysheetRangeLast(_this.rangeResizeTo[0]);\r\n        _this.rangeMoveRangedata = range;\r\n        obj.css(selected);\r\n    },\r\n    rangeMoveDragged: function(obj) {\r\n        let _this = this;\r\n\r\n        _this.rangeMove = false;\r\n        $(\"#luckysheet-formula-functionrange-highlight-\" + _this.rangeMoveIndex)\r\n            .data(\"range\", _this.rangeMoveRangedata)\r\n            .find(\".luckysheet-selection-copy-hc\")\r\n            .css(\"opacity\", 0.03);\r\n    },\r\n    functionHTMLIndex: 0,\r\n    functionRangeIndex: null,\r\n    findrangeindex: function(v, vp) {\r\n        let _this = this;\r\n\r\n        let re = /<span.*?>/g;\r\n        let v_a = v.replace(re, \"\"),\r\n            vp_a = vp.replace(re, \"\");\r\n        v_a = v_a.split(\"</span>\");\r\n        vp_a = vp_a.split(\"</span>\");\r\n        v_a.pop();\r\n        vp_a.pop();\r\n\r\n        let pfri = _this.functionRangeIndex;\r\n        let i = 0;\r\n        let spanlen = vp_a.length > v_a.length ? v_a.length : vp_a.length;\r\n\r\n        let vplen = vp_a.length,\r\n            vlen = v_a.length;\r\n        //不增加元素输入\r\n        if (vplen == vlen) {\r\n            let i = pfri[0];\r\n            let p = vp_a[i],\r\n                n = v_a[i];\r\n\r\n            if (p == null) {\r\n                if (vp_a.length <= i) {\r\n                    pfri = [vp_a.length - 1, vp_a.length - 1];\r\n                } else if (v_a.length <= i) {\r\n                    pfri = [v_a.length - 1, v_a.length - 1];\r\n                }\r\n\r\n                return pfri;\r\n            } else if (p.length == n.length) {\r\n                if (vp_a[i + 1] != null && v_a[i + 1] != null && vp_a[i + 1].length < v_a[i + 1].length) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = 1;\r\n                }\r\n\r\n                return pfri;\r\n            } else if (p.length > n.length) {\r\n                if (\r\n                    p != null &&\r\n                    v_a[i + 1] != null &&\r\n                    v_a[i + 1].substr(0, 1) == '\"' &&\r\n                    (p.indexOf(\"{\") > -1 || p.indexOf(\"}\") > -1)\r\n                ) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = 1;\r\n                }\r\n\r\n                return pfri;\r\n            } else if (p.length < n.length) {\r\n                if (pfri[1] > n.length) {\r\n                    pfri[1] = n.length;\r\n                }\r\n\r\n                return pfri;\r\n            }\r\n        }\r\n        //减少元素输入\r\n        else if (vplen > vlen) {\r\n            let i = pfri[0];\r\n            let p = vp_a[i],\r\n                n = v_a[i];\r\n\r\n            if (n == null) {\r\n                if (v_a[i - 1].indexOf(\"{\") > -1) {\r\n                    pfri[0] = pfri[0] - 1;\r\n                    let start = v_a[i - 1].search(\"{\");\r\n                    pfri[1] = pfri[1] + start;\r\n                } else {\r\n                    pfri[0] = 0;\r\n                    pfri[1] = 0;\r\n                }\r\n            } else if (p.length == n.length) {\r\n                if (\r\n                    v_a[i + 1] != null &&\r\n                    (v_a[i + 1].substr(0, 1) == '\"' || v_a[i + 1].substr(0, 1) == \"{\" || v_a[i + 1].substr(0, 1) == \"}\")\r\n                ) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = 1;\r\n                } else if (p != null && p.length > 2 && p.substr(0, 1) == '\"' && p.substr(p.length - 1, 1) == '\"') {\r\n                    //pfri[1] = n.length-1;\r\n                } else if (v_a[i] != null && v_a[i] == '\")') {\r\n                    pfri[1] = 1;\r\n                } else if (v_a[i] != null && v_a[i] == '\"}') {\r\n                    pfri[1] = 1;\r\n                } else if (v_a[i] != null && v_a[i] == \"{)\") {\r\n                    pfri[1] = 1;\r\n                } else {\r\n                    pfri[1] = n.length;\r\n                }\r\n\r\n                return pfri;\r\n            } else if (p.length > n.length) {\r\n                if (\r\n                    v_a[i + 1] != null &&\r\n                    (v_a[i + 1].substr(0, 1) == '\"' || v_a[i + 1].substr(0, 1) == \"{\" || v_a[i + 1].substr(0, 1) == \"}\")\r\n                ) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = 1;\r\n                }\r\n\r\n                return pfri;\r\n            } else if (p.length < n.length) {\r\n                return pfri;\r\n            }\r\n\r\n            return pfri;\r\n        }\r\n        //增加元素输入\r\n        else if (vplen < vlen) {\r\n            let i = pfri[0];\r\n            let p = vp_a[i],\r\n                n = v_a[i];\r\n\r\n            if (p == null) {\r\n                pfri[0] = v_a.length - 1;\r\n\r\n                if (n != null) {\r\n                    pfri[1] = n.length;\r\n                } else {\r\n                    pfri[1] = 1;\r\n                }\r\n            } else if (p.length == n.length) {\r\n                if (\r\n                    vp_a[i + 1] != null &&\r\n                    (vp_a[i + 1].substr(0, 1) == '\"' ||\r\n                        vp_a[i + 1].substr(0, 1) == \"{\" ||\r\n                        vp_a[i + 1].substr(0, 1) == \"}\")\r\n                ) {\r\n                    pfri[1] = n.length;\r\n                } else if (\r\n                    v_a[i + 1] != null &&\r\n                    v_a[i + 1].substr(0, 1) == '\"' &&\r\n                    (v_a[i + 1].substr(0, 1) == \"{\" || v_a[i + 1].substr(0, 1) == \"}\")\r\n                ) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = 1;\r\n                } else if (\r\n                    n != null &&\r\n                    n.substr(0, 1) == '\"' &&\r\n                    n.substr(n.length - 1, 1) == '\"' &&\r\n                    p.substr(0, 1) == '\"' &&\r\n                    p.substr(p.length - 1, 1) == \")\"\r\n                ) {\r\n                    pfri[1] = n.length;\r\n                } else if (\r\n                    n != null &&\r\n                    n.substr(0, 1) == \"{\" &&\r\n                    n.substr(n.length - 1, 1) == \"}\" &&\r\n                    p.substr(0, 1) == \"{\" &&\r\n                    p.substr(p.length - 1, 1) == \")\"\r\n                ) {\r\n                    pfri[1] = n.length;\r\n                } else {\r\n                    pfri[0] = pfri[0] + vlen - vplen;\r\n                    if (v_a.length > vp_a.length) {\r\n                        pfri[1] = v_a[i + 1].length;\r\n                    } else {\r\n                        pfri[1] = 1;\r\n                    }\r\n                }\r\n\r\n                return pfri;\r\n            } else if (p.length > n.length) {\r\n                if (p != null && p.substr(0, 1) == '\"') {\r\n                    pfri[1] = n.length;\r\n                } else if (v_a[i + 1] != null && /{.*?}/.test(v_a[i + 1])) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = v_a[i + 1].length;\r\n                } else if (\r\n                    p != null &&\r\n                    v_a[i + 1].substr(0, 1) == '\"' &&\r\n                    (p.indexOf(\"{\") > -1 || p.indexOf(\"}\") > -1)\r\n                ) {\r\n                    pfri[0] = pfri[0] + 1;\r\n                    pfri[1] = 1;\r\n                } else if (p != null && (p.indexOf(\"{\") > -1 || p.indexOf(\"}\") > -1)) {\r\n                } else {\r\n                    pfri[0] = pfri[0] + vlen - vplen - 1;\r\n                    pfri[1] = v_a[i - 1].length;\r\n                }\r\n\r\n                return pfri;\r\n            } else if (p.length < n.length) {\r\n                return pfri;\r\n            }\r\n\r\n            return pfri;\r\n        }\r\n\r\n        return null;\r\n    },\r\n    setCaretPosition: function(textDom, children, pos) {\r\n        try {\r\n            let el = textDom;\r\n            let range = document.createRange();\r\n            let sel = window.getSelection();\r\n            range.setStart(el.childNodes[children], pos);\r\n            range.collapse(true);\r\n            sel.removeAllRanges();\r\n            sel.addRange(range);\r\n            el.focus();\r\n        } catch (err) {\r\n            luckysheetRangeLast(this.rangeResizeTo[0]);\r\n        }\r\n    },\r\n    functionRange: function(obj, v, vp) {\r\n        let _this = this;\r\n\r\n        if (window.getSelection) {\r\n            //ie11 10 9 ff safari\r\n            let currSelection = window.getSelection();\r\n            let fri = _this.findrangeindex(v, vp);\r\n\r\n            if (fri == null) {\r\n                currSelection.selectAllChildren(obj.get(0));\r\n                currSelection.collapseToEnd();\r\n            } else {\r\n                _this.setCaretPosition(obj.find(\"span\").get(fri[0]), 0, fri[1]);\r\n            }\r\n        } else if (document.selection) {\r\n            //ie10 9 8 7 6 5\r\n            _this.functionRangeIndex.moveToElementText(obj); //range定位到obj\r\n            _this.functionRangeIndex.collapse(false); //光标移至最后\r\n            _this.functionRangeIndex.select();\r\n        }\r\n    },\r\n    functionInputHanddler: function($to, $input, kcode) {\r\n        if (isEditMode()) {\r\n            //此模式下禁用公式栏\r\n            return;\r\n        }\r\n\r\n        let _this = this;\r\n\r\n        let $copy = $to,\r\n            $editer = $input;\r\n        let value1 = $editer.html(),\r\n            value1txt = $editer.text();\r\n        let xssDeal = this.xssDeal;\r\n        setTimeout(function() {\r\n            let value = $editer.text(),\r\n                valuetxt = value;\r\n            value = xssDeal(value);\r\n            if (value.length > 0 && value.substr(0, 1) == \"=\" && (kcode != 229 || value.length == 1)) {\r\n                value = _this.functionHTMLGenerate(value);\r\n                value1 = _this.functionHTMLGenerate(value1txt);\r\n\r\n                if (window.getSelection) {\r\n                    // all browsers, except IE before version 9\r\n                    let currSelection = window.getSelection();\r\n                    if ($(currSelection.anchorNode).is(\"div\")) {\r\n                        let editorlen = $(\"#luckysheet-rich-text-editor span\").length;\r\n                        _this.functionRangeIndex = [\r\n                            editorlen - 1,\r\n                            $(\"#luckysheet-rich-text-editor\")\r\n                                .find(\"span\")\r\n                                .eq(editorlen - 1)\r\n                                .text().length,\r\n                        ];\r\n                    } else {\r\n                        _this.functionRangeIndex = [\r\n                            $(currSelection.anchorNode)\r\n                                .parent()\r\n                                .index(),\r\n                            currSelection.anchorOffset,\r\n                        ];\r\n                    }\r\n                } else {\r\n                    // Internet Explorer before version 9\r\n                    let textRange = document.selection.createRange();\r\n                    _this.functionRangeIndex = textRange;\r\n                }\r\n\r\n                $editer.html(value);\r\n                _this.functionRange($editer, value, value1);\r\n                _this.canceFunctionrangeSelected();\r\n\r\n                if (kcode != 46) {\r\n                    //delete不执行此函数\r\n                    _this.createRangeHightlight();\r\n                }\r\n\r\n                $copy.html(value);\r\n                _this.rangestart = false;\r\n                _this.rangedrag_column_start = false;\r\n                _this.rangedrag_row_start = false;\r\n\r\n                _this.rangeHightlightselected($editer, kcode);\r\n            } else if (value1txt.substr(0, 1) != \"=\") {\r\n                //&& value1.indexOf(\"span\")>-1\r\n                // $editer.html(value1);\r\n\r\n                // let w = window.getSelection();\r\n                // if(w!=null && w.type!=\"None\"){\r\n                //     let range = w.getRangeAt(0);\r\n                //     let c = range.startContainer;\r\n\r\n                //     if(c.id==\"luckysheet-rich-text-editor\" || $(c).closest(\"#luckysheet-rich-text-editor\")){\r\n                //         $functionbox.html(value);\r\n                //     }\r\n                //     else if(c.id==\"luckysheet-functionbox-cell\" || $(c).closest(\"#luckysheet-functionbox-cell\")){\r\n                //         if(value1.indexOf(\"span\")>-1){\r\n\r\n                //         }\r\n                //         else{\r\n                //             $editer.html(value);\r\n                //         }\r\n                //     }\r\n\r\n                // }\r\n                // console.trace();\r\n                // console.log(value, $copy.attr(\"id\"));\r\n\r\n                if ($copy.attr(\"id\") == \"luckysheet-rich-text-editor\") {\r\n                    if ($copy.html().substr(0, 5) == \"<span\") {\r\n                    } else {\r\n                        value = _this.ltGtSignDeal(value);\r\n                        $copy.html(value);\r\n                    }\r\n                } else {\r\n                    value = _this.ltGtSignDeal(value);\r\n                    $copy.html(value);\r\n                }\r\n            }\r\n        }, 1);\r\n    },\r\n    functionHTMLGenerate: function(txt) {\r\n        let _this = this;\r\n\r\n        if (txt.length == 0 || txt.substr(0, 1) != \"=\") {\r\n            return txt;\r\n        }\r\n\r\n        _this.functionHTMLIndex = 0;\r\n\r\n        return '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">=</span>' + _this.functionHTML(txt);\r\n    },\r\n    functionHTML: function(txt) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\",\r\n            ispassby = true;\r\n        let matchConfig = {\r\n            bracket: 0,\r\n            comma: 0,\r\n            squote: 0,\r\n            dquote: 0,\r\n            braces: 0,\r\n        };\r\n\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                matchConfig.bracket += 1;\r\n\r\n                if (str.length > 0) {\r\n                    function_str +=\r\n                        '<span dir=\"auto\" class=\"luckysheet-formula-text-func\">' +\r\n                        str +\r\n                        '</span><span dir=\"auto\" class=\"luckysheet-formula-text-lpar\">(</span>';\r\n                } else {\r\n                    function_str += '<span dir=\"auto\" class=\"luckysheet-formula-text-lpar\">(</span>';\r\n                }\r\n\r\n                str = \"\";\r\n            } else if (s == \")\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                matchConfig.bracket -= 1;\r\n                function_str +=\r\n                    _this.functionHTML(str) + '<span dir=\"auto\" class=\"luckysheet-formula-text-rpar\">)</span>';\r\n                str = \"\";\r\n            } else if (s == \"{\" && matchConfig.squote == 0 && matchConfig.dquote == 0) {\r\n                str += \"{\";\r\n                matchConfig.braces += 1;\r\n            } else if (s == \"}\" && matchConfig.squote == 0 && matchConfig.dquote == 0) {\r\n                str += \"}\";\r\n                matchConfig.braces -= 1;\r\n            } else if (s == '\"' && matchConfig.squote == 0) {\r\n                if (matchConfig.dquote > 0) {\r\n                    if (str.length > 0) {\r\n                        function_str += str + '\"</span>';\r\n                    } else {\r\n                        function_str += '\"</span>';\r\n                    }\r\n\r\n                    matchConfig.dquote -= 1;\r\n                    str = \"\";\r\n                } else {\r\n                    matchConfig.dquote += 1;\r\n\r\n                    if (str.length > 0) {\r\n                        function_str +=\r\n                            _this.functionHTML(str) + '<span dir=\"auto\" class=\"luckysheet-formula-text-string\">\"';\r\n                    } else {\r\n                        function_str += '<span dir=\"auto\" class=\"luckysheet-formula-text-string\">\"';\r\n                    }\r\n\r\n                    str = \"\";\r\n                }\r\n            }\r\n            //修正例如输入公式='1-2'!A1时，只有2'!A1是luckysheet-formula-functionrange-cell色，'1-是黑色的问题。\r\n            else if (s == \"'\" && matchConfig.dquote == 0) {\r\n                str += \"'\";\r\n                matchConfig.squote = matchConfig.squote == 0 ? 1 : 0;\r\n            } else if (s == \",\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                //matchConfig.comma += 1;\r\n                function_str +=\r\n                    _this.functionHTML(str) + '<span dir=\"auto\" class=\"luckysheet-formula-text-comma\">,</span>';\r\n                str = \"\";\r\n            } else if (s == \"&\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                if (str.length > 0) {\r\n                    function_str +=\r\n                        _this.functionHTML(str) +\r\n                        '<span dir=\"auto\" class=\"luckysheet-formula-text-calc\">' +\r\n                        \"&\" +\r\n                        \"</span>\";\r\n                    str = \"\";\r\n                } else {\r\n                    function_str += '<span dir=\"auto\" class=\"luckysheet-formula-text-calc\">' + \"&\" + \"</span>\";\r\n                }\r\n            } else if (\r\n                s in _this.operatorjson &&\r\n                matchConfig.squote == 0 &&\r\n                matchConfig.dquote == 0 &&\r\n                matchConfig.braces == 0\r\n            ) {\r\n                let s_next = \"\";\r\n                if (i + 1 < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                let p = i - 1,\r\n                    s_pre = null;\r\n                if (p >= 0) {\r\n                    do {\r\n                        s_pre = funcstack[p--];\r\n                    } while (p >= 0 && s_pre == \" \");\r\n                }\r\n\r\n                if (s + s_next in _this.operatorjson) {\r\n                    if (str.length > 0) {\r\n                        function_str +=\r\n                            _this.functionHTML(str) +\r\n                            '<span dir=\"auto\" class=\"luckysheet-formula-text-calc\">' +\r\n                            s +\r\n                            s_next +\r\n                            \"</span>\";\r\n                        str = \"\";\r\n                    } else {\r\n                        function_str +=\r\n                            '<span dir=\"auto\" class=\"luckysheet-formula-text-calc\">' + s + s_next + \"</span>\";\r\n                    }\r\n\r\n                    i++;\r\n                } else if (\r\n                    !/[^0-9]/.test(s_next) &&\r\n                    s == \"-\" &&\r\n                    (s_pre == \"(\" || s_pre == null || s_pre == \",\" || s_pre == \" \" || s_pre in _this.operatorjson)\r\n                ) {\r\n                    str += s;\r\n                } else {\r\n                    if (str.length > 0) {\r\n                        function_str +=\r\n                            _this.functionHTML(str) +\r\n                            '<span dir=\"auto\" class=\"luckysheet-formula-text-calc\">' +\r\n                            s +\r\n                            \"</span>\";\r\n                        str = \"\";\r\n                    } else {\r\n                        function_str += '<span dir=\"auto\" class=\"luckysheet-formula-text-calc\">' + s + \"</span>\";\r\n                    }\r\n                }\r\n            } else {\r\n                str += s;\r\n            }\r\n\r\n            if (i == funcstack.length - 1) {\r\n                //function_str += str;\r\n                if (_this.iscelldata($.trim(str))) {\r\n                    function_str +=\r\n                        '<span class=\"luckysheet-formula-functionrange-cell\" rangeindex=\"' +\r\n                        _this.functionHTMLIndex +\r\n                        '\" dir=\"auto\" style=\"color:' +\r\n                        luckyColor[_this.functionHTMLIndex] +\r\n                        ';\">' +\r\n                        str +\r\n                        \"</span>\";\r\n                    _this.functionHTMLIndex++;\r\n                } else if (matchConfig.dquote > 0) {\r\n                    function_str += str + \"</span>\";\r\n                } else if (str.indexOf(\"</span>\") == -1 && str.length > 0) {\r\n                    let regx = /{.*?}/;\r\n\r\n                    if (regx.test($.trim(str))) {\r\n                        let arraytxt = regx.exec(str)[0];\r\n                        let arraystart = str.search(regx);\r\n                        let alltxt = \"\";\r\n\r\n                        if (arraystart > 0) {\r\n                            alltxt +=\r\n                                '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">' +\r\n                                str.substr(0, arraystart) +\r\n                                \"</span>\";\r\n                        }\r\n\r\n                        alltxt +=\r\n                            '<span dir=\"auto\" style=\"color:#959a05\" class=\"luckysheet-formula-text-array\">' +\r\n                            arraytxt +\r\n                            \"</span>\";\r\n\r\n                        if (arraystart + arraytxt.length < str.length) {\r\n                            alltxt +=\r\n                                '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">' +\r\n                                str.substr(arraystart + arraytxt.length, str.length) +\r\n                                \"</span>\";\r\n                        }\r\n\r\n                        function_str += alltxt;\r\n                    } else {\r\n                        function_str += '<span dir=\"auto\" class=\"luckysheet-formula-text-color\">' + str + \"</span>\";\r\n                    }\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n\r\n        return function_str;\r\n    },\r\n    getfunctionParam: function(txt) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\";\r\n        let matchConfig = {\r\n            bracket: 0,\r\n            comma: 0,\r\n            squote: 0,\r\n            dquote: 0,\r\n            compare: 0,\r\n        };\r\n\r\n        //bracket 0为运算符括号、1为函数括号\r\n        let fn = null,\r\n            param = [],\r\n            bracket = [];\r\n\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.dquote == 0) {\r\n                if (str.length > 0 && bracket.length == 0) {\r\n                    fn = str.toUpperCase();\r\n                    bracket.push(1);\r\n                    str = \"\";\r\n                } else if (bracket.length == 0) {\r\n                    //function_str += \"(\";\r\n                    bracket.push(0);\r\n                    str = \"\";\r\n                } else {\r\n                    bracket.push(0);\r\n                    str += s;\r\n                }\r\n            } else if (s == \")\" && matchConfig.dquote == 0) {\r\n                let bt = bracket.pop();\r\n\r\n                if (bracket.length == 0) {\r\n                    param.push(str);\r\n                    str = \"\";\r\n                } else {\r\n                    str += s;\r\n                }\r\n            } else if (s == '\"') {\r\n                str += '\"';\r\n\r\n                if (matchConfig.dquote > 0) {\r\n                    matchConfig.dquote -= 1;\r\n                    str = \"\";\r\n                } else {\r\n                    matchConfig.dquote += 1;\r\n                }\r\n            } else if (s == \",\" && matchConfig.dquote == 0) {\r\n                if (bracket.length <= 1) {\r\n                    param.push(str);\r\n                    str = \"\";\r\n                } else {\r\n                    str += \",\";\r\n                }\r\n            } else if (s in _this.operatorjson && matchConfig.dquote == 0) {\r\n                let s_next = \"\";\r\n                if (i + 1 < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                let p = i - 1,\r\n                    s_pre = null;\r\n                if (p >= 0) {\r\n                    do {\r\n                        s_pre = funcstack[p--];\r\n                    } while (p >= 0 && s_pre == \" \");\r\n                }\r\n\r\n                if (\r\n                    !/[^0-9]/.test(s_next) &&\r\n                    s == \"-\" &&\r\n                    (s_pre == \"(\" || s_pre == null || s_pre == \",\" || s_pre == \" \" || s_pre in _this.operatorjson)\r\n                ) {\r\n                    if (matchConfig.dquote == 0) {\r\n                        str += $.trim(s);\r\n                    } else {\r\n                        str += s;\r\n                    }\r\n                } else {\r\n                    function_str = \"\";\r\n                    str = \"\";\r\n                }\r\n            } else {\r\n                if (matchConfig.dquote == 0) {\r\n                    str += $.trim(s);\r\n                } else {\r\n                    str += s;\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n\r\n        return { fn: fn, param: param };\r\n    },\r\n    calPostfixExpression: function(cal) {\r\n        if (cal.length == 0) {\r\n            return \"\";\r\n        }\r\n\r\n        let stack = [];\r\n        for (let i = cal.length - 1; i >= 0; i--) {\r\n            let c = cal[i];\r\n            if (c in this.operatorjson) {\r\n                let s2 = stack.pop();\r\n                let s1 = stack.pop();\r\n\r\n                let str = \"luckysheet_compareWith(\" + s1 + \",'\" + c + \"', \" + s2 + \")\";\r\n\r\n                stack.push(str);\r\n            } else {\r\n                stack.push(c);\r\n            }\r\n        }\r\n\r\n        if (stack.length > 0) {\r\n            return stack[0];\r\n        } else {\r\n            return \"\";\r\n        }\r\n    },\r\n    checkBracketNum: function(fp) {\r\n        let bra_l = fp.match(/\\(/g),\r\n            bra_r = fp.match(/\\)/g),\r\n            bra_tl_txt = fp.match(/(['\"])(?:(?!\\1).)*?\\1/g),\r\n            bra_tr_txt = fp.match(/(['\"])(?:(?!\\1).)*?\\1/g);\r\n\r\n        let bra_l_len = 0,\r\n            bra_r_len = 0;\r\n        if (bra_l != null) {\r\n            bra_l_len += bra_l.length;\r\n        }\r\n        if (bra_r != null) {\r\n            bra_r_len += bra_r.length;\r\n        }\r\n\r\n        let bra_tl_len = 0,\r\n            bra_tr_len = 0;\r\n        if (bra_tl_txt != null) {\r\n            for (let i = 0; i < bra_tl_txt.length; i++) {\r\n                let bra_tl = bra_tl_txt[i].match(/\\(/g);\r\n                if (bra_tl != null) {\r\n                    bra_tl_len += bra_tl.length;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (bra_tr_txt != null) {\r\n            for (let i = 0; i < bra_tr_txt.length; i++) {\r\n                let bra_tr = bra_tr_txt[i].match(/\\)/g);\r\n                if (bra_tr != null) {\r\n                    bra_tr_len += bra_tr.length;\r\n                }\r\n            }\r\n        }\r\n\r\n        bra_l_len -= bra_tl_len;\r\n        bra_r_len -= bra_tr_len;\r\n\r\n        if (bra_l_len != bra_r_len) {\r\n            return false;\r\n        } else {\r\n            return true;\r\n        }\r\n    },\r\n    operatorPriority: {\r\n        \"^\": 0,\r\n        \"%\": 1,\r\n        \"*\": 1,\r\n        \"/\": 1,\r\n        \"+\": 2,\r\n        \"-\": 2,\r\n    },\r\n    functionParserExe: function(txt) {\r\n        let _this = this;\r\n        // let txt1 = txt.toUpperCase();\r\n        // return this.functionParser(txt, function(c){\r\n        //     _this.addToCellList(txt, c);\r\n        // });\r\n        return this.functionParser(txt);\r\n    },\r\n    functionParser: function(txt, cellRangeFunction) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (txt == null) {\r\n            return \"\";\r\n        }\r\n\r\n        if (txt.substr(0, 2) == \"=+\") {\r\n            txt = txt.substr(2);\r\n        } else if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\";\r\n\r\n        let matchConfig = {\r\n            bracket: 0,\r\n            comma: 0,\r\n            squote: 0,\r\n            dquote: 0,\r\n            compare: 0,\r\n            braces: 0,\r\n        };\r\n\r\n        //=(sum(b1:c10)+10)*5-100\r\n\r\n        //=MAX(B1:C10,10)*5-100\r\n\r\n        // =(sum(max(B1:C10,10)*5-100,((1+1)*2+5)/2,10)+count(B1:C10,10*5-100))*5-100\r\n\r\n        //=SUM(MAX(B1:C10,10)*5-100,((1+1)*2+5)/2,10)+COUNT(B1:C10,10*5-100)\r\n\r\n        //=SUM(MAX(B1:C10,10)*5-100,((1+1)*2+5)/2,10)\r\n\r\n        //=SUM(10,((1+1)*2+5)/2,10)\r\n\r\n        //=SUM(MAX(B1:C10,10)*5-100)\r\n\r\n        //=IFERROR(IF(ROW()-ROW($G$3)=1,$F4+$D4,SUM($D1:INDEX($D$4:$D$9,1,1),$F1:INDEX($F$4:$F$9,1,1))), \"\")\r\n\r\n        //=IFERROR(IF(ROW()-ROW($G$3)=1,$F4+$D4,SUM(INDEX($D$4:$D$9,1,1):$D4,INDEX($F$4:$F$9,1,1):$F4)), \"\")\r\n\r\n        //=SUM(I$4:OFFSET(I10,0,0))\r\n\r\n        //bracket 0为运算符括号、1为函数括号\r\n        let cal1 = [],\r\n            cal2 = [],\r\n            bracket = [];\r\n        let firstSQ = -1;\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                if (str.length > 0 && bracket.length == 0) {\r\n                    str = str.toUpperCase();\r\n                    if (str.indexOf(\":\") > -1) {\r\n                        let funcArray = str.split(\":\");\r\n                        function_str +=\r\n                            \"luckysheet_getSpecialReference(true,'\" +\r\n                            $.trim(funcArray[0]).replace(/'/g, \"\\\\'\") +\r\n                            \"', luckysheet_function.\" +\r\n                            funcArray[1] +\r\n                            \".f(#lucky#\";\r\n                    } else {\r\n                        function_str += \"luckysheet_function.\" + str + \".f(\";\r\n                    }\r\n                    bracket.push(1);\r\n                    str = \"\";\r\n                } else if (bracket.length == 0) {\r\n                    function_str += \"(\";\r\n                    bracket.push(0);\r\n                    str = \"\";\r\n                } else {\r\n                    bracket.push(0);\r\n                    str += s;\r\n                }\r\n            } else if (s == \")\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                let bt = bracket.pop();\r\n\r\n                if (bracket.length == 0) {\r\n                    let functionS = _this.functionParser(str, cellRangeFunction);\r\n                    if (functionS.indexOf(\"#lucky#\") > -1) {\r\n                        functionS = functionS.replace(/#lucky#/g, \"\") + \")\";\r\n                    }\r\n                    function_str += functionS + \")\";\r\n                    str = \"\";\r\n                } else {\r\n                    str += s;\r\n                }\r\n            } else if (s == \"{\" && matchConfig.squote == 0 && matchConfig.dquote == 0) {\r\n                str += \"{\";\r\n                matchConfig.braces += 1;\r\n            } else if (s == \"}\" && matchConfig.squote == 0 && matchConfig.dquote == 0) {\r\n                str += \"}\";\r\n                matchConfig.braces -= 1;\r\n            } else if (s == '\"' && matchConfig.squote == 0) {\r\n                if (matchConfig.dquote > 0) {\r\n                    //如果是\"\"代表着输出\"\r\n                    if (i < funcstack.length - 1 && funcstack[i + 1] == '\"') {\r\n                        i++;\r\n                        str += \"\\x7F\"; //用非打印控制字符DEL替换一下\"\"\r\n                    } else {\r\n                        matchConfig.dquote -= 1;\r\n                        str += '\"';\r\n                    }\r\n                } else {\r\n                    matchConfig.dquote += 1;\r\n                    str += '\"';\r\n                }\r\n            } else if (s == \"'\" && matchConfig.dquote == 0) {\r\n                str += \"'\";\r\n\r\n                if (matchConfig.squote > 0) {\r\n                    if (firstSQ == i - 1) {\r\n                        //配对的单引号后第一个字符不能是单引号\r\n                        return \"\";\r\n                    }\r\n                    //如果是''代表着输出'\r\n                    if (i < funcstack.length - 1 && funcstack[i + 1] == \"'\") {\r\n                        i++;\r\n                        str += \"'\";\r\n                    } else {\r\n                        //如果下一个字符不是'代表单引号结束\r\n                        if (funcstack[i - 1] == \"'\") {\r\n                            //配对的单引号后最后一个字符不能是单引号\r\n                            return \"\";\r\n                        } else {\r\n                            matchConfig.squote -= 1;\r\n                        }\r\n                    }\r\n                } else {\r\n                    matchConfig.squote += 1;\r\n                    firstSQ = i;\r\n                }\r\n            } else if (s == \",\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                if (bracket.length <= 1) {\r\n                    let functionS = _this.functionParser(str, cellRangeFunction);\r\n                    if (functionS.indexOf(\"#lucky#\") > -1) {\r\n                        functionS = functionS.replace(/#lucky#/g, \"\") + \")\";\r\n                    }\r\n                    function_str += functionS + \",\";\r\n                    str = \"\";\r\n                } else {\r\n                    str += \",\";\r\n                }\r\n            } else if (\r\n                s in _this.operatorjson &&\r\n                matchConfig.squote == 0 &&\r\n                matchConfig.dquote == 0 &&\r\n                matchConfig.braces == 0\r\n            ) {\r\n                let s_next = \"\";\r\n                let op = _this.operatorPriority;\r\n\r\n                if (i + 1 < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                if (s + s_next in _this.operatorjson) {\r\n                    if (bracket.length == 0) {\r\n                        if ($.trim(str).length > 0) {\r\n                            cal2.unshift(_this.functionParser($.trim(str), cellRangeFunction));\r\n                        } else if ($.trim(function_str).length > 0) {\r\n                            cal2.unshift($.trim(function_str));\r\n                        }\r\n\r\n                        if (cal1[0] in _this.operatorjson) {\r\n                            let stackCeilPri = op[cal1[0]];\r\n\r\n                            while (cal1.length > 0 && stackCeilPri != null) {\r\n                                cal2.unshift(cal1.shift());\r\n                                stackCeilPri = op[cal1[0]];\r\n                            }\r\n                        }\r\n\r\n                        cal1.unshift(s + s_next);\r\n\r\n                        function_str = \"\";\r\n                        str = \"\";\r\n                    } else {\r\n                        str += s + s_next;\r\n                    }\r\n\r\n                    i++;\r\n                } else {\r\n                    if (bracket.length == 0) {\r\n                        if ($.trim(str).length > 0) {\r\n                            cal2.unshift(_this.functionParser($.trim(str), cellRangeFunction));\r\n                        } else if ($.trim(function_str).length > 0) {\r\n                            cal2.unshift($.trim(function_str));\r\n                        }\r\n\r\n                        if (cal1[0] in _this.operatorjson) {\r\n                            let stackCeilPri = op[cal1[0]];\r\n                            stackCeilPri = stackCeilPri == null ? 1000 : stackCeilPri;\r\n\r\n                            let sPri = op[s];\r\n                            sPri = sPri == null ? 1000 : sPri;\r\n\r\n                            while (cal1.length > 0 && sPri >= stackCeilPri) {\r\n                                cal2.unshift(cal1.shift());\r\n\r\n                                stackCeilPri = op[cal1[0]];\r\n                                stackCeilPri = stackCeilPri == null ? 1000 : stackCeilPri;\r\n                            }\r\n                        }\r\n\r\n                        // 修复类似=1--1、=1---1、=1+--+1--1这类连续+-混合写法计算结果和wps和office不一致的bug, by @kdevilpf 2023-10-08\r\n                        for (ls = i + 1; ls < funcstack.length; ls++) {\r\n                            if ([\"--\", \"++\"].includes(s + funcstack[ls])) {\r\n                                s = \"+\";\r\n                            } else if ([\"-+\", \"+-\"].includes(s + funcstack[ls])) {\r\n                                s = \"-\";\r\n                            } else {\r\n                                if (ls > i + 1) {\r\n                                    i = ls - 1;\r\n                                }\r\n                                break;\r\n                            }\r\n                        }\r\n\r\n                        cal1.unshift(s);\r\n\r\n                        function_str = \"\";\r\n                        str = \"\";\r\n                    } else {\r\n                        str += s;\r\n                    }\r\n                }\r\n            } else {\r\n                if (matchConfig.dquote == 0 && matchConfig.squote == 0) {\r\n                    // str += $.trim(s);\r\n                    str += s; //Do not use $.trim(s). When obtaining the worksheet name that contains spaces, you should keep the spaces\r\n                } else {\r\n                    str += s;\r\n                }\r\n            }\r\n\r\n            if (i == funcstack.length - 1) {\r\n                let endstr = \"\";\r\n                let str_nb = $.trim(str).replace(/'/g, \"\\\\'\");\r\n                if (_this.iscelldata(str_nb) && str_nb.substr(0, 1) != \":\") {\r\n                    endstr = \"luckysheet_getcelldata('\" + str_nb + \"')\";\r\n                    if (typeof cellRangeFunction == \"function\") {\r\n                        cellRangeFunction(str_nb);\r\n                    }\r\n                } else if (str_nb.substr(0, 1) == \":\") {\r\n                    str_nb = str_nb.substr(1);\r\n                    if (_this.iscelldata(str_nb)) {\r\n                        endstr = \"luckysheet_getSpecialReference(false,\" + function_str + \",'\" + str_nb + \"')\";\r\n                    }\r\n                } else {\r\n                    str = $.trim(str);\r\n\r\n                    let regx = /{.*?}/;\r\n                    if (regx.test(str) && str.substr(0, 1) != '\"' && str.substr(str.length - 1, 1) != '\"') {\r\n                        let arraytxt = regx.exec(str)[0];\r\n                        let arraystart = str.search(regx);\r\n                        let alltxt = \"\";\r\n\r\n                        if (arraystart > 0) {\r\n                            endstr += str.substr(0, arraystart);\r\n                        }\r\n\r\n                        endstr += \"luckysheet_getarraydata('\" + arraytxt + \"')\";\r\n\r\n                        if (arraystart + arraytxt.length < str.length) {\r\n                            endstr += str.substr(arraystart + arraytxt.length, str.length);\r\n                        }\r\n                    } else {\r\n                        endstr = str;\r\n                    }\r\n                }\r\n\r\n                if (endstr.length > 0) {\r\n                    cal2.unshift(endstr);\r\n                }\r\n\r\n                if (cal1.length > 0) {\r\n                    if (function_str.length > 0) {\r\n                        cal2.unshift(function_str);\r\n                        function_str = \"\";\r\n                    }\r\n\r\n                    while (cal1.length > 0) {\r\n                        cal2.unshift(cal1.shift());\r\n                    }\r\n                }\r\n\r\n                if (cal2.length > 0) {\r\n                    function_str = _this.calPostfixExpression(cal2);\r\n                } else {\r\n                    function_str += endstr;\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n        // console.log(function_str);\r\n        return function_str;\r\n    },\r\n    insertUpdateDynamicArray: function(dynamicArrayItem) {\r\n        let r = dynamicArrayItem.r,\r\n            c = dynamicArrayItem.c,\r\n            index = dynamicArrayItem.index;\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n        let file = luckysheetfile[getSheetIndex(index)];\r\n\r\n        let dynamicArray = file.dynamicArray;\r\n        if (dynamicArray == null) {\r\n            dynamicArray = [];\r\n        }\r\n\r\n        for (let i = 0; i < dynamicArray.length; i++) {\r\n            let calc = dynamicArray[i];\r\n            if (calc.r == r && calc.c == c && calc.index == index) {\r\n                calc.data = dynamicArrayItem.data;\r\n                calc.f = dynamicArrayItem.f;\r\n                return dynamicArray;\r\n            }\r\n        }\r\n\r\n        dynamicArray.push(dynamicArrayItem);\r\n        return dynamicArray;\r\n    },\r\n    addFunctionGroup: function(r, c, func, index) {\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n        let file = luckysheetfile[getSheetIndex(index)];\r\n        if (file.calcChain == null) {\r\n            file.calcChain = [];\r\n        }\r\n\r\n        let cc = {\r\n            r: r,\r\n            c: c,\r\n            index: index,\r\n            func: func,\r\n        };\r\n        file.calcChain.push(cc);\r\n\r\n        server.saveParam(\"fc\", index, JSON.stringify(cc), {\r\n            op: \"add\",\r\n            pos: file.calcChain.length - 1,\r\n        });\r\n        setluckysheetfile(luckysheetfile);\r\n    },\r\n    getAllFunctionGroup: function() {\r\n        let luckysheetfile = getluckysheetfile();\r\n        let ret = [];\r\n        for (let i = 0; i < luckysheetfile.length; i++) {\r\n            let file = luckysheetfile[i];\r\n            let calcChain = file.calcChain;\r\n\r\n            /* 备注：再次加载表格获取的数据可能是JSON字符串格式(需要进行发序列化处理) */\r\n            if (calcChain) {\r\n                let tempCalcChain = [];\r\n                calcChain.forEach((item, idx) => {\r\n                    if (typeof item === \"string\") {\r\n                        tempCalcChain.push(JSON.parse(item));\r\n                    } else {\r\n                        tempCalcChain.push(item);\r\n                    }\r\n                });\r\n                calcChain = file.calcChain = tempCalcChain;\r\n            }\r\n\r\n            let dynamicArray_compute = file.dynamicArray_compute;\r\n            if (calcChain == null) {\r\n                calcChain = [];\r\n            }\r\n\r\n            if (dynamicArray_compute == null) {\r\n                dynamicArray_compute = [];\r\n            }\r\n\r\n            ret = ret.concat(calcChain);\r\n\r\n            for (let i = 0; i < dynamicArray_compute.length; i++) {\r\n                let d = dynamicArray_compute[0];\r\n                ret.push({\r\n                    r: d.r,\r\n                    c: d.c,\r\n                    index: d.index,\r\n                });\r\n            }\r\n        }\r\n\r\n        return ret;\r\n    },\r\n    getFunctionGroup: function(index) {\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n        let file = luckysheetfile[getSheetIndex(index)];\r\n\r\n        if (file.calcChain == null) {\r\n            return [];\r\n        }\r\n\r\n        return file.calcChain;\r\n    },\r\n    updateFunctionGroup: function(r, c, index) {\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n        let file = luckysheetfile[getSheetIndex(index)];\r\n\r\n        let calcChain = file.calcChain;\r\n        if (calcChain != null) {\r\n            for (let i = 0; i < calcChain.length; i++) {\r\n                let calc = calcChain[i];\r\n                if (calc.r == r && calc.c == c && calc.index == index) {\r\n                    server.saveParam(\"fc\", index, JSON.stringify(calc), {\r\n                        op: \"update\",\r\n                        pos: i,\r\n                    });\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        setluckysheetfile(luckysheetfile);\r\n    },\r\n    insertUpdateFunctionGroup: function(r, c, index) {\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        // let func = getcellFormula(r, c, index);\r\n        // if (func == null || func.length==0) {\r\n        //     this.delFunctionGroup(r, c, index);\r\n        //     return;\r\n        // }\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n        let file = luckysheetfile[getSheetIndex(index)];\r\n\r\n        let calcChain = file.calcChain;\r\n        if (calcChain == null) {\r\n            calcChain = [];\r\n        }\r\n\r\n        for (let i = 0; i < calcChain.length; i++) {\r\n            let calc = calcChain[i];\r\n            if (calc.r == r && calc.c == c && calc.index == index) {\r\n                server.saveParam(\"fc\", index, JSON.stringify(calc), {\r\n                    op: \"update\",\r\n                    pos: i,\r\n                });\r\n                return;\r\n            }\r\n        }\r\n\r\n        let cc = {\r\n            r: r,\r\n            c: c,\r\n            index: index,\r\n        };\r\n        calcChain.push(cc);\r\n        file.calcChain = calcChain;\r\n\r\n        server.saveParam(\"fc\", index, JSON.stringify(cc), {\r\n            op: \"add\",\r\n            pos: file.calcChain.length - 1,\r\n        });\r\n        setluckysheetfile(luckysheetfile);\r\n    },\r\n    isFunctionRangeSave: false,\r\n    isFunctionRangeSimple: function(txt, r, c, index, dynamicArray_compute) {\r\n        if (txt == null || txt.length == 0) {\r\n            return;\r\n        }\r\n\r\n        let txtArray = txt.split(/==|!=|<>|<=|>=|[,()=+-\\/*%&^><]/g);\r\n        if (txtArray.length > 0) {\r\n            for (let i = 0; i < txtArray.length; i++) {\r\n                let t = txtArray[i];\r\n                if (t.length <= 1) {\r\n                    continue;\r\n                }\r\n\r\n                if (t.substr(0, 1) == '\"' && t.substr(t.length - 1, 1) == '\"') {\r\n                    continue;\r\n                }\r\n\r\n                this.isFunctionRangeSaveChange(t, r, c, index, dynamicArray_compute);\r\n            }\r\n        }\r\n    },\r\n    isFunctionRangeSimple1: function(txt, r, c, index, dynamicArray_compute) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\",\r\n            ispassby = true;\r\n\r\n        let matchConfig = {\r\n            bracket: 0,\r\n            comma: 0,\r\n            squote: 0,\r\n            dquote: 0,\r\n        };\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.dquote == 0) {\r\n                matchConfig.bracket += 1;\r\n\r\n                if (str.length > 0) {\r\n                    function_str += \"luckysheet_function.\" + str.toUpperCase() + \".f(\";\r\n                } else {\r\n                    function_str += \"(\";\r\n                }\r\n\r\n                str = \"\";\r\n            } else if (s == \")\" && matchConfig.dquote == 0) {\r\n                matchConfig.bracket -= 1;\r\n                function_str += _this.isFunctionRangeSimple(str, r, c, index, dynamicArray_compute) + \")\";\r\n                str = \"\";\r\n            } else if (s == \",\" && matchConfig.dquote == 0) {\r\n                //matchConfig.comma += 1;\r\n                function_str += _this.isFunctionRangeSimple(str, r, c, index, dynamicArray_compute) + \",\";\r\n                str = \"\";\r\n            } else if (s in _this.operatorjson && matchConfig.dquote == 0) {\r\n                let s_next = \"\";\r\n\r\n                if (i + 1 < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                if (s + s_next in _this.operatorjson) {\r\n                    if (str.length > 0) {\r\n                        function_str +=\r\n                            _this.isFunctionRangeSimple(str, r, c, index, dynamicArray_compute) + s + s_next;\r\n                        str = \"\";\r\n                    } else {\r\n                        function_str += s + s_next;\r\n                    }\r\n\r\n                    i++;\r\n                } else {\r\n                    if (str.length > 0) {\r\n                        function_str += _this.isFunctionRangeSimple(str, r, c, index, dynamicArray_compute) + s;\r\n                        str = \"\";\r\n                    } else {\r\n                        function_str += s;\r\n                    }\r\n                }\r\n            } else {\r\n                str += s;\r\n            }\r\n\r\n            if (i == funcstack.length - 1) {\r\n                if (_this.iscelldata($.trim(str))) {\r\n                    _this.isFunctionRangeSaveChange(str, r, c, index, dynamicArray_compute);\r\n                    // if (r != null && c != null) {\r\n\r\n                    //     let range = _this.getcellrange($.trim(str));\r\n                    //     let row = range.row,\r\n                    //         col = range.column;\r\n\r\n                    //     if ((r + \"_\" + c) in dynamicArray_compute) {\r\n                    //         let isd_range = false;\r\n\r\n                    //         for (let d_r = row[0]; d_r <= row[1]; d_r++) {\r\n                    //             for (let d_c = col[0]; d_c <= col[1]; d_c++) {\r\n                    //                 if ((d_r + \"_\" + d_c) in dynamicArray_compute && dynamicArray_compute[d_r + \"_\" + d_c].r == r && dynamicArray_compute[d_r + \"_\" + d_c].c == c) {\r\n                    //                     isd_range = true;\r\n                    //                 }\r\n                    //             }\r\n                    //         }\r\n\r\n                    //         if (isd_range) {\r\n                    //             _this.isFunctionRangeSave = _this.isFunctionRangeSave || true;\r\n                    //         }\r\n                    //         else {\r\n                    //             _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n                    //         }\r\n                    //     }\r\n                    //     else {\r\n                    //         if (r >= row[0] && r <= row[1] && c >= col[0] && c <= col[1]) {\r\n                    //             _this.isFunctionRangeSave = _this.isFunctionRangeSave || true;\r\n                    //         }\r\n                    //         else {\r\n                    //             _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n                    //         }\r\n                    //     }\r\n                    // }\r\n                    // else {\r\n                    //     let sheetlen = $.trim(str).split(\"!\");\r\n\r\n                    //     if (sheetlen.length > 1) {\r\n                    //         _this.isFunctionRangeSave = _this.isFunctionRangeSave || true;\r\n                    //     }\r\n                    //     else {\r\n                    //         _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n                    //     }\r\n                    // }\r\n                } else {\r\n                    //console.log(str);\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n        //console.log(function_str);\r\n        return function_str;\r\n    },\r\n    isFunctionRangeSelect: function(txt, r, c, index, dynamicArray_compute) {\r\n        if (txt == null || txt == \"\") {\r\n            return;\r\n        }\r\n\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n        if (dynamicArray_compute == null) {\r\n            dynamicArray_compute = {};\r\n        }\r\n        let _this = this;\r\n        let txt1 = txt.toUpperCase();\r\n        let isOffsetFunc =\r\n            txt1.indexOf(\"INDIRECT(\") > -1 || txt1.indexOf(\"OFFSET(\") > -1 || txt1.indexOf(\"INDEX(\") > -1;\r\n        if (txt in this.formulaContainCellList) {\r\n            let cellList = this.formulaContainCellList[txt];\r\n            if (isOffsetFunc) {\r\n                let isoff = cellList[\"__LuckyisOff__\"];\r\n                if (isoff == true) {\r\n                    for (let cellStr in cellList) {\r\n                        if (cellStr == \"__LuckyisOff__\") {\r\n                            continue;\r\n                        }\r\n                        this.isFunctionRangeSaveChange(cellStr, r, c, index, dynamicArray_compute);\r\n                    }\r\n                } else {\r\n                    this.isFunctionRange(txt, r, c, index, dynamicArray_compute, function(str) {\r\n                        _this.addToCellList(txt, str);\r\n                    });\r\n                    cellList[\"__LuckyisOff__\"] = true;\r\n                }\r\n            } else {\r\n                for (let cellStr in cellList) {\r\n                    if (cellStr == \"__LuckyisOff__\") {\r\n                        continue;\r\n                    }\r\n                    this.isFunctionRangeSaveChange(cellStr, r, c, index, dynamicArray_compute);\r\n                }\r\n            }\r\n\r\n            return;\r\n        }\r\n\r\n        if (isOffsetFunc) {\r\n            this.isFunctionRange(txt, r, c, index, dynamicArray_compute);\r\n        } else {\r\n            this.isFunctionRangeSimple(txt, r, c, index, dynamicArray_compute);\r\n        }\r\n    },\r\n    isFunctionRange: function(txt, r, c, index, dynamicArray_compute, cellRangeFunction) {\r\n        let _this = this;\r\n\r\n        if (_this.operatorjson == null) {\r\n            let arr = _this.operator.split(\"|\"),\r\n                op = {};\r\n\r\n            for (let i = 0; i < arr.length; i++) {\r\n                op[arr[i].toString()] = 1;\r\n            }\r\n\r\n            _this.operatorjson = op;\r\n        }\r\n\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            txt = txt.substr(1);\r\n        }\r\n\r\n        let funcstack = txt.split(\"\");\r\n        let i = 0,\r\n            str = \"\",\r\n            function_str = \"\",\r\n            ispassby = true;\r\n\r\n        let matchConfig = {\r\n            bracket: 0,\r\n            comma: 0,\r\n            squote: 0,\r\n            dquote: 0,\r\n            compare: 0,\r\n            braces: 0,\r\n        };\r\n\r\n        // let luckysheetfile = getluckysheetfile();\r\n        // let dynamicArray_compute = luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray_compute\"] == null ? {} : luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray_compute\"];\r\n\r\n        //bracket 0为运算符括号、1为函数括号\r\n        let cal1 = [],\r\n            cal2 = [],\r\n            bracket = [];\r\n        let firstSQ = -1;\r\n        while (i < funcstack.length) {\r\n            let s = funcstack[i];\r\n\r\n            if (s == \"(\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                if (str.length > 0 && bracket.length == 0) {\r\n                    str = str.toUpperCase();\r\n                    if (str.indexOf(\":\") > -1) {\r\n                        let funcArray = str.split(\":\");\r\n                        function_str +=\r\n                            \"luckysheet_getSpecialReference(true,'\" +\r\n                            $.trim(funcArray[0]).replace(/'/g, \"\\\\'\") +\r\n                            \"', luckysheet_function.\" +\r\n                            funcArray[1] +\r\n                            \".f(#lucky#\";\r\n                    } else {\r\n                        function_str += \"luckysheet_function.\" + str + \".f(\";\r\n                    }\r\n                    bracket.push(1);\r\n                    str = \"\";\r\n                } else if (bracket.length == 0) {\r\n                    function_str += \"(\";\r\n                    bracket.push(0);\r\n                    str = \"\";\r\n                } else {\r\n                    bracket.push(0);\r\n                    str += s;\r\n                }\r\n            } else if (s == \")\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                let bt = bracket.pop();\r\n\r\n                if (bracket.length == 0) {\r\n                    // function_str += _this.isFunctionRange(str,r,c, index,dynamicArray_compute,cellRangeFunction) + \")\";\r\n                    // str = \"\";\r\n\r\n                    let functionS = _this.isFunctionRange(str, r, c, index, dynamicArray_compute, cellRangeFunction);\r\n                    if (functionS.indexOf(\"#lucky#\") > -1) {\r\n                        functionS = functionS.replace(/#lucky#/g, \"\") + \")\";\r\n                    }\r\n                    function_str += functionS + \")\";\r\n                    str = \"\";\r\n                } else {\r\n                    str += s;\r\n                }\r\n            } else if (s == \"{\" && matchConfig.squote == 0 && matchConfig.dquote == 0) {\r\n                str += \"{\";\r\n                matchConfig.braces += 1;\r\n            } else if (s == \"}\" && matchConfig.squote == 0 && matchConfig.dquote == 0) {\r\n                str += \"}\";\r\n                matchConfig.braces -= 1;\r\n            } else if (s == '\"' && matchConfig.squote == 0) {\r\n                if (matchConfig.dquote > 0) {\r\n                    //如果是\"\"代表着输出\"\r\n                    if (i < funcstack.length - 1 && funcstack[i + 1] == '\"') {\r\n                        i++;\r\n                        str += \"\\x7F\"; //用DEL替换一下\"\"\r\n                    } else {\r\n                        matchConfig.dquote -= 1;\r\n                        str += '\"';\r\n                    }\r\n                } else {\r\n                    matchConfig.dquote += 1;\r\n                    str += '\"';\r\n                }\r\n            } else if (s == \"'\" && matchConfig.dquote == 0) {\r\n                str += \"'\";\r\n\r\n                if (matchConfig.squote > 0) {\r\n                    //if (firstSQ == i - 1)//配对的单引号后第一个字符不能是单引号\r\n                    //{\r\n                    //    代码到了此处应该是公式错误\r\n                    //}\r\n                    //如果是''代表着输出'\r\n                    if (i < funcstack.length - 1 && funcstack[i + 1] == \"'\") {\r\n                        i++;\r\n                        str += \"'\";\r\n                    } else {\r\n                        //如果下一个字符不是'代表单引号结束\r\n                        //if (funcstack[i - 1] == \"'\") {//配对的单引号后最后一个字符不能是单引号\r\n                        //    代码到了此处应该是公式错误\r\n                        //} else {\r\n                        matchConfig.squote -= 1;\r\n                        //}\r\n                    }\r\n                } else {\r\n                    matchConfig.squote += 1;\r\n                    firstSQ = i;\r\n                }\r\n            } else if (s == \",\" && matchConfig.squote == 0 && matchConfig.dquote == 0 && matchConfig.braces == 0) {\r\n                if (bracket.length <= 1) {\r\n                    // function_str += _this.isFunctionRange(str, r, c, index,dynamicArray_compute,cellRangeFunction) + \",\";\r\n                    // str = \"\";\r\n\r\n                    let functionS = _this.isFunctionRange(str, r, c, index, dynamicArray_compute, cellRangeFunction);\r\n                    if (functionS.indexOf(\"#lucky#\") > -1) {\r\n                        functionS = functionS.replace(/#lucky#/g, \"\") + \")\";\r\n                    }\r\n                    function_str += functionS + \",\";\r\n                    str = \"\";\r\n                } else {\r\n                    str += \",\";\r\n                }\r\n            } else if (\r\n                s in _this.operatorjson &&\r\n                matchConfig.squote == 0 &&\r\n                matchConfig.dquote == 0 &&\r\n                matchConfig.braces == 0\r\n            ) {\r\n                let s_next = \"\";\r\n                let op = _this.operatorPriority;\r\n\r\n                if (i + 1 < funcstack.length) {\r\n                    s_next = funcstack[i + 1];\r\n                }\r\n\r\n                if (s + s_next in _this.operatorjson) {\r\n                    if (bracket.length == 0) {\r\n                        if ($.trim(str).length > 0) {\r\n                            cal2.unshift(\r\n                                _this.isFunctionRange(\r\n                                    $.trim(str),\r\n                                    r,\r\n                                    c,\r\n                                    index,\r\n                                    dynamicArray_compute,\r\n                                    cellRangeFunction,\r\n                                ),\r\n                            );\r\n                        } else if ($.trim(function_str).length > 0) {\r\n                            cal2.unshift($.trim(function_str));\r\n                        }\r\n\r\n                        if (cal1[0] in _this.operatorjson) {\r\n                            let stackCeilPri = op[cal1[0]];\r\n\r\n                            while (cal1.length > 0 && stackCeilPri != null) {\r\n                                cal2.unshift(cal1.shift());\r\n                                stackCeilPri = op[cal1[0]];\r\n                            }\r\n                        }\r\n\r\n                        cal1.unshift(s + s_next);\r\n\r\n                        function_str = \"\";\r\n                        str = \"\";\r\n                    } else {\r\n                        str += s + s_next;\r\n                    }\r\n\r\n                    i++;\r\n                } else {\r\n                    if (bracket.length == 0) {\r\n                        if ($.trim(str).length > 0) {\r\n                            cal2.unshift(\r\n                                _this.isFunctionRange(\r\n                                    $.trim(str),\r\n                                    r,\r\n                                    c,\r\n                                    index,\r\n                                    dynamicArray_compute,\r\n                                    cellRangeFunction,\r\n                                ),\r\n                            );\r\n                        } else if ($.trim(function_str).length > 0) {\r\n                            cal2.unshift($.trim(function_str));\r\n                        }\r\n\r\n                        if (cal1[0] in _this.operatorjson) {\r\n                            let stackCeilPri = op[cal1[0]];\r\n                            stackCeilPri = stackCeilPri == null ? 1000 : stackCeilPri;\r\n\r\n                            let sPri = op[s];\r\n                            sPri = sPri == null ? 1000 : sPri;\r\n\r\n                            while (cal1.length > 0 && sPri >= stackCeilPri) {\r\n                                cal2.unshift(cal1.shift());\r\n\r\n                                stackCeilPri = op[cal1[0]];\r\n                                stackCeilPri = stackCeilPri == null ? 1000 : stackCeilPri;\r\n                            }\r\n                        }\r\n\r\n                        cal1.unshift(s);\r\n\r\n                        function_str = \"\";\r\n                        str = \"\";\r\n                    } else {\r\n                        str += s;\r\n                    }\r\n                }\r\n            } else {\r\n                if (matchConfig.dquote == 0 && matchConfig.squote == 0) {\r\n                    str += $.trim(s);\r\n                } else {\r\n                    str += s;\r\n                }\r\n            }\r\n\r\n            if (i == funcstack.length - 1) {\r\n                let endstr = \"\";\r\n                let str_nb = $.trim(str).replace(/'/g, \"\\\\'\");\r\n                if (_this.iscelldata(str_nb) && str_nb.substr(0, 1) != \":\") {\r\n                    // endstr = \"luckysheet_getcelldata('\" + $.trim(str) + \"')\";\r\n                    endstr = \"luckysheet_getcelldata('\" + str_nb + \"')\";\r\n                    _this.isFunctionRangeSaveChange(str, r, c, index, dynamicArray_compute);\r\n                } else if (str_nb.substr(0, 1) == \":\") {\r\n                    str_nb = str_nb.substr(1);\r\n                    if (_this.iscelldata(str_nb)) {\r\n                        endstr = \"luckysheet_getSpecialReference(false,\" + function_str + \",'\" + str_nb + \"')\";\r\n                    }\r\n                } else {\r\n                    str = $.trim(str);\r\n\r\n                    let regx = /{.*?}/;\r\n                    if (regx.test(str) && str.substr(0, 1) != '\"' && str.substr(str.length - 1, 1) != '\"') {\r\n                        let arraytxt = regx.exec(str)[0];\r\n                        let arraystart = str.search(regx);\r\n                        let alltxt = \"\";\r\n\r\n                        if (arraystart > 0) {\r\n                            endstr += str.substr(0, arraystart);\r\n                        }\r\n\r\n                        endstr += \"luckysheet_getarraydata('\" + arraytxt + \"')\";\r\n\r\n                        if (arraystart + arraytxt.length < str.length) {\r\n                            endstr += str.substr(arraystart + arraytxt.length, str.length);\r\n                        }\r\n                    } else {\r\n                        endstr = str;\r\n                    }\r\n                }\r\n\r\n                if (endstr.length > 0) {\r\n                    cal2.unshift(endstr);\r\n                }\r\n\r\n                if (cal1.length > 0) {\r\n                    if (function_str.length > 0) {\r\n                        cal2.unshift(function_str);\r\n                        function_str = \"\";\r\n                    }\r\n\r\n                    while (cal1.length > 0) {\r\n                        cal2.unshift(cal1.shift());\r\n                    }\r\n                }\r\n\r\n                if (cal2.length > 0) {\r\n                    function_str = _this.calPostfixExpression(cal2);\r\n                } else {\r\n                    function_str += endstr;\r\n                }\r\n            }\r\n\r\n            i++;\r\n        }\r\n        // console.log(function_str);\r\n        _this.checkSpecialFunctionRange(function_str, r, c, index, dynamicArray_compute, cellRangeFunction);\r\n        return function_str;\r\n    },\r\n    isFunctionRangeSaveChange: function(str, r, c, index, dynamicArray_compute) {\r\n        let _this = this;\r\n        if (r != null && c != null) {\r\n            let range = _this.getcellrange($.trim(str), index);\r\n            if (range == null) {\r\n                return;\r\n            }\r\n            let row = range.row,\r\n                col = range.column,\r\n                sheetIndex = range.sheetIndex;\r\n\r\n            if (r + \"_\" + c in dynamicArray_compute && (index == sheetIndex || index == null)) {\r\n                let isd_range = false;\r\n\r\n                for (let d_r = row[0]; d_r <= row[1]; d_r++) {\r\n                    for (let d_c = col[0]; d_c <= col[1]; d_c++) {\r\n                        if (\r\n                            d_r + \"_\" + d_c in dynamicArray_compute &&\r\n                            dynamicArray_compute[d_r + \"_\" + d_c].r == r &&\r\n                            dynamicArray_compute[d_r + \"_\" + d_c].c == c\r\n                        ) {\r\n                            isd_range = true;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (isd_range) {\r\n                    _this.isFunctionRangeSave = _this.isFunctionRangeSave || true;\r\n                } else {\r\n                    _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n                }\r\n            } else {\r\n                if (\r\n                    r >= row[0] &&\r\n                    r <= row[1] &&\r\n                    c >= col[0] &&\r\n                    c <= col[1] &&\r\n                    (index == sheetIndex || index == null)\r\n                ) {\r\n                    _this.isFunctionRangeSave = _this.isFunctionRangeSave || true;\r\n                } else {\r\n                    _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n                }\r\n            }\r\n        } else {\r\n            _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n            // let sheetlen = $.trim(str).split(\"!\");\r\n\r\n            // if (sheetlen.length > 1) {\r\n            //     _this.isFunctionRangeSave = _this.isFunctionRangeSave || true;//if change sheet, it must be true, but this is very slow\r\n            // }\r\n            // else {\r\n            //     _this.isFunctionRangeSave = _this.isFunctionRangeSave || false;\r\n            // }\r\n        }\r\n    },\r\n    checkSpecialFunctionRange: function(function_str, r, c, index, dynamicArray_compute, cellRangeFunction) {\r\n        if (\r\n            function_str.substr(0, 30) == \"luckysheet_getSpecialReference\" ||\r\n            function_str.substr(0, 20) == \"luckysheet_function.\"\r\n        ) {\r\n            if (function_str.substr(0, 20) == \"luckysheet_function.\") {\r\n                let funcName = function_str.split(\".\")[1];\r\n                if (funcName != null) {\r\n                    funcName = funcName.toUpperCase();\r\n                    if (funcName != \"INDIRECT\" && funcName != \"OFFSET\" && funcName != \"INDEX\") {\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n            try {\r\n                Store.calculateSheetIndex = index;\r\n                let str = new Function(\"return \" + function_str)();\r\n\r\n                if (str instanceof Object && str.startCell != null) {\r\n                    str = str.startCell;\r\n                }\r\n                let str_nb = $.trim(str);\r\n                // console.log(function_str, tempFunc,str, this.iscelldata(str_nb),this.isFunctionRangeSave,r,c);\r\n                if (this.iscelldata(str_nb)) {\r\n                    if (typeof cellRangeFunction == \"function\") {\r\n                        cellRangeFunction(str_nb);\r\n                    }\r\n                    // this.isFunctionRangeSaveChange(str, r, c, index, dynamicArray_compute);\r\n                    // console.log(function_str, str, this.isFunctionRangeSave,r,c);\r\n                }\r\n            } catch {}\r\n        }\r\n\r\n        // if (function_str.substr(0, 20) == \"luckysheet_function.\") {\r\n        //     let funcName = function_str.split(\".\")[1];\r\n        //     if (funcName != null) {\r\n        //         funcName = funcName.toUpperCase();\r\n        //         if (funcName == \"INDIRECT\") {\r\n        //             let tempFunc = \"luckysheet_indirect_check\" + function_str.substr(30, function_str.length);\r\n\r\n        //             //tempFunc = tempFunc.replace(/luckysheet_getcelldata/g, \"luckysheet_indirect_check_return\");\r\n\r\n        //             try {\r\n        //                 Store.calculateSheetIndex = index;\r\n        //                 let str = eval(tempFunc);\r\n\r\n        //                 if(str instanceof Object && str.data!=null){\r\n        //                     str = str.data.v;\r\n        //                 }\r\n        //                 let str_nb = $.trim(str);\r\n        //                 // console.log(function_str, tempFunc,str, this.iscelldata(str_nb),this.isFunctionRangeSave,r,c);\r\n        //                 if (this.iscelldata(str_nb)) {\r\n        //                     if(typeof(cellRangeFunction)==\"function\"){\r\n        //                         cellRangeFunction(str_nb);\r\n        //                     }\r\n        //                     this.isFunctionRangeSaveChange(str, r, c, index, dynamicArray_compute);\r\n        //                     // console.log(function_str, str, this.isFunctionRangeSave,r,c);\r\n        //                 }\r\n        //             }\r\n        //             catch{\r\n\r\n        //             }\r\n\r\n        //         }\r\n        //         else if (funcName == \"OFFSET\") {\r\n        //             let tempFunc = \"luckysheet_offset_check\" + function_str.substr(28, function_str.length);\r\n\r\n        //             try {\r\n        //                 Store.calculateSheetIndex = index;\r\n        //                 let str = eval(tempFunc);\r\n        //                 if(str instanceof Object && str.data!=null){\r\n        //                     str = str.data.v;\r\n        //                 }\r\n        //                 let str_nb = $.trim(str);\r\n        //                 if (this.iscelldata(str_nb)) {\r\n        //                     if(typeof(cellRangeFunction)==\"function\"){\r\n        //                         cellRangeFunction(str_nb);\r\n        //                     }\r\n        //                     this.isFunctionRangeSaveChange(str, r, c, index,dynamicArray_compute);\r\n        //                     //console.log(function_str, str, this.isFunctionRangeSave,r,c);\r\n        //                 }\r\n        //             }\r\n        //             catch{\r\n\r\n        //             }\r\n        //             //let result = eval(function_str);\r\n\r\n        //             //console.log(function_str, result);\r\n        //         }\r\n        //     }\r\n\r\n        // }\r\n    },\r\n    execvertex: {},\r\n    execFunctionGroupData: null,\r\n    execFunctionExist: null,\r\n    formulaContainSheetList: {},\r\n    formulaContainCellList: {},\r\n    cellTextToIndexList: {},\r\n    addToCellList: function(formulaTxt, cellstring) {\r\n        if (formulaTxt == null || formulaTxt.length == 0 || cellstring == null || cellstring.length == 0) {\r\n            return;\r\n        }\r\n        if (this.formulaContainCellList == null) {\r\n            this.formulaContainCellList = {};\r\n        }\r\n\r\n        // formulaTxt = formulaTxt.toUpperCase();\r\n        if (this.formulaContainCellList[formulaTxt] == null) {\r\n            this.formulaContainCellList[formulaTxt] = {};\r\n        }\r\n\r\n        this.formulaContainCellList[formulaTxt][cellstring] = 1;\r\n    },\r\n    addToCellIndexList: function(txt, infoObj) {\r\n        if (txt == null || txt.length == 0 || infoObj == null) {\r\n            return;\r\n        }\r\n        if (this.cellTextToIndexList == null) {\r\n            this.cellTextToIndexList = {};\r\n        }\r\n\r\n        if (txt.indexOf(\"!\") > -1) {\r\n            txt = txt.replace(/\\\\'/g, \"'\").replace(/''/g, \"'\");\r\n            this.cellTextToIndexList[txt] = infoObj;\r\n        } else {\r\n            this.cellTextToIndexList[txt + \"_\" + infoObj.sheetIndex] = infoObj;\r\n        }\r\n\r\n        // console.log(this.cellTextToIndexList);\r\n    },\r\n    addToSheetIndexList: function(formulaTxt, sheetIndex, obIndex) {\r\n        if (formulaTxt == null || formulaTxt.length == 0) {\r\n            return;\r\n        }\r\n\r\n        if (sheetIndex == null || sheetIndex.length == 0) {\r\n            sheetIndex = Store.currentSheetIndex;\r\n        }\r\n\r\n        if (obIndex == null || obIndex.length == 0) {\r\n            obIndex = \"\";\r\n        }\r\n\r\n        if (this.formulaContainSheetList == null) {\r\n            this.formulaContainSheetList = {};\r\n        }\r\n\r\n        if (this.formulaContainSheetList[formulaTxt] == null) {\r\n            this.formulaContainSheetList[formulaTxt] = {};\r\n        }\r\n\r\n        this.formulaContainSheetList[formulaTxt][sheetIndex] = obIndex;\r\n    },\r\n    execFunctionGlobalData: {},\r\n    execFunctionGroupForce: function(isForce) {\r\n        if (isForce) {\r\n            this.execFunctionGroup(undefined, undefined, undefined, undefined, undefined, true);\r\n        } else {\r\n            this.execFunctionGroup();\r\n        }\r\n    },\r\n    execFunctionGroup: function(origin_r, origin_c, value, index, data, isForce = false) {\r\n        let _this = this;\r\n\r\n        if (data == null) {\r\n            data = Store.flowdata;\r\n        }\r\n\r\n        if (!window.luckysheet_compareWith) {\r\n            window.luckysheet_compareWith = luckysheet_compareWith;\r\n            window.luckysheet_getarraydata = luckysheet_getarraydata;\r\n            window.luckysheet_getcelldata = luckysheet_getcelldata;\r\n            window.luckysheet_parseData = luckysheet_parseData;\r\n            window.luckysheet_getValue = luckysheet_getValue;\r\n            window.luckysheet_indirect_check = luckysheet_indirect_check;\r\n            window.luckysheet_indirect_check_return = luckysheet_indirect_check_return;\r\n            window.luckysheet_offset_check = luckysheet_offset_check;\r\n            window.luckysheet_calcADPMM = luckysheet_calcADPMM;\r\n            window.luckysheet_getSpecialReference = luckysheet_getSpecialReference;\r\n        }\r\n\r\n        if (_this.execFunctionGlobalData == null) {\r\n            _this.execFunctionGlobalData = {};\r\n        }\r\n        // let luckysheetfile = getluckysheetfile();\r\n        // let dynamicArray_compute = luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray_compute\"] == null ? {} : luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray_compute\"];\r\n\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        if (value != null) {\r\n            //此处setcellvalue 中this.execFunctionGroupData会保存想要更新的值，本函数结尾不要设为null,以备后续函数使用\r\n            // setcellvalue(origin_r, origin_c, _this.execFunctionGroupData, value);\r\n            let cellCache = [[{ v: null }]];\r\n            setcellvalue(0, 0, cellCache, value);\r\n            _this.execFunctionGlobalData[origin_r + \"_\" + origin_c + \"_\" + index] = cellCache[0][0];\r\n        }\r\n\r\n        //{ \"r\": r, \"c\": c, \"index\": index, \"func\": func}\r\n        let calcChains = _this.getAllFunctionGroup(),\r\n            formulaObjects = {};\r\n\r\n        let sheets = getluckysheetfile();\r\n        let sheetData = {};\r\n        for (let i = 0; i < sheets.length; i++) {\r\n            let sheet = sheets[i];\r\n            sheetData[sheet.index] = sheet.data;\r\n        }\r\n\r\n        //把修改涉及的单元格存储为对象\r\n        let updateValueOjects = {},\r\n            updateValueArray = [];\r\n        if (_this.execFunctionExist == null) {\r\n            let key = \"r\" + origin_r + \"c\" + origin_c + \"i\" + index;\r\n            updateValueOjects[key] = 1;\r\n        } else {\r\n            for (let x = 0; x < _this.execFunctionExist.length; x++) {\r\n                let cell = _this.execFunctionExist[x];\r\n                let key = \"r\" + cell.r + \"c\" + cell.c + \"i\" + cell.i;\r\n                updateValueOjects[key] = 1;\r\n            }\r\n        }\r\n\r\n        let arrayMatchCache = {};\r\n        let arrayMatch = function(formulaArray, formulaObjects, updateValueOjects, func) {\r\n            for (let a = 0; a < formulaArray.length; a++) {\r\n                let range = formulaArray[a];\r\n                let cacheKey =\r\n                    \"r\" +\r\n                    range.row[0] +\r\n                    \"\" +\r\n                    range.row[1] +\r\n                    \"c\" +\r\n                    range.column[0] +\r\n                    \"\" +\r\n                    range.column[1] +\r\n                    \"index\" +\r\n                    range.sheetIndex;\r\n                if (cacheKey in arrayMatchCache) {\r\n                    let amc = arrayMatchCache[cacheKey];\r\n                    // console.log(amc);\r\n                    amc.forEach((item) => {\r\n                        func(item.key, item.r, item.c, item.sheetIndex);\r\n                    });\r\n                } else {\r\n                    let functionArr = [];\r\n                    for (let r = range.row[0]; r <= range.row[1]; r++) {\r\n                        for (let c = range.column[0]; c <= range.column[1]; c++) {\r\n                            let key = \"r\" + r + \"c\" + c + \"i\" + range.sheetIndex;\r\n                            func(key, r, c, range.sheetIndex);\r\n                            if (\r\n                                (formulaObjects && key in formulaObjects) ||\r\n                                (updateValueOjects && key in updateValueOjects)\r\n                            ) {\r\n                                functionArr.push({\r\n                                    key: key,\r\n                                    r: r,\r\n                                    c: c,\r\n                                    sheetIndex: range.sheetIndex,\r\n                                });\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (formulaObjects || updateValueOjects) {\r\n                        arrayMatchCache[cacheKey] = functionArr;\r\n                    }\r\n                }\r\n            }\r\n        };\r\n\r\n        let existsChildFormulaMatch = {},\r\n            ii = 0;\r\n\r\n        //创建公式缓存及其范围的缓存\r\n        // console.time(\"1\");\r\n        for (let i = 0; i < calcChains.length; i++) {\r\n            let formulaCell = calcChains[i];\r\n            let key = \"r\" + formulaCell.r + \"c\" + formulaCell.c + \"i\" + formulaCell.index;\r\n            let calc_funcStr = getcellFormula(formulaCell.r, formulaCell.c, formulaCell.index);\r\n            if (calc_funcStr == null) {\r\n                continue;\r\n            }\r\n            let txt1 = calc_funcStr.toUpperCase();\r\n            let isOffsetFunc =\r\n                txt1.indexOf(\"INDIRECT(\") > -1 || txt1.indexOf(\"OFFSET(\") > -1 || txt1.indexOf(\"INDEX(\") > -1;\r\n            let formulaArray = [];\r\n\r\n            if (isOffsetFunc) {\r\n                this.isFunctionRange(calc_funcStr, null, null, formulaCell.index, null, function(str_nb) {\r\n                    let range = _this.getcellrange($.trim(str_nb), formulaCell.index);\r\n                    if (range != null) {\r\n                        formulaArray.push(range);\r\n                    }\r\n                });\r\n            } else if (!(calc_funcStr.substr(0, 2) == '=\"' && calc_funcStr.substr(calc_funcStr.length - 1, 1) == '\"')) {\r\n                //let formulaTextArray = calc_funcStr.split(/==|!=|<>|<=|>=|[,()=+-\\/*%&^><]/g);//无法正确分割单引号或双引号之间有==、!=、-等运算符的情况。导致如='1-2'!A1公式中表名1-2的A1单元格内容更新后，公式的值不更新的bug\r\n                //解决='1-2'!A1+5会被calc_funcStr.split(/==|!=|<>|<=|>=|[,()=+-\\/*%&^><]/g)分割成[\"\",\"'1\",\"2'!A1\",5]的错误情况\r\n                let point = 0; //指针\r\n                let squote = -1; //双引号\r\n                let dquote = -1; //单引号\r\n                let formulaTextArray = [];\r\n                let sq_end_array = []; //保存了配对的单引号在formulaTextArray的index索引。\r\n                let calc_funcStr_length = calc_funcStr.length;\r\n                for (let i = 0; i < calc_funcStr_length; i++) {\r\n                    let char = calc_funcStr.charAt(i);\r\n                    if (char == \"'\" && dquote == -1) {\r\n                        //如果是单引号开始\r\n                        if (squote == -1) {\r\n                            if (point != i) {\r\n                                formulaTextArray.push(\r\n                                    ...calc_funcStr.substring(point, i).split(/==|!=|<>|<=|>=|[,()=+-\\/*%&\\^><]/),\r\n                                );\r\n                            }\r\n                            squote = i;\r\n                            point = i;\r\n                        } //单引号结束\r\n                        else {\r\n                            //if (squote == i - 1)//配对的单引号后第一个字符不能是单引号\r\n                            //{\r\n                            //    ;//到此处说明公式错误\r\n                            //}\r\n                            //如果是''代表着输出'\r\n                            if (i < calc_funcStr_length - 1 && calc_funcStr.charAt(i + 1) == \"'\") {\r\n                                i++;\r\n                            } else {\r\n                                //如果下一个字符不是'代表单引号结束\r\n                                //if (calc_funcStr.charAt(i - 1) == \"'\") {//配对的单引号后最后一个字符不能是单引号\r\n                                //    ;//到此处说明公式错误\r\n                                point = i + 1;\r\n                                formulaTextArray.push(calc_funcStr.substring(squote, point));\r\n                                sq_end_array.push(formulaTextArray.length - 1);\r\n                                squote = -1;\r\n                                //} else {\r\n                                //    point = i + 1;\r\n                                //    formulaTextArray.push(calc_funcStr.substring(squote, point));\r\n                                //    sq_end_array.push(formulaTextArray.length - 1);\r\n                                //    squote = -1;\r\n                                //}\r\n                            }\r\n                        }\r\n                    }\r\n                    if (char == '\"' && squote == -1) {\r\n                        //如果是双引号开始\r\n                        if (dquote == -1) {\r\n                            if (point != i) {\r\n                                formulaTextArray.push(\r\n                                    ...calc_funcStr.substring(point, i).split(/==|!=|<>|<=|>=|[,()=+-\\/*%&\\^><]/),\r\n                                );\r\n                            }\r\n                            dquote = i;\r\n                            point = i;\r\n                        } else {\r\n                            //如果是\"\"代表着输出\"\r\n                            if (i < calc_funcStr_length - 1 && calc_funcStr.charAt(i + 1) == '\"') {\r\n                                i++;\r\n                            } else {\r\n                                //双引号结束\r\n                                point = i + 1;\r\n                                formulaTextArray.push(calc_funcStr.substring(dquote, point));\r\n                                dquote = -1;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                if (point != calc_funcStr_length) {\r\n                    formulaTextArray.push(\r\n                        ...calc_funcStr.substring(point, calc_funcStr_length).split(/==|!=|<>|<=|>=|[,()=+-\\/*%&\\^><]/),\r\n                    );\r\n                }\r\n                //拼接所有配对单引号及之后一个单元格内容，例如[\"'1-2'\",\"!A1\"]拼接为[\"'1-2'!A1\"]\r\n                for (let i = sq_end_array.length - 1; i >= 0; i--) {\r\n                    if (sq_end_array[i] != formulaTextArray.length - 1) {\r\n                        formulaTextArray[sq_end_array[i]] =\r\n                            formulaTextArray[sq_end_array[i]] + formulaTextArray[sq_end_array[i] + 1];\r\n                        formulaTextArray.splice(sq_end_array[i] + 1, 1);\r\n                    }\r\n                }\r\n                //至此=SUM('1-2'!A1:A2&\"'1-2'!A2\")由原来的[\"\",\"SUM\",\"'1\",\"2'!A1:A2\",\"\",\"\"'1\",\"2'!A2\"\"]更正为[\"\",\"SUM\",\"\",\"'1-2'!A1:A2\",\"\",\"\",\"\"'1-2'!A2\"\"]\r\n\r\n                for (let i = 0; i < formulaTextArray.length; i++) {\r\n                    let t = formulaTextArray[i];\r\n                    if (t.length <= 1) {\r\n                        continue;\r\n                    }\r\n\r\n                    if (t.substr(0, 1) == '\"' && t.substr(t.length - 1, 1) == '\"' && !_this.iscelldata(t)) {\r\n                        continue;\r\n                    }\r\n\r\n                    let range = _this.getcellrange($.trim(t), formulaCell.index);\r\n\r\n                    if (range == null) {\r\n                        continue;\r\n                    }\r\n\r\n                    formulaArray.push(range);\r\n                }\r\n            }\r\n\r\n            let item = {\r\n                formulaArray: formulaArray,\r\n                calc_funcStr: calc_funcStr,\r\n                key: key,\r\n                r: formulaCell.r,\r\n                c: formulaCell.c,\r\n                index: formulaCell.index,\r\n                parents: {},\r\n                chidren: {},\r\n                color: \"w\",\r\n            };\r\n\r\n            formulaObjects[key] = item;\r\n\r\n            // if(isForce){\r\n            //     updateValueArray.push(item);\r\n            // }\r\n            // else{\r\n            //     arrayMatch(formulaArray, null, function(key){\r\n            //         if(key in updateValueOjects){\r\n            //             updateValueArray.push(item);\r\n            //         }\r\n            //     });\r\n            // }\r\n        }\r\n\r\n        // console.timeEnd(\"1\");\r\n\r\n        // console.time(\"2\");\r\n        //形成一个公式之间引用的图结构\r\n        Object.keys(formulaObjects).forEach((key) => {\r\n            let formulaObject = formulaObjects[key];\r\n            arrayMatch(formulaObject.formulaArray, formulaObjects, updateValueOjects, function(childKey) {\r\n                if (childKey in formulaObjects) {\r\n                    let childFormulaObject = formulaObjects[childKey];\r\n                    formulaObject.chidren[childKey] = 1;\r\n                    childFormulaObject.parents[key] = 1;\r\n                }\r\n                // console.log(childKey,formulaObject.formulaArray);\r\n                if (!isForce && childKey in updateValueOjects) {\r\n                    updateValueArray.push(formulaObject);\r\n                }\r\n            });\r\n\r\n            if (isForce) {\r\n                updateValueArray.push(formulaObject);\r\n            }\r\n        });\r\n\r\n        // console.log(formulaObjects)\r\n        // console.timeEnd(\"2\");\r\n\r\n        // console.time(\"3\");\r\n        let formulaRunList = [];\r\n        //计算，采用深度优先遍历公式形成的图结构\r\n\r\n        // updateValueArray.forEach((key)=>{\r\n        //     let formulaObject = formulaObjects[key];\r\n\r\n        // });\r\n\r\n        let stack = updateValueArray,\r\n            existsFormulaRunList = {};\r\n        while (stack.length > 0) {\r\n            let formulaObject = stack.pop();\r\n\r\n            if (formulaObject == null || formulaObject.key in existsFormulaRunList) {\r\n                continue;\r\n            }\r\n\r\n            if (formulaObject.color == \"b\") {\r\n                formulaRunList.push(formulaObject);\r\n                existsFormulaRunList[formulaObject.key] = 1;\r\n                continue;\r\n            }\r\n\r\n            let cacheStack = [];\r\n            Object.keys(formulaObject.parents).forEach((parentKey) => {\r\n                let parentFormulaObject = formulaObjects[parentKey];\r\n                if (parentFormulaObject != null) {\r\n                    cacheStack.push(parentFormulaObject);\r\n                }\r\n            });\r\n\r\n            ii++;\r\n\r\n            if (cacheStack.length == 0) {\r\n                formulaRunList.push(formulaObject);\r\n                existsFormulaRunList[formulaObject.key] = 1;\r\n            } else {\r\n                formulaObject.color = \"b\";\r\n                stack.push(formulaObject);\r\n                stack = stack.concat(cacheStack);\r\n            }\r\n        }\r\n\r\n        formulaRunList.reverse();\r\n\r\n        // console.log(formulaObjects, ii)\r\n        // console.timeEnd(\"3\");\r\n\r\n        // console.time(\"4\");\r\n        for (let i = 0; i < formulaRunList.length; i++) {\r\n            let formulaCell = formulaRunList[i];\r\n            if (formulaCell.level == Math.max) {\r\n                continue;\r\n            }\r\n\r\n            window.luckysheet_getcelldata_cache = null;\r\n            let calc_funcStr = formulaCell.calc_funcStr;\r\n\r\n            let v = _this.execfunction(calc_funcStr, formulaCell.r, formulaCell.c, formulaCell.index);\r\n\r\n            _this.groupValuesRefreshData.push({\r\n                r: formulaCell.r,\r\n                c: formulaCell.c,\r\n                v: v[1],\r\n                f: v[2],\r\n                spe: v[3],\r\n                index: formulaCell.index,\r\n            });\r\n\r\n            // _this.execFunctionGroupData[u.r][u.c] = value;\r\n            _this.execFunctionGlobalData[formulaCell.r + \"_\" + formulaCell.c + \"_\" + formulaCell.index] = {\r\n                v: v[1],\r\n                f: v[2],\r\n            };\r\n        }\r\n        // console.log(formulaRunList);\r\n        // console.timeEnd(\"4\");\r\n\r\n        _this.execFunctionExist = null;\r\n    },\r\n    // When set origin_r and origin_c, that mean just refresh cell value link to [origin_r,origin_c] cell\r\n    execFunctionGroup1: function(origin_r, origin_c, value, index, data, isForce = false) {\r\n        let _this = this;\r\n\r\n        if (data == null) {\r\n            data = Store.flowdata;\r\n        }\r\n\r\n        if (!window.luckysheet_compareWith) {\r\n            window.luckysheet_compareWith = luckysheet_compareWith;\r\n            window.luckysheet_getarraydata = luckysheet_getarraydata;\r\n            window.luckysheet_getcelldata = luckysheet_getcelldata;\r\n            window.luckysheet_parseData = luckysheet_parseData;\r\n            window.luckysheet_getValue = luckysheet_getValue;\r\n            window.luckysheet_indirect_check = luckysheet_indirect_check;\r\n            window.luckysheet_indirect_check_return = luckysheet_indirect_check_return;\r\n            window.luckysheet_offset_check = luckysheet_offset_check;\r\n            window.luckysheet_calcADPMM = luckysheet_calcADPMM;\r\n            window.luckysheet_getSpecialReference = luckysheet_getSpecialReference;\r\n        }\r\n\r\n        if (_this.execFunctionGlobalData == null) {\r\n            _this.execFunctionGlobalData = {};\r\n        }\r\n        let luckysheetfile = getluckysheetfile();\r\n        let dynamicArray_compute =\r\n            luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray_compute\"] == null\r\n                ? {}\r\n                : luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray_compute\"];\r\n\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        if (value != null) {\r\n            //此处setcellvalue 中this.execFunctionGroupData会保存想要更新的值，本函数结尾不要设为null,以备后续函数使用\r\n            // setcellvalue(origin_r, origin_c, _this.execFunctionGroupData, value);\r\n            let cellCache = [[{ v: null }]];\r\n            setcellvalue(0, 0, cellCache, value);\r\n            _this.execFunctionGlobalData[origin_r + \"_\" + origin_c + \"_\" + index] = cellCache[0][0];\r\n        }\r\n\r\n        //{ \"r\": r, \"c\": c, \"index\": index, \"func\": func}\r\n        let group = _this.getAllFunctionGroup(),\r\n            vertex1 = {},\r\n            stack = [],\r\n            count = 0;\r\n\r\n        _this.execvertex = {};\r\n        if (_this.execFunctionExist == null) {\r\n            for (let i = 0; i < group.length; i++) {\r\n                let item = group[i];\r\n                let file = luckysheetfile[getSheetIndex(item[\"index\"])];\r\n                if (file == null) {\r\n                    continue;\r\n                }\r\n                let cell = file.data[item.r][item.c];\r\n                let calc_funcStr = getcellFormula(item.r, item.c, item.index);\r\n                if (cell != null && cell.f != null && cell.f == calc_funcStr) {\r\n                    if (!(item instanceof Object)) {\r\n                        item = new Function(\"return \" + item)();\r\n                    }\r\n\r\n                    item.color = \"w\";\r\n                    item.parent = null;\r\n                    item.chidren = {};\r\n                    item.times = 0;\r\n\r\n                    vertex1[\"r\" + item.r + \"c\" + item.c + \"i\" + item.index] = item;\r\n                    _this.isFunctionRangeSave = false;\r\n\r\n                    if (isForce) {\r\n                        _this.isFunctionRangeSave = true;\r\n                    } else if (origin_r != null && origin_c != null) {\r\n                        _this.isFunctionRangeSelect(calc_funcStr, origin_r, origin_c, index, dynamicArray_compute);\r\n                    }\r\n                    // else {\r\n                    //     _this.isFunctionRangeSelect(calc_funcStr, undefined, undefined ,dynamicArray_compute);\r\n                    // }\r\n\r\n                    if (_this.isFunctionRangeSave) {\r\n                        stack.push(item);\r\n                        _this.execvertex[\"r\" + item.r + \"c\" + item.c + \"i\" + item.index] = item;\r\n                        count++;\r\n                    }\r\n                }\r\n            }\r\n        } else {\r\n            for (let x = 0; x < _this.execFunctionExist.length; x++) {\r\n                let cell = _this.execFunctionExist[x];\r\n\r\n                if (\"r\" + cell.r + \"c\" + cell.c + \"i\" + cell.i in vertex1) {\r\n                    continue;\r\n                }\r\n\r\n                for (let i = 0; i < group.length; i++) {\r\n                    let item = group[i];\r\n                    let calc_funcStr = getcellFormula(item.r, item.c, item.index);\r\n                    item.color = \"w\";\r\n                    item.parent = null;\r\n                    item.chidren = {};\r\n                    item.times = 0;\r\n\r\n                    vertex1[\"r\" + item.r + \"c\" + item.c + \"i\" + item.index] = item;\r\n                    _this.isFunctionRangeSave = false;\r\n                    if (isForce) {\r\n                        _this.isFunctionRangeSave = true;\r\n                    } else {\r\n                        _this.isFunctionRangeSelect(calc_funcStr, cell.r, cell.c, cell.i, dynamicArray_compute);\r\n                    }\r\n\r\n                    if (_this.isFunctionRangeSave) {\r\n                        stack.push(item);\r\n                        _this.execvertex[\"r\" + item.r + \"c\" + item.c + \"i\" + item.index] = item;\r\n                        count++;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // console.time(\"1\");\r\n        // console.log(group.length);\r\n        // let iii = 0, ii=0;\r\n        //先进先出法，构建逆向执行结构树\r\n        while (stack.length > 0) {\r\n            let u = stack.shift();\r\n            let excludeList = {};\r\n            _this.getChildrenVertex(u, vertex1, excludeList);\r\n            // ii++;\r\n            // console.log(JSON.stringify(excludeList));\r\n            for (let name in vertex1) {\r\n                let item = vertex1[name];\r\n                if (item == null) {\r\n                    continue;\r\n                }\r\n\r\n                let ukey = \"r\" + u.r + \"c\" + u.c + \"i\" + u.index;\r\n\r\n                // if ((u.r == item.r && u.c == item.c && u.index == item.index) ) {\r\n                //     continue;\r\n                // }\r\n\r\n                if (name in excludeList) {\r\n                    continue;\r\n                }\r\n\r\n                _this.isFunctionRangeSave = false;\r\n\r\n                let calc_funcStr = getcellFormula(item.r, item.c, item.index);\r\n                _this.isFunctionRangeSelect(calc_funcStr, u.r, u.c, u.index, dynamicArray_compute);\r\n\r\n                // iii++;\r\n\r\n                if (_this.isFunctionRangeSave) {\r\n                    if (!(name in _this.execvertex)) {\r\n                        // console.log(JSON.stringify(item), JSON.stringify(u), _this.isFunctionRangeSave);\r\n\r\n                        stack.push(item);\r\n                        _this.execvertex[name] = item;\r\n                    }\r\n\r\n                    count++;\r\n                    _this.execvertex[name].chidren[ukey] = 1;\r\n                }\r\n            }\r\n        }\r\n        // console.log(iii, ii);\r\n        // console.timeEnd(\"1\");\r\n\r\n        // console.time(\"2\");\r\n        _this.groupValuesRefreshData = [];\r\n        let i = 0;\r\n\r\n        while (i < count) {\r\n            for (let name in _this.execvertex) {\r\n                let u = _this.execvertex[name];\r\n\r\n                if (u.color == \"w\") {\r\n                    _this.functionDFS(u);\r\n                } else if (u.color == \"b\") {\r\n                    i++;\r\n                }\r\n            }\r\n        }\r\n        // console.timeEnd(\"2\");\r\n\r\n        _this.execFunctionExist = null;\r\n    },\r\n    //递归得到引用节点\r\n    getChildrenVertex: function(u, vertex1, obj) {\r\n        let ukey = \"r\" + u.r + \"c\" + u.c + \"i\" + u.index;\r\n        obj[ukey] = 1;\r\n        if (u.chidren != null) {\r\n            for (let key in u.chidren) {\r\n                if (vertex1[key] && !(key in obj)) {\r\n                    this.getChildrenVertex(vertex1[key], vertex1, obj);\r\n                }\r\n            }\r\n        }\r\n    },\r\n    //深度优先算法，处理多级调用函数\r\n    functionDFS: function(u) {\r\n        let _this = this;\r\n        u.color = \"g\";\r\n        u.times += 1;\r\n        for (let chd in u.chidren) {\r\n            let v = _this.execvertex[chd];\r\n            if (v.color == \"w\") {\r\n                v.parent = \"r\" + u.r.toString() + \"c\" + u.c.toString() + \"i\" + u.index;\r\n                _this.functionDFS(v);\r\n            }\r\n        }\r\n\r\n        u.color = \"b\";\r\n        window.luckysheet_getcelldata_cache = null;\r\n        let calc_funcStr = getcellFormula(u.r, u.c, u.index);\r\n\r\n        let v = _this.execfunction(calc_funcStr, u.r, u.c, u.index);\r\n\r\n        // let value = _this.execFunctionGroupData[u.r][u.c];\r\n        // if(value == null){\r\n        //     value = {};\r\n        // }\r\n\r\n        // value.v = v[1];\r\n        // value.f = v[2];\r\n\r\n        // let cell = getOrigincell(u.r,u.c,u.index);\r\n\r\n        // let spl;\r\n        // if(v[3]!=null){\r\n        //     if(v[3].type==\"sparklines\"){\r\n        //         window.luckysheetCurrentRow = u.r;\r\n        //         window.luckysheetCurrentColumn = u.c;\r\n        //         window.luckysheetCurrentIndex = u.index;\r\n        //         window.luckysheetCurrentFunction = calc_funcStr;\r\n\r\n        //         let fp = $.trim(_this.functionParserExe(calc_funcStr));\r\n        //         let sparklines = eval(fp);\r\n        //         spl = sparklines;\r\n        //     }\r\n        // }\r\n\r\n        _this.groupValuesRefreshData.push({\r\n            r: u.r,\r\n            c: u.c,\r\n            v: v[1],\r\n            f: v[2],\r\n            spe: v[3],\r\n            index: u.index,\r\n        });\r\n\r\n        // _this.execFunctionGroupData[u.r][u.c] = value;\r\n        _this.execFunctionGlobalData[u.r + \"_\" + u.c + \"_\" + u.index] = {\r\n            v: v[1],\r\n            f: v[2],\r\n        };\r\n    },\r\n    groupValuesRefreshData: [],\r\n    groupValuesRefresh: function() {\r\n        let _this = this;\r\n        let luckysheetfile = getluckysheetfile();\r\n        if (_this.groupValuesRefreshData.length > 0) {\r\n            for (let i = 0; i < _this.groupValuesRefreshData.length; i++) {\r\n                let item = _this.groupValuesRefreshData[i];\r\n\r\n                // if(item.i != Store.currentSheetIndex){\r\n                //     continue;\r\n                // }\r\n\r\n                let file = luckysheetfile[getSheetIndex(item.index)];\r\n                let data = file.data;\r\n                if (data == null) {\r\n                    continue;\r\n                }\r\n\r\n                let updateValue = {};\r\n                if (item.spe != null) {\r\n                    if (item.spe.type == \"sparklines\") {\r\n                        updateValue.spl = item.spe.data;\r\n                    } else if (item.spe.type == \"dynamicArrayItem\") {\r\n                        file.dynamicArray = _this.insertUpdateDynamicArray(item.spe.data);\r\n                    }\r\n                }\r\n                updateValue.v = item.v;\r\n                updateValue.f = item.f;\r\n                const cell = setcellvalue(item.r, item.c, data, updateValue);\r\n                server.saveParam(\"v\", item.index, cell, {\r\n                    r: item.r,\r\n                    c: item.c,\r\n                });\r\n            }\r\n\r\n            editor.webWorkerFlowDataCache(Store.flowdata); //worker存数据\r\n            _this.groupValuesRefreshData = [];\r\n        }\r\n    },\r\n    delFunctionGroup: function(r, c, index) {\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        let luckysheetfile = getluckysheetfile();\r\n        let file = luckysheetfile[getSheetIndex(index)];\r\n\r\n        let calcChain = file.calcChain;\r\n        if (calcChain != null) {\r\n            for (let i = 0; i < calcChain.length; i++) {\r\n                let calc = calcChain[i];\r\n                if (calc.r == r && calc.c == c && calc.index == index) {\r\n                    calcChain.splice(i, 1);\r\n                    server.saveParam(\"fc\", index, null, {\r\n                        op: \"del\",\r\n                        pos: i,\r\n                    });\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        let dynamicArray = file.dynamicArray;\r\n        if (dynamicArray != null) {\r\n            for (let i = 0; i < dynamicArray.length; i++) {\r\n                let calc = dynamicArray[i];\r\n                if (calc.r == r && calc.c == c && (calc.index == null || calc.index == index)) {\r\n                    dynamicArray.splice(i, 1);\r\n                    server.saveParam(\"ac\", index, null, {\r\n                        op: \"del\",\r\n                        pos: i,\r\n                    });\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        setluckysheetfile(luckysheetfile);\r\n    },\r\n    execfunction: function(txt, r, c, index, isrefresh, notInsertFunc) {\r\n        let _this = this;\r\n\r\n        let _locale = locale();\r\n        let locale_formulaMore = _locale.formulaMore;\r\n        // console.log(txt,r,c)\r\n        if (txt.indexOf(_this.error.r) > -1) {\r\n            return [false, _this.error.r, txt];\r\n        }\r\n\r\n        if (!_this.checkBracketNum(txt)) {\r\n            txt += \")\";\r\n        }\r\n\r\n        if (index == null) {\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        Store.calculateSheetIndex = index;\r\n\r\n        let fp = $.trim(_this.functionParserExe(txt));\r\n        //console.log(fp)\r\n        if (fp.substr(0, 20) == \"luckysheet_function.\" || fp.substr(0, 22) == \"luckysheet_compareWith\") {\r\n            _this.functionHTMLIndex = 0;\r\n        }\r\n\r\n        if (!_this.testFunction(txt, fp) || fp == \"\") {\r\n            tooltip.info(\"\", locale_formulaMore.execfunctionError);\r\n            return [false, _this.error.n, txt];\r\n        }\r\n\r\n        let result = null;\r\n        window.luckysheetCurrentRow = r;\r\n        window.luckysheetCurrentColumn = c;\r\n        window.luckysheetCurrentIndex = index;\r\n        window.luckysheetCurrentFunction = txt;\r\n\r\n        let sparklines = null;\r\n\r\n        try {\r\n            if (fp.indexOf(\"luckysheet_getcelldata\") > -1) {\r\n                let funcg = fp.split(\"luckysheet_getcelldata('\");\r\n\r\n                for (let i = 1; i < funcg.length; i++) {\r\n                    let funcgStr = funcg[i].split(\"')\")[0];\r\n                    let funcgRange = _this.getcellrange(funcgStr);\r\n\r\n                    if (!funcgRange || funcgRange.row[0] < 0 || funcgRange.column[0] < 0) {\r\n                        return [true, _this.error.r, txt];\r\n                    }\r\n\r\n                    if (\r\n                        funcgRange.sheetIndex == Store.calculateSheetIndex &&\r\n                        r >= funcgRange.row[0] &&\r\n                        r <= funcgRange.row[1] &&\r\n                        c >= funcgRange.column[0] &&\r\n                        c <= funcgRange.column[1]\r\n                    ) {\r\n                        if (isEditMode()) {\r\n                            alert(locale_formulaMore.execfunctionSelfError);\r\n                        } else {\r\n                            tooltip.info(\"\", locale_formulaMore.execfunctionSelfErrorResult);\r\n                        }\r\n\r\n                        return [false, 0, txt];\r\n                    }\r\n                }\r\n            }\r\n\r\n            result = new Function(\"return \" + fp)();\r\n            if (typeof result == \"string\") {\r\n                //把之前的非打印控制字符DEL替换回一个双引号。\r\n                result = result.replace(/\\x7F/g, '\"');\r\n            }\r\n\r\n            //加入sparklines的参数项目\r\n            if (fp.indexOf(\"SPLINES\") > -1) {\r\n                sparklines = result;\r\n                result = \"\";\r\n            }\r\n        } catch (e) {\r\n            let err = e;\r\n            //err错误提示处理\r\n            console.log(e, fp);\r\n            err = _this.errorInfo(err);\r\n            result = [_this.error.n, err];\r\n        }\r\n\r\n        //公式结果是对象，则表示只是选区。如果是单个单元格，则返回其值；如果是多个单元格，则返回 #VALUE!。\r\n        if (getObjType(result) == \"object\" && result.startCell != null) {\r\n            if (getObjType(result.data) == \"array\") {\r\n                result = _this.error.v;\r\n            } else {\r\n                if (getObjType(result.data) == \"object\" && !isRealNull(result.data.v)) {\r\n                    result = result.data.v;\r\n                } else if (!isRealNull(result.data)) {\r\n                    //只有data长或宽大于1才可能是选区\r\n                    // =INDIRECT(\"I2\") 计算结果为 result.data = \"J2\"\r\n                    if (result.cell > 1 || result.rowl > 1 || getObjType(result.data) == \"string\" || getObjType(result.data) == \"number\") {\r\n                        result = result.data;\r\n                    } // 否则就是单个不为null的没有值v的单元格\r\n                    else {\r\n                        result = 0;\r\n                    }\r\n                } else {\r\n                    result = 0;\r\n                }\r\n            }\r\n        }\r\n\r\n        //公式结果是数组，分错误值 和 动态数组 两种情况\r\n        let dynamicArrayItem = null;\r\n\r\n        if (getObjType(result) == \"array\") {\r\n            let isErr = false;\r\n\r\n            if (getObjType(result[0]) != \"array\" && result.length == 2) {\r\n                isErr = valueIsError(result[0]);\r\n            }\r\n\r\n            if (!isErr) {\r\n                if (getObjType(result[0]) == \"array\" && result.length == 1 && result[0].length == 1) {\r\n                    result = result[0][0];\r\n                } else {\r\n                    dynamicArrayItem = { r: r, c: c, f: txt, index: index, data: result };\r\n                    result = \"\";\r\n                }\r\n            } else {\r\n                result = result[0];\r\n            }\r\n        }\r\n\r\n        window.luckysheetCurrentRow = null;\r\n        window.luckysheetCurrentColumn = null;\r\n        window.luckysheetCurrentIndex = null;\r\n        window.luckysheetCurrentFunction = null;\r\n\r\n        if (r != null && c != null) {\r\n            if (isrefresh) {\r\n                _this.execFunctionGroup(r, c, result, index);\r\n            }\r\n\r\n            if (!notInsertFunc) {\r\n                _this.insertUpdateFunctionGroup(r, c, index);\r\n            }\r\n        }\r\n\r\n        if (!!sparklines) {\r\n            return [true, result, txt, { type: \"sparklines\", data: sparklines }];\r\n        }\r\n\r\n        if (!!dynamicArrayItem) {\r\n            return [true, result, txt, { type: \"dynamicArrayItem\", data: dynamicArrayItem }];\r\n        }\r\n\r\n        // console.log(result, txt);\r\n\r\n        return [true, result, txt];\r\n    },\r\n    testFunction: function(txt, fp) {\r\n        if (txt.substr(0, 1) == \"=\") {\r\n            return true;\r\n        } else {\r\n            return false;\r\n        }\r\n    },\r\n    //供function/functionImplementation.js的EVALUATE函数调用。\r\n    execstringformula: function(txt, r, c, index) {\r\n        let _this = this;\r\n        return this.execfunction(txt, r, c, index);\r\n    },\r\n    functionResizeData: {},\r\n    functionResizeStatus: false,\r\n    functionResizeTimeout: null,\r\n    data_parm_index: 0, //选择公式后参数索引标记\r\n\r\n    // 点中指定的公式，展示刷新按钮\r\n    cellFocus:function(row_index, col_index) {\r\n        const file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n        if(file.calcChain){\r\n            let txt = ''\r\n            file.calcChain?.find(({ r, c, func }) => {\r\n                if(r === row_index && c === col_index){\r\n                    txt = Store.flowdata[r][c]?.f;\r\n                    return true\r\n                }\r\n            });\r\n            if(txt.indexOf('=GET_AIRTABLE_DATA') === 0){\r\n                this.showButton(row_index, col_index)\r\n                this.addButtonListener(txt,row_index, col_index,)\r\n            }else{\r\n                this.hideButton()\r\n            }\r\n        }\r\n\r\n        \r\n    },\r\n    addButtonListener:function(txt, r, c){\r\n        let listener =  $(\"#luckysheet-formula-refresh\").data(\"listener\")\r\n\r\n        if(!listener){\r\n            console.info('listener')\r\n            $(\"#luckysheet-formula-refresh\").data(\"listener\",\"true\")\r\n            $(\"#luckysheet-formula-refresh\").on('click',(e)=>{\r\n                this.execFunctionGroupForce(true);\r\n                jfrefreshgrid()\r\n                e.stopPropagation();\r\n            })\r\n        }\r\n        \r\n    },\r\n    showButton: function(r, c) {\r\n\r\n        let _this = this;\r\n\r\n        let row = Store.visibledatarow[r],\r\n            row_pre = r == 0 ? 0 : Store.visibledatarow[r - 1];\r\n        let col = Store.visibledatacolumn[c],\r\n            col_pre = c == 0 ? 0 : Store.visibledatacolumn[c - 1];\r\n\r\n        let margeset = menuButton.mergeborer(Store.flowdata, r, c);\r\n        if(!!margeset){\r\n            row = margeset.row[1];\r\n            row_pre = margeset.row[0];\r\n            \r\n            col = margeset.column[1];\r\n            col_pre = margeset.column[0];\r\n        }\r\n\r\n        $(\"#luckysheet-formula-refresh\").show().css({\r\n            'max-width': col - col_pre,\r\n            'max-height': row - row_pre,\r\n            'left': col - 20,\r\n            'top': row_pre + (row - row_pre - 20) / 2\r\n        })\r\n    },\r\n    hideButton: function() {\r\n        $(\"#luckysheet-formula-refresh\").hide()\r\n    }\r\n};\r\n\r\nexport default luckysheetformula;\r\n"
  },
  {
    "path": "src/global/func_methods.js",
    "content": "import { getObjType } from '../utils/util';\r\nimport { isRealNum, isRealNull, valueIsError } from './validate';\r\nimport { update } from './format';\r\nimport formula from './formula';\r\nimport dayjs from \"dayjs\";\r\n\r\nconst error = {\r\n    v: \"#VALUE!\",    //错误的参数或运算符\r\n    n: \"#NAME?\",     //公式名称错误\r\n    na: \"#N/A\",      //函数或公式中没有可用数值\r\n    r: \"#REF!\",      //删除了由其他公式引用的单元格\r\n    d: \"#DIV/0!\",    //除数是0或空单元格\r\n    nm: \"#NUM!\",     //当公式或函数中某个数字有问题时\r\n    nl: \"#NULL!\",    //交叉运算符（空格）使用不正确\r\n    sp: \"#SPILL!\"    //数组范围有其它值\r\n}\r\n\r\nconst func_methods = {\r\n    //单元格数据生成一维数组\r\n    getCellDataArr: function(rangeObj, nullCellType, isNeglectNullCell){\r\n        let dataArr = [];\r\n\r\n        if(rangeObj.data == null){\r\n            if(!isNeglectNullCell){\r\n                if(nullCellType === \"number\"){\r\n                    dataArr.push(0);\r\n                }\r\n                else if(nullCellType === \"text\"){\r\n                    dataArr.push(\"\");\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            if(getObjType(rangeObj.data) === \"array\"){\r\n                for(let i = 0; i < rangeObj.data.length; i++){\r\n                    for(let j = 0; j < rangeObj.data[i].length; j++){\r\n                        let cell = rangeObj.data[i][j];\r\n                        let value = cell\r\n\r\n                        if(getObjType(cell) === 'object'){\r\n                            value = cell.v\r\n                        }\r\n\r\n                        if(value == null ){\r\n                            if(!isNeglectNullCell){\r\n                                if(nullCellType === \"number\"){\r\n                                    value = 0;\r\n                                }\r\n                                else if(nullCellType === \"text\"){\r\n                                    value = '';\r\n                                }\r\n\r\n                                dataArr.push(value);\r\n                            }\r\n                        }\r\n                        else{\r\n                            dataArr.push(value);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            else{\r\n                if(isRealNull(rangeObj.data.v)){\r\n                    if(!isNeglectNullCell){\r\n                        if(nullCellType == \"number\"){\r\n                            dataArr.push(0);\r\n                        }\r\n                        else if(nullCellType == \"text\"){\r\n                            dataArr.push(\"\");\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    dataArr.push(rangeObj.data.v);\r\n                }\r\n            }\r\n        }\r\n\r\n        return dataArr;\r\n    },\r\n    //单元格数据生成二维数组\r\n    getCellDataDyadicArr: function(rangeObj, nullCellType){\r\n        let dataArr = [];\r\n\r\n        if(rangeObj.data == null){\r\n            let rowArr = [];\r\n\r\n            if(nullCellType == \"number\"){\r\n                rowArr.push(0);\r\n            }\r\n            else if(nullCellType == \"text\"){\r\n                rowArr.push(\"\");\r\n            }\r\n\r\n            dataArr.push(rowArr);\r\n        }\r\n        else{\r\n            if(getObjType(rangeObj.data) == \"array\"){\r\n                for(let i = 0; i < rangeObj.data.length; i++){\r\n                    let rowArr = [];\r\n\r\n                    for(let j = 0; j < rangeObj.data[i].length; j++){\r\n                        let cell = rangeObj.data[i][j];\r\n                        let value = cell;\r\n\r\n                        if(getObjType(cell) === 'object'){\r\n                            value = cell.v\r\n                        }\r\n\r\n                        if(value == null){\r\n                            if(nullCellType === \"number\"){\r\n                                value = 0;\r\n                            }\r\n                            else if(nullCellType === \"text\"){\r\n                                value = '';\r\n                            }\r\n                        }\r\n\r\n                        rowArr.push(value);\r\n                    }\r\n\r\n                    dataArr.push(rowArr);\r\n                }\r\n            }\r\n            else{\r\n                let rowArr = [];\r\n\r\n                let value = rangeObj.data.v;\r\n\r\n                if(isRealNull(value)){\r\n                    if(nullCellType == \"number\"){\r\n                        value = 0;\r\n                    }\r\n                    else if(nullCellType == \"text\"){\r\n                        value = \"\";\r\n                    }\r\n                }\r\n\r\n                rowArr.push(value);\r\n\r\n                dataArr.push(rowArr);\r\n            }\r\n        }\r\n\r\n        return dataArr;\r\n    },\r\n    //数组数据生成一维数组\r\n    getDataArr: function(arr, isNeglectNaN){\r\n        let dataArr = [];\r\n\r\n        if(isNeglectNaN == null){\r\n            isNeglectNaN = false;\r\n        }\r\n\r\n        if(getObjType(arr[0]) == \"array\"){\r\n            for(let i = 0; i < arr.length; i++){\r\n                for(let j = 0; j < arr[i].length; j++){\r\n                    if(isNeglectNaN && !isRealNum(arr[i][j])){\r\n                        continue;\r\n                    }\r\n\r\n                    dataArr.push(arr[i][j]);\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            for(let i = 0; i < arr.length; i++){\r\n                if(isNeglectNaN && !isRealNum(arr[i])){\r\n                    continue;\r\n                }\r\n\r\n                dataArr.push(arr[i]);\r\n            }\r\n        }\r\n\r\n        return dataArr;\r\n    },\r\n    getDataDyadicArr: function(arr){\r\n        let dataArr = [];\r\n\r\n        if(getObjType(arr[0]) == \"array\"){\r\n            for(let i = 0; i < arr.length; i++){\r\n                let rowArr = [];\r\n\r\n                for(let j = 0; j < arr[i].length; j++){\r\n                    rowArr.push(arr[i][j]);\r\n                }\r\n\r\n                dataArr.push(rowArr);\r\n            }\r\n        }\r\n        else{\r\n            let rowArr = [];\r\n\r\n            for(let i = 0; i < arr.length; i++){\r\n                rowArr.push(arr[i]);\r\n            }\r\n\r\n            dataArr.push(rowArr);\r\n        }\r\n\r\n        return dataArr;\r\n    },\r\n    //是否是规则二维数组\r\n    isDyadicArr: function(arr){\r\n        let isDyadic = true;\r\n\r\n        if(arr.length > 1){\r\n            let collen = arr[0].length;\r\n\r\n            for(let i = 1; i < arr.length; i++){\r\n                if(arr[i].length != collen){\r\n                    isDyadic = false;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        return isDyadic;\r\n    },\r\n    //获取单个单元格数据，数组第一个值\r\n    getFirstValue: function(data, nullCellType){\r\n        let _this = this;\r\n\r\n        if(nullCellType == null){\r\n            nullCellType = \"number\";\r\n        }\r\n\r\n        let value;\r\n\r\n        if(getObjType(data) == \"array\"){\r\n            if(getObjType(data[0]) == \"array\"){\r\n                if(!_this.isDyadicArr(data)){\r\n                    return error.v;\r\n                }\r\n\r\n                value = data[0][0];\r\n            }\r\n            else{\r\n                value = data[0];\r\n            }\r\n        }\r\n        else if(getObjType(data) == \"object\" && data.startCell != null){\r\n            if(data.data == null){\r\n                if(nullCellType == \"number\"){\r\n                    value = 0;\r\n                }\r\n                else if(nullCellType == \"text\"){\r\n                    value = \"\";\r\n                }\r\n            }\r\n            else{\r\n                let cell_r = window.luckysheetCurrentRow;\r\n                let cell_c = window.luckysheetCurrentColumn;\r\n\r\n                if(data.rowl == 1 && data.coll == 1){\r\n                    value = data.data;\r\n\r\n                    if(value == null || isRealNull(value.v)){\r\n                        if(nullCellType == \"number\"){\r\n                            value = 0;\r\n                        }\r\n                        else if(nullCellType == \"text\"){\r\n                            value = \"\";\r\n                        }\r\n                    }\r\n                    else{\r\n                        value = value.v;\r\n                    }\r\n                }\r\n                else{\r\n                    if(data.data[0][0].mc != null && data.data[0][0].mc.rs == data.rowl && data.data[0][0].mc.cs == data.coll){\r\n                        value = data.data[0][0];\r\n\r\n                        if(value == null || isRealNull(value.v)){\r\n                            if(nullCellType == \"number\"){\r\n                                value = 0;\r\n                            }\r\n                            else if(nullCellType == \"text\"){\r\n                                value = \"\";\r\n                            }\r\n                        }\r\n                        else{\r\n                            value = value.v;\r\n                        }\r\n                    }\r\n                    else if(data.rowl == 1 || data.coll == 1){\r\n                        let cellrange = formula.getcellrange(data.startCell);\r\n                        let str = cellrange.row[0],\r\n                            edr = str + data.rowl - 1,\r\n                            stc = cellrange.column[0],\r\n                            edc = stc + data.coll - 1;\r\n\r\n                        if(data.rowl == 1){\r\n                            if(cell_c < stc || cell_c > edc){\r\n                                return error.v;\r\n                            }\r\n\r\n                            value = data.data[0][cell_c - stc];\r\n                        }\r\n                        else if(data.coll == 1){\r\n                            if(cell_r < str || cell_r > edr){\r\n                                return error.v;\r\n                            }\r\n\r\n                            value = data.data[cell_r - str][0];\r\n                        }\r\n\r\n                        if(value == null || isRealNull(value.v) || value.mc != null){\r\n                            if(nullCellType == \"number\"){\r\n                                value = 0;\r\n                            }\r\n                            else if(nullCellType == \"text\"){\r\n                                value = \"\";\r\n                            }\r\n                        }\r\n                        else{\r\n                            value = value.v;\r\n                        }\r\n                    }\r\n                    else{\r\n                        return error.v;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            value = data;\r\n        }\r\n\r\n        return value;\r\n    },\r\n    //获取单元格的逻辑值\r\n    getCellBoolen: function(data){\r\n        let _this = this;\r\n\r\n        let cumulative = _this.getFirstValue(data);\r\n\r\n        if(valueIsError(cumulative)){\r\n            return cumulative;\r\n        }\r\n\r\n        if(getObjType(cumulative) == \"boolean\"){\r\n\r\n        }\r\n        else if(getObjType(cumulative) == \"string\" && (cumulative.toLowerCase() == \"true\" || cumulative.toLowerCase() == \"false\")){\r\n            if(cumulative.toLowerCase() == \"true\"){\r\n                cumulative = true;\r\n            }\r\n            else if(cumulative.toLowerCase() == \"false\"){\r\n                cumulative = false;\r\n            }\r\n        }\r\n        else if(isRealNum(cumulative)){\r\n            cumulative = parseFloat(cumulative);\r\n\r\n            cumulative = cumulative == 0 ? false : true;\r\n        }\r\n        else{\r\n            return error.v;\r\n        }\r\n\r\n        return cumulative;\r\n    },\r\n    //获取单元格的日期\r\n    getCellDate: function(data){\r\n        let _this = this;\r\n\r\n        let date_text;\r\n\r\n        if(getObjType(data) == \"array\"){\r\n            if(getObjType(data[0]) == \"array\"){\r\n                if(!_this.isDyadicArr(data)){\r\n                    return error.v;\r\n                }\r\n\r\n                date_text = data[0][0];\r\n            }\r\n            else{\r\n                date_text = data[0];\r\n            }\r\n        }\r\n        else if(getObjType(data) == \"object\" && data.startCell != null){\r\n            if(data.data == null || getObjType(data.data) == \"array\" || isRealNull(data.data.v)){\r\n                return error.v;\r\n            }\r\n\r\n            date_text = data.data.v;\r\n\r\n            if(data.data.ct != null && data.data.ct.t == \"d\"){\r\n                date_text = update(\"YYYY-MM-DD h:mm:ss\", date_text);\r\n            }\r\n        }\r\n        else{\r\n            date_text = data;\r\n        }\r\n\r\n        return date_text;\r\n    },\r\n    getCellrangeDate: function(data){\r\n        let _this = this;\r\n\r\n        let date = [];\r\n\r\n        if(getObjType(data) == \"array\"){\r\n            if(getObjType(data[0]) == \"array\" && !_this.isDyadicArr(data)){\r\n                return error.v;\r\n            }\r\n\r\n            date = date.concat(_this.getDataArr(data, false));\r\n        }\r\n        else if(getObjType(data) == \"object\" && data.startCell != null){\r\n            if(data.data == null){\r\n                date.push(0);\r\n            }\r\n            else{\r\n                if(getObjType(data.data) == \"array\"){\r\n                    for(let i = 0; i < data.data.length; i++){\r\n                        for(let j = 0; j < data.data[i].length; j++){\r\n                            if(data.data[i][j] != null && !isRealNull(data.data[i][j].v)){\r\n                                let value = data.data[i][j].v;\r\n\r\n                                if(data.data[i][j].ct != null && data.data[i][j].ct.t == \"d\"){\r\n                                    value = update(\"YYYY-MM-DD h:mm:ss\", value);\r\n                                }\r\n\r\n                                date.push(value);\r\n                            }\r\n                            else{\r\n                                date.push(0);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                else{\r\n                    let value = data.data.v;\r\n\r\n                    if(data.data.ct != null && data.data.ct.t == \"d\"){\r\n                        value = update(\"YYYY-MM-DD h:mm:ss\", value);\r\n                    }\r\n\r\n                    date.push(value);\r\n                }\r\n            }\r\n        }\r\n        else{\r\n            date.push(data);\r\n        }\r\n\r\n        return date;\r\n    },\r\n    //获取正则字符串（处理 . * ? ~* ~?）\r\n    getRegExpStr: function(str){\r\n        return str.replace(\"~*\", \"\\\\*\").replace(\"~?\", \"\\\\?\").replace(\".\", \"\\\\.\").replace(\"*\", \".*\").replace(\"?\", \".\");\r\n    },\r\n    //阶乘\r\n    factorial: function(num){\r\n        if (num == 0 || num == 1) {\r\n            return 1;\r\n        }\r\n        else {\r\n            return (num * this.factorial(num - 1));\r\n        }\r\n    },\r\n    //双阶乘\r\n    factorialDouble: function(num){\r\n        if (num <= 0) {\r\n            return 1;\r\n        }\r\n        else {\r\n            return (num * this.factorialDouble(num - 2));\r\n        }\r\n    },\r\n    //总体方差\r\n    variance: function(num_arr){\r\n        let sum = 0, count = 0;\r\n\r\n        for(let i = 0; i < num_arr.length; i++){\r\n            let number = num_arr[i];\r\n\r\n            sum += number;\r\n            count++;\r\n        }\r\n\r\n        let avg = sum / count;\r\n\r\n        let sum_variance = 0;\r\n\r\n        for(let j = 0; j < num_arr.length; j++){\r\n            let number = num_arr[j];\r\n\r\n            sum_variance += (number - avg) * (number - avg);\r\n        }\r\n\r\n        return sum_variance / count;\r\n    },\r\n    //样本方差\r\n    variance_s: function(num_arr){\r\n        let sum = 0, count = 0;\r\n\r\n        for(let i = 0; i < num_arr.length; i++){\r\n            let number = num_arr[i];\r\n\r\n            sum += number;\r\n            count++;\r\n        }\r\n\r\n        let avg = sum / count;\r\n\r\n        let sum_variance = 0;\r\n\r\n        for(let j = 0; j < num_arr.length; j++){\r\n            let number = num_arr[j];\r\n\r\n            sum_variance += (number - avg) * (number - avg);\r\n        }\r\n\r\n        return sum_variance / (count - 1);\r\n    },\r\n    //总体标准偏差\r\n    standardDeviation: function(num_arr){\r\n        let sum = 0, count = 0;\r\n\r\n        for(let i = 0; i < num_arr.length; i++){\r\n            let number = num_arr[i];\r\n\r\n            sum += number;\r\n            count++;\r\n        }\r\n\r\n        let avg = sum / count;\r\n\r\n        let sum_variance = 0;\r\n\r\n        for(let j = 0; j < num_arr.length; j++){\r\n            let number = num_arr[j];\r\n\r\n            sum_variance += (number - avg) * (number - avg);\r\n        }\r\n\r\n        return Math.sqrt(sum_variance / count);\r\n    },\r\n    //样本标准偏差\r\n    standardDeviation_s: function(num_arr){\r\n        let sum = 0, count = 0;\r\n\r\n        for(let i = 0; i < num_arr.length; i++){\r\n            let number = num_arr[i];\r\n\r\n            sum += number;\r\n            count++;\r\n        }\r\n\r\n        let avg = sum / count;\r\n\r\n        let sum_variance = 0;\r\n\r\n        for(let j = 0; j < num_arr.length; j++){\r\n            let number = num_arr[j];\r\n\r\n            sum_variance += (number - avg) * (number - avg);\r\n        }\r\n\r\n        return Math.sqrt(sum_variance / (count - 1));\r\n    },\r\n    //是否是闰年\r\n    isLeapYear: function(year){\r\n        return new Date(year, 1, 29).getMonth() === 1;\r\n    },\r\n    //2月是否有29\r\n    feb29Between: function(date1, date2){\r\n        let _this = this;\r\n\r\n        let year1 = dayjs(date1).year();\r\n        let mar1year1 = dayjs().set({ 'year': year1, 'month': 2, 'date': 1 });\r\n\r\n        if (_this.isLeapYear(year1) && dayjs(date1) < dayjs(mar1year1) && dayjs(date2) >= dayjs(mar1year1)) {\r\n            return true;\r\n        }\r\n\r\n        let year2 = dayjs(date2).year();\r\n        let mar1year2 = dayjs().set({ 'year': year2, 'month': 2, 'date': 1 });\r\n\r\n        return (_this.isLeapYear(year2) && dayjs(date2) >= dayjs(mar1year2) && dayjs(date1) < dayjs(mar1year2));\r\n    },\r\n    //SQL 查询\r\n    findResultIndex: function(database, criterias){\r\n        let matches = {};\r\n\r\n        for (let i = 1; i < database[0].length; ++i) {\r\n            matches[i] = true;\r\n        }\r\n\r\n        let maxCriteriaLength = criterias[0].length;\r\n\r\n        for (i = 1; i < criterias.length; ++i) {\r\n            if (criterias[i].length > maxCriteriaLength) {\r\n                maxCriteriaLength = criterias[i].length;\r\n            }\r\n        }\r\n\r\n        for (let k = 1; k < database.length; ++k) {\r\n            for (let l = 1; l < database[k].length; ++l) {\r\n                let currentCriteriaResult = false;\r\n                let hasMatchingCriteria   = false;\r\n\r\n                for (let j = 0; j < criterias.length; ++j) {\r\n                    let criteria = criterias[j];\r\n\r\n                    if (criteria.length < maxCriteriaLength) {\r\n                        continue;\r\n                    }\r\n\r\n                    let criteriaField = criteria[0];\r\n\r\n                    if (database[k][0] !== criteriaField) {\r\n                        continue;\r\n                    }\r\n\r\n                    hasMatchingCriteria = true;\r\n\r\n                    for (let p = 1; p < criteria.length; ++p) {\r\n                        currentCriteriaResult = currentCriteriaResult || (new Function(\"return \" + database[k][l] + criteria[p])());  // jshint ignore:line\r\n                    }\r\n                }\r\n\r\n                if (hasMatchingCriteria) {\r\n                    matches[l] = matches[l] && currentCriteriaResult;\r\n                }\r\n            }\r\n        }\r\n\r\n        let result = [];\r\n\r\n        for (let n = 0; n < database[0].length; ++n) {\r\n            if (matches[n]) {\r\n                result.push(n - 1);\r\n            }\r\n        }\r\n\r\n        return result;\r\n    },\r\n    findField: function(database, title){\r\n        let index = null;\r\n\r\n        for (let i = 0; i < database.length; i++) {\r\n            if (database[i][0] == title) {\r\n                index = i;\r\n                break;\r\n            }\r\n        }\r\n\r\n        if (index == null) {\r\n            return error.v;\r\n        }\r\n\r\n        return index;\r\n    },\r\n    rest: function(array, idx){\r\n        idx = idx || 1;\r\n\r\n        if (!array || typeof array.slice !== 'function') {\r\n            return array;\r\n        }\r\n\r\n        return array.slice(idx);\r\n    },\r\n    compact: function(array){\r\n        if (!array) {\r\n            return array;\r\n        }\r\n\r\n        let result = [];\r\n\r\n        for (let i = 0; i < array.length; ++i) {\r\n            if (!array[i]) {\r\n                continue;\r\n            }\r\n\r\n            result.push(array[i]);\r\n        }\r\n\r\n        return result;\r\n    }\r\n}\r\n\r\nexport default func_methods;\r\n"
  },
  {
    "path": "src/global/getRowlen.js",
    "content": "import {luckysheetfontformat} from '../utils/util';\r\nimport menuButton from '../controllers/menuButton';\r\nimport {checkstatusByCell} from './getdata';\r\nimport {colLocationByIndex,colSpanLocationByIndex} from './location';\r\nimport {checkWordByteLength, hasChinaword, isRealNull} from './validate';\r\nimport {isInlineStringCell} from '../controllers/inlineString';\r\n\r\nimport Store from '../store';\r\n\r\n/**\r\n * 计算范围行高\r\n *\r\n * @param d 原始数据\r\n * @param r1 起始行\r\n * @param r2 截至行\r\n * @param cfg 配置\r\n * @returns 计算后的配置\r\n */\r\nfunction rowlenByRange(d, r1, r2, cfg) {\r\n    let cfg_clone = $.extend(true, {}, cfg);\r\n    if(cfg_clone[\"rowlen\"] == null){\r\n        cfg_clone[\"rowlen\"] = {};\r\n    }\r\n\r\n    if(cfg_clone[\"customHeight\"] == null){\r\n        cfg_clone[\"customHeight\"] = {};\r\n    }\r\n\r\n    let canvas = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n    canvas.textBaseline = 'top'; //textBaseline以top计算\r\n\r\n    for(let r = r1; r <= r2; r++){\r\n        if (cfg_clone[\"rowhidden\"] != null && cfg_clone[\"rowhidden\"][r] != null) {\r\n            continue;\r\n        }\r\n\r\n        let currentRowLen = Store.defaultrowlen;\r\n\r\n        if(cfg_clone[\"customHeight\"][r]==1){\r\n            continue;\r\n        }\r\n\r\n        delete cfg_clone[\"rowlen\"][r];\r\n\r\n        for(let c = 0; c < d[r].length; c++){\r\n            let cell = d[r][c];\r\n\r\n            if(cell == null){\r\n                continue;\r\n            }\r\n\r\n            if(cell != null && (cell.v != null || isInlineStringCell(cell)) ){\r\n                let cellWidth;\r\n                if(cell.mc){\r\n                    if(c === cell.mc.c){\r\n                        let st_cellWidth = colLocationByIndex(c)[0];\r\n                        let ed_cellWidth = colLocationByIndex(cell.mc.c + cell.mc.cs - 1)[1];\r\n                        cellWidth = ed_cellWidth - st_cellWidth - 2;\r\n                    }else{\r\n                        continue;\r\n                    }\r\n                } else {\r\n                    cellWidth = colLocationByIndex(c)[1] - colLocationByIndex(c)[0] - 2;\r\n                }\r\n\r\n                let textInfo = getCellTextInfo(cell, canvas,{\r\n                    r:r,\r\n                    c:c,\r\n                    cellWidth:cellWidth\r\n                });\r\n\r\n                let computeRowlen = 0;\r\n\r\n                if(textInfo!=null){\r\n                    computeRowlen = textInfo.textHeightAll+2;\r\n                }\r\n\r\n                //比较计算高度和当前高度取最大高度\r\n                if(computeRowlen > currentRowLen){\r\n                    currentRowLen = computeRowlen;\r\n                }\r\n            }\r\n        }\r\n\r\n        currentRowLen = currentRowLen/Store.zoomRatio;\r\n\r\n        if(currentRowLen != Store.defaultrowlen){\r\n            cfg_clone[\"rowlen\"][r] = currentRowLen;\r\n        }else{\r\n            if(cfg[\"rowlen\"]?.[r]){\r\n                cfg_clone[\"rowlen\"][r] = cfg[\"rowlen\"][r]\r\n            }\r\n        }\r\n    }\r\n\r\n    return cfg_clone;\r\n}\r\n\r\n//根据内容计算行高\r\nfunction computeRowlenByContent(d, r) {\r\n    let currentRowLen = 0;\r\n\r\n    let canvas = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n    canvas.textBaseline = 'top'; //textBaseline以top计算\r\n\r\n    for(let c = 0; c < d[r].length; c++){\r\n        let cell = d[r][c];\r\n\r\n        if (cell == null) {\r\n            continue;\r\n        }\r\n\r\n        if (cell.mc != null) {\r\n            if (1 !== cell.mc.rs) {\r\n                continue;\r\n            }\r\n        }\r\n\r\n        if(Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c] != null){\r\n            continue;\r\n        }\r\n\r\n\r\n        if(cell != null && (cell.v != null || isInlineStringCell(cell)) ){\r\n            let cellWidth = computeCellWidth(cell, c);\r\n\r\n            let textInfo = getCellTextInfo(cell, canvas,{\r\n                r:r,\r\n                c:c,\r\n                cellWidth:cellWidth\r\n            });\r\n\r\n            let computeRowlen = 0;\r\n\r\n            if (textInfo != null) {\r\n                computeRowlen = textInfo.textHeightAll + 2;\r\n            }\r\n\r\n            //比较计算高度和当前高度取最大高度\r\n            if (computeRowlen > currentRowLen) {\r\n                currentRowLen = computeRowlen;\r\n            }\r\n        }\r\n    }\r\n\r\n    return currentRowLen;\r\n}\r\n\r\nfunction computeCellWidth(cell, col_index) {\r\n    let colLocationArr = colLocationByIndex(col_index);\r\n    if (cell.mc && 1 !== cell.mc.cs) {\r\n        colLocationArr = colSpanLocationByIndex(col_index, cell.mc.cs);\r\n    }\r\n\r\n    return colLocationArr[1] - colLocationArr[0] - 2;\r\n}\r\n\r\nfunction computeColWidthByContent(d, c, rh) {\r\n    let currentColLen = 0;\r\n    let rowlenArr = computeRowlenArr(rh, c)\r\n\r\n    let canvas = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n    canvas.textBaseline = 'top'; //textBaseline以top计算\r\n\r\n    for (var i = 0; i < d.length; i++) {\r\n        var cell = d[i][c]\r\n\r\n        if (cell != null && (cell.v != null || isInlineStringCell(cell))) {\r\n            let cellHeight = rowlenArr[c];\r\n            let textInfo = getCellTextInfo(cell, canvas, {\r\n                r: i,\r\n                c: c,\r\n                cellHeight: cellHeight\r\n            });\r\n\r\n            let computeCollen = 0;\r\n\r\n            if (textInfo != null) {\r\n                computeCollen = textInfo.textWidthAll + 2;\r\n            }\r\n\r\n            //比较计算高度和当前高度取最大高度\r\n            if (computeCollen > currentColLen) {\r\n                currentColLen = computeCollen;\r\n            }\r\n        }\r\n    }\r\n\r\n    return currentColLen;\r\n}\r\n\r\n//计算表格行高数组\r\nfunction computeRowlenArr(rowHeight, cfg) {\r\n    let rowlenArr = [];\r\n    let rh_height = 0;\r\n\r\n    for (let i = 0; i < rowHeight; i++) {\r\n        let rowlen = Store.defaultrowlen;\r\n\r\n        if (cfg[\"rowlen\"] != null && cfg[\"rowlen\"][i] != null) {\r\n            rowlen = cfg[\"rowlen\"][i];\r\n        }\r\n\r\n        if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][i] != null) {\r\n            rowlen = cfg[\"rowhidden\"][i];\r\n            rowlenArr.push(rh_height);\r\n            continue;\r\n        }\r\n        else {\r\n            rh_height += rowlen + 1;\r\n        }\r\n\r\n        rowlenArr.push(rh_height);//行的临时长度分布\r\n    }\r\n\r\n    return rowlenArr;\r\n}\r\n\r\n//获取换行单元格截断数组\r\nfunction getCellTextSplitArr(strValue, strArr, cellWidth, canvas){\r\n    for(let strI = 1; strI <= strValue.length; strI++){\r\n        let strV = strValue.substring(0, strI);\r\n        let strtextMetrics = getMeasureText(strV, canvas).width;\r\n\r\n        if(strtextMetrics > cellWidth){\r\n            if(strI - 1 <= 0){\r\n                return strArr;\r\n            }\r\n            else{\r\n                strArr.push(strValue.substring(0, strI - 1));\r\n                return getCellTextSplitArr(strValue.substring(strI - 1), strArr, cellWidth, canvas);\r\n            }\r\n        }\r\n        else if(strI == strValue.length){\r\n            strArr.push(strV);\r\n        }\r\n    }\r\n\r\n    return strArr;\r\n}\r\n\r\n//获取有值单元格文本大小\r\n// let measureTextCache = {}, measureTextCacheTimeOut = null;\r\nfunction getMeasureText(value, ctx, fontset){\r\n\r\n    let mtc = Store.measureTextCache[value + \"_\" + ctx.font];\r\n    if(fontset!=null){\r\n        mtc = Store.measureTextCache[value + \"_\" + fontset];\r\n    }\r\n\r\n    if(mtc != null){\r\n        return mtc;\r\n    }\r\n    else{\r\n        if(fontset!=null){\r\n            let preFont = ctx.font;\r\n            ctx.font = fontset;\r\n        }\r\n\r\n        let measureText = ctx.measureText(value), cache = {};\r\n        // var regu = \"^[ ]+$\";\r\n        // var re = new RegExp(regu);\r\n        // if(measureText.actualBoundingBoxRight==null || re.test(value)){\r\n        //     cache.width = measureText.width;\r\n        // }\r\n        // else{\r\n        //     //measureText.actualBoundingBoxLeft +\r\n        //     cache.width = measureText.actualBoundingBoxRight;\r\n        // }\r\n\r\n        cache.width = measureText.width;\r\n\r\n        if(fontset!=null){\r\n            ctx.font = fontset;\r\n        }\r\n\r\n        cache.actualBoundingBoxDescent = measureText.actualBoundingBoxDescent;\r\n        cache.actualBoundingBoxAscent = measureText.actualBoundingBoxAscent;\r\n        if(cache.actualBoundingBoxDescent==null || cache.actualBoundingBoxAscent==null || isNaN(cache.actualBoundingBoxDescent) || isNaN(cache.actualBoundingBoxAscent)){\r\n            let commonWord = \"M\"\r\n            if(hasChinaword(value)){\r\n                commonWord = \"田\";\r\n            }\r\n            let oneLineTextHeight = menuButton.getTextSize(commonWord, ctx.font)[1]*0.8;\r\n            if(ctx.textBaseline==\"top\"){\r\n                cache.actualBoundingBoxDescent = oneLineTextHeight;\r\n                cache.actualBoundingBoxAscent = 0;\r\n            }\r\n            else if(ctx.textBaseline==\"middle\"){\r\n                cache.actualBoundingBoxDescent = oneLineTextHeight/2;\r\n                cache.actualBoundingBoxAscent = oneLineTextHeight/2;\r\n            }\r\n            else{\r\n                cache.actualBoundingBoxDescent = 0;\r\n                cache.actualBoundingBoxAscent = oneLineTextHeight;\r\n            }\r\n\r\n            //console.log(value, oneLineTextHeight, measureText.actualBoundingBoxDescent+measureText.actualBoundingBoxAscent,ctx.font);\r\n        }\r\n\r\n        if(ctx.textBaseline == 'alphabetic'){\r\n            let descText = \"gjpqy\", matchText=\"abcdABCD\";\r\n            let descTextMeasure = Store.measureTextCache[descText + \"_\" + ctx.font];\r\n            if(fontset!=null){\r\n                descTextMeasure = Store.measureTextCache[descText + \"_\" + fontset];\r\n            }\r\n\r\n            let matchTextMeasure = Store.measureTextCache[matchText + \"_\" + ctx.font];\r\n            if(fontset!=null){\r\n                matchTextMeasure = Store.measureTextCache[matchText + \"_\" + fontset];\r\n            }\r\n\r\n            if(descTextMeasure == null){\r\n                descTextMeasure = ctx.measureText(descText);\r\n            }\r\n\r\n            if(matchTextMeasure == null){\r\n                matchTextMeasure = ctx.measureText(matchText);\r\n            }\r\n\r\n            if(cache.actualBoundingBoxDescent<=matchTextMeasure.actualBoundingBoxDescent){\r\n                cache.actualBoundingBoxDescent = descTextMeasure.actualBoundingBoxDescent;\r\n                if(cache.actualBoundingBoxDescent==null){\r\n                    cache.actualBoundingBoxDescent = 0;\r\n                }\r\n            }\r\n\r\n\r\n        }\r\n\r\n        cache.width *= Store.zoomRatio;\r\n        cache.actualBoundingBoxDescent *= Store.zoomRatio;\r\n        cache.actualBoundingBoxAscent *= Store.zoomRatio;\r\n        Store.measureTextCache[value + \"_\" + Store.zoomRatio +  \"_\" + ctx.font] = cache;\r\n        // console.log(measureText, value);\r\n        return cache;\r\n    }\r\n}\r\n\r\nfunction isSupportBoundingBox(ctx){\r\n    let measureText = ctx.measureText(\"田\");\r\n    if(measureText.actualBoundingBoxAscent==null){\r\n        return false;\r\n    }\r\n    return true;\r\n}\r\n\r\n\r\n//获取单元格文本内容的渲染信息\r\n// let measureTextCache = {}, measureTextCacheTimeOut = null;\r\n// option {cellWidth,cellHeight,space_width,space_height}\r\nfunction getCellTextInfo(cell , ctx, option){\r\n    let cellWidth = option.cellWidth;\r\n    let cellHeight = option.cellHeight;\r\n    let isMode = \"\", isModeSplit = \"\";\r\n    // console.log(\"initialinfo\", cell, option);\r\n    if(cellWidth==null){\r\n        isMode = \"onlyWidth\";\r\n        isModeSplit = \"_\";\r\n    }\r\n    let textInfo = Store.measureTextCellInfoCache[option.r + \"_\" + option.c + isModeSplit + isMode];\r\n    if(textInfo != null){\r\n        return textInfo;\r\n    }\r\n\r\n    // let cell = Store.flowdata[r][c];\r\n    let space_width = option.space_width, space_height = option.space_height; //宽高方向 间隙\r\n\r\n    if(space_width==null){\r\n        space_width = 2;\r\n    }\r\n\r\n    if(space_height==null){\r\n        space_height = 2;\r\n    }\r\n\r\n    //水平对齐\r\n    let horizonAlign = checkstatusByCell(cell, \"ht\");\r\n    //垂直对齐\r\n    let verticalAlign = checkstatusByCell(cell, \"vt\");\r\n\r\n    let tb = checkstatusByCell(cell ,\"tb\");//wrap overflow\r\n    let tr = checkstatusByCell(cell ,\"tr\");//rotate\r\n    let rt = checkstatusByCell(cell ,\"rt\");//rotate angle\r\n\r\n    let isRotateUp = 1, isRotateDown=0;\r\n\r\n    if(rt==null){\r\n        if(tr==\"0\"){\r\n            rt = 0;\r\n        }\r\n        else if(tr==\"1\"){\r\n            rt = 45;\r\n        }\r\n        else if(tr==\"4\"){\r\n            rt = 90;\r\n        }\r\n        else if(tr==\"2\"){\r\n            rt = 135;\r\n        }\r\n        else if(tr==\"5\"){\r\n            rt = 180;\r\n        }\r\n\r\n        if(rt==null){\r\n            rt = 0;\r\n        }\r\n    }\r\n\r\n    if(rt>180 || rt<0){\r\n        rt = 0;\r\n    }\r\n\r\n    rt = parseInt(rt);\r\n    if(rt>90){\r\n        rt = 90 -rt;\r\n        isRotateUp = 0;\r\n        isRotateDown = 1;\r\n    }\r\n\r\n    ctx.textAlign=\"start\";\r\n\r\n    let textContent = {};\r\n    textContent.values = [];\r\n\r\n    let fontset, cancelLine=\"0\", underLine=\"0\", fontSize=11, isInline=false, value, inlineStringArr=[];\r\n    if(isInlineStringCell(cell)){\r\n        let sharedStrings = cell.ct.s, similarIndex = 0;\r\n        for(let i=0;i<sharedStrings.length;i++){\r\n            let shareCell = sharedStrings[i];\r\n            let scfontset = luckysheetfontformat(shareCell);\r\n            let fc = shareCell.fc, cl=shareCell.cl,un = shareCell.un, v = shareCell.v, fs=shareCell.fs;\r\n            v = v.replace(/\\r\\n/g, \"_x000D_\").replace(/&#13;&#10;/g, \"_x000D_\").replace(/\\r/g, \"_x000D_\").replace(/\\n/g, \"_x000D_\");\r\n            let splitArr = v.split(\"_x000D_\");\r\n            for(let x=0;x<splitArr.length;x++){\r\n                let newValue = splitArr[x];\r\n\r\n                if(newValue==\"\" && x!=splitArr.length-1){\r\n                    inlineStringArr.push({\r\n                        fontset:scfontset,\r\n                        fc:fc==null?\"#000\":fc,\r\n                        cl:cl==null?0:cl,\r\n                        un:un==null?0:un,\r\n                        wrap:true,\r\n                        fs:fs==null?11:fs,\r\n                    });\r\n                    similarIndex++;\r\n                }\r\n                else{\r\n                    let newValueArray = newValue.split(\"\");\r\n                    for(let n=0;n<newValueArray.length;n++){\r\n                        let nv = newValueArray[n];\r\n\r\n                        inlineStringArr.push({\r\n                            fontset:scfontset,\r\n                            fc:fc==null?\"#000\":fc,\r\n                            cl:cl==null?0:cl,\r\n                            un:un==null?0:un,\r\n                            v: nv,\r\n                            si:similarIndex,\r\n                            fs:fs==null?11:fs,\r\n                        });\r\n\r\n                    }\r\n\r\n                    if(x!=splitArr.length-1 ){\r\n                        inlineStringArr.push({\r\n                            fontset:scfontset,\r\n                            fc:fc==null?\"#000\":fc,\r\n                            cl:cl==null?0:cl,\r\n                            un:un==null?0:un,\r\n                            wrap:true,\r\n                            fs:fs==null?11:fs,\r\n                        });\r\n                        similarIndex++;\r\n                    }\r\n                }\r\n\r\n            }\r\n\r\n            similarIndex++;\r\n        }\r\n        isInline = true;\r\n    }\r\n    else{\r\n        fontset = luckysheetfontformat(cell);\r\n        ctx.font = fontset;\r\n\r\n        cancelLine = checkstatusByCell(cell ,\"cl\");//cancelLine\r\n        underLine = checkstatusByCell(cell ,\"un\");//underLine\r\n        fontSize = checkstatusByCell(cell ,\"fs\");\r\n\r\n        if(cell instanceof Object){\r\n            value = cell.m;\r\n            if(value == null){\r\n                value = cell.v;\r\n            }\r\n        }\r\n        else{\r\n            value = cell;\r\n        }\r\n\r\n        if(isRealNull(value)){\r\n            return null;\r\n        }\r\n    }\r\n\r\n    if(tr==\"3\"){//vertical text\r\n        ctx.textBaseline = 'top';\r\n\r\n\r\n        let textW_all = 0; //拆分后宽高度合计\r\n        let textH_all = 0;\r\n        let colIndex=0, textH_all_cache=0, textH_all_Column = {}, textH_all_ColumnHeight=[];\r\n        if(isInline){\r\n            let preShareCell = null;\r\n            for(let i = 0; i < inlineStringArr.length; i++){\r\n                let shareCell = inlineStringArr[i];\r\n                let value = shareCell.v, showValue=shareCell.v;\r\n                if(shareCell.wrap===true){\r\n                    value = \"M\";\r\n                    showValue = \"\";\r\n\r\n\r\n                    if( preShareCell!=null && preShareCell.wrap!==true && (i<inlineStringArr.length-1)){\r\n                        // console.log(\"wrap\",i,colIndex,preShareCell.wrap);\r\n                        textH_all_ColumnHeight.push(textH_all_cache);\r\n                        textH_all_cache = 0;\r\n                        colIndex +=1;\r\n\r\n                        preShareCell = shareCell;\r\n                        continue;\r\n                    }\r\n                }\r\n\r\n                let measureText = getMeasureText(value, ctx, shareCell.fontset);\r\n\r\n                let textW = measureText.width + space_width;\r\n                let textH = measureText.actualBoundingBoxAscent + measureText.actualBoundingBoxDescent + space_height;\r\n\r\n                // textW_all += textW;\r\n                textH_all_cache += textH;\r\n\r\n\r\n                if(tb==\"2\" && !shareCell.wrap){\r\n                    if(textH_all_cache>cellHeight && textH_all_Column[colIndex]!=null){\r\n                        // textW_all += textW;\r\n                        // textH_all = Math.max(textH_all,textH_all_cache);\r\n                        // console.log(\">\",i,colIndex);\r\n                        textH_all_ColumnHeight.push(textH_all_cache-textH);\r\n                        textH_all_cache = textH;\r\n                        colIndex +=1;\r\n                    }\r\n                }\r\n\r\n                if(i== inlineStringArr.length-1){\r\n                    textH_all_ColumnHeight.push(textH_all_cache);\r\n                }\r\n\r\n                if(textH_all_Column[colIndex]==null){\r\n                    textH_all_Column[colIndex]= [];\r\n                }\r\n\r\n                let item = {\r\n                    content:showValue,\r\n                    style:shareCell,\r\n                    width:textW,\r\n                    height:textH,\r\n                    left:0,\r\n                    top:0,\r\n                    colIndex:colIndex,\r\n                    asc:measureText.actualBoundingBoxAscent,\r\n                    desc:measureText.actualBoundingBoxDescent,\r\n                    inline:true,\r\n                }\r\n\r\n                if(shareCell.wrap===true){\r\n                    item.wrap=true;\r\n                }\r\n\r\n                textH_all_Column[colIndex].push(item);\r\n                console.log(\"normal\",i,colIndex,shareCell, preShareCell, textH_all_Column);\r\n                preShareCell = shareCell;\r\n\r\n            }\r\n        }\r\n        else{\r\n            let measureText = getMeasureText(value, ctx);\r\n            let textHeight = measureText.actualBoundingBoxDescent + measureText.actualBoundingBoxAscent;\r\n\r\n            value = value.toString();\r\n\r\n            let vArr = [];\r\n            if(value.length > 1){\r\n                vArr = value.split(\"\");\r\n            }\r\n            else{\r\n                vArr.push(value);\r\n            }\r\n            let oneWordWidth =  getMeasureText(vArr[0], ctx).width;\r\n\r\n            for(let i = 0; i < vArr.length; i++){\r\n                let textW = oneWordWidth + space_width;\r\n                let textH = textHeight + space_height;\r\n\r\n                // textW_all += textW;\r\n                textH_all_cache += textH;\r\n\r\n\r\n                if(tb==\"2\"){\r\n                    if(textH_all_cache>cellHeight && textH_all_Column[colIndex]!=null){\r\n                        // textW_all += textW;\r\n                        // textH_all = Math.max(textH_all,textH_all_cache);\r\n                        textH_all_ColumnHeight.push(textH_all_cache-textH);\r\n                        textH_all_cache = textH;\r\n                        colIndex +=1;\r\n                    }\r\n                }\r\n\r\n                if(i== vArr.length-1){\r\n                    textH_all_ColumnHeight.push(textH_all_cache);\r\n                }\r\n\r\n                if(textH_all_Column[colIndex]==null){\r\n                    textH_all_Column[colIndex]= [];\r\n                }\r\n\r\n                textH_all_Column[colIndex].push({\r\n                    content:vArr[i],\r\n                    style:fontset,\r\n                    width:textW,\r\n                    height:textH,\r\n                    left:0,\r\n                    top:0,\r\n                    colIndex:colIndex,\r\n                    asc:measureText.actualBoundingBoxAscent,\r\n                    desc:measureText.actualBoundingBoxDescent\r\n                });\r\n\r\n            }\r\n        }\r\n\r\n        let textH_all_ColumWidth = [];\r\n        for(let i = 0; i < textH_all_ColumnHeight.length; i++){\r\n            let columnHeight = textH_all_ColumnHeight[i];\r\n            let col = textH_all_Column[i], colMaxW=0;\r\n            for(let c=0;c<col.length;c++){\r\n                let word = col[c];\r\n                colMaxW = Math.max(colMaxW, word.width);\r\n            }\r\n            textH_all_ColumWidth.push(colMaxW);\r\n            textW_all += colMaxW;\r\n            textH_all = Math.max(textH_all, columnHeight);\r\n        }\r\n\r\n        textContent.type = \"verticalWrap\";\r\n        textContent.textWidthAll = textW_all;\r\n        textContent.textHeightAll = textH_all;\r\n\r\n        if(isMode==\"onlyWidth\"){\r\n            // console.log(\"verticalWrap\", textContent,cell, option);\r\n            return textContent;\r\n        }\r\n\r\n        let cumColumnWidth = 0;\r\n        for(let i = 0; i < textH_all_ColumnHeight.length; i++){\r\n            let columnHeight = textH_all_ColumnHeight[i];\r\n            let columnWidth = textH_all_ColumWidth[i];\r\n\r\n            let col = textH_all_Column[i];\r\n            let cumWordHeight = 0;\r\n            for(let c=0;c<col.length;c++){\r\n                let word = col[c];\r\n\r\n                let left = space_width + cumColumnWidth;\r\n                if(horizonAlign == \"0\"){\r\n                    left = cellWidth / 2 + cumColumnWidth - textW_all/2 + space_width*textH_all_ColumnHeight.length;\r\n                }\r\n                else if(horizonAlign == \"2\"){\r\n                    left = cellWidth + cumColumnWidth - textW_all + space_width;\r\n                }\r\n\r\n                let top = (cellHeight - space_height)  + cumWordHeight - columnHeight;\r\n                if(verticalAlign == \"0\"){\r\n                    top = cellHeight / 2 + cumWordHeight - columnHeight/2;\r\n                }\r\n                else if(verticalAlign == \"1\"){\r\n                    top = space_height  + cumWordHeight;\r\n                }\r\n\r\n                cumWordHeight += word.height;\r\n\r\n                word.left = left;\r\n                word.top = top;\r\n\r\n                drawLineInfo(word, cancelLine, underLine,{\r\n                    width:columnWidth,\r\n                    height:word.height,\r\n                    left:left,\r\n                    top:top+word.height-space_height,\r\n                    asc:word.height,\r\n                    desc:0,\r\n                    fs:fontSize\r\n                });\r\n\r\n                textContent.values.push(word);\r\n            }\r\n\r\n            cumColumnWidth+=columnWidth;\r\n\r\n        }\r\n    }\r\n    else{\r\n        let supportBoundBox = isSupportBoundingBox(ctx);\r\n        if(supportBoundBox){\r\n            ctx.textBaseline = 'alphabetic';\r\n        }\r\n        else{\r\n            ctx.textBaseline = 'bottom';\r\n        }\r\n\r\n        if(tb==\"2\" || isInline){//wrap\r\n\r\n            let textW_all = 0; //拆分后宽高度合计\r\n            let textH_all = 0;\r\n            let textW_all_inner = 0;\r\n\r\n            // let oneWordWidth =  getMeasureText(vArr[0], ctx).width;\r\n            let splitIndex=0, text_all_cache=0, text_all_split = {}, text_all_splitLen=[];\r\n\r\n            textContent.rotate = rt;\r\n            rt = Math.abs(rt);\r\n\r\n            let anchor = 0, preHeight = 0, preWidth=0, preStr, preTextHeight, preTextWidth, preMeasureText, i=1, wrapStyle={}, spaceOrTwoByte=null, spaceOrTwoByteIndex=null;\r\n            if(isInline){\r\n                while(i <= inlineStringArr.length){\r\n                    let shareCells = inlineStringArr.slice(anchor, i);\r\n                    if(shareCells[shareCells.length-1].wrap===true){\r\n\r\n                        anchor = i;\r\n\r\n                        if(shareCells.length>1){\r\n                            for(let s=0;s<shareCells.length-1;s++){\r\n                                let sc = shareCells[s];\r\n                                let item = {\r\n                                    content:sc.v,\r\n                                    style:sc,\r\n                                    width:sc.measureText.width,\r\n                                    height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    asc:sc.measureText.actualBoundingBoxAscent,\r\n                                    desc:sc.measureText.actualBoundingBoxDescent,\r\n                                    inline:true,\r\n                                    fs:sc.fs\r\n                                }\r\n\r\n                                // if(rt!=0){//rotate\r\n                                //     item.textHeight = sc.textHeight;\r\n                                //     item.textWidth = sc.textWidth;\r\n                                // }\r\n\r\n                                text_all_split[splitIndex].push(item);\r\n                            }\r\n                        }\r\n\r\n                        if(shareCells.length==1 || i==inlineStringArr.length){\r\n                            let sc = shareCells[0];\r\n                            let measureText = getMeasureText(\"M\", ctx, sc.fontset);\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex] = [];\r\n                            }\r\n                            text_all_split[splitIndex].push({\r\n                                content:\"\",\r\n                                style:sc,\r\n                                width:measureText.width,\r\n                                height:measureText.actualBoundingBoxAscent+measureText.actualBoundingBoxDescent,\r\n                                left:0,\r\n                                top:0,\r\n                                splitIndex:splitIndex,\r\n                                asc:measureText.actualBoundingBoxAscent,\r\n                                desc:measureText.actualBoundingBoxDescent,\r\n                                inline:true,\r\n                                wrap:true,\r\n                                fs:sc.fs\r\n                            });\r\n                        }\r\n\r\n\r\n\r\n                        splitIndex +=1;\r\n\r\n                        i++;\r\n\r\n                        continue;\r\n                    }\r\n\r\n                    let textWidth=0, textHeight=0;\r\n                    for(let s=0;s<shareCells.length;s++){\r\n                        let sc = shareCells[s];\r\n                        if(sc.measureText==null){\r\n                            sc.measureText = getMeasureText(sc.v, ctx, sc.fontset);\r\n                        }\r\n                        textWidth += sc.measureText.width;\r\n                        textHeight = Math.max(sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent);\r\n                        // console.log(sc.v,sc.measureText.width,sc.measureText.actualBoundingBoxAscent,sc.measureText.actualBoundingBoxDescent);\r\n                    }\r\n\r\n                    let width = textWidth * Math.cos(rt*Math.PI/180) + textHeight * Math.sin(rt*Math.PI/180);//consider text box wdith and line height\r\n\r\n                    let height = textWidth * Math.sin(rt*Math.PI/180) + textHeight * Math.cos(rt*Math.PI/180);//consider text box wdith and line height\r\n\r\n                    // textW_all += textW;\r\n\r\n\r\n                    let lastWord = shareCells[shareCells.length-1];\r\n                    if(lastWord.v==\" \" || checkWordByteLength(lastWord.v)==2){\r\n                        spaceOrTwoByteIndex = i;\r\n                    }\r\n\r\n\r\n                    if(rt!=0){//rotate\r\n                        // console.log(\"all\",anchor, i , str);\r\n                        console.log(height,space_height, cellHeight, shareCells,(height+space_height)>cellHeight);\r\n                        if((height+space_height)>cellHeight && text_all_split[splitIndex]!=null && tb==\"2\" && i!= inlineStringArr.length){\r\n                            // console.log(\"cut\",anchor, i , str);\r\n\r\n                            if(spaceOrTwoByteIndex!=null && spaceOrTwoByteIndex<i){\r\n\r\n                                for(let s=0;s<spaceOrTwoByteIndex-anchor;s++){\r\n                                    let sc = shareCells[s];\r\n                                    text_all_split[splitIndex].push({\r\n                                        content:sc.v,\r\n                                        style:sc,\r\n                                        width:sc.measureText.width,\r\n                                        height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                        left:0,\r\n                                        top:0,\r\n                                        splitIndex:splitIndex,\r\n                                        asc:sc.measureText.actualBoundingBoxAscent,\r\n                                        desc:sc.measureText.actualBoundingBoxDescent,\r\n                                        inline:true,\r\n                                        fs:sc.fs\r\n                                    });\r\n                                }\r\n                                anchor = spaceOrTwoByteIndex;\r\n\r\n                                i = spaceOrTwoByteIndex + 1;\r\n\r\n                                splitIndex +=1;\r\n\r\n                                spaceOrTwoByteIndex = null;\r\n\r\n                            }\r\n                            else{\r\n\r\n                                anchor = i-1;\r\n\r\n                                for(let s=0;s<shareCells.length-1;s++){\r\n                                    let sc = shareCells[s];\r\n                                    text_all_split[splitIndex].push({\r\n                                        content:sc.v,\r\n                                        style:sc,\r\n                                        width:sc.measureText.width,\r\n                                        height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                        left:0,\r\n                                        top:0,\r\n                                        splitIndex:splitIndex,\r\n                                        asc:sc.measureText.actualBoundingBoxAscent,\r\n                                        desc:sc.measureText.actualBoundingBoxDescent,\r\n                                        inline:true,\r\n                                        fs:sc.fs\r\n                                    });\r\n                                }\r\n\r\n                                splitIndex +=1;\r\n                            }\r\n\r\n                        }\r\n                        else if(i== inlineStringArr.length){\r\n                            // console.log(\"last\",anchor, i , str);\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            for(let s=0;s<shareCells.length;s++){\r\n                                let sc = shareCells[s];\r\n                                text_all_split[splitIndex].push({\r\n                                    content:sc.v,\r\n                                    style:sc,\r\n                                    width:sc.measureText.width,\r\n                                    height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    asc:sc.measureText.actualBoundingBoxAscent,\r\n                                    desc:sc.measureText.actualBoundingBoxDescent,\r\n                                    inline:true,\r\n                                    fs:sc.fs\r\n                                });\r\n                            }\r\n                            break;\r\n                        }\r\n                        else{\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            i++;\r\n                        }\r\n                    }\r\n                    else{//plain\r\n                        if((width+space_width)>cellWidth && text_all_split[splitIndex]!=null && tb==\"2\" && i!= inlineStringArr.length){\r\n\r\n\r\n                            if(spaceOrTwoByteIndex!=null && spaceOrTwoByteIndex<i){\r\n\r\n                                for(let s=0;s<spaceOrTwoByteIndex-anchor;s++){\r\n                                    let sc = shareCells[s];\r\n                                    text_all_split[splitIndex].push({\r\n                                        content:sc.v,\r\n                                        style:sc,\r\n                                        width:sc.measureText.width,\r\n                                        height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                        left:0,\r\n                                        top:0,\r\n                                        splitIndex:splitIndex,\r\n                                        asc:sc.measureText.actualBoundingBoxAscent,\r\n                                        desc:sc.measureText.actualBoundingBoxDescent,\r\n                                        inline:true,\r\n                                        fs:sc.fs\r\n                                    });\r\n                                }\r\n                                anchor = spaceOrTwoByteIndex;\r\n\r\n                                i = spaceOrTwoByteIndex + 1;\r\n\r\n                                splitIndex +=1;\r\n\r\n                                spaceOrTwoByteIndex = null;\r\n\r\n                            }\r\n                            else{\r\n                                anchor = i-1;\r\n\r\n                                for(let s=0;s<shareCells.length-1;s++){\r\n                                    let sc = shareCells[s];\r\n                                    text_all_split[splitIndex].push({\r\n                                        content:sc.v,\r\n                                        style:sc,\r\n                                        width:sc.measureText.width,\r\n                                        height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                        left:0,\r\n                                        top:0,\r\n                                        splitIndex:splitIndex,\r\n                                        asc:sc.measureText.actualBoundingBoxAscent,\r\n                                        desc:sc.measureText.actualBoundingBoxDescent,\r\n                                        inline:true,\r\n                                        fs:sc.fs\r\n                                    });\r\n                                }\r\n\r\n                                splitIndex +=1;\r\n                            }\r\n\r\n                        }\r\n                        else if(i== inlineStringArr.length){\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n\r\n                            for(let s=0;s<shareCells.length;s++){\r\n                                let sc = shareCells[s];\r\n                                text_all_split[splitIndex].push({\r\n                                    content:sc.v,\r\n                                    style:sc,\r\n                                    width:sc.measureText.width,\r\n                                    height:sc.measureText.actualBoundingBoxAscent+sc.measureText.actualBoundingBoxDescent,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    asc:sc.measureText.actualBoundingBoxAscent,\r\n                                    desc:sc.measureText.actualBoundingBoxDescent,\r\n                                    inline:true,\r\n                                    fs:sc.fs\r\n                                });\r\n                            }\r\n\r\n                            break;\r\n                        }\r\n                        else{\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            i++;\r\n                        }\r\n                    }\r\n\r\n                }\r\n            }\r\n            else{\r\n                value = value.toString();\r\n                while(i <= value.length){\r\n                    let str = value.substring(anchor, i);\r\n                    let measureText =  getMeasureText(str, ctx);\r\n                    let textWidth = measureText.width;\r\n                    let textHeight = measureText.actualBoundingBoxAscent+measureText.actualBoundingBoxDescent;\r\n\r\n                    let width = textWidth * Math.cos(rt*Math.PI/180) + textHeight * Math.sin(rt*Math.PI/180);//consider text box wdith and line height\r\n\r\n                    let height = textWidth * Math.sin(rt*Math.PI/180) + textHeight * Math.cos(rt*Math.PI/180);//consider text box wdith and line height\r\n                    let lastWord = str.substr(str.length-1,1);\r\n                    if(lastWord==\" \" || checkWordByteLength(lastWord)==2){\r\n                        if(preMeasureText!=null){\r\n                            spaceOrTwoByte = {\r\n                                index:i,\r\n                                str:preStr + lastWord,\r\n                                width:preTextWidth,\r\n                                height:preTextHeight,\r\n                                asc:preMeasureText.actualBoundingBoxAscent,\r\n                                desc:preMeasureText.actualBoundingBoxDescent,\r\n                            };\r\n                        }\r\n\r\n                    }\r\n                    // textW_all += textW;\r\n                    // console.log(str,anchor,i);\r\n                    if(rt!=0){//rotate\r\n                        // console.log(\"all\",anchor, i , str);\r\n                        if((height+space_height)>cellHeight && text_all_split[splitIndex]!=null && i!= value.length){\r\n                            // console.log(\"cut\",anchor, i , str);\r\n\r\n                            if(spaceOrTwoByte!=null && spaceOrTwoByte.index<i){\r\n\r\n                                anchor = spaceOrTwoByte.index;\r\n\r\n                                i = spaceOrTwoByte.index + 1;\r\n\r\n                                text_all_split[splitIndex].push({\r\n                                    content:spaceOrTwoByte.str,\r\n                                    style:fontset,\r\n                                    width:spaceOrTwoByte.width,\r\n                                    height:spaceOrTwoByte.height,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    asc:spaceOrTwoByte.asc,\r\n                                    desc:spaceOrTwoByte.desc,\r\n                                    fs:fontSize,\r\n                                });\r\n\r\n                                // console.log(1,anchor,i,splitIndex , spaceOrTwoByte.str);\r\n\r\n                                splitIndex +=1;\r\n\r\n                                spaceOrTwoByte = null;\r\n\r\n\r\n\r\n                            }\r\n                            else{\r\n                                anchor = i-1;\r\n\r\n                                text_all_split[splitIndex].push({\r\n                                    content:preStr,\r\n                                    style:fontset,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    height:preTextHeight,\r\n                                    width:preTextWidth,\r\n                                    asc:measureText.actualBoundingBoxAscent,\r\n                                    desc:measureText.actualBoundingBoxDescent,\r\n                                    fs:fontSize,\r\n                                });\r\n\r\n                                // console.log(2,anchor,i, splitIndex, preStr);\r\n\r\n                                splitIndex +=1;\r\n\r\n\r\n                            }\r\n                        }\r\n                        else if(i== value.length){\r\n                            // console.log(\"last\",anchor, i , str);\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            text_all_split[splitIndex].push({\r\n                                content:str,\r\n                                style:fontset,\r\n                                left:0,\r\n                                top:0,\r\n                                splitIndex:splitIndex,\r\n                                height:textHeight,\r\n                                width:textWidth,\r\n                                asc:measureText.actualBoundingBoxAscent,\r\n                                desc:measureText.actualBoundingBoxDescent,\r\n                                fs:fontSize,\r\n                            });\r\n                            break;\r\n                        }\r\n                        else{\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            i++;\r\n                        }\r\n                    }\r\n                    else{//plain\r\n                        if((width+space_width)>cellWidth && text_all_split[splitIndex]!=null && i!= value.length){\r\n                            // console.log(spaceOrTwoByte, i, anchor);\r\n                            if(spaceOrTwoByte!=null && spaceOrTwoByte.index<i){\r\n\r\n                                anchor = spaceOrTwoByte.index;\r\n\r\n                                i = spaceOrTwoByte.index + 1;\r\n\r\n                                text_all_split[splitIndex].push({\r\n                                    content:spaceOrTwoByte.str,\r\n                                    style:fontset,\r\n                                    width:spaceOrTwoByte.width,\r\n                                    height:spaceOrTwoByte.height,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    asc:spaceOrTwoByte.asc,\r\n                                    desc:spaceOrTwoByte.desc,\r\n                                    fs:fontSize,\r\n                                });\r\n\r\n                                splitIndex +=1;\r\n\r\n                                spaceOrTwoByte = null;\r\n\r\n\r\n\r\n                            }\r\n                            else{\r\n\r\n                                spaceOrTwoByte = null;\r\n                                anchor = i-1;\r\n\r\n                                text_all_split[splitIndex].push({\r\n                                    content:preStr,\r\n                                    style:fontset,\r\n                                    width:preTextWidth,\r\n                                    height:preTextHeight,\r\n                                    left:0,\r\n                                    top:0,\r\n                                    splitIndex:splitIndex,\r\n                                    asc:measureText.actualBoundingBoxAscent,\r\n                                    desc:measureText.actualBoundingBoxDescent,\r\n                                    fs:fontSize,\r\n                                });\r\n\r\n                                // console.log(2);\r\n\r\n\r\n\r\n                                splitIndex +=1;\r\n                            }\r\n                        }\r\n                        else if(i== value.length){\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            text_all_split[splitIndex].push({\r\n                                content:str,\r\n                                style:fontset,\r\n                                width:textWidth,\r\n                                height:textHeight,\r\n                                left:0,\r\n                                top:0,\r\n                                splitIndex:splitIndex,\r\n                                asc:measureText.actualBoundingBoxAscent,\r\n                                desc:measureText.actualBoundingBoxDescent,\r\n                                fs:fontSize,\r\n                            });\r\n\r\n                            break;\r\n                        }\r\n                        else{\r\n                            if(text_all_split[splitIndex]==null){\r\n                                text_all_split[splitIndex]= [];\r\n                            }\r\n                            i++;\r\n                        }\r\n                    }\r\n\r\n                    preStr = str;\r\n                    preTextHeight = textHeight;\r\n                    preTextWidth = textWidth;\r\n                    preMeasureText = measureText;\r\n\r\n                }\r\n\r\n                // console.log(text_all_split)\r\n            }\r\n\r\n            let split_all_size = [], oneLinemaxWordCount=0;\r\n            // console.log(\"split\",splitIndex, text_all_split);\r\n            let splitLen = Object.keys(text_all_split).length;\r\n            for(let i = 0; i < splitLen; i++){\r\n                let splitLists = text_all_split[i];\r\n                if(splitLists==null){\r\n                    continue;\r\n                }\r\n                let sWidth = 0, sHeight=0, maxDesc=0,maxAsc=0, lineHeight=0, maxWordCount=0;\r\n                for(let s=0;s<splitLists.length;s++){\r\n                    let sp = splitLists[s];\r\n                    if(rt!=0){//rotate\r\n                        sWidth += sp.width;\r\n                        sHeight = Math.max(sHeight, sp.height-(supportBoundBox?sp.desc:0));\r\n                    }\r\n                    else{//plain\r\n                        sWidth += sp.width;\r\n                        sHeight = Math.max(sHeight, sp.height-(supportBoundBox?sp.desc:0));\r\n                    }\r\n                    maxDesc = Math.max(maxDesc,(supportBoundBox?sp.desc:0));\r\n                    maxAsc = Math.max(maxAsc, sp.asc);\r\n                    maxWordCount++;\r\n                }\r\n\r\n                lineHeight = sHeight/2;\r\n                oneLinemaxWordCount = Math.max(oneLinemaxWordCount, maxWordCount);\r\n                if(rt!=0){//rotate\r\n                    sHeight+=lineHeight;\r\n                    textW_all_inner =  Math.max(textW_all_inner, sWidth);\r\n                    // textW_all =  Math.max(textW_all, sWidth+ (textH_all)/Math.tan(rt*Math.PI/180));\r\n                    textH_all += sHeight;\r\n                }\r\n                else{//plain\r\n                    // console.log(\"textH_all\",textW_all, textH_all);\r\n                    sHeight+=lineHeight;\r\n                    textW_all=Math.max(textW_all, sWidth);\r\n                    textH_all+=sHeight;\r\n                }\r\n\r\n\r\n                split_all_size.push({\r\n                    width:sWidth,\r\n                    height:sHeight,\r\n                    desc:maxDesc,\r\n                    asc:maxAsc,\r\n                    lineHeight:lineHeight,\r\n                    wordCount: maxWordCount\r\n                });\r\n            }\r\n            // console.log(textH_all,textW_all,textW_all_inner);\r\n            // let cumColumnWidth = 0;\r\n            let cumWordHeight = 0,cumColumnWidth = 0;\r\n            let rtPI = rt*Math.PI/180;\r\n            let lastLine = split_all_size[splitLen-1];\r\n            let lastLineSpaceHeight = lastLine.lineHeight;\r\n            textH_all = textH_all - lastLineSpaceHeight + lastLine.desc;\r\n            let rw = (textH_all)/Math.sin(rtPI) + textW_all_inner*Math.cos(rtPI);\r\n            let rh = textW_all_inner*Math.sin(rtPI), fixOneLineLeft = 0;\r\n\r\n            if(rt!=0){\r\n                if(splitLen==1){\r\n                    textW_all = textW_all_inner + 2*(textH_all/Math.tan(rtPI));\r\n                    fixOneLineLeft = textH_all/Math.tan(rtPI);\r\n                }\r\n                else{\r\n                    textW_all = textW_all_inner + textH_all/Math.tan(rtPI);\r\n                }\r\n                textContent.textWidthAll = rw;\r\n                textContent.textHeightAll = rh;\r\n            }\r\n            else{\r\n                textContent.textWidthAll = textW_all;\r\n                textContent.textHeightAll = textH_all;\r\n            }\r\n\r\n            if(isMode==\"onlyWidth\"){\r\n                // console.log(\"plainWrap\", textContent,cell, option);\r\n                return textContent;\r\n            }\r\n\r\n            if(rt!=0 && isRotateUp==\"1\"){\r\n                ctx.textAlign=\"end\";\r\n                for(let i = 0; i < splitLen; i++){\r\n                    let splitLists = text_all_split[i];\r\n                    if(splitLists==null){\r\n                        continue;\r\n                    }\r\n                    let size = split_all_size[i];\r\n\r\n                    cumColumnWidth = 0;\r\n\r\n                    for(let c=splitLists.length-1;c>=0;c--){\r\n                        let wordGroup = splitLists[c];\r\n                        let left, top;\r\n                        if(rt!=0){//rotate\r\n                            let x, y = cumWordHeight+size.asc;\r\n\r\n                            x = (cumWordHeight)/Math.tan(rtPI) - cumColumnWidth + textW_all_inner;\r\n                            if(horizonAlign == \"0\"){//center\r\n                                let sh = textH_all/Math.sin(rtPI);\r\n                                if(verticalAlign == \"0\"){//mid\r\n\r\n                                    left = x + cellWidth/2 - (textW_all/2) + lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y + cellHeight/2 - textH_all/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"1\"){//top\r\n                                    left = x + cellWidth/2 - textW_all/2;\r\n                                    top = y - (textH_all/2 - rh/2);\r\n                                }\r\n                                else if(verticalAlign == \"2\"){//bottom\r\n                                    left = x + cellWidth/2 - (textW_all/2)+lastLineSpaceHeight*Math.cos(rtPI);\r\n                                    top = y + cellHeight - rh/2 - textH_all/2 - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                }\r\n                            }\r\n                            else if(horizonAlign == \"1\"){//left\r\n                                if(verticalAlign == \"0\"){//mid\r\n                                    left = x - rh*Math.sin(rtPI)/2 + lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y + cellHeight/2 + rh*Math.cos(rtPI)/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"1\"){//top\r\n                                    left = x - rh*Math.sin(rtPI);\r\n                                    top = y + rh*Math.cos(rtPI);\r\n                                }\r\n                                else if(verticalAlign == \"2\"){//bottom\r\n                                    left = x + lastLineSpaceHeight*Math.cos(rtPI);\r\n                                    top = y + cellHeight - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                }\r\n                            }\r\n                            else if(horizonAlign == \"2\"){//right\r\n                                if(verticalAlign == \"0\"){//mid\r\n                                    left = x + cellWidth - rw/2 - (textW_all_inner/2+(textH_all/2)/Math.tan(rtPI))+ lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y + cellHeight/2 - textH_all/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"1\"){//top fixOneLineLeft\r\n                                    left = x + cellWidth - textW_all + fixOneLineLeft;\r\n                                    top = y - textH_all;\r\n                                }\r\n                                else if(verticalAlign == \"2\"){//bottom\r\n                                    left = x + cellWidth - rw*Math.cos(rtPI) + lastLineSpaceHeight*Math.cos(rtPI);\r\n                                    top = y + cellHeight - rw*Math.sin(rtPI) - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                }\r\n                            }\r\n\r\n                        }\r\n\r\n                        wordGroup.left = left;\r\n                        wordGroup.top = top;\r\n\r\n                        // console.log(left, top,  cumWordHeight, size.height);\r\n\r\n                        drawLineInfo(wordGroup, cancelLine, underLine,{\r\n                            width:wordGroup.width,\r\n                            height:wordGroup.height,\r\n                            left:left-wordGroup.width,\r\n                            top:top,\r\n                            asc:size.asc,\r\n                            desc:size.desc,\r\n                            fs:wordGroup.fs\r\n                        });\r\n\r\n                        textContent.values.push(wordGroup);\r\n\r\n                        cumColumnWidth += wordGroup.width;\r\n                    }\r\n\r\n\r\n                    cumWordHeight += size.height;\r\n\r\n\r\n                }\r\n            }\r\n            else{\r\n                for(let i = 0; i < splitLen; i++){\r\n                    let splitLists = text_all_split[i];\r\n                    if(splitLists==null){\r\n                        continue;\r\n                    }\r\n                    let size = split_all_size[i];\r\n\r\n                    cumColumnWidth = 0;\r\n\r\n                    for(let c=0;c<splitLists.length;c++){\r\n                        let wordGroup = splitLists[c];\r\n                        let left, top;\r\n                        if(rt!=0){//rotate\r\n                            let x, y = cumWordHeight+size.asc;\r\n\r\n                            x = (textH_all-cumWordHeight)/Math.tan(rtPI) + cumColumnWidth;\r\n\r\n                            if(horizonAlign == \"0\"){//center\r\n                                let sh = textH_all/Math.sin(rtPI);\r\n                                if(verticalAlign == \"0\"){//mid\r\n\r\n                                    left = x + cellWidth/2 - (textW_all/2) - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y + cellHeight/2 - textH_all/2 + lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"1\"){//top\r\n                                    left = x + cellWidth/2 - textW_all/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y - (textH_all/2 - rh/2)+lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"2\"){//bottom\r\n                                    left = x + cellWidth/2 - (textW_all/2)-lastLineSpaceHeight*Math.cos(rtPI);\r\n                                    top = y + cellHeight - rh/2 - textH_all/2 - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                }\r\n                            }\r\n                            else if(horizonAlign == \"1\"){//left\r\n                                if(verticalAlign == \"0\"){//mid\r\n                                    left = x - rh*Math.sin(rtPI)/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y - textH_all + cellHeight/2 - rh*Math.cos(rtPI)/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"1\"){//top\r\n                                    left = x;\r\n                                    top = y - textH_all;\r\n                                }\r\n                                else if(verticalAlign == \"2\"){//bottom\r\n                                    left = x - rh*Math.sin(rtPI) - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                    top = y - textH_all + cellHeight - rh*Math.cos(rtPI) - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                }\r\n                            }\r\n                            else if(horizonAlign == \"2\"){//right\r\n                                if(verticalAlign == \"0\"){//mid\r\n                                    left = x + cellWidth - rw/2 - textW_all/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                    top = y + cellHeight/2 - textH_all/2 - lastLineSpaceHeight*Math.cos(rtPI)/2;\r\n                                }\r\n                                else if(verticalAlign == \"1\"){//top fixOneLineLeft\r\n                                    left = x + cellWidth - rw*Math.cos(rtPI);\r\n                                    top = y + rh*Math.cos(rtPI);\r\n                                }\r\n                                else if(verticalAlign == \"2\"){//bottom\r\n                                    left = x + cellWidth - textW_all - lastLineSpaceHeight*Math.cos(rtPI) + fixOneLineLeft;\r\n                                    top = y + cellHeight - lastLineSpaceHeight*Math.cos(rtPI);\r\n                                }\r\n                            }\r\n\r\n                            drawLineInfo(wordGroup, cancelLine, underLine,{\r\n                                width:wordGroup.width,\r\n                                height:wordGroup.height,\r\n                                left:left,\r\n                                top:top,\r\n                                asc:size.asc,\r\n                                desc:size.desc,\r\n                                fs:wordGroup.fs\r\n                            });\r\n\r\n                        }\r\n                        else{//plain\r\n                            left = space_width + cumColumnWidth;\r\n                            if(horizonAlign == \"0\"){\r\n                                //+ space_width*textH_all_ColumnHeight.length\r\n                                left = cellWidth / 2 + cumColumnWidth - size.width/2;\r\n                            }\r\n                            else if(horizonAlign == \"2\"){\r\n                                left = cellWidth + cumColumnWidth - size.width;\r\n                            }\r\n\r\n                            top = (cellHeight - space_height)  + cumWordHeight +size.asc-textH_all;\r\n                            if(verticalAlign == \"0\"){\r\n                                top = cellHeight / 2 + cumWordHeight - textH_all/2 + size.asc;\r\n                            }\r\n                            else if(verticalAlign == \"1\"){\r\n                                top = space_height  + cumWordHeight+ size.asc;\r\n                            }\r\n\r\n\r\n\r\n                            drawLineInfo(wordGroup, cancelLine, underLine,{\r\n                                width:wordGroup.width,\r\n                                height:wordGroup.height,\r\n                                left:left,\r\n                                top:top,\r\n                                asc:size.asc,\r\n                                desc:size.desc,\r\n                                fs:wordGroup.fs\r\n                            });\r\n                        }\r\n\r\n\r\n                        wordGroup.left = left;\r\n                        wordGroup.top = top;\r\n\r\n                        textContent.values.push(wordGroup);\r\n\r\n                        cumColumnWidth += wordGroup.width;\r\n                    }\r\n\r\n\r\n                    cumWordHeight += size.height;\r\n\r\n\r\n                }\r\n            }\r\n\r\n            textContent.type = \"plainWrap\";\r\n\r\n            if(rt!=0){\r\n                // let leftCenter = (textW_all + textH_all/Math.tan(rt*Math.PI/180))/2;\r\n                // let topCenter = textH_all/2;\r\n\r\n                // if(isRotateUp==\"1\"){\r\n                //     textContent.textLeftAll += leftCenter;\r\n                //     textContent.textTopAll += topCenter;\r\n                // }\r\n                // else {\r\n                //     textContent.textLeftAll += leftCenter;\r\n                //     textContent.textTopAll -= topCenter;\r\n                // }\r\n\r\n                if(horizonAlign == \"0\"){//center\r\n                    if(verticalAlign == \"0\"){//mid\r\n                        textContent.textLeftAll = cellWidth/2;\r\n                        textContent.textTopAll = cellHeight/2;\r\n                    }\r\n                    else if(verticalAlign == \"1\"){//top\r\n                        textContent.textLeftAll = cellWidth/2;\r\n                        textContent.textTopAll = rh/2;\r\n\r\n                    }\r\n                    else if(verticalAlign == \"2\"){//bottom\r\n                        textContent.textLeftAll = cellWidth/2;\r\n                        textContent.textTopAll = cellHeight - rh/2;\r\n                    }\r\n                }\r\n                else if(horizonAlign == \"1\"){//left\r\n                    if(verticalAlign == \"0\"){//mid\r\n                        textContent.textLeftAll = 0;\r\n                        textContent.textTopAll = cellHeight/2;\r\n                    }\r\n                    else if(verticalAlign == \"1\"){//top\r\n                        textContent.textLeftAll = 0;\r\n                        textContent.textTopAll = 0;\r\n                    }\r\n                    else if(verticalAlign == \"2\"){//bottom\r\n                        textContent.textLeftAll = 0;\r\n                        textContent.textTopAll = cellHeight;\r\n                    }\r\n                }\r\n                else if(horizonAlign == \"2\"){//right\r\n                    if(verticalAlign == \"0\"){//mid\r\n                        textContent.textLeftAll = cellWidth - rw/2;\r\n                        textContent.textTopAll = cellHeight/2;\r\n                    }\r\n                    else if(verticalAlign == \"1\"){//top\r\n                        textContent.textLeftAll = cellWidth;\r\n                        textContent.textTopAll = 0;\r\n                    }\r\n                    else if(verticalAlign == \"2\"){//bottom\r\n                        textContent.textLeftAll = cellWidth;\r\n                        textContent.textTopAll = cellHeight;\r\n                    }\r\n                }\r\n\r\n            }\r\n            // else{\r\n            //     textContent.textWidthAll = textW_all;\r\n            //     textContent.textHeightAll = textH_all;\r\n            // }\r\n\r\n        }\r\n        else{\r\n            let measureText = getMeasureText(value, ctx);\r\n            let textWidth = measureText.width;\r\n            let textHeight = measureText.actualBoundingBoxDescent + measureText.actualBoundingBoxAscent;\r\n\r\n            textContent.rotate = rt;\r\n\r\n            rt = Math.abs(rt);\r\n            let rtPI = rt*Math.PI/180;\r\n\r\n            let textWidthAll = textWidth * Math.cos(rtPI) + textHeight * Math.sin(rtPI);//consider text box wdith and line height\r\n\r\n            let textHeightAll = textWidth * Math.sin(rtPI) + textHeight * Math.cos(rtPI);//consider text box wdith and line height\r\n\r\n            if(rt!=0){\r\n                textContent.textHeightAll = textHeightAll;\r\n            }\r\n            else{\r\n                textContent.textHeightAll = textHeightAll+textHeight/2-measureText.actualBoundingBoxDescent-space_height;\r\n            }\r\n            textContent.textWidthAll = textWidthAll;\r\n\r\n            // console.log(textContent.textWidthAll , textContent.textHeightAll);\r\n            if(isMode==\"onlyWidth\"){\r\n                // console.log(\"plain\", textContent,cell, option);\r\n                return textContent;\r\n            }\r\n\r\n            let width = textWidthAll, height = textHeightAll;\r\n\r\n            let left = space_width + textHeight * Math.sin(rtPI)*isRotateUp; //默认为1，左对齐\r\n            if(horizonAlign == \"0\"){ //居中对齐\r\n                left = cellWidth / 2  - (width / 2) + textHeight * Math.sin(rtPI)*isRotateUp;\r\n            }\r\n            else if(horizonAlign == \"2\"){ //右对齐\r\n                left = (cellWidth - space_width)  - width + textHeight * Math.sin(rtPI)*isRotateUp;\r\n            }\r\n\r\n            let top = (cellHeight - space_height)  - height + measureText.actualBoundingBoxAscent * Math.cos(rtPI) + textWidth * Math.sin(rtPI)*isRotateUp; //默认为2，下对齐\r\n            if(verticalAlign == \"0\"){ //居中对齐\r\n                top = cellHeight / 2  - (height / 2) + measureText.actualBoundingBoxAscent* Math.cos(rtPI) + textWidth * Math.sin(rtPI)*isRotateUp;\r\n            }\r\n            else if(verticalAlign == \"1\"){ //上对齐\r\n                top = space_height + measureText.actualBoundingBoxAscent* Math.cos(rtPI) + textWidth * Math.sin(rtPI)*isRotateUp;\r\n            }\r\n\r\n            textContent.type = \"plain\";\r\n\r\n            let wordGroup = {\r\n                content:value,\r\n                style:fontset,\r\n                width:width,\r\n                height:height,\r\n                left:left,\r\n                top:top,\r\n            }\r\n\r\n            drawLineInfo(wordGroup, cancelLine, underLine,{\r\n                width:textWidth,\r\n                height:textHeight,\r\n                left:left,\r\n                top:top,\r\n                asc:measureText.actualBoundingBoxAscent,\r\n                desc:measureText.actualBoundingBoxDescent,\r\n                fs:fontSize,\r\n            });\r\n\r\n            textContent.values.push(wordGroup);\r\n\r\n            textContent.textLeftAll = left;\r\n            textContent.textTopAll = top;\r\n\r\n            textContent.asc = measureText.actualBoundingBoxAscent;\r\n            textContent.desc = measureText.actualBoundingBoxDescent;\r\n\r\n            // console.log(\"plain\",left,top);\r\n        }\r\n    }\r\n\r\n    return textContent;\r\n}\r\n\r\n\r\nfunction drawLineInfo(wordGroup, cancelLine,underLine,option){\r\n    let left = option.left, top = option.top, width=option.width, height = option.height, asc = option.asc,desc = option.desc,fs = option.fs;\r\n\r\n    if(wordGroup.wrap===true){\r\n        return;\r\n    }\r\n\r\n    if(wordGroup.inline==true && wordGroup.style!=null){\r\n        cancelLine = wordGroup.style.cl;\r\n        underLine = wordGroup.style.un;\r\n    }\r\n\r\n    if(cancelLine!=\"0\"){\r\n        wordGroup.cancelLine = {};\r\n        wordGroup.cancelLine.startX = left;\r\n        wordGroup.cancelLine.startY = top-asc/2+1;\r\n\r\n        wordGroup.cancelLine.endX = left + width;\r\n        wordGroup.cancelLine.endY = top-asc/2+1;\r\n\r\n        wordGroup.cancelLine.fs = fs;\r\n\r\n    }\r\n\r\n    if(underLine!=\"0\"){\r\n         wordGroup.underLine = [];\r\n         if(underLine==\"1\" || underLine==\"2\"){\r\n            let item = {};\r\n            item.startX = left;\r\n            item.startY = top + 3;\r\n\r\n            item.endX = left + width;\r\n            item.endY = top + 3;\r\n\r\n            item.fs = fs;\r\n\r\n            wordGroup.underLine.push(item);\r\n         }\r\n\r\n         if(underLine==\"2\"){\r\n            let item = {};\r\n            item.startX = left;\r\n            item.startY = top+desc;\r\n\r\n            item.endX = left + width;\r\n            item.endY = top+desc;\r\n\r\n            item.fs = fs;\r\n\r\n            wordGroup.underLine.push(item);\r\n         }\r\n\r\n         if(underLine==\"3\" || underLine==\"4\"){\r\n            let item = {};\r\n            item.startX = left;\r\n            item.startY = top+desc;\r\n\r\n            item.endX = left + width;\r\n            item.endY = top+desc;\r\n\r\n            item.fs = fs;\r\n\r\n            wordGroup.underLine.push(item);\r\n         }\r\n\r\n         if(underLine==\"4\"){\r\n            let item = {};\r\n            item.startX = left;\r\n            item.startY = top+desc+2;\r\n\r\n            item.endX = left + width;\r\n            item.endY = top+desc+2;\r\n\r\n            item.fs = fs;\r\n\r\n            wordGroup.underLine.push(item);\r\n         }\r\n    }\r\n}\r\n\r\n\r\n\r\nexport {\r\n    computeColWidthByContent,\r\n    rowlenByRange,\r\n    computeRowlenByContent,\r\n    computeRowlenArr,\r\n    getCellTextSplitArr,\r\n    getMeasureText,\r\n    getCellTextInfo\r\n}\r\n"
  },
  {
    "path": "src/global/getdata.js",
    "content": "import { getObjType,rgbTohex } from '../utils/util';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport server from '../controllers/server';\r\nimport formula from './formula';\r\nimport editor from './editor';\r\nimport { dynamicArrayCompute } from './dynamicArray';\r\nimport sheetmanage from '../controllers/sheetmanage';\r\nimport { isInlineStringCT,isInlineStringCell,convertCssToStyleList } from '../controllers/inlineString';\r\nimport locale from '../locale/locale';\r\nimport Store from '../store';\r\n\r\n//Get selection range value\r\nexport function getdatabyselection(range, sheetIndex) {\r\n    if(range == null){\r\n        range = Store.luckysheet_select_save[0];\r\n    }\r\n\r\n    if (range[\"row\"] == null || range[\"row\"].length == 0) {\r\n        return [];\r\n    }\r\n\r\n    //取数据\r\n    let d, cfg;\r\n    if(sheetIndex != null && sheetIndex != Store.currentSheetIndex){\r\n        d = Store.luckysheetfile[getSheetIndex(sheetIndex)][\"data\"];\r\n        cfg = Store.luckysheetfile[getSheetIndex(sheetIndex)][\"config\"];\r\n    }\r\n    else{\r\n        d = editor.deepCopyFlowData(Store.flowdata);\r\n        cfg = Store.config;    \r\n    }\r\n\r\n    let data = [];\r\n\r\n    for (let r = range[\"row\"][0]; r <= range[\"row\"][1]; r++) {\r\n        if(d[r] == null){\r\n            continue;\r\n        }\r\n\r\n        if (cfg[\"rowhidden\"] != null && cfg[\"rowhidden\"][r] != null) {\r\n            continue;\r\n        }\r\n\r\n        let row = [];\r\n\r\n        for (let c = range[\"column\"][0]; c <= range[\"column\"][1]; c++) {\r\n            row.push(d[r][c]);\r\n        }\r\n\r\n        data.push(row);\r\n    }\r\n\r\n    return data;\r\n}\r\n\r\nexport function getdatabyselectionD(d, range) {\r\n    if (range == null || range[\"row\"] == null || range[\"row\"].length == 0) {\r\n        return [];\r\n    }\r\n    \r\n    let dynamicArray_compute = dynamicArrayCompute(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"dynamicArray\"]);\r\n    let data = [];\r\n\r\n    if(d==null){\r\n        return data;\r\n    }\r\n\r\n    for (let r = range[\"row\"][0]; r <= range[\"row\"][1]; r++) {\r\n        if(d[r] == null){\r\n            continue;\r\n        }\r\n\r\n        // if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n        //     continue;\r\n        // }\r\n\r\n        let row = [];\r\n\r\n        for (let c = range[\"column\"][0]; c <= range[\"column\"][1]; c++) {\r\n            let value;\r\n            \r\n            if((r + \"_\" + c) in dynamicArray_compute){\r\n                value = dynamicArray_compute[r + \"_\" + c];\r\n            }\r\n            else{\r\n                value = d[r][c];\r\n            }\r\n\r\n            row.push(value);\r\n        }\r\n\r\n        data.push(row);\r\n    }\r\n\r\n    return data;\r\n}\r\n\r\nexport function getdatabyselectionNoCopy(range) {\r\n    if (range == null || range[\"row\"] == null || range[\"row\"].length == 0) {\r\n        return [];\r\n    }\r\n\r\n    let data = [];\r\n\r\n    for (let r = range[\"row\"][0]; r <= range[\"row\"][1]; r++) {\r\n        let row = [];\r\n        \r\n        if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n            continue;\r\n        }\r\n\r\n        for (let c = range[\"column\"][0]; c <= range[\"column\"][1]; c++) {\r\n            let value = \"\";\r\n\r\n            if (Store.flowdata[r] != null && Store.flowdata[r][c] != null) {\r\n                value = Store.flowdata[r][c];\r\n            }\r\n\r\n            row.push(value);\r\n        }\r\n        \r\n        data.push(row);\r\n    }\r\n\r\n    return data;\r\n}\r\n\r\n//Get the value of the cell\r\nexport function getcellvalue(r, c, data, type) {\r\n    if (type == null) {\r\n        type = \"v\";\r\n    }\r\n\r\n    if (data == null) {\r\n        data = Store.flowdata;\r\n    }\r\n\r\n    let d_value;\r\n\r\n    if (r != null && c != null) {\r\n        d_value = data[r][c];\r\n    }\r\n    else if (r != null) {\r\n        d_value = data[r];\r\n    }\r\n    else if (c != null) {\r\n        let newData = data[0].map(function(col, i) {\r\n            return data.map(function(row) {\r\n                return row[i];\r\n            })\r\n        });\r\n        d_value = newData[c];\r\n    }\r\n    else {\r\n        return data;\r\n    }\r\n\r\n    let retv = d_value;\r\n\r\n    if(getObjType(d_value) == \"object\"){\r\n        retv = d_value[type];\r\n\r\n        if (type == \"f\" && retv != null) {\r\n            retv = formula.functionHTMLGenerate(retv);\r\n        }\r\n        else if(type == \"f\") {\r\n            retv = d_value[\"v\"];\r\n        }\r\n        // fix conditionalFormat \"occurrenceDate\" => \"2023-05-17 to 2023-05-19\"\r\n        // else if(d_value && d_value.ct && d_value.ct.t == 'd') {\r\n        //     retv = d_value.m;\r\n        // }\r\n    }\r\n\r\n    if(retv == undefined){\r\n        retv = null;\r\n    }\r\n\r\n    return retv;\r\n}\r\n\r\n//Data increase in rows and columns\r\nexport function datagridgrowth(data, addr, addc, iscallback) {\r\n    if (addr <= 0 && addc <= 0) {\r\n        return data;\r\n    }\r\n\r\n    if (addr <= 0) {\r\n        addr = 0;\r\n    }\r\n\r\n    if (addc <= 0) {\r\n        addc = 0;\r\n    }\r\n\r\n    let dataClen = 0;\r\n    if (data.length == 0) {\r\n        data = [];\r\n        dataClen = 0;\r\n    }\r\n    else {\r\n        dataClen = data[0].length;\r\n    }\r\n\r\n    let coladd = [];//需要额外增加的空列\r\n    for (let c = 0; c < addc; c++) {\r\n        coladd.push(null);\r\n    }\r\n\r\n    let rowadd = [];//完整的一个空行\r\n    for (let r = 0; r < dataClen + addc; r++) {\r\n        rowadd.push(null);\r\n    }\r\n\r\n    // 下面循环非常耗时, 在coladd为空时是无用循环\r\n    if (coladd && coladd.length) {\r\n        for (let r = 0; r < data.length; r++) {\r\n            data[r] = [].concat(data[r].concat(coladd));\r\n        }\r\n    }\r\n\r\n    for (let r = 0; r < addr; r++) {\r\n        data.push([].concat(rowadd));\r\n    }\r\n\r\n    if(!!iscallback){\r\n        server.saveParam(\"all\", Store.currentSheetIndex, data.length, { \"k\": \"row\" });\r\n        server.saveParam(\"all\", Store.currentSheetIndex, data[0].length, { \"k\": \"column\" });\r\n    }\r\n\r\n    return data;\r\n}\r\n\r\n\r\n//Get the formula of the cell\r\nexport function getcellFormula(r, c, i, data) {\r\n    let cell;\r\n    if(data!=null){\r\n        cell = data[r][c];\r\n    }\r\n    else{\r\n        cell = getOrigincell(r,c,i);\r\n    }\r\n\r\n    \r\n    if(cell==null){\r\n        return null;\r\n    }\r\n\r\n    return cell.f;\r\n}\r\n\r\n\r\nexport function getOrigincell(r, c, i) {\r\n    if(r==null || c==null){\r\n        return;\r\n    }\r\n    let data;\r\n    if (i == null) {\r\n        data = Store.flowdata;\r\n    }\r\n    else{\r\n        let sheet = sheetmanage.getSheetByIndex(i);\r\n        data = sheet.data;\r\n    }\r\n\r\n    if(!data || !data[r] || !data[r][c]){\r\n        return;\r\n    }\r\n\r\n    return data[r][c];\r\n\r\n\r\n}\r\n\r\nexport function getRealCellValue(r, c){\r\n    let value = getcellvalue(r, c, null, \"m\");\r\n    if(value == null){\r\n        value = getcellvalue(r, c);\r\n        if(value==null){\r\n            let ct = getcellvalue(r, c, null, \"ct\");\r\n            if(isInlineStringCT(ct)){\r\n                value = ct.s;\r\n            }\r\n        }\r\n    }\r\n\r\n    return value;\r\n}\r\n\r\nexport function getInlineStringNoStyle(r, c){\r\n    let ct = getcellvalue(r, c, null, \"ct\");\r\n    if(isInlineStringCT(ct)){\r\n        let strings = ct.s, value=\"\";\r\n        for(let i=0;i<strings.length;i++){\r\n            let strObj = strings[i];\r\n            if(strObj.v!=null){\r\n                value += strObj.v;\r\n            }\r\n        }\r\n        return value;\r\n    }\r\n\r\n    return \"\";\r\n}\r\n\r\nexport function getInlineStringStyle(r, c, data){\r\n    let ct = getcellvalue(r, c, data, \"ct\");\r\n    if (data == null) {\r\n        data = Store.flowdata;\r\n    }\r\n    let cell = data[r][c];\r\n    if(isInlineStringCT(ct)){\r\n        let strings = ct.s, value=\"\";\r\n        for(let i=0;i<strings.length;i++){\r\n            let strObj = strings[i];\r\n            if(strObj.v!=null){\r\n                let style = getFontStyleByCell(strObj);\r\n                value += \"<span index='\"+ i +\"' style='\"+ style +\"'>\" + strObj.v + \"</span>\";\r\n            }\r\n        }\r\n        return value;\r\n    }\r\n\r\n    return \"\";\r\n}\r\n\r\nexport function getFontStyleByCell(cell,checksAF,checksCF, isCheck=true){\r\n    if(cell==null){\r\n        return;\r\n    }\r\n    let style = \"\";\r\n    const _locale = locale();\r\n    const locale_fontarray = _locale.fontarray;\r\n    for(let key in cell){\r\n        let value = cell[key];\r\n        if(isCheck){\r\n            value = checkstatusByCell(cell, key);\r\n        }\r\n        if(key == \"bl\" && value != \"0\"){\r\n            style += \"font-weight: bold;\";\r\n        }\r\n\r\n        if(key == \"it\" && value != \"0\"){\r\n            style += \"font-style:italic;\";\r\n        }\r\n\r\n        if(key == \"ff\"){\r\n            let f = value;\r\n            if(!isNaN(parseInt(value))){\r\n                f = locale_fontarray[parseInt(value)];\r\n            }\r\n            else{\r\n                f = value;\r\n            }\r\n            style += \"font-family: \" + f + \";\";\r\n        }\r\n\r\n        if(key == \"fs\"){\r\n            style += \"font-size: \"+ value + \"pt;\";\r\n        }\r\n\r\n        if((key == \"fc\" && value != \"#000000\") || checksAF != null || (checksCF != null && checksCF[\"textColor\"] != null)){\r\n            if(checksCF != null && checksCF[\"textColor\"] != null){\r\n                style += \"color: \" + checksCF[\"textColor\"] + \";\";\r\n            }\r\n            else if(checksAF != null){\r\n                style += \"color: \" + checksAF[0] + \";\";\r\n            }\r\n            else{\r\n                style += \"color: \" + value + \";\";  \r\n            }\r\n        }\r\n\r\n        if(key == \"cl\" && value != \"0\"){\r\n            style += \"text-decoration: line-through;\";\r\n        }\r\n\r\n    }\r\n    return style;\r\n}\r\n\r\nexport function checkstatusByCell(cell, a){\r\n    let foucsStatus =cell;\r\n    let tf = {\"bl\":1, \"it\":1 , \"ff\":1, \"cl\":1, \"un\":1};\r\n\r\n    if(a in tf || (a==\"fs\" && isInlineStringCell(cell)) ){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"0\";\r\n        }\r\n        else{\r\n            // var  w = window.getSelection(), isInlineEdit=false; \r\n            // if(w.type!=\"None\"){\r\n            //     var range = w.getRangeAt(0);\r\n            //     let startContainer = range.startContainer;\r\n            //     if (parseInt($(\"#luckysheet-input-box\").css(\"top\")) > 0 && startContainer.parentNode.tagName==\"SPAN\" && !range.collapsed) {\r\n            //         let span = startContainer.parentNode;\r\n            //         let styleList = convertCssToStyleList(span.style.cssText);\r\n            //         foucsStatus = styleList[a];\r\n            //         isInlineEdit = true;\r\n            //     }\r\n            // }\r\n            \r\n            // if(!isInlineEdit){       \r\n            //     if(isInlineStringCell(cell)){\r\n            //         foucsStatus = cell.ct.s[0][a];\r\n            //     }\r\n            //     else{\r\n            //         foucsStatus = foucsStatus[a];\r\n            //     }\r\n            // }   \r\n            \r\n            foucsStatus = foucsStatus[a];\r\n            \r\n            if(foucsStatus == null){\r\n                foucsStatus = \"0\";\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"fc\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"#000000\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"#000000\";\r\n            }\r\n\r\n            if(foucsStatus.indexOf(\"rgba\") > -1){\r\n                foucsStatus = rgbTohex(foucsStatus);\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"bg\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = null;\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n\r\n            if(foucsStatus == null){\r\n                foucsStatus = null;\r\n            }\r\n            else if(foucsStatus.toString().indexOf(\"rgba\") > -1){\r\n                foucsStatus = rgbTohex(foucsStatus);\r\n            }\r\n        }\r\n    }\r\n    else if(a.substr(0, 2) == \"bs\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"none\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"none\";\r\n            }\r\n        }\r\n    }\r\n    else if(a.substr(0, 2) == \"bc\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"#000000\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"#000000\";\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"ht\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"1\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"1\";\r\n            }\r\n        }\r\n\r\n        if([\"0\", \"1\", \"2\"].indexOf(foucsStatus.toString()) == -1){\r\n            foucsStatus = \"1\";\r\n        }\r\n    }\r\n    else if(a == \"vt\"){//默认垂直居中\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"0\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"0\";\r\n            }\r\n        }\r\n\r\n        if([\"0\", \"1\", \"2\"].indexOf(foucsStatus.toString()) == -1){\r\n            foucsStatus = \"0\";\r\n        }\r\n    }\r\n    else if(a == \"ct\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = null;\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = null;\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"fs\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = String(Store.defaultFontSize);\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = String(Store.defaultFontSize);\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"tb\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"0\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"0\";\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"tr\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = \"0\";\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = \"0\";\r\n            }\r\n        }\r\n    }\r\n    else if(a == \"rt\"){\r\n        if(foucsStatus == null){\r\n            foucsStatus = null;\r\n        }\r\n        else{\r\n            foucsStatus = foucsStatus[a];\r\n            if(foucsStatus == null){\r\n                foucsStatus = null;\r\n            }\r\n        }\r\n    }\r\n\r\n    return foucsStatus;\r\n}\r\n\r\nexport function textTrim(x) {\r\n    if(x==null || x.length==0){\r\n        return x;\r\n    }\r\n    return x.replace(/^\\s+|\\s+$/gm,'');\r\n}"
  },
  {
    "path": "src/global/json.js",
    "content": "import { getObjType } from '../utils/util';\r\n\r\nconst json = {\r\n    parseJsonParm: function(obj){\r\n        if(obj == null){\r\n            return {};\r\n        }\r\n        else if(getObjType(obj) == \"string\"){\r\n            try {\r\n                let json = new Function(\"return \" + obj)(); \r\n                return json;\r\n            } \r\n            catch(e) {\r\n                return {};\r\n            }\r\n        }\r\n        else{\r\n            return obj;\r\n        }\r\n    },\r\n    hasKey: function(obj){\r\n        let _this = this;\r\n        let json = _this.parseJsonParm(obj);\r\n        \r\n        for(let item in json){\r\n            return true;\r\n        }\r\n\r\n        return false;\r\n    }\r\n}\r\n\r\nexport default json;"
  },
  {
    "path": "src/global/loading.js",
    "content": "export function showloading(txt) {\r\n    $(\"#luckysheet-cell-loading\").find(\"span\").text(txt).end().show();\r\n};\r\n\r\nexport function hideloading() {\r\n    $(\"#luckysheet-cell-loading\").hide();\r\n};"
  },
  {
    "path": "src/global/location.js",
    "content": "import { luckysheet_searcharray } from '../controllers/sheetSearch';\r\nimport Store from '../store';\r\n\r\nfunction rowLocationByIndex(row_index) {\r\n    let row = 0, row_pre = 0;\r\n    row = Store.visibledatarow[row_index];\r\n\r\n    if (row_index == 0) {\r\n        row_pre = 0;\r\n    }\r\n    else {\r\n        row_pre = Store.visibledatarow[row_index - 1];\r\n    }\r\n\r\n    return [row_pre, row, row_index];\r\n}\r\n\r\nfunction rowLocation(y) {\r\n    let row_index = luckysheet_searcharray(Store.visibledatarow, y);\r\n\r\n    if (row_index == -1 && y > 0) {\r\n        row_index = Store.visibledatarow.length - 1;\r\n    }\r\n    else if (row_index == -1 && y <= 0) {\r\n        row_index = 0;\r\n    }\r\n\r\n    return rowLocationByIndex(row_index);\r\n}\r\n\r\nfunction colLocationByIndex(col_index){\r\n    let col = 0, col_pre = 0;\r\n    col = Store.visibledatacolumn[col_index];\r\n\r\n    if (col_index == 0) {\r\n        col_pre = 0;\r\n    }\r\n    else {\r\n        col_pre = Store.visibledatacolumn[col_index - 1];\r\n    }\r\n\r\n    return [col_pre, col, col_index];\r\n}\r\n\r\nfunction colSpanLocationByIndex(col_index, span){\r\n    let col = 0, col_pre = 0;\r\n    col = Store.visibledatacolumn[col_index + span - 1];\r\n\r\n    if (col_index == 0) {\r\n        col_pre = 0;\r\n    }\r\n    else {\r\n        col_pre = Store.visibledatacolumn[col_index - 1];\r\n    }\r\n\r\n    return [col_pre, col, col_index];\r\n}\r\n\r\nfunction colLocation(x) {\r\n    let col_index = luckysheet_searcharray(Store.visibledatacolumn, x);\r\n\r\n    if (col_index == -1 && x > 0) {\r\n        col_index = Store.visibledatacolumn.length - 1;\r\n    }\r\n    else if (col_index == -1 && x <= 0) {\r\n        col_index = 0;\r\n    }\r\n\r\n    return colLocationByIndex(col_index);\r\n}\r\n\r\nfunction mouseposition(x, y) {\r\n    let container_offset = $(\"#\" + Store.container).offset();\r\n\r\n    let newX = x - container_offset.left - Store.rowHeaderWidth,\r\n        newY = y - container_offset.top - Store.infobarHeight - Store.toolbarHeight - Store.calculatebarHeight - Store.columnHeaderHeight;\r\n\r\n    return [newX, newY];\r\n}\r\n\r\nexport {\r\n    rowLocationByIndex,\r\n    rowLocation,\r\n    colLocationByIndex,\r\n    colSpanLocationByIndex,\r\n    colLocation,\r\n    mouseposition,\r\n}\r\n"
  },
  {
    "path": "src/global/method.js",
    "content": "import server from '../controllers/server';\r\nimport { luckysheetlodingHTML, luckyColor } from '../controllers/constant';\r\nimport sheetmanage from '../controllers/sheetmanage';\r\nimport luckysheetformula from './formula';\r\nimport imageCtrl from '../controllers/imageCtrl';\r\nimport dataVerificationCtrl from '../controllers/dataVerificationCtrl';\r\nimport pivotTable from '../controllers/pivotTable';\r\nimport luckysheetFreezen from '../controllers/freezen';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport { luckysheetextendData } from './extend';\r\nimport luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';\r\nimport editor from './editor';\r\nimport luckysheetcreatesheet from './createsheet';\r\nimport Store from '../store';\r\n\r\nconst defaultConfig = {\r\n    defaultStore:{\r\n        container: null, \r\n        luckysheetfile: null, \r\n        defaultcolumnNum: 60, \r\n        defaultrowNum: 84, \r\n        fullscreenmode: true,\r\n        devicePixelRatio: 1,\r\n    \r\n        currentSheetIndex: 0,\r\n        calculateSheetIndex: 0,\r\n        flowdata: [],\r\n        config: {},\r\n    \r\n        visibledatarow: [],\r\n        visibledatacolumn: [],\r\n        ch_width: 0,\r\n        rh_height: 0,\r\n    \r\n        cellmainWidth: 0,\r\n        cellmainHeight: 0,\r\n        toolbarHeight: 0,\r\n        infobarHeight: 0,\r\n        calculatebarHeight: 0,\r\n        rowHeaderWidth: 46,\r\n        columnHeaderHeight: 20,\r\n        cellMainSrollBarSize: 12,\r\n        sheetBarHeight: 31,\r\n        statisticBarHeight: 23,\r\n        luckysheetTableContentHW: [0, 0], \r\n    \r\n        defaultcollen: 73,\r\n        defaultrowlen: 19,\r\n    \r\n        jfcountfuncTimeout: null, \r\n        jfautoscrollTimeout: null,\r\n    \r\n        luckysheet_select_status: false,\r\n        luckysheet_select_save: [{ \"row\": [0, 0], \"column\": [0, 0] }],\r\n        luckysheet_selection_range: [],\r\n    \r\n        luckysheet_copy_save: {}, //复制粘贴\r\n        luckysheet_paste_iscut: false,\r\n    \r\n        filterchage: true, //筛选\r\n        luckysheet_filter_save: { \"row\": [], \"column\": [] },\r\n    \r\n        luckysheet_sheet_move_status: false,\r\n        luckysheet_sheet_move_data: [],\r\n        luckysheet_scroll_status: false,\r\n    \r\n        luckysheetisrefreshdetail: true,\r\n        luckysheetisrefreshtheme: true,\r\n        luckysheetcurrentisPivotTable: false,\r\n    \r\n        luckysheet_rows_selected_status: false,  //行列标题相关参\r\n        luckysheet_cols_selected_status: false,  \r\n        luckysheet_rows_change_size: false,\r\n        luckysheet_rows_change_size_start: [],\r\n        luckysheet_cols_change_size: false,\r\n        luckysheet_cols_change_size_start: [],\r\n        luckysheet_cols_dbclick_timeout: null,\r\n        luckysheet_cols_dbclick_times: 0,\r\n    \r\n        luckysheetCellUpdate: [],\r\n        \r\n        luckysheet_shiftpositon: null,\r\n    \r\n        iscopyself: true,\r\n    \r\n        orderbyindex: 0, //排序下标\r\n    \r\n        luckysheet_model_move_state: false, //模态框拖动\r\n        luckysheet_model_xy: [0, 0],\r\n        luckysheet_model_move_obj: null,\r\n    \r\n        luckysheet_cell_selected_move: false,  //选区拖动替换\r\n        luckysheet_cell_selected_move_index: [],\r\n    \r\n        luckysheet_cell_selected_extend: false,  //选区下拉\r\n        luckysheet_cell_selected_extend_index: [],\r\n        luckysheet_cell_selected_extend_time: null,\r\n    \r\n        clearjfundo: true,\r\n        jfredo: [],\r\n        jfundo: [],\r\n        lang: 'en', //language\r\n        createChart: '',\r\n        highlightChart: '',\r\n        zIndex: 15,\r\n        chartparam: {\r\n            luckysheetCurrentChart: null, //current chart_id\r\n            luckysheetCurrentChartActive: false,\r\n            luckysheetCurrentChartMove: null, // Debounce state\r\n            luckysheetCurrentChartMoveTimeout: null,//拖动图表框的节流定时器\r\n            luckysheetCurrentChartMoveObj: null, //chart DOM object\r\n            luckysheetCurrentChartMoveXy: null, //上一次操作结束的图表信息，x,y: chart框位置，scrollLeft1,scrollTop1: 滚动条位置\r\n            luckysheetCurrentChartMoveWinH: null, //左右滚动条滑动距离\r\n            luckysheetCurrentChartMoveWinW: null, //上下滚动条滑动距离\r\n            luckysheetCurrentChartResize: null,\r\n            luckysheetCurrentChartResizeObj: null,\r\n            luckysheetCurrentChartResizeXy: null,\r\n            luckysheetCurrentChartResizeWinH: null,\r\n            luckysheetCurrentChartResizeWinW: null,\r\n            luckysheetInsertChartTosheetChange: true, // 正在执行撤销\r\n            luckysheetCurrentChartZIndexRank : 100,\r\n            luckysheet_chart_redo_click:false, //撤销重做时标识\r\n            luckysheetCurrentChartMaxState: false, //图表全屏状态\r\n            jfrefreshchartall: '',\r\n            changeChartCellData: '',\r\n            renderChart: '',\r\n            getChartJson: ''\r\n        },\r\n        functionList:null, //function list explanation\r\n        luckysheet_function:null,\r\n        chart_selection: {},\r\n        currentChart: '',\r\n        scrollRefreshSwitch:true,\r\n    \r\n        measureTextCache:{},\r\n        measureTextCellInfoCache:{},\r\n        measureTextCacheTimeOut:null,\r\n        cellOverflowMapCache:{},\r\n    \r\n        zoomRatio:1,\r\n    \r\n        visibledatacolumn_unique:null,\r\n        visibledatarow_unique:null,\r\n    \r\n        showGridLines:true,\r\n    \r\n        toobarObject: {}, //toolbar constant\r\n        inlineStringEditCache:null,\r\n        inlineStringEditRange:null,\r\n    \r\n        fontList:[],\r\n\r\n        currentSheetView:\"viewNormal\",\r\n    \r\n    },    \r\n    defaultFormula:{\r\n        searchFunctionCell: null,\r\n        functionlistPosition: {},\r\n        rangechangeindex: null,\r\n        rangestart: false,\r\n        rangetosheet: null,\r\n        rangeSetValueTo: null,\r\n        func_selectedrange: {}, //函数选区范围\r\n        rangedrag_column_start: false,\r\n        rangedrag_row_start: false,\r\n        rangeResizeObj: null,\r\n        rangeResize: null,\r\n        rangeResizeIndex: null,\r\n        rangeResizexy: null,\r\n        rangeResizeWinH: null,\r\n        rangeResizeWinW: null,\r\n        rangeResizeTo: null,\r\n        rangeMovexy: null,\r\n        rangeMove: false,\r\n        rangeMoveObj: null,\r\n        rangeMoveIndex: null,\r\n        rangeMoveRangedata: null,\r\n        functionHTMLIndex: 0,\r\n        functionRangeIndex: null,\r\n        execvertex: {},\r\n        execFunctionGroupData: null,\r\n        execFunctionExist: null,\r\n        formulaContainSheetList:{},\r\n        cellTextToIndexList:{},\r\n        isFunctionRangeSave: false,\r\n        formulaContainCellList:{},\r\n        execFunctionGlobalData:{},\r\n        groupValuesRefreshData: [],\r\n        functionResizeData: {},\r\n        functionResizeStatus: false,\r\n        functionResizeTimeout: null,\r\n        data_parm_index: 0  //选择公式后参数索引标记\r\n    },\r\n    defaultSheet:{\r\n        sheetMaxIndex: 0,\r\n        nulldata: null,\r\n        mergeCalculationSheet:{},\r\n        checkLoadSheetIndexToDataIndex:{},\r\n        CacheNotLoadControll:[],\r\n    },\r\n    defaultPivotTable:{\r\n        pivotDatas: null,\r\n        pivotSheetIndex: 0,\r\n        pivotDataSheetIndex: 0,\r\n        celldata: null,\r\n        origindata: null,\r\n        pivot_data_type: {},\r\n        pivot_select_save: null,\r\n        column: null,\r\n        row: null,\r\n        values: null,\r\n        filter: null,\r\n        showType: null,\r\n        rowhidden: null,\r\n        selected: null,\r\n        caljs: null,\r\n        initial: true,\r\n        filterparm: null,\r\n        luckysheet_pivotTable_select_state: false,\r\n        jgridCurrentPivotInput: null,\r\n        movestate: false,\r\n        moveitemposition: [],\r\n        movesave: {},\r\n        drawPivotTable: true,\r\n        pivotTableBoundary: [12, 6],\r\n    },\r\n    defaultImage:{\r\n        imgItem: {\r\n            type: '3',  //1移动并调整单元格大小 2移动并且不调整单元格的大小 3不要移动单元格并调整其大小\r\n            src: '',  //图片url\r\n            originWidth: null,  //图片原始宽度\r\n            originHeight: null,  //图片原始高度\r\n            default: {\r\n                width: null,  //图片 宽度\r\n                height: null,  //图片 高度\r\n                left: null,  //图片离表格左边的 位置\r\n                top: null,  //图片离表格顶部的 位置\r\n            },\r\n            crop: {\r\n                width: null,  //图片裁剪后 宽度\r\n                height: null,  //图片裁剪后 高度\r\n                offsetLeft: 0,  //图片裁剪后离未裁剪时 左边的位移\r\n                offsetTop: 0,  //图片裁剪后离未裁剪时 顶部的位移\r\n            },\r\n            isFixedPos: false,  //固定位置\r\n            fixedLeft: null,  //固定位置 左位移\r\n            fixedTop: null,  //固定位置 右位移\r\n            border: {\r\n                width: 0,  //边框宽度\r\n                radius: 0,  //边框半径\r\n                style: 'solid',  //边框类型\r\n                color: '#000',  //边框颜色\r\n            }\r\n        },\r\n        images: null,\r\n        currentImgId: null,\r\n        currentWinW: null,\r\n        currentWinH: null,\r\n        resize: null,  \r\n        resizeXY: null,\r\n        move: false,\r\n        moveXY: null,\r\n        cropChange: null,  \r\n        cropChangeXY: null,\r\n        cropChangeObj: null,\r\n        copyImgItemObj: null,\r\n    },\r\n    defaultDataVerification:{\r\n        defaultItem: {\r\n            type: 'dropdown',  //类型\r\n            type2: null,  //\r\n            value1: '',  //\r\n            value2: '',  //\r\n            checked: false,\r\n            remote: false,  //自动远程获取选项\r\n            prohibitInput: false,  //输入数据无效时禁止输入\r\n            hintShow: false,  //选中单元格时显示提示语\r\n            hintText: '',  //\r\n        },\r\n        curItem: null,\r\n        dataVerification: null,\r\n        selectRange: [],\r\n        selectStatus: false,\r\n    }\r\n}\r\n\r\nconst method = {\r\n    //翻页\r\n    addDataAjax: function(param, index, url, func){\r\n        let _this = this;\r\n\r\n        if(index == null){\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        if(url == null){\r\n            url = server.loadSheetUrl;\r\n        }\r\n\r\n        $(\"#luckysheet-grid-window-1\").append(luckysheetlodingHTML());\r\n        param.currentPage++;\r\n        \r\n        let dataType = 'application/json;charset=UTF-8';\r\n        let token = sessionStorage.getItem('x-auth-token');\r\n\r\n        $.ajax({\r\n            method: 'POST',\r\n            url: url,\r\n            headers: { \"x-auth-token\": token },\r\n            data: JSON.stringify(param),\r\n            contentType: dataType,\r\n            success: function(d) {\r\n                //d可能为json字符串\r\n                if(typeof d == \"string\"){\r\n                    d = JSON.parse(d);\r\n                }\r\n\r\n                let dataset = d.data;\r\n                \r\n                let newData = dataset.celldata;\r\n                luckysheetextendData(dataset[\"row\"], newData);\r\n\r\n                setTimeout(function(){\r\n                    Store.loadingObj.close()\r\n                }, 500);\r\n\r\n                if(func && typeof(func)==\"function\"){ \r\n                    func(dataset);\r\n                }\r\n            }\r\n        })\r\n    },\r\n    //重载\r\n    reload: function(param, index, url, func){\r\n        let _this = this;\r\n\r\n        if(index == null){\r\n            index = Store.currentSheetIndex;\r\n        }\r\n\r\n        if(url == null){\r\n            url = server.loadSheetUrl;\r\n        }\r\n\r\n        $(\"#luckysheet-grid-window-1\").append(luckysheetlodingHTML());\r\n\r\n        let arg = {\"gridKey\" : server.gridKey, \"index\": index};\r\n        param = $.extend(true, param, arg);\r\n        let file = Store.luckysheetfile[getSheetIndex(index)];\r\n\r\n        $.post(url, param, function (d) {\r\n            let dataset = new Function(\"return \" + d)();\r\n            file.celldata = dataset[index.toString()];\r\n            let data = sheetmanage.buildGridData(file);\r\n\r\n            setTimeout(function(){\r\n                Store.loadingObj.close()\r\n            }, 500);\r\n\r\n            file[\"data\"] = data;\r\n            Store.flowdata = data;\r\n            editor.webWorkerFlowDataCache(data);//worker存数据\r\n\r\n            luckysheetcreatesheet(data[0].length, data.length, data, null, false);\r\n            file[\"load\"] = \"1\";\r\n\r\n            Store.luckysheet_select_save.length = 0;\r\n            Store.luckysheet_selection_range = [];\r\n\r\n            server.saveParam(\"shs\", null, Store.currentSheetIndex);\r\n\r\n            sheetmanage.changeSheet(index);\r\n\r\n            if(func && typeof(func)==\"function\"){ \r\n                func();\r\n            }\r\n        });\r\n    },\r\n    clearSheetByIndex: function(i){\r\n        let index = getSheetIndex(i);\r\n        let sheetfile = Store.luckysheetfile[index];\r\n\r\n        if(!sheetfile.isPivotTable){\r\n            sheetfile.data = [];\r\n            sheetfile.row = Store.defaultrowNum;\r\n            sheetfile.column = Store.defaultcolumnNum;\r\n\r\n            sheetfile.chart = [];\r\n            sheetfile.config = null;\r\n            sheetfile.filter = null;\r\n            sheetfile.filter_select = null;\r\n            sheetfile.celldata = [];\r\n            sheetfile.pivotTable = {};\r\n            sheetfile.calcChain = [];\r\n            sheetfile.status = 0;\r\n            sheetfile.load = 0;\r\n\r\n            Store.flowdata = [];\r\n            editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n\r\n            $(\"#\"+ Store.container +\" .luckysheet-data-visualization-chart\").remove();\r\n            $(\"#\"+ Store.container +\" .luckysheet-datavisual-selection-set\").remove();\r\n\r\n            $(\"#luckysheet-row-count-show, #luckysheet-formula-functionrange-select, #luckysheet-row-count-show, #luckysheet-column-count-show, #luckysheet-change-size-line, #luckysheet-cell-selected-focus, #luckysheet-selection-copy, #luckysheet-cell-selected-extend, #luckysheet-cell-selected-move, #luckysheet-cell-selected\").hide();\r\n\r\n            delete sheetfile.load;\r\n        }\r\n        else {\r\n            delete Store.luckysheetfile[index];\r\n        }\r\n    },\r\n    clear: function(index){\r\n        let _this = this;\r\n\r\n        if(index == \"all\"){\r\n            for(let i = 0; i < Store.luckysheetfile.length; i++){\r\n                let sheetfile = Store.luckysheetfile[i];\r\n                _this.clearSheetByIndex(sheetfile.index);\r\n            }\r\n            \r\n        }\r\n        else{\r\n            if(index == null){\r\n                index = Store.currentSheetIndex;\r\n            }\r\n            _this.clearSheetByIndex(index);\r\n        }\r\n\r\n        sheetmanage.changeSheet(Store.luckysheetfile[0].index);\r\n    },\r\n    destroy:function(){\r\n        $(\"#\" + Store.container).empty();\r\n        $(\"body > .luckysheet-cols-menu\").remove();\r\n\r\n        $(\"#luckysheet-modal-dialog-mask, #luckysheetTextSizeTest, #luckysheet-icon-morebtn-div\").remove();\r\n        $(\"#luckysheet-input-box\").parent().remove();\r\n        $(\"#luckysheet-formula-help-c\").remove();\r\n        $(\".chartSetting, .luckysheet-modal-dialog-slider\").remove();\r\n\r\n        //document event release\r\n        $(document).off(\".luckysheetEvent\");\r\n        $(document).off(\".luckysheetProtection\");\r\n        \r\n        //参数重置\r\n        luckysheetFreezen.initialHorizontal = true;\r\n        luckysheetFreezen.initialVertical = true;\r\n\r\n        let defaultStore = $.extend(true, {}, defaultConfig.defaultStore);\r\n        for(let key in defaultStore){\r\n            if(key in Store){\r\n                Store[key] = defaultStore[key];\r\n            }\r\n        }\r\n\r\n        let defaultFormula = $.extend(true, {}, defaultConfig.defaultFormula);\r\n        for(let key in defaultFormula){\r\n            if(key in luckysheetformula){\r\n                luckysheetformula[key] = defaultFormula[key];\r\n            }\r\n        }\r\n\r\n        let defaultSheet = $.extend(true, {}, defaultConfig.defaultSheet);\r\n        for(let key in defaultSheet){\r\n            if(key in sheetmanage){\r\n                sheetmanage[key] = defaultSheet[key];\r\n            }\r\n        }\r\n\r\n        let defaultPivotTable = $.extend(true, {}, defaultConfig.defaultPivotTable);\r\n        for(let key in defaultPivotTable){\r\n            if(key in pivotTable){\r\n                pivotTable[key] = defaultPivotTable[key];\r\n            }\r\n        }\r\n\r\n        let defaultImage = $.extend(true, {}, defaultConfig.defaultImage);\r\n        for(let key in defaultImage){\r\n            if(key in imageCtrl){\r\n                imageCtrl[key] = defaultImage[key];\r\n            }\r\n        }\r\n\r\n        let defaultDataVerification = $.extend(true, {}, defaultConfig.defaultDataVerification);\r\n        for(let key in defaultDataVerification){\r\n            if(key in dataVerificationCtrl){\r\n                dataVerificationCtrl[key] = defaultDataVerification[key];\r\n            }\r\n        }\r\n\r\n        // remove proxy\r\n        Store.asyncLoad = ['core'];\r\n    },\r\n    editorChart:function(c){\r\n        let chart_selection_color = luckyColor[0];\r\n        let chart_id = \"luckysheetEditMode-datav-chart\";\r\n        let chart_selection_id = chart_id + \"_selection\";\r\n        c.chart_id = chart_id;\r\n        let chartTheme = c.chartTheme;\r\n        chartTheme = chartTheme == null ? \"default0000\" : chartTheme;\r\n\r\n        luckysheet.insertChartTosheet(c.sheetIndex, c.dataSheetIndex, c.option, c.chartType, c.selfOption, c.defaultOption, c.row, c.column, chart_selection_color, chart_id, chart_selection_id, c.chartStyle, c.rangeConfigCheck, c.rangeRowCheck, c.rangeColCheck, c.chartMarkConfig, c.chartTitleConfig, c.winWidth, c.winHeight, c.scrollLeft, c.scrollTop, chartTheme, c.myWidth, c.myHeight, c.myLeft!=null?parseFloat(c.myLeft):null, c.myTop!=null?parseFloat(c.myTop):null, c.myindexrank, true);\r\n\r\n        $(\"#\"+chart_id).find(\".luckysheet-modal-controll-update\").click();\r\n    },\r\n    /**\r\n     * 获取单元格的值\r\n     * @param {name} 函数名称\r\n     * @param {arguments} 函数参数\r\n     */\r\n    createHookFunction:function(){\r\n        let hookName = arguments[0];\r\n        if(luckysheetConfigsetting.hook && luckysheetConfigsetting.hook[hookName]!=null && (typeof luckysheetConfigsetting.hook[hookName] == \"function\")){\r\n            var args = Array.prototype.slice.apply(arguments);\r\n            args.shift();\r\n            let ret = luckysheetConfigsetting.hook[hookName].apply(this, args);\r\n            if(ret===false){\r\n                return false;\r\n            }\r\n            else{\r\n                return true;\r\n            }\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n}\r\n\r\nexport default method;"
  },
  {
    "path": "src/global/refresh.js",
    "content": "import rhchInit from './rhchInit';\r\nimport formula from './formula';\r\nimport editor from './editor';\r\nimport { setcellvalue } from './setdata';\r\nimport { getcellFormula } from './getdata';\r\nimport { computeRowlenArr } from './getRowlen';\r\nimport { \r\n    luckysheetDrawMain, \r\n    luckysheetDrawgridRowTitle, \r\n    luckysheetDrawgridColumnTitle \r\n} from './draw';\r\nimport luckysheetFreezen from '../controllers/freezen';\r\nimport server from '../controllers/server';\r\nimport sheetmanage from '../controllers/sheetmanage';\r\nimport luckysheetPostil from '../controllers/postil';\r\nimport dataVerificationCtrl from '../controllers/dataVerificationCtrl';\r\nimport hyperlinkCtrl from '../controllers/hyperlinkCtrl';\r\nimport { selectHightlightShow, selectionCopyShow, collaborativeEditBox } from '../controllers/select';\r\nimport { createFilterOptions } from '../controllers/filter';\r\nimport { getSheetIndex } from '../methods/get';\r\nimport Store from '../store';\r\n\r\nlet refreshCanvasTimeOut = null;\r\n\r\nfunction runExecFunction(range, index, data){\r\n    formula.execFunctionExist = [];\r\n    for(let s = 0; s < range.length; s++){\r\n        for(let r = range[s].row[0]; r <= range[s].row[1]; r++){\r\n            for(let c = range[s].column[0]; c <= range[s].column[1]; c++){\r\n                formula.execFunctionExist.push({ \"r\": r, \"c\": c, \"i\": index });\r\n            }\r\n        }\r\n    }\r\n    formula.execFunctionExist.reverse();\r\n    formula.execFunctionGroup(null, null, null, null, data);\r\n    formula.execFunctionGlobalData = null;\r\n}\r\n\r\nfunction jfrefreshgrid(data, range, allParam, isRunExecFunction = true, isRefreshCanvas = true) {\r\n    if(data == null){\r\n        data = Store.flowdata;\r\n    }\r\n\r\n    if(range == null){\r\n        range = Store.luckysheet_select_save;\r\n    }\r\n    range = JSON.parse(JSON.stringify(range));\r\n\r\n    clearTimeout(refreshCanvasTimeOut);\r\n\r\n    //关联参数\r\n    if(allParam == null){\r\n        allParam = {};\r\n    }\r\n\r\n    let cfg = allParam[\"cfg\"];  //config\r\n    let calc = allParam[\"calc\"];\r\n    let RowlChange = allParam[\"RowlChange\"];  //行高改变\r\n    let cdformat = allParam[\"cdformat\"];  //条件格式\r\n    let dataVerification = allParam[\"dataVerification\"];  //数据验证\r\n    let dynamicArray = allParam[\"dynamicArray\"];  //动态数组\r\n    let hyperlink = allParam[\"hyperlink\"];\r\n\r\n    let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n\r\n    if (Store.clearjfundo) {\r\n        Store.jfundo.length  = 0;\r\n\r\n        let curConfig;\r\n        if(cfg == null){\r\n            curConfig = $.extend(true, {}, Store.config);\r\n        }\r\n        else{\r\n            curConfig = $.extend(true, {}, cfg);\r\n        }\r\n\r\n        let curCdformat;\r\n        if(cdformat == null){\r\n            curCdformat = $.extend(true, [], file[\"luckysheet_conditionformat_save\"]);\r\n        }\r\n        else{\r\n            curCdformat = cdformat;\r\n        }\r\n\r\n        let curDataVerification;\r\n        if(dataVerification == null){\r\n            curDataVerification = $.extend(true, {}, file[\"dataVerification\"])\r\n        }\r\n        else{\r\n            curDataVerification = dataVerification;\r\n        }\r\n\r\n        let curDynamicArray;\r\n        if(dynamicArray == null){\r\n            curDynamicArray = $.extend(true, [], file[\"dynamicArray\"]);\r\n        }\r\n        else{\r\n            curDynamicArray = dynamicArray;\r\n        }\r\n        \r\n        Store.jfredo.push({ \r\n            \"type\": \"datachange\", \r\n            \"data\": Store.flowdata, \r\n            \"curdata\": data,\r\n            \"sheetIndex\": Store.currentSheetIndex, \r\n            \"config\": $.extend(true, {}, Store.config), \r\n            \"curConfig\": curConfig,\r\n            \"calc\": $.extend(true, [], file.calcChain),\r\n            \"curCalc\": calc,\r\n            \"cdformat\":  $.extend(true, [], file[\"luckysheet_conditionformat_save\"]),\r\n            \"curCdformat\": curCdformat,\r\n            \"RowlChange\": RowlChange,\r\n            \"dataVerification\": $.extend(true, [], file[\"dataVerification\"]),\r\n            \"curDataVerification\": curDataVerification,\r\n            \"dynamicArray\": $.extend(true, [], file[\"dynamicArray\"]),\r\n            \"curDynamicArray\": curDynamicArray,\r\n            \"hyperlink\": hyperlink && $.extend(true, {}, file.hyperlink),\r\n            \"curHyperlink\": hyperlink,\r\n            \"range\": range,\r\n            \"dataRange\": [...file.luckysheet_select_save]// 保留操作时的选区\r\n        });\r\n    }\r\n\r\n    //Store.flowdata\r\n    Store.flowdata = data;\r\n    editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n    file.data = Store.flowdata;\r\n\r\n    // 必须要处理，可能之前的config为空，则也需要清空\r\n    if(cfg != null){\r\n        Store.config = cfg;\r\n        file.config = Store.config;\r\n\r\n        server.saveParam(\"all\", Store.currentSheetIndex, cfg, { \"k\": \"config\" });\r\n\r\n        if(RowlChange != null){\r\n            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n        }\r\n    }\r\n\r\n    if(calc != null){\r\n        file.calcChain = calc;\r\n        server.saveParam(\"all\", Store.currentSheetIndex, calc, { \"k\": \"calcChain\" });\r\n    }\r\n\r\n    //condition format, null or empty array are not processed\r\n    if(cdformat != null && cdformat.length !== 0){\r\n        file[\"luckysheet_conditionformat_save\"] = cdformat;\r\n\r\n        server.saveParam(\"all\", Store.currentSheetIndex, cdformat, { \"k\": \"luckysheet_conditionformat_save\" });\r\n    }\r\n\r\n    //data Verification, null or empty object are not processed\r\n    if(dataVerification != null && Object.keys(dataVerification).length !== 0){\r\n        dataVerificationCtrl.dataVerification = dataVerification;\r\n        file[\"dataVerification\"] = dataVerification;\r\n        server.saveParam(\"all\", Store.currentSheetIndex, dataVerification, { \"k\": \"dataVerification\" });\r\n    }\r\n\r\n    //动态数组\r\n    if(dynamicArray != null){\r\n        file[\"dynamicArray\"] = dynamicArray;\r\n\r\n        server.saveParam(\"all\", Store.currentSheetIndex, dynamicArray, { \"k\": \"dynamicArray\" });\r\n    }\r\n\r\n    if(hyperlink != null){\r\n        file[\"hyperlink\"] = hyperlink;\r\n        hyperlinkCtrl.hyperlink = hyperlink;\r\n        server.saveParam(\"all\", Store.currentSheetIndex, hyperlink, { \"k\": \"hyperlink\" });\r\n    }\r\n\r\n    //更新数据的范围\r\n    for(let s = 0; s < range.length; s++){\r\n        let r1 = range[s].row[0];\r\n        let c1 = range[s].column[0];\r\n\r\n        if(Store.flowdata[r1][c1] != null && Store.flowdata[r1][c1].spl != null){\r\n            window.luckysheetCurrentRow = r1;\r\n            window.luckysheetCurrentColumn = c1;\r\n            window.luckysheetCurrentFunction = Store.flowdata[r1][c1].f;\r\n\r\n            let fp = $.trim(formula.functionParserExe(Store.flowdata[r1][c1].f));\r\n            let sparklines = new Function(\"return \" +fp)();\r\n            Store.flowdata[r1][c1].spl = sparklines;\r\n        }\r\n\r\n        if(server.allowUpdate){ //共享编辑模式\r\n            server.historyParam(Store.flowdata, Store.currentSheetIndex, range[s]);\r\n        }\r\n        // 刷新图表\r\n        if(typeof(Store.chartparam.jfrefreshchartall)==\"function\"){\r\n            Store.chartparam.jfrefreshchartall(Store.flowdata,range[s].row[0],range[s].row[1],range[s].column[0],range[s].column[1]);\r\n        }\r\n    }\r\n    //单元格数据更新联动\r\n    if (isRunExecFunction) {\r\n        runExecFunction(range, Store.currentSheetIndex, data);\r\n    }\r\n    //刷新表格\r\n    if(isRefreshCanvas){\r\n        refreshCanvasTimeOut = setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n\r\n    /* 选区同步 */\r\n    selectHightlightShow();\r\n    window.luckysheet_getcelldata_cache = null;\r\n}\r\n\r\nfunction jfrefreshgridall(colwidth, rowheight, data, cfg, range, ctrlType, ctrlValue, cdformat, isRefreshCanvas=true) {\r\n    let redo = {}, isRunExecFunction=false;\r\n    clearTimeout(refreshCanvasTimeOut);\r\n    if (ctrlType == \"cellRowChange\") {\r\n        redo[\"type\"] = \"cellRowChange\";\r\n        redo[\"config\"] = $.extend(true, {}, Store.config);\r\n        redo[\"curconfig\"] = $.extend(true, {}, cfg);\r\n\r\n        redo[\"range\"] = $.extend(true, [], Store.luckysheet_select_save);\r\n        redo[\"currange\"] = range;\r\n\r\n        redo[\"ctrlType\"] = ctrlType;\r\n        redo[\"ctrlValue\"] = ctrlValue;\r\n\r\n        let setfield = cfg[\"rowlen\"];\r\n\r\n        if(setfield == null){\r\n            setfield = {};\r\n        }\r\n\r\n        server.saveParam(\"cg\", Store.currentSheetIndex, setfield, { \"k\": \"rowlen\" });\r\n    }\r\n    else if (ctrlType == \"resizeC\") {\r\n        redo[\"type\"] = \"resize\";\r\n        redo[\"config\"] = $.extend(true, {}, Store.config);\r\n        redo[\"curconfig\"] = $.extend(true, {}, cfg);\r\n\r\n        redo[\"range\"] = $.extend(true, [], Store.luckysheet_select_save);\r\n        redo[\"currange\"] = range;\r\n\r\n        redo[\"ctrlType\"] = ctrlType;\r\n        redo[\"ctrlValue\"] = ctrlValue;\r\n\r\n        let setfield = cfg[\"columnlen\"];\r\n\r\n        if(setfield == null){\r\n            setfield = {};\r\n        }\r\n\r\n        server.saveParam(\"cg\", Store.currentSheetIndex, setfield, { \"k\": \"columnlen\" });\r\n    }\r\n    else if (ctrlType.indexOf(\"extend\")>-1) {\r\n        redo[\"type\"] = \"extend\";\r\n        redo[\"config\"] = $.extend(true, {}, Store.config);\r\n        redo[\"curconfig\"] = $.extend(true, {}, cfg);\r\n\r\n        redo[\"range\"] = $.extend(true, [], Store.luckysheet_select_save);\r\n        redo[\"currange\"] = range;\r\n\r\n        redo[\"ctrlType\"] = ctrlType;\r\n        redo[\"ctrlValue\"] = ctrlValue;\r\n\r\n        server.saveParam(\"arc\", Store.currentSheetIndex, {\"index\": ctrlValue.index, \"len\": ctrlValue.len, \"direction\": ctrlValue.direction, \"mc\": cfg.merge }, { \"rc\": ctrlValue.type });\r\n    }\r\n    else if (ctrlType.indexOf(\"dele\")>-1) {\r\n        redo[\"type\"] = \"dele\";\r\n        redo[\"config\"] = $.extend(true, {}, Store.config);\r\n        redo[\"curconfig\"] = $.extend(true, {}, cfg);\r\n\r\n        redo[\"range\"] = $.extend(true, [], Store.luckysheet_select_save);\r\n        redo[\"currange\"] = range;\r\n\r\n        redo[\"ctrlType\"] = ctrlType;\r\n        redo[\"ctrlValue\"] = ctrlValue;\r\n\r\n        server.saveParam(\"drc\", Store.currentSheetIndex, {\"index\": ctrlValue.index, \"len\":ctrlValue.len, \"mc\": cfg.merge, \"borderInfo\": cfg.borderInfo }, { \"rc\": ctrlValue.type});\r\n    }\r\n    else {\r\n        redo[\"type\"] = \"datachangeAll\";\r\n\r\n        redo[\"range\"] = $.extend(true, [], Store.luckysheet_select_save);\r\n        redo[\"currange\"] = range;\r\n\r\n        redo[\"ctrlType\"] = ctrlType;\r\n        redo[\"ctrlValue\"] = ctrlValue;\r\n\r\n        isRunExecFunction = true;\r\n\r\n        for(let s = 0; s < range.length; s++){\r\n            server.historyParam(data, Store.currentSheetIndex, range[s]);    \r\n        }\r\n    }\r\n\r\n    if (Store.clearjfundo) {\r\n        Store.jfundo.length  = 0;\r\n\r\n        redo[\"data\"] = Store.flowdata;\r\n        redo[\"curdata\"] = data;\r\n        redo[\"sheetIndex\"] = Store.currentSheetIndex;\r\n        redo[\"cdformat\"] = $.extend(true, [], Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"]);\r\n        redo[\"curCdformat\"] = cdformat;\r\n\r\n        Store.jfredo.push(redo);\r\n    }\r\n\r\n    //Store.flowdata\r\n    Store.flowdata = data;\r\n    editor.webWorkerFlowDataCache(data);//worker存数据\r\n    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = Store.flowdata;\r\n\r\n    //config\r\n    if (cfg != null) {\r\n        Store.config = cfg;\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;\r\n\r\n        server.saveParam(\"all\", Store.currentSheetIndex, cfg, { \"k\": \"config\" });\r\n    }\r\n\r\n    //条件格式\r\n    if(cdformat != null){\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] = cdformat;\r\n    \r\n        server.saveParam(\"all\", Store.currentSheetIndex, cdformat, { \"k\": \"luckysheet_conditionformat_save\" });\r\n    }\r\n\r\n    //选区\r\n    Store.luckysheet_select_save = $.extend(true, [], range);\r\n    if(Store.luckysheet_select_save.length > 0){\r\n        //有选区时，刷新一下选区\r\n        selectHightlightShow();\r\n    }\r\n\r\n\r\n    if(isRunExecFunction){\r\n        //单元格数据更新联动\r\n        runExecFunction(range, Store.currentSheetIndex, data);\r\n    }\r\n\r\n    //行高、列宽 刷新  \r\n    jfrefreshgrid_rhcw(rowheight, colwidth);\r\n\r\n    if(isRefreshCanvas){\r\n        refreshCanvasTimeOut = setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n    \r\n\r\n    sheetmanage.storeSheetParamALL();\r\n    \r\n    window.luckysheet_getcelldata_cache = null;\r\n}\r\n\r\nfunction jfrefreshrange(data, range, cdformat) {\r\n    clearTimeout(refreshCanvasTimeOut);\r\n\r\n    if (Store.clearjfundo) {\r\n        Store.jfundo.length  = 0;\r\n\r\n        Store.jfredo.push({ \r\n            \"type\": \"rangechange\", \r\n            \"data\": Store.flowdata, \r\n            \"curdata\": data,\r\n            \"range\": range, \r\n            \"sheetIndex\": Store.currentSheetIndex,\r\n            \"cdformat\":  $.extend(true, [],  Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"]),\r\n            \"curCdformat\": cdformat \r\n        });\r\n    }\r\n\r\n    //flowdata\r\n    Store.flowdata = data;\r\n    editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n\r\n    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = Store.flowdata;\r\n\r\n    //条件格式\r\n    if(cdformat != null){\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][\"luckysheet_conditionformat_save\"] = cdformat;\r\n    }\r\n\r\n    //单元格数据更新联动\r\n    runExecFunction(range, Store.currentSheetIndex, data);\r\n\r\n    //刷新表格\r\n    refreshCanvasTimeOut = setTimeout(function () {\r\n        luckysheetrefreshgrid();\r\n    }, 1);\r\n\r\n    //发送给后台\r\n    for(let s = 0; s < range.length; s++){\r\n        server.historyParam(Store.flowdata, Store.currentSheetIndex, range[s]);\r\n    }\r\n}\r\n\r\n//删除、增加行列 刷新表格\r\nfunction jfrefreshgrid_adRC(data, cfg, ctrlType, ctrlValue, calc, filterObj, cf, af, freezen, dataVerification, hyperlink){\r\n    let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n    collaborativeEditBox();\r\n    //merge改变对应的单元格值改变\r\n    let mcData = [];\r\n    for(let m in cfg[\"merge\"]){\r\n        let mc = cfg[\"merge\"][m];\r\n\r\n        for(let r = mc.r; r <= mc.r + mc.rs - 1; r++){\r\n            for(let c = mc.c; c <= mc.c + mc.cs - 1; c++){\r\n                if(data[r][c] == null){\r\n                    data[r][c] = {};\r\n                }\r\n\r\n                if(r == mc.r && c == mc.c){\r\n                    data[r][c].mc = mc;\r\n                }\r\n                else{\r\n                    data[r][c].mc = { \"r\": mc.r, \"c\": mc.c };\r\n                }\r\n\r\n                mcData.push({ \"r\": r, \"c\": c });                       \r\n            }\r\n        }\r\n    }\r\n\r\n    //公式链中公式范围改变对应单元格值的改变\r\n    let funcData = [];\r\n    // if(calc.length > 0){\r\n    //     // 取消execFunctionGroupData，改用execFunctionGlobalData\r\n    //     // formula.execFunctionGroupData = data;\r\n\r\n    //     for(let i = 0; i < calc.length; i++){\r\n    //         let clc = calc[i];\r\n    //         let clc_r = clc.r, clc_c = clc.c, clc_i = clc.index, clc_funcStr =  getcellFormula(clc_r, clc_c, clc_i, data);\r\n            \r\n    //         let clc_result = formula.execfunction(clc_funcStr, clc_r, clc_c, clc_i,null, true);\r\n    //         clc.func = clc_result;\r\n\r\n    //         if(data[clc_r][clc_c].f == clc_funcStr){\r\n    //             setcellvalue(clc_r, clc_c, data, clc_result[1]);\r\n    //             // funcData存储当前结果没有用处，每次还是需要从calc公式链实时从当前数据中计算比较靠谱\r\n    //             // funcData.push({ \"r\": clc_r, \"c\": clc_c });\r\n    //         }\r\n    //     }\r\n    // }\r\n\r\n    if(Store.clearjfundo){\r\n        Store.jfundo.length  = 0;\r\n\r\n        Store.jfredo.push({\r\n            \"type\": ctrlType,\r\n            \"sheetIndex\": Store.currentSheetIndex,\r\n            \"data\": Store.flowdata,\r\n            \"curData\": data,\r\n            \"config\": $.extend(true, {}, Store.config),\r\n            \"curConfig\": cfg,\r\n            \"ctrlValue\": ctrlValue,\r\n            \"mcData\": mcData,\r\n            \"calc\": $.extend(true, [], file.calcChain),\r\n            \"curCalc\": calc,\r\n            \"funcData\": funcData,\r\n            \"filterObj\": { \"filter_select\": $.extend(true, {}, file.filter_select), \"filter\": $.extend(true, {}, file.filter) },\r\n            \"curFilterObj\": filterObj,\r\n            \"cf\": $.extend(true, [], file.luckysheet_conditionformat_save),\r\n            \"curCf\": cf,\r\n            \"af\": $.extend(true, [], file.luckysheet_alternateformat_save),\r\n            \"curAf\": af,\r\n            \"freezen\": { \"freezenhorizontaldata\": luckysheetFreezen.freezenhorizontaldata, \"freezenverticaldata\": luckysheetFreezen.freezenverticaldata },\r\n            \"curFreezen\": freezen,\r\n            \"dataVerification\": $.extend(true, {}, file.dataVerification),\r\n            \"curDataVerification\": dataVerification,\r\n            \"hyperlink\": $.extend(true, {}, file.hyperlink),\r\n            \"curHyperlink\": hyperlink,\r\n            \"range\": file.luckysheet_select_save,\r\n            \"dataRange\": [...file.luckysheet_select_save]// 保留操作时的选区\r\n        });\r\n    }\r\n\r\n    let index = ctrlValue.index,\r\n        len = ctrlValue.len,\r\n        rc = ctrlValue.rc;\r\n\r\n    if(ctrlType == \"addRC\"){\r\n        let direction = ctrlValue.direction,\r\n            restore = ctrlValue.restore;\r\n\r\n        let addData = [];\r\n        if(restore){\r\n            if(rc == \"r\"){\r\n                let st_r;\r\n                if(direction == \"lefttop\"){\r\n                    st_r = index;\r\n                }\r\n                else if(direction == \"rightbottom\"){\r\n                    st_r = index + 1;\r\n                }\r\n                let ed_r = st_r + len - 1;\r\n\r\n                for(let r = st_r; r <= ed_r; r++){\r\n                    let row = [];\r\n                    for(let c = 0; c < data[0].length; c++){\r\n                        let cell = data[r][c];\r\n                        row.push(cell);\r\n                    }\r\n                    addData.push(row);\r\n                }\r\n            }\r\n            else if(rc == \"c\"){\r\n                let st_c;\r\n                if(direction == \"lefttop\"){\r\n                    st_c = index;\r\n                }\r\n                else if(direction == \"rightbottom\"){\r\n                    st_c = index + 1;\r\n                }\r\n                let ed_c = st_c + len - 1;\r\n\r\n                for(let r = 0; r < data.length; r++){\r\n                    let row = [];\r\n                    for(let c = st_c; c <= ed_c; c++){\r\n                        let cell = data[r][c];\r\n                        row.push(cell);\r\n                    }\r\n                    addData.push(row);\r\n                }\r\n            }\r\n        }\r\n\r\n        server.saveParam(\"arc\", Store.currentSheetIndex, {\"index\": index, \"len\": len, \"direction\": direction, \"data\": addData }, { \"rc\": rc });\r\n    }\r\n    else if(ctrlType == \"delRC\"){\r\n        server.saveParam(\"drc\", Store.currentSheetIndex, {\"index\": index, \"len\": len }, { \"rc\": rc });\r\n    }\r\n\r\n    //Store.flowdata\r\n    Store.flowdata = data;\r\n    editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n    file.data = data;\r\n\r\n    //config\r\n    Store.config = cfg;\r\n    file.config = Store.config;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, cfg, { \"k\": \"config\" });\r\n\r\n    //mcData\r\n    for(let i = 0; i < mcData.length; i++){\r\n        let mcData_r = mcData[i].r,\r\n            mcData_c = mcData[i].c;\r\n\r\n        server.saveParam(\"v\", Store.currentSheetIndex, Store.flowdata[mcData_r][mcData_c], { \"r\": mcData_r, \"c\": mcData_c });\r\n    }\r\n\r\n    //公式链中公式范围改变对应单元格值的改变\r\n    if(calc.length > 0){\r\n        // 取消execFunctionGroupData，改用execFunctionGlobalData\r\n        // formula.execFunctionGroupData = data;\r\n\r\n        for(let i = 0; i < calc.length; i++){\r\n            let clc = calc[i];\r\n            let clc_r = clc.r, clc_c = clc.c, clc_i = clc.index, clc_funcStr =  getcellFormula(clc_r, clc_c, clc_i, data);\r\n            \r\n            let clc_result = formula.execfunction(clc_funcStr, clc_r, clc_c, clc_i,null, true);\r\n            clc.func = clc_result;\r\n\r\n            if(data[clc_r][clc_c].f == clc_funcStr){\r\n                setcellvalue(clc_r, clc_c, data, clc_result[1]);\r\n                // funcData存储当前结果没有用处，每次还是需要从calc公式链实时从当前数据中计算比较靠谱\r\n                // funcData.push({ \"r\": clc_r, \"c\": clc_c });\r\n            }\r\n        }\r\n    }\r\n\r\n    //calc函数链\r\n    file.calcChain = calc;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, calc, { \"k\": \"calcChain\" });\r\n    for(let i = 0; i < funcData.length; i++){\r\n        let funcData_r = funcData[i].r,\r\n            funcData_c = funcData[i].c;\r\n\r\n        server.saveParam(\"v\", Store.currentSheetIndex, Store.flowdata[funcData_r][funcData_c], { \"r\": funcData_r, \"c\": funcData_c });\r\n    }\r\n\r\n    //筛选配置\r\n    if(filterObj != null){\r\n        file.filter_select = filterObj.filter_select;\r\n        file.filter = filterObj.filter;\r\n    }\r\n    else{\r\n        file.filter_select = null;\r\n        file.filter = null;\r\n    }\r\n    createFilterOptions(file.filter_select, file.filter);\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.filter_select, { \"k\": \"filter_select\" });\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.filter, { \"k\": \"filter\" });\r\n\r\n    //条件格式配置\r\n    file.luckysheet_conditionformat_save = cf;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.luckysheet_conditionformat_save, { \"k\": \"luckysheet_conditionformat_save\" });\r\n\r\n    //交替颜色配置\r\n    file.luckysheet_alternateformat_save = af;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.luckysheet_alternateformat_save, { \"k\": \"luckysheet_alternateformat_save\" });\r\n\r\n    //冻结配置\r\n    if(freezen != null){\r\n        luckysheetFreezen.freezenhorizontaldata = freezen.freezenhorizontaldata;\r\n        luckysheetFreezen.freezenverticaldata = freezen.freezenverticaldata;\r\n    }\r\n    else{\r\n        luckysheetFreezen.freezenhorizontaldata = null;\r\n        luckysheetFreezen.freezenverticaldata = null;\r\n    }\r\n\r\n    //数据验证\r\n    dataVerificationCtrl.dataVerification = dataVerification;\r\n    file.dataVerification = dataVerification;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.dataVerification, { \"k\": \"dataVerification\" });\r\n\r\n    //超链接\r\n    hyperlinkCtrl.hyperlink = hyperlink;\r\n    file.hyperlink = hyperlink;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.hyperlink, { \"k\": \"hyperlink\" });\r\n\r\n    //行高、列宽刷新\r\n    jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);\r\n}\r\n\r\n//删除单元格 刷新表格\r\nfunction jfrefreshgrid_deleteCell(data, cfg, ctrl, calc, filterObj, cf, dataVerification, hyperlink){\r\n    let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];\r\n    clearTimeout(refreshCanvasTimeOut);\r\n    collaborativeEditBox();\r\n    //merge改变对应的单元格值改变\r\n    let mcData = [];\r\n    if(JSON.stringify(cfg[\"merge\"]) == \"{}\"){\r\n        for(let r = 0; r < data.length; r++){\r\n            for(let c = 0; c < data[0].length; c++){\r\n                let cell = data[r][c];\r\n    \r\n                if(cell != null && cell.mc != null){\r\n                    delete cell.mc;\r\n                    mcData.push({ \"r\": r, \"c\": c });\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else{\r\n        for(let m in cfg[\"merge\"]){\r\n            let mc = cfg[\"merge\"][m];\r\n    \r\n            for(let r = mc.r; r <= mc.r + mc.rs - 1; r++){\r\n                for(let c = mc.c; c <= mc.c + mc.cs - 1; c++){\r\n                    if(data[r][c] == null){\r\n                        data[r][c] = {};\r\n                    }\r\n    \r\n                    // if(r == mc.r && c == mc.c){\r\n                    //     data[r][c].mc = mc;\r\n                    // }\r\n                    // else{\r\n                    //     data[r][c].mc = { \"r\": mc.r, \"c\": mc.c };\r\n                    // }\r\n    \r\n                    // mcData.push({ \"r\": r, \"c\": c });        \r\n                    \r\n\r\n                    if(r == mc.r && c == mc.c){\r\n                        if(JSON.stringify(data[r][c].mc) !=JSON.stringify(mc)){\r\n                            data[r][c].mc = mc;\r\n                            mcData.push({ \"r\": r, \"c\": c });   \r\n                        }\r\n                    }\r\n                    else{\r\n                        let tempMc = { \"r\": mc.r, \"c\": mc.c };\r\n                        if(JSON.stringify(data[r][c].mc) != JSON.stringify(tempMc)){\r\n                            data[r][c].mc = tempMc;\r\n                            mcData.push({ \"r\": r, \"c\": c });   \r\n                        }\r\n                    }   \r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    //公式链中公式范围改变对应单元格值的改变\r\n    let funcData = [];\r\n    // if(calc.length > 0){\r\n    //     // formula.execFunctionGroupData = data;\r\n\r\n    //     for(let i = 0; i < calc.length; i++){\r\n    //         let clc = calc[i];\r\n    //         let clc_r = clc.r, clc_c = clc.c, clc_i = clc.index, clc_funcStr =  getcellFormula(clc_r, clc_c, clc_i, data);\r\n    //         let clc_result = formula.execfunction(clc_funcStr, clc_r, clc_c, clc_i,null, true);\r\n    //         clc.func = clc_result;\r\n\r\n    //         if(data[clc_r][clc_c].f == clc_funcStr){\r\n    //             setcellvalue(clc_r, clc_c, data, clc_result[1]);\r\n    //             funcData.push({ \"r\": clc_r, \"c\": clc_c });\r\n    //         }\r\n    //     }\r\n    // }\r\n\r\n    if(Store.clearjfundo){\r\n        Store.jfundo.length  = 0;\r\n\r\n        Store.jfredo.push({\r\n            \"type\": \"deleteCell\",\r\n            \"sheetIndex\": Store.currentSheetIndex,\r\n            \"ctrl\": ctrl,\r\n            \"data\": Store.flowdata,\r\n            \"curData\": data,\r\n            \"config\": $.extend(true, {}, Store.config),\r\n            \"curConfig\": cfg,\r\n            \"mcData\": mcData,\r\n            \"calc\": $.extend(true, [], file.calcChain),\r\n            \"curCalc\": calc,\r\n            \"funcData\": funcData,\r\n            \"filterObj\": { \"filter_select\": $.extend(true, {}, file.filter_select), \"filter\": $.extend(true, {}, file.filter) },\r\n            \"curFilterObj\": filterObj,\r\n            \"cf\": $.extend(true, [], file.luckysheet_conditionformat_save),\r\n            \"curCf\": cf,\r\n            \"dataVerification\": $.extend(true, {}, file.dataVerification),\r\n            \"curDataVerification\": dataVerification,\r\n            \"hyperlink\": $.extend(true, {}, file.hyperlink),\r\n            \"curHyperlink\": hyperlink,\r\n            \"range\": file.luckysheet_select_save,\r\n            \"dataRange\": [...file.luckysheet_select_save] // 保留操作时的选区\r\n        });\r\n    }\r\n\r\n    //Store.flowdata\r\n    Store.flowdata = data;\r\n    editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n    file.data = data;\r\n\r\n    //共享编辑模式\r\n    if(server.allowUpdate){\r\n        let type = ctrl.type,\r\n            str = ctrl.str,\r\n            edr = ctrl.edr,\r\n            stc = ctrl.stc,\r\n            edc = ctrl.edc;\r\n\r\n        let range;\r\n        if(type == 'moveUp'){\r\n            range = {\r\n                \"row\": [str, data.length - 1],\r\n                \"column\": [stc, edc]\r\n            }\r\n        }\r\n        else if(type == 'moveLeft'){\r\n            range = {\r\n                \"row\": [str, edr],\r\n                \"column\": [stc, data[0].length - 1]\r\n            };\r\n        }\r\n\r\n        server.historyParam(Store.flowdata, Store.currentSheetIndex, range);\r\n    }\r\n\r\n    //config\r\n    Store.config = cfg;\r\n    file.config = Store.config;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, cfg, { \"k\": \"config\" });\r\n\r\n    //mcData\r\n    for(let i = 0; i < mcData.length; i++){\r\n        let mcData_r = mcData[i].r,\r\n            mcData_c = mcData[i].c;\r\n\r\n        server.saveParam(\"v\", Store.currentSheetIndex, Store.flowdata[mcData_r][mcData_c], { \"r\": mcData_r, \"c\": mcData_c });\r\n    }\r\n\r\n    //公式链中公式范围改变对应单元格值的改变\r\n    if(calc.length > 0){\r\n        // formula.execFunctionGroupData = data;\r\n\r\n        for(let i = 0; i < calc.length; i++){\r\n            let clc = calc[i];\r\n            let clc_r = clc.r, clc_c = clc.c, clc_i = clc.index, clc_funcStr =  getcellFormula(clc_r, clc_c, clc_i, data);\r\n            let clc_result = formula.execfunction(clc_funcStr, clc_r, clc_c, clc_i,null, true);\r\n            clc.func = clc_result;\r\n\r\n            if(data[clc_r][clc_c].f == clc_funcStr){\r\n                setcellvalue(clc_r, clc_c, data, clc_result[1]);\r\n                // funcData.push({ \"r\": clc_r, \"c\": clc_c });\r\n            }\r\n        }\r\n    }\r\n\r\n    //calc函数链\r\n    file.calcChain = calc;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, calc, { \"k\": \"calcChain\" });\r\n    for(let i = 0; i < funcData.length; i++){\r\n        let funcData_r = funcData[i].r,\r\n            funcData_c = funcData[i].c;\r\n\r\n        server.saveParam(\"v\", Store.currentSheetIndex, Store.flowdata[funcData_r][funcData_c], { \"r\": funcData_r, \"c\": funcData_c });\r\n    }\r\n\r\n    //筛选配置\r\n    if(filterObj != null){\r\n        file.filter_select = filterObj.filter_select;\r\n        file.filter = filterObj.filter;\r\n    }\r\n    else{\r\n        file.filter_select = null;\r\n        file.filter = null;\r\n    }\r\n    createFilterOptions(file.filter_select, file.filter);\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.filter_select, { \"k\": \"filter_select\" });\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.filter, { \"k\": \"filter\" });\r\n\r\n    //条件格式配置\r\n    file.luckysheet_conditionformat_save = cf;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.luckysheet_conditionformat_save, { \"k\": \"luckysheet_conditionformat_save\" });\r\n\r\n    //数据验证\r\n    dataVerificationCtrl.dataVerification = dataVerification;\r\n    file.dataVerification = dataVerification;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.dataVerification, { \"k\": \"dataVerification\" });\r\n\r\n    //超链接\r\n    hyperlinkCtrl.hyperlink = hyperlink;\r\n    file.hyperlink = hyperlink;\r\n    server.saveParam(\"all\", Store.currentSheetIndex, file.hyperlink, { \"k\": \"hyperlink\" });\r\n\r\n    refreshCanvasTimeOut = setTimeout(function () {\r\n        luckysheetrefreshgrid();\r\n    }, 1);\r\n}\r\n\r\n//复制剪切 刷新表格\r\nfunction jfrefreshgrid_pastcut(source, target, RowlChange){\r\n    //单元格数据更新联动\r\n    let execF_rc = {};\r\n    formula.execFunctionExist = [];\r\n    clearTimeout(refreshCanvasTimeOut);\r\n    for(let r = source[\"range\"].row[0]; r <= source[\"range\"].row[1]; r++){\r\n        for(let c = source[\"range\"].column[0]; c <= source[\"range\"].column[1]; c++){\r\n            if((r + \"_\" + c + \"_\" + source[\"sheetIndex\"]) in execF_rc){\r\n                continue;\r\n            }\r\n\r\n            execF_rc[r + \"_\" + c + \"_\" + source[\"sheetIndex\"]] = 0;\r\n            formula.execFunctionExist.push({ \"r\": r, \"c\": c, \"i\": source[\"sheetIndex\"] });\r\n        }\r\n    }\r\n\r\n    for(let r = target[\"range\"].row[0]; r <= target[\"range\"].row[1]; r++){\r\n        for(let c = target[\"range\"].column[0]; c <= target[\"range\"].column[1]; c++){\r\n            if((r + \"_\" + c + \"_\" + target[\"sheetIndex\"]) in execF_rc){\r\n                continue;\r\n            }\r\n\r\n            execF_rc[r + \"_\" + c + \"_\" + target[\"sheetIndex\"]] = 0;\r\n            formula.execFunctionExist.push({ \"r\": r, \"c\": c, \"i\": target[\"sheetIndex\"] });\r\n        }\r\n    }\r\n\r\n\r\n\r\n    if(Store.clearjfundo){\r\n        Store.jfundo.length  = 0;\r\n\r\n        Store.jfredo.push({\r\n            \"type\": \"pasteCut\",\r\n            \"source\": source,\r\n            \"target\": target,\r\n            \"RowlChange\": RowlChange\r\n        })\r\n    }\r\n\r\n    //config\r\n    let rowHeight;\r\n    if(Store.currentSheetIndex == source[\"sheetIndex\"]){\r\n        Store.config = source[\"curConfig\"];\r\n        rowHeight = source[\"curData\"].length;\r\n        Store.luckysheetfile[getSheetIndex(target[\"sheetIndex\"])][\"config\"] = target[\"curConfig\"];\r\n    }\r\n    else if(Store.currentSheetIndex == target[\"sheetIndex\"]){\r\n        Store.config = target[\"curConfig\"];\r\n        rowHeight = target[\"curData\"].length;\r\n        Store.luckysheetfile[getSheetIndex(source[\"sheetIndex\"])][\"config\"] = source[\"curConfig\"];\r\n    }\r\n\r\n    if(RowlChange){\r\n        Store.visibledatarow = [];\r\n        Store.rh_height = 0;\r\n        \r\n        for (let i = 0; i < rowHeight; i++) {\r\n            let rowlen = Store.defaultrowlen;\r\n            \r\n            if (Store.config[\"rowlen\"] != null && Store.config[\"rowlen\"][i] != null) {\r\n                rowlen = Store.config[\"rowlen\"][i];\r\n            }\r\n\r\n            if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][i] != null) {\r\n                rowlen = Store.config[\"rowhidden\"][i];\r\n                Store.visibledatarow.push(Store.rh_height);\r\n                continue;\r\n            }\r\n            else {\r\n                Store.rh_height += rowlen + 1;\r\n            }\r\n\r\n            Store.visibledatarow.push(Store.rh_height);//行的临时长度分布\r\n        }\r\n        Store.rh_height += 80;\r\n        // sheetmanage.showSheet();\r\n\r\n        if(Store.currentSheetIndex == source[\"sheetIndex\"]){\r\n            let rowlenArr = computeRowlenArr(target[\"curData\"].length, target[\"curConfig\"]);\r\n            Store.luckysheetfile[getSheetIndex(target[\"sheetIndex\"])][\"visibledatarow\"] = rowlenArr;\r\n        }\r\n        else if(Store.currentSheetIndex == target[\"sheetIndex\"]){\r\n            let rowlenArr = computeRowlenArr(source[\"curData\"].length, source[\"curConfig\"]);\r\n            Store.luckysheetfile[getSheetIndex(source[\"sheetIndex\"])][\"visibledatarow\"] = rowlenArr;\r\n        }\r\n    }\r\n\r\n    //Store.flowdata\r\n    if(Store.currentSheetIndex == source[\"sheetIndex\"]){\r\n        Store.flowdata = source[\"curData\"];\r\n        Store.luckysheetfile[getSheetIndex(target[\"sheetIndex\"])][\"data\"] = target[\"curData\"];\r\n    }\r\n    else if(Store.currentSheetIndex == target[\"sheetIndex\"]){\r\n        Store.flowdata = target[\"curData\"];\r\n        Store.luckysheetfile[getSheetIndex(source[\"sheetIndex\"])][\"data\"] = source[\"curData\"];\r\n    }\r\n    editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据\r\n    Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = Store.flowdata;\r\n    \r\n    //luckysheet_select_save\r\n    if(Store.currentSheetIndex == target[\"sheetIndex\"]){\r\n        Store.luckysheet_select_save = [{\"row\": target[\"range\"].row, \"column\": target[\"range\"].column}];\r\n    }\r\n    else{\r\n        Store.luckysheet_select_save = [{\"row\": source[\"range\"].row, \"column\": source[\"range\"].column}];\r\n    }\r\n    if(Store.luckysheet_select_save.length > 0){\r\n        //有选区时，刷新一下选区\r\n        selectHightlightShow();\r\n    }\r\n\r\n    //条件格式\r\n    Store.luckysheetfile[getSheetIndex(source[\"sheetIndex\"])].luckysheet_conditionformat_save = source[\"curCdformat\"];\r\n    Store.luckysheetfile[getSheetIndex(target[\"sheetIndex\"])].luckysheet_conditionformat_save = target[\"curCdformat\"];\r\n\r\n    //数据验证\r\n    if(Store.currentSheetIndex == source[\"sheetIndex\"]){\r\n        dataVerificationCtrl.dataVerification = source[\"curDataVerification\"];\r\n    }\r\n    else if(Store.currentSheetIndex == target[\"sheetIndex\"]){\r\n        dataVerificationCtrl.dataVerification = target[\"curDataVerification\"]\r\n    }\r\n    Store.luckysheetfile[getSheetIndex(source[\"sheetIndex\"])].dataVerification = source[\"curDataVerification\"];\r\n    Store.luckysheetfile[getSheetIndex(target[\"sheetIndex\"])].dataVerification = target[\"curDataVerification\"];\r\n    \r\n    \r\n    formula.execFunctionExist.reverse();\r\n    formula.execFunctionGroup(null, null, null, null, target[\"curData\"]);\r\n    formula.execFunctionGlobalData = null;\r\n\r\n    let index = getSheetIndex(Store.currentSheetIndex);\r\n    let file = Store.luckysheetfile[index];\r\n    file.scrollTop  = $(\"#luckysheet-cell-main\").scrollTop();\r\n    file.scrollLeft = $(\"#luckysheet-cell-main\").scrollLeft()\r\n    \r\n    sheetmanage.showSheet();\r\n\r\n    refreshCanvasTimeOut = setTimeout(function () {\r\n        luckysheetrefreshgrid();\r\n    }, 1);\r\n\r\n    sheetmanage.storeSheetParamALL();\r\n\r\n    //saveparam\r\n    //来源表\r\n    server.saveParam(\"all\", source[\"sheetIndex\"], source[\"curConfig\"], { \"k\": \"config\" });\r\n    //目的表\r\n    server.saveParam(\"all\", target[\"sheetIndex\"], target[\"curConfig\"], { \"k\": \"config\" });\r\n    \r\n    //来源表\r\n    server.historyParam(source[\"curData\"], source[\"sheetIndex\"], {\"row\": source[\"range\"][\"row\"], \"column\": source[\"range\"][\"column\"]});\r\n    //目的表\r\n    server.historyParam(target[\"curData\"], target[\"sheetIndex\"], {\"row\": target[\"range\"][\"row\"], \"column\": target[\"range\"][\"column\"]});\r\n\r\n    //来源表\r\n    server.saveParam(\"all\", source[\"sheetIndex\"], source[\"curCdformat\"], { \"k\": \"luckysheet_conditionformat_save\" });\r\n    //目的表\r\n    server.saveParam(\"all\", target[\"sheetIndex\"], target[\"curCdformat\"], { \"k\": \"luckysheet_conditionformat_save\" });\r\n\r\n    //来源表\r\n    server.saveParam(\"all\", source[\"sheetIndex\"], source[\"curDataVerification\"], { \"k\": \"dataVerification\" });\r\n    //目的表\r\n    server.saveParam(\"all\", target[\"sheetIndex\"], target[\"curDataVerification\"], { \"k\": \"dataVerification\" });\r\n}\r\n\r\n//行高、列宽改变 刷新表格\r\nfunction jfrefreshgrid_rhcw(rowheight, colwidth, isRefreshCanvas=true){\r\n    rhchInit(rowheight, colwidth);\r\n    clearTimeout(refreshCanvasTimeOut);\r\n    sheetmanage.storeSheetParam();\r\n\r\n    //行高列宽改变时 重新计算sparklines\r\n    let calcChain = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].calcChain;\r\n    \r\n    if(calcChain != null && calcChain.length > 0){\r\n        if(Store.config[\"rowlen\"] == null){\r\n            Store.config[\"rowlen\"] = {};\r\n        }\r\n\r\n        if(Store.config[\"columnlen\"] == null){\r\n            Store.config[\"columnlen\"] = {};\r\n        }            \r\n\r\n        for(let i = 0; i < calcChain.length; i++){\r\n            let r = calcChain[i].r, c = calcChain[i].c, index = calcChain[i].index;\r\n\r\n            if(index == Store.currentSheetIndex && Store.flowdata[r][c] != null && Store.flowdata[r][c].spl != null && ((r in Store.config[\"rowlen\"]) || (c in Store.config[\"columnlen\"]))){\r\n                window.luckysheetCurrentRow = r;\r\n                window.luckysheetCurrentColumn = c;\r\n                window.luckysheetCurrentFunction = Store.flowdata[r][c].f;\r\n\r\n                let fp = $.trim(formula.functionParserExe(Store.flowdata[r][c].f));\r\n                let sparklines = new Function(\"return \" + fp)();\r\n                Store.flowdata[r][c].spl = sparklines;\r\n\r\n                server.saveParam(\"v\", Store.currentSheetIndex, Store.flowdata[r][c], { \"r\": r, \"c\": c });\r\n            }\r\n        }\r\n\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = Store.flowdata;\r\n    }\r\n    \r\n    //批注框同步\r\n    luckysheetPostil.positionSync();\r\n    //选区同步\r\n    selectHightlightShow();\r\n    // 协同提示框同步\r\n    collaborativeEditBox();\r\n    //改变单元格行高，复制虚线框同步\r\n    if($(\".luckysheet-selection-copy\").is(\":visible\")){\r\n        selectionCopyShow();\r\n    }\r\n\r\n    //改变单元格行高，选区下拉icon隐藏\r\n    if($(\"#luckysheet-dropCell-icon\").is(\":visible\")){\r\n        $(\"#luckysheet-dropCell-icon\").remove();\r\n    }\r\n\r\n    //有冻结状态时，同步行高、列宽\r\n    if(luckysheetFreezen.freezenhorizontaldata != null && luckysheetFreezen.freezenverticaldata != null){\r\n        let row_st = luckysheetFreezen.freezenhorizontaldata[1] - 1;\r\n        let col_st = luckysheetFreezen.freezenverticaldata[1] - 1;\r\n\r\n        let scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n        let scrollLeft = luckysheetFreezen.freezenverticaldata[2];\r\n\r\n        let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n        let freezenhorizontaldata = [\r\n            Store.visibledatarow[row_st], \r\n            row_st + 1, \r\n            scrollTop, \r\n            luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), \r\n            top\r\n        ];\r\n        let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n        let freezenverticaldata = [\r\n            Store.visibledatacolumn[col_st], \r\n            col_st + 1, \r\n            scrollLeft, \r\n            luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), \r\n            left\r\n        ];\r\n\r\n        luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, freezenverticaldata, left);\r\n        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n        luckysheetFreezen.createAssistCanvas();\r\n    }\r\n    else if(luckysheetFreezen.freezenhorizontaldata != null){\r\n        let row_st = luckysheetFreezen.freezenhorizontaldata[1] - 1;\r\n        let scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n\r\n        let top = Store.visibledatarow[row_st] - 2 - scrollTop + Store.columnHeaderHeight;\r\n        let freezenhorizontaldata = [\r\n            Store.visibledatarow[row_st], \r\n            row_st + 1, \r\n            scrollTop, \r\n            luckysheetFreezen.cutVolumn(Store.visibledatarow, row_st + 1), \r\n            top\r\n        ];\r\n\r\n        luckysheetFreezen.saveFreezen(freezenhorizontaldata, top, null, null);\r\n        luckysheetFreezen.createFreezenHorizontal(freezenhorizontaldata, top);\r\n        luckysheetFreezen.createAssistCanvas();\r\n    }\r\n    else if(luckysheetFreezen.freezenverticaldata != null){\r\n        let col_st = luckysheetFreezen.freezenverticaldata[1] - 1;\r\n        let scrollLeft = luckysheetFreezen.freezenverticaldata[2];\r\n\r\n        let left = Store.visibledatacolumn[col_st] - 2 - scrollLeft + Store.rowHeaderWidth;\r\n        let freezenverticaldata = [\r\n            Store.visibledatacolumn[col_st], \r\n            col_st + 1, \r\n            scrollLeft, \r\n            luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_st + 1), \r\n            left\r\n        ];\r\n\r\n        luckysheetFreezen.saveFreezen(null, null, freezenverticaldata, left);\r\n        luckysheetFreezen.createFreezenVertical(freezenverticaldata, left);\r\n        luckysheetFreezen.createAssistCanvas();\r\n    }\r\n    else{\r\n        //有筛选标志时，同步筛选按钮和筛选范围位置\r\n        if($(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").length > 0){\r\n            $(\"#luckysheet-filter-options-sheet\" + Store.currentSheetIndex + \" .luckysheet-filter-options\").each(function(i, e){\r\n                let str = $(e).data(\"str\"), cindex = $(e).data(\"cindex\");\r\n\r\n                let left = Store.visibledatacolumn[cindex] - 20;\r\n                let top = str - 1 == -1 ? 0 : Store.visibledatarow[str - 1];\r\n\r\n                $(e).css({ \"left\": left, \"top\": top });\r\n            });\r\n        }\r\n    }\r\n\r\n    if($(\"#luckysheet-filter-selected-sheet\" + Store.currentSheetIndex).length > 0){\r\n        let luckysheet_filter_save = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].filter_select;\r\n\r\n        let r1 = luckysheet_filter_save.row[0], \r\n            r2 = luckysheet_filter_save.row[1];\r\n        let c1 = luckysheet_filter_save.column[0], \r\n            c2 = luckysheet_filter_save.column[1];\r\n\r\n        let row = Store.visibledatarow[r2], \r\n            row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1];\r\n        let col = Store.visibledatacolumn[c2], \r\n            col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1];\r\n\r\n        $(\"#luckysheet-filter-selected-sheet\" + Store.currentSheetIndex).css({\r\n            \"left\": col_pre,\r\n            \"width\": col - col_pre - 1,\r\n            \"top\": row_pre,\r\n            \"height\": row - row_pre - 1\r\n        });\r\n    }\r\n\r\n    sheetmanage.showSheet();\r\n\r\n    if(isRefreshCanvas){\r\n        refreshCanvasTimeOut = setTimeout(function () {\r\n            luckysheetrefreshgrid();\r\n        }, 1);\r\n    }\r\n   \r\n}\r\n\r\n//Refresh the canvas display data according to scrollHeight and scrollWidth\r\nfunction luckysheetrefreshgrid(scrollWidth, scrollHeight) {\r\n    formula.groupValuesRefresh();\r\n    \r\n    if (scrollWidth == null) {\r\n        scrollWidth = $(\"#luckysheet-cell-main\").scrollLeft();\r\n    }\r\n    if (scrollHeight == null) {\r\n        scrollHeight = $(\"#luckysheet-cell-main\").scrollTop();\r\n    }\r\n\r\n    if (luckysheetFreezen.freezenverticaldata != null || luckysheetFreezen.freezenhorizontaldata != null) {\r\n        let freezen_horizon_px, freezen_horizon_ed, freezen_horizon_scrollTop;\r\n        let freezen_vertical_px, freezen_vertical_ed, freezen_vertical_scrollTop;\r\n        let drawWidth = Store.luckysheetTableContentHW[0], drawHeight = Store.luckysheetTableContentHW[1];\r\n        \r\n        if (luckysheetFreezen.freezenverticaldata != null && luckysheetFreezen.freezenhorizontaldata != null) {\r\n            freezen_horizon_px = luckysheetFreezen.freezenhorizontaldata[0];\r\n            freezen_horizon_ed = luckysheetFreezen.freezenhorizontaldata[1];\r\n            freezen_horizon_scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n\r\n            freezen_vertical_px = luckysheetFreezen.freezenverticaldata[0];\r\n            freezen_vertical_ed = luckysheetFreezen.freezenverticaldata[1];\r\n            freezen_vertical_scrollTop = luckysheetFreezen.freezenverticaldata[2];\r\n\r\n            //左上canvas freezen_3\r\n            luckysheetDrawMain(\r\n                freezen_vertical_scrollTop, \r\n                freezen_horizon_scrollTop, \r\n                freezen_vertical_px, \r\n                freezen_horizon_px, \r\n                1, \r\n                1, \r\n                null, \r\n                null, \r\n                \"freezen_3\"\r\n            );\r\n\r\n            //上右canvas freezen_4\r\n            luckysheetDrawMain(\r\n                scrollWidth + freezen_vertical_px - freezen_vertical_scrollTop, \r\n                freezen_horizon_scrollTop, \r\n                drawWidth - freezen_vertical_px + freezen_vertical_scrollTop, \r\n                freezen_horizon_px, \r\n                1, \r\n                1, \r\n                null, \r\n                null, \r\n                \"freezen_4\"\r\n            );\r\n\r\n            //左下canvas freezen_7\r\n            luckysheetDrawMain(\r\n                freezen_vertical_scrollTop, \r\n                scrollHeight + freezen_horizon_px - freezen_horizon_scrollTop, \r\n                freezen_vertical_px, \r\n                drawHeight - freezen_horizon_px + freezen_horizon_scrollTop, \r\n                1, \r\n                1, \r\n                null, \r\n                null, \r\n                \"freezen_7\"\r\n            );\r\n\r\n            //右下canvas luckysheetTableContent\r\n            luckysheetDrawMain(\r\n                scrollWidth + freezen_vertical_px - freezen_vertical_scrollTop, \r\n                scrollHeight + freezen_horizon_px - freezen_horizon_scrollTop, \r\n                drawWidth - freezen_vertical_px + freezen_vertical_scrollTop, \r\n                drawHeight - freezen_horizon_px + freezen_horizon_scrollTop, \r\n                freezen_vertical_px - freezen_vertical_scrollTop + Store.rowHeaderWidth, \r\n                freezen_horizon_px - freezen_horizon_scrollTop + Store.columnHeaderHeight\r\n            );\r\n\r\n            //标题\r\n            luckysheetDrawgridColumnTitle(freezen_vertical_scrollTop, freezen_vertical_px, Store.rowHeaderWidth);\r\n            luckysheetDrawgridColumnTitle(\r\n                scrollWidth + freezen_vertical_px - freezen_vertical_scrollTop, \r\n                drawWidth - freezen_vertical_px + freezen_vertical_scrollTop, \r\n                freezen_vertical_px - freezen_vertical_scrollTop + Store.rowHeaderWidth\r\n            );\r\n            \r\n            luckysheetDrawgridRowTitle(freezen_horizon_scrollTop, freezen_horizon_px, Store.columnHeaderHeight);\r\n            luckysheetDrawgridRowTitle(\r\n                scrollHeight + freezen_horizon_px - freezen_horizon_scrollTop, \r\n                drawHeight - freezen_horizon_px + freezen_horizon_scrollTop, \r\n                freezen_horizon_px - freezen_horizon_scrollTop + Store.columnHeaderHeight\r\n            );\r\n           \r\n        }\r\n        else if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n            freezen_horizon_px = luckysheetFreezen.freezenhorizontaldata[0];\r\n            freezen_horizon_ed = luckysheetFreezen.freezenhorizontaldata[1];\r\n            freezen_horizon_scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n\r\n            luckysheetDrawMain(\r\n                scrollWidth, \r\n                freezen_horizon_scrollTop, \r\n                drawWidth, \r\n                freezen_horizon_px, \r\n                1, \r\n                1, \r\n                null, \r\n                null, \r\n                \"freezen_h\"\r\n            );\r\n            luckysheetDrawMain(\r\n                scrollWidth, \r\n                scrollHeight + freezen_horizon_px - freezen_horizon_scrollTop, \r\n                drawWidth, \r\n                drawHeight - freezen_horizon_px + freezen_horizon_scrollTop, \r\n                null, \r\n                freezen_horizon_px - freezen_horizon_scrollTop + Store.columnHeaderHeight\r\n            );\r\n        \r\n            luckysheetDrawgridColumnTitle(scrollWidth, drawWidth, null);\r\n            \r\n            luckysheetDrawgridRowTitle(freezen_horizon_scrollTop, freezen_horizon_px, Store.columnHeaderHeight);\r\n            luckysheetDrawgridRowTitle(\r\n                scrollHeight + freezen_horizon_px - freezen_horizon_scrollTop, \r\n                drawHeight - freezen_horizon_px + freezen_horizon_scrollTop, \r\n                freezen_horizon_px - freezen_horizon_scrollTop + Store.columnHeaderHeight\r\n            );\r\n            \r\n        }\r\n        else if (luckysheetFreezen.freezenverticaldata != null) {\r\n            freezen_vertical_px = luckysheetFreezen.freezenverticaldata[0];\r\n            freezen_vertical_ed = luckysheetFreezen.freezenverticaldata[1];\r\n            freezen_vertical_scrollTop = luckysheetFreezen.freezenverticaldata[2];\r\n            \r\n            luckysheetDrawMain(\r\n                freezen_vertical_scrollTop, \r\n                scrollHeight, \r\n                freezen_vertical_px, \r\n                drawHeight, \r\n                1, \r\n                1, \r\n                null, \r\n                null, \r\n                \"freezen_v\"\r\n            );\r\n            luckysheetDrawMain(\r\n                scrollWidth + freezen_vertical_px - freezen_vertical_scrollTop, \r\n                scrollHeight, \r\n                drawWidth - freezen_vertical_px + freezen_vertical_scrollTop, \r\n                drawHeight, \r\n                freezen_vertical_px - freezen_vertical_scrollTop + Store.rowHeaderWidth, \r\n                null\r\n            );\r\n            \r\n            luckysheetDrawgridRowTitle(scrollHeight, drawHeight, null);\r\n            \r\n            luckysheetDrawgridColumnTitle(freezen_vertical_scrollTop, freezen_vertical_px, Store.rowHeaderWidth);\r\n            luckysheetDrawgridColumnTitle(\r\n                scrollWidth + freezen_vertical_px - freezen_vertical_scrollTop, \r\n                drawWidth - freezen_vertical_px + freezen_vertical_scrollTop, \r\n                freezen_vertical_px - freezen_vertical_scrollTop + Store.rowHeaderWidth\r\n            );\r\n            \r\n        }\r\n    }\r\n    else {\r\n        if($(\"#luckysheetTableContent\").length == 0){\r\n            return;\r\n        }\r\n        let luckysheetTableContent = $(\"#luckysheetTableContent\").get(0).getContext(\"2d\");\r\n        luckysheetDrawMain(scrollWidth, scrollHeight);\r\n    \r\n        // luckysheetTableContent.clearRect(0, 0, 46, 20);\r\n        \r\n        luckysheetDrawgridColumnTitle(scrollWidth);\r\n        luckysheetDrawgridRowTitle(scrollHeight);\r\n\r\n        //清除canvas左上角区域 防止列标题栏序列号溢出显示\r\n        \r\n        luckysheetTableContent.clearRect(0, 0, (Store.rowHeaderWidth* Store.devicePixelRatio-1) , (Store.columnHeaderHeight* Store.devicePixelRatio-1) );\r\n    }\r\n}\r\n\r\nexport {\r\n    jfrefreshgrid,\r\n    jfrefreshgridall,\r\n    jfrefreshrange,\r\n    jfrefreshgrid_adRC,\r\n    jfrefreshgrid_deleteCell,\r\n    jfrefreshgrid_pastcut,\r\n    jfrefreshgrid_rhcw,\r\n    luckysheetrefreshgrid,\r\n}"
  },
  {
    "path": "src/global/rhchInit.js",
    "content": "import Store from '../store';\r\nimport { computeRowlenByContent,computeColWidthByContent } from './getRowlen';\r\nimport luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';\r\n\r\nexport default function rhchInit(rowheight, colwidth) {\r\n    zoomSetting();//Zoom sheet on first load\r\n    //行高\r\n    if(rowheight != null){\r\n        Store.visibledatarow = [];\r\n        Store.rh_height = 0;\r\n\r\n        for (let r = 0; r < rowheight; r++) {\r\n            let rowlen = Store.defaultrowlen;\r\n\r\n            if (Store.config[\"rowlen\"] != null && Store.config[\"rowlen\"][r] != null) {\r\n                rowlen = Store.config[\"rowlen\"][r];\r\n            }\r\n\r\n            if (Store.config[\"rowhidden\"] != null && Store.config[\"rowhidden\"][r] != null) {\r\n                Store.visibledatarow.push(Store.rh_height);\r\n                continue;\r\n            }\r\n\r\n            // 自动行高计算\r\n            if (rowlen === 'auto') {\r\n                rowlen = computeRowlenByContent(Store.flowdata, r);\r\n            }\r\n            Store.rh_height += Math.round((rowlen + 1) * Store.zoomRatio);\r\n\r\n            Store.visibledatarow.push(Store.rh_height); //行的临时长度分布\r\n        }\r\n\r\n        // 如果增加行和回到顶部按钮隐藏，则减少底部空白区域，但是预留足够空间给单元格下拉按钮\r\n        if (!luckysheetConfigsetting.enableAddRow && !luckysheetConfigsetting.enableAddBackTop) {\r\n            Store.rh_height += 29;\r\n        } else {\r\n            Store.rh_height += 80;  //最底部增加空白\r\n        }\r\n\r\n    }\r\n\r\n    //列宽\r\n    if(colwidth != null){\r\n        Store.visibledatacolumn = [];\r\n        Store.ch_width = 0;\r\n\r\n        let maxColumnlen = 120;\r\n\r\n        for (let c = 0; c < colwidth; c++) {\r\n            let firstcolumnlen = Store.defaultcollen;\r\n\r\n            if (Store.config[\"columnlen\"] != null && Store.config[\"columnlen\"][c] != null) {\r\n                firstcolumnlen = Store.config[\"columnlen\"][c];\r\n            }\r\n            else {\r\n                if (Store.flowdata[0] != null && Store.flowdata[0][c] != null) {\r\n                    if (firstcolumnlen > 300) {\r\n                        firstcolumnlen = 300;\r\n                    }\r\n                    else if (firstcolumnlen < Store.defaultcollen) {\r\n                        firstcolumnlen = Store.defaultcollen;\r\n                    }\r\n\r\n                    if (firstcolumnlen != Store.defaultcollen) {\r\n                        if (Store.config[\"columnlen\"] == null) {\r\n                            Store.config[\"columnlen\"] = {};\r\n                        }\r\n\r\n                        Store.config[\"columnlen\"][c] = firstcolumnlen;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if(Store.config[\"colhidden\"] != null && Store.config[\"colhidden\"][c] != null){\r\n                Store.visibledatacolumn.push(Store.ch_width);\r\n                continue;\r\n            }\r\n\r\n            // 自动行高计算\r\n            if (firstcolumnlen === 'auto') {\r\n                firstcolumnlen = computeColWidthByContent(Store.flowdata, c, rowheight);\r\n            }\r\n            Store.ch_width += Math.round((firstcolumnlen + 1)*Store.zoomRatio);\r\n\r\n            Store.visibledatacolumn.push(Store.ch_width);//列的临时长度分布\r\n\r\n            // if(maxColumnlen < firstcolumnlen + 1){\r\n            //     maxColumnlen = firstcolumnlen + 1;\r\n            // }\r\n        }\r\n\r\n        // Store.ch_width += 120;\r\n        Store.ch_width += maxColumnlen;\r\n    }\r\n}\r\n\r\n\r\nexport function zoomSetting(){\r\n    //zoom\r\n    Store.rowHeaderWidth = luckysheetConfigsetting.rowHeaderWidth * Store.zoomRatio;\r\n    Store.columnHeaderHeight = luckysheetConfigsetting.columnHeaderHeight *Store.zoomRatio;\r\n    $(\"#luckysheet-rows-h\").width((Store.rowHeaderWidth-1.5));\r\n    $(\"#luckysheet-cols-h-c\").height((Store.columnHeaderHeight-1.5));\r\n    $(\"#luckysheet-left-top\").css({width:Store.rowHeaderWidth-1.5, height:Store.columnHeaderHeight-1.5});\r\n}\r\n"
  },
  {
    "path": "src/global/scroll.js",
    "content": "import luckysheetFreezen from '../controllers/freezen';\r\nimport { luckysheet_searcharray } from '../controllers/sheetSearch';\r\nimport { luckysheetrefreshgrid } from '../global/refresh';\r\nimport Store from '../store';\r\nimport method from '../global/method'\r\n\r\nlet scrollRequestAnimationFrameIni = true,scrollRequestAnimationFrame = false, scrollTimeOutCancel=null;\r\n\r\nfunction execScroll(){\r\n    let scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft(), \r\n        scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop();\r\n    luckysheetrefreshgrid(scrollLeft, scrollTop);\r\n    scrollRequestAnimationFrame = window.requestAnimationFrame(execScroll);\r\n}\r\n\r\n//全局滚动事件\r\nexport default function luckysheetscrollevent(isadjust) {\r\n    let $t = $(\"#luckysheet-cell-main\");\r\n    let scrollLeft = $(\"#luckysheet-scrollbar-x\").scrollLeft(), \r\n        scrollTop = $(\"#luckysheet-scrollbar-y\").scrollTop(),\r\n        canvasHeight = $(\"#luckysheetTableContent\").height(); // canvas高度\r\n\r\n    // clearTimeout(scrollTimeOutCancel);\r\n\r\n    // scrollTimeOutCancel = setTimeout(() => {\r\n    //     scrollRequestAnimationFrameIni  = true;\r\n    //     window.cancelAnimationFrame(scrollRequestAnimationFrame);\r\n    // }, 500);\r\n\r\n    // if (!!isadjust) {\r\n    //     let scrollHeight = $t.get(0).scrollHeight;\r\n    //     let windowHeight = $t.height();\r\n    //     let scrollWidth = $t.get(0).scrollWidth;\r\n    //     let windowWidth = $t.width();\r\n\r\n    //     let maxScrollLeft = scrollWidth - windowWidth;\r\n    //     let maxScrollTop = scrollHeight - windowHeight;\r\n\r\n    //     let visibledatacolumn_c = Store.visibledatacolumn, visibledatarow_c = Store.visibledatarow;\r\n\r\n    //     if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n    //         visibledatarow_c = luckysheetFreezen.freezenhorizontaldata[3];\r\n    //     }\r\n\r\n    //     if (luckysheetFreezen.freezenverticaldata != null) {\r\n    //         visibledatacolumn_c = luckysheetFreezen.freezenverticaldata[3];\r\n    //     }\r\n\r\n    //     let col_ed = luckysheet_searcharray(visibledatacolumn_c, scrollLeft);\r\n    //     let row_ed = luckysheet_searcharray(visibledatarow_c, scrollTop);\r\n\r\n    //     let refreshLeft = scrollLeft , refreshTop = scrollTop;\r\n\r\n    //     if (col_ed <= 0) {\r\n    //         scrollLeft = 0;\r\n    //     }\r\n    //     else {\r\n    //         scrollLeft = visibledatacolumn_c[col_ed - 1];\r\n    //     }\r\n\r\n    //     if (row_ed <= 0) {\r\n    //         scrollTop = 0;\r\n    //     }\r\n    //     else {\r\n    //         scrollTop = visibledatarow_c[row_ed - 1];\r\n    //     }\r\n    // }\r\n\r\n    if (luckysheetFreezen.freezenhorizontaldata != null) {\r\n        if (scrollTop < luckysheetFreezen.freezenhorizontaldata[2]) {\r\n            scrollTop = luckysheetFreezen.freezenhorizontaldata[2];\r\n            $(\"#luckysheet-scrollbar-y\").scrollTop(scrollTop);\r\n            return;\r\n        }\r\n    }\r\n\r\n    if (luckysheetFreezen.freezenverticaldata != null) {\r\n        if (scrollLeft < luckysheetFreezen.freezenverticaldata[2]) {\r\n            scrollLeft = luckysheetFreezen.freezenverticaldata[2];\r\n            $(\"#luckysheet-scrollbar-x\").scrollLeft(scrollLeft);\r\n            return;\r\n        }\r\n    }\r\n\r\n    $(\"#luckysheet-cols-h-c\").scrollLeft(scrollLeft);//列标题\r\n    $(\"#luckysheet-rows-h\").scrollTop(scrollTop);//行标题\r\n    \r\n    $t.scrollLeft(scrollLeft).scrollTop(scrollTop);\r\n\r\n    $(\"#luckysheet-input-box-index\").css({\r\n        \"left\": $(\"#luckysheet-input-box\").css(\"left\"), \r\n        \"top\": (parseInt($(\"#luckysheet-input-box\").css(\"top\")) - 20) + \"px\", \r\n        \"z-index\": $(\"#luckysheet-input-box\").css(\"z-index\")\r\n    }).show();\r\n\r\n    // if(scrollRequestAnimationFrameIni && Store.scrollRefreshSwitch){\r\n    //     execScroll();\r\n    //     scrollRequestAnimationFrameIni = false;\r\n    // }\r\n\r\n    luckysheetrefreshgrid(scrollLeft, scrollTop);\r\n    \r\n\r\n    $(\"#luckysheet-bottom-controll-row\").css(\"left\", scrollLeft);\r\n\r\n    //有选区且有冻结时，滚动适应\r\n    if(luckysheetFreezen.freezenhorizontaldata != null || luckysheetFreezen.freezenverticaldata != null){\r\n        luckysheetFreezen.scrollAdapt();\r\n    }\r\n\r\n    if(!method.createHookFunction(\"scroll\", {scrollLeft, scrollTop, canvasHeight})){ return; }\r\n\r\n}"
  },
  {
    "path": "src/global/setdata.js",
    "content": "import { getObjType } from \"../utils/util\";\r\nimport { isRealNull, isRealNum, valueIsError } from \"./validate\";\r\nimport { genarate, update } from \"./format\";\r\nimport server from \"../controllers/server\";\r\nimport luckysheetConfigsetting from \"../controllers/luckysheetConfigsetting\";\r\nimport Store from \"../store/index\";\r\n\r\n//Set cell value\r\nfunction setcellvalue(r, c, d, v) {\r\n    if (d == null) {\r\n        d = Store.flowdata;\r\n    }\r\n    // 若采用深拷贝，初始化时的单元格属性丢失\r\n    // let cell = $.extend(true, {}, d[r][c]);\r\n    let cell = d[r][c];\r\n\r\n    let vupdate;\r\n\r\n    if (getObjType(v) == \"object\") {\r\n        if (cell == null) {\r\n            cell = v;\r\n        } else {\r\n            if (v.f != null) {\r\n                cell.f = v.f;\r\n            } else if (cell.hasOwnProperty(\"f\")) {\r\n                delete cell.f;\r\n            }\r\n\r\n            if (v.spl != null) {\r\n                cell.spl = v.spl;\r\n            }\r\n\r\n            if (v.ct != null) {\r\n                cell.ct = v.ct;\r\n            }\r\n        }\r\n\r\n        if (getObjType(v.v) == \"object\") {\r\n            vupdate = v.v.v;\r\n        } else {\r\n            vupdate = v.v;\r\n        }\r\n    } else {\r\n        vupdate = v;\r\n    }\r\n\r\n    // fix #81， vupdate = ''\r\n    if (vupdate == null) {\r\n        if (getObjType(cell) == \"object\") {\r\n            delete cell.m;\r\n            delete cell.v;\r\n        } else {\r\n            cell = null;\r\n        }\r\n\r\n        d[r][c] = cell;\r\n\r\n        return cell;\r\n    }\r\n\r\n    // 1.为null\r\n    // 2.数据透视表的数据，flowdata的每个数据可能为字符串，结果就是cell == v == 一个字符串或者数字数据\r\n    if (isRealNull(cell) || ((getObjType(cell) === \"string\" || getObjType(cell) === \"number\") && cell === v)) {\r\n        cell = {};\r\n    }\r\n\r\n    let vupdateStr = vupdate.toString();\r\n\r\n    if (vupdateStr.substr(0, 1) == \"'\") {\r\n        cell.m = vupdateStr.substr(1);\r\n        cell.ct = { fa: \"@\", t: \"s\" };\r\n        cell.v = vupdateStr.substr(1);\r\n        cell.qp = 1;\r\n    } else if (cell.qp == 1) {\r\n        cell.m = vupdateStr;\r\n        cell.ct = { fa: \"@\", t: \"s\" };\r\n        cell.v = vupdateStr;\r\n    } else if (vupdateStr.toUpperCase() === \"TRUE\") {\r\n        cell.m = \"TRUE\";\r\n        cell.ct = { fa: \"General\", t: \"b\" };\r\n        cell.v = true;\r\n    } else if (vupdateStr.toUpperCase() === \"FALSE\") {\r\n        cell.m = \"FALSE\";\r\n        cell.ct = { fa: \"General\", t: \"b\" };\r\n        cell.v = false;\r\n    } else if (vupdateStr.substr(-1) === \"%\" && isRealNum(vupdateStr.substring(0, vupdateStr.length - 1))) {\r\n        cell.ct = { fa: \"0%\", t: \"n\" };\r\n        cell.v = vupdateStr.substring(0, vupdateStr.length - 1) / 100;\r\n        cell.m = vupdate;\r\n    } else if (valueIsError(vupdate)) {\r\n        cell.m = vupdateStr;\r\n        // cell.ct = { \"fa\": \"General\", \"t\": \"e\" };\r\n        if (cell.ct != null) {\r\n            cell.ct.t = \"e\";\r\n        } else {\r\n            cell.ct = { fa: \"General\", t: \"e\" };\r\n        }\r\n        cell.v = vupdate;\r\n    } else {\r\n        if (\r\n            cell.f != null &&\r\n            isRealNum(vupdate) &&\r\n            !/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(vupdate)\r\n        ) {\r\n            cell.v = parseFloat(vupdate);\r\n            if (cell.ct == null) {\r\n                cell.ct = { fa: \"General\", t: \"n\" };\r\n            }\r\n\r\n            if (cell.v == Infinity || cell.v == -Infinity) {\r\n                cell.m = cell.v.toString();\r\n            } else {\r\n                if (cell.v.toString().indexOf(\"e\") > -1) {\r\n                    let len;\r\n                    if (cell.v.toString().split(\".\").length == 1) {\r\n                        len = 0;\r\n                    } else {\r\n                        len = cell.v\r\n                            .toString()\r\n                            .split(\".\")[1]\r\n                            .split(\"e\")[0].length;\r\n                    }\r\n                    if (len > 5) {\r\n                        len = 5;\r\n                    }\r\n\r\n                    cell.m = cell.v.toExponential(len).toString();\r\n                } else {\r\n                    let v_p = Math.round(cell.v * 1000000000) / 1000000000;\r\n                    if (cell.ct == null) {\r\n                        let mask = genarate(v_p);\r\n                        cell.m = mask[0].toString();\r\n                    } else {\r\n                        let mask = update(cell.ct.fa, v_p);\r\n                        cell.m = mask.toString();\r\n                    }\r\n\r\n                    // cell.m = mask[0].toString();\r\n                }\r\n            }\r\n        } else if (cell.ct != null && cell.ct.fa == \"@\") {\r\n            cell.m = vupdateStr;\r\n            cell.v = vupdate;\r\n        } else if (cell.ct != null && cell.ct.fa != null && cell.ct.fa != \"General\") {\r\n            if (isRealNum(vupdate)) {\r\n                vupdate = parseFloat(vupdate);\r\n            }\r\n\r\n            let mask = update(cell.ct.fa, vupdate);\r\n\r\n            if (mask === vupdate) {\r\n                //若原来单元格格式 应用不了 要更新的值，则获取更新值的 格式\r\n                mask = genarate(vupdate);\r\n\r\n                cell.m = mask[0].toString();\r\n                cell.ct = mask[1];\r\n                cell.v = mask[2];\r\n            } else {\r\n                cell.m = mask.toString();\r\n                cell.v = vupdate;\r\n            }\r\n        } else {\r\n            if (\r\n                isRealNum(vupdate) &&\r\n                !/^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[12])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X)$/i.test(vupdate)\r\n            ) {\r\n                if (typeof vupdate === \"string\") {\r\n                    let flag = vupdate.split(\"\").every((ele) => ele == \"0\" || ele == \".\");\r\n\r\n                    // 1.1111111111111111 as an example, numbers within 18 characters need to be converted to numbers\r\n                    if (flag || vupdate.length < 18) {\r\n                        vupdate = parseFloat(vupdate);\r\n                    }\r\n                }\r\n                cell.v = vupdate; /* 备注：如果使用parseFloat，1.1111111111111111会转换为1.1111111111111112 ? */\r\n                cell.ct = { fa: \"General\", t: \"n\" };\r\n                if (cell.v == Infinity || cell.v == -Infinity) {\r\n                    cell.m = cell.v.toString();\r\n                } else {\r\n                    let mask = genarate(cell.v);\r\n\r\n                    cell.m = mask[0].toString();\r\n                }\r\n            } else {\r\n                let mask = genarate(vupdate);\r\n\r\n                cell.m = mask[0].toString();\r\n                cell.ct = mask[1];\r\n                cell.v = mask[2];\r\n            }\r\n        }\r\n    }\r\n\r\n    if (!server.allowUpdate && !luckysheetConfigsetting.pointEdit) {\r\n        if (\r\n            cell.ct != null &&\r\n            /^(w|W)((0?)|(0\\.0+))$/.test(cell.ct.fa) == false &&\r\n            cell.ct.t == \"n\" &&\r\n            cell.v != null &&\r\n            parseInt(cell.v).toString().length > 4\r\n        ) {\r\n            let autoFormatw = luckysheetConfigsetting.autoFormatw.toString().toUpperCase();\r\n            let accuracy = luckysheetConfigsetting.accuracy;\r\n\r\n            let sfmt = setAccuracy(autoFormatw, accuracy);\r\n\r\n            if (sfmt != \"General\") {\r\n                cell.ct.fa = sfmt;\r\n                cell.m = update(sfmt, cell.v);\r\n            }\r\n        }\r\n    }\r\n\r\n    d[r][c] = cell;\r\n    return cell;\r\n}\r\n\r\n//new runze 根据亿万格式autoFormatw和精确度accuracy 转换成 w/w0/w0.00 or 0/0.0格式\r\nfunction setAccuracy(autoFormatw, accuracy) {\r\n    let acc = \"0.\";\r\n    let fmt;\r\n\r\n    if (autoFormatw == \"TRUE\") {\r\n        if (accuracy == undefined) {\r\n            return \"w\";\r\n        } else {\r\n            let alength = parseInt(accuracy);\r\n\r\n            if (alength == 0) {\r\n                return \"w0\";\r\n            } else {\r\n                acc = \"w0.\";\r\n\r\n                for (let i = 0; i < alength; i++) {\r\n                    acc += \"0\";\r\n                }\r\n\r\n                fmt = acc;\r\n            }\r\n        }\r\n    } else {\r\n        if (accuracy == undefined) {\r\n            return \"General\";\r\n        } else {\r\n            let alength = parseInt(accuracy);\r\n\r\n            if (alength == 0) {\r\n                return \"0\";\r\n            } else {\r\n                for (let i = 0; i < alength; i++) {\r\n                    acc += \"0\";\r\n                }\r\n\r\n                fmt = acc;\r\n            }\r\n        }\r\n    }\r\n\r\n    return fmt.toString();\r\n}\r\n\r\nexport { setcellvalue, setAccuracy };\r\n"
  },
  {
    "path": "src/global/sort.js",
    "content": "import { getObjType } from '../utils/util';\r\nimport { isRealNull, isRealNum, isEditMode } from './validate';\r\nimport { isdatetime, diff } from './datecontroll';\r\nimport tooltip from './tooltip';\r\nimport editor from './editor';\r\nimport { rowlenByRange } from './getRowlen';\r\nimport { jfrefreshgrid } from './refresh';\r\nimport {checkProtectionAuthorityNormal} from '../controllers/protection';\r\nimport Store from '../store';\r\nimport locale from '../locale/locale';\r\nimport numeral from 'numeral';\r\n\r\n//数据排序方法\r\nfunction orderbydata(data, index, isAsc) {\r\n    if (isAsc == null) {\r\n        isAsc = true;\r\n    }\r\n\r\n    let a = function (x, y) {\r\n        let x1 = x[index] , y1 = y[index];\r\n\r\n        if(getObjType(x[index]) == \"object\"){\r\n            x1 = x[index].v;\r\n        }\r\n\r\n        if(getObjType(y[index]) == \"object\"){\r\n            y1 = y[index].v;\r\n        }\r\n\r\n        if(isRealNull(x1)){\r\n            return 1;\r\n        }\r\n\r\n        if(isRealNull(y1)){\r\n            return -1;\r\n        }\r\n\r\n        if (isdatetime(x1) && isdatetime(y1)) {\r\n            return diff(x1, y1);\r\n        }\r\n        else if (isRealNum(x1) && isRealNum(y1)) {\r\n            return numeral(x1).value() - numeral(y1).value();\r\n        }\r\n        else if (!isRealNum(x1) && !isRealNum(y1)) {\r\n            return x1.localeCompare(y1, \"zh\");\r\n        }\r\n        else if (!isRealNum(x1)) {\r\n            return 1;\r\n        }\r\n        else if (!isRealNum(y1)) {\r\n            return -1;\r\n        }\r\n    }\r\n\r\n    let d = function (x, y) {\r\n        let x1 = x[index] , y1 = y[index];\r\n\r\n        if(getObjType(x[index]) == \"object\"){\r\n            x1 = x[index].v;\r\n        }\r\n\r\n        if(getObjType(y[index]) == \"object\"){\r\n            y1 = y[index].v;\r\n        }\r\n\r\n        if(isRealNull(x1)){\r\n            return 1;\r\n        }\r\n\r\n        if(isRealNull(y1)){\r\n            return -1;\r\n        }\r\n\r\n        if (isdatetime(x1) && isdatetime(y1)) {\r\n            return diff(y1, x1);\r\n        }\r\n        else if (isRealNum(x1) && isRealNum(y1)) {\r\n            return numeral(y1).value() - numeral(x1).value();\r\n        }\r\n        else if (!isRealNum(x1) && !isRealNum(y1)) {\r\n            return y1.localeCompare(x1, \"zh\");\r\n        }\r\n        else if (!isRealNum(x1)) {\r\n            return -1;\r\n        }\r\n        else if (!isRealNum(y1)) {\r\n            return 1;\r\n        }\r\n    }\r\n\r\n    if (isAsc) {\r\n        return data.sort(a);\r\n    }\r\n    else {\r\n        return data.sort(d);\r\n    }\r\n}\r\n\r\nfunction orderbydata1D(data, isAsc) {\r\n    if (isAsc == null) {\r\n        isAsc = true;\r\n    }\r\n\r\n    let a = function (x, y) {\r\n        let x1 = x, y1 = y;\r\n\r\n        if(getObjType(x) == \"object\"){\r\n            x1 = x.v;\r\n        }\r\n\r\n        if(getObjType(y) == \"object\"){\r\n            y1 = y.v;\r\n        }\r\n\r\n        if(x1 == null){\r\n            x1 = \"\";\r\n        }\r\n\r\n        if(y1 == null){\r\n            y1 = \"\";\r\n        }\r\n\r\n        if (isdatetime(x1) && isdatetime(y1)) {\r\n            return diff(x1, y1);\r\n        }\r\n        else if (isRealNum(x1) && isRealNum(y1)) {\r\n            return numeral(x1).value() - numeral(y1).value();\r\n        }\r\n        else if (!isRealNum(x1) && !isRealNum(y1)) {\r\n            return x1.localeCompare(y1, \"zh\");\r\n        }\r\n        else if (!isRealNum(x1)) {\r\n            return 1;\r\n        }\r\n        else if (!isRealNum(y1)) {\r\n            return -1;\r\n        }\r\n    }\r\n\r\n    let d = function (x, y) {\r\n        let x1 = x, y1 = y;\r\n\r\n        if(getObjType(x) == \"object\"){\r\n            x1 = x.v;\r\n        }\r\n\r\n        if(getObjType(y) == \"object\"){\r\n            y1 = y.v;\r\n        }\r\n\r\n        if(x1 == null){\r\n            x1 = \"\";\r\n        }\r\n\r\n        if(y1 == null){\r\n            y1 = \"\";\r\n        }\r\n\r\n        if (isdatetime(x1) && isdatetime(y1)) {\r\n            return diff(y1, x1);\r\n        }\r\n        else if (isRealNum(x1) && isRealNum(y1)) {\r\n            return numeral(y1).value() - numeral(x1).value();\r\n        }\r\n        else if (!isRealNum(x1) && !isRealNum(y1)) {\r\n            return y1.localeCompare(x1, \"zh\");\r\n        }\r\n        else if (!isRealNum(x1)) {\r\n            return -1;\r\n        }\r\n        else if (!isRealNum(y1)) {\r\n            return 1;\r\n        }\r\n    }\r\n\r\n    if (isAsc) {\r\n        return data.sort(a);\r\n    }\r\n    else {\r\n        return data.sort(d);\r\n    }\r\n}\r\n\r\n//排序选区数据\r\nfunction sortSelection(isAsc) {\r\n    if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"sort\")){\r\n        return;\r\n    }\r\n\r\n    const _locale = locale();\r\n    const locale_sort = _locale.sort;\r\n\r\n    if(Store.luckysheet_select_save.length > 1){\r\n        if(isEditMode()){\r\n            alert(locale_sort.noRangeError);\r\n        }\r\n        else{\r\n            tooltip.info(locale_sort.noRangeError, \"\");\r\n        }\r\n\r\n        return;\r\n    }\r\n\r\n    if(isAsc == null){\r\n        isAsc = true;\r\n    }\r\n\r\n    let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n    let r1 = Store.luckysheet_select_save[0].row[0], \r\n        r2 = Store.luckysheet_select_save[0].row[1];\r\n    let c1 = Store.luckysheet_select_save[0].column[0], \r\n        c2 = Store.luckysheet_select_save[0].column[1];\r\n\r\n    let str, edr;\r\n\r\n    for(let r = r1; r <= r2; r++){\r\n        if(d[r] != null && d[r][c1] != null){\r\n            let cell = d[r][c1];\r\n\r\n            if(cell.mc != null || isRealNull(cell.v)){\r\n                continue;\r\n            }\r\n\r\n            if(str == null && /[\\u4e00-\\u9fa5]+/g.test(cell.v)){\r\n                str = r + 1;\r\n                edr = r + 1;\r\n                continue;\r\n            }\r\n            \r\n            if(str == null){\r\n                str = r;    \r\n            }\r\n\r\n            edr = r;\r\n        }\r\n    }\r\n\r\n    if(str == null || str > r2){\r\n        return;\r\n    }\r\n\r\n    let hasMc = false; //排序选区是否有合并单元格\r\n    let data = [];\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        let data_row = [];\r\n\r\n        for(let c = c1; c <= c2; c++){\r\n            if(d[r][c] != null && d[r][c].mc != null){\r\n                hasMc = true;\r\n                break;\r\n            }\r\n\r\n            data_row.push(d[r][c]);\r\n        }\r\n\r\n        data.push(data_row);\r\n    }\r\n\r\n    if(hasMc){\r\n        if(isEditMode()){\r\n            alert(locale_sort.mergeError);\r\n        }\r\n        else{\r\n            tooltip.info(locale_sort.mergeError, \"\");\r\n        }\r\n\r\n        return;\r\n    }\r\n\r\n    data = orderbydata(data, 0, isAsc);\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        for(let c = c1; c <= c2; c++){\r\n            d[r][c] = data[r - str][c - c1];\r\n        }\r\n    }\r\n\r\n    let allParam = {};\r\n    if(Store.config[\"rowlen\"] != null){\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        cfg = rowlenByRange(d, str, edr, cfg);\r\n\r\n        allParam = {\r\n            \"cfg\": cfg,\r\n            \"RowlChange\": true\r\n        }\r\n    }\r\n\r\n    jfrefreshgrid(d, [{ \"row\": [str, edr], \"column\": [c1, c2] }], allParam);\r\n}\r\n\r\n//排序一列数据\r\nfunction sortColumnSeletion(colIndex, isAsc) {\r\n    if(!checkProtectionAuthorityNormal(Store.currentSheetIndex, \"sort\")){\r\n        return;\r\n    }\r\n    if(isAsc == null){\r\n        isAsc = true;\r\n    }\r\n\r\n    const _locale = locale();\r\n    const locale_sort = _locale.sort;\r\n\r\n    let d = editor.deepCopyFlowData(Store.flowdata);\r\n\r\n    let r1 = 0, r2 = d.length - 1;\r\n    let c1 = 0, c2 = d[0].length - 1;\r\n\r\n    let str, edr;\r\n\r\n    for(let r = r1; r <= r2; r++){\r\n        if(d[r][colIndex] != null && d[r][colIndex].mc != null){\r\n            continue;\r\n        }\r\n\r\n        if(d[r][colIndex] != null && !isRealNull(d[r][colIndex].v) && /[\\u4e00-\\u9fa5]+/g.test(d[r][colIndex].v) && str == null){\r\n            str = r + 1;\r\n            edr = r + 1;\r\n            continue;\r\n        }\r\n\r\n        if(str == null){\r\n            str = r;    \r\n        }\r\n\r\n        if(d[r][colIndex] != null && !isRealNull(d[r][colIndex].v)){\r\n            edr = r;\r\n        }\r\n    }\r\n\r\n    if(str == null || str > r2){\r\n        return;\r\n    }\r\n\r\n    let hasMc = false; //排序选区是否有合并单元格\r\n    let data = [];\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        let data_row = [];\r\n\r\n        for(let c = c1; c <= c2; c++){\r\n            if(d[r][c] != null && d[r][c].mc != null){\r\n                hasMc = true;\r\n                break;\r\n            }\r\n\r\n            data_row.push(d[r][c]);\r\n        }\r\n\r\n        data.push(data_row);\r\n    }\r\n\r\n    if(hasMc){\r\n        if(isEditMode()){\r\n            alert(locale_sort.columnSortMergeError);\r\n        }\r\n        else{\r\n            tooltip.info(locale_sort.columnSortMergeError, \"\");\r\n        }\r\n\r\n        return;\r\n    }\r\n\r\n    data = orderbydata(data, colIndex, isAsc);\r\n\r\n    for(let r = str; r <= edr; r++){\r\n        for(let c = c1; c <= c2; c++){\r\n            d[r][c] = data[r - str][c - c1];\r\n        }\r\n    }\r\n\r\n    let allParam = {};\r\n    if(Store.config[\"rowlen\"] != null){\r\n        let cfg = $.extend(true, {}, Store.config);\r\n        cfg = rowlenByRange(d, str, edr, cfg);\r\n\r\n        allParam = {\r\n            \"cfg\": cfg,\r\n            \"RowlChange\": true\r\n        }\r\n    }\r\n\r\n    jfrefreshgrid(d, [{ \"row\": [str, edr], \"column\": [c1, c2] }], allParam);\r\n}\r\n\r\nexport {\r\n    orderbydata,\r\n    orderbydata1D,\r\n    sortSelection,\r\n    sortColumnSeletion,\r\n}"
  },
  {
    "path": "src/global/tooltip.js",
    "content": "import { modelHTML, luckysheetchartpointconfigHTML, luckysheetToolHTML } from '../controllers/constant';\r\nimport browser from './browser';\r\nimport { replaceHtml } from '../utils/util';\r\nimport locale from '../locale/locale';\r\nimport server from '../controllers/server';\r\n\r\nconst tooltip = {\r\n    info: function (title, content) {\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-info\").remove();\r\n\r\n        let _locale = locale();\r\n        let locale_button = _locale.button;\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-info\", \r\n            \"addclass\": \"\", \r\n            \"title\": title, \r\n            \"content\": content, \r\n            \"botton\": '<button class=\"btn btn-default luckysheet-model-close-btn\">&nbsp;&nbsp;'+locale_button.close+'&nbsp;&nbsp;</button>', \r\n            \"style\": \"z-index:100003\" \r\n        }));\r\n        let $t = $(\"#luckysheet-info\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-info\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n    },\r\n    confirm: function (title, content, func1, func2, name1, name2) {\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-confirm\").remove();\r\n\r\n        const _locale = locale();\r\n        const locale_button = _locale.button;\r\n        \r\n        if(name1 == null){\r\n            name1 = locale_button.confirm;\r\n        }\r\n        if(name2 == null){\r\n            name2 = locale_button.cancel;\r\n        }\r\n\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-confirm\", \r\n            \"addclass\": \"\", \r\n            \"style\": \"z-index:100003\", \r\n            \"title\": title, \r\n            \"content\": content, \r\n            \"botton\": '<button class=\"btn btn-primary luckysheet-model-conform-btn\">&nbsp;&nbsp;'+ name1 +'&nbsp;&nbsp;</button><button class=\"btn btn-default luckysheet-model-cancel-btn\">&nbsp;&nbsp;'+ name2 +'&nbsp;&nbsp;</button>' \r\n        }));\r\n        let $t = $(\"#luckysheet-confirm\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-confirm\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n        $t.find(\".luckysheet-model-conform-btn\").click(function () {\r\n            if (typeof func1 == 'function') {\r\n                func1();\r\n            }\r\n            server.keepHighLightBox();\r\n            $(\"#luckysheet-confirm\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();  \r\n        });\r\n        $t.find(\".luckysheet-model-cancel-btn\").click(function () {\r\n            if (typeof func2 == 'function') {\r\n                func2();\r\n            }\r\n            $(\"#luckysheet-confirm\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        });\r\n    },\r\n    screenshot: function (title, content, imgurl) {\r\n\r\n        const _locale = locale();\r\n        const locale_screenshot = _locale.screenshot;\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        $(\"#luckysheet-confirm\").remove();\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": \"luckysheet-confirm\", \r\n            \"addclass\": \"\", \r\n            \"style\": \"z-index:100003\", \r\n            \"title\": title, \r\n            \"content\": content, \r\n            \"botton\": '<a style=\"text-decoration:none;color:#fff;\" class=\"download btn btn-primary luckysheet-model-conform-btn\">&nbsp;&nbsp;'+ locale_screenshot.downLoadBtn +'&nbsp;&nbsp;</a>&nbsp;&nbsp;<button class=\"btn btn-primary luckysheet-model-copy-btn\">&nbsp;&nbsp;'+ locale_screenshot.downLoadCopy +'&nbsp;&nbsp;</button><button class=\"btn btn-default luckysheet-model-cancel-btn\">&nbsp;&nbsp;'+ locale_screenshot.downLoadClose +'&nbsp;&nbsp;</button>' \r\n        }));\r\n        let $t = $(\"#luckysheet-confirm\").find(\".luckysheet-modal-dialog-content\").css(\"min-width\", 300).end(), \r\n            myh = $t.outerHeight(), \r\n            myw = $t.outerWidth();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();\r\n        $(\"#luckysheet-confirm\").css({ \"left\": (winw + scrollLeft - myw) / 2, \"top\": (winh + scrollTop - myh) / 3 }).show();\r\n        $t.find(\".luckysheet-model-conform-btn\").click(function () {\r\n            if(browser.isIE() == \"1\"){\r\n                alert(locale_screenshot.browserNotTip);\r\n            }\r\n            else{\r\n                if (!!window.ActiveXObject || \"ActiveXObject\" in window){\r\n                    if ($(\"#IframeReportImg\").length === 0){\r\n                        $('<iframe style=\"display:none;\" id=\"IframeReportImg\" name=\"IframeReportImg\" onload=\"downloadImg();\" width=\"0\" height=\"0\" src=\"about:blank\"></iframe>').appendTo(\"body\");\r\n                    }\r\n                    if ($('#IframeReportImg').attr(\"src\") != imgurl) {\r\n                        $('#IframeReportImg').attr(\"src\",imgurl);\r\n                    } else {\r\n                        if ($('#IframeReportImg').src != \"about:blank\") {\r\n                            window.frames[\"IframeReportImg\"].document.execCommand(\"SaveAs\");\r\n                        }\r\n                    }\r\n                }  \r\n            }\r\n        });\r\n        $t.find(\".luckysheet-model-cancel-btn\").click(function () {\r\n            $(\"#luckysheet-confirm\").hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        });\r\n\r\n        $('#luckysheet-confirm .luckysheet-model-copy-btn').click(function(){\r\n            let dt = new clipboard.DT();\r\n            dt.setData(\"text/html\", \"<img src='\"+ imgurl +\"'>\");\r\n            if(browser.isIE() == \"1\"){\r\n                alert(locale_screenshot.rightclickTip);\r\n            }\r\n            else{\r\n                clipboard.write(dt);\r\n                alert(locale_screenshot.successTip);  \r\n            }\r\n        });\r\n    },\r\n    chartPointConfig: function (id, savefunc1, closefunc2) {\r\n        $(\"body\").append(replaceHtml(modelHTML, { \r\n            \"id\": id, \r\n            \"addclass\": \"luckysheet-chart-point-config-c\", \r\n            \"title\": \"数据点批量设置\", \r\n            \"content\": luckysheetchartpointconfigHTML, \r\n            \"botton\": '<button class=\"btn btn-danger luckysheet-model-save-btn\">&nbsp;&nbsp;保存设置&nbsp;&nbsp;</button><button class=\"btn btn-default luckysheet-model-close-btn\">&nbsp;&nbsp;取消&nbsp;&nbsp;</button>', \r\n            \"style\": \"z-index:100003;height:80%;width:80%;top:10%;left:10%;\" \r\n        }));\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n        let winw = $(window).width(), winh = $(window).height();\r\n        $(\"#\" + id).find(\".luckysheet-chart-point-config\").css(\"height\", winh - 160);\r\n        $(\"#\" + id).css({ \r\n            \"height\": winh - 90, \r\n            \"width\": winw - 100, \r\n            \"left\": 7, \r\n            \"top\": 14 \r\n        }).show().find(\".luckysheet-model-save-btn\").click(function () {\r\n            if (typeof savefunc1 == 'function') {\r\n                savefunc1();\r\n            }\r\n\r\n            $(\"#\" + id).hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        });\r\n\r\n        $(\"#\" + id).find(\".luckysheet-model-save-btn\").click(function () {\r\n            if (typeof closefunc2 == 'function') {\r\n                closefunc2();\r\n            }\r\n\r\n            $(\"#\" + id).hide();\r\n            $(\"#luckysheet-modal-dialog-mask\").hide();\r\n        });\r\n    },\r\n    sheetConfig: function () {\r\n\r\n    },\r\n    hoverTipshowState: false,\r\n    hoverTipshowTimeOut: null,\r\n    createHoverTip: function (obj, to) {\r\n        let _this = this;\r\n\r\n        $(obj).on(\"mouseover\", to, function (e) {\r\n            if (_this.hoverTipshowState) {\r\n                return;\r\n            }\r\n\r\n            clearTimeout(_this.hoverTipshowTimeOut);\r\n            _this.hoverTipshowTimeOut = setTimeout(function(){\r\n                let $t = $(e.currentTarget), \r\n                    toffset = $t.offset(), \r\n                    $toolup = $(\"#luckysheet-tooltip-up\");\r\n                \r\n                let tips = $t.data(\"tips\");\r\n                if (tips == null || tips.length == 0) {\r\n                    tips = $t.prev().data(\"tips\");\r\n\r\n                    if (tips == null || tips.length == 0) {\r\n                        return;\r\n                    }\r\n                }\r\n\r\n                if ($toolup.length == 0) {\r\n                    $(\"body\").append(luckysheetToolHTML);\r\n                    $toolup = $(\"#luckysheet-tooltip-up\");\r\n                }\r\n\r\n                $toolup.removeClass(\"jfk-tooltip-hide\").find(\"div.jfk-tooltip-contentId\").html(tips);\r\n                let toolwidth = $toolup.outerWidth();\r\n                $toolup.find(\"div.jfk-tooltip-arrow\").css(\"left\", (toolwidth) / 2);\r\n\r\n                let toolleft = toffset.left + ($t.outerWidth() - toolwidth) / 2;\r\n                if(toolleft < 2){\r\n                    toolleft = 2;\r\n                    $toolup.find(\"div.jfk-tooltip-arrow\").css(\"left\", $t.outerWidth() / 2);\r\n                }\r\n\r\n                $toolup.css({ \"top\": toffset.top + $t.outerHeight() + 1, \"left\": toolleft });\r\n            }, 300);\r\n\r\n        }).on(\"mouseout\", to, function (e) {\r\n            _this.hoverTipshowState = false;\r\n            clearTimeout(_this.hoverTipshowTimeOut);\r\n            $(\"#luckysheet-tooltip-up\").addClass(\"jfk-tooltip-hide\");\r\n        }).on(\"click\", to, function (e) {\r\n            _this.hoverTipshowState = true;\r\n            clearTimeout(_this.hoverTipshowTimeOut);\r\n            $(\"#luckysheet-tooltip-up\").addClass(\"jfk-tooltip-hide\");\r\n        });\r\n    },\r\n    popover: function(content, position, close, style, btntxt, exitsFuc){\r\n        let _locale = locale();\r\n        let locale_button = _locale.button;\r\n        let locale_paint = _locale.paint;\r\n\r\n        if(btntxt == null){\r\n            btntxt = locale_button.close;\r\n        }\r\n\r\n        let htmldiv = '<div id=\"luckysheetpopover\" class=\"luckysheetpopover\"><div class=\"luckysheetpopover-content\">'+locale_paint.start+'</div><div class=\"luckysheetpopover-btn\">'+ btntxt +'</div></div>';\r\n        $(\"#luckysheetpopover\").remove();\r\n        $(\"body\").append(htmldiv);\r\n        $(\"#luckysheetpopover .luckysheetpopover-content\").html(content);\r\n\r\n        let w = $(\"#luckysheetpopover\").outerWidth(),\r\n            h = $(\"#luckysheetpopover\").outerHeight();\r\n        let pcss = {};\r\n\r\n        if(position == 'topLeft'){\r\n            pcss.top = \"20px\";\r\n            pcss.left = \"20px\";\r\n        }\r\n        else if(position == 'topCenter'){\r\n            pcss.top = \"20px\";\r\n            pcss.left = \"50%\";\r\n            pcss[\"margin-left\"] = -w/2;\r\n        }\r\n        else if(position == 'topRight'){\r\n            pcss.top = \"20px\";\r\n            pcss.right = \"20px\";\r\n        }\r\n        else if(position == 'midLeft'){\r\n            pcss.top = \"50%\";\r\n            pcss[\"margin-top\"] = -h/2;\r\n            pcss.left = \"20px\";\r\n        }\r\n        else if(position == 'center'){\r\n            pcss.top = \"50%\";\r\n            pcss[\"margin-top\"] = -h/2;\r\n            pcss.left = \"50%\";\r\n            pcss[\"margin-left\"] = -w/2;\r\n        }\r\n        else if(position == 'midRight'){\r\n            pcss.top = \"50%\";\r\n            pcss[\"margin-top\"] = -h/2;\r\n            pcss.right = \"20px\";\r\n        }\r\n        else if(position == 'bottomLeft'){\r\n            pcss.bottom = \"20px\";\r\n            pcss.left = \"20px\";\r\n        }\r\n        else if(position == 'bottomCenter'){\r\n            pcss.bottom = \"20px\";\r\n            pcss.left = \"50%\";\r\n            pcss[\"margin-left\"] = -w/2;\r\n        }\r\n        else if(position == 'bottomRight'){\r\n            pcss.bottom = \"20px\";\r\n            pcss.right = \"20px\";\r\n        }\r\n        else{\r\n            pcss.top = \"20px\";\r\n            pcss.left = \"50%\";\r\n            pcss[\"margin-left\"] = -w/2;\r\n        }\r\n\r\n        if(style == \"white\"){\r\n            pcss.background = \"rgba(255, 255, 255, 0.65)\";\r\n            pcss.color = \"#000\";\r\n            $(\"#luckysheetpopover .luckysheetpopover-btn\").css({\"border\": \"1px solid #000\"});\r\n        }\r\n\r\n        setTimeout(function(){\r\n            $(\"#luckysheetpopover .luckysheetpopover-content\").css({\"margin-left\": -$(\"#luckysheetpopover .luckysheetpopover-btn\").outerWidth()/2});\r\n        }, 1);\r\n        $(\"#luckysheetpopover\").css(pcss).fadeIn();\r\n        $(\"#luckysheetpopover .luckysheetpopover-btn\").click(function(){\r\n            if(typeof(exitsFuc) == \"function\"){\r\n                exitsFuc();\r\n            }\r\n        });\r\n\r\n        if(close != null && typeof(close) == \"number\"){\r\n            setTimeout(function(){\r\n                $(\"#luckysheetpopover\").fadeOut().remove();\r\n                if(typeof(exitsFuc) == \"function\"){\r\n                    exitsFuc();\r\n                }\r\n            }, close);\r\n        }\r\n    }\r\n}\r\n\r\nexport default tooltip;"
  },
  {
    "path": "src/global/validate.js",
    "content": "import luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';\r\nimport Store from '../store';\r\n\r\nexport const error = {\r\n    v: \"#VALUE!\",    //错误的参数或运算符\r\n    n: \"#NAME?\",     //公式名称错误\r\n    na: \"#N/A\",      //函数或公式中没有可用数值\r\n    r: \"#REF!\",      //删除了由其他公式引用的单元格\r\n    d: \"#DIV/0!\",    //除数是0或空单元格\r\n    nm: \"#NUM!\",     //当公式或函数中某个数字有问题时\r\n    nl: \"#NULL!\",    //交叉运算符（空格）使用不正确\r\n    sp: \"#SPILL!\"    //数组范围有其它值\r\n}\r\n\r\n//是否是空值\r\nfunction isRealNull(val) {\r\n    if(val == null || val.toString().replace(/\\s/g, \"\") == \"\"){\r\n        return true;\r\n    }\r\n    else{\r\n        return false;\r\n    }\r\n}\r\n\r\n//是否是纯数字\r\nfunction isRealNum(val) {\r\n    if(val == null || val.toString().replace(/\\s/g, \"\") === \"\"){\r\n        return false;\r\n    }\r\n\r\n    if(typeof val == \"boolean\"){\r\n        return false;\r\n    }\r\n\r\n    if(!isNaN(val)){\r\n        return true;\r\n    }\r\n    else{\r\n        return false;\r\n    }\r\n}\r\n\r\n//是否是错误类型\r\nfunction valueIsError(value) {\r\n    let isError = false;\r\n\r\n    for(let x in error){\r\n        if(value == error[x]){\r\n            isError = true;\r\n            break;\r\n        }\r\n    }\r\n\r\n    return isError;\r\n}\r\n\r\n//是否有中文\r\nfunction hasChinaword(s) {\r\n    let patrn = /[\\u4E00-\\u9FA5]|[\\uFE30-\\uFFA0]/gi;\r\n    \r\n    if (!patrn.exec(s)) {\r\n        return false;\r\n    }\r\n    else {\r\n        return true;\r\n    }\r\n}\r\n\r\n//是否为非编辑模式\r\nfunction isEditMode() {\r\n    if(luckysheetConfigsetting.editMode){\r\n        return true;\r\n    }\r\n    else{\r\n        return false;\r\n    }\r\n}\r\n\r\n/**\r\n * @description: 检查是否允许前台进行表格编辑\r\n * @param {*}\r\n * @return {Boolean} true:允许编辑 fasle:不允许\r\n */\r\nfunction checkIsAllowEdit(){\r\n    if (Store.allowEdit) {\r\n        return true;\r\n    }\r\n    else {\r\n        return false;\r\n    }\r\n}\r\n\r\n//范围是否只包含部分合并单元格\r\nfunction hasPartMC(cfg, r1, r2, c1, c2) {\r\n    let hasPartMC = false;\r\n\r\n    for(let x in Store.config[\"merge\"]){\r\n        let mc = cfg[\"merge\"][x];\r\n\r\n        if(r1 < mc.r){\r\n            if(r2 >= mc.r && r2 < (mc.r + mc.rs - 1)){\r\n                if(c1 >= mc.c && c1 <= (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c2 >= mc.c && c2 <= (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 < mc.c && c2 > (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n            }\r\n            else if(r2 >= mc.r && r2 == (mc.r + mc.rs - 1)){\r\n                if(c1 > mc.c && c1 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c2 > mc.c && c2 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 == mc.c && c2 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 > mc.c && c2 == (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n            }\r\n            else if(r2 > (mc.r + mc.rs - 1)){\r\n                if(c1 > mc.c && c1 <= (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c2 >= mc.c && c2 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 == mc.c && c2 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 > mc.c && c2 == (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else if(r1 == mc.r){\r\n            if(r2 < (mc.r + mc.rs - 1)){\r\n                if(c1 >= mc.c && c1 <= (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c2 >= mc.c && c2 <= (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 < mc.c && c2 > (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n            }\r\n            else if(r2 >= (mc.r + mc.rs - 1)){\r\n                if(c1 > mc.c && c1 <= (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c2 >= mc.c && c2 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 == mc.c && c2 < (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n                else if(c1 > mc.c && c2 == (mc.c + mc.cs - 1)){\r\n                    hasPartMC = true;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else if(r1 <= (mc.r + mc.rs - 1)){\r\n            if(c1 >= mc.c && c1 <= (mc.c + mc.cs - 1)){\r\n                hasPartMC = true;\r\n                break;\r\n            }\r\n            else if(c2 >= mc.c && c2 <= (mc.c + mc.cs - 1)){\r\n                hasPartMC = true;\r\n                break;\r\n            }\r\n            else if(c1 < mc.c && c2 > (mc.c + mc.cs - 1)){\r\n                hasPartMC = true;\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    return hasPartMC;\r\n}\r\n\r\n//获取单个字符的字节数\r\nfunction checkWordByteLength(value) {\r\n    return Math.ceil(value.charCodeAt().toString(2).length / 8);\r\n }\r\n \r\n\r\nexport {\r\n    isRealNull,\r\n    isRealNum,\r\n    valueIsError,\r\n    hasChinaword,\r\n    isEditMode,\r\n    checkIsAllowEdit,\r\n    hasPartMC,\r\n    checkWordByteLength\r\n}"
  },
  {
    "path": "src/index.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head lang='zh'>\n\t<meta charset='utf-8'>\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n\t<meta name=\"renderer\" content=\"webkit\" />\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,user-scalable=0\" />\n\t<title>Luckysheet</title>\n\n\t<link rel='stylesheet' href='./plugins/css/pluginsCss.css' />\n\t<link rel='stylesheet' href='./plugins/plugins.css' />\n\t<link rel='stylesheet' href='./css/luckysheet.css' />\n\t<link rel='stylesheet' href='./assets/iconfont/iconfont.css' />\n\t<script src=\"./plugins/js/plugin.js\"></script>\n\n\t<!-- rollup luckysheet.js -->\n\t<script src=\"./luckysheet.umd.js\"></script>\n</head>\n\n<body>\n\t<!-- Non-full screen test -->\n\t<!-- <div style=\"position: relative;width: 100%;height: 100%;\">\n\n\t\t<div id=\"luckysheet\" style=\"margin:0px;padding:0px;position:absolute;width:80%;height:500px;left: 20%;top: 200px;bottom:0;right: 0;\"></div>\n\t</div> -->\n\n\t<div id=\"luckysheet\" style=\"margin:0px;padding:0px;position:absolute;width:100%;height:100%;left: 0px;top: 0px;\">\n\t</div>\n\t<!-- demo feature, non-production use -->\n\t<script src=\"./demoData/demoFeature.js\"></script>\n\t<script src=\"./demoData/sheetFormula.js\"></script>\n\t<script src=\"./demoData/sheetCell.js\"></script>\n\t<script src=\"./demoData/sheetConditionFormat.js\"></script>\n\t<script src=\"./demoData/sheetTable.js\"></script>\n\t<script src=\"./demoData/sheetComment.js\"></script>\n\t<script src=\"./demoData/sheetPivotTableData.js\"></script>\n\t<script src=\"./demoData/sheetPivotTable.js\"></script>\n\t<script src=\"./demoData/sheetSparkline.js\"></script>\n\t<script src=\"./demoData/sheetChart.js\"></script>\n\t<script src=\"./demoData/sheetPicture.js\"></script>\n\t<script src=\"./demoData/sheetDataVerification.js\"></script>\n\n\t<script>\n\t\t// import sheetFormula from './demoData/sheetFormula.js'\n\t\t// import sheetCell from './demoData/sheetCell.js'\n\t\t// import sheetConditionFormat from './demoData/sheetConditionFormat.js'\n\t\t// import sheetTable from './demoData/sheetTable.js'\n\t\t// import sheetComment from './demoData/sheetComment.js'\n\t\t// import sheetPivotTableData from './demoData/sheetPivotTableData.js'\n\t\t// import sheetPivotTable from './demoData/sheetPivotTable.js'\n\t\t// import sheetSparkline from './demoData/sheetSparkline.js'\n\t\t// import sheetChart from './demoData/sheetChart.js'\n\t\t// import sheetPicture from './demoData/sheetPicture.js'\n\t\t// import sheetDataVerification from './demoData/sheetDataVerification.js'\n\n\n\t\t$(function () {\n\n\t\t\t// According to the browser language\n\t\t\tvar lang = luckysheetDemoUtil.language() === 'zh' ? 'zh' : 'en';\n\t\t\tvar isShare = luckysheetDemoUtil.getRequest().share; // '?share=1' opens the collaborative editing mode\n\t\t\tvar gridKey = luckysheetDemoUtil.getRequest().gridKey; // workbook id for collaborative editing, or directly define here\n\t\t\tvar options = null;\n\n\t\t\tif (isShare || gridKey) {\n\t\t\t\t// http://localhost:3000/?gridKey=12eyy789-kk45ofid-23737245\n\t\t\t\tif (!gridKey) {\n\t\t\t\t\talert('If gridKey is not provided in the address bar, please add it in the source code')\n\t\t\t\t}\n\t\t\t\toptions = {\n\t\t\t\t\tcontainer: \"luckysheet\",\n\t\t\t\t\tlang: lang,\n\t\t\t\t\tallowUpdate: true,\n\t\t\t\t\tupdateImageUrl: location.origin + \"/luckysheet/api/updateImg\",\n\t\t\t\t\tupdateUrl: \"ws://\" + location.host + \"/luckysheet/websocket/luckysheet\",\n\t\t\t\t\tgridKey: gridKey,\n\t\t\t\t\tloadUrl: location.origin + \"/luckysheet/api/load\",\n\t\t\t\t\tloadSheetUrl: location.origin + \"/luckysheet/api/loadsheet\"\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// http://localhost:3000/\n\t\t\t\toptions = {\n\t\t\t\t\tcontainer: 'luckysheet',\n\t\t\t\t\tlang: lang,\n\t\t\t\t\t// pager: {\n\t\t\t\t\t// \tpageIndex: 1,\n\t\t\t\t\t// \tpageSize: 10,\n\t\t\t\t\t// \ttotal: 50,\n\t\t\t\t\t// \tselectOption: [10, 20]\n\t\t\t\t\t// },\n\t\t\t\t\tforceCalculation: false,\n\t\t\t\t\tplugins: [{ name: 'chart' }, { name: 'exportXlsx', config: { url: 'http://localhost:3002/luckyToXlsx' } }, {\n\t\t\t\t\t\tname: 'print', config: {\n\t\t\t\t\t\t\tlicense: ''\n\t\t\t\t\t\t}\n\t\t\t\t\t}],\n\t\t\t\t\tfontList: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"fontName\": \"HanaleiFill\",\n\t\t\t\t\t\t\t\"url\": \"./assets/iconfont/HanaleiFill-Regular.ttf\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"fontName\": \"Anton\",\n\t\t\t\t\t\t\t\"url\": \"./assets/iconfont/Anton-Regular.ttf\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"fontName\": \"Pacifico\",\n\t\t\t\t\t\t\t\"url\": \"./assets/iconfont/Pacifico-Regular.ttf\"\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\thook: {\n\t\t\t\t\t\tcellDragStop: function (cell, postion, sheetFile, ctx, event) {\n\t\t\t\t\t\t\t// console.info(cell, postion, sheetFile, ctx, event);\n\t\t\t\t\t\t},\n\t\t\t\t\t\trowTitleCellRenderBefore: function (rowNum, postion, ctx) {\n\t\t\t\t\t\t\t// console.log(rowNum);\n\t\t\t\t\t\t},\n\t\t\t\t\t\trowTitleCellRenderAfter: function (rowNum, postion, ctx) {\n\t\t\t\t\t\t\t// console.log(ctx);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcolumnTitleCellRenderBefore: function (columnAbc, postion, ctx) {\n\t\t\t\t\t\t\t// console.log(columnAbc);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcolumnTitleCellRenderAfter: function (columnAbc, postion, ctx) {\n\t\t\t\t\t\t\t// console.log(postion);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcellRenderBefore: function (cell, postion, sheetFile, ctx) {\n\t\t\t\t\t\t\t// console.log(cell,postion,sheetFile,ctx);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcellRenderAfter: function (cell, postion, sheetFile, ctx) {\n\t\t\t\t\t\t\t// console.log(postion);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcellMousedownBefore: function (cell, postion, sheetFile, ctx) {\n\t\t\t\t\t\t\t// console.log(postion);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcellMousedown: function (cell, postion, sheetFile, ctx) {\n\t\t\t\t\t\t\t// console.log(sheetFile);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsheetMousemove: function (cell, postion, sheetFile, moveState, ctx) {\n\t\t\t\t\t\t\t// console.log(cell,postion,sheetFile,moveState,ctx);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsheetMouseup: function (cell, postion, sheetFile, moveState, ctx) {\n\t\t\t\t\t\t\t// console.log(cell,postion,sheetFile,moveState,ctx);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcellAllRenderBefore: function (data, sheetFile, ctx) {\n\t\t\t\t\t\t\t// console.info(data,sheetFile,ctx)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tupdated: function (operate) {\n\t\t\t\t\t\t\t// console.info(operate)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcellUpdateBefore: function (r, c, value, isRefresh) {\n\t\t\t\t\t\t\t// console.info('cellUpdateBefore',r,c,value,isRefresh)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcellUpdated: function (r, c, oldValue, newValue, isRefresh) {\n\t\t\t\t\t\t\t// console.info('cellUpdated',r,c,oldValue, newValue, isRefresh)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsheetActivate: function (index, isPivotInitial, isNewSheet) {\n\t\t\t\t\t\t\t// console.info(index, isPivotInitial, isNewSheet)\n\t\t\t\t\t\t},\n\t\t\t\t\t\trangeSelect: function (index, sheet) {\n\t\t\t\t\t\t\t// console.info(index, sheet)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcommentInsertBefore: function (r, c) {\n\t\t\t\t\t\t\t// console.info(r, c)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcommentInsertAfter: function (r, c, cell) {\n\t\t\t\t\t\t\t// console.info(r, c, cell)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcommentDeleteBefore: function (r, c, cell) {\n\t\t\t\t\t\t\t// console.info(r, c, cell)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcommentDeleteAfter: function (r, c, cell) {\n\t\t\t\t\t\t\t// console.info(r, c, cell)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcommentUpdateBefore: function (r, c, value) {\n\t\t\t\t\t\t\t// console.info(r, c, value)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcommentUpdateAfter: function (r, c, oldCell, newCell) {\n\t\t\t\t\t\t\t// console.info(r, c, oldCell, newCell)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcellEditBefore: function (range) {\n\t\t\t\t\t\t\t// console.info(range)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tworkbookCreateAfter: function (json) {\n\t\t\t\t\t\t\tconsole.info('workbook create after!!!!====',json)\n\t\t\t\t\t\t},\n\t\t\t\t\t\trangePasteBefore: function (range, data) {\n\t\t\t\t\t\t\t// console.info('rangePasteBefore',range,data)\n\t\t\t\t\t\t\t// return false; //Can intercept paste\n\t\t\t\t\t\t},\n\t\t\t\t\t\trangeDeleteBefore: function (range, data) {\n\t\t\t\t\t\t\tconsole.dir(111)\n\t\t\t\t\t\t},\n\n\t\t\t\t\t},\n\t\t\t\t\t//data:[{\"name\":\"Sheet1\",\"config\":{\"columnlen\":{\"1\":88,\"2\":76,\"3\":88,\"4\":69,\"5\":88,\"6\":69,\"7\":83,\"8\":62,\"9\":83,\"10\":55,\"11\":83,\"12\":62,\"13\":88,\"14\":76,\"15\":88,\"16\":69,\"17\":88,\"18\":69},\"customWidth\":{\"1\":1,\"2\":1,\"3\":1,\"4\":1,\"5\":1,\"6\":1,\"7\":1,\"8\":1,\"9\":1,\"10\":1,\"11\":1,\"12\":1,\"13\":1,\"14\":1,\"15\":1,\"16\":1,\"17\":1,\"18\":1},\"borderInfo\":[{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":0,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":1,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":2,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":3,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":4,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":5,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":6,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":7,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":8,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":9,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":10,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":11,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":12,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":13,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":14,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":15,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":16,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":17,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":18,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":19,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":20,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":21,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":22,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":23,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":24,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":25,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":26,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":27,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":28,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":29,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":30,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":31,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":32,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":33,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":34,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":35,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":36,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":37,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":0,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":1,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":2,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":3,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":4,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":5,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":6,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":7,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":8,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":9,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":10,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":11,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":12,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":13,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":14,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":15,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":16,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":17,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}},{\"rangeType\":\"cell\",\"value\":{\"row_index\":38,\"col_index\":18,\"l\":{\"style\":1,\"color\":\"#302B2F\"},\"r\":{\"style\":1,\"color\":\"#302B2F\"},\"t\":{\"style\":1,\"color\":\"#302B2F\"},\"b\":{\"style\":1,\"color\":\"#302B2F\"}}}]},\"index\":\"1\",\"status\":\"0\",\"order\":\"0\",\"luckysheet_select_save\":[{\"row\":[9,9],\"column\":[4,4],\"sheetIndex\":1}],\"zoomRatio\":1,\"showGridLines\":\"1\",\"defaultColWidth\":72,\"defaultRowHeight\":18,\"celldata\":[{\"r\":0,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"合计\",\"qp\":1}},{\"r\":0,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2121212\"}},{\"r\":0,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"11027033.300000001\"}},{\"r\":0,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"33685339116\"}},{\"r\":0,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5060320.4000000004\"}},{\"r\":0,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"31551697540.5\"}},{\"r\":0,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5966713\"}},{\"r\":0,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4547347979.1000004\"}},{\"r\":0,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"881817.3\"}},{\"r\":0,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"232937258.30000001\"}},{\"r\":0,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"41419.4\"}},{\"r\":0,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4314410720.8000002\"}},{\"r\":0,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"840397.9\"}},{\"r\":0,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"60689688677.300003\"}},{\"r\":0,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"10145216.1\"}},{\"r\":0,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"33452401857.700001\"}},{\"r\":0,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5018901\"}},{\"r\":0,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"27237286819.599998\"}},{\"r\":0,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5126315.0999999996\"}},{\"r\":1,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"区内公司\",\"qp\":1}},{\"r\":1,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"19176729211.799999\"}},{\"r\":1,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3309995.6\"}},{\"r\":1,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"10232441962.700001\"}},{\"r\":1,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1601842.1\"}},{\"r\":1,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"8944287249.1000004\"}},{\"r\":1,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1708153.5\"}},{\"r\":1,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3741456937.3000002\"}},{\"r\":1,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"723406.4\"}},{\"r\":1,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"191935455.69999999\"}},{\"r\":1,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"32961.1\"}},{\"r\":1,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3549521481.5999999\"}},{\"r\":1,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"690445.3\"}},{\"r\":1,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"15435272274.5\"}},{\"r\":1,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2586589.2000000002\"}},{\"r\":1,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"10040506507.1\"}},{\"r\":1,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1568881\"}},{\"r\":1,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5394765767.3999996\"}},{\"r\":1,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1017708.2\"}},{\"r\":2,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"北京\",\"qp\":1}},{\"r\":2,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1639327850.0999999\"}},{\"r\":2,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"232929.4\"}},{\"r\":2,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1639304942.0999999\"}},{\"r\":2,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"232926\"}},{\"r\":2,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"22908\"}},{\"r\":2,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3.4\"}},{\"r\":2,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"10284238.1\"}},{\"r\":2,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1602.9\"}},{\"r\":2,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"10261330.1\"}},{\"r\":2,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1599.5\"}},{\"r\":2,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"22908\"}},{\"r\":2,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3.4\"}},{\"r\":2,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1629043612\"}},{\"r\":2,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"231326.5\"}},{\"r\":2,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1629043612\"}},{\"r\":2,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"231326.5\"}},{\"r\":2,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":2,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":3,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"天津\",\"qp\":1}},{\"r\":3,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"197102644\"}},{\"r\":3,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"35879.800000000003\"}},{\"r\":3,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"101723824.09999999\"}},{\"r\":3,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"16908.5\"}},{\"r\":3,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"95378819.900000006\"}},{\"r\":3,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"18971.3\"}},{\"r\":3,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"34415232.600000001\"}},{\"r\":3,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6882.2\"}},{\"r\":3,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4512011.2\"}},{\"r\":3,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"812.5\"}},{\"r\":3,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"29903221.399999999\"}},{\"r\":3,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6069.6\"}},{\"r\":3,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"162687411.40000001\"}},{\"r\":3,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"28997.599999999999\"}},{\"r\":3,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"97211812.900000006\"}},{\"r\":3,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"16096\"}},{\"r\":3,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"65475598.5\"}},{\"r\":3,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"12901.7\"}},{\"r\":4,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"河北\",\"qp\":1}},{\"r\":4,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"375906003.19999999\"}},{\"r\":4,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"72168.800000000003\"}},{\"r\":4,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"110165771.5\"}},{\"r\":4,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"19157.8\"}},{\"r\":4,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"265740231.69999999\"}},{\"r\":4,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"53011.1\"}},{\"r\":4,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"170439887.19999999\"}},{\"r\":4,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"34131.199999999997\"}},{\"r\":4,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3009197.5\"}},{\"r\":4,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"531.9\"}},{\"r\":4,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"167430689.69999999\"}},{\"r\":4,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"33599.4\"}},{\"r\":4,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"205466116\"}},{\"r\":4,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"38037.599999999999\"}},{\"r\":4,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"107156574\"}},{\"r\":4,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"18625.900000000001\"}},{\"r\":4,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"98309542\"}},{\"r\":4,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"19411.7\"}},{\"r\":5,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"山西\",\"qp\":1}},{\"r\":5,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"399821780.5\"}},{\"r\":5,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"71645.600000000006\"}},{\"r\":5,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"141027648.09999999\"}},{\"r\":5,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"22877\"}},{\"r\":5,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"258794132.40000001\"}},{\"r\":5,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"48768.7\"}},{\"r\":5,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"161910575.90000001\"}},{\"r\":5,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"30756.7\"}},{\"r\":5,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4719394.5\"}},{\"r\":5,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"834\"}},{\"r\":5,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"157191181.40000001\"}},{\"r\":5,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"29922.7\"}},{\"r\":5,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"237911204.59999999\"}},{\"r\":5,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"40888.9\"}},{\"r\":5,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"136308253.59999999\"}},{\"r\":5,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"22042.9\"}},{\"r\":5,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"101602951\"}},{\"r\":5,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"18845.900000000001\"}},{\"r\":6,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"河南\",\"qp\":1}},{\"r\":6,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"920677504.20000005\"}},{\"r\":6,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"167568.5\"}},{\"r\":6,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"289753107.89999998\"}},{\"r\":6,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"47977.599999999999\"}},{\"r\":6,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"630924396.29999995\"}},{\"r\":6,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"119590.9\"}},{\"r\":6,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"142879264.59999999\"}},{\"r\":6,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"26971.3\"}},{\"r\":6,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"10949355\"}},{\"r\":6,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1889\"}},{\"r\":6,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"131929909.59999999\"}},{\"r\":6,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"25082.3\"}},{\"r\":6,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"777798239.60000002\"}},{\"r\":6,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"140597.20000000001\"}},{\"r\":6,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"278803752.89999998\"}},{\"r\":6,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"46088.6\"}},{\"r\":6,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"498994486.69999999\"}},{\"r\":6,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"94508.6\"}},{\"r\":7,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"山东\",\"qp\":1}},{\"r\":7,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"921338354\"}},{\"r\":7,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"174357.5\"}},{\"r\":7,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"379283246.69999999\"}},{\"r\":7,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"65057.2\"}},{\"r\":7,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"542055107.29999995\"}},{\"r\":7,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"109300.4\"}},{\"r\":7,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"312142178.30000001\"}},{\"r\":7,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"63198.5\"}},{\"r\":7,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"25815498.699999999\"}},{\"r\":7,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4692.8999999999996\"}},{\"r\":7,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"286326679.60000002\"}},{\"r\":7,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"58505.7\"}},{\"r\":7,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"609196175.70000005\"}},{\"r\":7,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"111159\"}},{\"r\":7,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"353467748\"}},{\"r\":7,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"60364.3\"}},{\"r\":7,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"255728427.69999999\"}},{\"r\":7,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"50794.7\"}},{\"r\":8,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"上海\",\"qp\":1}},{\"r\":8,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"700158371.79999995\"}},{\"r\":8,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"114934.7\"}},{\"r\":8,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"339869447.69999999\"}},{\"r\":8,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"47104.800000000003\"}},{\"r\":8,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"360288924.10000002\"}},{\"r\":8,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"67829.899999999994\"}},{\"r\":8,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"113310877.59999999\"}},{\"r\":8,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"22652.9\"}},{\"r\":8,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"8785937.0999999996\"}},{\"r\":8,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1447.7\"}},{\"r\":8,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"104524940.5\"}},{\"r\":8,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"21205.200000000001\"}},{\"r\":8,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"586847494.20000005\"}},{\"r\":8,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"92281.8\"}},{\"r\":8,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"331083510.60000002\"}},{\"r\":8,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"45657.1\"}},{\"r\":8,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"255763983.59999999\"}},{\"r\":8,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"46624.7\"}},{\"r\":9,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"江苏\",\"qp\":1}},{\"r\":9,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2328408620.5999999\"}},{\"r\":9,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"385231.7\"}},{\"r\":9,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1457308176.4000001\"}},{\"r\":9,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"218871.5\"}},{\"r\":9,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"871100444.20000005\"}},{\"r\":9,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"166360.20000000001\"}},{\"r\":9,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"321834979.60000002\"}},{\"r\":9,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"63399.7\"}},{\"r\":9,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"23638030\"}},{\"r\":9,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4164.1000000000004\"}},{\"r\":9,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"298196949.60000002\"}},{\"r\":9,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"59235.6\"}},{\"r\":9,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2006573641.0999999\"}},{\"r\":9,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"321832\"}},{\"r\":9,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1433670146.4000001\"}},{\"r\":9,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"214707.5\"}},{\"r\":9,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"572903494.70000005\"}},{\"r\":9,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"107124.5\"}},{\"r\":10,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"浙江\",\"qp\":1}},{\"r\":10,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3209097346.5999999\"}},{\"r\":10,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"555509.9\"}},{\"r\":10,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1770617611.3\"}},{\"r\":10,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"282921\"}},{\"r\":10,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1438479735.3\"}},{\"r\":10,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"272588.90000000002\"}},{\"r\":10,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"547121572.20000005\"}},{\"r\":10,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"105286.6\"}},{\"r\":10,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"20516147.600000001\"}},{\"r\":10,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3551.9\"}},{\"r\":10,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"526605424.60000002\"}},{\"r\":10,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"101734.7\"}},{\"r\":10,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2661975774.4000001\"}},{\"r\":10,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"450223.3\"}},{\"r\":10,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1750101463.7\"}},{\"r\":10,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"279369.09999999998\"}},{\"r\":10,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"911874310.70000005\"}},{\"r\":10,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"170854.2\"}},{\"r\":11,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"福建\",\"qp\":1}},{\"r\":11,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"821056177.29999995\"}},{\"r\":11,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"143190.79999999999\"}},{\"r\":11,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"481154195.89999998\"}},{\"r\":11,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"77969.899999999994\"}},{\"r\":11,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"339901981.39999998\"}},{\"r\":11,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"65220.800000000003\"}},{\"r\":11,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"114980444.2\"}},{\"r\":11,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"22484.6\"}},{\"r\":11,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3744250\"}},{\"r\":11,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"654\"}},{\"r\":11,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"111236194.2\"}},{\"r\":11,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"21830.6\"}},{\"r\":11,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"706075733.10000002\"}},{\"r\":11,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"120706.1\"}},{\"r\":11,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"477409945.89999998\"}},{\"r\":11,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"77315.899999999994\"}},{\"r\":11,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"228665787.19999999\"}},{\"r\":11,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"43390.2\"}},{\"r\":12,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"安徽\",\"qp\":1}},{\"r\":12,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"897439716.89999998\"}},{\"r\":12,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"143880.6\"}},{\"r\":12,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"479411987.19999999\"}},{\"r\":12,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"68040.399999999994\"}},{\"r\":12,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"418027729.69999999\"}},{\"r\":12,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"75840.2\"}},{\"r\":12,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"175178199.40000001\"}},{\"r\":12,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"33304.9\"}},{\"r\":12,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"11227370\"}},{\"r\":12,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1955\"}},{\"r\":12,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"163950829.40000001\"}},{\"r\":12,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"31349.9\"}},{\"r\":12,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"722261517.5\"}},{\"r\":12,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"110575.6\"}},{\"r\":12,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"468184617.19999999\"}},{\"r\":12,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"66085.399999999994\"}},{\"r\":12,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"254076900.30000001\"}},{\"r\":12,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"44490.3\"}},{\"r\":13,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"江西\",\"qp\":1}},{\"r\":13,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"424480898.10000002\"}},{\"r\":13,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"77887\"}},{\"r\":13,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"104105580.8\"}},{\"r\":13,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"17673.099999999999\"}},{\"r\":13,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"320375317.30000001\"}},{\"r\":13,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"60213.8\"}},{\"r\":13,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"203787204\"}},{\"r\":13,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"38057.4\"}},{\"r\":13,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4484151.0999999996\"}},{\"r\":13,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"768.4\"}},{\"r\":13,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"199303052.90000001\"}},{\"r\":13,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"37289\"}},{\"r\":13,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"220693694.09999999\"}},{\"r\":13,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"39829.599999999999\"}},{\"r\":13,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"99621429.700000003\"}},{\"r\":13,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"16904.8\"}},{\"r\":13,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"121072264.40000001\"}},{\"r\":13,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"22924.799999999999\"}},{\"r\":14,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"湖北\",\"qp\":1}},{\"r\":14,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"400208110.19999999\"}},{\"r\":14,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"69090.2\"}},{\"r\":14,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"183618936.69999999\"}},{\"r\":14,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"28662.1\"}},{\"r\":14,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"216589173.40000001\"}},{\"r\":14,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"40428.1\"}},{\"r\":14,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"101799945.8\"}},{\"r\":14,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"18829.3\"}},{\"r\":14,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"8498576.9000000004\"}},{\"r\":14,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1297\"}},{\"r\":14,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"93301368.900000006\"}},{\"r\":14,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"17532.3\"}},{\"r\":14,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"298408164.39999998\"}},{\"r\":14,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"50260.800000000003\"}},{\"r\":14,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"175120359.80000001\"}},{\"r\":14,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"27365.1\"}},{\"r\":14,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"123287804.59999999\"}},{\"r\":14,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"22895.8\"}},{\"r\":15,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"湖南\",\"qp\":1}},{\"r\":15,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"894856651.70000005\"}},{\"r\":15,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"158871.6\"}},{\"r\":15,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"526952555\"}},{\"r\":15,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"88878.1\"}},{\"r\":15,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"367904096.69999999\"}},{\"r\":15,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"69993.5\"}},{\"r\":15,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"151284562.30000001\"}},{\"r\":15,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"28575.3\"}},{\"r\":15,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1746400\"}},{\"r\":15,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"300\"}},{\"r\":15,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"149538162.30000001\"}},{\"r\":15,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"28275.3\"}},{\"r\":15,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"743572089.39999998\"}},{\"r\":15,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"130296.2\"}},{\"r\":15,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"525206155\"}},{\"r\":15,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"88578.1\"}},{\"r\":15,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"218365934.40000001\"}},{\"r\":15,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"41718.1\"}},{\"r\":16,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"广东\",\"qp\":1}},{\"r\":16,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2094063051.3\"}},{\"r\":16,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"382884.5\"}},{\"r\":16,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1134410441\"}},{\"r\":16,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"191533.7\"}},{\"r\":16,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"959652610.39999998\"}},{\"r\":16,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"191350.9\"}},{\"r\":16,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"353601728.39999998\"}},{\"r\":16,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"70785.600000000006\"}},{\"r\":16,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"18461401.899999999\"}},{\"r\":16,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3207.8\"}},{\"r\":16,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"335140326.5\"}},{\"r\":16,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"67577.7\"}},{\"r\":16,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1740461323\"}},{\"r\":16,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"312099\"}},{\"r\":16,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1115949039.0999999\"}},{\"r\":16,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"188325.8\"}},{\"r\":16,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"624512283.89999998\"}},{\"r\":16,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"123773.1\"}},{\"r\":17,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"广西\",\"qp\":1}},{\"r\":17,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"881928162.60000002\"}},{\"r\":17,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"153065.29999999999\"}},{\"r\":17,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"392264700.60000002\"}},{\"r\":17,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"60361.4\"}},{\"r\":17,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"489663462\"}},{\"r\":17,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"92704\"}},{\"r\":17,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"319724661.5\"}},{\"r\":17,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"61366\"}},{\"r\":17,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"15377402.6\"}},{\"r\":17,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2580.1\"}},{\"r\":17,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"304347258.89999998\"}},{\"r\":17,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"58785.9\"}},{\"r\":17,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"562203501.10000002\"}},{\"r\":17,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"91699.3\"}},{\"r\":17,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"376887298\"}},{\"r\":17,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"57781.3\"}},{\"r\":17,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"185316203.19999999\"}},{\"r\":17,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"33918.1\"}},{\"r\":18,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"贵州\",\"qp\":1}},{\"r\":18,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"761419269.60000002\"}},{\"r\":18,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"135602.79999999999\"}},{\"r\":18,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"356599638.19999999\"}},{\"r\":18,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"59521.5\"}},{\"r\":18,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"404819631.39999998\"}},{\"r\":18,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"76081.3\"}},{\"r\":18,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"169856579.59999999\"}},{\"r\":18,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"31752.799999999999\"}},{\"r\":18,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5298353.3\"}},{\"r\":18,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"900.4\"}},{\"r\":18,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"164558226.30000001\"}},{\"r\":18,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"30852.5\"}},{\"r\":18,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"591562690\"}},{\"r\":18,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"103849.9\"}},{\"r\":18,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"351301284.89999998\"}},{\"r\":18,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"58621.1\"}},{\"r\":18,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"240261405.09999999\"}},{\"r\":18,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"45228.800000000003\"}},{\"r\":19,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"云南\",\"qp\":1}},{\"r\":19,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1069523219.5\"}},{\"r\":19,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"195511.5\"}},{\"r\":19,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"229315506.5\"}},{\"r\":19,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"38869\"}},{\"r\":19,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"840207713\"}},{\"r\":19,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"156642.5\"}},{\"r\":19,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"307813804.19999999\"}},{\"r\":19,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"57696\"}},{\"r\":19,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"8071280\"}},{\"r\":19,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1366.2\"}},{\"r\":19,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"299742524.19999999\"}},{\"r\":19,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"56329.8\"}},{\"r\":19,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"761709415.29999995\"}},{\"r\":19,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"137815.6\"}},{\"r\":19,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"221244226.5\"}},{\"r\":19,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"37502.800000000003\"}},{\"r\":19,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"540465188.79999995\"}},{\"r\":19,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"100312.7\"}},{\"r\":20,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"海南\",\"qp\":1}},{\"r\":20,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"239915479.69999999\"}},{\"r\":20,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"39785.5\"}},{\"r\":20,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"115554645.09999999\"}},{\"r\":20,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"16531.7\"}},{\"r\":20,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"124360834.59999999\"}},{\"r\":20,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"23253.9\"}},{\"r\":20,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"29091002.100000001\"}},{\"r\":20,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5672.4\"}},{\"r\":20,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2819368.3\"}},{\"r\":20,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"408.9\"}},{\"r\":20,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"26271633.800000001\"}},{\"r\":20,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5263.5\"}},{\"r\":20,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"210824477.69999999\"}},{\"r\":20,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"34113.1\"}},{\"r\":20,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"112735276.90000001\"}},{\"r\":20,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"16122.8\"}},{\"r\":20,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"98089200.799999997\"}},{\"r\":20,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"17990.3\"}},{\"r\":21,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"区外省市\",\"qp\":1}},{\"r\":21,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"10035855546\"}},{\"r\":21,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1964509.7\"}},{\"r\":21,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2197155097.3000002\"}},{\"r\":21,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"390293.7\"}},{\"r\":21,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"7838700448.6999998\"}},{\"r\":21,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1574216\"}},{\"r\":21,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"434791957.19999999\"}},{\"r\":21,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"82580\"}},{\"r\":21,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"9754767.6999999993\"}},{\"r\":21,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1684.4\"}},{\"r\":21,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"425037189.5\"}},{\"r\":21,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"80895.600000000006\"}},{\"r\":21,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"9601063588.7999992\"}},{\"r\":21,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1881929.7\"}},{\"r\":21,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2187400329.5999999\"}},{\"r\":21,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"388609.3\"}},{\"r\":21,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"7413663259.1999998\"}},{\"r\":21,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1493320.5\"}},{\"r\":22,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"黑龙江\",\"qp\":1}},{\"r\":22,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"129541171.09999999\"}},{\"r\":22,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"24391.3\"}},{\"r\":22,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"62821830.299999997\"}},{\"r\":22,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"11458.3\"}},{\"r\":22,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"66719340.799999997\"}},{\"r\":22,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"12933\"}},{\"r\":22,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"351794.8\"}},{\"r\":22,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"68.400000000000006\"}},{\"r\":22,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":22,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":22,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"351794.8\"}},{\"r\":22,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"68.400000000000006\"}},{\"r\":22,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"129189376.3\"}},{\"r\":22,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"24322.9\"}},{\"r\":22,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"62821830.299999997\"}},{\"r\":22,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"11458.3\"}},{\"r\":22,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"66367546\"}},{\"r\":22,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"12864.5\"}},{\"r\":23,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"吉林\",\"qp\":1}},{\"r\":23,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"78698824.599999994\"}},{\"r\":23,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"15613.4\"}},{\"r\":23,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"32110729\"}},{\"r\":23,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5913\"}},{\"r\":23,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"46588095.600000001\"}},{\"r\":23,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"9700.4\"}},{\"r\":23,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6612155.5\"}},{\"r\":23,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1307.9000000000001\"}},{\"r\":23,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"45864\"}},{\"r\":23,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6\"}},{\"r\":23,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6566291.5\"}},{\"r\":23,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1301.9000000000001\"}},{\"r\":23,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"72086669.099999994\"}},{\"r\":23,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"14305.6\"}},{\"r\":23,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"32064865\"}},{\"r\":23,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5907\"}},{\"r\":23,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"40021804.100000001\"}},{\"r\":23,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"8398.6\"}},{\"r\":24,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"辽宁\",\"qp\":1}},{\"r\":24,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"7733295016.6000004\"}},{\"r\":24,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1547329.3\"}},{\"r\":24,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1522587629.4000001\"}},{\"r\":24,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"278027.5\"}},{\"r\":24,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6210707387.1000004\"}},{\"r\":24,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1269301.8999999999\"}},{\"r\":24,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"60966225.399999999\"}},{\"r\":24,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"12480.2\"}},{\"r\":24,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"884918\"}},{\"r\":24,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"144\"}},{\"r\":24,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"60081307.399999999\"}},{\"r\":24,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"12336.2\"}},{\"r\":24,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"7672328791.1999998\"}},{\"r\":24,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1534849.1\"}},{\"r\":24,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1521702711.4000001\"}},{\"r\":24,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"277883.5\"}},{\"r\":24,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6150626079.6999998\"}},{\"r\":24,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1256965.6000000001\"}},{\"r\":25,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"陕西\",\"qp\":1}},{\"r\":25,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"216046916.09999999\"}},{\"r\":25,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"42153.7\"}},{\"r\":25,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"65047944\"}},{\"r\":25,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"11657.8\"}},{\"r\":25,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"150998972.09999999\"}},{\"r\":25,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"30496\"}},{\"r\":25,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"35712772.200000003\"}},{\"r\":25,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6986\"}},{\"r\":25,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4241540.8\"}},{\"r\":25,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"756.3\"}},{\"r\":25,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"31471231.399999999\"}},{\"r\":25,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6229.7\"}},{\"r\":25,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"180334143.90000001\"}},{\"r\":25,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"35167.699999999997\"}},{\"r\":25,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"60806403.200000003\"}},{\"r\":25,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"10901.5\"}},{\"r\":25,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"119527740.7\"}},{\"r\":25,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"24266.2\"}},{\"r\":26,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"新疆\",\"qp\":1}},{\"r\":26,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"834583660.60000002\"}},{\"r\":26,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"144791.4\"}},{\"r\":26,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"184835666.80000001\"}},{\"r\":26,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"27384.1\"}},{\"r\":26,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"649747993.89999998\"}},{\"r\":26,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"117407.2\"}},{\"r\":26,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"73977926\"}},{\"r\":26,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"13424.5\"}},{\"r\":26,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"647113.80000000005\"}},{\"r\":26,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"93\"}},{\"r\":26,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"73330812.099999994\"}},{\"r\":26,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"13331.5\"}},{\"r\":26,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"760605734.60000002\"}},{\"r\":26,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"131366.9\"}},{\"r\":26,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"184188552.90000001\"}},{\"r\":26,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"27291.200000000001\"}},{\"r\":26,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"576417181.70000005\"}},{\"r\":26,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"104075.7\"}},{\"r\":27,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"内蒙古\",\"qp\":1}},{\"r\":27,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"145212039.59999999\"}},{\"r\":27,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"27917.599999999999\"}},{\"r\":27,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"39988602.899999999\"}},{\"r\":27,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"7276.2\"}},{\"r\":27,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"105223436.7\"}},{\"r\":27,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"20641.400000000001\"}},{\"r\":27,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"67942427.200000003\"}},{\"r\":27,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"13237.9\"}},{\"r\":27,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"100262.9\"}},{\"r\":27,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"14.7\"}},{\"r\":27,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"67842164.299999997\"}},{\"r\":27,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"13223.2\"}},{\"r\":27,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"77269612.400000006\"}},{\"r\":27,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"14679.7\"}},{\"r\":27,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"39888340\"}},{\"r\":27,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"7261.5\"}},{\"r\":27,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"37381272.399999999\"}},{\"r\":27,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"7418.2\"}},{\"r\":28,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"青海\",\"qp\":1}},{\"r\":28,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"21566200.199999999\"}},{\"r\":28,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3999.8\"}},{\"r\":28,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1237480\"}},{\"r\":28,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"201\"}},{\"r\":28,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"20328720.199999999\"}},{\"r\":28,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3798.8\"}},{\"r\":28,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"8181122.2999999998\"}},{\"r\":28,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1522.1\"}},{\"r\":28,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"127500\"}},{\"r\":28,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"21\"}},{\"r\":28,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"8053622.2999999998\"}},{\"r\":28,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1501.1\"}},{\"r\":28,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"13385077.9\"}},{\"r\":28,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2477.6999999999998\"}},{\"r\":28,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1109980\"}},{\"r\":28,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"180\"}},{\"r\":28,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"12275097.9\"}},{\"r\":28,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2297.6999999999998\"}},{\"r\":29,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"甘肃\",\"qp\":1}},{\"r\":29,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"32689330.300000001\"}},{\"r\":29,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5767.2\"}},{\"r\":29,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5726954.4000000004\"}},{\"r\":29,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"831.6\"}},{\"r\":29,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"26962375.899999999\"}},{\"r\":29,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4935.7\"}},{\"r\":29,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"12420033.6\"}},{\"r\":29,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2265.6999999999998\"}},{\"r\":29,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"193500\"}},{\"r\":29,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"30\"}},{\"r\":29,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"12226533.6\"}},{\"r\":29,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2235.6999999999998\"}},{\"r\":29,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"20269296.699999999\"}},{\"r\":29,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3501.5\"}},{\"r\":29,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5533454.4000000004\"}},{\"r\":29,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"801.6\"}},{\"r\":29,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"14735842.300000001\"}},{\"r\":29,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2700\"}},{\"r\":30,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"四川\",\"qp\":1}},{\"r\":30,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"342838681.19999999\"}},{\"r\":30,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"62286.2\"}},{\"r\":30,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"82197971.099999994\"}},{\"r\":30,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"13580.9\"}},{\"r\":30,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"260640710.19999999\"}},{\"r\":30,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"48705.2\"}},{\"r\":30,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"91659839.200000003\"}},{\"r\":30,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"16902.599999999999\"}},{\"r\":30,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":30,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":30,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"91659839.200000003\"}},{\"r\":30,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"16902.599999999999\"}},{\"r\":30,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"251178842.09999999\"}},{\"r\":30,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"45383.6\"}},{\"r\":30,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"82197971.099999994\"}},{\"r\":30,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"13580.9\"}},{\"r\":30,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"168980871\"}},{\"r\":30,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"31802.7\"}},{\"r\":31,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"重庆\",\"qp\":1}},{\"r\":31,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"484643083.69999999\"}},{\"r\":31,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"87310\"}},{\"r\":31,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"196324840.40000001\"}},{\"r\":31,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"33260.699999999997\"}},{\"r\":31,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"288318243.30000001\"}},{\"r\":31,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"54049.3\"}},{\"r\":31,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"75011847.299999997\"}},{\"r\":31,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"14061.5\"}},{\"r\":31,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3514068.1\"}},{\"r\":31,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"619.5\"}},{\"r\":31,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"71497779.200000003\"}},{\"r\":31,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"13442\"}},{\"r\":31,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"409631236.39999998\"}},{\"r\":31,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"73248.5\"}},{\"r\":31,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"192810772.40000001\"}},{\"r\":31,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"32641.200000000001\"}},{\"r\":31,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"216820464\"}},{\"r\":31,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"40607.300000000003\"}},{\"r\":32,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"西藏\",\"qp\":1}},{\"r\":32,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"16740621.9\"}},{\"r\":32,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2949.8\"}},{\"r\":32,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4275449\"}},{\"r\":32,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"702.6\"}},{\"r\":32,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"12465172.9\"}},{\"r\":32,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2247.1999999999998\"}},{\"r\":32,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1955813.7\"}},{\"r\":32,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"323.3\"}},{\"r\":32,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":32,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":32,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1955813.7\"}},{\"r\":32,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"323.3\"}},{\"r\":32,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"14784808.199999999\"}},{\"r\":32,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2626.5\"}},{\"r\":32,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4275449\"}},{\"r\":32,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"702.6\"}},{\"r\":32,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"10509359.199999999\"}},{\"r\":32,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1923.9\"}},{\"r\":33,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"大区小计\",\"qp\":1}},{\"r\":33,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"36024451898.699997\"}},{\"r\":33,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5752528\"}},{\"r\":33,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"21255742056\"}},{\"r\":33,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3068184.5\"}},{\"r\":33,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"14768709842.700001\"}},{\"r\":33,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2684343.5\"}},{\"r\":33,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"371099084.69999999\"}},{\"r\":33,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"75830.899999999994\"}},{\"r\":33,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"31247035\"}},{\"r\":33,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6773.8\"}},{\"r\":33,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"339852049.69999999\"}},{\"r\":33,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"69057.100000000006\"}},{\"r\":33,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"35653352814\"}},{\"r\":33,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5676697.0999999996\"}},{\"r\":33,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"21224495021\"}},{\"r\":33,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3061410.7\"}},{\"r\":33,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"14428857793\"}},{\"r\":33,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2615286.4\"}},{\"r\":34,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"华北\",\"qp\":1}},{\"r\":34,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"8979562707.2999992\"}},{\"r\":34,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1430431.3\"}},{\"r\":34,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5769830804.1000004\"}},{\"r\":34,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"851308\"}},{\"r\":34,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3209731903.1999998\"}},{\"r\":34,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"579123.30000000005\"}},{\"r\":34,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"80191139.5\"}},{\"r\":34,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"16249.4\"}},{\"r\":34,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":34,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":34,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"80191139.5\"}},{\"r\":34,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"16249.4\"}},{\"r\":34,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"8899371567.8999996\"}},{\"r\":34,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1414181.9\"}},{\"r\":34,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5769830804.1000004\"}},{\"r\":34,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"851308\"}},{\"r\":34,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3129540763.8000002\"}},{\"r\":34,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"562874\"}},{\"r\":35,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"华东\",\"qp\":1}},{\"r\":35,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"7743100122.6000004\"}},{\"r\":35,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1238875.3999999999\"}},{\"r\":35,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4813028321\"}},{\"r\":35,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"696549.2\"}},{\"r\":35,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2930071801.5999999\"}},{\"r\":35,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"542326.19999999995\"}},{\"r\":35,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"72956393.599999994\"}},{\"r\":35,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"15326.1\"}},{\"r\":35,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"8332411\"}},{\"r\":35,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2000\"}},{\"r\":35,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"64623982.600000001\"}},{\"r\":35,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"13326.2\"}},{\"r\":35,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"7670143729\"}},{\"r\":35,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1223549.3\"}},{\"r\":35,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4804695910\"}},{\"r\":35,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"694549.2\"}},{\"r\":35,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2865447819\"}},{\"r\":35,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"529000.1\"}},{\"r\":36,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"华中\",\"qp\":1}},{\"r\":36,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6445973642.6999998\"}},{\"r\":36,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1002082.6\"}},{\"r\":36,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3738291609.9000001\"}},{\"r\":36,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"524638.9\"}},{\"r\":36,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2707682032.9000001\"}},{\"r\":36,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"477443.7\"}},{\"r\":36,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"154601705.40000001\"}},{\"r\":36,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"32604.9\"}},{\"r\":36,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"22914624\"}},{\"r\":36,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4773.8\"}},{\"r\":36,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"131687081.40000001\"}},{\"r\":36,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"27831\"}},{\"r\":36,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6291371937.3000002\"}},{\"r\":36,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"969477.8\"}},{\"r\":36,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"3715376985.9000001\"}},{\"r\":36,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"519865.1\"}},{\"r\":36,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"2575994951.4000001\"}},{\"r\":36,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"449612.7\"}},{\"r\":37,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"华南\",\"qp\":1}},{\"r\":37,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"11537868598.799999\"}},{\"r\":37,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1836507.6\"}},{\"r\":37,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6442924168.1000004\"}},{\"r\":37,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"914431.9\"}},{\"r\":37,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5094944430.6999998\"}},{\"r\":37,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"922075.7\"}},{\"r\":37,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"34995802.399999999\"}},{\"r\":37,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"7091.3\"}},{\"r\":37,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":37,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":37,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"34995802.399999999\"}},{\"r\":37,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"7091.3\"}},{\"r\":37,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"11502872796.4\"}},{\"r\":37,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1829416.4\"}},{\"r\":37,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"6442924168.1000004\"}},{\"r\":37,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"914431.9\"}},{\"r\":37,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"5059948628.3000002\"}},{\"r\":37,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"914984.4\"}},{\"r\":38,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"s\"},\"bg\":\"#A9D08E\",\"fs\":9,\"fc\":\"#212D2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"西北\",\"qp\":1}},{\"r\":38,\"c\":1,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1317946827.2\"}},{\"r\":38,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"244631\"}},{\"r\":38,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"491667152.89999998\"}},{\"r\":38,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"81256.5\"}},{\"r\":38,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"826279674.29999995\"}},{\"r\":38,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"163374.5\"}},{\"r\":38,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"28354043.800000001\"}},{\"r\":38,\"c\":8,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4559.2\"}},{\"r\":38,\"c\":9,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":38,\"c\":10,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#323232\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2}},{\"r\":38,\"c\":11,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"28354043.800000001\"}},{\"r\":38,\"c\":12,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"4559.2\"}},{\"r\":38,\"c\":13,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"1289592783.4000001\"}},{\"r\":38,\"c\":14,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"240071.8\"}},{\"r\":38,\"c\":15,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"491667152.89999998\"}},{\"r\":38,\"c\":16,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"81256.5\"}},{\"r\":38,\"c\":17,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"797925630.5\"}},{\"r\":38,\"c\":18,\"v\":{\"ct\":{\"fa\":\"General\"},\"bg\":\"#FFFFFF\",\"fs\":9,\"fc\":\"#302C2A\",\"ff\":\"Arial\",\"vt\":0,\"tb\":2,\"v\":\"158815.29999999999\"}}],\"calcChain\":[]},{\"name\":\"Sheet2\",\"config\":{\"columnlen\":{\"3\":100},\"customWidth\":{\"3\":1}},\"index\":\"2\",\"status\":\"1\",\"order\":\"1\",\"luckysheet_select_save\":[{\"row\":[19,19],\"column\":[6,6],\"sheetIndex\":2}],\"zoomRatio\":1,\"showGridLines\":\"1\",\"defaultColWidth\":72,\"defaultRowHeight\":18,\"celldata\":[{\"r\":1,\"c\":3,\"v\":{\"tb\":1,\"v\":\"2\"}},{\"r\":1,\"c\":4,\"v\":{\"tb\":1,\"v\":\"3\"}},{\"r\":1,\"c\":5,\"v\":{\"tb\":1,\"v\":\"4\"}},{\"r\":1,\"c\":6,\"v\":{\"tb\":1,\"v\":\"5\"}},{\"r\":1,\"c\":7,\"v\":{\"tb\":1,\"v\":\"6\"}},{\"r\":1,\"c\":8,\"v\":{\"tb\":1,\"v\":\"7\"}},{\"r\":1,\"c\":9,\"v\":{\"tb\":1,\"v\":\"8\"}},{\"r\":1,\"c\":10,\"v\":{\"tb\":1,\"v\":\"9\"}},{\"r\":1,\"c\":11,\"v\":{\"tb\":1,\"v\":\"10\"}},{\"r\":1,\"c\":12,\"v\":{\"tb\":1,\"v\":\"11\"}},{\"r\":1,\"c\":13,\"v\":{\"tb\":1,\"v\":\"12\"}},{\"r\":1,\"c\":14,\"v\":{\"tb\":1,\"v\":\"13\"}},{\"r\":1,\"c\":15,\"v\":{\"tb\":1,\"v\":\"14\"}},{\"r\":1,\"c\":16,\"v\":{\"tb\":1,\"v\":\"15\"}},{\"r\":1,\"c\":17,\"v\":{\"tb\":1,\"v\":\"16\"}},{\"r\":1,\"c\":18,\"v\":{\"tb\":1,\"v\":\"17\"}},{\"r\":3,\"c\":2,\"v\":{\"f\":\"=Sheet1!A1\",\"tb\":1,\"v\":\"合计\"}},{\"r\":3,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"2121212\"}},{\"r\":3,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"11027033.300000001\"}},{\"r\":3,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"33685339116\"}},{\"r\":3,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"5060320.4000000004\"}},{\"r\":3,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"31551697540.5\"}},{\"r\":3,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"5966713\"}},{\"r\":3,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"4547347979.1000004\"}},{\"r\":3,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"881817.3\"}},{\"r\":3,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"232937258.30000001\"}},{\"r\":3,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"41419.4\"}},{\"r\":3,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"4314410720.8000002\"}},{\"r\":3,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"840397.9\"}},{\"r\":3,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"60689688677.300003\"}},{\"r\":3,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"10145216.1\"}},{\"r\":3,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"33452401857.700001\"}},{\"r\":3,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C4,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"5018901\"}},{\"r\":4,\"c\":2,\"v\":{\"f\":\"=Sheet1!A2\",\"tb\":1,\"v\":\"区内公司\"}},{\"r\":4,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"19176729211.799999\"}},{\"r\":4,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"3309995.6\"}},{\"r\":4,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"10232441962.700001\"}},{\"r\":4,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"1601842.1\"}},{\"r\":4,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"8944287249.1000004\"}},{\"r\":4,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"1708153.5\"}},{\"r\":4,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"3741456937.3000002\"}},{\"r\":4,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"723406.4\"}},{\"r\":4,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"191935455.69999999\"}},{\"r\":4,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"32961.1\"}},{\"r\":4,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"3549521481.5999999\"}},{\"r\":4,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"690445.3\"}},{\"r\":4,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"15435272274.5\"}},{\"r\":4,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"2586589.2000000002\"}},{\"r\":4,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"10040506507.1\"}},{\"r\":4,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C5,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"1568881\"}},{\"r\":5,\"c\":2,\"v\":{\"f\":\"=Sheet1!A3\",\"tb\":1,\"v\":\"北京\"}},{\"r\":5,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"1639327850.0999999\"}},{\"r\":5,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"232929.4\"}},{\"r\":5,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"1639304942.0999999\"}},{\"r\":5,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"232926\"}},{\"r\":5,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"22908\"}},{\"r\":5,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"3.4\"}},{\"r\":5,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"10284238.1\"}},{\"r\":5,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"1602.9\"}},{\"r\":5,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"10261330.1\"}},{\"r\":5,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"1599.5\"}},{\"r\":5,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"22908\"}},{\"r\":5,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"3.4\"}},{\"r\":5,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"1629043612\"}},{\"r\":5,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"231326.5\"}},{\"r\":5,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"1629043612\"}},{\"r\":5,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C6,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"231326.5\"}},{\"r\":6,\"c\":2,\"v\":{\"f\":\"=Sheet1!A4\",\"tb\":1,\"v\":\"天津\"}},{\"r\":6,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"197102644\"}},{\"r\":6,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"35879.800000000003\"}},{\"r\":6,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"101723824.09999999\"}},{\"r\":6,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"16908.5\"}},{\"r\":6,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"95378819.900000006\"}},{\"r\":6,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"18971.3\"}},{\"r\":6,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"34415232.600000001\"}},{\"r\":6,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"6882.2\"}},{\"r\":6,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"4512011.2\"}},{\"r\":6,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"812.5\"}},{\"r\":6,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"29903221.399999999\"}},{\"r\":6,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"6069.6\"}},{\"r\":6,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"162687411.40000001\"}},{\"r\":6,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"28997.599999999999\"}},{\"r\":6,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"97211812.900000006\"}},{\"r\":6,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C7,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"16096\"}},{\"r\":7,\"c\":2,\"v\":{\"f\":\"=Sheet1!A5\",\"tb\":1,\"v\":\"河北\"}},{\"r\":7,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"375906003.19999999\"}},{\"r\":7,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"72168.800000000003\"}},{\"r\":7,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"110165771.5\"}},{\"r\":7,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"19157.8\"}},{\"r\":7,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"265740231.69999999\"}},{\"r\":7,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"53011.1\"}},{\"r\":7,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"170439887.19999999\"}},{\"r\":7,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"34131.199999999997\"}},{\"r\":7,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"3009197.5\"}},{\"r\":7,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"531.9\"}},{\"r\":7,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"167430689.69999999\"}},{\"r\":7,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"33599.4\"}},{\"r\":7,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"205466116\"}},{\"r\":7,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"38037.599999999999\"}},{\"r\":7,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"107156574\"}},{\"r\":7,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C8,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"18625.900000000001\"}},{\"r\":8,\"c\":2,\"v\":{\"f\":\"=Sheet1!A6\",\"tb\":1,\"v\":\"山西\"}},{\"r\":8,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"399821780.5\"}},{\"r\":8,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"71645.600000000006\"}},{\"r\":8,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"141027648.09999999\"}},{\"r\":8,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"22877\"}},{\"r\":8,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"258794132.40000001\"}},{\"r\":8,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"48768.7\"}},{\"r\":8,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"161910575.90000001\"}},{\"r\":8,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"30756.7\"}},{\"r\":8,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"4719394.5\"}},{\"r\":8,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"834\"}},{\"r\":8,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"157191181.40000001\"}},{\"r\":8,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"29922.7\"}},{\"r\":8,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"237911204.59999999\"}},{\"r\":8,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"40888.9\"}},{\"r\":8,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"136308253.59999999\"}},{\"r\":8,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C9,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"22042.9\"}},{\"r\":9,\"c\":2,\"v\":{\"f\":\"=Sheet1!A7\",\"tb\":1,\"v\":\"河南\"}},{\"r\":9,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"920677504.20000005\"}},{\"r\":9,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"167568.5\"}},{\"r\":9,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"289753107.89999998\"}},{\"r\":9,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"47977.599999999999\"}},{\"r\":9,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"630924396.29999995\"}},{\"r\":9,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"119590.9\"}},{\"r\":9,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"142879264.59999999\"}},{\"r\":9,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"26971.3\"}},{\"r\":9,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"10949355\"}},{\"r\":9,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"1889\"}},{\"r\":9,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"131929909.59999999\"}},{\"r\":9,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"25082.3\"}},{\"r\":9,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"777798239.60000002\"}},{\"r\":9,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"140597.20000000001\"}},{\"r\":9,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"278803752.89999998\"}},{\"r\":9,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C10,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"46088.6\"}},{\"r\":10,\"c\":2,\"v\":{\"f\":\"=Sheet1!A8\",\"tb\":1,\"v\":\"山东\"}},{\"r\":10,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"921338354\"}},{\"r\":10,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"174357.5\"}},{\"r\":10,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"379283246.69999999\"}},{\"r\":10,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"65057.2\"}},{\"r\":10,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"542055107.29999995\"}},{\"r\":10,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"109300.4\"}},{\"r\":10,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"312142178.30000001\"}},{\"r\":10,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"63198.5\"}},{\"r\":10,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"25815498.699999999\"}},{\"r\":10,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"4692.8999999999996\"}},{\"r\":10,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"286326679.60000002\"}},{\"r\":10,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"58505.7\"}},{\"r\":10,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"609196175.70000005\"}},{\"r\":10,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"111159\"}},{\"r\":10,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"353467748\"}},{\"r\":10,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C11,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"60364.3\"}},{\"r\":11,\"c\":2,\"v\":{\"f\":\"=Sheet1!A9\",\"tb\":1,\"v\":\"上海\"}},{\"r\":11,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"700158371.79999995\"}},{\"r\":11,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"114934.7\"}},{\"r\":11,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"339869447.69999999\"}},{\"r\":11,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"47104.800000000003\"}},{\"r\":11,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"360288924.10000002\"}},{\"r\":11,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"67829.899999999994\"}},{\"r\":11,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"113310877.59999999\"}},{\"r\":11,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"22652.9\"}},{\"r\":11,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"8785937.0999999996\"}},{\"r\":11,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"1447.7\"}},{\"r\":11,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"104524940.5\"}},{\"r\":11,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"21205.200000000001\"}},{\"r\":11,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"586847494.20000005\"}},{\"r\":11,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"92281.8\"}},{\"r\":11,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"331083510.60000002\"}},{\"r\":11,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C12,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"45657.1\"}},{\"r\":12,\"c\":2,\"v\":{\"f\":\"=Sheet1!A10\",\"tb\":1,\"v\":\"江苏\"}},{\"r\":12,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"2328408620.5999999\"}},{\"r\":12,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"385231.7\"}},{\"r\":12,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"1457308176.4000001\"}},{\"r\":12,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"218871.5\"}},{\"r\":12,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"871100444.20000005\"}},{\"r\":12,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"166360.20000000001\"}},{\"r\":12,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"321834979.60000002\"}},{\"r\":12,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"63399.7\"}},{\"r\":12,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"23638030\"}},{\"r\":12,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"4164.1000000000004\"}},{\"r\":12,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"298196949.60000002\"}},{\"r\":12,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"59235.6\"}},{\"r\":12,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"2006573641.0999999\"}},{\"r\":12,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"321832\"}},{\"r\":12,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"1433670146.4000001\"}},{\"r\":12,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C13,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"214707.5\"}},{\"r\":13,\"c\":2,\"v\":{\"f\":\"=Sheet1!A11\",\"tb\":1,\"v\":\"浙江\"}},{\"r\":13,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"3209097346.5999999\"}},{\"r\":13,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"555509.9\"}},{\"r\":13,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"1770617611.3\"}},{\"r\":13,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"282921\"}},{\"r\":13,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"1438479735.3\"}},{\"r\":13,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"272588.90000000002\"}},{\"r\":13,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"547121572.20000005\"}},{\"r\":13,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"105286.6\"}},{\"r\":13,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"20516147.600000001\"}},{\"r\":13,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"3551.9\"}},{\"r\":13,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"526605424.60000002\"}},{\"r\":13,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"101734.7\"}},{\"r\":13,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"2661975774.4000001\"}},{\"r\":13,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"450223.3\"}},{\"r\":13,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"1750101463.7\"}},{\"r\":13,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C14,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"279369.09999999998\"}},{\"r\":14,\"c\":2,\"v\":{\"f\":\"=Sheet1!A12\",\"tb\":1,\"v\":\"福建\"}},{\"r\":14,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"821056177.29999995\"}},{\"r\":14,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"143190.79999999999\"}},{\"r\":14,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"481154195.89999998\"}},{\"r\":14,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"77969.899999999994\"}},{\"r\":14,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"339901981.39999998\"}},{\"r\":14,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"65220.800000000003\"}},{\"r\":14,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"114980444.2\"}},{\"r\":14,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"22484.6\"}},{\"r\":14,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"3744250\"}},{\"r\":14,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"654\"}},{\"r\":14,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"111236194.2\"}},{\"r\":14,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"21830.6\"}},{\"r\":14,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"706075733.10000002\"}},{\"r\":14,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"120706.1\"}},{\"r\":14,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"477409945.89999998\"}},{\"r\":14,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C15,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"77315.899999999994\"}},{\"r\":15,\"c\":2,\"v\":{\"f\":\"=Sheet1!A13\",\"tb\":1,\"v\":\"安徽\"}},{\"r\":15,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"897439716.89999998\"}},{\"r\":15,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"143880.6\"}},{\"r\":15,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"479411987.19999999\"}},{\"r\":15,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"68040.399999999994\"}},{\"r\":15,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"418027729.69999999\"}},{\"r\":15,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"75840.2\"}},{\"r\":15,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"175178199.40000001\"}},{\"r\":15,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"33304.9\"}},{\"r\":15,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"11227370\"}},{\"r\":15,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"1955\"}},{\"r\":15,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"163950829.40000001\"}},{\"r\":15,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"31349.9\"}},{\"r\":15,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"722261517.5\"}},{\"r\":15,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"110575.6\"}},{\"r\":15,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"468184617.19999999\"}},{\"r\":15,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C16,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"66085.399999999994\"}},{\"r\":16,\"c\":2,\"v\":{\"f\":\"=Sheet1!A14\",\"tb\":1,\"v\":\"江西\"}},{\"r\":16,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"424480898.10000002\"}},{\"r\":16,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"77887\"}},{\"r\":16,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"104105580.8\"}},{\"r\":16,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"17673.099999999999\"}},{\"r\":16,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"320375317.30000001\"}},{\"r\":16,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"60213.8\"}},{\"r\":16,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"203787204\"}},{\"r\":16,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"38057.4\"}},{\"r\":16,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"4484151.0999999996\"}},{\"r\":16,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"768.4\"}},{\"r\":16,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"199303052.90000001\"}},{\"r\":16,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"37289\"}},{\"r\":16,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"220693694.09999999\"}},{\"r\":16,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"39829.599999999999\"}},{\"r\":16,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"99621429.700000003\"}},{\"r\":16,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C17,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"16904.8\"}},{\"r\":17,\"c\":2,\"v\":{\"f\":\"=Sheet1!A15\",\"tb\":1,\"v\":\"湖北\"}},{\"r\":17,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"400208110.19999999\"}},{\"r\":17,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"69090.2\"}},{\"r\":17,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"183618936.69999999\"}},{\"r\":17,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"28662.1\"}},{\"r\":17,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"216589173.40000001\"}},{\"r\":17,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"40428.1\"}},{\"r\":17,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"101799945.8\"}},{\"r\":17,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"18829.3\"}},{\"r\":17,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"8498576.9000000004\"}},{\"r\":17,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"1297\"}},{\"r\":17,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"93301368.900000006\"}},{\"r\":17,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"17532.3\"}},{\"r\":17,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"298408164.39999998\"}},{\"r\":17,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"50260.800000000003\"}},{\"r\":17,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"175120359.80000001\"}},{\"r\":17,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C18,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"27365.1\"}},{\"r\":18,\"c\":2,\"v\":{\"f\":\"=Sheet1!A16\",\"tb\":1,\"v\":\"湖南\"}},{\"r\":18,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"894856651.70000005\"}},{\"r\":18,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"158871.6\"}},{\"r\":18,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"526952555\"}},{\"r\":18,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"88878.1\"}},{\"r\":18,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"367904096.69999999\"}},{\"r\":18,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"69993.5\"}},{\"r\":18,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"151284562.30000001\"}},{\"r\":18,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"28575.3\"}},{\"r\":18,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"1746400\"}},{\"r\":18,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"300\"}},{\"r\":18,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"149538162.30000001\"}},{\"r\":18,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"28275.3\"}},{\"r\":18,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"743572089.39999998\"}},{\"r\":18,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"130296.2\"}},{\"r\":18,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"525206155\"}},{\"r\":18,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C19,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"88578.1\"}},{\"r\":19,\"c\":2,\"v\":{\"f\":\"=Sheet1!A17\",\"tb\":1,\"v\":\"广东\"}},{\"r\":19,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"2094063051.3\"}},{\"r\":19,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"382884.5\"}},{\"r\":19,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"1134410441\"}},{\"r\":19,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"191533.7\"}},{\"r\":19,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"959652610.39999998\"}},{\"r\":19,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"191350.9\"}},{\"r\":19,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"353601728.39999998\"}},{\"r\":19,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"70785.600000000006\"}},{\"r\":19,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"18461401.899999999\"}},{\"r\":19,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"3207.8\"}},{\"r\":19,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"335140326.5\"}},{\"r\":19,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"67577.7\"}},{\"r\":19,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"1740461323\"}},{\"r\":19,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"312099\"}},{\"r\":19,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"1115949039.0999999\"}},{\"r\":19,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C20,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"188325.8\"}},{\"r\":20,\"c\":2,\"v\":{\"f\":\"=Sheet1!A18\",\"tb\":1,\"v\":\"广西\"}},{\"r\":20,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"881928162.60000002\"}},{\"r\":20,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"153065.29999999999\"}},{\"r\":20,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"392264700.60000002\"}},{\"r\":20,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"60361.4\"}},{\"r\":20,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"489663462\"}},{\"r\":20,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"92704\"}},{\"r\":20,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"319724661.5\"}},{\"r\":20,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"61366\"}},{\"r\":20,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"15377402.6\"}},{\"r\":20,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"2580.1\"}},{\"r\":20,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"304347258.89999998\"}},{\"r\":20,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"58785.9\"}},{\"r\":20,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"562203501.10000002\"}},{\"r\":20,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"91699.3\"}},{\"r\":20,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"376887298\"}},{\"r\":20,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C21,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"57781.3\"}},{\"r\":21,\"c\":2,\"v\":{\"f\":\"=Sheet1!A19\",\"tb\":1,\"v\":\"贵州\"}},{\"r\":21,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"761419269.60000002\"}},{\"r\":21,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"135602.79999999999\"}},{\"r\":21,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"356599638.19999999\"}},{\"r\":21,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"59521.5\"}},{\"r\":21,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"404819631.39999998\"}},{\"r\":21,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"76081.3\"}},{\"r\":21,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"169856579.59999999\"}},{\"r\":21,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"31752.799999999999\"}},{\"r\":21,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"5298353.3\"}},{\"r\":21,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"900.4\"}},{\"r\":21,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"164558226.30000001\"}},{\"r\":21,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"30852.5\"}},{\"r\":21,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"591562690\"}},{\"r\":21,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"103849.9\"}},{\"r\":21,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"351301284.89999998\"}},{\"r\":21,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C22,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"58621.1\"}},{\"r\":22,\"c\":2,\"v\":{\"f\":\"=Sheet1!A20\",\"tb\":1,\"v\":\"云南\"}},{\"r\":22,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"1069523219.5\"}},{\"r\":22,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"195511.5\"}},{\"r\":22,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"229315506.5\"}},{\"r\":22,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"38869\"}},{\"r\":22,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"840207713\"}},{\"r\":22,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"156642.5\"}},{\"r\":22,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"307813804.19999999\"}},{\"r\":22,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"57696\"}},{\"r\":22,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"8071280\"}},{\"r\":22,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"1366.2\"}},{\"r\":22,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"299742524.19999999\"}},{\"r\":22,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"56329.8\"}},{\"r\":22,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"761709415.29999995\"}},{\"r\":22,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"137815.6\"}},{\"r\":22,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"221244226.5\"}},{\"r\":22,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C23,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"37502.800000000003\"}},{\"r\":23,\"c\":2,\"v\":{\"f\":\"=Sheet1!A21\",\"tb\":1,\"v\":\"海南\"}},{\"r\":23,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"239915479.69999999\"}},{\"r\":23,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"39785.5\"}},{\"r\":23,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"115554645.09999999\"}},{\"r\":23,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"16531.7\"}},{\"r\":23,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"124360834.59999999\"}},{\"r\":23,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"23253.9\"}},{\"r\":23,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"29091002.100000001\"}},{\"r\":23,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"5672.4\"}},{\"r\":23,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"2819368.3\"}},{\"r\":23,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"408.9\"}},{\"r\":23,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"26271633.800000001\"}},{\"r\":23,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"5263.5\"}},{\"r\":23,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"210824477.69999999\"}},{\"r\":23,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"34113.1\"}},{\"r\":23,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"112735276.90000001\"}},{\"r\":23,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C24,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"16122.8\"}},{\"r\":24,\"c\":2,\"v\":{\"f\":\"=Sheet1!A22\",\"tb\":1,\"v\":\"区外省市\"}},{\"r\":24,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"10035855546\"}},{\"r\":24,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"1964509.7\"}},{\"r\":24,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"2197155097.3000002\"}},{\"r\":24,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"390293.7\"}},{\"r\":24,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"7838700448.6999998\"}},{\"r\":24,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"1574216\"}},{\"r\":24,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"434791957.19999999\"}},{\"r\":24,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"82580\"}},{\"r\":24,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"9754767.6999999993\"}},{\"r\":24,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"1684.4\"}},{\"r\":24,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"425037189.5\"}},{\"r\":24,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"80895.600000000006\"}},{\"r\":24,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"9601063588.7999992\"}},{\"r\":24,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"1881929.7\"}},{\"r\":24,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"2187400329.5999999\"}},{\"r\":24,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C25,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"388609.3\"}},{\"r\":25,\"c\":2,\"v\":{\"f\":\"=Sheet1!A23\",\"tb\":1,\"v\":\"黑龙江\"}},{\"r\":25,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"129541171.09999999\"}},{\"r\":25,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"24391.3\"}},{\"r\":25,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"62821830.299999997\"}},{\"r\":25,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"11458.3\"}},{\"r\":25,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"66719340.799999997\"}},{\"r\":25,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"12933\"}},{\"r\":25,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"351794.8\"}},{\"r\":25,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"68.400000000000006\"}},{\"r\":25,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"0\"}},{\"r\":25,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"0\"}},{\"r\":25,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"351794.8\"}},{\"r\":25,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"68.400000000000006\"}},{\"r\":25,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"129189376.3\"}},{\"r\":25,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"24322.9\"}},{\"r\":25,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"62821830.299999997\"}},{\"r\":25,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C26,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"11458.3\"}},{\"r\":26,\"c\":2,\"v\":{\"f\":\"=Sheet1!A24\",\"tb\":1,\"v\":\"吉林\"}},{\"r\":26,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"78698824.599999994\"}},{\"r\":26,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"15613.4\"}},{\"r\":26,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"32110729\"}},{\"r\":26,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"5913\"}},{\"r\":26,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"46588095.600000001\"}},{\"r\":26,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"9700.4\"}},{\"r\":26,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"6612155.5\"}},{\"r\":26,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"1307.9000000000001\"}},{\"r\":26,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"45864\"}},{\"r\":26,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"6\"}},{\"r\":26,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"6566291.5\"}},{\"r\":26,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"1301.9000000000001\"}},{\"r\":26,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"72086669.099999994\"}},{\"r\":26,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"14305.6\"}},{\"r\":26,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"32064865\"}},{\"r\":26,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C27,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"5907\"}},{\"r\":27,\"c\":2,\"v\":{\"f\":\"=Sheet1!A25\",\"tb\":1,\"v\":\"辽宁\"}},{\"r\":27,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"7733295016.6000004\"}},{\"r\":27,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"1547329.3\"}},{\"r\":27,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"1522587629.4000001\"}},{\"r\":27,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"278027.5\"}},{\"r\":27,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"6210707387.1000004\"}},{\"r\":27,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"1269301.8999999999\"}},{\"r\":27,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"60966225.399999999\"}},{\"r\":27,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"12480.2\"}},{\"r\":27,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"884918\"}},{\"r\":27,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"144\"}},{\"r\":27,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"60081307.399999999\"}},{\"r\":27,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"12336.2\"}},{\"r\":27,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"7672328791.1999998\"}},{\"r\":27,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"1534849.1\"}},{\"r\":27,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"1521702711.4000001\"}},{\"r\":27,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C28,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"277883.5\"}},{\"r\":28,\"c\":2,\"v\":{\"f\":\"=Sheet1!A26\",\"tb\":1,\"v\":\"陕西\"}},{\"r\":28,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"216046916.09999999\"}},{\"r\":28,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"42153.7\"}},{\"r\":28,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"65047944\"}},{\"r\":28,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"11657.8\"}},{\"r\":28,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"150998972.09999999\"}},{\"r\":28,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"30496\"}},{\"r\":28,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"35712772.200000003\"}},{\"r\":28,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"6986\"}},{\"r\":28,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"4241540.8\"}},{\"r\":28,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"756.3\"}},{\"r\":28,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"31471231.399999999\"}},{\"r\":28,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"6229.7\"}},{\"r\":28,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"180334143.90000001\"}},{\"r\":28,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"35167.699999999997\"}},{\"r\":28,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"60806403.200000003\"}},{\"r\":28,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C29,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"10901.5\"}},{\"r\":29,\"c\":2,\"v\":{\"f\":\"=Sheet1!A27\",\"tb\":1,\"v\":\"新疆\"}},{\"r\":29,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"834583660.60000002\"}},{\"r\":29,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"144791.4\"}},{\"r\":29,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"184835666.80000001\"}},{\"r\":29,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"27384.1\"}},{\"r\":29,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"649747993.89999998\"}},{\"r\":29,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"117407.2\"}},{\"r\":29,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"73977926\"}},{\"r\":29,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"13424.5\"}},{\"r\":29,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"647113.80000000005\"}},{\"r\":29,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"93\"}},{\"r\":29,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"73330812.099999994\"}},{\"r\":29,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"13331.5\"}},{\"r\":29,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"760605734.60000002\"}},{\"r\":29,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"131366.9\"}},{\"r\":29,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"184188552.90000001\"}},{\"r\":29,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C30,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"27291.200000000001\"}},{\"r\":30,\"c\":2,\"v\":{\"f\":\"=Sheet1!A28\",\"tb\":1,\"v\":\"内蒙古\"}},{\"r\":30,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"145212039.59999999\"}},{\"r\":30,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"27917.599999999999\"}},{\"r\":30,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"39988602.899999999\"}},{\"r\":30,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"7276.2\"}},{\"r\":30,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"105223436.7\"}},{\"r\":30,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"20641.400000000001\"}},{\"r\":30,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"67942427.200000003\"}},{\"r\":30,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"13237.9\"}},{\"r\":30,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"100262.9\"}},{\"r\":30,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"14.7\"}},{\"r\":30,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"67842164.299999997\"}},{\"r\":30,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"13223.2\"}},{\"r\":30,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"77269612.400000006\"}},{\"r\":30,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"14679.7\"}},{\"r\":30,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"39888340\"}},{\"r\":30,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C31,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"7261.5\"}},{\"r\":31,\"c\":2,\"v\":{\"f\":\"=Sheet1!A29\",\"tb\":1,\"v\":\"青海\"}},{\"r\":31,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"21566200.199999999\"}},{\"r\":31,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"3999.8\"}},{\"r\":31,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"1237480\"}},{\"r\":31,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"201\"}},{\"r\":31,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"20328720.199999999\"}},{\"r\":31,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"3798.8\"}},{\"r\":31,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"8181122.2999999998\"}},{\"r\":31,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"1522.1\"}},{\"r\":31,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"127500\"}},{\"r\":31,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"21\"}},{\"r\":31,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"8053622.2999999998\"}},{\"r\":31,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"1501.1\"}},{\"r\":31,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"13385077.9\"}},{\"r\":31,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"2477.6999999999998\"}},{\"r\":31,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"1109980\"}},{\"r\":31,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C32,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"180\"}},{\"r\":32,\"c\":2,\"v\":{\"f\":\"=Sheet1!A30\",\"tb\":1,\"v\":\"甘肃\"}},{\"r\":32,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"32689330.300000001\"}},{\"r\":32,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"5767.2\"}},{\"r\":32,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"5726954.4000000004\"}},{\"r\":32,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"831.6\"}},{\"r\":32,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"26962375.899999999\"}},{\"r\":32,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"4935.7\"}},{\"r\":32,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"12420033.6\"}},{\"r\":32,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"2265.6999999999998\"}},{\"r\":32,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"193500\"}},{\"r\":32,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"30\"}},{\"r\":32,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"12226533.6\"}},{\"r\":32,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"2235.6999999999998\"}},{\"r\":32,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"20269296.699999999\"}},{\"r\":32,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"3501.5\"}},{\"r\":32,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"5533454.4000000004\"}},{\"r\":32,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C33,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"801.6\"}},{\"r\":33,\"c\":2,\"v\":{\"f\":\"=Sheet1!A31\",\"tb\":1,\"v\":\"四川\"}},{\"r\":33,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"342838681.19999999\"}},{\"r\":33,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"62286.2\"}},{\"r\":33,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"82197971.099999994\"}},{\"r\":33,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"13580.9\"}},{\"r\":33,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"260640710.19999999\"}},{\"r\":33,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"48705.2\"}},{\"r\":33,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"91659839.200000003\"}},{\"r\":33,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"16902.599999999999\"}},{\"r\":33,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"0\"}},{\"r\":33,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"0\"}},{\"r\":33,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"91659839.200000003\"}},{\"r\":33,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"16902.599999999999\"}},{\"r\":33,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"251178842.09999999\"}},{\"r\":33,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"45383.6\"}},{\"r\":33,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"82197971.099999994\"}},{\"r\":33,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C34,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"13580.9\"}},{\"r\":34,\"c\":2,\"v\":{\"f\":\"=Sheet1!A32\",\"tb\":1,\"v\":\"重庆\"}},{\"r\":34,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"484643083.69999999\"}},{\"r\":34,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"87310\"}},{\"r\":34,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"196324840.40000001\"}},{\"r\":34,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"33260.699999999997\"}},{\"r\":34,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"288318243.30000001\"}},{\"r\":34,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"54049.3\"}},{\"r\":34,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"75011847.299999997\"}},{\"r\":34,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"14061.5\"}},{\"r\":34,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"3514068.1\"}},{\"r\":34,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"619.5\"}},{\"r\":34,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"71497779.200000003\"}},{\"r\":34,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"13442\"}},{\"r\":34,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"409631236.39999998\"}},{\"r\":34,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"73248.5\"}},{\"r\":34,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"192810772.40000001\"}},{\"r\":34,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C35,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"32641.200000000001\"}},{\"r\":35,\"c\":2,\"v\":{\"f\":\"=Sheet1!A33\",\"tb\":1,\"v\":\"西藏\"}},{\"r\":35,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"16740621.9\"}},{\"r\":35,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"2949.8\"}},{\"r\":35,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"4275449\"}},{\"r\":35,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"702.6\"}},{\"r\":35,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"12465172.9\"}},{\"r\":35,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"2247.1999999999998\"}},{\"r\":35,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"1955813.7\"}},{\"r\":35,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"323.3\"}},{\"r\":35,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"0\"}},{\"r\":35,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"0\"}},{\"r\":35,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"1955813.7\"}},{\"r\":35,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"323.3\"}},{\"r\":35,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"14784808.199999999\"}},{\"r\":35,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"2626.5\"}},{\"r\":35,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"4275449\"}},{\"r\":35,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C36,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"702.6\"}},{\"r\":36,\"c\":2,\"v\":{\"f\":\"=Sheet1!A34\",\"tb\":1,\"v\":\"大区小计\"}},{\"r\":36,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"36024451898.699997\"}},{\"r\":36,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"5752528\"}},{\"r\":36,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"21255742056\"}},{\"r\":36,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"3068184.5\"}},{\"r\":36,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"14768709842.700001\"}},{\"r\":36,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"2684343.5\"}},{\"r\":36,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"371099084.69999999\"}},{\"r\":36,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"75830.899999999994\"}},{\"r\":36,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"31247035\"}},{\"r\":36,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"6773.8\"}},{\"r\":36,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"339852049.69999999\"}},{\"r\":36,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"69057.100000000006\"}},{\"r\":36,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"35653352814\"}},{\"r\":36,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"5676697.0999999996\"}},{\"r\":36,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"21224495021\"}},{\"r\":36,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C37,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"3061410.7\"}},{\"r\":37,\"c\":2,\"v\":{\"f\":\"=Sheet1!A35\",\"tb\":1,\"v\":\"华北\"}},{\"r\":37,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"8979562707.2999992\"}},{\"r\":37,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"1430431.3\"}},{\"r\":37,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"5769830804.1000004\"}},{\"r\":37,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"851308\"}},{\"r\":37,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"3209731903.1999998\"}},{\"r\":37,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"579123.30000000005\"}},{\"r\":37,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"80191139.5\"}},{\"r\":37,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"16249.4\"}},{\"r\":37,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"0\"}},{\"r\":37,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"0\"}},{\"r\":37,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"80191139.5\"}},{\"r\":37,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"16249.4\"}},{\"r\":37,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"8899371567.8999996\"}},{\"r\":37,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"1414181.9\"}},{\"r\":37,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"5769830804.1000004\"}},{\"r\":37,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C38,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"851308\"}},{\"r\":38,\"c\":2,\"v\":{\"f\":\"=Sheet1!A36\",\"tb\":1,\"v\":\"华东\"}},{\"r\":38,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"7743100122.6000004\"}},{\"r\":38,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"1238875.3999999999\"}},{\"r\":38,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"4813028321\"}},{\"r\":38,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"696549.2\"}},{\"r\":38,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"2930071801.5999999\"}},{\"r\":38,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"542326.19999999995\"}},{\"r\":38,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"72956393.599999994\"}},{\"r\":38,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"15326.1\"}},{\"r\":38,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"8332411\"}},{\"r\":38,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"2000\"}},{\"r\":38,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"64623982.600000001\"}},{\"r\":38,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"13326.2\"}},{\"r\":38,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"7670143729\"}},{\"r\":38,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"1223549.3\"}},{\"r\":38,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"4804695910\"}},{\"r\":38,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C39,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"694549.2\"}},{\"r\":39,\"c\":2,\"v\":{\"f\":\"=Sheet1!A37\",\"tb\":1,\"v\":\"华中\"}},{\"r\":39,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"6445973642.6999998\"}},{\"r\":39,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"1002082.6\"}},{\"r\":39,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"3738291609.9000001\"}},{\"r\":39,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"524638.9\"}},{\"r\":39,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"2707682032.9000001\"}},{\"r\":39,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"477443.7\"}},{\"r\":39,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"154601705.40000001\"}},{\"r\":39,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"32604.9\"}},{\"r\":39,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"22914624\"}},{\"r\":39,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"4773.8\"}},{\"r\":39,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"131687081.40000001\"}},{\"r\":39,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"27831\"}},{\"r\":39,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"6291371937.3000002\"}},{\"r\":39,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"969477.8\"}},{\"r\":39,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"3715376985.9000001\"}},{\"r\":39,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C40,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"519865.1\"}},{\"r\":40,\"c\":2,\"v\":{\"f\":\"=Sheet1!A38\",\"tb\":1,\"v\":\"华南\"}},{\"r\":40,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"11537868598.799999\"}},{\"r\":40,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"1836507.6\"}},{\"r\":40,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"6442924168.1000004\"}},{\"r\":40,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"914431.9\"}},{\"r\":40,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"5094944430.6999998\"}},{\"r\":40,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"922075.7\"}},{\"r\":40,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"34995802.399999999\"}},{\"r\":40,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"7091.3\"}},{\"r\":40,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"0\"}},{\"r\":40,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"0\"}},{\"r\":40,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"34995802.399999999\"}},{\"r\":40,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"7091.3\"}},{\"r\":40,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"11502872796.4\"}},{\"r\":40,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"1829416.4\"}},{\"r\":40,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"6442924168.1000004\"}},{\"r\":40,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C41,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"914431.9\"}},{\"r\":41,\"c\":2,\"v\":{\"f\":\"=Sheet1!A39\",\"tb\":1,\"v\":\"西北\"}},{\"r\":41,\"c\":3,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!D$2,FALSE())\",\"tb\":1,\"v\":\"1317946827.2\"}},{\"r\":41,\"c\":4,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!E$2,FALSE())\",\"tb\":1,\"v\":\"244631\"}},{\"r\":41,\"c\":5,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!F$2,FALSE())\",\"tb\":1,\"v\":\"491667152.89999998\"}},{\"r\":41,\"c\":6,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!G$2,FALSE())\",\"tb\":1,\"v\":\"81256.5\"}},{\"r\":41,\"c\":7,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!H$2,FALSE())\",\"tb\":1,\"v\":\"826279674.29999995\"}},{\"r\":41,\"c\":8,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!I$2,FALSE())\",\"tb\":1,\"v\":\"163374.5\"}},{\"r\":41,\"c\":9,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!J$2,FALSE())\",\"tb\":1,\"v\":\"28354043.800000001\"}},{\"r\":41,\"c\":10,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!K$2,FALSE())\",\"tb\":1,\"v\":\"4559.2\"}},{\"r\":41,\"c\":11,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!L$2,FALSE())\",\"tb\":1,\"v\":\"0\"}},{\"r\":41,\"c\":12,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!M$2,FALSE())\",\"tb\":1,\"v\":\"0\"}},{\"r\":41,\"c\":13,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!N$2,FALSE())\",\"tb\":1,\"v\":\"28354043.800000001\"}},{\"r\":41,\"c\":14,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!O$2,FALSE())\",\"tb\":1,\"v\":\"4559.2\"}},{\"r\":41,\"c\":15,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!P$2,FALSE())\",\"tb\":1,\"v\":\"1289592783.4000001\"}},{\"r\":41,\"c\":16,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!Q$2,FALSE())\",\"tb\":1,\"v\":\"240071.8\"}},{\"r\":41,\"c\":17,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!R$2,FALSE())\",\"tb\":1,\"v\":\"491667152.89999998\"}},{\"r\":41,\"c\":18,\"v\":{\"f\":\"=VLOOKUP($C42,Sheet1!$A$1:$S$39,Sheet2!S$2,FALSE())\",\"tb\":1,\"v\":\"81256.5\"}}],\"calcChain\":[{\"r\":41,\"c\":2,\"index\":\"2\"},{\"r\":41,\"c\":3,\"index\":\"2\"},{\"r\":4,\"c\":2,\"index\":\"2\"},{\"r\":4,\"c\":3,\"index\":\"2\"},{\"r\":5,\"c\":2,\"index\":\"2\"},{\"r\":5,\"c\":3,\"index\":\"2\"},{\"r\":6,\"c\":2,\"index\":\"2\"},{\"r\":6,\"c\":3,\"index\":\"2\"},{\"r\":7,\"c\":2,\"index\":\"2\"},{\"r\":7,\"c\":3,\"index\":\"2\"},{\"r\":8,\"c\":2,\"index\":\"2\"},{\"r\":8,\"c\":3,\"index\":\"2\"},{\"r\":9,\"c\":2,\"index\":\"2\"},{\"r\":9,\"c\":3,\"index\":\"2\"},{\"r\":10,\"c\":2,\"index\":\"2\"},{\"r\":10,\"c\":3,\"index\":\"2\"},{\"r\":11,\"c\":2,\"index\":\"2\"},{\"r\":11,\"c\":3,\"index\":\"2\"},{\"r\":12,\"c\":2,\"index\":\"2\"},{\"r\":12,\"c\":3,\"index\":\"2\"},{\"r\":13,\"c\":2,\"index\":\"2\"},{\"r\":13,\"c\":3,\"index\":\"2\"},{\"r\":14,\"c\":2,\"index\":\"2\"},{\"r\":14,\"c\":3,\"index\":\"2\"},{\"r\":15,\"c\":2,\"index\":\"2\"},{\"r\":15,\"c\":3,\"index\":\"2\"},{\"r\":16,\"c\":2,\"index\":\"2\"},{\"r\":16,\"c\":3,\"index\":\"2\"},{\"r\":17,\"c\":2,\"index\":\"2\"},{\"r\":17,\"c\":3,\"index\":\"2\"},{\"r\":18,\"c\":2,\"index\":\"2\"},{\"r\":18,\"c\":3,\"index\":\"2\"},{\"r\":19,\"c\":2,\"index\":\"2\"},{\"r\":19,\"c\":3,\"index\":\"2\"},{\"r\":20,\"c\":2,\"index\":\"2\"},{\"r\":20,\"c\":3,\"index\":\"2\"},{\"r\":21,\"c\":2,\"index\":\"2\"},{\"r\":21,\"c\":3,\"index\":\"2\"},{\"r\":22,\"c\":2,\"index\":\"2\"},{\"r\":22,\"c\":3,\"index\":\"2\"},{\"r\":23,\"c\":2,\"index\":\"2\"},{\"r\":23,\"c\":3,\"index\":\"2\"},{\"r\":24,\"c\":2,\"index\":\"2\"},{\"r\":24,\"c\":3,\"index\":\"2\"},{\"r\":25,\"c\":2,\"index\":\"2\"},{\"r\":25,\"c\":3,\"index\":\"2\"},{\"r\":26,\"c\":2,\"index\":\"2\"},{\"r\":26,\"c\":3,\"index\":\"2\"},{\"r\":27,\"c\":2,\"index\":\"2\"},{\"r\":27,\"c\":3,\"index\":\"2\"},{\"r\":28,\"c\":2,\"index\":\"2\"},{\"r\":28,\"c\":3,\"index\":\"2\"},{\"r\":29,\"c\":2,\"index\":\"2\"},{\"r\":29,\"c\":3,\"index\":\"2\"},{\"r\":30,\"c\":2,\"index\":\"2\"},{\"r\":30,\"c\":3,\"index\":\"2\"},{\"r\":31,\"c\":2,\"index\":\"2\"},{\"r\":31,\"c\":3,\"index\":\"2\"},{\"r\":32,\"c\":2,\"index\":\"2\"},{\"r\":32,\"c\":3,\"index\":\"2\"},{\"r\":33,\"c\":2,\"index\":\"2\"},{\"r\":33,\"c\":3,\"index\":\"2\"},{\"r\":34,\"c\":2,\"index\":\"2\"},{\"r\":34,\"c\":3,\"index\":\"2\"},{\"r\":35,\"c\":2,\"index\":\"2\"},{\"r\":35,\"c\":3,\"index\":\"2\"},{\"r\":36,\"c\":2,\"index\":\"2\"},{\"r\":36,\"c\":3,\"index\":\"2\"},{\"r\":37,\"c\":2,\"index\":\"2\"},{\"r\":37,\"c\":3,\"index\":\"2\"},{\"r\":38,\"c\":2,\"index\":\"2\"},{\"r\":38,\"c\":3,\"index\":\"2\"},{\"r\":39,\"c\":2,\"index\":\"2\"},{\"r\":39,\"c\":3,\"index\":\"2\"},{\"r\":40,\"c\":2,\"index\":\"2\"},{\"r\":40,\"c\":3,\"index\":\"2\"},{\"r\":3,\"c\":2,\"index\":\"2\"},{\"r\":3,\"c\":4,\"index\":\"2\"},{\"r\":3,\"c\":3,\"index\":\"2\"},{\"r\":3,\"c\":11,\"index\":\"2\"},{\"r\":40,\"c\":18,\"index\":\"2\"},{\"r\":40,\"c\":10,\"index\":\"2\"},{\"r\":39,\"c\":18,\"index\":\"2\"},{\"r\":39,\"c\":10,\"index\":\"2\"},{\"r\":38,\"c\":18,\"index\":\"2\"},{\"r\":38,\"c\":10,\"index\":\"2\"},{\"r\":37,\"c\":18,\"index\":\"2\"},{\"r\":37,\"c\":10,\"index\":\"2\"},{\"r\":36,\"c\":18,\"index\":\"2\"},{\"r\":36,\"c\":10,\"index\":\"2\"},{\"r\":35,\"c\":18,\"index\":\"2\"},{\"r\":35,\"c\":10,\"index\":\"2\"},{\"r\":34,\"c\":18,\"index\":\"2\"},{\"r\":34,\"c\":10,\"index\":\"2\"},{\"r\":33,\"c\":18,\"index\":\"2\"},{\"r\":33,\"c\":10,\"index\":\"2\"},{\"r\":32,\"c\":18,\"index\":\"2\"},{\"r\":32,\"c\":10,\"index\":\"2\"},{\"r\":31,\"c\":18,\"index\":\"2\"},{\"r\":31,\"c\":10,\"index\":\"2\"},{\"r\":30,\"c\":18,\"index\":\"2\"},{\"r\":30,\"c\":10,\"index\":\"2\"},{\"r\":29,\"c\":18,\"index\":\"2\"},{\"r\":29,\"c\":10,\"index\":\"2\"},{\"r\":28,\"c\":18,\"index\":\"2\"},{\"r\":28,\"c\":10,\"index\":\"2\"},{\"r\":27,\"c\":18,\"index\":\"2\"},{\"r\":27,\"c\":10,\"index\":\"2\"},{\"r\":26,\"c\":18,\"index\":\"2\"},{\"r\":26,\"c\":10,\"index\":\"2\"},{\"r\":25,\"c\":18,\"index\":\"2\"},{\"r\":25,\"c\":10,\"index\":\"2\"},{\"r\":24,\"c\":18,\"index\":\"2\"},{\"r\":24,\"c\":10,\"index\":\"2\"},{\"r\":23,\"c\":18,\"index\":\"2\"},{\"r\":23,\"c\":10,\"index\":\"2\"},{\"r\":22,\"c\":18,\"index\":\"2\"},{\"r\":22,\"c\":10,\"index\":\"2\"},{\"r\":21,\"c\":18,\"index\":\"2\"},{\"r\":21,\"c\":10,\"index\":\"2\"},{\"r\":20,\"c\":18,\"index\":\"2\"},{\"r\":20,\"c\":10,\"index\":\"2\"},{\"r\":19,\"c\":18,\"index\":\"2\"},{\"r\":19,\"c\":10,\"index\":\"2\"},{\"r\":18,\"c\":18,\"index\":\"2\"},{\"r\":18,\"c\":10,\"index\":\"2\"},{\"r\":17,\"c\":18,\"index\":\"2\"},{\"r\":17,\"c\":10,\"index\":\"2\"},{\"r\":16,\"c\":18,\"index\":\"2\"},{\"r\":16,\"c\":10,\"index\":\"2\"},{\"r\":15,\"c\":18,\"index\":\"2\"},{\"r\":15,\"c\":10,\"index\":\"2\"},{\"r\":14,\"c\":18,\"index\":\"2\"},{\"r\":14,\"c\":10,\"index\":\"2\"},{\"r\":13,\"c\":18,\"index\":\"2\"},{\"r\":13,\"c\":10,\"index\":\"2\"},{\"r\":12,\"c\":18,\"index\":\"2\"},{\"r\":12,\"c\":10,\"index\":\"2\"},{\"r\":11,\"c\":18,\"index\":\"2\"},{\"r\":11,\"c\":10,\"index\":\"2\"},{\"r\":10,\"c\":18,\"index\":\"2\"},{\"r\":10,\"c\":10,\"index\":\"2\"},{\"r\":9,\"c\":18,\"index\":\"2\"},{\"r\":9,\"c\":10,\"index\":\"2\"},{\"r\":8,\"c\":18,\"index\":\"2\"},{\"r\":8,\"c\":10,\"index\":\"2\"},{\"r\":7,\"c\":18,\"index\":\"2\"},{\"r\":7,\"c\":10,\"index\":\"2\"},{\"r\":6,\"c\":18,\"index\":\"2\"},{\"r\":6,\"c\":10,\"index\":\"2\"},{\"r\":5,\"c\":18,\"index\":\"2\"},{\"r\":5,\"c\":10,\"index\":\"2\"},{\"r\":4,\"c\":18,\"index\":\"2\"},{\"r\":4,\"c\":10,\"index\":\"2\"},{\"r\":41,\"c\":18,\"index\":\"2\"},{\"r\":41,\"c\":10,\"index\":\"2\"},{\"r\":3,\"c\":18,\"index\":\"2\"},{\"r\":3,\"c\":10,\"index\":\"2\"},{\"r\":40,\"c\":17,\"index\":\"2\"},{\"r\":40,\"c\":9,\"index\":\"2\"},{\"r\":39,\"c\":17,\"index\":\"2\"},{\"r\":39,\"c\":9,\"index\":\"2\"},{\"r\":38,\"c\":17,\"index\":\"2\"},{\"r\":38,\"c\":9,\"index\":\"2\"},{\"r\":37,\"c\":17,\"index\":\"2\"},{\"r\":37,\"c\":9,\"index\":\"2\"},{\"r\":36,\"c\":17,\"index\":\"2\"},{\"r\":36,\"c\":9,\"index\":\"2\"},{\"r\":35,\"c\":17,\"index\":\"2\"},{\"r\":35,\"c\":9,\"index\":\"2\"},{\"r\":34,\"c\":17,\"index\":\"2\"},{\"r\":34,\"c\":9,\"index\":\"2\"},{\"r\":33,\"c\":17,\"index\":\"2\"},{\"r\":33,\"c\":9,\"index\":\"2\"},{\"r\":32,\"c\":17,\"index\":\"2\"},{\"r\":32,\"c\":9,\"index\":\"2\"},{\"r\":31,\"c\":17,\"index\":\"2\"},{\"r\":31,\"c\":9,\"index\":\"2\"},{\"r\":30,\"c\":17,\"index\":\"2\"},{\"r\":30,\"c\":9,\"index\":\"2\"},{\"r\":29,\"c\":17,\"index\":\"2\"},{\"r\":29,\"c\":9,\"index\":\"2\"},{\"r\":28,\"c\":17,\"index\":\"2\"},{\"r\":28,\"c\":9,\"index\":\"2\"},{\"r\":27,\"c\":17,\"index\":\"2\"},{\"r\":27,\"c\":9,\"index\":\"2\"},{\"r\":26,\"c\":17,\"index\":\"2\"},{\"r\":26,\"c\":9,\"index\":\"2\"},{\"r\":25,\"c\":17,\"index\":\"2\"},{\"r\":25,\"c\":9,\"index\":\"2\"},{\"r\":24,\"c\":17,\"index\":\"2\"},{\"r\":24,\"c\":9,\"index\":\"2\"},{\"r\":23,\"c\":17,\"index\":\"2\"},{\"r\":23,\"c\":9,\"index\":\"2\"},{\"r\":22,\"c\":17,\"index\":\"2\"},{\"r\":22,\"c\":9,\"index\":\"2\"},{\"r\":21,\"c\":17,\"index\":\"2\"},{\"r\":21,\"c\":9,\"index\":\"2\"},{\"r\":20,\"c\":17,\"index\":\"2\"},{\"r\":20,\"c\":9,\"index\":\"2\"},{\"r\":19,\"c\":17,\"index\":\"2\"},{\"r\":19,\"c\":9,\"index\":\"2\"},{\"r\":18,\"c\":17,\"index\":\"2\"},{\"r\":18,\"c\":9,\"index\":\"2\"},{\"r\":17,\"c\":17,\"index\":\"2\"},{\"r\":17,\"c\":9,\"index\":\"2\"},{\"r\":16,\"c\":17,\"index\":\"2\"},{\"r\":16,\"c\":9,\"index\":\"2\"},{\"r\":15,\"c\":17,\"index\":\"2\"},{\"r\":15,\"c\":9,\"index\":\"2\"},{\"r\":14,\"c\":17,\"index\":\"2\"},{\"r\":14,\"c\":9,\"index\":\"2\"},{\"r\":13,\"c\":17,\"index\":\"2\"},{\"r\":13,\"c\":9,\"index\":\"2\"},{\"r\":12,\"c\":17,\"index\":\"2\"},{\"r\":12,\"c\":9,\"index\":\"2\"},{\"r\":11,\"c\":17,\"index\":\"2\"},{\"r\":11,\"c\":9,\"index\":\"2\"},{\"r\":10,\"c\":17,\"index\":\"2\"},{\"r\":10,\"c\":9,\"index\":\"2\"},{\"r\":9,\"c\":17,\"index\":\"2\"},{\"r\":9,\"c\":9,\"index\":\"2\"},{\"r\":8,\"c\":17,\"index\":\"2\"},{\"r\":8,\"c\":9,\"index\":\"2\"},{\"r\":7,\"c\":17,\"index\":\"2\"},{\"r\":7,\"c\":9,\"index\":\"2\"},{\"r\":6,\"c\":17,\"index\":\"2\"},{\"r\":6,\"c\":9,\"index\":\"2\"},{\"r\":5,\"c\":17,\"index\":\"2\"},{\"r\":5,\"c\":9,\"index\":\"2\"},{\"r\":4,\"c\":17,\"index\":\"2\"},{\"r\":4,\"c\":9,\"index\":\"2\"},{\"r\":41,\"c\":17,\"index\":\"2\"},{\"r\":41,\"c\":9,\"index\":\"2\"},{\"r\":3,\"c\":17,\"index\":\"2\"},{\"r\":3,\"c\":9,\"index\":\"2\"},{\"r\":40,\"c\":16,\"index\":\"2\"},{\"r\":40,\"c\":8,\"index\":\"2\"},{\"r\":39,\"c\":16,\"index\":\"2\"},{\"r\":39,\"c\":8,\"index\":\"2\"},{\"r\":38,\"c\":16,\"index\":\"2\"},{\"r\":38,\"c\":8,\"index\":\"2\"},{\"r\":37,\"c\":16,\"index\":\"2\"},{\"r\":37,\"c\":8,\"index\":\"2\"},{\"r\":36,\"c\":16,\"index\":\"2\"},{\"r\":36,\"c\":8,\"index\":\"2\"},{\"r\":35,\"c\":16,\"index\":\"2\"},{\"r\":35,\"c\":8,\"index\":\"2\"},{\"r\":34,\"c\":16,\"index\":\"2\"},{\"r\":34,\"c\":8,\"index\":\"2\"},{\"r\":33,\"c\":16,\"index\":\"2\"},{\"r\":33,\"c\":8,\"index\":\"2\"},{\"r\":32,\"c\":16,\"index\":\"2\"},{\"r\":32,\"c\":8,\"index\":\"2\"},{\"r\":31,\"c\":16,\"index\":\"2\"},{\"r\":31,\"c\":8,\"index\":\"2\"},{\"r\":30,\"c\":16,\"index\":\"2\"},{\"r\":30,\"c\":8,\"index\":\"2\"},{\"r\":29,\"c\":16,\"index\":\"2\"},{\"r\":29,\"c\":8,\"index\":\"2\"},{\"r\":28,\"c\":16,\"index\":\"2\"},{\"r\":28,\"c\":8,\"index\":\"2\"},{\"r\":27,\"c\":16,\"index\":\"2\"},{\"r\":27,\"c\":8,\"index\":\"2\"},{\"r\":26,\"c\":16,\"index\":\"2\"},{\"r\":26,\"c\":8,\"index\":\"2\"},{\"r\":25,\"c\":16,\"index\":\"2\"},{\"r\":25,\"c\":8,\"index\":\"2\"},{\"r\":24,\"c\":16,\"index\":\"2\"},{\"r\":24,\"c\":8,\"index\":\"2\"},{\"r\":23,\"c\":16,\"index\":\"2\"},{\"r\":23,\"c\":8,\"index\":\"2\"},{\"r\":22,\"c\":16,\"index\":\"2\"},{\"r\":22,\"c\":8,\"index\":\"2\"},{\"r\":21,\"c\":16,\"index\":\"2\"},{\"r\":21,\"c\":8,\"index\":\"2\"},{\"r\":20,\"c\":16,\"index\":\"2\"},{\"r\":20,\"c\":8,\"index\":\"2\"},{\"r\":19,\"c\":16,\"index\":\"2\"},{\"r\":19,\"c\":8,\"index\":\"2\"},{\"r\":18,\"c\":16,\"index\":\"2\"},{\"r\":18,\"c\":8,\"index\":\"2\"},{\"r\":17,\"c\":16,\"index\":\"2\"},{\"r\":17,\"c\":8,\"index\":\"2\"},{\"r\":16,\"c\":16,\"index\":\"2\"},{\"r\":16,\"c\":8,\"index\":\"2\"},{\"r\":15,\"c\":16,\"index\":\"2\"},{\"r\":15,\"c\":8,\"index\":\"2\"},{\"r\":14,\"c\":16,\"index\":\"2\"},{\"r\":14,\"c\":8,\"index\":\"2\"},{\"r\":13,\"c\":16,\"index\":\"2\"},{\"r\":13,\"c\":8,\"index\":\"2\"},{\"r\":12,\"c\":16,\"index\":\"2\"},{\"r\":12,\"c\":8,\"index\":\"2\"},{\"r\":11,\"c\":16,\"index\":\"2\"},{\"r\":11,\"c\":8,\"index\":\"2\"},{\"r\":10,\"c\":16,\"index\":\"2\"},{\"r\":10,\"c\":8,\"index\":\"2\"},{\"r\":9,\"c\":16,\"index\":\"2\"},{\"r\":9,\"c\":8,\"index\":\"2\"},{\"r\":8,\"c\":16,\"index\":\"2\"},{\"r\":8,\"c\":8,\"index\":\"2\"},{\"r\":7,\"c\":16,\"index\":\"2\"},{\"r\":7,\"c\":8,\"index\":\"2\"},{\"r\":6,\"c\":16,\"index\":\"2\"},{\"r\":6,\"c\":8,\"index\":\"2\"},{\"r\":5,\"c\":16,\"index\":\"2\"},{\"r\":5,\"c\":8,\"index\":\"2\"},{\"r\":4,\"c\":16,\"index\":\"2\"},{\"r\":4,\"c\":8,\"index\":\"2\"},{\"r\":41,\"c\":16,\"index\":\"2\"},{\"r\":41,\"c\":8,\"index\":\"2\"},{\"r\":3,\"c\":16,\"index\":\"2\"},{\"r\":3,\"c\":8,\"index\":\"2\"},{\"r\":40,\"c\":15,\"index\":\"2\"},{\"r\":40,\"c\":7,\"index\":\"2\"},{\"r\":39,\"c\":15,\"index\":\"2\"},{\"r\":39,\"c\":7,\"index\":\"2\"},{\"r\":38,\"c\":15,\"index\":\"2\"},{\"r\":38,\"c\":7,\"index\":\"2\"},{\"r\":37,\"c\":15,\"index\":\"2\"},{\"r\":37,\"c\":7,\"index\":\"2\"},{\"r\":36,\"c\":15,\"index\":\"2\"},{\"r\":36,\"c\":7,\"index\":\"2\"},{\"r\":35,\"c\":15,\"index\":\"2\"},{\"r\":35,\"c\":7,\"index\":\"2\"},{\"r\":34,\"c\":15,\"index\":\"2\"},{\"r\":34,\"c\":7,\"index\":\"2\"},{\"r\":33,\"c\":15,\"index\":\"2\"},{\"r\":33,\"c\":7,\"index\":\"2\"},{\"r\":32,\"c\":15,\"index\":\"2\"},{\"r\":32,\"c\":7,\"index\":\"2\"},{\"r\":31,\"c\":15,\"index\":\"2\"},{\"r\":31,\"c\":7,\"index\":\"2\"},{\"r\":30,\"c\":15,\"index\":\"2\"},{\"r\":30,\"c\":7,\"index\":\"2\"},{\"r\":29,\"c\":15,\"index\":\"2\"},{\"r\":29,\"c\":7,\"index\":\"2\"},{\"r\":28,\"c\":15,\"index\":\"2\"},{\"r\":28,\"c\":7,\"index\":\"2\"},{\"r\":27,\"c\":15,\"index\":\"2\"},{\"r\":27,\"c\":7,\"index\":\"2\"},{\"r\":26,\"c\":15,\"index\":\"2\"},{\"r\":26,\"c\":7,\"index\":\"2\"},{\"r\":25,\"c\":15,\"index\":\"2\"},{\"r\":25,\"c\":7,\"index\":\"2\"},{\"r\":24,\"c\":15,\"index\":\"2\"},{\"r\":24,\"c\":7,\"index\":\"2\"},{\"r\":23,\"c\":15,\"index\":\"2\"},{\"r\":23,\"c\":7,\"index\":\"2\"},{\"r\":22,\"c\":15,\"index\":\"2\"},{\"r\":22,\"c\":7,\"index\":\"2\"},{\"r\":21,\"c\":15,\"index\":\"2\"},{\"r\":21,\"c\":7,\"index\":\"2\"},{\"r\":20,\"c\":15,\"index\":\"2\"},{\"r\":20,\"c\":7,\"index\":\"2\"},{\"r\":19,\"c\":15,\"index\":\"2\"},{\"r\":19,\"c\":7,\"index\":\"2\"},{\"r\":18,\"c\":15,\"index\":\"2\"},{\"r\":18,\"c\":7,\"index\":\"2\"},{\"r\":17,\"c\":15,\"index\":\"2\"},{\"r\":17,\"c\":7,\"index\":\"2\"},{\"r\":16,\"c\":15,\"index\":\"2\"},{\"r\":16,\"c\":7,\"index\":\"2\"},{\"r\":15,\"c\":15,\"index\":\"2\"},{\"r\":15,\"c\":7,\"index\":\"2\"},{\"r\":14,\"c\":15,\"index\":\"2\"},{\"r\":14,\"c\":7,\"index\":\"2\"},{\"r\":13,\"c\":15,\"index\":\"2\"},{\"r\":13,\"c\":7,\"index\":\"2\"},{\"r\":12,\"c\":15,\"index\":\"2\"},{\"r\":12,\"c\":7,\"index\":\"2\"},{\"r\":11,\"c\":15,\"index\":\"2\"},{\"r\":11,\"c\":7,\"index\":\"2\"},{\"r\":10,\"c\":15,\"index\":\"2\"},{\"r\":10,\"c\":7,\"index\":\"2\"},{\"r\":9,\"c\":15,\"index\":\"2\"},{\"r\":9,\"c\":7,\"index\":\"2\"},{\"r\":8,\"c\":15,\"index\":\"2\"},{\"r\":8,\"c\":7,\"index\":\"2\"},{\"r\":7,\"c\":15,\"index\":\"2\"},{\"r\":7,\"c\":7,\"index\":\"2\"},{\"r\":6,\"c\":15,\"index\":\"2\"},{\"r\":6,\"c\":7,\"index\":\"2\"},{\"r\":5,\"c\":15,\"index\":\"2\"},{\"r\":5,\"c\":7,\"index\":\"2\"},{\"r\":4,\"c\":15,\"index\":\"2\"},{\"r\":4,\"c\":7,\"index\":\"2\"},{\"r\":41,\"c\":15,\"index\":\"2\"},{\"r\":41,\"c\":7,\"index\":\"2\"},{\"r\":3,\"c\":15,\"index\":\"2\"},{\"r\":3,\"c\":7,\"index\":\"2\"},{\"r\":40,\"c\":14,\"index\":\"2\"},{\"r\":40,\"c\":6,\"index\":\"2\"},{\"r\":39,\"c\":14,\"index\":\"2\"},{\"r\":39,\"c\":6,\"index\":\"2\"},{\"r\":38,\"c\":14,\"index\":\"2\"},{\"r\":38,\"c\":6,\"index\":\"2\"},{\"r\":37,\"c\":14,\"index\":\"2\"},{\"r\":37,\"c\":6,\"index\":\"2\"},{\"r\":36,\"c\":14,\"index\":\"2\"},{\"r\":36,\"c\":6,\"index\":\"2\"},{\"r\":35,\"c\":14,\"index\":\"2\"},{\"r\":35,\"c\":6,\"index\":\"2\"},{\"r\":34,\"c\":14,\"index\":\"2\"},{\"r\":34,\"c\":6,\"index\":\"2\"},{\"r\":33,\"c\":14,\"index\":\"2\"},{\"r\":33,\"c\":6,\"index\":\"2\"},{\"r\":32,\"c\":14,\"index\":\"2\"},{\"r\":32,\"c\":6,\"index\":\"2\"},{\"r\":31,\"c\":14,\"index\":\"2\"},{\"r\":31,\"c\":6,\"index\":\"2\"},{\"r\":30,\"c\":14,\"index\":\"2\"},{\"r\":30,\"c\":6,\"index\":\"2\"},{\"r\":29,\"c\":14,\"index\":\"2\"},{\"r\":29,\"c\":6,\"index\":\"2\"},{\"r\":28,\"c\":14,\"index\":\"2\"},{\"r\":28,\"c\":6,\"index\":\"2\"},{\"r\":27,\"c\":14,\"index\":\"2\"},{\"r\":27,\"c\":6,\"index\":\"2\"},{\"r\":26,\"c\":14,\"index\":\"2\"},{\"r\":26,\"c\":6,\"index\":\"2\"},{\"r\":25,\"c\":14,\"index\":\"2\"},{\"r\":25,\"c\":6,\"index\":\"2\"},{\"r\":24,\"c\":14,\"index\":\"2\"},{\"r\":24,\"c\":6,\"index\":\"2\"},{\"r\":23,\"c\":14,\"index\":\"2\"},{\"r\":23,\"c\":6,\"index\":\"2\"},{\"r\":22,\"c\":14,\"index\":\"2\"},{\"r\":22,\"c\":6,\"index\":\"2\"},{\"r\":21,\"c\":14,\"index\":\"2\"},{\"r\":21,\"c\":6,\"index\":\"2\"},{\"r\":20,\"c\":14,\"index\":\"2\"},{\"r\":20,\"c\":6,\"index\":\"2\"},{\"r\":19,\"c\":14,\"index\":\"2\"},{\"r\":19,\"c\":6,\"index\":\"2\"},{\"r\":18,\"c\":14,\"index\":\"2\"},{\"r\":18,\"c\":6,\"index\":\"2\"},{\"r\":17,\"c\":14,\"index\":\"2\"},{\"r\":17,\"c\":6,\"index\":\"2\"},{\"r\":16,\"c\":14,\"index\":\"2\"},{\"r\":16,\"c\":6,\"index\":\"2\"},{\"r\":15,\"c\":14,\"index\":\"2\"},{\"r\":15,\"c\":6,\"index\":\"2\"},{\"r\":14,\"c\":14,\"index\":\"2\"},{\"r\":14,\"c\":6,\"index\":\"2\"},{\"r\":13,\"c\":14,\"index\":\"2\"},{\"r\":13,\"c\":6,\"index\":\"2\"},{\"r\":12,\"c\":14,\"index\":\"2\"},{\"r\":12,\"c\":6,\"index\":\"2\"},{\"r\":11,\"c\":14,\"index\":\"2\"},{\"r\":11,\"c\":6,\"index\":\"2\"},{\"r\":10,\"c\":14,\"index\":\"2\"},{\"r\":10,\"c\":6,\"index\":\"2\"},{\"r\":9,\"c\":14,\"index\":\"2\"},{\"r\":9,\"c\":6,\"index\":\"2\"},{\"r\":8,\"c\":14,\"index\":\"2\"},{\"r\":8,\"c\":6,\"index\":\"2\"},{\"r\":7,\"c\":14,\"index\":\"2\"},{\"r\":7,\"c\":6,\"index\":\"2\"},{\"r\":6,\"c\":14,\"index\":\"2\"},{\"r\":6,\"c\":6,\"index\":\"2\"},{\"r\":5,\"c\":14,\"index\":\"2\"},{\"r\":5,\"c\":6,\"index\":\"2\"},{\"r\":4,\"c\":14,\"index\":\"2\"},{\"r\":4,\"c\":6,\"index\":\"2\"},{\"r\":41,\"c\":14,\"index\":\"2\"},{\"r\":41,\"c\":6,\"index\":\"2\"},{\"r\":3,\"c\":14,\"index\":\"2\"},{\"r\":3,\"c\":6,\"index\":\"2\"},{\"r\":40,\"c\":13,\"index\":\"2\"},{\"r\":40,\"c\":5,\"index\":\"2\"},{\"r\":39,\"c\":13,\"index\":\"2\"},{\"r\":39,\"c\":5,\"index\":\"2\"},{\"r\":38,\"c\":13,\"index\":\"2\"},{\"r\":38,\"c\":5,\"index\":\"2\"},{\"r\":37,\"c\":13,\"index\":\"2\"},{\"r\":37,\"c\":5,\"index\":\"2\"},{\"r\":36,\"c\":13,\"index\":\"2\"},{\"r\":36,\"c\":5,\"index\":\"2\"},{\"r\":35,\"c\":13,\"index\":\"2\"},{\"r\":35,\"c\":5,\"index\":\"2\"},{\"r\":34,\"c\":13,\"index\":\"2\"},{\"r\":34,\"c\":5,\"index\":\"2\"},{\"r\":33,\"c\":13,\"index\":\"2\"},{\"r\":33,\"c\":5,\"index\":\"2\"},{\"r\":32,\"c\":13,\"index\":\"2\"},{\"r\":32,\"c\":5,\"index\":\"2\"},{\"r\":31,\"c\":13,\"index\":\"2\"},{\"r\":31,\"c\":5,\"index\":\"2\"},{\"r\":30,\"c\":13,\"index\":\"2\"},{\"r\":30,\"c\":5,\"index\":\"2\"},{\"r\":29,\"c\":13,\"index\":\"2\"},{\"r\":29,\"c\":5,\"index\":\"2\"},{\"r\":28,\"c\":13,\"index\":\"2\"},{\"r\":28,\"c\":5,\"index\":\"2\"},{\"r\":27,\"c\":13,\"index\":\"2\"},{\"r\":27,\"c\":5,\"index\":\"2\"},{\"r\":26,\"c\":13,\"index\":\"2\"},{\"r\":26,\"c\":5,\"index\":\"2\"},{\"r\":25,\"c\":13,\"index\":\"2\"},{\"r\":25,\"c\":5,\"index\":\"2\"},{\"r\":24,\"c\":13,\"index\":\"2\"},{\"r\":24,\"c\":5,\"index\":\"2\"},{\"r\":23,\"c\":13,\"index\":\"2\"},{\"r\":23,\"c\":5,\"index\":\"2\"},{\"r\":22,\"c\":13,\"index\":\"2\"},{\"r\":22,\"c\":5,\"index\":\"2\"},{\"r\":21,\"c\":13,\"index\":\"2\"},{\"r\":21,\"c\":5,\"index\":\"2\"},{\"r\":20,\"c\":13,\"index\":\"2\"},{\"r\":20,\"c\":5,\"index\":\"2\"},{\"r\":19,\"c\":13,\"index\":\"2\"},{\"r\":19,\"c\":5,\"index\":\"2\"},{\"r\":18,\"c\":13,\"index\":\"2\"},{\"r\":18,\"c\":5,\"index\":\"2\"},{\"r\":17,\"c\":13,\"index\":\"2\"},{\"r\":17,\"c\":5,\"index\":\"2\"},{\"r\":16,\"c\":13,\"index\":\"2\"},{\"r\":16,\"c\":5,\"index\":\"2\"},{\"r\":15,\"c\":13,\"index\":\"2\"},{\"r\":15,\"c\":5,\"index\":\"2\"},{\"r\":14,\"c\":13,\"index\":\"2\"},{\"r\":14,\"c\":5,\"index\":\"2\"},{\"r\":13,\"c\":13,\"index\":\"2\"},{\"r\":13,\"c\":5,\"index\":\"2\"},{\"r\":12,\"c\":13,\"index\":\"2\"},{\"r\":12,\"c\":5,\"index\":\"2\"},{\"r\":11,\"c\":13,\"index\":\"2\"},{\"r\":11,\"c\":5,\"index\":\"2\"},{\"r\":10,\"c\":13,\"index\":\"2\"},{\"r\":10,\"c\":5,\"index\":\"2\"},{\"r\":9,\"c\":13,\"index\":\"2\"},{\"r\":9,\"c\":5,\"index\":\"2\"},{\"r\":8,\"c\":13,\"index\":\"2\"},{\"r\":8,\"c\":5,\"index\":\"2\"},{\"r\":7,\"c\":13,\"index\":\"2\"},{\"r\":7,\"c\":5,\"index\":\"2\"},{\"r\":6,\"c\":13,\"index\":\"2\"},{\"r\":6,\"c\":5,\"index\":\"2\"},{\"r\":5,\"c\":13,\"index\":\"2\"},{\"r\":5,\"c\":5,\"index\":\"2\"},{\"r\":4,\"c\":13,\"index\":\"2\"},{\"r\":4,\"c\":5,\"index\":\"2\"},{\"r\":41,\"c\":13,\"index\":\"2\"},{\"r\":41,\"c\":5,\"index\":\"2\"},{\"r\":3,\"c\":13,\"index\":\"2\"},{\"r\":3,\"c\":5,\"index\":\"2\"},{\"r\":40,\"c\":12,\"index\":\"2\"},{\"r\":40,\"c\":4,\"index\":\"2\"},{\"r\":39,\"c\":12,\"index\":\"2\"},{\"r\":39,\"c\":4,\"index\":\"2\"},{\"r\":38,\"c\":12,\"index\":\"2\"},{\"r\":38,\"c\":4,\"index\":\"2\"},{\"r\":37,\"c\":12,\"index\":\"2\"},{\"r\":37,\"c\":4,\"index\":\"2\"},{\"r\":36,\"c\":12,\"index\":\"2\"},{\"r\":36,\"c\":4,\"index\":\"2\"},{\"r\":35,\"c\":12,\"index\":\"2\"},{\"r\":35,\"c\":4,\"index\":\"2\"},{\"r\":34,\"c\":12,\"index\":\"2\"},{\"r\":34,\"c\":4,\"index\":\"2\"},{\"r\":33,\"c\":12,\"index\":\"2\"},{\"r\":33,\"c\":4,\"index\":\"2\"},{\"r\":32,\"c\":12,\"index\":\"2\"},{\"r\":32,\"c\":4,\"index\":\"2\"},{\"r\":31,\"c\":12,\"index\":\"2\"},{\"r\":31,\"c\":4,\"index\":\"2\"},{\"r\":30,\"c\":12,\"index\":\"2\"},{\"r\":30,\"c\":4,\"index\":\"2\"},{\"r\":29,\"c\":12,\"index\":\"2\"},{\"r\":29,\"c\":4,\"index\":\"2\"},{\"r\":28,\"c\":12,\"index\":\"2\"},{\"r\":28,\"c\":4,\"index\":\"2\"},{\"r\":27,\"c\":12,\"index\":\"2\"},{\"r\":27,\"c\":4,\"index\":\"2\"},{\"r\":26,\"c\":12,\"index\":\"2\"},{\"r\":26,\"c\":4,\"index\":\"2\"},{\"r\":25,\"c\":12,\"index\":\"2\"},{\"r\":25,\"c\":4,\"index\":\"2\"},{\"r\":24,\"c\":12,\"index\":\"2\"},{\"r\":24,\"c\":4,\"index\":\"2\"},{\"r\":23,\"c\":12,\"index\":\"2\"},{\"r\":23,\"c\":4,\"index\":\"2\"},{\"r\":22,\"c\":12,\"index\":\"2\"},{\"r\":22,\"c\":4,\"index\":\"2\"},{\"r\":21,\"c\":12,\"index\":\"2\"},{\"r\":21,\"c\":4,\"index\":\"2\"},{\"r\":20,\"c\":12,\"index\":\"2\"},{\"r\":20,\"c\":4,\"index\":\"2\"},{\"r\":19,\"c\":12,\"index\":\"2\"},{\"r\":19,\"c\":4,\"index\":\"2\"},{\"r\":18,\"c\":12,\"index\":\"2\"},{\"r\":18,\"c\":4,\"index\":\"2\"},{\"r\":17,\"c\":12,\"index\":\"2\"},{\"r\":17,\"c\":4,\"index\":\"2\"},{\"r\":16,\"c\":12,\"index\":\"2\"},{\"r\":16,\"c\":4,\"index\":\"2\"},{\"r\":15,\"c\":12,\"index\":\"2\"},{\"r\":15,\"c\":4,\"index\":\"2\"},{\"r\":14,\"c\":12,\"index\":\"2\"},{\"r\":14,\"c\":4,\"index\":\"2\"},{\"r\":13,\"c\":12,\"index\":\"2\"},{\"r\":13,\"c\":4,\"index\":\"2\"},{\"r\":12,\"c\":12,\"index\":\"2\"},{\"r\":12,\"c\":4,\"index\":\"2\"},{\"r\":11,\"c\":12,\"index\":\"2\"},{\"r\":11,\"c\":4,\"index\":\"2\"},{\"r\":10,\"c\":12,\"index\":\"2\"},{\"r\":10,\"c\":4,\"index\":\"2\"},{\"r\":9,\"c\":12,\"index\":\"2\"},{\"r\":9,\"c\":4,\"index\":\"2\"},{\"r\":8,\"c\":12,\"index\":\"2\"},{\"r\":8,\"c\":4,\"index\":\"2\"},{\"r\":7,\"c\":12,\"index\":\"2\"},{\"r\":7,\"c\":4,\"index\":\"2\"},{\"r\":6,\"c\":12,\"index\":\"2\"},{\"r\":6,\"c\":4,\"index\":\"2\"},{\"r\":5,\"c\":12,\"index\":\"2\"},{\"r\":5,\"c\":4,\"index\":\"2\"},{\"r\":4,\"c\":12,\"index\":\"2\"},{\"r\":4,\"c\":4,\"index\":\"2\"},{\"r\":41,\"c\":12,\"index\":\"2\"},{\"r\":41,\"c\":4,\"index\":\"2\"},{\"r\":3,\"c\":12,\"index\":\"2\"},{\"r\":40,\"c\":11,\"index\":\"2\"},{\"r\":39,\"c\":11,\"index\":\"2\"},{\"r\":38,\"c\":11,\"index\":\"2\"},{\"r\":37,\"c\":11,\"index\":\"2\"},{\"r\":36,\"c\":11,\"index\":\"2\"},{\"r\":35,\"c\":11,\"index\":\"2\"},{\"r\":34,\"c\":11,\"index\":\"2\"},{\"r\":33,\"c\":11,\"index\":\"2\"},{\"r\":32,\"c\":11,\"index\":\"2\"},{\"r\":31,\"c\":11,\"index\":\"2\"},{\"r\":30,\"c\":11,\"index\":\"2\"},{\"r\":29,\"c\":11,\"index\":\"2\"},{\"r\":28,\"c\":11,\"index\":\"2\"},{\"r\":27,\"c\":11,\"index\":\"2\"},{\"r\":26,\"c\":11,\"index\":\"2\"},{\"r\":25,\"c\":11,\"index\":\"2\"},{\"r\":24,\"c\":11,\"index\":\"2\"},{\"r\":23,\"c\":11,\"index\":\"2\"},{\"r\":22,\"c\":11,\"index\":\"2\"},{\"r\":21,\"c\":11,\"index\":\"2\"},{\"r\":20,\"c\":11,\"index\":\"2\"},{\"r\":19,\"c\":11,\"index\":\"2\"},{\"r\":18,\"c\":11,\"index\":\"2\"},{\"r\":17,\"c\":11,\"index\":\"2\"},{\"r\":16,\"c\":11,\"index\":\"2\"},{\"r\":15,\"c\":11,\"index\":\"2\"},{\"r\":14,\"c\":11,\"index\":\"2\"},{\"r\":13,\"c\":11,\"index\":\"2\"},{\"r\":12,\"c\":11,\"index\":\"2\"},{\"r\":11,\"c\":11,\"index\":\"2\"},{\"r\":10,\"c\":11,\"index\":\"2\"},{\"r\":9,\"c\":11,\"index\":\"2\"},{\"r\":8,\"c\":11,\"index\":\"2\"},{\"r\":7,\"c\":11,\"index\":\"2\"},{\"r\":6,\"c\":11,\"index\":\"2\"},{\"r\":5,\"c\":11,\"index\":\"2\"},{\"r\":4,\"c\":11,\"index\":\"2\"},{\"r\":41,\"c\":11,\"index\":\"2\"}]},{\"name\":\"Sheet3\",\"config\":{},\"index\":\"3\",\"status\":\"0\",\"order\":\"2\",\"zoomRatio\":1,\"showGridLines\":\"1\",\"defaultColWidth\":72,\"defaultRowHeight\":18,\"celldata\":[],\"calcChain\":[]}]\n\t\t\t\t\tdata:\n\t\t\t\t\t\t[sheetCell, sheetFormula, sheetConditionFormat, sheetSparkline, sheetTable, sheetComment, sheetPivotTableData, sheetPivotTable, sheetChart, sheetPicture, sheetDataVerification]\n\t\t\t\t\t/*data:[{\n\t\t\t\t\t\"name\": \"Cell\",\n\t\t\t\t\t\"config\": {\n\t\t\t\t\t\t\"curentsheetView\":\"viewNormal\",//viewNormal, viewLayout, viewPage\n\t\t\t\t\t\t\"sheetViewZoom\":{\n\t\t\t\t\t\t\t\"viewNormalZoomScale\": 1 ,\n\t\t\t\t\t\t\t\"viewLayoutZoomScale\":1 ,\n\t\t\t\t\t\t\t\"viewPageZoomScale\":0.6,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"printoptions\":{\n\t\t\t\t\t\t\tunit:\"mm\",//mm(default), in, pt, cm, m,\n\t\t\t\t\t\t\tPrintArea:\"$A$1:$S$31\",//print range\n\t\t\t\t\t\t\tPrintTitles:{//row column\n\t\t\t\t\t\t\t\trow:\"Sheet1!$1:$1\",\n\t\t\t\t\t\t\t\tcolumn:\"Sheet1!$C:$C\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tprintOptions:{\n\t\t\t\t\t\t\t\thorizontalCentered:0,//align\n\t\t\t\t\t\t\t\tverticalCentered:0,//valign\n\t\t\t\t\t\t\t\theadings:0,//show row and column\n\t\t\t\t\t\t\t\tgridLines:0,//show gridlines\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tpageMargins:{\n\t\t\t\t\t\t\t\tleft:0.7,//Left Page Margin, inch\n\t\t\t\t\t\t\t\tright:0.7,//Right page margin, inch\n\t\t\t\t\t\t\t\ttop:0.75,//Top Page Margin, inch\n\t\t\t\t\t\t\t\tbottom:0.75,//Bottom Page Margin, inch\n\t\t\t\t\t\t\t\theader:0.3,//Header Page Margin, date,sheet name, page , custom etc, inch.\n\t\t\t\t\t\t\t\tfooter:0.3,//Footer Page Margin, date,sheet name, page , custom etc, inch.\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tpageSetup:{\n\t\t\t\t\t\t\t\tcopies:1,//Number of copies to print.\n\t\t\t\t\t\t\t\tdraft:0,//Print without graphics about image and chart\n\t\t\t\t\t\t\t\tpaperSize:9,//1Letter ,3Tabloid, 5Legal ,6Statement ,7Executive ,8A3 ,9A4 ,11A5 ,12B4 ,13B5\n\t\t\t\t\t\t\t\tpaperHeight:null,//Height of custom paper as a number followed by a unit identifier. [Example: 297mm, 11inend example],When paperHeight and paperWidth are specified, paperSize shall be ignored.\n\t\t\t\t\t\t\t\tpaperWidth:null,//Width of custom paper as a number followed by a unit identifier. [Example: 21cm, 8.5inend example]\n\t\t\t\t\t\t\t\tfitToWidth:0,//Number of horizontal pages to fit on.\n\t\t\t\t\t\t\t\tfitToHeight:0,//Number of vertical pages to fit on.\n\t\t\t\t\t\t\t\tscale:100,//Print scaling. This attribute is restricted to values ranging from 10 to 400.\n\t\t\t\t\t\t\t\torientation:0,//0defualt,1landscape,2portrait\n\t\t\t\t\t\t\t\tblackAndWhite:0,\n\t\t\t\t\t\t\t\tcellComments:0,//This attribute specifies how to print cell comments, 2 asDisplayed, 1 atEnd, 0 none\n\t\t\t\t\t\t\t\terrors:0,//Specifies how to print cell values for cells with errors, 0 blank(Show Cell Errors As Blank),1 dash(Dash Cell Errors),2 displayed(Display Cell Errors),3 NA\n\t\t\t\t\t\t\t\thorizontalDpi:null,//Vertical print resolution of the device.\n\t\t\t\t\t\t\t\tverticalDpi:null,//Vertical print resolution of the device.\n\t\t\t\t\t\t\t\tpageOrder:0, //0 downThenOver ,1 overThenDown\n\t\t\t\t\t\t\t\tfirstPageNumber:null,//Page number for first printed page. If no value is specified, then 'automatic' is assumed.\n\t\t\t\t\t\t\t\tuseFirstPageNumber:0,//Use firstPageNumber value for first page number, and do not auto number the pages.\n\t\t\t\t\t\t\t\tusePrinterDefaults:1,//applay default when config is null,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\theaderFooter:{\n\t\t\t\t\t\t\t\tfirstFooter:{\n\t\t\t\t\t\t\t\t\tleft:[//&L\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\"ff\":\"Arial\", //font family &\"-,Regular\" or &\"font name,font type\"\n\t\t\t\t\t\t\t\t\t\t\t\"fc\":\"#fff000\",//font color &K\n\t\t\t\t\t\t\t\t\t\t\t\"fs\":12,//font size &font-size\n\t\t\t\t\t\t\t\t\t\t\t\"cl\":0,//strike\n\t\t\t\t\t\t\t\t\t\t\t\"un\":0,//underline &E double,  &U single\n\t\t\t\t\t\t\t\t\t\t\t\"bl\":0,//blod &B\n\t\t\t\t\t\t\t\t\t\t\t\"it\":0,//italic &I\n\t\t\t\t\t\t\t\t\t\t\t\"ss\":0,//0 none 1sup &X,  2sub &Y\n\t\t\t\t\t\t\t\t\t\t\tv:\"我在马路\\r\\n边捡到\\r\\n\\r\\n一分钱\"\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tcenter:[],//&C\n\t\t\t\t\t\t\t\t\tright:[],//&R\n\t\t\t\t\t\t\t\t}, //First Page Footer\n\t\t\t\t\t\t\t\tfirstHeader:null, //First Page Header\n\t\t\t\t\t\t\t\toddFooter:\"&C第 &P 页&R&G\", //Odd Page Footer\n\t\t\t\t\t\t\t\toddHeader:\"&L&G&C&A&F\",//Odd Header\n\t\t\t\t\t\t\t\tevenFooter:null,//Even Page Footer\n\t\t\t\t\t\t\t\tevenHeader:null,//Even Page Header\n\t\t\t\t\t\t\t\tdrawingHF:{//Drawing Reference in Header Footer\n\t\t\t\t\t\t\t\t\tLF:{//left footer\n\t\t\t\t\t\t\t\t\t\ttype:\"#_x0000_t75\",\n\t\t\t\t\t\t\t\t\t\timagedata:\"\",\n\t\t\t\t\t\t\t\t\t\tstyle:\"\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tRF:{},//right footer\n\t\t\t\t\t\t\t\t\tCF:{},//center footer\n\t\t\t\t\t\t\t\t\tLH:{},//left header\n\t\t\t\t\t\t\t\t\tRH:{},//right header\n\t\t\t\t\t\t\t\t\tCH:{},//center header\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\trowBreaks:{\n\t\t\t\t\t\t\t\t\"rowBreaks_1\":{\n\t\t\t\t\t\t\t\t\trowIndex:68,\n\t\t\t\t\t\t\t\t\tman:1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcolBreaks:{\n\t\t\t\t\t\t\t\t\"colBreaks_1\":{\n\t\t\t\t\t\t\t\t\tcolIndex:5,\n\t\t\t\t\t\t\t\t\tman:1,\n\t\t\t\t\t\t\t\t\tmax:16383,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"colBreaks_2\":{\n\t\t\t\t\t\t\t\t\tcolIndex:11,\n\t\t\t\t\t\t\t\t\tman:1,\n\t\t\t\t\t\t\t\t\tmax:1048575,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"colBreaks_3\":{\n\t\t\t\t\t\t\t\t\tcolIndex:17,\n\t\t\t\t\t\t\t\t\tman:1,\n\t\t\t\t\t\t\t\t\tmax:1048575\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"merge\": {\n\t\t\t\t\t\t\t\"13_5\": {\n\t\t\t\t\t\t\t\t\"r\": 13,\n\t\t\t\t\t\t\t\t\"c\": 5,\n\t\t\t\t\t\t\t\t\"rs\": 3,\n\t\t\t\t\t\t\t\t\"cs\": 1\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"13_7\": {\n\t\t\t\t\t\t\t\t\"r\": 13,\n\t\t\t\t\t\t\t\t\"c\": 7,\n\t\t\t\t\t\t\t\t\"rs\": 3,\n\t\t\t\t\t\t\t\t\"cs\": 2\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"14_2\": {\n\t\t\t\t\t\t\t\t\"r\": 14,\n\t\t\t\t\t\t\t\t\"c\": 2,\n\t\t\t\t\t\t\t\t\"rs\": 1,\n\t\t\t\t\t\t\t\t\"cs\": 2\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"15_10\": {\n\t\t\t\t\t\t\t\t\"r\": 15,\n\t\t\t\t\t\t\t\t\"c\": 10,\n\t\t\t\t\t\t\t\t\"rs\": 4,\n\t\t\t\t\t\t\t\t\"cs\": 3\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"borderInfo\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 3,\n\t\t\t\t\t\t\t\t\t\"col_index\": 3,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 10,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 10,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 10,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 10,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 3,\n\t\t\t\t\t\t\t\t\t\"col_index\": 4,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 10,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 10,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 10,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 10,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 3,\n\t\t\t\t\t\t\t\t\t\"col_index\": 5,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 3,\n\t\t\t\t\t\t\t\t\t\"col_index\": 6,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 3,\n\t\t\t\t\t\t\t\t\t\"col_index\": 7,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 3,\n\t\t\t\t\t\t\t\t\t\"col_index\": 8,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 5,\n\t\t\t\t\t\t\t\t\t\"col_index\": 2,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 5,\n\t\t\t\t\t\t\t\t\t\"col_index\": 3,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 5,\n\t\t\t\t\t\t\t\t\t\"col_index\": 4,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 5,\n\t\t\t\t\t\t\t\t\t\"col_index\": 5,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 5,\n\t\t\t\t\t\t\t\t\t\"col_index\": 6,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 5,\n\t\t\t\t\t\t\t\t\t\"col_index\": 7,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 5,\n\t\t\t\t\t\t\t\t\t\"col_index\": 8,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 2,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 2,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 2,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 2,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(255, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 7,\n\t\t\t\t\t\t\t\t\t\"col_index\": 2,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 7,\n\t\t\t\t\t\t\t\t\t\"col_index\": 3,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 7,\n\t\t\t\t\t\t\t\t\t\"col_index\": 5,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 2,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(154, 205, 50)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 2,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(154, 205, 50)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 7,\n\t\t\t\t\t\t\t\t\t\"col_index\": 6,\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 2,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(154, 205, 50)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 2,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(154, 205, 50)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 7,\n\t\t\t\t\t\t\t\t\t\"col_index\": 8,\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 7,\n\t\t\t\t\t\t\t\t\t\"col_index\": 9,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 8,\n\t\t\t\t\t\t\t\t\t\"col_index\": 2,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 8,\n\t\t\t\t\t\t\t\t\t\"col_index\": 3,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 255)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 8,\n\t\t\t\t\t\t\t\t\t\"col_index\": 5,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 2,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(154, 205, 50)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 2,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(154, 205, 50)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 8,\n\t\t\t\t\t\t\t\t\t\"col_index\": 6,\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 2,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(154, 205, 50)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 2,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(154, 205, 50)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 8,\n\t\t\t\t\t\t\t\t\t\"col_index\": 8,\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 8,\n\t\t\t\t\t\t\t\t\t\"col_index\": 9,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 9,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(0, 0, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 10,\n\t\t\t\t\t\t\t\t\t\"col_index\": 2,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 10,\n\t\t\t\t\t\t\t\t\t\"col_index\": 3,\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 10,\n\t\t\t\t\t\t\t\t\t\"col_index\": 5,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 10,\n\t\t\t\t\t\t\t\t\t\"col_index\": 6,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 10,\n\t\t\t\t\t\t\t\t\t\"col_index\": 7,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 11,\n\t\t\t\t\t\t\t\t\t\"col_index\": 2,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 11,\n\t\t\t\t\t\t\t\t\t\"col_index\": 3,\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 11,\n\t\t\t\t\t\t\t\t\t\"col_index\": 5,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 11,\n\t\t\t\t\t\t\t\t\t\"col_index\": 6,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 11,\n\t\t\t\t\t\t\t\t\t\"col_index\": 7,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 12,\n\t\t\t\t\t\t\t\t\t\"col_index\": 2,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 12,\n\t\t\t\t\t\t\t\t\t\"col_index\": 3,\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(144, 238, 144)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 12,\n\t\t\t\t\t\t\t\t\t\"col_index\": 5,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 12,\n\t\t\t\t\t\t\t\t\t\"col_index\": 6,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 12,\n\t\t\t\t\t\t\t\t\t\"col_index\": 7,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"style\": 1,\n\t\t\t\t\t\t\t\t\t\t\"color\": \"rgb(205, 205, 0)\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-none\",\n\t\t\t\t\t\t\t\t\"style\": \"2\",\n\t\t\t\t\t\t\t\t\"color\": \"#000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t4\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"2\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t4\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-none\",\n\t\t\t\t\t\t\t\t\"style\": \"4\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t4,\n\t\t\t\t\t\t\t\t\t\t\t4\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"3\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t4,\n\t\t\t\t\t\t\t\t\t\t\t4\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-none\",\n\t\t\t\t\t\t\t\t\"style\": \"3\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"2\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-none\",\n\t\t\t\t\t\t\t\t\"style\": \"2\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t5,\n\t\t\t\t\t\t\t\t\t\t\t5\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-none\",\n\t\t\t\t\t\t\t\t\"style\": \"2\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t8,\n\t\t\t\t\t\t\t\t\t\t\t8\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-none\",\n\t\t\t\t\t\t\t\t\"style\": \"2\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t8\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"4\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t7,\n\t\t\t\t\t\t\t\t\t\t\t7\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"1\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t8,\n\t\t\t\t\t\t\t\t\t\t\t8\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"5\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t6,\n\t\t\t\t\t\t\t\t\t\t\t6\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"6\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t5,\n\t\t\t\t\t\t\t\t\t\t\t5\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-none\",\n\t\t\t\t\t\t\t\t\"style\": \"3\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t4,\n\t\t\t\t\t\t\t\t\t\t\t4\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"3\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t4,\n\t\t\t\t\t\t\t\t\t\t\t4\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"2\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-none\",\n\t\t\t\t\t\t\t\t\"style\": \"2\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t5,\n\t\t\t\t\t\t\t\t\t\t\t5\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t\t\t\t\t9\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"9\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t5,\n\t\t\t\t\t\t\t\t\t\t\t5\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t5,\n\t\t\t\t\t\t\t\t\t\t\t5\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"8\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t5,\n\t\t\t\t\t\t\t\t\t\t\t5\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t6,\n\t\t\t\t\t\t\t\t\t\t\t6\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"13\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t5,\n\t\t\t\t\t\t\t\t\t\t\t5\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t7,\n\t\t\t\t\t\t\t\t\t\t\t7\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"13\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t6,\n\t\t\t\t\t\t\t\t\t\t\t6\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t11,\n\t\t\t\t\t\t\t\t\t\t\t11\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"10\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t5,\n\t\t\t\t\t\t\t\t\t\t\t5\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t4,\n\t\t\t\t\t\t\t\t\t\t\t4\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"11\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t5,\n\t\t\t\t\t\t\t\t\t\t\t5\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-none\",\n\t\t\t\t\t\t\t\t\"style\": \"11\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t7,\n\t\t\t\t\t\t\t\t\t\t\t8\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-all\",\n\t\t\t\t\t\t\t\t\"style\": \"3\",\n\t\t\t\t\t\t\t\t\"color\": \"#0000ff\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t7,\n\t\t\t\t\t\t\t\t\t\t\t8\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-inside\",\n\t\t\t\t\t\t\t\t\"style\": \"3\",\n\t\t\t\t\t\t\t\t\"color\": \"#0000ff\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t7,\n\t\t\t\t\t\t\t\t\t\t\t8\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t8,\n\t\t\t\t\t\t\t\t\t\t\t9\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-inside\",\n\t\t\t\t\t\t\t\t\"style\": \"9\",\n\t\t\t\t\t\t\t\t\"color\": \"#0000ff\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t7,\n\t\t\t\t\t\t\t\t\t\t\t8\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t8,\n\t\t\t\t\t\t\t\t\t\t\t9\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-inside\",\n\t\t\t\t\t\t\t\t\"style\": \"2\",\n\t\t\t\t\t\t\t\t\"color\": \"#0000ff\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t7,\n\t\t\t\t\t\t\t\t\t\t\t8\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t8,\n\t\t\t\t\t\t\t\t\t\t\t9\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-inside\",\n\t\t\t\t\t\t\t\t\"style\": \"9\",\n\t\t\t\t\t\t\t\t\"color\": \"#0000ff\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t7,\n\t\t\t\t\t\t\t\t\t\t\t8\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t8,\n\t\t\t\t\t\t\t\t\t\t\t9\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 10,\n\t\t\t\t\t\t\t\t\t\"col_index\": 10,\n\t\t\t\t\t\t\t\t\t\"l\": {\n\t\t\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\t\t\"style\": \"13\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"r\": {\n\t\t\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\t\t\"style\": \"13\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"t\": {\n\t\t\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\t\t\"style\": \"13\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"b\": {\n\t\t\t\t\t\t\t\t\t\t\"color\": \"#ff0000\",\n\t\t\t\t\t\t\t\t\t\t\"style\": \"13\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 6,\n\t\t\t\t\t\t\t\t\t\"col_index\": 11,\n\t\t\t\t\t\t\t\t\t\"l\": null,\n\t\t\t\t\t\t\t\t\t\"r\": null,\n\t\t\t\t\t\t\t\t\t\"t\": null,\n\t\t\t\t\t\t\t\t\t\"b\": null\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"cell\",\n\t\t\t\t\t\t\t\t\"value\": {\n\t\t\t\t\t\t\t\t\t\"row_index\": 10,\n\t\t\t\t\t\t\t\t\t\"col_index\": 10,\n\t\t\t\t\t\t\t\t\t\"l\": null,\n\t\t\t\t\t\t\t\t\t\"r\": null,\n\t\t\t\t\t\t\t\t\t\"t\": null,\n\t\t\t\t\t\t\t\t\t\"b\": null\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-outside\",\n\t\t\t\t\t\t\t\t\"style\": \"13\",\n\t\t\t\t\t\t\t\t\"color\": \"#00ff00\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t10,\n\t\t\t\t\t\t\t\t\t\t\t12\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-horizontal\",\n\t\t\t\t\t\t\t\t\"style\": \"13\",\n\t\t\t\t\t\t\t\t\"color\": \"#00ff00\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t10,\n\t\t\t\t\t\t\t\t\t\t\t12\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-vertical\",\n\t\t\t\t\t\t\t\t\"style\": \"13\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff9900\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t10,\n\t\t\t\t\t\t\t\t\t\t\t12\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t5,\n\t\t\t\t\t\t\t\t\t\t\t7\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-outside\",\n\t\t\t\t\t\t\t\t\"style\": \"13\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff9900\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t10,\n\t\t\t\t\t\t\t\t\t\t\t12\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t5,\n\t\t\t\t\t\t\t\t\t\t\t7\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"rangeType\": \"range\",\n\t\t\t\t\t\t\t\t\"borderType\": \"border-none\",\n\t\t\t\t\t\t\t\t\"style\": \"1\",\n\t\t\t\t\t\t\t\t\"color\": \"#ff9900\",\n\t\t\t\t\t\t\t\t\"range\": [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t\t\t\t19,\n\t\t\t\t\t\t\t\t\t\t\t19\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t\t\t\t6,\n\t\t\t\t\t\t\t\t\t\t\t6\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"rowlen\": {\n\t\t\t\t\t\t\t\"0\": 20,\n\t\t\t\t\t\t\t\"1\": 20,\n\t\t\t\t\t\t\t\"2\": 20,\n\t\t\t\t\t\t\t\"3\": 20,\n\t\t\t\t\t\t\t\"4\": 20,\n\t\t\t\t\t\t\t\"5\": 20,\n\t\t\t\t\t\t\t\"6\": 20,\n\t\t\t\t\t\t\t\"7\": 20,\n\t\t\t\t\t\t\t\"8\": 20,\n\t\t\t\t\t\t\t\"9\": 20,\n\t\t\t\t\t\t\t\"10\": 20,\n\t\t\t\t\t\t\t\"11\": 20,\n\t\t\t\t\t\t\t\"12\": 20,\n\t\t\t\t\t\t\t\"13\": 20,\n\t\t\t\t\t\t\t\"14\": 20,\n\t\t\t\t\t\t\t\"15\": 20,\n\t\t\t\t\t\t\t\"16\": 20,\n\t\t\t\t\t\t\t\"17\": 31,\n\t\t\t\t\t\t\t\"18\": 20,\n\t\t\t\t\t\t\t\"19\": 20,\n\t\t\t\t\t\t\t\"20\": 20,\n\t\t\t\t\t\t\t\"21\": 20,\n\t\t\t\t\t\t\t\"22\": 20,\n\t\t\t\t\t\t\t\"23\": 20,\n\t\t\t\t\t\t\t\"24\": 20,\n\t\t\t\t\t\t\t\"25\": 79,\n\t\t\t\t\t\t\t\"26\": 20,\n\t\t\t\t\t\t\t\"27\": 20,\n\t\t\t\t\t\t\t\"28\": 80,\n\t\t\t\t\t\t\t\"29\": 36\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"columnlen\": {\n\t\t\t\t\t\t\t\"0\": 131,\n\t\t\t\t\t\t\t\"2\": 153,\n\t\t\t\t\t\t\t\"3\": 128,\n\t\t\t\t\t\t\t\"4\": 136,\n\t\t\t\t\t\t\t\"5\": 122,\n\t\t\t\t\t\t\t\"6\": 138,\n\t\t\t\t\t\t\t\"7\": 131,\n\t\t\t\t\t\t\t\"8\": 128,\n\t\t\t\t\t\t\t\"9\": 140,\n\t\t\t\t\t\t\t\"10\": 144\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"rowhidden\": {\n\t\t\t\t\t\t\t\"30\": 0,\n\t\t\t\t\t\t\t\"31\": 0\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"customHeight\": {\n\t\t\t\t\t\t\t\"29\": 1\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"customWidth\": {\n\t\t\t\t\t\t\t\"2\": 1\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"index\": \"0\",\n\t\t\t\t\t\"zoomRatio\": 1,\n\t\t\t\t\t\"order\": \"0\",\n\t\t\t\t\t\"column\": 18,\n\t\t\t\t\t\"row\": 36,\n\t\t\t\t\t\"status\": 1,\n\t\t\t\t\t\"celldata\": [{\"r\":0,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":\"1\",\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"1\"}},{\"r\":0,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":2,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"2\"}},{\"r\":0,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":3,\"ct\":{\"fa\":\"General\",\"t\":\"n\"},\"m\":\"3\"}},{\"r\":0,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":0,\"ct\":{\"fa\":\"###.00\",\"t\":\"n\"},\"m\":\"0\",\"f\":\"=A1/B1\"}},{\"r\":0,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":0,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":0,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":0,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":0,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":0,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":0,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":0,\"v\":{\"v\":\"Background\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Background\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":2,\"v\":{\"bg\":\"rgb(30, 144, 255)\",\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":4,\"v\":{\"bg\":\"rgb(0, 255, 0)\",\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":1,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":2,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":0,\"v\":{\"v\":\"Border\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Border\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":3,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":4,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"ct\":{\"fa\":\"General\",\"t\":\"inlineStr\",\"s\":[{\"ff\":\"Arial\",\"fc\":\"rgb(255, 0, 0)\",\"fs\":12,\"cl\":0,\"un\":0,\"bl\":0,\"it\":0,\"v\":\"Inline\"},{\"ff\":\"Arial\",\"fc\":\"#000000\",\"fs\":12,\"cl\":0,\"un\":0,\"bl\":0,\"it\":0,\"v\":\" \"},{\"ff\":\"Arial\",\"fc\":\"#000000\",\"fs\":16,\"cl\":1,\"un\":0,\"bl\":0,\"it\":1,\"v\":\"Style\"},{\"ff\":\"Arial\",\"fc\":\"#000000\",\"fs\":12,\"cl\":0,\"un\":0,\"bl\":0,\"it\":0,\"v\":\" \"},{\"ff\":\"Arial\",\"fc\":\"#000000\",\"fs\":12,\"cl\":0,\"un\":0,\"bl\":1,\"it\":0,\"v\":\"Cell\"}]}}},{\"r\":5,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":5,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":6,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":7,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":8,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":9,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":10,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":11,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":12,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":13,\"c\":5,\"rs\":3,\"cs\":1}}},{\"r\":13,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":13,\"c\":7,\"rs\":3,\"cs\":2}}},{\"r\":13,\"c\":8,\"v\":{\"mc\":{\"r\":13,\"c\":7}}},{\"r\":13,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":13,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":14,\"c\":0,\"v\":{\"v\":\"Span\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Span\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":14,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":14,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":14,\"c\":2,\"rs\":1,\"cs\":2}}},{\"r\":14,\"c\":3,\"v\":{\"mc\":{\"r\":14,\"c\":2}}},{\"r\":14,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":14,\"c\":5,\"v\":{\"mc\":{\"r\":13,\"c\":5}}},{\"r\":14,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":14,\"c\":7,\"v\":{\"mc\":{\"r\":13,\"c\":7}}},{\"r\":14,\"c\":8,\"v\":{\"mc\":{\"r\":13,\"c\":7}}},{\"r\":14,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":14,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":5,\"v\":{\"mc\":{\"r\":13,\"c\":5}}},{\"r\":15,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":7,\"v\":{\"mc\":{\"r\":13,\"c\":7}}},{\"r\":15,\"c\":8,\"v\":{\"mc\":{\"r\":13,\"c\":7}}},{\"r\":15,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":15,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":15,\"c\":10,\"rs\":4,\"cs\":3}}},{\"r\":15,\"c\":11,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":15,\"c\":12,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":16,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":16,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":15,\"c\":10}}},{\"r\":16,\"c\":11,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":16,\"c\":12,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":17,\"c\":0,\"v\":{\"v\":\"Font\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Font\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":17,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":17,\"c\":2,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":\"11\",\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":17,\"c\":3,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":13,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":17,\"c\":4,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":9,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":17,\"c\":5,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":13,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":17,\"c\":6,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":\"rgb(255, 215, 0)\",\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":17,\"c\":7,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(67, 110, 238)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":17,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":17,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":17,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":15,\"c\":10}}},{\"r\":17,\"c\":11,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":17,\"c\":12,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":18,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":18,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"mc\":{\"r\":15,\"c\":10}}},{\"r\":18,\"c\":11,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":18,\"c\":12,\"v\":{\"mc\":{\"r\":15,\"c\":10}}},{\"r\":19,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":19,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":19,\"c\":2,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":\"rgb(67, 110, 238)\",\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(255, 215, 0)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":19,\"c\":3,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":\"10\",\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":19,\"c\":4,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":1,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"Luckysheet\"}},{\"r\":19,\"c\":5,\"v\":{\"v\":\"Luckysheet\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"cl\":1,\"m\":\"Luckysheet\"}},{\"r\":19,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"1\",\"vt\":\"0\",\"cl\":1}},{\"r\":19,\"c\":7,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":19,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":19,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":19,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":20,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":21,\"c\":0,\"v\":{\"v\":\"Format\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Format\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":21,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":21,\"c\":2,\"v\":{\"ct\":{\"fa\":\"##0.00\",\"t\":\"n\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"0.25\",\"v\":0.25}},{\"r\":21,\"c\":3,\"v\":{\"ct\":{\"fa\":\"$#,##0.00_);($#,##0.00)\",\"t\":\"n\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"$0.25 \",\"v\":0.25}},{\"r\":21,\"c\":4,\"v\":{\"ct\":{\"fa\":\"\\\"$\\\" 0.00\",\"t\":\"n\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"$ 0.25\",\"v\":0.25}},{\"r\":21,\"c\":5,\"v\":{\"ct\":{\"fa\":\"0%\",\"t\":\"n\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"25%\",\"v\":0.25}},{\"r\":21,\"c\":6,\"v\":{\"ct\":{\"fa\":\"# ?/?\",\"t\":\"n\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\" 1/4\",\"v\":0.25}},{\"r\":21,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":21,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":21,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":21,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":22,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":2,\"v\":{\"ct\":{\"fa\":\"0.00E+00\",\"t\":\"n\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"m\":\"2.50E-01\",\"v\":0.25}},{\"r\":23,\"c\":3,\"v\":{\"v\":0.25,\"ct\":{\"fa\":\"0.00\",\"t\":\"n\"},\"m\":\"0.25\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":4,\"v\":{\"ct\":{\"fa\":\"AM/PM h:mm:ss\",\"t\":\"d\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":44032,\"m\":\"AM 12:00:00\"}},{\"r\":23,\"c\":5,\"v\":{\"ct\":{\"fa\":\"yyyy/MM/dd\",\"t\":\"d\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":44032,\"m\":\"2020/07/20\"}},{\"r\":23,\"c\":6,\"v\":{\"ct\":{\"fa\":\"yyyy\\\"年\\\"M\\\"月\\\"d\\\"日\\\"\",\"t\":\"d\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"v\":44032,\"m\":\"2020年7月20日\"}},{\"r\":23,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":23,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":24,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":25,\"c\":0,\"v\":{\"v\":\"Alignment\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Alignment\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":25,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":25,\"c\":2,\"v\":{\"v\":\"Top Left\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Top Left\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"1\",\"vt\":\"1\"}},{\"r\":25,\"c\":3,\"v\":{\"v\":\"Top Center\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Top Center\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"0\",\"vt\":\"1\"}},{\"r\":25,\"c\":4,\"v\":{\"v\":\"Top Right\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Top Right\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"2\",\"vt\":\"1\"}},{\"r\":25,\"c\":5,\"v\":{\"v\":\"Center Left\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Center Left\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"1\",\"vt\":\"0\"}},{\"r\":25,\"c\":6,\"v\":{\"v\":\"Center Center\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Center Center\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"0\",\"vt\":\"0\"}},{\"r\":25,\"c\":7,\"v\":{\"v\":\"Center Right\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Center Right\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"2\",\"vt\":\"0\"}},{\"r\":25,\"c\":8,\"v\":{\"v\":\"Bottom Left\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Bottom Left\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"1\",\"vt\":\"2\"}},{\"r\":25,\"c\":9,\"v\":{\"v\":\"Bottom Center\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Bottom Center\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"0\",\"vt\":\"2\"}},{\"r\":25,\"c\":10,\"v\":{\"v\":\"Bottom Right\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"Bottom Right\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":\"2\",\"vt\":\"2\"}},{\"r\":26,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":26,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":0,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":2,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":3,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":27,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":0,\"v\":{\"v\":\"WordWrap\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"WordWrap\",\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":1,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":2,\"v\":{\"v\":\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"m\":\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"tb\":\"2\"}},{\"r\":28,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1,\"tb\":\"1\"}},{\"r\":28,\"c\":4,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":5,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":6,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":7,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":8,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":9,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":28,\"c\":10,\"v\":{\"bg\":null,\"bl\":0,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}},{\"r\":29,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"inlineStr\",\"s\":[{\"ff\":\"\\\"times new roman\\\"\",\"fc\":\"rgb(51, 51, 51)\",\"fs\":\"12\",\"cl\":0,\"un\":0,\"bl\":1,\"it\":0,\"v\":\"TextRotate\"}]},\"ht\":\"1\",\"vt\":\"0\"}},{\"r\":29,\"c\":2,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"I am Luckysheet text rotate style\",\"m\":\"I am Luckysheet text rotate style\",\"tr\":\"1\",\"tb\":\"2\",\"ht\":\"1\",\"fs\":\"12\"}},{\"r\":29,\"c\":3,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"I am Luckysheet text rotate style\",\"m\":\"I am Luckysheet text rotate style\",\"tr\":\"2\",\"tb\":\"2\",\"ht\":\"0\",\"fs\":\"12\"}},{\"r\":29,\"c\":4,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"I am Luckysheet text rotate style\",\"m\":\"I am Luckysheet text rotate style\",\"tr\":\"4\",\"tb\":\"2\",\"ht\":\"1\",\"fs\":\"12\",\"vt\":\"2\"}},{\"r\":29,\"c\":5,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"I am Luckysheet text rotate style\",\"m\":\"I am Luckysheet text rotate style\",\"tr\":\"5\",\"tb\":\"2\",\"ht\":\"1\",\"fs\":\"12\"}},{\"r\":29,\"c\":6,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"I am Luckysheet text rotate style\",\"m\":\"I am Luckysheet text rotate style\",\"tr\":\"1\",\"tb\":\"1\",\"ht\":\"1\",\"fs\":\"12\",\"vt\":\"0\"}},{\"r\":30,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"hidden1\",\"m\":\"hidden1\"}},{\"r\":31,\"c\":0,\"v\":{\"m\":\"hidden2\",\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"v\":\"hidden2\"}},{\"r\":33,\"c\":0,\"v\":{\"ct\":{\"fa\":\"General\",\"t\":\"g\"},\"bg\":null,\"bl\":1,\"it\":0,\"ff\":0,\"fs\":11,\"fc\":\"rgb(51, 51, 51)\",\"ht\":1,\"vt\":1}}],\n\t\t\t\t\t\"ch_width\": 2361,\n\t\t\t\t\t\"rh_height\": 936,\n\t\t\t\t\t\"luckysheet_select_save\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"left\": 741,\n\t\t\t\t\t\t\t\"width\": 138,\n\t\t\t\t\t\t\t\"top\": 796,\n\t\t\t\t\t\t\t\"height\": 19,\n\t\t\t\t\t\t\t\"left_move\": 741,\n\t\t\t\t\t\t\t\"width_move\": 138,\n\t\t\t\t\t\t\t\"top_move\": 796,\n\t\t\t\t\t\t\t\"height_move\": 19,\n\t\t\t\t\t\t\t\"row\": [\n\t\t\t\t\t\t\t\t33,\n\t\t\t\t\t\t\t\t33\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"column\": [\n\t\t\t\t\t\t\t\t6,\n\t\t\t\t\t\t\t\t6\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"row_focus\": 33,\n\t\t\t\t\t\t\t\"column_focus\": 6\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"calcChain\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"r\": 0,\n\t\t\t\t\t\t\t\"c\": 3,\n\t\t\t\t\t\t\t\"index\": \"0\",\n\t\t\t\t\t\t\t\"func\": [\n\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t3,\n\t\t\t\t\t\t\t\t\"=Formula!A1+Formula!B1\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\"color\": \"w\",\n\t\t\t\t\t\t\t\"parent\": null,\n\t\t\t\t\t\t\t\"chidren\": {},\n\t\t\t\t\t\t\t\"times\": 0\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"scrollLeft\": 0,\n\t\t\t\t\t\"scrollTop\": 0\n\t\t\t\t}]*/\n\t\t\t\t}\n\t\t\t}\n\t\t\toptions.loading = {\n\t\t\t\timage: () => {\n\t\t\t\t\treturn `<svg viewBox=\"25 25 50 50\" class=\"circular\">\n\t\t\t\t\t<circle cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\"></circle>\n\t\t\t\t\t</svg>`\n\t\t\t\t},\n\t\t\t\timageClass: \"loadingAnimation\"\n\t\t\t}\n\t\t\toptions.cellRightClickConfig = {\n\t\t\t\tcustoms: [{\n\t\t\t\t\ttitle: 'test',\n\t\t\t\t\tonClick: function (clickEvent, event, params) {\n\t\t\t\t\t\tconsole.log('function test click', clickEvent, event, params)\n\t\t\t\t\t}\n\t\t\t\t}]\n\t\t\t}\n\t\t\t// let  customSheetconfig = { //自定义sheet demo\n\t\t\t//      \"name\": \"自定义\",\n\t\t\t//      \"color\": \"\",\n\t\t\t//      \"status\": \"0\",\n\t\t\t//      \"order\": 1,\n\t\t\t//      \"index\": 1,\n\t\t\t//      \"celldata\": [],\n\t\t\t//      \"row\": 10,\n\t\t\t//      \"column\": 10,\n\t\t\t//      \"config\": {},\n\t\t\t//      \"pivotTable\": null,\n\t\t\t//      \"isPivotTable\": false\n\t\t\t//  };\n\t\t\t//  luckysheet.sheetmanage.setCustomSheet(customSheetconfig);\n\t\t\tluckysheet.create(options);\n\t\t})\n\t</script>\n\t<style>\n\t\t/* 自定义loading演示样式 */\n\t\t@keyframes loading-rotate {\n\t\t\t0% {\n\t\t\t\ttransform: rotate(0deg);\n\t\t\t}\n\n\t\t\t100% {\n\t\t\t\ttransform: rotate(360deg);\n\t\t\t}\n\t\t}\n\n\t\t@keyframes loading-dash {\n\t\t\t0% {\n\t\t\t\tstroke-dasharray: 1, 200;\n\t\t\t\tstroke-dashoffset: 0;\n\t\t\t}\n\n\t\t\t50% {\n\t\t\t\tstroke-dasharray: 90, 150;\n\t\t\t\tstroke-dashoffset: -40px;\n\t\t\t}\n\n\t\t\t100% {\n\t\t\t\tstroke-dasharray: 90, 150;\n\t\t\t\tstroke-dashoffset: -120px;\n\t\t\t}\n\t\t}\n\n\t\t.loadingAnimation {\n\t\t\twidth: 3em;\n\t\t\theight: 3em;\n\t\t\tanimation: loading-rotate 2s linear infinite;\n\t\t}\n\n\t\t.loadingAnimation circle {\n\t\t\tanimation: loading-dash 1.5s ease-in-out infinite;\n\t\t\tstroke-dasharray: 90, 150;\n\t\t\tstroke-dashoffset: 0;\n\t\t\tstroke-width: 2;\n\t\t\tstroke: currentColor;\n\t\t\tstroke-linecap: round;\n\t\t}\n\t</style>\n</body>\n\n</html>"
  },
  {
    "path": "src/index.js",
    "content": "import './utils/math'\r\nimport { luckysheet } from './core'\r\nimport __firefox from './utils/polyfill'\r\n// Prevent gulp warning: 'Use of eval is strongly discouraged, as it poses security risks and may cause issues with minification'\r\n// window.evall = window.eval;\r\n// polyfill event in firefox\r\nif (window.addEventListener && (navigator.userAgent.indexOf(\"Firefox\") > 0)) {\r\n    __firefox();\r\n}\r\n\r\n// export default luckysheet;\r\n// use esbuild,bundle iife format\r\nmodule.exports = luckysheet"
  },
  {
    "path": "src/locale/en.js",
    "content": "export default {\r\n    functionlist: {\r\n        SUMIF: {\r\n            d: \"Returns a conditional sum across a range.\",\r\n            a: \"A conditional sum across a range.\",\r\n            p: [\r\n                {\r\n                    name: \"range\",\r\n                    detail: \"The range which is tested against `criterion`.\",\r\n                },\r\n                {\r\n                    name: \"criterion\",\r\n                    detail: \"The pattern or test to apply to `range`.\",\r\n                },\r\n                {\r\n                    name: \"sum_range\",\r\n                    detail: \"The range to be summed, if different from `range`.\",\r\n                },\r\n            ],\r\n        },\r\n        TAN: {\r\n            d: \"Returns the tangent of an angle provided in radians.\",\r\n            a: \"Tangent of an angle provided in radians.\",\r\n            p: [\r\n                {\r\n                    name: \"angle\",\r\n                    detail: \"The angle to find the tangent of, in radians.\",\r\n                },\r\n            ],\r\n        },\r\n        TANH: {\r\n            d: \"Returns the hyperbolic tangent of any real number.\",\r\n            a: \"Hyperbolic tangent of any real number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"Any real value to calculate the hyperbolic tangent of.\",\r\n                },\r\n            ],\r\n        },\r\n        CEILING: {\r\n            d: \"Rounds a number up to the nearest integer multiple of specified significance `factor`.\",\r\n            a: \"Rounds number up to nearest multiple of a factor.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to round up to the nearest integer multiple of `factor`.\",\r\n                },\r\n                {\r\n                    name: \"factor\",\r\n                    detail: \"The number to whose multiples `value` will be rounded.\",\r\n                },\r\n            ],\r\n        },\r\n        ATAN: {\r\n            d: \"Returns the inverse tangent of a value, in radians.\",\r\n            a: \"Inverse tangent of a value, in radians.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value for which to calculate the inverse tangent.\",\r\n                },\r\n            ],\r\n        },\r\n        ASINH: {\r\n            d: \"Returns the inverse hyperbolic sine of a number.\",\r\n            a: \"Inverse hyperbolic sine of a number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value for which to calculate the inverse hyperbolic sine.\",\r\n                },\r\n            ],\r\n        },\r\n        ABS: {\r\n            d: \"Returns the absolute value of a number.\",\r\n            a: \"Absolute value of a number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The number of which to return the absolute value.\",\r\n                },\r\n            ],\r\n        },\r\n        ACOS: {\r\n            d: \"Returns the inverse cosine of a value, in radians.\",\r\n            a: \"Inverse cosine of a value, in radians.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"The value for which to calculate the inverse cosine. Must be between `-1` and `1`, inclusive.\",\r\n                },\r\n            ],\r\n        },\r\n        ACOSH: {\r\n            d: \"Returns the inverse hyperbolic cosine of a number.\",\r\n            a: \"Inverse hyperbolic cosine of a number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"The value for which to calculate the inverse hyperbolic cosine. Must be greater than or equal to `1`.\",\r\n                },\r\n            ],\r\n        },\r\n        MULTINOMIAL: {\r\n            d: \"Returns the factorial of the sum of values divided by the product of the values' factorials.\",\r\n            a: \"Multinomial distribution function.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range to consider.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to consider.\",\r\n                },\r\n            ],\r\n        },\r\n        ATANH: {\r\n            d: \"Returns the inverse hyperbolic tangent of a number.\",\r\n            a: \"Inverse hyperbolic tangent of a number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"The value for which to calculate the inverse hyperbolic tangent. Must be between -1 and 1, exclusive.\",\r\n                },\r\n            ],\r\n        },\r\n        ATAN2: {\r\n            d:\r\n                \"Returns the angle between the x-axis and a line segment from the origin (0,0) to specified coordinate pair (`x`,`y`), in radians.\",\r\n            a: \"Arctangent of a value.\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail:\r\n                        \"The x coordinate of the endpoint of the line segment for which to calculate the angle from the x-axis.\",\r\n                },\r\n                {\r\n                    name: \"y\",\r\n                    detail:\r\n                        \"The y coordinate of the endpoint of the line segment for which to calculate the angle from the x-axis.\",\r\n                },\r\n            ],\r\n        },\r\n        COUNTBLANK: {\r\n            d: \"Returns the number of empty values in a list of values and ranges.\",\r\n            a: \"Number of empty values.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range in which to count the number of blanks.\",\r\n                },\r\n            ],\r\n        },\r\n        COSH: {\r\n            d: \"Returns the hyperbolic cosine of any real number.\",\r\n            a: \"Hyperbolic cosine of any real number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"Any real value to calculate the hyperbolic cosine of.\",\r\n                },\r\n            ],\r\n        },\r\n        INT: {\r\n            d: \"Rounds a number down to the nearest integer that is less than or equal to it.\",\r\n            a: \"Rounds number down to nearest integer.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to round down to the nearest integer.\",\r\n                },\r\n            ],\r\n        },\r\n        ISEVEN: {\r\n            d: \"Checks whether the provided value is even.\",\r\n            a: \"Whether the provided value is even.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to be verified as even.\",\r\n                },\r\n            ],\r\n        },\r\n        ISODD: {\r\n            d: \"Checks whether the provided value is odd.\",\r\n            a: \"Whether the provided value is odd.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to be verified as odd.\",\r\n                },\r\n            ],\r\n        },\r\n        LCM: {\r\n            d: \"Returns the least common multiple of one or more integers.\",\r\n            a: \"Least common multiple of one or more integers.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail:\r\n                        \"The first value or range whose factors to consider in a calculation to find the least common multiple.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges whose factors to consider to find the least common multiple.\",\r\n                },\r\n            ],\r\n        },\r\n        LN: {\r\n            d: \"Returns the logarithm of a number, base e (Euler's number).\",\r\n            a: \"The logarithm of a number, base e (euler's number).\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value for which to calculate the logarithm, base e.\",\r\n                },\r\n            ],\r\n        },\r\n        LOG: {\r\n            d: \"Returns the logarithm of a number with respect to a base.\",\r\n            a: \"The logarithm of a number with respect to a base.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value for which to calculate the logarithm.\",\r\n                },\r\n                {\r\n                    name: \"base\",\r\n                    detail: \"The base to use for calculation of the logarithm.\",\r\n                },\r\n            ],\r\n        },\r\n        LOG10: {\r\n            d: \"Returns the logarithm of a number, base 10.\",\r\n            a: \"The logarithm of a number, base 10.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value for which to calculate the logarithm, base 10.\",\r\n                },\r\n            ],\r\n        },\r\n        MOD: {\r\n            d: \"Returns the result of the modulo operator, the remainder after a division operation.\",\r\n            a: \"Modulo (remainder) operator.\",\r\n            p: [\r\n                {\r\n                    name: \"dividend\",\r\n                    detail: \"The number to be divided to find the remainder.\",\r\n                },\r\n                {\r\n                    name: \"divisor\",\r\n                    detail: \"The number to divide by.\",\r\n                },\r\n            ],\r\n        },\r\n        MROUND: {\r\n            d: \"Rounds one number to the nearest integer multiple of another.\",\r\n            a: \"Rounds a number to the nearest integer multiple.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The number to round to the nearest integer multiple of another.\",\r\n                },\r\n                {\r\n                    name: \"factor\",\r\n                    detail: \"The number to whose multiples `value` will be rounded.\",\r\n                },\r\n            ],\r\n        },\r\n        ODD: {\r\n            d: \"Rounds a number up to the nearest odd integer.\",\r\n            a: \"Rounds a number up to the nearest odd integer.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to round to the next greatest odd number.\",\r\n                },\r\n            ],\r\n        },\r\n        SUMSQ: {\r\n            d: \"Returns the sum of the squares of a series of numbers and/or cells.\",\r\n            a: \"Sum of squares.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first number or range whose squares to add together.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional numbers or ranges whose squares to add to the square(s) of `value1`.\",\r\n                },\r\n            ],\r\n        },\r\n        COMBIN: {\r\n            d: \"Returns the number of ways to choose some number of objects from a pool of a given size of objects.\",\r\n            a: \"Number of combinations from a set of objects.\",\r\n            p: [\r\n                {\r\n                    name: \"n\",\r\n                    detail: \"The size of the pool of objects to choose from.\",\r\n                },\r\n                {\r\n                    name: \"k\",\r\n                    detail: \"The number of objects to choose.\",\r\n                },\r\n            ],\r\n        },\r\n        SUM: {\r\n            d: \"Returns the sum of a series of numbers and/or cells.\",\r\n            a: \"Sum of a series of numbers and/or cells.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first number or range to add together.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional numbers or ranges to add to `value1`.\",\r\n                },\r\n            ],\r\n        },\r\n        SUBTOTAL: {\r\n            d: \"Returns a subtotal for a vertical range of cells using a specified aggregation function.\",\r\n            a: \"Subtotal for a range using a specific function.\",\r\n            p: [\r\n                {\r\n                    name: \"function_code\",\r\n                    detail: \"The function to use in subtotal aggregation.\",\r\n                },\r\n                {\r\n                    name: \"range1\",\r\n                    detail: \"The first range over which to calculate a subtotal.\",\r\n                },\r\n                {\r\n                    name: \"range2\",\r\n                    detail: \"Additional ranges over which to calculate subtotals.\",\r\n                },\r\n            ],\r\n        },\r\n        ASIN: {\r\n            d: \"Returns the inverse sine of a value, in radians.\",\r\n            a: \"Inverse sine of a value, in radians.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"The value for which to calculate the inverse sine. Must be between `-1` and `1`, inclusive.\",\r\n                },\r\n            ],\r\n        },\r\n        COUNTIF: {\r\n            d: \"Returns a conditional count across a range.\",\r\n            a: \"A conditional count across a range.\",\r\n            p: [\r\n                {\r\n                    name: \"range\",\r\n                    detail: \"The range that is tested against `criterion`.\",\r\n                },\r\n                {\r\n                    name: \"criterion\",\r\n                    detail: \"The pattern or test to apply to `range`.\",\r\n                },\r\n            ],\r\n        },\r\n        RADIANS: {\r\n            d: \"Converts an angle value in degrees to radians.\",\r\n            a: \"Converts an angle value in degrees to radians.\",\r\n            p: [\r\n                {\r\n                    name: \"angle\",\r\n                    detail: \"The angle to convert from degrees to radians.\",\r\n                },\r\n            ],\r\n        },\r\n        RAND: {\r\n            d: \"Returns a random number between 0 inclusive and 1 exclusive.\",\r\n            a: \"A random number between 0 inclusive and 1 exclusive.\",\r\n            p: [],\r\n        },\r\n        COUNTUNIQUE: {\r\n            d: \"Counts the number of unique values in a list of specified values and ranges.\",\r\n            a: \"Counts number of unique values in a range.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range to consider for uniqueness.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to consider for uniqueness.\",\r\n                },\r\n            ],\r\n        },\r\n        DEGREES: {\r\n            d: \"Converts an angle value in radians to degrees.\",\r\n            a: \"Converts an angle value in radians to degrees.\",\r\n            p: [\r\n                {\r\n                    name: \"angle\",\r\n                    detail: \"The angle to convert from radians to degrees.\",\r\n                },\r\n            ],\r\n        },\r\n        ERFC: {\r\n            d: \"Returns the complementary Gauss error function of a value.\",\r\n            a: \"Complementary gauss error function of a value.\",\r\n            p: [\r\n                {\r\n                    name: \"z\",\r\n                    detail: \"The number for which to calculate the complementary Gauss error function.\",\r\n                },\r\n            ],\r\n        },\r\n        EVEN: {\r\n            d: \"Rounds a number up to the nearest even integer.\",\r\n            a: \"Rounds a number up to the nearest even integer.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to round to the next greatest even number.\",\r\n                },\r\n            ],\r\n        },\r\n        EXP: {\r\n            d: \"Returns Euler's number, e (~2.718) raised to a power.\",\r\n            a: \"Euler's number, e (~2.718) raised to a power.\",\r\n            p: [\r\n                {\r\n                    name: \"exponent\",\r\n                    detail: \"The exponent to raise e to.\",\r\n                },\r\n            ],\r\n        },\r\n        FACT: {\r\n            d: \"Returns the factorial of a number.\",\r\n            a: \"Factorial of a number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The number or reference to a number whose factorial will be calculated and returned.\",\r\n                },\r\n            ],\r\n        },\r\n        FACTDOUBLE: {\r\n            d: 'Returns the \"double factorial\" of a number.',\r\n            a: '\"double factorial\" of a number.',\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"The number or reference to a number whose double factorial will be calculated and returned.\",\r\n                },\r\n            ],\r\n        },\r\n        PI: {\r\n            d: \"Returns the value of Pi to 14 decimal places.\",\r\n            a: \"The number pi.\",\r\n            p: [],\r\n        },\r\n        FLOOR: {\r\n            d: \"Rounds a number down to the nearest integer multiple of specified significance `factor`.\",\r\n            a: \"Rounds number down to nearest multiple of a factor.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to round down to the nearest integer multiple of `factor`.\",\r\n                },\r\n                {\r\n                    name: \"factor\",\r\n                    detail: \"The number to whose multiples `value` will be rounded.\",\r\n                },\r\n            ],\r\n        },\r\n        GCD: {\r\n            d: \"Returns the greatest common divisor of one or more integers.\",\r\n            a: \"Greatest common divisor of one or more integers.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail:\r\n                        \"The first value or range whose factors to consider in a calculation to find the greatest common divisor.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail:\r\n                        \"Additional values or ranges whose factors to consider to find the greatest common divisor.\",\r\n                },\r\n            ],\r\n        },\r\n        RANDBETWEEN: {\r\n            d: \"Returns a uniformly random integer between two values, inclusive.\",\r\n            a: \"Random integer between two values, inclusive.\",\r\n            p: [\r\n                {\r\n                    name: \"low\",\r\n                    detail: \"The low end of the random range.\",\r\n                },\r\n                {\r\n                    name: \"high\",\r\n                    detail: \"The high end of the random range.\",\r\n                },\r\n            ],\r\n        },\r\n        ROUND: {\r\n            d: \"Rounds a number to a certain number of decimal places according to standard rules.\",\r\n            a: \"Rounds a number according to standard rules.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to round to `places` number of places.\",\r\n                },\r\n                {\r\n                    name: \"places\",\r\n                    detail: \"The number of decimal places to which to round.\",\r\n                },\r\n            ],\r\n        },\r\n        ROUNDDOWN: {\r\n            d:\r\n                \"Rounds a number to a certain number of decimal places, always rounding down to the next valid increment.\",\r\n            a: \"Rounds down a number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to round to `places` number of places, always rounding down.\",\r\n                },\r\n                {\r\n                    name: \"places\",\r\n                    detail: \"The number of decimal places to which to round.\",\r\n                },\r\n            ],\r\n        },\r\n        ROUNDUP: {\r\n            d: \"Rounds a number to a certain number of decimal places, always rounding up to the next valid increment.\",\r\n            a: \"Rounds up a number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to round to `places` number of places, always rounding up.\",\r\n                },\r\n                {\r\n                    name: \"places\",\r\n                    detail: \"The number of decimal places to which to round.\",\r\n                },\r\n            ],\r\n        },\r\n        SERIESSUM: {\r\n            d: \"Given parameters `x`, `n`, `m`, and `a`, returns the power series sum a\",\r\n            a: \"Sum of a power series.\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail:\r\n                        \"The input to the power series. Varies depending on the type of approximation, may be angle, exponent, or some other value.\",\r\n                },\r\n                {\r\n                    name: \"n\",\r\n                    detail: \"The initial power to which to raise `x` in the power series.\",\r\n                },\r\n                {\r\n                    name: \"m\",\r\n                    detail: \"The additive increment by which to increase `x`.\",\r\n                },\r\n                {\r\n                    name: \"a\",\r\n                    detail: \"The array or range containing the coefficients of the power series.\",\r\n                },\r\n            ],\r\n        },\r\n        SIGN: {\r\n            d: \"Given an input number, returns `-1` if it is negative, `1` if positive, and `0` if it is zero.\",\r\n            a: \"Sign of a provided number (+/-/0).\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value whose sign will be evaluated.\",\r\n                },\r\n            ],\r\n        },\r\n        SIN: {\r\n            d: \"Returns the sine of an angle provided in radians.\",\r\n            a: \"Sine of an angle provided in radians.\",\r\n            p: [\r\n                {\r\n                    name: \"angle\",\r\n                    detail: \"The angle to find the sine of, in radians.\",\r\n                },\r\n            ],\r\n        },\r\n        SINH: {\r\n            d: \"Returns the hyperbolic sine of any real number.\",\r\n            a: \"Hyperbolic sine of any real number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"Any real value to calculate the hyperbolic sine of.\",\r\n                },\r\n            ],\r\n        },\r\n        SQRT: {\r\n            d: \"Returns the positive square root of a positive number.\",\r\n            a: \"Positive square root of a positive number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The number for which to calculate the positive square root.\",\r\n                },\r\n            ],\r\n        },\r\n        SQRTPI: {\r\n            d: \"Returns the positive square root of the product of Pi and the given positive number.\",\r\n            a: \"Square root of the product of pi and number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The number which will be multiplied by Pi and have the product's square root returned\",\r\n                },\r\n            ],\r\n        },\r\n        GAMMALN: {\r\n            d: \"Returns the logarithm of a specified Gamma function, base e (Euler's number).\",\r\n            a: \"Logarithm of gamma function.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"The input to the Gamma function. The natural logarithm of Gamma(`value`) will be returned.\",\r\n                },\r\n            ],\r\n        },\r\n        COS: {\r\n            d: \"Returns the cosine of an angle provided in radians.\",\r\n            a: \"Cosine of an angle provided in radians.\",\r\n            p: [\r\n                {\r\n                    name: \"angle\",\r\n                    detail: \"The angle to find the cosine of, in radians.\",\r\n                },\r\n            ],\r\n        },\r\n        TRUNC: {\r\n            d: \"Truncates a number to a certain number of significant digits by omitting less significant digits.\",\r\n            a: \"Truncates a number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to be truncated.\",\r\n                },\r\n                {\r\n                    name: \"places\",\r\n                    detail: \"The number of significant digits to the right of the decimal point to retain.\",\r\n                },\r\n            ],\r\n        },\r\n        QUOTIENT: {\r\n            d: \"Returns one number divided by another.\",\r\n            a: \"One number divided by another.\",\r\n            p: [\r\n                {\r\n                    name: \"dividend\",\r\n                    detail: \"The number to be divided.\",\r\n                },\r\n                {\r\n                    name: \"divisor\",\r\n                    detail: \"The number to divide by.\",\r\n                },\r\n            ],\r\n        },\r\n        POWER: {\r\n            d: \"Returns a number raised to a power.\",\r\n            a: \"A number raised to a power.\",\r\n            p: [\r\n                {\r\n                    name: \"base\",\r\n                    detail: \"The number to raise to the `exponent` power.\",\r\n                },\r\n                {\r\n                    name: \"exponent\",\r\n                    detail: \"The exponent to raise `base` to.\",\r\n                },\r\n            ],\r\n        },\r\n        SUMIFS: {\r\n            d: \"Returns the sum of a range depending on multiple criteria.\",\r\n            a: \"Sums a range depending on multiple criteria.\",\r\n            p: [\r\n                {\r\n                    name: \"sum_range\",\r\n                    detail: \"The range to sum.\",\r\n                },\r\n                {\r\n                    name: \"criteria_range1\",\r\n                    detail: \"The range to check against criterion1.\",\r\n                },\r\n                {\r\n                    name: \"criterion1\",\r\n                    detail: \"The pattern or test to apply to criteria_range1.\",\r\n                },\r\n                {\r\n                    name: \"criteria_range2\",\r\n                    detail: \"Additional ranges to check.\",\r\n                },\r\n            ],\r\n        },\r\n        GET_TARGET: {\r\n            d: \"Query target data.\",\r\n            a: \"Query target data.\",\r\n            p: [],\r\n        },\r\n        GET_AIRTABLE_DATA: {\r\n            d: \"Query AirTable data.\",\r\n            a: \"Query AirTable data.\",\r\n            p: [\r\n                {\r\n                    name: \"AirTable url\",\r\n                    detail: \"AirTable url address.\",\r\n                },\r\n                {\r\n                    name: \"sort_column\",\r\n                    detail: \"The index of the column in current AirTable view containing the values by which to sort.\",\r\n                },\r\n                {\r\n                    name: \"is_ascending\",\r\n                    detail:\r\n                        \"[Optional] - 1 or 0 indicating whether to sort `sort_column` in ascending order. 0 sorts in descending order.1 sorts in ascending order.\",\r\n                },\r\n            ],\r\n        },\r\n        ASK_AI: {\r\n            d: \"Ask the AI questions.\",\r\n            a: \"Ask the AI questions.\",\r\n            p: [\r\n                {\r\n                    name: \"question\",\r\n                    detail: \"Consult AI for the data you want.\",\r\n                },\r\n                {\r\n                    name: \"criteria_range\",\r\n                    detail: \"In which range to process the data.\",\r\n                },\r\n            ],\r\n        },\r\n        COUNTIFS: {\r\n            d: \"Returns the count of a range depending on multiple criteria.\",\r\n            a: \"Count values depending on multiple criteria.\",\r\n            p: [\r\n                {\r\n                    name: \"criteria_range1\",\r\n                    detail: \"The range to check against `criterion1`.\",\r\n                },\r\n                {\r\n                    name: \"criterion1\",\r\n                    detail: \"The pattern or test to apply to `criteria_range1`.\",\r\n                },\r\n                {\r\n                    name: \"criteria_range2\",\r\n                    detail: \"Additional ranges to check.\",\r\n                },\r\n            ],\r\n        },\r\n        PRODUCT: {\r\n            d: \"Returns the result of multiplying a series of numbers together.\",\r\n            a: \"Result of multiplying a series of numbers together.\",\r\n            p: [\r\n                {\r\n                    name: \"factor1\",\r\n                    detail: \"The first number or range to calculate for the product.\",\r\n                },\r\n                {\r\n                    name: \"factor2\",\r\n                    detail: \"More numbers or ranges to calculate for the product.\",\r\n                },\r\n            ],\r\n        },\r\n        HARMEAN: {\r\n            d: \"Calculates the harmonic mean of a dataset.\",\r\n            a: \"The harmonic mean of a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range of the population.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to include in the population.\",\r\n                },\r\n            ],\r\n        },\r\n        HYPGEOMDIST: {\r\n            d:\r\n                \"Calculates the probability of drawing a certain number of successes in a certain number of tries given a population of a certain size containing a certain number of successes, without replacement of draws.\",\r\n            a: \"Hypergeometric distribution probability.\",\r\n            p: [\r\n                {\r\n                    name: \"num_successes\",\r\n                    detail: \"The desired number of successes.\",\r\n                },\r\n                {\r\n                    name: \"num_draws\",\r\n                    detail: \"The number of permitted draws.\",\r\n                },\r\n                {\r\n                    name: \"successes_in_pop\",\r\n                    detail: \"The total number of successes in the population.\",\r\n                },\r\n                {\r\n                    name: \"pop_size\",\r\n                    detail: \"The total size of the population\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"Determine the logical value of the function form. \\n\\nIf cumulative is TRUE(), HYPGEOM.DIST returns the cumulative distribution function;\\n\\nif FALSE(), it returns the probability density function.\",\r\n                },\r\n            ],\r\n        },\r\n        INTERCEPT: {\r\n            d:\r\n                \"Calculates the y-value at which the line resulting from linear regression of a dataset will intersect the y-axis (x=0).\",\r\n            a: \"Y-intercept of line derived via linear regression.\",\r\n            p: [\r\n                {\r\n                    name: \"data_y\",\r\n                    detail: \"The range representing the array or matrix of dependent data.\",\r\n                },\r\n                {\r\n                    name: \"data_x\",\r\n                    detail: \"The range representing the array or matrix of independent data.\",\r\n                },\r\n            ],\r\n        },\r\n        KURT: {\r\n            d:\r\n                'Calculates the kurtosis of a dataset, which describes the shape, and in particular the \"peakedness\" of that dataset.',\r\n            a: \"Kurtosis of a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range of the dataset.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to include in the dataset.\",\r\n                },\r\n            ],\r\n        },\r\n        LARGE: {\r\n            d: \"Returns the nth largest element from a data set, where n is user-defined.\",\r\n            a: \"Nth largest element from a data set.\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"Array or range containing the dataset to consider.\",\r\n                },\r\n                {\r\n                    name: \"n\",\r\n                    detail: \"The rank from largest to smallest of the element to return.\",\r\n                },\r\n            ],\r\n        },\r\n        STDEVA: {\r\n            d: \"Calculates the standard deviation based on a sample, setting text to the value `0`.\",\r\n            a: \"Standard deviation of sample (text as 0).\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range of the sample.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to include in the sample.\",\r\n                },\r\n            ],\r\n        },\r\n        STDEVP: {\r\n            d: \"Calculates the standard deviation based on an entire population.\",\r\n            a: \"Standard deviation of an entire population.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range of the population.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to include in the population.\",\r\n                },\r\n            ],\r\n        },\r\n        GEOMEAN: {\r\n            d: \"Calculates the geometric mean of a dataset.\",\r\n            a: \"The geometric mean of a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range of the population.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to include in the population.\",\r\n                },\r\n            ],\r\n        },\r\n        RANK_EQ: {\r\n            d:\r\n                \"Returns the rank of a specified value in a dataset. If there is more than one entry of the same value in the dataset, the top rank of the entries will be returned.\",\r\n            a: \"Top rank of a specified value in a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value whose rank will be determined.\",\r\n                },\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"The array or range containing the dataset to consider.\",\r\n                },\r\n                {\r\n                    name: \"is_ascending\",\r\n                    detail:\r\n                        \"Whether to consider the values in `data` in descending or ascending order. If omitted, the default is descending (FALSE).\",\r\n                },\r\n            ],\r\n        },\r\n        RANK_AVG: {\r\n            d:\r\n                \"Returns the rank of a specified value in a dataset. If there is more than one entry of the same value in the dataset, the average rank of the entries will be returned.\",\r\n            a: \"Average rank of a specified value in a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value whose rank will be determined.\",\r\n                },\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"The array or range containing the dataset to consider.\",\r\n                },\r\n                {\r\n                    name: \"is_ascending\",\r\n                    detail:\r\n                        \"Whether to consider the values in `data` in descending or ascending order. If omitted, the default is descending (FALSE).\",\r\n                },\r\n            ],\r\n        },\r\n        PERCENTRANK_EXC: {\r\n            d: \"Returns the percentage rank (percentile) from 0 to 1 exclusive of a specified value in a dataset.\",\r\n            a: \"Percentage rank (percentile) from 0 to 1 exclusive.\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"The array or range containing the dataset to consider.\",\r\n                },\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value whose percentage rank will be determined.\",\r\n                },\r\n                {\r\n                    name: \"significant_digits\",\r\n                    detail: \"The number of significant figures to use in the calculation. Default is 3.\",\r\n                },\r\n            ],\r\n        },\r\n        PERCENTRANK_INC: {\r\n            d: \"Returns the percentage rank (percentile) from 0 to 1 inclusive of a specified value in a dataset.\",\r\n            a: \"Percentage rank (percentile) from 0 to 1 inclusive.\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"The array or range containing the dataset to consider.\",\r\n                },\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value whose percentage rank will be determined.\",\r\n                },\r\n                {\r\n                    name: \"significant_digits\",\r\n                    detail: \"The number of significant figures to use in the calculation. Default is 3.\",\r\n                },\r\n            ],\r\n        },\r\n        FORECAST: {\r\n            d: \"Calculates the expected y-value for a specified x based on a linear regression of a dataset.\",\r\n            a: \"Expected y-value based of linear regression.\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"The value on the x-axis to forecast.\",\r\n                },\r\n                {\r\n                    name: \"data_y\",\r\n                    detail: \"The range representing the array or matrix of dependent data.\",\r\n                },\r\n                {\r\n                    name: \"data_x\",\r\n                    detail: \"The range representing the array or matrix of independent data.\",\r\n                },\r\n            ],\r\n        },\r\n        FISHERINV: {\r\n            d: \"Returns the inverse Fisher transformation of a specified value.\",\r\n            a: \"Inverse fisher transformation of a specified value.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value for which to calculate the inverse Fisher transformation.\",\r\n                },\r\n            ],\r\n        },\r\n        FISHER: {\r\n            d: \"Returns the Fisher transformation of a specified value.\",\r\n            a: \"Fisher transformation of a specified value.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value for which to calculate the Fisher transformation.\",\r\n                },\r\n            ],\r\n        },\r\n        MODE_SNGL: {\r\n            d: \"Returns the most commonly occurring value in a dataset.\",\r\n            a: \"Most commonly occurring value in a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range to consider when calculating mode.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to consider when calculating mode.\",\r\n                },\r\n            ],\r\n        },\r\n        WEIBULL_DIST: {\r\n            d:\r\n                \"Returns the value of the Weibull distribution function (or Weibull cumulative distribution function) for a specified shape and scale.\",\r\n            a: \"Weibull distribution function.\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"The input to the Weibull distribution function.\",\r\n                },\r\n                {\r\n                    name: \"shape\",\r\n                    detail: \"The shape parameter of the Weibull distribution function.\",\r\n                },\r\n                {\r\n                    name: \"scale\",\r\n                    detail: \"The scale parameter of the Weibull distribution function.\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail: \"Whether to use the cumulative distribution function.\",\r\n                },\r\n            ],\r\n        },\r\n        COUNT: {\r\n            d: \"Returns the number of numeric values in a dataset.\",\r\n            a: \"The number of numeric values in dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range to consider when counting.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to consider when counting.\",\r\n                },\r\n            ],\r\n        },\r\n        COUNTA: {\r\n            d: \"Returns the number of values in a dataset.\",\r\n            a: \"The number of values in a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range to consider when counting.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to consider when counting.\",\r\n                },\r\n            ],\r\n        },\r\n        AVEDEV: {\r\n            d: \"Calculates the average of the magnitudes of deviations of data from a dataset's mean.\",\r\n            a: \"Average magnitude of deviations from mean.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range of the sample.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to include in the sample.\",\r\n                },\r\n            ],\r\n        },\r\n        AVERAGE: {\r\n            d: \"Returns the numerical average value in a dataset, ignoring text.\",\r\n            a: \"Numerical average value in a dataset, ignoring text.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range to consider when calculating the average value.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to consider when calculating the average value.\",\r\n                },\r\n            ],\r\n        },\r\n        AVERAGEA: {\r\n            d: \"Returns the numerical average value in a dataset.\",\r\n            a: \"Numerical average value in a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range to consider when calculating the average value.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to consider when calculating the average value.\",\r\n                },\r\n            ],\r\n        },\r\n        BINOM_DIST: {\r\n            d:\r\n                \"Calculates the probability of drawing a certain number of successes (or a maximum number of successes) in a certain number of tries given a population of a certain size containing a certain number of successes, with replacement of draws.\",\r\n            a: \"Binomial distribution probability.\",\r\n            p: [\r\n                {\r\n                    name: \"num_successes\",\r\n                    detail: \"The number of successes for which to calculate the probability in `num_trials` trials.\",\r\n                },\r\n                {\r\n                    name: \"num_trials\",\r\n                    detail: \"The number of independent trials.\",\r\n                },\r\n                {\r\n                    name: \"prob_success\",\r\n                    detail: \"The probability of success in any given trial.\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail: \"Whether to use the binomial cumulative distribution.\",\r\n                },\r\n            ],\r\n        },\r\n        BINOM_INV: {\r\n            d:\r\n                \"Calculates the smallest value for which the cumulative binomial distribution is greater than or equal to a specified criteria.\",\r\n            a: \"Inverse cumulative binomial distribution function.\",\r\n            p: [\r\n                {\r\n                    name: \"num_trials\",\r\n                    detail: \"The number of independent trials.\",\r\n                },\r\n                {\r\n                    name: \"prob_success\",\r\n                    detail: \"The probability of success in any given trial.\",\r\n                },\r\n                {\r\n                    name: \"target_prob\",\r\n                    detail: \"The desired threshold probability.\",\r\n                },\r\n            ],\r\n        },\r\n        CONFIDENCE_NORM: {\r\n            d: \"Calculates the width of half the confidence interval for a normal distribution.\",\r\n            a: \"Confidence interval for a normal distribution.\",\r\n            p: [\r\n                {\r\n                    name: \"alpha\",\r\n                    detail: \"One minus the desired confidence level. E.g. `0.1` for `0.9`, or 90%, confidence.\",\r\n                },\r\n                {\r\n                    name: \"standard_deviation\",\r\n                    detail: \"The standard deviation of the population.\",\r\n                },\r\n                {\r\n                    name: \"pop_size\",\r\n                    detail: \"The size of the population.\",\r\n                },\r\n            ],\r\n        },\r\n        CORREL: {\r\n            d: \"Calculates r, the Pearson product-moment correlation coefficient of a dataset.\",\r\n            a: \"Pearson Product-Moment Correlation Coefficient.\",\r\n            p: [\r\n                {\r\n                    name: \"data_y\",\r\n                    detail: \"The range representing the array or matrix of dependent data.\",\r\n                },\r\n                {\r\n                    name: \"data_x\",\r\n                    detail: \"The range representing the array or matrix of independent data.\",\r\n                },\r\n            ],\r\n        },\r\n        COVARIANCE_P: {\r\n            d: \"Calculates the covariance of a dataset.\",\r\n            a: \"The covariance of a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"data_y\",\r\n                    detail: \"The range representing the array or matrix of dependent data.\",\r\n                },\r\n                {\r\n                    name: \"data_x\",\r\n                    detail: \"The range representing the array or matrix of independent data.\",\r\n                },\r\n            ],\r\n        },\r\n        COVARIANCE_S: {\r\n            d: \"Calculates the sample covariance of a dataset.\",\r\n            a: \"The sample covariance of a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"data_y\",\r\n                    detail: \"The range representing the array or matrix of dependent data.\",\r\n                },\r\n                {\r\n                    name: \"data_x\",\r\n                    detail: \"The range representing the array or matrix of independent data.\",\r\n                },\r\n            ],\r\n        },\r\n        DEVSQ: {\r\n            d: \"Calculates the sum of squares of deviations based on a sample.\",\r\n            a: \"The sum of squares of deviations based on a sample.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range of the sample.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to include in the sample.\",\r\n                },\r\n            ],\r\n        },\r\n        EXPON_DIST: {\r\n            d:\r\n                \"Returns the value of the exponential distribution function with a specified lambda at a specified value.\",\r\n            a: \"Exponential distribution function.\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"The input to the exponential distribution function.\",\r\n                },\r\n                {\r\n                    name: \"lambda\",\r\n                    detail: \"The lambda to specify the exponential distribution function.\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail: \"Whether to use the exponential cumulative distribution.\",\r\n                },\r\n            ],\r\n        },\r\n        AVERAGEIF: {\r\n            d: \"Returns the average of a range depending on criteria.\",\r\n            a: \"Average of values depending on criteria.\",\r\n            p: [\r\n                {\r\n                    name: \"criteria_range\",\r\n                    detail: \"The range to check against `criterion`.\",\r\n                },\r\n                {\r\n                    name: \"criterion\",\r\n                    detail: \"The pattern or test to apply to `criteria_range`.\",\r\n                },\r\n                {\r\n                    name: \"average_range\",\r\n                    detail: \"The range to average. If not included, `criteria_range` is used for the average instead.\",\r\n                },\r\n            ],\r\n        },\r\n        AVERAGEIFS: {\r\n            d: \"Returns the average of a range depending on multiple criteria.\",\r\n            a: \"Average of values depending on multiple criteria.\",\r\n            p: [\r\n                {\r\n                    name: \"average_range\",\r\n                    detail: \"The range to average.\",\r\n                },\r\n                {\r\n                    name: \"criteria_range1\",\r\n                    detail: \"The range to check against `criterion1`.\",\r\n                },\r\n                {\r\n                    name: \"criterion1\",\r\n                    detail: \"The pattern or test to apply to `criteria_range1`.\",\r\n                },\r\n                {\r\n                    name: \"criteria_range2\",\r\n                    detail: \"Additional ranges to check.\",\r\n                },\r\n            ],\r\n        },\r\n        PERMUT: {\r\n            d:\r\n                \"Returns the number of ways to choose some number of objects from a pool of a given size of objects, considering order.\",\r\n            a: \"Number of permutations from a number of objects.\",\r\n            p: [\r\n                {\r\n                    name: \"n\",\r\n                    detail: \"The size of the pool of objects to choose from.\",\r\n                },\r\n                {\r\n                    name: \"k\",\r\n                    detail: \"The number of objects to choose.\",\r\n                },\r\n            ],\r\n        },\r\n        TRIMMEAN: {\r\n            d:\r\n                \"Calculates the mean of a dataset excluding some proportion of data from the high and low ends of the dataset.\",\r\n            a: \"Mean of a dataset excluding high/low ends.\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"Array or range containing the dataset to consider.\",\r\n                },\r\n                {\r\n                    name: \"exclude_proportion\",\r\n                    detail: \"The proportion of the dataset to exclude, from the extremities of the set.\",\r\n                },\r\n            ],\r\n        },\r\n        PERCENTILE_EXC: {\r\n            d: \"Returns the value at a given percentile of a dataset exclusive of 0 and 1.\",\r\n            a: \"Value at a given percentile of a dataset exclusive of 0 and 1.\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"The array or range containing the dataset to consider.\",\r\n                },\r\n                {\r\n                    name: \"percentile\",\r\n                    detail:\r\n                        \"The percentile, exclusive of 0 and 1, whose value within 'data' will be calculated and returned.\",\r\n                },\r\n            ],\r\n        },\r\n        PERCENTILE_INC: {\r\n            d: \"Returns the value at a given percentile of a dataset.\",\r\n            a: \"Value at a given percentile of a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"The array or range containing the dataset to consider.\",\r\n                },\r\n                {\r\n                    name: \"percentile\",\r\n                    detail: \"The percentile whose value within `data` will be calculated and returned.`\",\r\n                },\r\n            ],\r\n        },\r\n        PEARSON: {\r\n            d: \"Calculates r, the Pearson product-moment correlation coefficient of a dataset.\",\r\n            a: \"Pearson Product-Moment Correlation Coefficient.\",\r\n            p: [\r\n                {\r\n                    name: \"data_y\",\r\n                    detail: \"The range representing the array or matrix of dependent data.\",\r\n                },\r\n                {\r\n                    name: \"data_x\",\r\n                    detail: \"The range representing the array or matrix of independent data.\",\r\n                },\r\n            ],\r\n        },\r\n        NORM_S_INV: {\r\n            d: \"Returns the value of the inverse standard normal distribution function for a specified value.\",\r\n            a: \"Inverse standard normal distribution function.\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"The input to the inverse standard normal distribution function.\",\r\n                },\r\n            ],\r\n        },\r\n        NORM_S_DIST: {\r\n            d: \"Returns the value of the standard normal cumulative distribution function for a specified value.\",\r\n            a: \"Standard normal cumulative distribution function.\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"The input to the standard normal cumulative distribution function.\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"Determine the logical value of the function form. \\n\\nIf TRUE(), it returns the cumulative distribution function;\\n\\nIf it is FALSE(), it returns the probability density function.\",\r\n                },\r\n            ],\r\n        },\r\n        NORM_INV: {\r\n            d:\r\n                \"Returns the value of the inverse normal distribution function for a specified value, mean, and standard deviation.\",\r\n            a: \"Inverse normal distribution function.\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"The input to the inverse normal distribution function.\",\r\n                },\r\n                {\r\n                    name: \"mean\",\r\n                    detail: \"The mean (mu) of the normal distribution function.\",\r\n                },\r\n                {\r\n                    name: \"standard_deviation\",\r\n                    detail: \"The standard deviation (sigma) of the normal distribution function.\",\r\n                },\r\n            ],\r\n        },\r\n        NORM_DIST: {\r\n            d:\r\n                \"Returns the value of the normal distribution function (or normal cumulative distribution function) for a specified value, mean, and standard deviation.\",\r\n            a: \"Normal distribution function.\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"The input to the normal distribution function.\",\r\n                },\r\n                {\r\n                    name: \"mean\",\r\n                    detail: \"The mean (mu) of the normal distribution function.\",\r\n                },\r\n                {\r\n                    name: \"standard_deviation\",\r\n                    detail: \"The standard deviation (sigma) of the normal distribution function.\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"Whether to use the normal cumulative distribution function rather than the distribution function.\",\r\n                },\r\n            ],\r\n        },\r\n        NEGBINOM_DIST: {\r\n            d:\r\n                \"Calculates the probability of drawing a certain number of failures before a certain number of successes given a probability of success in independent trials.\",\r\n            a: \"Negative binomial distribution probability.\",\r\n            p: [\r\n                {\r\n                    name: \"num_failures\",\r\n                    detail: \"The number of failures to model.\",\r\n                },\r\n                {\r\n                    name: \"num_successes\",\r\n                    detail: \"The number of successes to model.\",\r\n                },\r\n                {\r\n                    name: \"prob_success\",\r\n                    detail: \"The probability of success in any given trial.\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"Determine the logical value of the function form. \\n\\nIf TRUE(), it returns the cumulative distribution function;\\n\\nIf it is FALSE(), it returns the probability density function.\",\r\n                },\r\n            ],\r\n        },\r\n        MINA: {\r\n            d: \"Returns the minimum numeric value in a dataset.\",\r\n            a: \"Minimum numeric value in a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range to consider when calculating the minimum value.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to consider when calculating the minimum value.\",\r\n                },\r\n            ],\r\n        },\r\n        MIN: {\r\n            d: \"Returns the minimum value in a numeric dataset.\",\r\n            a: \"Minimum value in a numeric dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range to consider when calculating the minimum value.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to consider when calculating the minimum value.\",\r\n                },\r\n            ],\r\n        },\r\n        MEDIAN: {\r\n            d: \"Returns the median value in a numeric dataset.\",\r\n            a: \"Median value in a numeric dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range to consider when calculating the median value.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to consider when calculating the median value.\",\r\n                },\r\n            ],\r\n        },\r\n        MAXA: {\r\n            d: \"Returns the maximum numeric value in a dataset.\",\r\n            a: \"Maximum numeric value in a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range to consider when calculating the maximum value.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to consider when calculating the maximum value.\",\r\n                },\r\n            ],\r\n        },\r\n        MAX: {\r\n            d: \"Returns the maximum value in a numeric dataset.\",\r\n            a: \"Maximum value in a numeric dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range to consider when calculating the maximum value.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to consider when calculating the maximum value.\",\r\n                },\r\n            ],\r\n        },\r\n        LOGNORM_INV: {\r\n            d:\r\n                \"Returns the value of the inverse log-normal cumulative distribution with given mean and standard deviation at a specified value.\",\r\n            a: \"Inverse log-normal cumulative distribution function.\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"The input to the inverse log-normal cumulative distribution function.\",\r\n                },\r\n                {\r\n                    name: \"mean\",\r\n                    detail: \"The mean (mu) of the inverse log-normal cumulative distribution function.\",\r\n                },\r\n                {\r\n                    name: \"standard_deviation\",\r\n                    detail:\r\n                        \"The standard deviation (sigma) of the inverse log-normal cumulative distribution function.\",\r\n                },\r\n            ],\r\n        },\r\n        LOGNORM_DIST: {\r\n            d:\r\n                \"Returns the value of the log-normal cumulative distribution with given mean and standard deviation at a specified value.\",\r\n            a: \"Log-normal cumulative distribution probability.\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"The input to the log-normal cumulative distribution function.\",\r\n                },\r\n                {\r\n                    name: \"mean\",\r\n                    detail: \"The mean (mu) of the log-normal cumulative distribution function.\",\r\n                },\r\n                {\r\n                    name: \"standard_deviation\",\r\n                    detail: \"The standard deviation (sigma) of the log-normal cumulative distribution function.\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"Determine the logical value of the function form. \\n\\nIf TRUE(), it returns the cumulative distribution function;\\n\\nIf it is FALSE(), it returns the probability density function.\",\r\n                },\r\n            ],\r\n        },\r\n        Z_TEST: {\r\n            d: \"Returns the one-tailed p-value of a Z-test with standard distribution.\",\r\n            a: \"One-tailed p-value of a z-test.\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"The array or range containing the dataset to consider.\",\r\n                },\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The test statistic to use in the Z-test.\",\r\n                },\r\n                {\r\n                    name: \"standard_deviation\",\r\n                    detail:\r\n                        \"The standard deviation to assume for the Z-test. If this is not provided, the standard deviation of the data will be used.\",\r\n                },\r\n            ],\r\n        },\r\n        PROB: {\r\n            d:\r\n                \"Given a set of values and corresponding probabilities, calculates the probability that a value chosen at random falls between two limits.\",\r\n            a: \"Probability values lie in a range.\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"Array or range containing the dataset to consider.\",\r\n                },\r\n                {\r\n                    name: \"probabilities\",\r\n                    detail: \"Array or range containing probabilities corresponding to `data`.\",\r\n                },\r\n                {\r\n                    name: \"low_limit\",\r\n                    detail: \"The lower bound on the value range for which to calculate the probability.\",\r\n                },\r\n                {\r\n                    name: \"high_limit\",\r\n                    detail: \"The upper bound on the value range for which to calculate the probability.\",\r\n                },\r\n            ],\r\n        },\r\n        QUARTILE_EXC: {\r\n            d: \"Returns a value nearest to a specified quartile of a dataset exclusive of 0 and 4.\",\r\n            a: \"Value nearest to a specific quartile of a dataset exclusive of 0 and 4.\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"The array or range containing the dataset to consider.\",\r\n                },\r\n                {\r\n                    name: \"quartile_number\",\r\n                    detail: \"Which quartile to return.\",\r\n                },\r\n            ],\r\n        },\r\n        QUARTILE_INC: {\r\n            d: \"Returns a value nearest to a specified quartile of a dataset.\",\r\n            a: \"Value nearest to a specific quartile of a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"The array or range containing the dataset to consider.\",\r\n                },\r\n                {\r\n                    name: \"quartile_number\",\r\n                    detail: \"Which quartile value to return.\",\r\n                },\r\n            ],\r\n        },\r\n        POISSON_DIST: {\r\n            d:\r\n                \"Returns the value of the Poisson distribution function (or Poisson cumulative distribution function) for a specified value and mean.\",\r\n            a: \"Poisson distribution function.\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"The input to the Poisson distribution function.\",\r\n                },\r\n                {\r\n                    name: \"mean\",\r\n                    detail: \"The mean (mu) of the Poisson distribution function.\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"Whether to use the Poisson cumulative distribution function rather than the distribution function.\",\r\n                },\r\n            ],\r\n        },\r\n        RSQ: {\r\n            d: \"Calculates the square of r, the Pearson product-moment correlation coefficient of a dataset.\",\r\n            a: \"Square of the correlation coefficient.\",\r\n            p: [\r\n                {\r\n                    name: \"data_y\",\r\n                    detail: \"The range representing the array or matrix of dependent data.\",\r\n                },\r\n                {\r\n                    name: \"data_x\",\r\n                    detail: \"The range representing the array or matrix of independent data.\",\r\n                },\r\n            ],\r\n        },\r\n        T_DIST: {\r\n            d: \"Calculates the left tail probability for a Student's t-distribution with a given input (x).\",\r\n            a: \"The left-tailed Student's t-distribution\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"The input to the t-distribution function.\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom\",\r\n                    detail: \"The number of degrees of freedom.\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"If cumulative is TRUE, T.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\",\r\n                },\r\n            ],\r\n        },\r\n        T_DIST_2T: {\r\n            d: \"Calculates the probability for two tailed Student's t-distribution with a given input (x).\",\r\n            a: \"The two tailed Student's t-distribution\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"The input to the t-distribution function.\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom\",\r\n                    detail: \"The number of degrees of freedom.\",\r\n                },\r\n            ],\r\n        },\r\n        T_DIST_RT: {\r\n            d: \"Calculates the right tail probability for a Student's t-distribution with a given input (x).\",\r\n            a: \"The right-tailed Student's t-distribution\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"The input to the t-distribution function.\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom\",\r\n                    detail: \"The number of degrees of freedom.\",\r\n                },\r\n            ],\r\n        },\r\n        T_INV: {\r\n            d: \"Calculates the negative inverse of the one-tailed TDIST function.\",\r\n            a: \"T.INV\",\r\n            p: [\r\n                {\r\n                    name: \"probability\",\r\n                    detail: \"The probability associated with the two-tailed t-distribution.\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom\",\r\n                    detail: \"The number of degrees of freedom.\",\r\n                },\r\n            ],\r\n        },\r\n        T_INV_2T: {\r\n            d: \"Calculates the inverse of the two-tailed TDIST function.\",\r\n            a: \"T.INV.2T\",\r\n            p: [\r\n                {\r\n                    name: \"probability\",\r\n                    detail: \"The probability associated with the two-tailed t-distribution.\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom\",\r\n                    detail: \"The number of degrees of freedom.\",\r\n                },\r\n            ],\r\n        },\r\n        T_TEST: {\r\n            d:\r\n                \"t-test. Returns the probability associated with Student's t-test. Determines whether two samples are likely to have come from the same two underlying populations that have the same mean.\",\r\n            a: \"Returns the probability associated with t-test.\",\r\n            p: [\r\n                {\r\n                    name: \"range1\",\r\n                    detail: \"The first sample of data or group of cells to consider for the t-test.\",\r\n                },\r\n                {\r\n                    name: \"range2\",\r\n                    detail: \"The second sample of data or group of cells to consider for the t-test.\",\r\n                },\r\n                {\r\n                    name: \"tails\",\r\n                    detail: \"Specifies the number of distribution tails.\",\r\n                },\r\n                {\r\n                    name: \"type\",\r\n                    detail: \"Specifies the type of t-test.\",\r\n                },\r\n            ],\r\n        },\r\n        F_DIST: {\r\n            d:\r\n                \"Calculates the left-tailed F probability distribution (degree of diversity) for two data sets with given input x. Alternately called Fisher-Snedecor distribution or Snedecor's F distribution.\",\r\n            a: \"F probability distribution (left-tailed).\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail:\r\n                        \"The input to the F probability distribution function. The value at which to evaluate the function.\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom1\",\r\n                    detail: \"The numerator of the number of degrees of freedom.\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom2\",\r\n                    detail: \"The denominator of the number of degrees of freedom.\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail: \"Logical value that determines the form of the function.\",\r\n                },\r\n            ],\r\n        },\r\n        F_DIST_RT: {\r\n            d:\r\n                \"Calculates the right-tailed F probability distribution (degree of diversity) for two data sets with given input x. Alternately called Fisher-Snedecor distribution or Snedecor's F distribution.\",\r\n            a: \"F probability distribution.\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail:\r\n                        \"The input to the F probability distribution function. The value at which to evaluate the function.\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom1\",\r\n                    detail: \"The numerator of the number of degrees of freedom.\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom2\",\r\n                    detail: \"The denominator of the number of degrees of freedom.\",\r\n                },\r\n            ],\r\n        },\r\n        VAR_P: {\r\n            d: \"Calculates the variance based on an entire population.\",\r\n            a: \"Variance of entire population.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range of the population.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to include in the population.\",\r\n                },\r\n            ],\r\n        },\r\n        VAR_S: {\r\n            d: \"Calculates the variance based on a sample.\",\r\n            a: \"Variance.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range of the sample.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to include in the sample.\",\r\n                },\r\n            ],\r\n        },\r\n        VARA: {\r\n            d: \"Calculates the variance based on a sample, setting text to the value `0`.\",\r\n            a: \"Variance of sample (text as 0).\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range of the sample.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to include in the sample.\",\r\n                },\r\n            ],\r\n        },\r\n        VARPA: {\r\n            d: \"Calculates the variance based on an entire population, setting text to the value `0`.\",\r\n            a: \"Variance of entire population (text as 0).\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range of the population.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to include in the population.\",\r\n                },\r\n            ],\r\n        },\r\n        STEYX: {\r\n            d: \"Calculates the standard error of the predicted y-value for each x in the regression of a dataset.\",\r\n            a: \"Standard error of predicted y-values in regression.\",\r\n            p: [\r\n                {\r\n                    name: \"data_y\",\r\n                    detail: \"The range representing the array or matrix of dependent data.\",\r\n                },\r\n                {\r\n                    name: \"data_x\",\r\n                    detail: \"The range representing the array or matrix of independent data.\",\r\n                },\r\n            ],\r\n        },\r\n        STANDARDIZE: {\r\n            d:\r\n                \"Calculates the normalized equivalent of a random variable given mean and standard deviation of the distribution.\",\r\n            a: \"Normalized equivalent of a random variable.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value of the random variable to normalize.\",\r\n                },\r\n                {\r\n                    name: \"mean\",\r\n                    detail: \"The mean of the distribution.\",\r\n                },\r\n                {\r\n                    name: \"standard_deviation\",\r\n                    detail: \"The standard deviation of the distribution.\",\r\n                },\r\n            ],\r\n        },\r\n        SMALL: {\r\n            d: \"Returns the nth smallest element from a data set, where n is user-defined.\",\r\n            a: \"Nth smallest element in a data set.\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"The array or range containing the dataset to consider.\",\r\n                },\r\n                {\r\n                    name: \"n\",\r\n                    detail: \"The rank from smallest to largest of the element to return.\",\r\n                },\r\n            ],\r\n        },\r\n        SLOPE: {\r\n            d: \"Calculates the slope of the line resulting from linear regression of a dataset.\",\r\n            a: \"Slope of line from linear regression of data.\",\r\n            p: [\r\n                {\r\n                    name: \"data_y\",\r\n                    detail: \"The range representing the array or matrix of dependent data.\",\r\n                },\r\n                {\r\n                    name: \"data_x\",\r\n                    detail: \"The range representing the array or matrix of independent data.\",\r\n                },\r\n            ],\r\n        },\r\n        SKEW: {\r\n            d: \"Calculates the skewness of a dataset, which describes the symmetry of that dataset about the mean.\",\r\n            a: \"Skewness of a dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range of the dataset.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to include in the dataset.\",\r\n                },\r\n            ],\r\n        },\r\n        SKEW_P: {\r\n            d:\r\n                \"Calculates the skewness of a dataset, which describes the symmetry of that dataset about the mean. This assumes the dataset is for the population.\",\r\n            a: \"Skewness of a population's dataset.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value or range of the dataset.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional values or ranges to include in the dataset.\",\r\n                },\r\n            ],\r\n        },\r\n        VLOOKUP: {\r\n            d:\r\n                \"Vertical lookup. Searches down the first column of a range for a key and returns the value of a specified cell in the row found.\",\r\n            a: \"Vertical lookup.\",\r\n            p: [\r\n                {\r\n                    name: \"search_key\",\r\n                    detail: 'The value to search for. For example, `42`, `\"Cats\"`, or `I24`.',\r\n                },\r\n                {\r\n                    name: \"range\",\r\n                    detail:\r\n                        \"The range to consider for the search. The first column in the range is searched for the key specified in `search_key`.\",\r\n                },\r\n                {\r\n                    name: \"index\",\r\n                    detail:\r\n                        \"The column index of the value to be returned, where the first column in `range` is numbered 1.\",\r\n                },\r\n                {\r\n                    name: \"is_sorted\",\r\n                    detail:\r\n                        \"Indicates whether the column to be searched (the first column of the specified range) is sorted, in which case the closest match for `search_key` will be returned.\",\r\n                },\r\n            ],\r\n        },\r\n        HLOOKUP: {\r\n            d:\r\n                \"Horizontal lookup. Searches across the first row of a range for a key and returns the value of a specified cell in the column found.\",\r\n            a: \"Horizontal lookup\",\r\n            p: [\r\n                {\r\n                    name: \"search_key\",\r\n                    detail: 'The value to search for. For example, `42`, `\"Cats\"`, or `I24`.',\r\n                },\r\n                {\r\n                    name: \"range\",\r\n                    detail:\r\n                        \"The range to consider for the search. The first row in the range is searched for the key specified in `search_key`.\",\r\n                },\r\n                {\r\n                    name: \"index\",\r\n                    detail: \"The row index of the value to be returned, where the first row in `range` is numbered 1.\",\r\n                },\r\n                {\r\n                    name: \"is_sorted\",\r\n                    detail:\r\n                        \"Indicates whether the row to be searched (the first row of the specified range) is sorted.\",\r\n                },\r\n            ],\r\n        },\r\n        LOOKUP: {\r\n            d:\r\n                \"Looks through a sorted row or column for a key and returns the value of the cell in a result range located in the same position as the search row or column.\",\r\n            a: \"Look up a value.\",\r\n            p: [\r\n                {\r\n                    name: \"search_key\",\r\n                    detail: 'The value to search for in the row or column. For example, `42`, `\"Cats\"`, or `I24`.',\r\n                },\r\n                {\r\n                    name: \"search_range|search_result_array\",\r\n                    detail:\r\n                        \"One method of using this function is to provide a single sorted row or column `search_range` to look through for the `search_key` with a second argument `result_range`. The other way is to combine these two arguments into one `search_result_array` where the first row or column is searched and a value is returned from the last row or column in the array. If `search_key` is not found, a non-exact match may be returned.\",\r\n                },\r\n                {\r\n                    name: \"result_range\",\r\n                    detail:\r\n                        \"The range from which to return a result. The value returned corresponds to the location where `search_key` is found in `search_range`. This range must be only a single row or column and should not be used if using the `search_result_array` method.\",\r\n                },\r\n            ],\r\n        },\r\n        ADDRESS: {\r\n            d: \"Returns a cell reference as a string.\",\r\n            a: \"Cell reference as a string.\",\r\n            p: [\r\n                {\r\n                    name: \"row\",\r\n                    detail: \"The row number of the cell reference\",\r\n                },\r\n                {\r\n                    name: \"column\",\r\n                    detail: \"The column number (not name) of the cell reference. `A` is column number `1`.\",\r\n                },\r\n                {\r\n                    name: \"absolute_relative_mode\",\r\n                    detail:\r\n                        \"An indicator of whether the reference is row/column absolute. `1` is row and column absolute (e.g. $A$1), `2` is row absolute and column relative (e.g. A$1), `3` is row relative and column absolute (e.g. $A1), and `4` is row and column relative (e.g. A1).\",\r\n                },\r\n                {\r\n                    name: \"use_a1_notation\",\r\n                    detail:\r\n                        \"A boolean indicating whether to use `A1` style notation (TRUE) or `R1C1` style notation (FALSE).\",\r\n                },\r\n                {\r\n                    name: \"sheet\",\r\n                    detail: \"Text indicating the name of the sheet into which the address points.\",\r\n                },\r\n            ],\r\n        },\r\n        INDIRECT: {\r\n            d: \"Returns a cell reference specified by a string.\",\r\n            a: \"A cell reference specified by a string.\",\r\n            p: [\r\n                {\r\n                    name: \"cell_reference_as_string\",\r\n                    detail: \"A cell reference, written as a string with surrounding quotation marks.\",\r\n                },\r\n                {\r\n                    name: \"is_A1_notation\",\r\n                    detail: \"Indicates if the cell reference is in A1 notation (TRUE) or R1C1 notation (FALSE).\",\r\n                },\r\n            ],\r\n        },\r\n        ROW: {\r\n            d: \"Returns the row number of a specified cell.\",\r\n            a: \"Row number of a specified cell.\",\r\n            p: [\r\n                {\r\n                    name: \"cell_reference\",\r\n                    detail: \"The cell whose row number will be returned.\",\r\n                },\r\n            ],\r\n        },\r\n        ROWS: {\r\n            d: \"Returns the number of rows in a specified array or range.\",\r\n            a: \"Number of rows in a specified array or range.\",\r\n            p: [\r\n                {\r\n                    name: \"range\",\r\n                    detail: \"The range whose row count will be returned.\",\r\n                },\r\n            ],\r\n        },\r\n        COLUMN: {\r\n            d: \"Returns the column number of a specified cell, with `A=1`.\",\r\n            a: \"Column number of a specified cell.\",\r\n            p: [\r\n                {\r\n                    name: \"cell_reference\",\r\n                    detail: \"The cell whose column number will be returned. Column `A` corresponds to `1`.\",\r\n                },\r\n            ],\r\n        },\r\n        COLUMNS: {\r\n            d: \"Returns the number of columns in a specified array or range.\",\r\n            a: \"Number of columns in a specified array or range.\",\r\n            p: [\r\n                {\r\n                    name: \"range\",\r\n                    detail: \"The range whose column count will be returned.\",\r\n                },\r\n            ],\r\n        },\r\n        OFFSET: {\r\n            d:\r\n                \"Returns a range reference shifted a specified number of rows and columns from a starting cell reference.\",\r\n            a: \"A range reference offset relative to a cell.\",\r\n            p: [\r\n                {\r\n                    name: \"cell_reference\",\r\n                    detail: \"The starting point from which to count the offset rows and columns.\",\r\n                },\r\n                {\r\n                    name: \"offset_rows\",\r\n                    detail: \"The number of rows to offset by.\",\r\n                },\r\n                {\r\n                    name: \"offset_columns\",\r\n                    detail: \"The number of columns to offset by.\",\r\n                },\r\n                {\r\n                    name: \"height\",\r\n                    detail: \"The height of the range to return starting at the offset target.\",\r\n                },\r\n                {\r\n                    name: \"width\",\r\n                    detail: \"The width of the range to return starting at the offset target.\",\r\n                },\r\n            ],\r\n        },\r\n        MATCH: {\r\n            d: \"Returns the relative position of an item in a range that matches a specified value.\",\r\n            a: \"Position of item in range that matches value.\",\r\n            p: [\r\n                {\r\n                    name: \"search_key\",\r\n                    detail: 'The value to search for. For example, `42`, `\"Cats\"`, or `I24`.',\r\n                },\r\n                {\r\n                    name: \"range\",\r\n                    detail: \"The one-dimensional array to be searched.\",\r\n                },\r\n                {\r\n                    name: \"search_type\",\r\n                    detail:\r\n                        \"The search method. `1` (default) finds the largest value less than or equal to `search_key` when `range` is sorted in ascending order. `0` finds the exact value when `range` is unsorted. `-1` finds the smallest value greater than or equal to `search_key` when `range` is sorted in descending order.\",\r\n                },\r\n            ],\r\n        },\r\n        INDEX: {\r\n            d: \"Returns the content of a cell, specified by row and column offset.\",\r\n            a: \"Content of cell specified by row and column offset.\",\r\n            p: [\r\n                {\r\n                    name: \"reference\",\r\n                    detail: \"The array of cells to be offset into.\",\r\n                },\r\n                {\r\n                    name: \"row\",\r\n                    detail: \"The number of offset rows.\",\r\n                },\r\n                {\r\n                    name: \"column\",\r\n                    detail: \"The number of offset columns.\",\r\n                },\r\n            ],\r\n        },\r\n        GETPIVOTDATA: {\r\n            d:\r\n                \"Extracts an aggregated value from a pivot table that corresponds to the specified row and column headings.\",\r\n            a:\r\n                \"Extracts an aggregated value from a pivot table that corresponds to the specified row and column headings.\",\r\n            p: [\r\n                {\r\n                    name: \"value_name\",\r\n                    detail: \"The name of the value in the pivot table for which you want to get data.\",\r\n                },\r\n                {\r\n                    name: \"any_pivot_table_cell\",\r\n                    detail: \"Any reference to a cell in the desired pivot table (top corner recommended).\",\r\n                },\r\n                {\r\n                    name: \"original_column\",\r\n                    detail: \"The name of the column in the original data set (not the pivot table).\",\r\n                },\r\n                {\r\n                    name: \"pivot_item\",\r\n                    detail:\r\n                        \"The name of the row or column shown in the pivot table corresponding to *original_column* that you want to retrieve.\",\r\n                },\r\n            ],\r\n        },\r\n        CHOOSE: {\r\n            d: \"Returns an element from a list of choices based on index.\",\r\n            a: \"An element from a list of choices based on index.\",\r\n            p: [\r\n                {\r\n                    name: \"index\",\r\n                    detail: \"Which choice (of the up to 30 provided) to return.\",\r\n                },\r\n                {\r\n                    name: \"choice1\",\r\n                    detail:\r\n                        \"A potential value to return. Required. May be a reference to a cell or an individual value.\",\r\n                },\r\n                {\r\n                    name: \"choice2\",\r\n                    detail: \"Additional values among which to choose.\",\r\n                },\r\n            ],\r\n        },\r\n        HYPERLINK: {\r\n            d: \"Creates a hyperlink inside a cell.\",\r\n            a: \"Creates a hyperlink inside a cell.\",\r\n            p: [\r\n                {\r\n                    name: \"url\",\r\n                    detail:\r\n                        \"The full URL of the link location enclosed in quotation marks, or a reference to a cell containing such a URL.\",\r\n                },\r\n                {\r\n                    name: \"link_label\",\r\n                    detail:\r\n                        \"The text to display in the cell as the link, enclosed in quotation marks, or a reference to a cell containing such a label.\",\r\n                },\r\n            ],\r\n        },\r\n        TIME: {\r\n            d: \"Converts a provided hour, minute, and second into a time.\",\r\n            a: \"Converts hour/minute/second into a time.\",\r\n            p: [\r\n                {\r\n                    name: \"hour\",\r\n                    detail: \"The hour component of the time.\",\r\n                },\r\n                {\r\n                    name: \"minute\",\r\n                    detail: \"The minute component of the time.\",\r\n                },\r\n                {\r\n                    name: \"second\",\r\n                    detail: \"The second component of the time.\",\r\n                },\r\n            ],\r\n        },\r\n        TIMEVALUE: {\r\n            d: \"Returns the fraction of a 24-hour day the time represents.\",\r\n            a: \"Converts a time string into its serial number representation.\",\r\n            p: [\r\n                {\r\n                    name: \"time_string\",\r\n                    detail: \"The string that holds the time representation.\",\r\n                },\r\n            ],\r\n        },\r\n        EOMONTH: {\r\n            d:\r\n                \"Returns a date on the last day of a month that falls a specified number of months before or after another date.\",\r\n            a: \"Last day of a month before or after a date.\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail: \"The date from which to calculate the result.\",\r\n                },\r\n                {\r\n                    name: \"months\",\r\n                    detail: \"The number of months before (negative) or after (positive) 'start_date' to consider.\",\r\n                },\r\n            ],\r\n        },\r\n        EDATE: {\r\n            d: \"Returns a date a specified number of months before or after another date.\",\r\n            a: \"Date a number of months before/after another date.\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail: \"The date from which to calculate the result.\",\r\n                },\r\n                {\r\n                    name: \"months\",\r\n                    detail: \"The number of months before (negative) or after (positive) 'start_date' to calculate.\",\r\n                },\r\n            ],\r\n        },\r\n        SECOND: {\r\n            d: \"Returns the second component of a specific time, in numeric format.\",\r\n            a: \"Second component of a specific time.\",\r\n            p: [\r\n                {\r\n                    name: \"time\",\r\n                    detail: \"The time from which to calculate the second component\",\r\n                },\r\n            ],\r\n        },\r\n        MINUTE: {\r\n            d: \"Returns the minute component of a specific time, in numeric format.\",\r\n            a: \"Minute component of a specific time.\",\r\n            p: [\r\n                {\r\n                    name: \"time\",\r\n                    detail: \"The time from which to calculate the minute component.\",\r\n                },\r\n            ],\r\n        },\r\n        HOUR: {\r\n            d: \"Returns the hour component of a specific time, in numeric format.\",\r\n            a: \"Hour component of a specific time.\",\r\n            p: [\r\n                {\r\n                    name: \"time\",\r\n                    detail: \"The time from which to calculate the hour component.\",\r\n                },\r\n            ],\r\n        },\r\n        NOW: {\r\n            d: \"Returns the current date and time as a date value.\",\r\n            a: \"Current date and time as a date value.\",\r\n            p: [],\r\n        },\r\n        NETWORKDAYS: {\r\n            d: \"Returns the number of net working days between two provided days.\",\r\n            a: \"Net working days between two provided days.\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail: \"The start date of the period from which to calculate the number of net working days.\",\r\n                },\r\n                {\r\n                    name: \"end_date\",\r\n                    detail: \"The end date of the period from which to calculate the number of net working days.\",\r\n                },\r\n                {\r\n                    name: \"holidays\",\r\n                    detail: \"A range or array constant containing the date serial numbers to consider holidays.\",\r\n                },\r\n            ],\r\n        },\r\n        NETWORKDAYS_INTL: {\r\n            d:\r\n                \"Returns the number of net working days between two provided days excluding specified weekend days and holidays.\",\r\n            a: \"Net working days between two dates (specifying weekends).\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail: \"The start date of the period from which to calculate the number of net working days.\",\r\n                },\r\n                {\r\n                    name: \"end_date\",\r\n                    detail: \"The end date of the period from which to calculate the number of net working days.\",\r\n                },\r\n                {\r\n                    name: \"weekend\",\r\n                    detail: \"A number or string representing which days of the week are considered weekends.\",\r\n                },\r\n                {\r\n                    name: \"holidays\",\r\n                    detail: \"A range or array constant containing the dates to consider as holidays.\",\r\n                },\r\n            ],\r\n        },\r\n        ISOWEEKNUM: {\r\n            d: \"Returns a number representing the ISO week of the year where the provided date falls.\",\r\n            a: \"ISO week number of the year.\",\r\n            p: [\r\n                {\r\n                    name: \"date\",\r\n                    detail:\r\n                        \"The date for which to determine the ISO week number. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n                },\r\n            ],\r\n        },\r\n        WEEKNUM: {\r\n            d: \"Returns a number representing the week of the year where the provided date falls.\",\r\n            a: \"Week number of the year.\",\r\n            p: [\r\n                {\r\n                    name: \"date\",\r\n                    detail:\r\n                        \"The date for which to determine the week number. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n                },\r\n                {\r\n                    name: \"type\",\r\n                    detail: \"A number representing the day that a week starts on. Sunday = 1.\",\r\n                },\r\n            ],\r\n        },\r\n        WEEKDAY: {\r\n            d: \"Returns a number representing the day of the week of the date provided.\",\r\n            a: \"Day of the week of the date provided (as number).\",\r\n            p: [\r\n                {\r\n                    name: \"date\",\r\n                    detail:\r\n                        \"The date for which to determine the day of the week. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n                },\r\n                {\r\n                    name: \"type\",\r\n                    detail:\r\n                        \"A number indicating which numbering system to use to represent weekdays. By default, counts starting with Sunday = 1.\",\r\n                },\r\n            ],\r\n        },\r\n        DAY: {\r\n            d: \"Returns the day of the month that a specific date falls on, in numeric format.\",\r\n            a: \"Day of the month that a specific date falls on.\",\r\n            p: [\r\n                {\r\n                    name: \"date\",\r\n                    detail: \"The date from which to extract the day.\",\r\n                },\r\n            ],\r\n        },\r\n        DAYS: {\r\n            d: \"Returns the number of days between two dates.\",\r\n            a: \"Number of days between two dates.\",\r\n            p: [\r\n                {\r\n                    name: \"end_date\",\r\n                    detail: \"The end of the date range.\",\r\n                },\r\n                {\r\n                    name: \"start_date\",\r\n                    detail: \"The start of the date range.\",\r\n                },\r\n            ],\r\n        },\r\n        DAYS360: {\r\n            d:\r\n                \"Returns the difference between two days based on the 360 day year used in some financial interest calculations.\",\r\n            a: \"Days between two dates on a 360-day year.\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail:\r\n                        \"The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n                },\r\n                {\r\n                    name: \"end_date\",\r\n                    detail:\r\n                        \"The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n                },\r\n                {\r\n                    name: \"method\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        DATE: {\r\n            d: \"Converts a provided year, month, and day into a date.\",\r\n            a: \"Converts year/month/day into a date.\",\r\n            p: [\r\n                {\r\n                    name: \"year\",\r\n                    detail: \"The year component of the date.\",\r\n                },\r\n                {\r\n                    name: \"month\",\r\n                    detail: \"The month component of the date.\",\r\n                },\r\n                {\r\n                    name: \"day\",\r\n                    detail: \"The day component of the date.\",\r\n                },\r\n            ],\r\n        },\r\n        DATEVALUE: {\r\n            d: \"Converts a provided date string in a known format to a date value.\",\r\n            a: \"Converts a date string to a date value.\",\r\n            p: [\r\n                {\r\n                    name: \"date_string\",\r\n                    detail: \"The string representing the date.\",\r\n                },\r\n            ],\r\n        },\r\n        DATEDIF: {\r\n            d: \"Calculates the number of days, months, or years between two dates.\",\r\n            a: \"Date Difference.\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail:\r\n                        \"The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n                },\r\n                {\r\n                    name: \"end_date\",\r\n                    detail:\r\n                        \"The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n                },\r\n                {\r\n                    name: \"unit\",\r\n                    detail:\r\n                        'A string abbreviation for unit of time. For example, \"M\" for month. Accepted values are \"Y\",\"M\",\"D\",\"MD\",\"YM\",\"YD\".',\r\n                },\r\n            ],\r\n        },\r\n        WORKDAY: {\r\n            d: \"Calculates the date after a number of working days from a specified start date.\",\r\n            a: \"Number of working days from start date.\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail: \"The date from which to begin counting.\",\r\n                },\r\n                {\r\n                    name: \"num_days\",\r\n                    detail: \"The number of working days to advance from `start_date`. If negative, counts backwards.\",\r\n                },\r\n                {\r\n                    name: \"holidays\",\r\n                    detail: \"A range or array constant containing the dates to consider holidays.\",\r\n                },\r\n            ],\r\n        },\r\n        WORKDAY_INTL: {\r\n            d:\r\n                \"Calculates the date after a specified number of workdays excluding specified weekend days and holidays.\",\r\n            a: \"Date after a number of workdays (specifying weekends).\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail: \"The date from which to begin counting.\",\r\n                },\r\n                {\r\n                    name: \"num_days\",\r\n                    detail: \"The number of working days to advance from `start_date`. If negative, counts backwards.\",\r\n                },\r\n                {\r\n                    name: \"weekend\",\r\n                    detail: \"A number or string representing which days of the week are considered weekends.\",\r\n                },\r\n                {\r\n                    name: \"holidays\",\r\n                    detail: \"A range or array constant containing the dates to consider holidays.\",\r\n                },\r\n            ],\r\n        },\r\n        YEAR: {\r\n            d: \"Returns the year specified by a given date.\",\r\n            a: \"Year specified by a given date.\",\r\n            p: [\r\n                {\r\n                    name: \"date\",\r\n                    detail: \"The date from which to extract the year.\",\r\n                },\r\n            ],\r\n        },\r\n        YEARFRAC: {\r\n            d:\r\n                \"Returns the number of years, including fractional years, between two dates using a specified day count convention.\",\r\n            a: \"Exact number of years between two dates.\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail:\r\n                        \"The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n                },\r\n                {\r\n                    name: \"end_date\",\r\n                    detail:\r\n                        \"The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        TODAY: {\r\n            d: \"Returns the current date as a date value.\",\r\n            a: \"Current date as a date value.\",\r\n            p: [],\r\n        },\r\n        MONTH: {\r\n            d: \"Returns the month of the year a specific date falls in, in numeric format.\",\r\n            a: \"Month of the year a specific date falls in.\",\r\n            p: [\r\n                {\r\n                    name: \"date\",\r\n                    detail: \"The date from which to extract the month.\",\r\n                },\r\n            ],\r\n        },\r\n        EFFECT: {\r\n            d:\r\n                \"Calculates the annual effective interest rate given the nominal rate and number of compounding periods per year.\",\r\n            a: \"Annual effective interest rate.\",\r\n            p: [\r\n                {\r\n                    name: \"nominal_rate\",\r\n                    detail: \"The nominal interest rate per year.\",\r\n                },\r\n                {\r\n                    name: \"periods_per_year\",\r\n                    detail: \"The number of compounding periods per year.\",\r\n                },\r\n            ],\r\n        },\r\n        DOLLAR: {\r\n            d: \"Formats a number into the currency specific to your spreadsheet locale.\",\r\n            a: \"Formats a number as currency specific to your spreadsheet locale.\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"The value to be formatted.\",\r\n                },\r\n                {\r\n                    name: \"number_of_places\",\r\n                    detail: \"The number of decimal places to display.\",\r\n                },\r\n            ],\r\n        },\r\n        DOLLARDE: {\r\n            d: \"Converts a price quotation given as a decimal fraction into a decimal value.\",\r\n            a: \"Converts a decimal fraction to decimal value.\",\r\n            p: [\r\n                {\r\n                    name: \"fractional_price\",\r\n                    detail: \"The price quotation given using fractional decimal conventions.\",\r\n                },\r\n                {\r\n                    name: \"unit\",\r\n                    detail: \"The units of the fraction, e.g. `8` for 1/8ths or `32` for 1/32nds.\",\r\n                },\r\n            ],\r\n        },\r\n        DOLLARFR: {\r\n            d: \"Converts a price quotation given as a decimal value into a decimal fraction.\",\r\n            a: \"Converts a decimal value to decimal fraction.\",\r\n            p: [\r\n                {\r\n                    name: \"decimal_price\",\r\n                    detail: \"The price quotation given as a decimal value.\",\r\n                },\r\n                {\r\n                    name: \"unit\",\r\n                    detail: \"The units of the desired fraction, e.g. `8` for 1/8ths or `32` for 1/32nds.\",\r\n                },\r\n            ],\r\n        },\r\n        DB: {\r\n            d:\r\n                \"Calculates the depreciation of an asset for a specified period using the arithmetic declining balance method.\",\r\n            a: \"Depreciation via declining balance method.\",\r\n            p: [\r\n                {\r\n                    name: \"cost\",\r\n                    detail: \"The initial cost of the asset.\",\r\n                },\r\n                {\r\n                    name: \"salvage\",\r\n                    detail: \"The value of the asset at the end of depreciation.\",\r\n                },\r\n                {\r\n                    name: \"life\",\r\n                    detail: \"The number of periods over which the asset is depreciated.\",\r\n                },\r\n                {\r\n                    name: \"period\",\r\n                    detail: \"The single period within `life` for which to calculate depreciation.\",\r\n                },\r\n                {\r\n                    name: \"month\",\r\n                    detail: \"The number of months in the first year of depreciation.\",\r\n                },\r\n            ],\r\n        },\r\n        DDB: {\r\n            d:\r\n                \"Calculates the depreciation of an asset for a specified period using the double-declining balance method.\",\r\n            a: \"Depreciation via double-declining balance method.\",\r\n            p: [\r\n                {\r\n                    name: \"cost\",\r\n                    detail: \"The initial cost of the asset.\",\r\n                },\r\n                {\r\n                    name: \"salvage\",\r\n                    detail: \"The value of the asset at the end of depreciation.\",\r\n                },\r\n                {\r\n                    name: \"life\",\r\n                    detail: \"The number of periods over which the asset is depreciated.\",\r\n                },\r\n                {\r\n                    name: \"period\",\r\n                    detail: \"The single period within `life` for which to calculate depreciation.\",\r\n                },\r\n                {\r\n                    name: \"factor\",\r\n                    detail: \"The factor by which depreciation decreases.\",\r\n                },\r\n            ],\r\n        },\r\n        RATE: {\r\n            d:\r\n                \"Calculates the interest rate of an annuity investment based on constant-amount periodic payments and the assumption of a constant interest rate.\",\r\n            a: \"Interest rate of an annuity investment.\",\r\n            p: [\r\n                {\r\n                    name: \"number_of_periods\",\r\n                    detail: \"The number of payments to be made.\",\r\n                },\r\n                {\r\n                    name: \"payment_per_period\",\r\n                    detail: \"The amount per period to be paid.\",\r\n                },\r\n                {\r\n                    name: \"present_value\",\r\n                    detail: \"The current value of the annuity.\",\r\n                },\r\n                {\r\n                    name: \"future_value\",\r\n                    detail: \"The future value remaining after the final payment has been made.\",\r\n                },\r\n                {\r\n                    name: \"end_or_beginning\",\r\n                    detail: \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n                },\r\n                {\r\n                    name: \"rate_guess\",\r\n                    detail: \"An estimate for what the interest rate will be.\",\r\n                },\r\n            ],\r\n        },\r\n        CUMPRINC: {\r\n            d:\r\n                \"Calculates the cumulative principal paid over a range of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            a: \"Cumulative principal paid over a set of periods.\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The interest rate.\",\r\n                },\r\n                {\r\n                    name: \"number_of_periods\",\r\n                    detail: \"The number of payments to be made.\",\r\n                },\r\n                {\r\n                    name: \"present_value\",\r\n                    detail: \"The current value of the annuity.\",\r\n                },\r\n                {\r\n                    name: \"first_period\",\r\n                    detail: \"The number of the payment period to begin the cumulative calculation.\",\r\n                },\r\n                {\r\n                    name: \"last_period\",\r\n                    detail: \"The number of the payment period to end the cumulative calculation.\",\r\n                },\r\n                {\r\n                    name: \"end_or_beginning\",\r\n                    detail: \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n                },\r\n            ],\r\n        },\r\n        COUPNUM: {\r\n            d:\r\n                \"Calculates the number of coupons, or interest payments, between the settlement date and the maturity date of the investment.\",\r\n            a: \"Number of coupons between settlement and maturity.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail: \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        SYD: {\r\n            d: \"Calculates the depreciation of an asset for a specified period using the sum of years digits method.\",\r\n            a: \"Depreciation via sum of years digits method.\",\r\n            p: [\r\n                {\r\n                    name: \"cost\",\r\n                    detail: \"The initial cost of the asset.\",\r\n                },\r\n                {\r\n                    name: \"salvage\",\r\n                    detail: \"The value of the asset at the end of depreciation.\",\r\n                },\r\n                {\r\n                    name: \"life\",\r\n                    detail: \"The number of periods over which the asset is depreciated.\",\r\n                },\r\n                {\r\n                    name: \"period\",\r\n                    detail: \"The single period within `life` for which to calculate depreciation.\",\r\n                },\r\n            ],\r\n        },\r\n        TBILLEQ: {\r\n            d: \"Calculates the equivalent annualized rate of return of a US Treasury Bill based on discount rate.\",\r\n            a: \"Equivalent rate of return for a Treasury bill.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"discount\",\r\n                    detail: \"The discount rate of the bill at time of purchase.\",\r\n                },\r\n            ],\r\n        },\r\n        TBILLYIELD: {\r\n            d: \"Calculates the yield of a US Treasury Bill based on price.\",\r\n            a: \"The yield of a us treasury bill based on price.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"price\",\r\n                    detail: \"The price at which the security is bought per 100 face value.\",\r\n                },\r\n            ],\r\n        },\r\n        TBILLPRICE: {\r\n            d: \"Calculates the price of a US Treasury Bill based on discount rate.\",\r\n            a: \"Price of US treasury bill.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"discount\",\r\n                    detail: \"The discount rate of the bill at time of purchase.\",\r\n                },\r\n            ],\r\n        },\r\n        PV: {\r\n            d:\r\n                \"Calculates the present value of an annuity investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            a: \"Present value of an annuity investment.\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The interest rate.\",\r\n                },\r\n                {\r\n                    name: \"number_of_periods\",\r\n                    detail: \"The number of payments to be made.\",\r\n                },\r\n                {\r\n                    name: \"payment_amount\",\r\n                    detail: \"The amount per period to be paid.\",\r\n                },\r\n                {\r\n                    name: \"future_value\",\r\n                    detail: \"The future value remaining after the final payment has been made.\",\r\n                },\r\n                {\r\n                    name: \"end_or_beginning\",\r\n                    detail: \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n                },\r\n            ],\r\n        },\r\n        ACCRINT: {\r\n            d: \"Calculates the accrued interest of a security that has periodic payments.\",\r\n            a: \"Accrued interest of security with periodic payments.\",\r\n            p: [\r\n                {\r\n                    name: \"issue\",\r\n                    detail: \"The date the security was initially issued.\",\r\n                },\r\n                {\r\n                    name: \"first_payment\",\r\n                    detail: \"The first date interest will be paid.\",\r\n                },\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The annualized rate of interest.\",\r\n                },\r\n                {\r\n                    name: \"redemption\",\r\n                    detail: \"The redemption amount per 100 face value, or par.\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail: \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n                {\r\n                    name: \"calc_method\",\r\n                    detail:\r\n                        \"[Optional-defaults to TRUE()] - A logical value that specifies the method used to calculate the total accrued interest when the settlement date is later than the first interest accrual date. \\n\\nIf the value is TRUE, the total accrued interest from the issue date to the settlement date is returned. \\n\\nIf the value is FALSE, return the accrued interest from the first interest accrual date to the settlement date.\",\r\n                },\r\n            ],\r\n        },\r\n        ACCRINTM: {\r\n            d: \"Calculates the accrued interest of a security that pays interest at maturity.\",\r\n            a: \"Accrued interest of security paying at maturity.\",\r\n            p: [\r\n                {\r\n                    name: \"issue\",\r\n                    detail: \"The date the security was initially issued.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity date of the security.\",\r\n                },\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The annualized rate of interest.\",\r\n                },\r\n                {\r\n                    name: \"redemption\",\r\n                    detail: \"The redemption amount per 100 face value, or par.\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        COUPDAYBS: {\r\n            d: \"Calculates the number of days from the first coupon, or interest payment, until settlement.\",\r\n            a: \"Number of days from first coupon to settlement.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail: \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        COUPDAYS: {\r\n            d:\r\n                \"Calculates the number of days in the coupon, or interest payment, period that contains the specified settlement date.\",\r\n            a: \"Days in coupon period containing settlement date.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail: \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        COUPDAYSNC: {\r\n            d: \"Calculates the number of days from the settlement date until the next coupon, or interest payment.\",\r\n            a: \"Days from settlement until next coupon.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail: \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        COUPNCD: {\r\n            d: \"Calculates next coupon, or interest payment, date after the settlement date.\",\r\n            a: \"Next coupon date after the settlement date.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail: \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        COUPPCD: {\r\n            d: \"Calculates last coupon, or interest payment, date before the settlement date.\",\r\n            a: \"Last coupon date before settlement date.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail: \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        FV: {\r\n            d:\r\n                \"Calculates the future value of an annuity investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            a: \"Future value of an annuity investment.\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The interest rate.\",\r\n                },\r\n                {\r\n                    name: \"number_of_periods\",\r\n                    detail: \"The number of payments to be made.\",\r\n                },\r\n                {\r\n                    name: \"payment_amount\",\r\n                    detail: \"The amount per period to be paid.\",\r\n                },\r\n                {\r\n                    name: \"present_value\",\r\n                    detail: \"The current value of the annuity.\",\r\n                },\r\n                {\r\n                    name: \"end_or_beginning\",\r\n                    detail: \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n                },\r\n            ],\r\n        },\r\n        FVSCHEDULE: {\r\n            d:\r\n                \"Calculates the future value of some principal based on a specified series of potentially varying interest rates.\",\r\n            a: \"Future value of principal from series of rates.\",\r\n            p: [\r\n                {\r\n                    name: \"principal\",\r\n                    detail: \"The amount of initial capital or value to compound against.\",\r\n                },\r\n                {\r\n                    name: \"rate_schedule\",\r\n                    detail: \"A series of interest rates to compound against the `principal`.\",\r\n                },\r\n            ],\r\n        },\r\n        YIELD: {\r\n            d:\r\n                \"Calculates the annual yield of a security paying periodic interest, such as a US Treasury Bond, based on price.\",\r\n            a: \"Annual yield of a security paying periodic interest.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The annualized rate of interest.\",\r\n                },\r\n                {\r\n                    name: \"price\",\r\n                    detail: \"The price at which the security is bought per 100 face value.\",\r\n                },\r\n                {\r\n                    name: \"redemption\",\r\n                    detail: \"The redemption amount per 100 face value, or par.\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail: \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        YIELDDISC: {\r\n            d: \"Calculates the annual yield of a discount (non-interest-bearing) security, based on price.\",\r\n            a: \"Annual yield of a discount security.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"price\",\r\n                    detail: \"The price at which the security is bought per 100 face value.\",\r\n                },\r\n                {\r\n                    name: \"redemption\",\r\n                    detail: \"The redemption amount per 100 face value, or par.\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        NOMINAL: {\r\n            d:\r\n                \"Calculates the annual nominal interest rate given the effective rate and number of compounding periods per year.\",\r\n            a: \"Annual nominal interest rate.\",\r\n            p: [\r\n                {\r\n                    name: \"effective_rate\",\r\n                    detail: \"The effective interest rate per year.\",\r\n                },\r\n                {\r\n                    name: \"periods_per_year\",\r\n                    detail: \"The number of compounding periods per year.\",\r\n                },\r\n            ],\r\n        },\r\n        XIRR: {\r\n            d:\r\n                \"Calculates the internal rate of return of an investment based on a specified series of potentially irregularly spaced cash flows.\",\r\n            a: \"Internal rate of return given non-periodic cashflows.\",\r\n            p: [\r\n                {\r\n                    name: \"cashflow_amounts\",\r\n                    detail: \"An array or range containing the income or payments associated with the investment.\",\r\n                },\r\n                {\r\n                    name: \"cashflow_dates\",\r\n                    detail: \"An array or range with dates corresponding to the cash flows in `cashflow_amounts`.\",\r\n                },\r\n                {\r\n                    name: \"rate_guess\",\r\n                    detail: \"An estimate for what the internal rate of return will be.\",\r\n                },\r\n            ],\r\n        },\r\n        MIRR: {\r\n            d:\r\n                \"Calculates the modified internal rate of return on an investment based on a series of periodic cash flows and the difference between the interest rate paid on financing versus the return received on reinvested income.\",\r\n            a: \"Modified internal rate of return.\",\r\n            p: [\r\n                {\r\n                    name: \"cashflow_amounts\",\r\n                    detail: \"An array or range containing the income or payments associated with the investment.\",\r\n                },\r\n                {\r\n                    name: \"financing_rate\",\r\n                    detail: \"The interest rate paid on funds invested.\",\r\n                },\r\n                {\r\n                    name: \"reinvestment_return_rate\",\r\n                    detail:\r\n                        \"The return (as a percentage) earned on reinvestment of income received from the investment.\",\r\n                },\r\n            ],\r\n        },\r\n        IRR: {\r\n            d: \"Calculates the internal rate of return on an investment based on a series of periodic cash flows.\",\r\n            a: \"Internal rate of return given periodic cashflows.\",\r\n            p: [\r\n                {\r\n                    name: \"cashflow_amounts\",\r\n                    detail: \"An array or range containing the income or payments associated with the investment.\",\r\n                },\r\n                {\r\n                    name: \"rate_guess\",\r\n                    detail: \"An estimate for what the internal rate of return will be.\",\r\n                },\r\n            ],\r\n        },\r\n        NPV: {\r\n            d:\r\n                \"Calculates the net present value of an investment based on a series of periodic cash flows and a discount rate.\",\r\n            a: \"The net present value of an investment based on a series of periodic cash flows and a discount rate.\",\r\n            p: [\r\n                {\r\n                    name: \"discount\",\r\n                    detail: \"The discount rate of the investment over one period.\",\r\n                },\r\n                {\r\n                    name: \"cashflow1\",\r\n                    detail: \"The first future cash flow.\",\r\n                },\r\n                {\r\n                    name: \"cashflow2\",\r\n                    detail: \"Additional future cash flows.\",\r\n                },\r\n            ],\r\n        },\r\n        XNPV: {\r\n            d:\r\n                \"Calculates the net present value of an investment based on a specified series of potentially irregularly spaced cash flows and a discount rate.\",\r\n            a: \"Net present value given non-periodic cashflows.\",\r\n            p: [\r\n                {\r\n                    name: \"discount\",\r\n                    detail: \"The discount rate of the investment over one period.\",\r\n                },\r\n                {\r\n                    name: \"cashflow_amounts\",\r\n                    detail: \"A range of cells containing the income or payments associated with the investment.\",\r\n                },\r\n                {\r\n                    name: \"cashflow_dates\",\r\n                    detail: \"A range of cells with dates corresponding to the cash flows in `cashflow_amounts`.\",\r\n                },\r\n            ],\r\n        },\r\n        CUMIPMT: {\r\n            d:\r\n                \"Calculates the cumulative interest over a range of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            a: \"Cumulative interest paid over a set of periods.\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The interest rate.\",\r\n                },\r\n                {\r\n                    name: \"number_of_periods\",\r\n                    detail: \"The number of payments to be made.\",\r\n                },\r\n                {\r\n                    name: \"present_value\",\r\n                    detail: \"The current value of the annuity.\",\r\n                },\r\n                {\r\n                    name: \"first_period\",\r\n                    detail: \"The number of the payment period to begin the cumulative calculation.\",\r\n                },\r\n                {\r\n                    name: \"last_period\",\r\n                    detail: \"The number of the payment period to end the cumulative calculation.\",\r\n                },\r\n                {\r\n                    name: \"end_or_beginning\",\r\n                    detail: \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n                },\r\n            ],\r\n        },\r\n        PMT: {\r\n            d:\r\n                \"Calculates the periodic payment for an annuity investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            a: \"Periodic payment for an annuity investment.\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The interest rate.\",\r\n                },\r\n                {\r\n                    name: \"number_of_periods\",\r\n                    detail: \"The number of payments to be made.\",\r\n                },\r\n                {\r\n                    name: \"present_value\",\r\n                    detail: \"The current value of the annuity.\",\r\n                },\r\n                {\r\n                    name: \"future_value\",\r\n                    detail: \"The future value remaining after the final payment has been made.\",\r\n                },\r\n                {\r\n                    name: \"end_or_beginning\",\r\n                    detail: \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n                },\r\n            ],\r\n        },\r\n        IPMT: {\r\n            d:\r\n                \"Calculates the payment on interest for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            a: \"Payment on interest for an investment.\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The interest rate.\",\r\n                },\r\n                {\r\n                    name: \"period\",\r\n                    detail: \"The amortization period, in terms of number of periods.\",\r\n                },\r\n                {\r\n                    name: \"number_of_periods\",\r\n                    detail: \"The number of payments to be made.\",\r\n                },\r\n                {\r\n                    name: \"present_value\",\r\n                    detail: \"The current value of the annuity.\",\r\n                },\r\n                {\r\n                    name: \"future_value\",\r\n                    detail: \"The future value remaining after the final payment has been made.\",\r\n                },\r\n                {\r\n                    name: \"end_or_beginning\",\r\n                    detail: \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n                },\r\n            ],\r\n        },\r\n        PPMT: {\r\n            d:\r\n                \"Calculates the payment on the principal of an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            a: \"Payment on the principal of an investment.\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The interest rate.\",\r\n                },\r\n                {\r\n                    name: \"period\",\r\n                    detail: \"The amortization period, in terms of number of periods.\",\r\n                },\r\n                {\r\n                    name: \"number_of_periods\",\r\n                    detail: \"The number of payments to be made.\",\r\n                },\r\n                {\r\n                    name: \"present_value\",\r\n                    detail: \"The current value of the annuity.\",\r\n                },\r\n                {\r\n                    name: \"future_value\",\r\n                    detail: \"The future value remaining after the final payment has been made.\",\r\n                },\r\n                {\r\n                    name: \"end_or_beginning\",\r\n                    detail: \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n                },\r\n            ],\r\n        },\r\n        INTRATE: {\r\n            d:\r\n                \"Calculates the effective interest rate generated when an investment is purchased at one price and sold at another with no interest or dividends generated by the investment itself.\",\r\n            a: \"Calculates effective interest rate.\",\r\n            p: [\r\n                {\r\n                    name: \"buy_date\",\r\n                    detail: \"The date of purchase of the investment.\",\r\n                },\r\n                {\r\n                    name: \"sell_date\",\r\n                    detail: \"The date of sale of the investment.\",\r\n                },\r\n                {\r\n                    name: \"buy_price\",\r\n                    detail: \"The price at which the investment was purchased.\",\r\n                },\r\n                {\r\n                    name: \"sell_price\",\r\n                    detail: \"The price at which the investment was sold.\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        PRICE: {\r\n            d:\r\n                \"Calculates the price of a security paying periodic interest, such as a US Treasury Bond, based on expected yield.\",\r\n            a: \"Price of a security paying periodic interest.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The annualized rate of interest.\",\r\n                },\r\n                {\r\n                    name: \"yield\",\r\n                    detail: \"The expected annual yield of the security.\",\r\n                },\r\n                {\r\n                    name: \"redemption\",\r\n                    detail: \"The redemption amount per 100 face value, or par.\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail: \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        PRICEDISC: {\r\n            d: \"Calculates the price of a discount (non-interest-bearing) security, based on expected yield.\",\r\n            a: \"Price of a discount security.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"discount\",\r\n                    detail: \"The discount rate of the security at time of purchase.\",\r\n                },\r\n                {\r\n                    name: \"redemption\",\r\n                    detail: \"The redemption amount per 100 face value, or par.\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        PRICEMAT: {\r\n            d: \"Calculates the price of a security paying interest at maturity, based on expected yield.\",\r\n            a: \"Price of security paying interest at maturity.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"issue\",\r\n                    detail: \"The date the security was initially issued.\",\r\n                },\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The annualized rate of interest.\",\r\n                },\r\n                {\r\n                    name: \"yield\",\r\n                    detail: \"The expected annual yield of the security.\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        RECEIVED: {\r\n            d:\r\n                \"Calculates the amount received at maturity for an investment in fixed-income securities purchased on a given date.\",\r\n            a: \"Amount received at maturity for a security.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"investment\",\r\n                    detail: \"The amount invested (irrespective of face value of each security).\",\r\n                },\r\n                {\r\n                    name: \"discount\",\r\n                    detail: \"The discount rate of the security invested in.\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        DISC: {\r\n            d: \"Calculates the discount rate of a security based on price.\",\r\n            a: \"The discount rate of a security based on price.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"price\",\r\n                    detail: \"The price at which the security is bought per 100 face value.\",\r\n                },\r\n                {\r\n                    name: \"redemption\",\r\n                    detail: \"The redemption amount per 100 face value, or par.\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        NPER: {\r\n            d:\r\n                \"Calculates the number of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            a: \"Number of payment periods for an investment.\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The interest rate.\",\r\n                },\r\n                {\r\n                    name: \"payment_amount\",\r\n                    detail: \"The amount of each payment made.\",\r\n                },\r\n                {\r\n                    name: \"present_value\",\r\n                    detail: \"The current value of the annuity.\",\r\n                },\r\n                {\r\n                    name: \"future_value\",\r\n                    detail: \"The future value remaining after the final payment has been made.\",\r\n                },\r\n                {\r\n                    name: \"end_or_beginning\",\r\n                    detail: \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\",\r\n                },\r\n            ],\r\n        },\r\n        SLN: {\r\n            d: \"Calculates the depreciation of an asset for one period using the straight-line method.\",\r\n            a: \"Depreciation of asset using the straight-line method.\",\r\n            p: [\r\n                {\r\n                    name: \"cost\",\r\n                    detail: \"The initial cost of the asset.\",\r\n                },\r\n                {\r\n                    name: \"salvage\",\r\n                    detail: \"The value of the asset at the end of depreciation.\",\r\n                },\r\n                {\r\n                    name: \"life\",\r\n                    detail: \"The number of periods over which the asset is depreciated.\",\r\n                },\r\n            ],\r\n        },\r\n        DURATION: {\r\n            d:\r\n                \"Calculates the number of compounding periods required for an investment of a specified present value appreciating at a given rate to reach a target value.\",\r\n            a: \"Number of periods for an investment to reach a value.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The annualized rate of interest.\",\r\n                },\r\n                {\r\n                    name: \"yield\",\r\n                    detail: \"The expected annual yield of the security.\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail: \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        MDURATION: {\r\n            d:\r\n                \"Calculates the modified Macaulay duration of a security paying periodic interest, such as a US Treasury Bond, based on expected yield.\",\r\n            a: \"Modified Macaulay duration.\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail:\r\n                        \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"The maturity or end date of the security, when it can be redeemed at face, or par value.\",\r\n                },\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"The annualized rate of interest.\",\r\n                },\r\n                {\r\n                    name: \"yield\",\r\n                    detail: \"The expected annual yield of the security.\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail: \"The number of interest or coupon payments per year (1, 2, or 4).\",\r\n                },\r\n                {\r\n                    name: \"day_count_convention\",\r\n                    detail: \"An indicator of what day count method to use.\",\r\n                },\r\n            ],\r\n        },\r\n        BIN2DEC: {\r\n            d: \"Converts a signed binary number to decimal format.\",\r\n            a: \"Converts a signed binary number to decimal format.\",\r\n            p: [\r\n                {\r\n                    name: \"signed_binary_number\",\r\n                    detail: \"The signed 10-bit binary value to be converted to decimal, provided as a string.\",\r\n                },\r\n            ],\r\n        },\r\n        BIN2HEX: {\r\n            d: \"Converts a signed binary number to signed hexadecimal format.\",\r\n            a: \"Converts a binary number to hexadecimal.\",\r\n            p: [\r\n                {\r\n                    name: \"signed_binary_number\",\r\n                    detail:\r\n                        \"The signed 10-bit binary value to be converted to signed hexademical, provided as a string.\",\r\n                },\r\n                {\r\n                    name: \"significant_digits\",\r\n                    detail: \"The number of significant digits to ensure in the result.\",\r\n                },\r\n            ],\r\n        },\r\n        BIN2OCT: {\r\n            d: \"Converts a signed binary number to signed octal format.\",\r\n            a: \"Converts a binary number to octal.\",\r\n            p: [\r\n                {\r\n                    name: \"signed_binary_number\",\r\n                    detail: \"The signed 10-bit binary value to be converted to signed octal, provided as a string.\",\r\n                },\r\n                {\r\n                    name: \"significant_digits\",\r\n                    detail: \"The number of significant digits to ensure in the result.\",\r\n                },\r\n            ],\r\n        },\r\n        DEC2BIN: {\r\n            d: \"Converts a decimal number to signed binary format.\",\r\n            a: \"Converts a decimal number to signed binary format.\",\r\n            p: [\r\n                {\r\n                    name: \"decimal_number\",\r\n                    detail: \"The decimal value to be converted to signed binary, provided as a string.\",\r\n                },\r\n                {\r\n                    name: \"significant_digits\",\r\n                    detail: \"The number of significant digits to ensure in the result.\",\r\n                },\r\n            ],\r\n        },\r\n        DEC2HEX: {\r\n            d: \"Converts a decimal number to signed hexadecimal format.\",\r\n            a: \"Converts a decimal number to hexadecimal.\",\r\n            p: [\r\n                {\r\n                    name: \"decimal_number\",\r\n                    detail: \"The decimal value to be converted to signed hexadecimal, provided as a string.\",\r\n                },\r\n                {\r\n                    name: \"significant_digits\",\r\n                    detail: \"The number of significant digits to ensure in the result.\",\r\n                },\r\n            ],\r\n        },\r\n        DEC2OCT: {\r\n            d: \"Converts a decimal number to signed octal format.\",\r\n            a: \"Converts a decimal number to signed octal format.\",\r\n            p: [\r\n                {\r\n                    name: \"decimal_number\",\r\n                    detail: \"The decimal value to be converted to signed octal, provided as a string.\",\r\n                },\r\n                {\r\n                    name: \"significant_digits\",\r\n                    detail: \"The number of significant digits to ensure in the result.\",\r\n                },\r\n            ],\r\n        },\r\n        HEX2BIN: {\r\n            d: \"Converts a signed hexadecimal number to signed binary format.\",\r\n            a: \"Converts a hexadecimal number to binary.\",\r\n            p: [\r\n                {\r\n                    name: \"signed_hexadecimal_number\",\r\n                    detail:\r\n                        \"The signed 40-bit hexadecimal value to be converted to signed binary, provided as a string.\",\r\n                },\r\n                {\r\n                    name: \"significant_digits\",\r\n                    detail: \"The number of significant digits to ensure in the result.\",\r\n                },\r\n            ],\r\n        },\r\n        HEX2DEC: {\r\n            d: \"Converts a signed hexadecimal number to decimal format.\",\r\n            a: \"Converts a hexadecimal number to decimal.\",\r\n            p: [\r\n                {\r\n                    name: \"signed_hexadecimal_number\",\r\n                    detail: \"The signed 40-bit hexadecimal value to be converted to decimal, provided as a string.\",\r\n                },\r\n            ],\r\n        },\r\n        HEX2OCT: {\r\n            d: \"Converts a signed hexadecimal number to signed octal format.\",\r\n            a: \"Converts a hexadecimal number to octal.\",\r\n            p: [\r\n                {\r\n                    name: \"signed_hexadecimal_number\",\r\n                    detail:\r\n                        \"The signed 40-bit hexadecimal value to be converted to signed octal, provided as a string.\",\r\n                },\r\n                {\r\n                    name: \"significant_digits\",\r\n                    detail: \"The number of significant digits to ensure in the result.\",\r\n                },\r\n            ],\r\n        },\r\n        OCT2BIN: {\r\n            d: \"Converts a signed octal number to signed binary format.\",\r\n            a: \"Converts an octal number to binary.\",\r\n            p: [\r\n                {\r\n                    name: \"signed_octal_number\",\r\n                    detail: \"The signed 30-bit octal value to be converted to signed binary, provided as a string.\",\r\n                },\r\n                {\r\n                    name: \"significant_digits\",\r\n                    detail: \"The number of significant digits to ensure in the result.\",\r\n                },\r\n            ],\r\n        },\r\n        OCT2DEC: {\r\n            d: \"Converts a signed octal number to decimal format.\",\r\n            a: \"Converts a signed octal number to decimal format.\",\r\n            p: [\r\n                {\r\n                    name: \"signed_octal_number\",\r\n                    detail: \"The signed 30-bit octal value to be converted to decimal, provided as a string.\",\r\n                },\r\n            ],\r\n        },\r\n        OCT2HEX: {\r\n            d: \"Converts a signed octal number to signed hexadecimal format.\",\r\n            a: \"Converts an octal number to hexadecimal.\",\r\n            p: [\r\n                {\r\n                    name: \"signed_octal_number\",\r\n                    detail:\r\n                        \"The signed 30-bit octal value to be converted to signed hexadecimal, provided as a string.\",\r\n                },\r\n                {\r\n                    name: \"significant_digits\",\r\n                    detail: \"The number of significant digits to ensure in the result.\",\r\n                },\r\n            ],\r\n        },\r\n        COMPLEX: {\r\n            d: \"Creates a complex number given real and imaginary coefficients.\",\r\n            a: \"Creates a complex number.\",\r\n            p: [\r\n                {\r\n                    name: \"real_part\",\r\n                    detail: \"The real coefficient.\",\r\n                },\r\n                {\r\n                    name: \"imaginary_part\",\r\n                    detail: \"The imaginary coefficient.\",\r\n                },\r\n                {\r\n                    name: \"suffix\",\r\n                    detail:\r\n                        \"The suffix for the imaginary coefficient, can only be 'i' or 'j'. If omitted, 'i' will be used.\",\r\n                },\r\n            ],\r\n        },\r\n        IMREAL: {\r\n            d: \"Returns the real coefficient of a complex number.\",\r\n            a: \"The real coefficient of a complex number.\",\r\n            p: [\r\n                {\r\n                    name: \"complex_number\",\r\n                    detail: \"The complex number, in the a+bi or a+bj format.\",\r\n                },\r\n            ],\r\n        },\r\n        IMAGINARY: {\r\n            d: \"Returns the imaginary coefficient of a complex number.\",\r\n            a: \"The imaginary coefficient of a complex number.\",\r\n            p: [\r\n                {\r\n                    name: \"complex_number\",\r\n                    detail: \"The complex number, in the a+bi or a+bj format.\",\r\n                },\r\n            ],\r\n        },\r\n        IMCONJUGATE: {\r\n            d: \"Returns the complex conjugate of a number.\",\r\n            a: \"The complex conjugate of a number.\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"The complex number to calculate the conjugate for.\",\r\n                },\r\n            ],\r\n        },\r\n        IMABS: {\r\n            d: \"Returns absolute value (or modulus) of a complex number.\",\r\n            a: \"The absolute value of a complex number.\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"The complex number to calculate the absolute value of.\",\r\n                },\r\n            ],\r\n        },\r\n        DELTA: {\r\n            d: \"Compare two numeric values, returning 1 if they're equal.\",\r\n            a: \"Compare two numeric values.\",\r\n            p: [\r\n                {\r\n                    name: \"number1\",\r\n                    detail: \"The first number to compare.\",\r\n                },\r\n                {\r\n                    name: \"number2\",\r\n                    detail: \"The second number to compare.\",\r\n                },\r\n            ],\r\n        },\r\n        IMSUM: {\r\n            d: \"Returns the sum of a series of complex numbers.\",\r\n            a: \"Sum of a series of complex numbers.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first complex number or range to add together.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"Additional complex numbers or ranges to add to `value1`.\",\r\n                },\r\n            ],\r\n        },\r\n        IMSUB: {\r\n            d: \"Returns the difference between two complex numbers.\",\r\n            a: \"The difference between two complex numbers.\",\r\n            p: [\r\n                {\r\n                    name: \"first_number\",\r\n                    detail: \"The complex number to subtract second_number from.\",\r\n                },\r\n                {\r\n                    name: \"second_number\",\r\n                    detail: \"The complex number to subtract from first_number.\",\r\n                },\r\n            ],\r\n        },\r\n        IMPRODUCT: {\r\n            d: \"Returns the result of multiplying a series of complex numbers together.\",\r\n            a: \"Result of multiplying a series of complex numbers together.\",\r\n            p: [\r\n                {\r\n                    name: \"factor1\",\r\n                    detail: \"The first number or range to calculate for the product.\",\r\n                },\r\n                {\r\n                    name: \"factor2\",\r\n                    detail: \"Additional complex numbers or ranges to calculate for the product.\",\r\n                },\r\n            ],\r\n        },\r\n        IMDIV: {\r\n            d: \"Returns one complex number divided by another.\",\r\n            a: \"One complex number divided by another.\",\r\n            p: [\r\n                {\r\n                    name: \"dividend\",\r\n                    detail: \"The complex number to be divided.\",\r\n                },\r\n                {\r\n                    name: \"divisor\",\r\n                    detail: \"The complex number to divide by.\",\r\n                },\r\n            ],\r\n        },\r\n        NOT: {\r\n            d: \"Returns the opposite of a logical value - `NOT(TRUE)` returns `FALSE`; `NOT(FALSE)` returns `TRUE`.\",\r\n            a: \"Returns opposite of provided logical value.\",\r\n            p: [\r\n                {\r\n                    name: \"logical_expression\",\r\n                    detail:\r\n                        \"An expression or reference to a cell holding an expression that represents some logical value.\",\r\n                },\r\n            ],\r\n        },\r\n        TRUE: {\r\n            d: \"Returns the logical value `TRUE`.\",\r\n            a: \"Logical value `true`.\",\r\n            p: [],\r\n        },\r\n        FALSE: {\r\n            d: \"Returns the logical value `FALSE`.\",\r\n            a: \"Logical value `false`.\",\r\n            p: [],\r\n        },\r\n        AND: {\r\n            d:\r\n                \"Returns true if all of the provided arguments are logically true, and false if any of the provided arguments are logically false.\",\r\n            a: \"Logical `and` operator.\",\r\n            p: [\r\n                {\r\n                    name: \"logical_expression1\",\r\n                    detail:\r\n                        \"An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`, or an expression that can be coerced to a logical value.\",\r\n                },\r\n                {\r\n                    name: \"logical_expression2\",\r\n                    detail: \"More expressions that represent logical values.\",\r\n                },\r\n            ],\r\n        },\r\n        IFERROR: {\r\n            d:\r\n                \"Returns the first argument if it is not an error value, otherwise returns the second argument if present, or a blank if the second argument is absent.\",\r\n            a: \"Value if it is not an error, otherwise 2nd argument.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to return if `value` itself is not an error.\",\r\n                },\r\n                {\r\n                    name: \"value_if_error\",\r\n                    detail: \"The value the function returns if `value` is an error.\",\r\n                },\r\n            ],\r\n        },\r\n        IF: {\r\n            d: \"Returns one value if a logical expression is `TRUE` and another if it is `FALSE`.\",\r\n            a: \"Returns value depending on logical expression.\",\r\n            p: [\r\n                {\r\n                    name: \"logical_expression\",\r\n                    detail:\r\n                        \"An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`.\",\r\n                },\r\n                {\r\n                    name: \"value_if_true\",\r\n                    detail: \"The value the function returns if `logical_expression` is `TRUE`.\",\r\n                },\r\n                {\r\n                    name: \"value_if_false\",\r\n                    detail: \"The value the function returns if `logical_expression` is `FALSE`.\",\r\n                },\r\n            ],\r\n        },\r\n        OR: {\r\n            d:\r\n                \"Returns true if any of the provided arguments are logically true, and false if all of the provided arguments are logically false.\",\r\n            a: \"Logical `or` operator.\",\r\n            p: [\r\n                {\r\n                    name: \"logical_expression1\",\r\n                    detail:\r\n                        \"An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`, or an expression that can be coerced to a logical value.\",\r\n                },\r\n                {\r\n                    name: \"logical_expression2\",\r\n                    detail: \"More expressions that evaluate to logical values.\",\r\n                },\r\n            ],\r\n        },\r\n        NE: {\r\n            d:\r\n                \"Returns `TRUE` if two specified values are not equal and `FALSE` otherwise. Equivalent to the `!=` operator.\",\r\n            a: \"Not equal.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"The value to test against `value1` for inequality.\",\r\n                },\r\n            ],\r\n        },\r\n        EQ: {\r\n            d:\r\n                \"Returns `TRUE` if two specified values are equal and `FALSE` otherwise. Equivalent to the `==` operator.\",\r\n            a: \"Equal.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first value.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"The value to test against `value1` for equality.\",\r\n                },\r\n            ],\r\n        },\r\n        GT: {\r\n            d:\r\n                \"Returns `TRUE` if the first argument is strictly greater than the second, and `FALSE` otherwise. Equivalent to the `>` operator.\",\r\n            a: \"Strictly greater than.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The value to test as being greater than `value2`.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"The second value.\",\r\n                },\r\n            ],\r\n        },\r\n        GTE: {\r\n            d:\r\n                \"Returns `TRUE` if the first argument is greater than or equal to the second, and `FALSE` otherwise. Equivalent to the `>=` operator.\",\r\n            a: \"Greater than or equal to.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The value to test as being greater than or equal to `value2`.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"The second value.\",\r\n                },\r\n            ],\r\n        },\r\n        LT: {\r\n            d:\r\n                \"Returns `TRUE` if the first argument is strictly less than the second, and `FALSE` otherwise. Equivalent to the `<` operator.\",\r\n            a: \"Less than.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The value to test as being less than `value2`.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"The second value.\",\r\n                },\r\n            ],\r\n        },\r\n        LTE: {\r\n            d:\r\n                \"Returns `TRUE` if the first argument is less than or equal to the second, and `FALSE` otherwise. Equivalent to the `<=` operator.\",\r\n            a: \"Less than or equal to.\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The value to test as being less than or equal to `value2`.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"The second value.\",\r\n                },\r\n            ],\r\n        },\r\n        ADD: {\r\n            d: \"Returns the sum of two numbers. Equivalent to the `+` operator.\",\r\n            a: \"Sum of two numbers\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The first addend.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"The second addend.\",\r\n                },\r\n            ],\r\n        },\r\n        MINUS: {\r\n            d: \"Returns the difference of two numbers. Equivalent to the `-` operator.\",\r\n            a: \"Difference of two numbers\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The minuend, or number to be subtracted from.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"The subtrahend, or number to subtract from `value1`.\",\r\n                },\r\n            ],\r\n        },\r\n        MULTIPLY: {\r\n            d: \"Returns the product of two numbers. Equivalent to the `*` operator.\",\r\n            a: \"Product of two numbers\",\r\n            p: [\r\n                {\r\n                    name: \"factor1\",\r\n                    detail: \"The first multiplicand.\",\r\n                },\r\n                {\r\n                    name: \"factor2\",\r\n                    detail: \"The second multiplicand.\",\r\n                },\r\n            ],\r\n        },\r\n        DIVIDE: {\r\n            d: \"Returns one number divided by another. Equivalent to the `/` operator.\",\r\n            a: \"One number divided by another\",\r\n            p: [\r\n                {\r\n                    name: \"dividend\",\r\n                    detail: \"The number to be divided.\",\r\n                },\r\n                {\r\n                    name: \"divisor\",\r\n                    detail: \"The number to divide by.\",\r\n                },\r\n            ],\r\n        },\r\n        CONCAT: {\r\n            d: \"Returns the concatenation of two values. Equivalent to the `&` operator.\",\r\n            a: \"Concatenation of two values\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"The value to which `value2` will be appended.\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"The value to append to `value1`.\",\r\n                },\r\n            ],\r\n        },\r\n        UNARY_PERCENT: {\r\n            d: \"Returns a value interpreted as a percentage; that is, `UNARY_PERCENT(100)` equals `1`.\",\r\n            a: \"Value interpreted as a percentage.\",\r\n            p: [\r\n                {\r\n                    name: \"percentage\",\r\n                    detail: \"The value to interpret as a percentage.\",\r\n                },\r\n            ],\r\n        },\r\n        CONCATENATE: {\r\n            d: \"Appends strings to one another.\",\r\n            a: \"Appends strings to one another.\",\r\n            p: [\r\n                {\r\n                    name: \"string1\",\r\n                    detail: \"The initial string.\",\r\n                },\r\n                {\r\n                    name: \"string2\",\r\n                    detail: \"More strings to append in sequence.\",\r\n                },\r\n            ],\r\n        },\r\n        CODE: {\r\n            d: \"Returns the numeric Unicode map value of the first character in the string provided.\",\r\n            a: \"Numeric unicode map value of character.\",\r\n            p: [\r\n                {\r\n                    name: \"string\",\r\n                    detail: \"The string whose first character's Unicode map value will be returned.\",\r\n                },\r\n            ],\r\n        },\r\n        CHAR: {\r\n            d: \"Convert a number into a character according to the current Unicode table.\",\r\n            a: \"Gets character associated with number.\",\r\n            p: [\r\n                {\r\n                    name: \"table_number\",\r\n                    detail: \"The number of the character to look up from the current Unicode table in decimal format.\",\r\n                },\r\n            ],\r\n        },\r\n        ARABIC: {\r\n            d: \"Computes the value of a Roman numeral.\",\r\n            a: \"Computes the value of a roman numeral.\",\r\n            p: [\r\n                {\r\n                    name: \"roman_numeral\",\r\n                    detail: \"The Roman numeral to format, whose value must be between 1 and 3999, inclusive.\",\r\n                },\r\n            ],\r\n        },\r\n        ROMAN: {\r\n            d: \"Formats a number in Roman numerals.\",\r\n            a: \"Formats a number in Roman numerals.\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"The number to format, between 1 and 3999, inclusive.\",\r\n                },\r\n            ],\r\n        },\r\n        REGEXEXTRACT: {\r\n            d: \"Extracts matching substrings according to a regular expression.\",\r\n            a: \"Extracts matching substrings with regular expression.\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"The input text.\",\r\n                },\r\n                {\r\n                    name: \"regular_expression\",\r\n                    detail: \"The first part of `text` that matches this expression will be returned.\",\r\n                },\r\n            ],\r\n        },\r\n        REGEXMATCH: {\r\n            d: \"Whether a piece of text matches a regular expression.\",\r\n            a: \"Whether a piece of text matches regular expression.\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"The text to be tested against the regular expression.\",\r\n                },\r\n                {\r\n                    name: \"regular_expression\",\r\n                    detail: \"The regular expression to test the text against.\",\r\n                },\r\n            ],\r\n        },\r\n        REGEXREPLACE: {\r\n            d: \"Replaces part of a text string with a different text string using regular expressions.\",\r\n            a: \"Replaces text with regular expressions.\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"The text, a part of which will be replaced.\",\r\n                },\r\n                {\r\n                    name: \"regular_expression\",\r\n                    detail: \"The regular expression.  All matching instances in `text` will be replaced.\",\r\n                },\r\n                {\r\n                    name: \"replacement\",\r\n                    detail: \"The text which will be inserted into the original text.\",\r\n                },\r\n            ],\r\n        },\r\n        T: {\r\n            d: \"Returns string arguments as text, or the empty string if the value is not text.\",\r\n            a: \"String arguments as text.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The argument to be converted to text.\",\r\n                },\r\n            ],\r\n        },\r\n        FIXED: {\r\n            d: \"Formats a number with a fixed number of decimal places.\",\r\n            a: \"Formats number with fixed number of decimal places.\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"The number to format.\",\r\n                },\r\n                {\r\n                    name: \"number_of_places\",\r\n                    detail: \"The number of decimal places to display in the result.\",\r\n                },\r\n                {\r\n                    name: \"suppress_separator\",\r\n                    detail:\r\n                        \"Whether or not to suppress the thousands separator used in some locales (e.g. `1,000` becomes `1000`). Separators will be present if this value is 0 or omitted, and absent otherwise.\",\r\n                },\r\n            ],\r\n        },\r\n        FIND: {\r\n            d:\r\n                \"Returns the position at which a string is first found within text where the capitalization of letters matters. Returns `#VALUE!` if the string is not found.\",\r\n            a: \"First position of string found in text, case-sensitive.\",\r\n            p: [\r\n                {\r\n                    name: \"search_for\",\r\n                    detail: \"The string to look for within `text_to_search`.\",\r\n                },\r\n                {\r\n                    name: \"text_to_search\",\r\n                    detail: \"The text to search for the first occurrence of `search_for`.\",\r\n                },\r\n                {\r\n                    name: \"starting_at\",\r\n                    detail: \"The character within `text_to_search` at which to start the search.\",\r\n                },\r\n            ],\r\n        },\r\n        FINDB: {\r\n            d: \"Returns the position at which a string is first found within text counting each double-character as 2.\",\r\n            a: \"Position at which a string is first found within text (binary).\",\r\n            p: [\r\n                {\r\n                    name: \"search_for\",\r\n                    detail: \"The string to look for within `text_to_search`.\",\r\n                },\r\n                {\r\n                    name: \"text_to_search\",\r\n                    detail: \"The text to search for the first occurrence of `search_for`.\",\r\n                },\r\n                {\r\n                    name: \"starting_at\",\r\n                    detail: \"The character within `text_to_search` at which to start the search.\",\r\n                },\r\n            ],\r\n        },\r\n        JOIN: {\r\n            d: \"Concatenates the elements of one or more one-dimensional arrays using a specified delimiter.\",\r\n            a: \"Concatenates elements of arrays with delimiter.\",\r\n            p: [\r\n                {\r\n                    name: \"delimiter\",\r\n                    detail: \"The character or string to place between each concatenated value.\",\r\n                },\r\n                {\r\n                    name: \"value_or_array1\",\r\n                    detail: \"The value or values to be appended using `delimiter`.\",\r\n                },\r\n                {\r\n                    name: \"value_or_array2\",\r\n                    detail: \"More values to be appended using `delimiter`.\",\r\n                },\r\n            ],\r\n        },\r\n        LEFT: {\r\n            d: \"Returns a substring from the beginning of a specified string.\",\r\n            a: \"Substring from beginning of specified string.\",\r\n            p: [\r\n                {\r\n                    name: \"string\",\r\n                    detail: \"The string from which the left portion will be returned.\",\r\n                },\r\n                {\r\n                    name: \"number_of_characters\",\r\n                    detail: \"The number of characters to return from the left side of `string`.\",\r\n                },\r\n            ],\r\n        },\r\n        RIGHT: {\r\n            d: \"Returns a substring from the end of a specified string.\",\r\n            a: \"A substring from the end of a specified string.\",\r\n            p: [\r\n                {\r\n                    name: \"string\",\r\n                    detail: \"The string from which the right portion will be returned.\",\r\n                },\r\n                {\r\n                    name: \"number_of_characters\",\r\n                    detail: \"The number of characters to return from the right side of `string`.\",\r\n                },\r\n            ],\r\n        },\r\n        MID: {\r\n            d: \"Returns a segment of a string.\",\r\n            a: \"A segment of a string.\",\r\n            p: [\r\n                {\r\n                    name: \"string\",\r\n                    detail: \"The string to extract a segment from.\",\r\n                },\r\n                {\r\n                    name: \"starting_at\",\r\n                    detail:\r\n                        \"The index from the left of `string` from which to begin extracting. The first character in `string` has the index 1.\",\r\n                },\r\n                {\r\n                    name: \"extract_length\",\r\n                    detail: \"The length of the segment to extract.\",\r\n                },\r\n            ],\r\n        },\r\n        LEN: {\r\n            d: \"Returns the length of a string.\",\r\n            a: \"Length of a string.\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"The string whose length will be returned.\",\r\n                },\r\n            ],\r\n        },\r\n        LENB: {\r\n            d: \"Returns the length of a string in bytes.\",\r\n            a: \"Length of a string in bytes.\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"The string whose length will be returned.\",\r\n                },\r\n            ],\r\n        },\r\n        LOWER: {\r\n            d: \"Converts a specified string to lowercase.\",\r\n            a: \"Converts a specified string to lowercase.\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"The string to convert to lowercase.\",\r\n                },\r\n            ],\r\n        },\r\n        UPPER: {\r\n            d: \"Converts a specified string to uppercase.\",\r\n            a: \"Converts a specified string to uppercase.\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"The string to convert to uppercase.\",\r\n                },\r\n            ],\r\n        },\r\n        EXACT: {\r\n            d: \"Tests whether two strings are identical.\",\r\n            a: \"Tests whether two strings are identical.\",\r\n            p: [\r\n                {\r\n                    name: \"string1\",\r\n                    detail: \"The first string to compare\",\r\n                },\r\n                {\r\n                    name: \"string2\",\r\n                    detail: \"The second string to compare\",\r\n                },\r\n            ],\r\n        },\r\n        REPLACE: {\r\n            d: \"Replaces part of a text string with a different text string.\",\r\n            a: \"Replaces part of a text string with different text.\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"The text, a part of which will be replaced.\",\r\n                },\r\n                {\r\n                    name: \"position\",\r\n                    detail: \"The position where the replacement will begin (starting from 1).\",\r\n                },\r\n                {\r\n                    name: \"length\",\r\n                    detail: \"The number of characters in the text to be replaced.\",\r\n                },\r\n                {\r\n                    name: \"new_text\",\r\n                    detail: \"The text which will be inserted into the original text.\",\r\n                },\r\n            ],\r\n        },\r\n        REPT: {\r\n            d: \"Returns specified text repeated a number of times.\",\r\n            a: \"Specified text repeated a number of times.\",\r\n            p: [\r\n                {\r\n                    name: \"text_to_repeat\",\r\n                    detail: \"The character or string to repeat.\",\r\n                },\r\n                {\r\n                    name: \"number_of_repetitions\",\r\n                    detail: \"The number of times `text_to_repeat` should appear in the value returned.\",\r\n                },\r\n            ],\r\n        },\r\n        SEARCH: {\r\n            d:\r\n                \"Returns the position at which a string is first found within text and ignores capitalization of letters. Returns `#VALUE!` if the string is not found.\",\r\n            a: \"First position of string found in text, ignoring case.\",\r\n            p: [\r\n                {\r\n                    name: \"search_for\",\r\n                    detail: \"The string to look for within `text_to_search`.\",\r\n                },\r\n                {\r\n                    name: \"text_to_search\",\r\n                    detail: \"The text to search for the first occurrence of `search_for`.\",\r\n                },\r\n                {\r\n                    name: \"starting_at\",\r\n                    detail: \"The character within `text_to_search` at which to start the search.\",\r\n                },\r\n            ],\r\n        },\r\n        SUBSTITUTE: {\r\n            d: \"Replaces existing text with new text in a string.\",\r\n            a: \"Replaces existing text with new text in a string.\",\r\n            p: [\r\n                {\r\n                    name: \"text_to_search\",\r\n                    detail: \"The text within which to search and replace.\",\r\n                },\r\n                {\r\n                    name: \"search_for\",\r\n                    detail: \"The string to search for within `text_to_search`.\",\r\n                },\r\n                {\r\n                    name: \"replace_with\",\r\n                    detail: \"The string that will replace `search_for`.\",\r\n                },\r\n                {\r\n                    name: \"occurrence_number\",\r\n                    detail:\r\n                        \"The instance of `search_for` within `text_to_search` to replace with `replace_with`. By default, all occurrences of `search_for` are replaced; however, if `occurrence_number` is specified, only the indicated instance of `search_for` is replaced.\",\r\n                },\r\n            ],\r\n        },\r\n        CLEAN: {\r\n            d: \"Returns the text with the non-printable ASCII characters removed.\",\r\n            a: \"Removes non-printable characters from a piece of text.\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"The text whose non-printable characters are to be removed.\",\r\n                },\r\n            ],\r\n        },\r\n        TEXT: {\r\n            d: \"Converts a number into text according to a specified format.\",\r\n            a: \"Formats a number into text.\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"The number, date, or time to format.\",\r\n                },\r\n                {\r\n                    name: \"format\",\r\n                    detail: \"The pattern by which to format the number, enclosed in quotation marks.\",\r\n                },\r\n            ],\r\n        },\r\n        TRIM: {\r\n            d: \"Removes leading, trailing, and repeated spaces in text.\",\r\n            a: \"Removes space characters.\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"The text or reference to a cell containing text to be trimmed.\",\r\n                },\r\n            ],\r\n        },\r\n        VALUE: {\r\n            d:\r\n                \"Converts a string in any of the date, time or number formats that Google Sheets understands into a number.\",\r\n            a: \"Converts a date/time/number string into a number.\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"The string containing the value to be converted.\",\r\n                },\r\n            ],\r\n        },\r\n        PROPER: {\r\n            d: \"Capitalizes each word in a specified string.\",\r\n            a: \"Capitalizes each word in a specified string.\",\r\n            p: [\r\n                {\r\n                    name: \"text_to_capitalize\",\r\n                    detail:\r\n                        \"The text which will be returned with the first letter of each word in uppercase and all other letters in lowercase.\",\r\n                },\r\n            ],\r\n        },\r\n        CONVERT: {\r\n            d: \"Converts a numeric value to a different unit of measure.\",\r\n            a: \"Unit conversion for numbers.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The numeric value in `start_unit` to convert to `end_unit`.\",\r\n                },\r\n                {\r\n                    name: \"start_unit\",\r\n                    detail: \"The starting unit, the unit currently assigned to `value`.\",\r\n                },\r\n                {\r\n                    name: \"end_unit\",\r\n                    detail: \"The unit of measure into which to convert the argument, `value`.\",\r\n                },\r\n            ],\r\n        },\r\n        SUMX2MY2: {\r\n            d: \"Calculates the sum of the differences of the squares of values in two arrays.\",\r\n            a: \"Sum of the differences of squares.\",\r\n            p: [\r\n                {\r\n                    name: \"array_x\",\r\n                    detail:\r\n                        \"The array or range of values whose squares will be reduced by the squares of corresponding entries in `array_y` and added together.\",\r\n                },\r\n                {\r\n                    name: \"array_y\",\r\n                    detail:\r\n                        \"The array or range of values whose squares will be subtracted from the squares of corresponding entries in `array_x` and added together.\",\r\n                },\r\n            ],\r\n        },\r\n        SUMX2PY2: {\r\n            d: \"Calculates the sum of the sums of the squares of values in two arrays.\",\r\n            a: \"Sum of the sums of squares.\",\r\n            p: [\r\n                {\r\n                    name: \"array_x\",\r\n                    detail:\r\n                        \"The array or range of values whose squares will be added to the squares of corresponding entries in `array_y` and added together.\",\r\n                },\r\n                {\r\n                    name: \"array_y\",\r\n                    detail:\r\n                        \"The array or range of values whose squares will be added to the squares of corresponding entries in `array_x` and added together.\",\r\n                },\r\n            ],\r\n        },\r\n        SUMXMY2: {\r\n            d: \"Calculates the sum of the squares of differences of values in two arrays.\",\r\n            a: \"Sum of the squares of differences.\",\r\n            p: [\r\n                {\r\n                    name: \"array_x\",\r\n                    detail:\r\n                        \"The array or range of values that will be reduced by corresponding entries in `array_y`, squared, and added together.\",\r\n                },\r\n                {\r\n                    name: \"array_y\",\r\n                    detail:\r\n                        \"The array or range of values that will be subtracted from corresponding entries in `array_x`, the result squared, and all such results added together.\",\r\n                },\r\n            ],\r\n        },\r\n        TRANSPOSE: {\r\n            d: \"Transposes the rows and columns of an array or range of cells.\",\r\n            a: \"Transposes the rows and columns of an array.\",\r\n            p: [\r\n                {\r\n                    name: \"array_or_range\",\r\n                    detail: \"The array or range whose rows and columns will be swapped.\",\r\n                },\r\n            ],\r\n        },\r\n        TREND: {\r\n            d:\r\n                \"Given partial data about a linear trend, fits an ideal linear trend using the least squares method and/or predicts further values.\",\r\n            a: \"Fits points to linear trend derived via least-squares.\",\r\n            p: [\r\n                {\r\n                    name: \"known_data_y\",\r\n                    detail:\r\n                        \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal linear trend.\",\r\n                },\r\n                {\r\n                    name: \"known_data_x\",\r\n                    detail: \"The values of the independent variable(s) corresponding with `known_data_y`.\",\r\n                },\r\n                {\r\n                    name: \"new_data_x\",\r\n                    detail: \"The data points to return the `y` values for on the ideal curve fit.\",\r\n                },\r\n                {\r\n                    name: \"b\",\r\n                    detail:\r\n                        \"Given a general linear form of `y = m*x+b` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `0` and only calculates the `m` values if `FALSE`, i.e. forces the curve fit to pass through the origin.\",\r\n                },\r\n            ],\r\n        },\r\n        FREQUENCY: {\r\n            d: \"Calculates the frequency distribution of a one-column array into specified classes.\",\r\n            a: \"The frequency distribution of array.\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"The array or range containing the values to be counted.\",\r\n                },\r\n                {\r\n                    name: \"classes\",\r\n                    detail: \"The array or range containing the set of classes.\",\r\n                },\r\n            ],\r\n        },\r\n        GROWTH: {\r\n            d:\r\n                \"Given partial data about an exponential growth trend, fits an ideal exponential growth trend and/or predicts further values.\",\r\n            a: \"Fits points to exponential growth trend.\",\r\n            p: [\r\n                {\r\n                    name: \"known_data_y\",\r\n                    detail:\r\n                        \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal exponential growth curve.\",\r\n                },\r\n                {\r\n                    name: \"known_data_x\",\r\n                    detail: \"The values of the independent variable(s) corresponding with `known_data_y`.\",\r\n                },\r\n                {\r\n                    name: \"new_data_x\",\r\n                    detail: \"The data points to return the `y` values for on the ideal curve fit.\",\r\n                },\r\n                {\r\n                    name: \"b\",\r\n                    detail:\r\n                        \"Given a general exponential form of `y = b*m^x` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `1` and only calculates the `m` values if `FALSE`.\",\r\n                },\r\n            ],\r\n        },\r\n        LINEST: {\r\n            d:\r\n                \"Given partial data about a linear trend, calculates various parameters about the ideal linear trend using the least-squares method.\",\r\n            a: \"Best-fit linear trend via least-squares.\",\r\n            p: [\r\n                {\r\n                    name: \"known_data_y\",\r\n                    detail:\r\n                        \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal linear trend.\",\r\n                },\r\n                {\r\n                    name: \"known_data_x\",\r\n                    detail: \"The values of the independent variable(s) corresponding with `known_data_y`.\",\r\n                },\r\n                {\r\n                    name: \"calculate_b\",\r\n                    detail:\r\n                        \"Given a linear form of `y = m*x+b`, calculates the y-intercept (`b`) if `TRUE`. Otherwise, forces `b` to be `0` and only calculates the `m` values if `FALSE`, i.e. forces the curve fit to pass through the origin.\",\r\n                },\r\n                {\r\n                    name: \"verbose\",\r\n                    detail:\r\n                        \"A flag specifying whether to return additional regression statistics or only the linear coefficients and the y-intercept (default).\",\r\n                },\r\n            ],\r\n        },\r\n        LOGEST: {\r\n            d:\r\n                \"Given partial data about an exponential growth curve, calculates various parameters about the best fit ideal exponential growth curve.\",\r\n            a: \"Best-fit exponential growth curve.\",\r\n            p: [\r\n                {\r\n                    name: \"known_data_y\",\r\n                    detail:\r\n                        \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal exponential growth curve.\",\r\n                },\r\n                {\r\n                    name: \"known_data_x\",\r\n                    detail: \"The values of the independent variable(s) corresponding with `known_data_y`.\",\r\n                },\r\n                {\r\n                    name: \"b\",\r\n                    detail:\r\n                        \"Given a general exponential form of `y = b*m^x` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `1` and only calculates the `m` values if `FALSE`.\",\r\n                },\r\n                {\r\n                    name: \"verbose\",\r\n                    detail:\r\n                        \"A flag specifying whether to return additional regression statistics or only the calculated coefficient and exponents.\",\r\n                },\r\n            ],\r\n        },\r\n        MDETERM: {\r\n            d: \"Returns the matrix determinant of a square matrix specified as an array or range.\",\r\n            a: \"Matrix determinant of a square matrix.\",\r\n            p: [\r\n                {\r\n                    name: \"square_matrix\",\r\n                    detail:\r\n                        \"An array or range with an equal number of rows and columns representing a matrix whose determinant will be calculated.\",\r\n                },\r\n            ],\r\n        },\r\n        MINVERSE: {\r\n            d: \"Returns the multiplicative inverse of a square matrix specified as an array or range.\",\r\n            a: \"Multiplicative inverse of square matrix.\",\r\n            p: [\r\n                {\r\n                    name: \"square_matrix\",\r\n                    detail:\r\n                        \"An array or range with an equal number of rows and columns representing a matrix whose multiplicative inverse will be calculated.\",\r\n                },\r\n            ],\r\n        },\r\n        MMULT: {\r\n            d: \"Calculates the matrix product of two matrices specified as arrays or ranges.\",\r\n            a: \"The matrix product of two matrices.\",\r\n            p: [\r\n                {\r\n                    name: \"matrix1\",\r\n                    detail:\r\n                        \"The first matrix in the matrix multiplication operation, represented as an array or range.\",\r\n                },\r\n                {\r\n                    name: \"matrix2\",\r\n                    detail:\r\n                        \"The second matrix in the matrix multiplication operation, represented as an array or range.\",\r\n                },\r\n            ],\r\n        },\r\n        SUMPRODUCT: {\r\n            d: \"Calculates the sum of the products of corresponding entries in two equal-sized arrays or ranges.\",\r\n            a: \"Sum of products of elements in two arrays.\",\r\n            p: [\r\n                {\r\n                    name: \"array1\",\r\n                    detail:\r\n                        \"The first array or range whose entries will be multiplied with corresponding entries in the second such array or range.\",\r\n                },\r\n                {\r\n                    name: \"array2\",\r\n                    detail:\r\n                        \"The second array or range whose entries will be multiplied with corresponding entries in the first such array or range.\",\r\n                },\r\n            ],\r\n        },\r\n        ISFORMULA: {\r\n            d: \"Checks whether a value is a formula.\",\r\n            a: \"Whether a value is a formula.\",\r\n            p: [\r\n                {\r\n                    name: \"cell\",\r\n                    detail: \"The cell to be verified as containing a formula.\",\r\n                },\r\n            ],\r\n        },\r\n        CELL: {\r\n            d: \"Returns the requested information about the specified cell.\",\r\n            a: \"Gets information about a cell.\",\r\n            p: [\r\n                {\r\n                    name: \"info_type\",\r\n                    detail: \"The type of information requested (see article for available types)\",\r\n                },\r\n                {\r\n                    name: \"reference\",\r\n                    detail: \"The reference to the cell.\",\r\n                },\r\n            ],\r\n        },\r\n        NA: {\r\n            d: 'Returns the \"value not available\" error, `#N/A`.',\r\n            a: \"The `#N/A` error.\",\r\n            p: [],\r\n        },\r\n        ERROR_TYPE: {\r\n            d: \"Returns a number corresponding to the error value in a different cell.\",\r\n            a: \"Error value of cell (as number).\",\r\n            p: [\r\n                {\r\n                    name: \"reference\",\r\n                    detail:\r\n                        \"The cell to find the error number for although you can also provide the error value directly.\",\r\n                },\r\n            ],\r\n        },\r\n        ISBLANK: {\r\n            d: \"Checks whether the referenced cell is empty.\",\r\n            a: \"Whether the referenced cell is empty.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"Reference to the cell that will be checked for emptiness.\",\r\n                },\r\n            ],\r\n        },\r\n        ISERR: {\r\n            d: \"Checks whether a value is an error other than `#N/A`.\",\r\n            a: \"Whether a value is an error other than `#n/a`.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to be verified as an error type other than `#N/A`.\",\r\n                },\r\n            ],\r\n        },\r\n        ISERROR: {\r\n            d: \"Checks whether a value is an error.\",\r\n            a: \"Whether a value is an error.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to be verified as an error type.\",\r\n                },\r\n            ],\r\n        },\r\n        ISLOGICAL: {\r\n            d: \"Checks whether a value is `TRUE` or `FALSE`.\",\r\n            a: \"Whether a value is `true` or `false`.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to be verified as a logical `TRUE` or `FALSE`.\",\r\n                },\r\n            ],\r\n        },\r\n        ISNA: {\r\n            d: \"Checks whether a value is the error `#N/A`.\",\r\n            a: \"Whether a value is the error `#n/a`.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to be compared with the error value `#N/A`.\",\r\n                },\r\n            ],\r\n        },\r\n        ISNONTEXT: {\r\n            d: \"Checks whether a value is non-textual.\",\r\n            a: \"Whether a value is non-textual.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to be checked.\",\r\n                },\r\n            ],\r\n        },\r\n        ISNUMBER: {\r\n            d: \"Checks whether a value is a number.\",\r\n            a: \"Whether a value is a number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to be verified as a number.\",\r\n                },\r\n            ],\r\n        },\r\n        ISREF: {\r\n            d: \"Checks whether a value is a valid cell reference.\",\r\n            a: \"Whether a value is a valid cell reference.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to be verified as a cell reference.\",\r\n                },\r\n            ],\r\n        },\r\n        ISTEXT: {\r\n            d: \"Checks whether a value is text.\",\r\n            a: \"Whether a value is text.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to be verified as text.\",\r\n                },\r\n            ],\r\n        },\r\n        TYPE: {\r\n            d: \"Returns a number associated with the type of data passed into the function.\",\r\n            a: \"Get the type of a value.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value whose type is to be determined.\",\r\n                },\r\n            ],\r\n        },\r\n        N: {\r\n            d: \"Returns the argument provided as a number. Text is converted to 0 and errors are returned as-is.\",\r\n            a: \"Argument provided as a number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The argument to be converted to a number.\",\r\n                },\r\n            ],\r\n        },\r\n        TO_DATE: {\r\n            d: \"Converts a provided number to a date.\",\r\n            a: \"Converts a provided number to a date.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The argument or reference to a cell to be converted to a date.\",\r\n                },\r\n            ],\r\n        },\r\n        TO_PURE_NUMBER: {\r\n            d:\r\n                \"Converts a provided date/time, percentage, currency or other formatted numeric value to a pure number without formatting.\",\r\n            a: \"Converts any numeric value to a pure number.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The argument or reference to a cell to be converted to a pure number.\",\r\n                },\r\n            ],\r\n        },\r\n        TO_TEXT: {\r\n            d: \"Converts a provided numeric value to a text value.\",\r\n            a: \"Converts a provided numeric value to a text value.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The argument or reference to a cell to be converted to text.\",\r\n                },\r\n            ],\r\n        },\r\n        TO_DOLLARS: {\r\n            d: \"Converts a provided number to a dollar value.\",\r\n            a: \"Converts a provided number to a dollar value.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The argument or reference to a cell to be converted to a dollar value.\",\r\n                },\r\n            ],\r\n        },\r\n        TO_PERCENT: {\r\n            d: \"Converts a provided number to a percentage.\",\r\n            a: \"Converts a provided number to a percentage.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The argument or reference to a cell to be converted to a percentage.\",\r\n                },\r\n            ],\r\n        },\r\n        DGET: {\r\n            d: \"Returns a single value from a database table-like array or range using a SQL-like query.\",\r\n            a: \"Single value from a table-like range.\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail:\r\n                        \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail: \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail:\r\n                        \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n                },\r\n            ],\r\n        },\r\n        DMAX: {\r\n            d: \"Returns the maximum value selected from a database table-like array or range using a SQL-like query.\",\r\n            a: \"Maximum of values from a table-like range.\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail:\r\n                        \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail: \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail:\r\n                        \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n                },\r\n            ],\r\n        },\r\n        DMIN: {\r\n            d: \"Returns the minimum value selected from a database table-like array or range using a SQL-like query.\",\r\n            a: \"Minimum of values from a table-like range.\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail:\r\n                        \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail: \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail:\r\n                        \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n                },\r\n            ],\r\n        },\r\n        DAVERAGE: {\r\n            d:\r\n                \"Returns the average of a set of values selected from a database table-like array or range using a SQL-like query.\",\r\n            a: \"Average of a set of values from a table-like range.\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail:\r\n                        \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail: \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail:\r\n                        \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n                },\r\n            ],\r\n        },\r\n        DCOUNT: {\r\n            d: \"Counts numeric values selected from a database table-like array or range using a SQL-like query.\",\r\n            a: \"Counts values from a table-like range.\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail:\r\n                        \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail: \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail:\r\n                        \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n                },\r\n            ],\r\n        },\r\n        DCOUNTA: {\r\n            d:\r\n                \"Counts values, including text, selected from a database table-like array or range using a SQL-like query.\",\r\n            a: \"Counts values and text from a table-like range.\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail:\r\n                        \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail: \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail:\r\n                        \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n                },\r\n            ],\r\n        },\r\n        DPRODUCT: {\r\n            d:\r\n                \"Returns the product of values selected from a database table-like array or range using a SQL-like query.\",\r\n            a: \"Product of values from a table-like range.\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail:\r\n                        \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail: \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail:\r\n                        \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n                },\r\n            ],\r\n        },\r\n        DSTDEV: {\r\n            d:\r\n                \"Returns the standard deviation of a population sample selected from a database table-like array or range using a SQL-like query.\",\r\n            a: \"Standard deviation of population sample from table.\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail:\r\n                        \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail: \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail:\r\n                        \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n                },\r\n            ],\r\n        },\r\n        DSTDEVP: {\r\n            d:\r\n                \"Returns the standard deviation of an entire population selected from a database table-like array or range using a SQL-like query.\",\r\n            a: \"Standard deviation of entire population from table.\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail:\r\n                        \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail: \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail:\r\n                        \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n                },\r\n            ],\r\n        },\r\n        DSUM: {\r\n            d: \"Returns the sum of values selected from a database table-like array or range using a SQL-like query.\",\r\n            a: \"Sum of values from a table-like range.\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail:\r\n                        \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail: \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail:\r\n                        \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n                },\r\n            ],\r\n        },\r\n        DVAR: {\r\n            d:\r\n                \"Returns the variance of a population sample selected from a database table-like array or range using a SQL-like query.\",\r\n            a: \"Variance of population sample from table-like range.\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail:\r\n                        \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail: \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail:\r\n                        \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n                },\r\n            ],\r\n        },\r\n        DVARP: {\r\n            d:\r\n                \"Returns the variance of an entire population selected from a database table-like array or range using a SQL-like query.\",\r\n            a: \"Variance of a population from a table-like range.\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail:\r\n                        \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail: \"Indicates which column in `database` contains the values to be extracted and operated on.\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail:\r\n                        \"An array or range containing zero or more criteria to filter the `database` values by before operating.\",\r\n                },\r\n            ],\r\n        },\r\n        AGE_BY_IDCARD: {\r\n            d: \"Calculate the age based on the Chinese ID number. Support 15 or 18\",\r\n            a: \"Get age based on ID number.\",\r\n            p: [\r\n                {\r\n                    name: \"ID number\",\r\n                    detail: \"15-digit or 18-digit ID number or range.\",\r\n                },\r\n                {\r\n                    name: \"Deadline\",\r\n                    detail: \"The deadline or range of age calculation. The default is the current day.\",\r\n                },\r\n            ],\r\n        },\r\n        SEX_BY_IDCARD: {\r\n            d: \"Calculate gender based on Chinese ID number. Support 15 or 18\",\r\n            a: \"Get gender based on ID number.\",\r\n            p: [\r\n                {\r\n                    name: \"ID number\",\r\n                    detail: \"15-digit or 18-digit ID number or range.\",\r\n                },\r\n            ],\r\n        },\r\n        BIRTHDAY_BY_IDCARD: {\r\n            d: \"Calculate the birthday based on the Chinese ID number. Support 15 or 18\",\r\n            a: \"Get the birthday based on the ID number.\",\r\n            p: [\r\n                {\r\n                    name: \"ID number\",\r\n                    detail: \"15-digit or 18-digit ID number or range.\",\r\n                },\r\n                {\r\n                    name: \"Birthday format\",\r\n                    detail: \"Date type, default:0:[1900/01/01], 1:[1900-01-01], 2:[1900年1月1日]\",\r\n                },\r\n            ],\r\n        },\r\n        PROVINCE_BY_IDCARD: {\r\n            d: \"Calculate the province of birthplace based on the Chinese ID number. Support 15 or 18\",\r\n            a: \"Get the province of birthplace based on the ID number.\",\r\n            p: [\r\n                {\r\n                    name: \"ID number\",\r\n                    detail: \"15-digit or 18-digit ID number or range.\",\r\n                },\r\n            ],\r\n        },\r\n        CITY_BY_IDCARD: {\r\n            d: \"Calculate the city of birthplace based on the Chinese ID number. Support 15 or 18\",\r\n            a: \"Get the city of birthplace based on the ID number.\",\r\n            p: [\r\n                {\r\n                    name: \"ID number\",\r\n                    detail: \"15-digit or 18-digit ID number or range.\",\r\n                },\r\n            ],\r\n        },\r\n        STAR_BY_IDCARD: {\r\n            d: \"Calculate the constellation based on the Chinese ID number. Support 15 or 18\",\r\n            a: \"Get the constellation based on the ID number.\",\r\n            p: [\r\n                {\r\n                    name: \"ID number\",\r\n                    detail: \"15-digit or 18-digit ID number or range.\",\r\n                },\r\n            ],\r\n        },\r\n        ANIMAL_BY_IDCARD: {\r\n            d: \"Calculate the zodiac (rat, ox, tiger, rabbit...) based on the Chinese ID number. Support 15 or 18\",\r\n            a: \"Get the zodiac according to the ID number.\",\r\n            p: [\r\n                {\r\n                    name: \"ID number\",\r\n                    detail: \"15-digit or 18-digit ID number or range.\",\r\n                },\r\n            ],\r\n        },\r\n        ISIDCARD: {\r\n            d: \"Verify that the format of the ID card is correct. Support 15 or 18\",\r\n            a: \"Verify the correctness of the ID card format.\",\r\n            p: [\r\n                {\r\n                    name: \"ID number\",\r\n                    detail: \"15-digit or 18-digit ID number or range.\",\r\n                },\r\n            ],\r\n        },\r\n        DM_TEXT_CUTWORD: {\r\n            d: \"Text segmentation. Split a series of words into a series of individual words\",\r\n            a: \"Chinese text segmentation.\",\r\n            p: [\r\n                {\r\n                    name: \"Text\",\r\n                    detail: \"Any text that needs word segmentation.\",\r\n                },\r\n                {\r\n                    name: \"Word segmentation mode\",\r\n                    detail: \"The default is 0[precision mode], 1[full mode], 2[search engine mode].\",\r\n                },\r\n            ],\r\n        },\r\n        DM_TEXT_TFIDF: {\r\n            d: \"Use tf-idf algorithm for keyword extraction. Identify keywords from a series of text\",\r\n            a: \"tf-idf keyword recognition.\",\r\n            p: [\r\n                {\r\n                    name: \"Text\",\r\n                    detail: \"Any text that needs word segmentation.\",\r\n                },\r\n                {\r\n                    name: \"Number of keywords\",\r\n                    detail: \"The number of keywords returned by the algorithm, the default is 20\",\r\n                },\r\n                {\r\n                    name: \"Corpus\",\r\n                    detail: \"Select a corpus in a specific field, the default is 0[General], 1[Finance], 2[Medical]\",\r\n                },\r\n            ],\r\n        },\r\n        DM_TEXT_TEXTRANK: {\r\n            d: \"Use TextRank algorithm to extract keywords. Identify keywords from a series of text\",\r\n            a: \"TextRank keyword recognition.\",\r\n            p: [\r\n                {\r\n                    name: \"Text\",\r\n                    detail: \"Any text that needs word segmentation.\",\r\n                },\r\n                {\r\n                    name: \"Number of keywords\",\r\n                    detail: \"The number of keywords returned by the algorithm, the default is 20\",\r\n                },\r\n                {\r\n                    name: \"Corpus\",\r\n                    detail: \"Select a corpus in a specific field, the default is 0[General], 1[Finance], 2[Medical]\",\r\n                },\r\n            ],\r\n        },\r\n        DATA_CN_STOCK_CLOSE: {\r\n            d: \"According to the stock code and date, return the corresponding stock closing price of A shares.\",\r\n            a: \"Returns the closing price of stock.\",\r\n            p: [\r\n                {\r\n                    name: \"Stock code\",\r\n                    detail: \"6-digit stock code, required.\",\r\n                },\r\n                {\r\n                    name: \"Date\",\r\n                    detail: \"The trading day of the stock, the default is the latest trading day\",\r\n                },\r\n                {\r\n                    name: \"Reversion and exclusion\",\r\n                    detail:\r\n                        \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n                },\r\n            ],\r\n        },\r\n        DATA_CN_STOCK_OPEN: {\r\n            d: \"According to the stock code and date, return the opening price of stock.\",\r\n            a: \"Return the opening price of a shares.\",\r\n            p: [\r\n                {\r\n                    name: \"Stock code\",\r\n                    detail: \"6-digit stock code, required.\",\r\n                },\r\n                {\r\n                    name: \"Date\",\r\n                    detail: \"The trading day of the stock, the default is the latest trading day\",\r\n                },\r\n                {\r\n                    name: \"Reversion and exclusion\",\r\n                    detail:\r\n                        \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n                },\r\n            ],\r\n        },\r\n        DATA_CN_STOCK_MAX: {\r\n            d: \"According to the stock code and date, return the highest price of stock.\",\r\n            a: \"Return the highest price of stock.\",\r\n            p: [\r\n                {\r\n                    name: \"Stock code\",\r\n                    detail: \"6-digit stock code, required.\",\r\n                },\r\n                {\r\n                    name: \"Date\",\r\n                    detail: \"The trading day of the stock, the default is the latest trading day\",\r\n                },\r\n                {\r\n                    name: \"Reversion and exclusion\",\r\n                    detail:\r\n                        \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n                },\r\n            ],\r\n        },\r\n        DATA_CN_STOCK_MIN: {\r\n            d: \"According to the stock code and date, return the lowest price of stock.\",\r\n            a: \"Returns the lowest price of stock.\",\r\n            p: [\r\n                {\r\n                    name: \"Stock code\",\r\n                    detail: \"6-digit stock code, required.\",\r\n                },\r\n                {\r\n                    name: \"Date\",\r\n                    detail: \"The trading day of the stock, the default is the latest trading day\",\r\n                },\r\n                {\r\n                    name: \"Reversion and exclusion\",\r\n                    detail:\r\n                        \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n                },\r\n            ],\r\n        },\r\n        DATA_CN_STOCK_VOLUMN: {\r\n            d: \"According to the stock code and date, return the corresponding stock trading volume of A shares.\",\r\n            a: \"Returns the corresponding stock trading volume of A shares.\",\r\n            p: [\r\n                {\r\n                    name: \"Stock code\",\r\n                    detail: \"6-digit stock code, required.\",\r\n                },\r\n                {\r\n                    name: \"Date\",\r\n                    detail: \"The trading day of the stock, the default is the latest trading day\",\r\n                },\r\n                {\r\n                    name: \"Reversion and exclusion\",\r\n                    detail:\r\n                        \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n                },\r\n            ],\r\n        },\r\n        DATA_CN_STOCK_AMOUNT: {\r\n            d: \"According to the stock code and date, return the corresponding stock turnover of A shares.\",\r\n            a: \"Returns the corresponding stock turnover of A shares.\",\r\n            p: [\r\n                {\r\n                    name: \"Stock code\",\r\n                    detail: \"6-digit stock code, required.\",\r\n                },\r\n                {\r\n                    name: \"Date\",\r\n                    detail: \"The trading day of the stock, the default is the latest trading day\",\r\n                },\r\n                {\r\n                    name: \"Reversion and exclusion\",\r\n                    detail:\r\n                        \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\",\r\n                },\r\n            ],\r\n        },\r\n        ISDATE: {\r\n            d: \"Returns whether a value is a date.\",\r\n            a: \"Whether a value is a date.\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"The value to be verified as a date.\",\r\n                },\r\n            ],\r\n        },\r\n        LINESPLINES: {\r\n            d: \"Generate sparklines embedded in the cell to describe the continuous trend of data\",\r\n            a: \"Generate sparklines line chart\",\r\n            p: [\r\n                {\r\n                    name: \"Range\",\r\n                    detail: \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n                },\r\n                {\r\n                    name: \"Line color\",\r\n                    detail:\r\n                        \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9\",\r\n                },\r\n                {\r\n                    name: \"Line thickness\",\r\n                    detail: \"Line thickness of the line graph, the default is 1px\",\r\n                },\r\n                {\r\n                    name: \"Auxiliary line\",\r\n                    detail:\r\n                        \"A horizontal line, which can be min, max, avg, median, range or custom value, default 0 none\",\r\n                },\r\n                {\r\n                    name: \"Auxiliary line color\",\r\n                    detail: \"Color setting of auxiliary line, same as line color configuration, default #000\",\r\n                },\r\n                {\r\n                    name: \"Maximum mark\",\r\n                    detail:\r\n                        \"Identifies the maximum value of the line graph, the same line color configuration, default 0 does not display\",\r\n                },\r\n                {\r\n                    name: \"Minimum mark\",\r\n                    detail:\r\n                        \"Identify the minimum value of the line graph, the same line color configuration, default 0 does not display\",\r\n                },\r\n                {\r\n                    name: \"Mark size\",\r\n                    detail: \"The maximum and minimum mark size settings, the default is 1.5\",\r\n                },\r\n            ],\r\n        },\r\n        AREASPLINES: {\r\n            d:\r\n                \"Generate sparklines embedded in the cell area chart, generally used to describe the continuous cumulative value trend of the data\",\r\n            a: \"Generate sparklines area chart\",\r\n            p: [\r\n                {\r\n                    name: \"Range\",\r\n                    detail: \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n                },\r\n                {\r\n                    name: \"Line color\",\r\n                    detail:\r\n                        \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9\",\r\n                },\r\n                {\r\n                    name: \"Fill color\",\r\n                    detail: \"Form an area chart, the same line color configuration, default 0 does not display\",\r\n                },\r\n                {\r\n                    name: \"Line thickness\",\r\n                    detail: \"Line thickness of the line graph, the default is 1px\",\r\n                },\r\n                {\r\n                    name: \"Auxiliary line\",\r\n                    detail:\r\n                        \"A horizontal line, which can be min, max, avg, median, range or custom value, default 0 none\",\r\n                },\r\n                {\r\n                    name: \"Auxiliary line color\",\r\n                    detail: \"Color setting of auxiliary line, same as line color configuration, default #000\",\r\n                },\r\n            ],\r\n        },\r\n        COLUMNSPLINES: {\r\n            d:\r\n                \"Generate sparklines embedded in the vertical histogram of cells, generally used to describe the size of discrete data\",\r\n            a: \"Generate sparklines vertical histogram\",\r\n            p: [\r\n                {\r\n                    name: \"Range\",\r\n                    detail: \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n                },\r\n                {\r\n                    name: \"Bar interval\",\r\n                    detail: \"The distance between bars, the default is 1\",\r\n                },\r\n                {\r\n                    name: \"Bar color\",\r\n                    detail:\r\n                        \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c\",\r\n                },\r\n                {\r\n                    name: \"Negative bar color\",\r\n                    detail:\r\n                        \"Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552\",\r\n                },\r\n                {\r\n                    name: \"Max\",\r\n                    detail:\r\n                        \"The maximum value of the bar chart, used to standardize the length of the bar chart, the default is to automatically calculate false, auto, null\",\r\n                },\r\n                {\r\n                    name: \"Color palette\",\r\n                    detail:\r\n                        \"The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty\",\r\n                },\r\n            ],\r\n        },\r\n        STACKCOLUMNSPLINES: {\r\n            d:\r\n                \"Generate sparklines, a cumulative vertical histogram embedded in a cell, generally used to describe the numerical size of multiple dimensions of discrete data\",\r\n            a: \"Generate sparklines cumulative vertical histogram\",\r\n            p: [\r\n                {\r\n                    name: \"Range\",\r\n                    detail: \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n                },\r\n                {\r\n                    name: \"Stack by column\",\r\n                    detail: \"If you need to stack by row, set this item to false or 0, the default is 1\",\r\n                },\r\n                {\r\n                    name: \"Bar interval\",\r\n                    detail: \"The distance between bars, the default is 1\",\r\n                },\r\n                {\r\n                    name: \"Max\",\r\n                    detail:\r\n                        \"The maximum value of the cumulative bar, used to regulate the length of the bar, the default is to automatically calculate false, auto, null\",\r\n                },\r\n                {\r\n                    name: \"Color palette\",\r\n                    detail:\r\n                        \"The color palette can individually set the bar color of each dimension, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n                },\r\n            ],\r\n        },\r\n        BARSPLINES: {\r\n            d: \"Generate sparklines embedded in the cell, generally used to describe the size of discrete data\",\r\n            a: \"Generate sparklines horizontal bar graph\",\r\n            p: [\r\n                {\r\n                    name: \"Range\",\r\n                    detail: \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n                },\r\n                {\r\n                    name: \"Bar interval\",\r\n                    detail: \"The distance between bars, the default is 1\",\r\n                },\r\n                {\r\n                    name: \"Bar color\",\r\n                    detail:\r\n                        \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c\",\r\n                },\r\n                {\r\n                    name: \"Negative bar color\",\r\n                    detail:\r\n                        \"Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552\",\r\n                },\r\n                {\r\n                    name: \"Max\",\r\n                    detail:\r\n                        \"The maximum value of the bar chart, used to standardize the length of the bar chart, the default is to automatically calculate false, auto, null\",\r\n                },\r\n                {\r\n                    name: \"Color palette\",\r\n                    detail:\r\n                        \"The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty\",\r\n                },\r\n            ],\r\n        },\r\n        STACKBARSPLINES: {\r\n            d:\r\n                \"Generate sparklines, a cumulative horizontal bar graph embedded in a cell, which is generally used to describe the numerical size of multiple dimensions of discrete data\",\r\n            a: \"Generate sparklines cumulative horizontal bar graph\",\r\n            p: [\r\n                {\r\n                    name: \"Range\",\r\n                    detail: \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n                },\r\n                {\r\n                    name: \"Stack by column\",\r\n                    detail: \"If you need to stack by row, set this item to false or 0, the default is 1\",\r\n                },\r\n                {\r\n                    name: \"Bar interval\",\r\n                    detail: \"The distance between bars, the default is 1\",\r\n                },\r\n                {\r\n                    name: \"Max\",\r\n                    detail:\r\n                        \"The maximum value of the cumulative bar, used to regulate the length of the bar, the default is to automatically calculate false, auto, null\",\r\n                },\r\n                {\r\n                    name: \"Color palette\",\r\n                    detail:\r\n                        \"The color palette can individually set the bar color of each dimension, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n                },\r\n            ],\r\n        },\r\n        DISCRETESPLINES: {\r\n            d: \"Generate sparklines embedded in the cell, generally used to describe the trend of discrete data\",\r\n            a: \"Generate sparklines discrete graph\",\r\n            p: [\r\n                {\r\n                    name: \"Range\",\r\n                    detail: \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n                },\r\n                {\r\n                    name: \"Segmentation threshold\",\r\n                    detail:\r\n                        \"Discrete graph column color distinction, for example: if the value is 0, blue is greater than 0, red is less than 0, and the default is 0\",\r\n                },\r\n                {\r\n                    name: \"Above threshold color\",\r\n                    detail:\r\n                        \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9\",\r\n                },\r\n                {\r\n                    name: \"Below threshold color\",\r\n                    detail:\r\n                        \"The color setting of the bar below the threshold, the same as the color above the threshold, default #fc5c5c\",\r\n                },\r\n            ],\r\n        },\r\n        TRISTATESPLINES: {\r\n            d:\r\n                \"Generate sparklines, a three-state graph embedded in the cell, which is generally used to describe the trend of three situations, such as winning, losing, or drawing.\",\r\n            a: \"Generate sparklines three-state graph\",\r\n            p: [\r\n                {\r\n                    name: \"Range\",\r\n                    detail: \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n                },\r\n                {\r\n                    name: \"Bar interval\",\r\n                    detail: \"The distance between bars, the default is 1\",\r\n                },\r\n                {\r\n                    name: \"Bar color\",\r\n                    detail:\r\n                        \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c\",\r\n                },\r\n                {\r\n                    name: \"Negative bar color\",\r\n                    detail:\r\n                        \"Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552\",\r\n                },\r\n                {\r\n                    name: \"Zero value bar color\",\r\n                    detail:\r\n                        \"Zero value bar color setting, representing 0 value color, the same color configuration of the bar, default #999\",\r\n                },\r\n                {\r\n                    name: \"Color palette\",\r\n                    detail:\r\n                        \"The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty\",\r\n                },\r\n            ],\r\n        },\r\n        PIESPLINES: {\r\n            d: \"Generate sparklines pie chart embedded in the cell, generally used to describe the proportion of data\",\r\n            a: \"Generate sparklines pie chart\",\r\n            p: [\r\n                {\r\n                    name: \"Range\",\r\n                    detail: \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n                },\r\n                {\r\n                    name: \"Rotation angle\",\r\n                    detail: \"The rotation angle of the pie chart, the default is 0\",\r\n                },\r\n                {\r\n                    name: \"border\",\r\n                    detail: \"Pie chart border size, default is none 0\",\r\n                },\r\n                {\r\n                    name: \"Border color\",\r\n                    detail: \"The border color of the pie chart, the default is #000\",\r\n                },\r\n                {\r\n                    name: \"Color palette\",\r\n                    detail:\r\n                        \"The color of the slice can be set in the palette, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n                },\r\n            ],\r\n        },\r\n        BOXSPLINES: {\r\n            d:\r\n                \"Generate sparklines embedded in the cell box plot, generally used to describe the statistical distribution of the data set\",\r\n            a: \"Generate sparklines box plot\",\r\n            p: [\r\n                {\r\n                    name: \"Range\",\r\n                    detail: \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\",\r\n                },\r\n                {\r\n                    name: \"Outlier ratio\",\r\n                    detail:\r\n                        \"The threshold range of outliers, if it is 0 or false, it will not be displayed, the default is 1.5 times\",\r\n                },\r\n                {\r\n                    name: \"Target value\",\r\n                    detail: \"The target value setting on the box plot, the default is false and does not display\",\r\n                },\r\n                {\r\n                    name: \"Point size\",\r\n                    detail: \"The radius of the target point and outlier is set, the default is 1.5\",\r\n                },\r\n            ],\r\n        },\r\n        BULLETSPLINES: {\r\n            d: \"Generate sparklines embedded in the cell, generally used to describe the task achievement rate\",\r\n            a: \"Generating sparklines bullets\",\r\n            p: [\r\n                {\r\n                    name: \"Target\",\r\n                    detail:\r\n                        \"The numerical value can be calculated effectively for the achieved target value, such as A1, 100, etc.\",\r\n                },\r\n                {\r\n                    name: \"achieved\",\r\n                    detail:\r\n                        \"Only when the value is completed can the value be calculated effectively, such as A1, 100, etc.\",\r\n                },\r\n                {\r\n                    name: \"Contrast\",\r\n                    detail:\r\n                        \"Comparative values, such as excess, minimum, and bottom line for awards, can be effectively calculated, such as A1, 100, etc. You can set up to 9 comparison values\",\r\n                },\r\n            ],\r\n        },\r\n        COMPOSESPLINES: {\r\n            d: \"Support multiple types of pictures in the same cell, each parameter represents a sparklines diagram\",\r\n            a: \"Combine sparklines graphs into one cell\",\r\n            p: [\r\n                {\r\n                    name: \"config\",\r\n                    detail:\r\n                        \"Sparklines chart settings, such as A1:A20, a completed pie chart, line chart settings, etc.\",\r\n                },\r\n            ],\r\n        },\r\n        SORT: {\r\n            d: \"Sorts the rows of a given array or range by the values in one or more columns.\",\r\n            a: \"Sorts rows of range by specified column.\",\r\n            p: [\r\n                {\r\n                    name: \"range\",\r\n                    detail: \"The data to be sorted.\",\r\n                },\r\n                {\r\n                    name: \"sort_column\",\r\n                    detail:\r\n                        \"The index of the column in `range` or a range outside of `range` containing the values by which to sort.\",\r\n                },\r\n                {\r\n                    name: \"is_ascending\",\r\n                    detail:\r\n                        \"`TRUE` or `FALSE` indicating whether to sort `sort_column` in ascending order. `FALSE` sorts in descending order.\",\r\n                },\r\n                {\r\n                    name: \"sort_column2\",\r\n                    detail: \"Additional columns.\",\r\n                },\r\n            ],\r\n        },\r\n        FILTER: {\r\n            d:\r\n                \"Returns a filtered version of the source range, returning only rows or columns which meet the specified conditions.\",\r\n            a: \"Filters a range based off provided conditions.\",\r\n            p: [\r\n                {\r\n                    name: \"range\",\r\n                    detail: \"The data to be filtered.\",\r\n                },\r\n                {\r\n                    name: \"condition1\",\r\n                    detail:\r\n                        \"A column or row containing true or false values corresponding to the first column or row of `range`, or an array formula evaluating to true or false.\",\r\n                },\r\n                {\r\n                    name: \"condition2\",\r\n                    detail:\r\n                        \"Additional rows or columns containing boolean values `TRUE` or `FALSE` indicating whether the corresponding row or column in `range` should pass through `FILTER`. Can also contain array formula expressions which evaluate to such rows or columns. All conditions must be of the same type (row or column). Mixing row conditions and column conditions is not permitted.\",\r\n                },\r\n            ],\r\n        },\r\n        UNIQUE: {\r\n            d:\r\n                \"Returns unique rows in the provided source range, discarding duplicates. Rows are returned in the order in which they first appear in the source range.\",\r\n            a: \"Unique rows in the provided source range.\",\r\n            p: [\r\n                {\r\n                    name: \"range\",\r\n                    detail: \"The data to filter by unique entries.\",\r\n                },\r\n                {\r\n                    name: \"by_col\",\r\n                    detail:\r\n                        \"[Option] - Logical value, indicating how to compare; by row = FALSE() or omitted; by column = TRUE().\",\r\n                },\r\n                {\r\n                    name: \"occurs_once\",\r\n                    detail:\r\n                        \"[Option] - Logical value, only one occurrence in the unique value is returned = TRUE(); including all unique values = FALSE() or omitted.\",\r\n                },\r\n            ],\r\n        },\r\n        RANDARRAY: {\r\n            d:\r\n                \"Returns a grid of random numbers between 0 inclusive and 1 exclusive. The grid size will match the provided rows and columns arguments. If neither rows nor columns are provided, then the grid will be size 1 x 1.\",\r\n            a: \"Returns a grid of random numbers.\",\r\n            p: [\r\n                {\r\n                    name: \"rows\",\r\n                    detail: \"The number of rows to populate with a random number.\",\r\n                },\r\n                {\r\n                    name: \"columns\",\r\n                    detail: \"The number of columns to populate with a random number.\",\r\n                },\r\n            ],\r\n        },\r\n        SEQUENCE: {\r\n            d:\r\n                \"Returns a grid of sequential numbers starting at a specified start value and  increasing by a specified step size. By default, the sequence starts at and  increases by 1.\",\r\n            a: \"Returns a grid of sequential numbers.\",\r\n            p: [\r\n                {\r\n                    name: \"rows\",\r\n                    detail: \"The number of rows in the function's resulting grid.\",\r\n                },\r\n                {\r\n                    name: \"columns\",\r\n                    detail:\r\n                        \"The number of columns in the function's resulting grid. If omitted, the result grid will have 1 column.\",\r\n                },\r\n                {\r\n                    name: \"start\",\r\n                    detail: \"The number, at which to start the sequence. If omitted, the sequence will start at 1.\",\r\n                },\r\n                {\r\n                    name: \"step\",\r\n                    detail:\r\n                        \"The amount each value in the sequence will differ by. If omitted, each value will differ by 1.\",\r\n                },\r\n            ],\r\n        },\r\n        EVALUATE: {\r\n            d: \"Evaluate a formula or expression expressed in words and return the result\",\r\n            a: \"Evaluate according to literal formula or expression.\",\r\n            p: [\r\n                {\r\n                    name: \"expression\",\r\n                    detail: \"Formula or expression\",\r\n                },\r\n            ],\r\n        },\r\n        REMOTE: {\r\n            d: \"Calls a function on a remote server\",\r\n            a: \"Calls a function on a remote back end server/API.\",\r\n            p: [\r\n                {\r\n                    name: \"remote_expression\",\r\n                    detail: \"Formula\",\r\n                },\r\n            ],\r\n        },\r\n    },\r\n    toolbar: {\r\n        undo: \"Undo\",\r\n        redo: \"Redo\",\r\n        paintFormat: \"Paint format\",\r\n        currencyFormat: \"Format as currency\",\r\n        percentageFormat: \"Format as percent\",\r\n        numberDecrease: \"Decrease decimal places\",\r\n        numberIncrease: \"Increase decimal places\",\r\n        moreFormats: \"More formats\",\r\n        font: \"Font\",\r\n        fontSize: \"Font size\",\r\n        bold: \"Bold (Ctrl+B)\",\r\n        italic: \"Italic (Ctrl+I)\",\r\n        strikethrough: \"Strikethrough (Alt+Shift+5)\",\r\n        underline: \"Underline\",\r\n        textColor: \"Text color\",\r\n        chooseColor: \"choose color\",\r\n        resetColor: \"Reset\",\r\n        customColor: \"CUSTOM\",\r\n        alternatingColors: \"Alternating colors\",\r\n        confirmColor: \"OK\",\r\n        cancelColor: \"Cancel\",\r\n        collapse: \"Collapse\",\r\n        fillColor: \"Fill color\",\r\n        border: \"Border\",\r\n        borderStyle: \"Border style\",\r\n        mergeCell: \"Merge cells\",\r\n        chooseMergeType: \"Choose merge type\",\r\n        horizontalAlign: \"Horizontal align\",\r\n        verticalAlign: \"Vertical align\",\r\n        alignment: \"Alignment\",\r\n        textWrap: \"Text wrap\",\r\n        textWrapMode: \"Text wrap mode\",\r\n        textRotate: \"Text rotate\",\r\n        textRotateMode: \"Text rotate mode\",\r\n        freezeTopRow: \"Freeze first row\",\r\n        sortAndFilter: \"Sort and filter\",\r\n        findAndReplace: \"Find and replace\",\r\n        sum: \"SUM\",\r\n        autoSum: \"Auto SUM\",\r\n        moreFunction: \"More functions\",\r\n        conditionalFormat: \"Conditional format\",\r\n        postil: \"Comment\",\r\n        pivotTable: \"Pivot Table\",\r\n        chart: \"Chart\",\r\n        screenshot: \"Screenshot\",\r\n        splitColumn: \"Split text\",\r\n        insertImage: \"Insert image\",\r\n        exportXlsx: \"Export Xlsx\",\r\n        insertLink: \"Insert link\",\r\n        dataVerification: \"Data verification\",\r\n        protection: \"Protect the sheet\",\r\n\r\n        clearText: \"Clear color\",\r\n        noColorSelectedText: \"No color is selected\",\r\n\r\n        toolMore: \"More\",\r\n        toolLess: \"Less\",\r\n        toolClose: \"Close\",\r\n        toolMoreTip: \"More features\",\r\n        moreOptions: \"More options\",\r\n\r\n        cellFormat: \"Cell format config\",\r\n        print: \"Print\",\r\n    },\r\n    alternatingColors: {\r\n        applyRange: \"Apply to range\",\r\n        selectRange: \"Select a data range\",\r\n        header: \"Header\",\r\n        footer: \"Footer\",\r\n\r\n        errorInfo:\r\n            \"Cannot perform this operation on multiple selection areas, please select a single area and try again\",\r\n        textTitle: \"Format style\",\r\n        custom: \"CUSTOM\",\r\n        close: \"close\",\r\n        selectionTextColor: \"Click to select text color\",\r\n        selectionCellColor: \"Click to select cell color\",\r\n        removeColor: \"Remove alternating colors\",\r\n        colorShow: \"color\",\r\n        currentColor: \"Current\",\r\n\r\n        tipSelectRange: \"Please select the range of alternating colors\",\r\n        errorNoRange: \"No range is selected\",\r\n        errorExistColors: \"Alternating colors already exist and cannot be edited\",\r\n    },\r\n    button: {\r\n        confirm: \"OK\",\r\n        cancel: \"Cancel\",\r\n        close: \"Close\",\r\n        update: \"Update\",\r\n        delete: \"Delete\",\r\n        insert: \"Insert\",\r\n        prevPage: \"Previous\",\r\n        nextPage: \"Next\",\r\n        total: \"total:\",\r\n    },\r\n    paint: {\r\n        start: \"Paint format start\",\r\n        end: \"ESC\",\r\n\r\n        tipSelectRange: \"Please select the range to be copied\",\r\n        tipNotMulti: \"Cannot perform this operation on multiple selection ranges\",\r\n    },\r\n    format: {\r\n        moreCurrency: \"More currency formats\",\r\n        moreDateTime: \"More date and time formats\",\r\n        moreNumber: \"More number formats\",\r\n\r\n        titleCurrency: \"Currency formats\",\r\n        decimalPlaces: \"Decimal places\",\r\n        titleDateTime: \"Date and time formats\",\r\n        titleNumber: \"Number formats\",\r\n    },\r\n    info: {\r\n        detailUpdate: \"New opened\",\r\n        detailSave: \"Local cache restored\",\r\n        row: \"\",\r\n        column: \"\",\r\n        loading: \"Loading...\",\r\n\r\n        copy: \"Copy\",\r\n        return: \"Exit\",\r\n        rename: \"Rename\",\r\n        tips: \"WorkBook rename\",\r\n        noName: \"Untitled spreadsheet\",\r\n        wait: \"waiting for update\",\r\n\r\n        add: \"Add\",\r\n        addLast: \"more rows at bottom\",\r\n        backTop: \"Back to the top\",\r\n        pageInfo: \"Total ${total}，${totalPage} page，current ${currentPage}\",\r\n        nextPage: \"Next\",\r\n\r\n        tipInputNumber: \"Please enter the number\",\r\n        tipInputNumberLimit: \"The increase range is limited to 1-100\",\r\n\r\n        tipRowHeightLimit: \"Row height must be between 0 ~ 545\",\r\n        tipColumnWidthLimit: \"The column width must be between 0 ~ 2038\",\r\n        pageInfoFull: \"Total ${total}，${totalPage} page，All data displayed\",\r\n    },\r\n    currencyDetail: {\r\n        RMB: \"RMB\",\r\n        USdollar: \"US dollar\",\r\n        EUR: \"EUR\",\r\n        GBP: \"GBP\",\r\n        HK: \"HK\",\r\n        JPY: \"JPY\",\r\n        AlbanianLek: \"Albanian Lek\",\r\n        AlgerianDinar: \"Algerian Dinar\",\r\n        Afghani: \"Afghani\",\r\n        ArgentinePeso: \"Argentine Peso\",\r\n        UnitedArabEmiratesDirham: \"United Arab Emirates Dirham\",\r\n        ArubanFlorin: \"Aruban Florin\",\r\n        OmaniRial: \"Omani Rial\",\r\n        Azerbaijanimanat: \"Azerbaijani manat\",\r\n        EgyptianPound: \"Egyptian Pound\",\r\n        EthiopianBirr: \"Ethiopian Birr\",\r\n        AngolaKwanza: \"Angola Kwanza\",\r\n        AustralianDollar: \"Australian Dollar\",\r\n        Patacas: \"Patacas\",\r\n        BarbadosDollar: \"Barbados Dollar\",\r\n        PapuaNewGuineaKina: \"Papua New Guinea Kina\",\r\n        BahamianDollar: \"Bahamian Dollar\",\r\n        PakistanRupee: \"Pakistan Rupee\",\r\n        ParaguayanGuarani: \"Paraguayan Guarani\",\r\n        BahrainiDinar: \"Bahraini Dinar\",\r\n        PanamanianBalboa: \"Panamanian Balboa\",\r\n        Brazilianreal: \"Brazilian real\",\r\n        Belarusianruble: \"Belarusian ruble\",\r\n        BermudianDollar: \"Bermudian Dollar\",\r\n        BulgarianLev: \"Bulgarian Lev\",\r\n        IcelandKrona: \"Iceland Krona\",\r\n        BosniaHerzegovinaConvertibleMark: \"Bosnia-Herzegovina Convertible Mark\",\r\n        PolishZloty: \"Polish Zloty\",\r\n        Boliviano: \"Boliviano\",\r\n        BelizeDollar: \"Belize Dollar\",\r\n        BotswanaPula: \"Botswana Pula\",\r\n        NotDannuzhamu: \"Not Dannuzhamu\",\r\n        BurundiFranc: \"Burundi Franc\",\r\n        NorthKoreanWon: \"North Korean Won\",\r\n        DanishKrone: \"Danish Krone\",\r\n        EastCaribbeanDollar: \"East Caribbean Dollar\",\r\n        DominicaPeso: \"Dominica Peso\",\r\n        RussianRuble: \"Russian Ruble\",\r\n        EritreanNakfa: \"Eritrean Nakfa\",\r\n        CFAfranc: \"CFA franc\",\r\n        PhilippinePeso: \"Philippine Peso\",\r\n        FijiDollar: \"Fiji Dollar\",\r\n        CapeVerdeEscudo: \"Cape Verde Escudo\",\r\n        FalklandIslandsPound: \"Falkland Islands Pound\",\r\n        GambianDalasi: \"Gambian Dalasi\",\r\n        Congolesefranc: \"Congolese franc\",\r\n        ColombianPeso: \"Colombian Peso\",\r\n        CostaRicanColon: \"Costa Rican Colon\",\r\n        CubanPeso: \"Cuban Peso\",\r\n        Cubanconvertiblepeso: \"Cuban convertible peso\",\r\n        GuyanaDollar: \"Guyana Dollar\",\r\n        KazakhstanTenge: \"Kazakhstan Tenge\",\r\n        Haitiangourde: \"Haitian gourde\",\r\n        won: \"won\",\r\n        NetherlandsAntillesGuilder: \"Netherlands Antilles Guilder\",\r\n        Honduraslempiras: \"Honduras lempiras\",\r\n        DjiboutiFranc: \"Djibouti Franc\",\r\n        KyrgyzstanSom: \"Kyrgyzstan Som\",\r\n        GuineaFranc: \"Guinea Franc\",\r\n        CanadianDollar: \"Canadian Dollar\",\r\n        GhanaianCedi: \"Ghanaian Cedi\",\r\n        Cambodianriel: \"Cambodian riel\",\r\n        CzechKoruna: \"Czech Koruna\",\r\n        ZimbabweDollar: \"Zimbabwe Dollar\",\r\n        QatariRiyal: \"Qatari Riyal\",\r\n        CaymanIslandsDollar: \"Cayman Islands Dollar\",\r\n        Comorianfranc: \"Comorian franc\",\r\n        KuwaitiDinar: \"Kuwaiti Dinar\",\r\n        CroatianKuna: \"Croatian Kuna\",\r\n        KenyanShilling: \"Kenyan Shilling\",\r\n        LesothoLoti: \"Lesotho Loti\",\r\n        LaoKip: \"Lao Kip\",\r\n        LebanesePound: \"Lebanese Pound\",\r\n        Lithuanianlitas: \"Lithuanian litas\",\r\n        LibyanDinar: \"Libyan Dinar\",\r\n        LiberianDollar: \"Liberian Dollar\",\r\n        RwandaFranc: \"Rwanda Franc\",\r\n        RomanianLeu: \"Romanian Leu\",\r\n        MalagasyAriary: \"Malagasy Ariary\",\r\n        MaldivianRufiyaa: \"Maldivian Rufiyaa\",\r\n        MalawiKwacha: \"Malawi Kwacha\",\r\n        MalaysianRinggit: \"Malaysian Ringgit\",\r\n        MacedoniawearingDinar: \"Macedonia wearing Dinar\",\r\n        MauritiusRupee: \"Mauritius Rupee\",\r\n        MauritanianOuguiya: \"Mauritanian Ouguiya\",\r\n        MongolianTugrik: \"Mongolian Tugrik\",\r\n        BangladeshiTaka: \"Bangladeshi Taka\",\r\n        PeruvianNuevoSol: \"Peruvian Nuevo Sol\",\r\n        MyanmarKyat: \"Myanmar Kyat\",\r\n        MoldovanLeu: \"Moldovan Leu\",\r\n        MoroccanDirham: \"Moroccan Dirham\",\r\n        MozambiqueMetical: \"Mozambique Metical\",\r\n        MexicanPeso: \"Mexican Peso\",\r\n        NamibianDollar: \"Namibian Dollar\",\r\n        SouthAfricanRand: \"South African Rand\",\r\n        SouthSudanesePound: \"South Sudanese Pound\",\r\n        NicaraguaCordoba: \"Nicaragua Cordoba\",\r\n        NepaleseRupee: \"Nepalese Rupee\",\r\n        NigerianNaira: \"Nigerian Naira\",\r\n        NorwegianKrone: \"Norwegian Krone\",\r\n        GeorgianLari: \"Georgian Lari\",\r\n        RMBOffshore: \"RMB (Offshore)\",\r\n        SwedishKrona: \"Swedish Krona\",\r\n        SwissFranc: \"Swiss Franc\",\r\n        SerbianDinar: \"Serbian Dinar\",\r\n        SierraLeone: \"Sierra Leone\",\r\n        SeychellesRupee: \"Seychelles Rupee\",\r\n        SaudiRiyal: \"Saudi Riyal\",\r\n        SaoTomeDobra: \"Sao Tome Dobra\",\r\n        SaintHelenapound: \"Saint Helena pound\",\r\n        SriLankaRupee: \"Sri Lanka Rupee\",\r\n        SwazilandLilangeni: \"Swaziland Lilangeni\",\r\n        SudanesePound: \"Sudanese Pound\",\r\n        Surinamesedollar: \"Surinamese dollar\",\r\n        SolomonIslandsDollar: \"Solomon Islands Dollar\",\r\n        SomaliShilling: \"Somali Shilling\",\r\n        TajikistanSomoni: \"Tajikistan Somoni\",\r\n        PacificFranc: \"Pacific Franc\",\r\n        ThaiBaht: \"Thai Baht\",\r\n        TanzanianShilling: \"Tanzanian Shilling\",\r\n        TonganPaanga: \"Tongan Pa'anga\",\r\n        TrinidadandTobagoDollar: \"Trinidad and Tobago Dollar\",\r\n        TunisianDinar: \"Tunisian Dinar\",\r\n        TurkishLira: \"Turkish Lira\",\r\n        VanuatuVatu: \"Vanuatu Vatu\",\r\n        GuatemalanQuetzal: \"Guatemalan Quetzal\",\r\n        CommissionBolivar: \"Commission Bolivar\",\r\n        BruneiDollar: \"Brunei Dollar\",\r\n        UgandanShilling: \"Ugandan Shilling\",\r\n        UkrainianHryvnia: \"Ukrainian Hryvnia\",\r\n        UruguayanPeso: \"Uruguayan Peso\",\r\n        Uzbekistansom: \"Uzbekistan som\",\r\n        WesternSamoaTala: \"Western Samoa Tala\",\r\n        SingaporeDollar: \"Singapore Dollar\",\r\n        NT: \"NT\",\r\n        NewZealandDollar: \"New Zealand Dollar\",\r\n        HungarianForint: \"Hungarian Forint\",\r\n        SyrianPound: \"Syrian Pound\",\r\n        JamaicanDollar: \"Jamaican Dollar\",\r\n        ArmenianDram: \"Armenian Dram\",\r\n        YemeniRial: \"Yemeni Rial\",\r\n        IraqiDinar: \"Iraqi Dinar\",\r\n        IranianRial: \"Iranian Rial\",\r\n        NewIsraeliShekel: \"New Israeli Shekel\",\r\n        IndianRupee: \"Indian Rupee\",\r\n        IndonesianRupiah: \"Indonesian Rupiah\",\r\n        JordanianDinar: \"Jordanian Dinar\",\r\n        VND: \"VND\",\r\n        ZambianKwacha: \"Zambian Kwacha\",\r\n        GibraltarPound: \"Gibraltar Pound\",\r\n        ChileanPeso: \"Chilean Peso\",\r\n        CFAFrancBEAC: \"CFA Franc BEAC\",\r\n    },\r\n    defaultFmt: [\r\n        { text: \"Automatic\", value: \"General\", example: \"\" },\r\n        { text: \"Plain text\", value: \"@\", example: \"\" },\r\n        { text: \"\", value: \"split\", example: \"\" },\r\n        { text: \"Number\", value: \"##0.00\", example: \"1000.12\" },\r\n        { text: \"Percent\", value: \"#0.00%\", example: \"12.21%\" },\r\n        { text: \"Scientific\", value: \"0.00E+00\", example: \"1.01E+5\" },\r\n        { text: \"\", value: \"split\", example: \"\" },\r\n        { text: \"Accounting\", value: \"¥(0.00)\", example: \"¥(1200.09)\" },\r\n\r\n        { text: \"Currency\", value: \"¥0.00\", example: \"¥1200.09\" },\r\n\r\n        { text: \"\", value: \"split\", example: \"\" },\r\n        { text: \"Date\", value: \"yyyy-MM-dd\", example: \"2017-11-29\" },\r\n        { text: \"Time\", value: \"hh:mm AM/PM\", example: \"3:00 PM\" },\r\n        { text: \"Time 24H\", value: \"hh:mm\", example: \"15:00\" },\r\n        { text: \"Date time\", value: \"yyyy-MM-dd hh:mm AM/PM\", example: \"2017-11-29 3:00 PM\" },\r\n        { text: \"Date time 24 H\", value: \"yyyy-MM-dd hh:mm\", example: \"2017-11-29 15:00\" },\r\n        { text: \"\", value: \"split\", example: \"\" },\r\n        { text: \"Custom formats\", value: \"fmtOtherSelf\", example: \"more\" },\r\n    ],\r\n    dateFmtList: [\r\n        {\r\n            name: \"1930-08-05\",\r\n            value: \"yyyy-MM-dd\",\r\n        },\r\n        {\r\n            name: \"1930/8/5\",\r\n            value: \"yyyy/MM/dd\",\r\n        },\r\n        {\r\n            name: \"08-05\",\r\n            value: \"MM-dd\",\r\n        },\r\n        {\r\n            name: \"8-5\",\r\n            value: \"M-d\",\r\n        },\r\n        {\r\n            name: \"13:30:30\",\r\n            value: \"h:mm:ss\",\r\n        },\r\n        {\r\n            name: \"13:30\",\r\n            value: \"h:mm\",\r\n        },\r\n        {\r\n            name: \"PM 01:30\",\r\n            value: \"AM/PM hh:mm\",\r\n        },\r\n        {\r\n            name: \"PM 1:30\",\r\n            value: \"AM/PM h:mm\",\r\n        },\r\n        {\r\n            name: \"PM 1:30:30\",\r\n            value: \"AM/PM h:mm:ss\",\r\n        },\r\n        {\r\n            name: \"08-05 PM 01:30\",\r\n            value: \"MM-dd AM/PM hh:mm\",\r\n        },\r\n    ],\r\n    fontFamily: {\r\n        MicrosoftYaHei: \"YaHei\",\r\n    },\r\n    fontarray: [\"Times New Roman\", \"Arial\", \"Tahoma\", \"Verdana\"],\r\n    fontjson: { \"times new roman\": 0, arial: 1, tahoma: 2, verdana: 3 },\r\n    border: {\r\n        borderTop: \"borderTop\",\r\n        borderBottom: \"borderBottom\",\r\n        borderLeft: \"borderLeft\",\r\n        borderRight: \"borderRight\",\r\n        borderNone: \"borderNone\",\r\n        borderAll: \"borderAll\",\r\n        borderOutside: \"borderOutside\",\r\n        borderInside: \"borderInside\",\r\n        borderHorizontal: \"borderHorizontal\",\r\n        borderVertical: \"borderVertical\",\r\n        borderColor: \"borderColor\",\r\n        borderSize: \"borderSize\",\r\n    },\r\n    merge: {\r\n        mergeAll: \"Merge all\",\r\n        mergeV: \"Vertically\",\r\n        mergeH: \"Horizontally\",\r\n        mergeCancel: \"Unmerge\",\r\n        overlappingError: \"Cannot merge overlapping areas\",\r\n        partiallyError: \"Cannot perform this operation on partially merged cells\",\r\n    },\r\n    align: {\r\n        left: \"left\",\r\n        center: \"center\",\r\n        right: \"right\",\r\n\r\n        top: \"Top\",\r\n        middle: \"Middle\",\r\n        bottom: \"Bottom\",\r\n    },\r\n    textWrap: {\r\n        overflow: \"Overflow\",\r\n        wrap: \"Wrap\",\r\n        clip: \"Clip\",\r\n    },\r\n    rotation: {\r\n        none: \"None\",\r\n        angleup: \"Tilt Up\",\r\n        angledown: \"Tilt Down\",\r\n        vertical: \"Stack Vertically\",\r\n        rotationUp: \"Rotate Up\",\r\n        rotationDown: \"Rotate Down\",\r\n    },\r\n    freezen: {\r\n        default: \"Freeze\",\r\n        freezenRow: \"First Row\",\r\n        freezenColumn: \"First Column\",\r\n        freezenRC: \"Both\",\r\n        freezenRowRange: \"Freezen row range\",\r\n        freezenColumnRange: \"Freezen column range\",\r\n        freezenRCRange: \"Freezen both range\",\r\n        freezenCancel: \"Cancel\",\r\n\r\n        noSeletionError: \"No Range to be selected\",\r\n        rangeRCOverErrorTitle: \"Freeze reminder\",\r\n        rangeRCOverError:\r\n            \"The frozen pane is beyond the visible range, which will lead to abnormal operation. Please reset the frozen area.\",\r\n    },\r\n    sort: {\r\n        asc: \"Ascending \",\r\n        desc: \"Descending \",\r\n        custom: \"Custom sort\",\r\n\r\n        hasTitle: \"Data has a header row\",\r\n        sortBy: \"Sort by\",\r\n        addOthers: \"Add another sort column\",\r\n        close: \"close\",\r\n        confirm: \"sort\",\r\n\r\n        columnOperation: \"Column\",\r\n        secondaryTitle: \"then by\",\r\n\r\n        sortTitle: \"Sort range\",\r\n\r\n        sortRangeTitle: \"Sort range from\",\r\n        sortRangeTitleTo: \"to\",\r\n\r\n        noRangeError:\r\n            \"Cannot perform this operation on multiple selection areas, please select a single range and try again\",\r\n        mergeError: \"There are merged cells in the selection, this operation cannot be performed!\",\r\n        columnSortMergeError:\r\n            \"Column sorting will extend to the entire table selection. There are merged cells, this operation cannot be performed. Please use the sort feature in the toolbar.\",\r\n    },\r\n    filter: {\r\n        filter: \"create filter\",\r\n\r\n        sortByAsc: \"Sort A-Z\",\r\n        sortByDesc: \"Sort Z-A\",\r\n        filterByColor: \"Filter by color\",\r\n        filterByCondition: \"Filter by condition\",\r\n        filterByValues: \"Filter by values\",\r\n\r\n        filiterInputNone: \"None\",\r\n\r\n        filiterInputTip: \"Enter filter value\",\r\n        filiterRangeStart: \"\",\r\n        filiterRangeStartTip: \"Value for formula\",\r\n        filiterRangeEnd: \"and\",\r\n        filiterRangeEndTip: \"Value for formula\",\r\n\r\n        filterValueByAllBtn: \"Check all\",\r\n        filterValueByClearBtn: \"Clear\",\r\n        filterValueByInverseBtn: \"Inverse\",\r\n        filterValueByTip: \"filter By Values\",\r\n        filterConform: \"Confirm\",\r\n        filterCancel: \"Cancel\",\r\n        clearFilter: \"Clear filter\",\r\n\r\n        conditionNone: \"None\",\r\n        conditionCellIsNull: \"Is empty\",\r\n        conditionCellNotNull: \"Is not empty\",\r\n        conditionCellTextContain: \"Text contains\",\r\n        conditionCellTextNotContain: \"Text does not contain\",\r\n        conditionCellTextStart: \"Text starts with\",\r\n        conditionCellTextEnd: \"Text ends with\",\r\n        conditionCellTextEqual: \"Text is exactly\",\r\n        conditionCellDateEqual: \"Date is\",\r\n        conditionCellDateBefore: \"Date is before\",\r\n        conditionCellDateAfter: \"Date is after\",\r\n        conditionCellGreater: \"Greater than\",\r\n        conditionCellGreaterEqual: \"Greater than or equal to\",\r\n        conditionCellLess: \"Less than\",\r\n        conditionCellLessEqual: \"Less than or equal to\",\r\n        conditionCellEqual: \"Is equal to\",\r\n        conditionCellNotEqual: \"Is not equal to\",\r\n        conditionCellBetween: \"Is between\",\r\n        conditionCellNotBetween: \"Is not between\",\r\n\r\n        filiterMoreDataTip: \"Big amount of data! please wait\",\r\n        filiterMonthText: \"Month\",\r\n        filiterYearText: \"Year\",\r\n        filiterByColorTip: \"Filter by cell color\",\r\n        filiterByTextColorTip: \"Filter by font color\",\r\n        filterContainerOneColorTip: \"This column contains only one color\",\r\n        filterDateFormatTip: \"Date format\",\r\n\r\n        valueBlank: \"(Null)\",\r\n        mergeError: \"There are merged cells in the filter selection, this operation cannot be performed!\",\r\n    },\r\n    rightclick: {\r\n        copy: \"Copy\",\r\n        copyAs: \"Copy as\",\r\n        paste: \"Paste\",\r\n        insert: \"Insert\",\r\n        delete: \"Delete\",\r\n        deleteCell: \"Delete cell\",\r\n        deleteSelected: \"Delete selected \",\r\n        hide: \"Hide\",\r\n        hideSelected: \"Hide selected \",\r\n        showHide: \"Show hidden \",\r\n        to: \"Towards\",\r\n        left: \"Left\",\r\n        right: \"Right\",\r\n        top: \"Top\",\r\n        bottom: \"Bottom\",\r\n        moveLeft: \"Move left\",\r\n        moveUp: \"Move up\",\r\n        add: \"Add\",\r\n        row: \"Row\",\r\n        column: \"Column\",\r\n        width: \"Width\",\r\n        height: \"Height\",\r\n        number: \"Number\",\r\n        confirm: \"Confirm\",\r\n        orderAZ: \"A-Z order\",\r\n        orderZA: \"Z-A order\",\r\n        clearContent: \"Clear content\",\r\n        matrix: \"Matrix operation\",\r\n        sortSelection: \"Sort\",\r\n        filterSelection: \"Filter\",\r\n        chartGeneration: \"Create chart\",\r\n        firstLineTitle: \"first line title\",\r\n        untitled: \"untitled\",\r\n        array1: \"One-dimensional array\",\r\n        array2: \"Two-dimensional array\",\r\n        array3: \"Multidimensional Arrays\",\r\n        diagonal: \"Diagonal\",\r\n        antiDiagonal: \"Anti-diagonal\",\r\n        diagonalOffset: \"Diagonal offset\",\r\n        offset: \"Offset\",\r\n        boolean: \"Boolean\",\r\n        flip: \"Flip\",\r\n        upAndDown: \"Up and down\",\r\n        leftAndRight: \"Left and right\",\r\n        clockwise: \"Clockwise\",\r\n        counterclockwise: \"Counterclockwise\",\r\n        transpose: \"Transpose\",\r\n        matrixCalculation: \"Matrix calculation\",\r\n        plus: \"Plus\",\r\n        minus: \"Minus\",\r\n        multiply: \"Multiply\",\r\n        divided: \"Divided\",\r\n        power: \"Power\",\r\n        root: \"Root\",\r\n        log: \"Log\",\r\n        delete0: \"Delete 0 values at both ends\",\r\n        removeDuplicate: \"Remove duplicate values\",\r\n        byRow: \"By row\",\r\n        byCol: \"By column\",\r\n        generateNewMatrix: \"Generate new matrix\",\r\n    },\r\n    comment: {\r\n        insert: \"Insert\",\r\n        edit: \"Edit\",\r\n        delete: \"Delete\",\r\n        showOne: \"Show/Hide\",\r\n        showAll: \"Show/Hide All\",\r\n    },\r\n    screenshot: {\r\n        screenshotTipNoSelection: \"Please select the scope of the screenshot\",\r\n        screenshotTipTitle: \"Warning！\",\r\n        screenshotTipHasMerge: \"This operation cannot be performed on merged cells\",\r\n        screenshotTipHasMulti: \"This operation cannot be performed on multiple selection regions\",\r\n        screenshotTipSuccess: \"Successful\",\r\n        screenshotImageName: \"Screenshot\",\r\n\r\n        downLoadClose: \"Close\",\r\n        downLoadCopy: \"Copy to clipboard\",\r\n        downLoadBtn: \"Download\",\r\n        browserNotTip: \"not supported by IE browser!\",\r\n        rightclickTip: 'Please right-click \"copy\" on the picture',\r\n        successTip: 'Successfully (if pasting fails, please right-click on the image to \"copy image\")',\r\n    },\r\n    splitText: {\r\n        splitDelimiters: \"Delimiters\",\r\n        splitOther: \"Other\",\r\n        splitContinueSymbol: \"Consecutive separators are treated as a single\",\r\n        splitDataPreview: \"Preview\",\r\n        splitTextTitle: \"Split text\",\r\n        splitConfirmToExe: \"There is already data here, do you want to replace it?\",\r\n\r\n        tipNoMulti:\r\n            \"Cannot perform this operation on multiple selection areas, please select a single area and try again\",\r\n        tipNoMultiColumn:\r\n            \"Only one column of data can be converted at a time. The selected area can have multiple rows but not multiple columns. Please try again after selecting a single column range\",\r\n    },\r\n    imageText: {\r\n        imageSetting: \"Image setting\",\r\n        close: \"Close\",\r\n        conventional: \"Conventional\",\r\n        moveCell1: \"Move and resize cells\",\r\n        moveCell2: \"Move and do not resize the cell\",\r\n        moveCell3: \"Do not move and resize the cell\",\r\n        fixedPos: \"Fixed position\",\r\n        border: \"Border\",\r\n        width: \"Width\",\r\n        radius: \"Radius\",\r\n        style: \"Style\",\r\n        solid: \"Solid\",\r\n        dashed: \"Dashed\",\r\n        dotted: \"Dotted\",\r\n        double: \"Double\",\r\n        color: \"Color\",\r\n    },\r\n    punctuation: {\r\n        tab: \"Tab\",\r\n        semicolon: \"semicolon\",\r\n        comma: \"comma\",\r\n        space: \"space\",\r\n    },\r\n    findAndReplace: {\r\n        find: \"Find\",\r\n        replace: \"Replace\",\r\n        goto: \"Go to\",\r\n        location: \"Location\",\r\n        formula: \"Formula\",\r\n        date: \"Date\",\r\n        number: \"Number\",\r\n        string: \"String\",\r\n        error: \"Error\",\r\n        condition: \"Condition\",\r\n        rowSpan: \"Row span\",\r\n        columnSpan: \"Column span\",\r\n        locationExample: \"Location\",\r\n        lessTwoRowTip: \"Please select at least two rows\",\r\n        lessTwoColumnTip: \"Please select at least two columns\",\r\n\r\n        findTextbox: \"Find Content\",\r\n        replaceTextbox: \"Replace Content\",\r\n\r\n        regexTextbox: \"Regular Expression\",\r\n        wholeTextbox: \"Whole word\",\r\n        distinguishTextbox: \"Case sensitive\",\r\n\r\n        allReplaceBtn: \"Replace All\",\r\n        replaceBtn: \"Replace\",\r\n        allFindBtn: \"Find All\",\r\n        findBtn: \"Find next\",\r\n\r\n        noFindTip: \"The content was not found\",\r\n        modeTip: \"This operation is not available in this mode\",\r\n\r\n        searchTargetSheet: \"Sheet\",\r\n        searchTargetCell: \"Cell\",\r\n        searchTargetValue: \"Value\",\r\n\r\n        searchInputTip: \"Please enter the search content\",\r\n\r\n        noReplceTip: \"There is nothing to replace\",\r\n        noMatchTip: \"No match found\",\r\n\r\n        successTip: \"${xlength} items found\",\r\n\r\n        locationConstant: \"Constant\",\r\n        locationFormula: \"Formula\",\r\n        locationDate: \"Date\",\r\n        locationDigital: \"Number\",\r\n        locationString: \"String\",\r\n        locationBool: \"Logical\",\r\n        locationError: \"Error\",\r\n        locationNull: \"Null\",\r\n        locationCondition: \"Conditional format\",\r\n        locationRowSpan: \"Row span\",\r\n        locationColumnSpan: \"Column span\",\r\n\r\n        locationTiplessTwoRow: \"Please select at least two rows\",\r\n        locationTiplessTwoColumn: \"Please select at least two columns\",\r\n        locationTipNotFindCell: \"Cell not found\",\r\n    },\r\n    sheetconfig: {\r\n        delete: \"Delete\",\r\n        copy: \"Copy\",\r\n        rename: \"Rename\",\r\n        changeColor: \"Change color\",\r\n        hide: \"Hide\",\r\n        unhide: \"Unhide\",\r\n        moveLeft: \"Move left\",\r\n        moveRight: \"Move right\",\r\n        resetColor: \"Reset color\",\r\n        cancelText: \"Cancel\",\r\n        chooseText: \"Confirm color\",\r\n\r\n        tipNameRepeat: \"The name of the tab page cannot be repeated! Please revise\",\r\n        noMoreSheet:\r\n            \"The workbook contains at least one visual worksheet. To delete the selected worksheet, please insert a new worksheet or show a hidden worksheet.\",\r\n        confirmDelete: \"Are you sure to delete\",\r\n        redoDelete: \"Can be undo by Ctrl+Z\",\r\n        noHide: \"Can't hide, at least keep one sheet tag\",\r\n        chartEditNoOpt: \"This operation is not allowed in chart editing mode!\",\r\n        sheetNameSpecCharError: \"The name cannot contain:[ ] :  ? * / ' \\\"\",\r\n        sheetNamecannotIsEmptyError: \"Sheet name cannot be empty\",\r\n    },\r\n    conditionformat: {\r\n        conditionformat_greaterThan: \"Conditionformat-GreaterThan\",\r\n        conditionformat_greaterThan_title: \"Format cells greater than\",\r\n        conditionformat_lessThan: \"Conditionformat-LessThan\",\r\n        conditionformat_lessThan_title: \"Format cells smaller than\",\r\n        conditionformat_betweenness: \"Conditionformat-Betweenness\",\r\n        conditionformat_betweenness_title: \"Format cells with values between\",\r\n        conditionformat_equal: \"Conditionformat-Equal\",\r\n        conditionformat_equal_title: \"Format cells equal to\",\r\n        conditionformat_textContains: \"Conditionformat-TextContains\",\r\n        conditionformat_textContains_title: \"Format cells containing the following text\",\r\n        conditionformat_occurrenceDate: \"Conditionformat-OccurrenceDate\",\r\n        conditionformat_occurrenceDate_title: \"Format cells containing the following dates\",\r\n        conditionformat_duplicateValue: \"Conditionformat-DuplicateValue\",\r\n        conditionformat_duplicateValue_title: \"Format cells containing the following types of values\",\r\n        conditionformat_top10: \"Conditionformat-Top10\",\r\n        conditionformat_top10_percent: \"Conditionformat-Top10%\",\r\n        conditionformat_top10_title: \"Format the cells with the highest value\",\r\n        conditionformat_last10: \"Conditionformat-Last10\",\r\n        conditionformat_last10_percent: \"Conditionformat-Last10%\",\r\n        conditionformat_last10_title: \"Format the cells with the smallest value\",\r\n        conditionformat_AboveAverage: \"Conditionformat-AboveAverage\",\r\n        conditionformat_AboveAverage_title: \"Format cells above average\",\r\n        conditionformat_SubAverage: \"Conditionformat-SubAverage\",\r\n        conditionformat_SubAverage_title: \"Format cells below average\",\r\n        rule: \"Rule\",\r\n        newRule: \"New rule\",\r\n        editRule: \"Edit rule\",\r\n        deleteRule: \"Delete rule\",\r\n        deleteCellRule: \"Delete cell rule\",\r\n        deleteSheetRule: \"Delete sheet rule\",\r\n        manageRules: \"Management rules\",\r\n        showRules: \"Show its formatting rules\",\r\n        highlightCellRules: \"Highlight cell rules\",\r\n        itemSelectionRules: \"Item selection rules\",\r\n        conditionformatManageRules: \"Conditional Formatting Rule Manager\",\r\n        format: \"Format\",\r\n        setFormat: \"Set format\",\r\n        setAs: \"Set as\",\r\n        setAsByArea: \"For the selected area, set to\",\r\n        applyRange: \"Apply range\",\r\n        selectRange: \"Select application range\",\r\n        selectRange_percent: \"Percentage of selected range\",\r\n        selectRange_average: \"Average value of selected range\",\r\n        selectRange_value: \"Value in the selected range\",\r\n        pleaseSelectRange: \"Please select application range\",\r\n        selectDataRange: \"Select data range\",\r\n        selectCell: \"select cell\",\r\n        pleaseSelectCell: \"Please select cell\",\r\n        pleaseSelectADate: \"Please select a date\",\r\n        pleaseEnterInteger: \"Please enter an integer between 1 and 1000\",\r\n        onlySingleCell: \"Only a single cell can be referenced\",\r\n        conditionValueCanOnly: \"The condition value can only be a number or a single cell\",\r\n        ruleTypeItem1: \"Format all cells based on their respective values\",\r\n        ruleTypeItem2: \"Only format cells that contain\",\r\n        ruleTypeItem2_title: \"Only for cells that meet the following conditions\",\r\n        ruleTypeItem3: \"Format only the top or bottom numbers\",\r\n        ruleTypeItem3_title: \"Is the value in the following ranking\",\r\n        ruleTypeItem4: \"Format only values above or below the average\",\r\n        ruleTypeItem4_title: \"Is a value that satisfies the following conditions\",\r\n        ruleTypeItem5: \"Format only unique or repeated values\",\r\n        ruleTypeItem6: \"Use formulas to determine which cells to format\",\r\n        formula: \"Formula\",\r\n        textColor: \"Text color\",\r\n        cellColor: \"Cell color\",\r\n        confirm: \"Confirm\",\r\n        confirmColor: \"Confirm color\",\r\n        cancel: \"Cancel\",\r\n        close: \"Close\",\r\n        clearColorSelect: \"Clear color select\",\r\n        sheet: \"Sheet\",\r\n        currentSheet: \"Current Sheet\",\r\n        dataBar: \"data bar\",\r\n        dataBarColor: \"data bar color\",\r\n        gradientDataBar_1: \"Blue-white gradient data bar\",\r\n        gradientDataBar_2: \"Green-white gradient data bar\",\r\n        gradientDataBar_3: \"Red-white gradient data bar\",\r\n        gradientDataBar_4: \"Orange-white gradient stripes\",\r\n        gradientDataBar_5: \"Light blue-white gradient stripes\",\r\n        gradientDataBar_6: \"Purple-white gradient data bar\",\r\n        solidColorDataBar_1: \"Blue data bar\",\r\n        solidColorDataBar_2: \"Green data bar\",\r\n        solidColorDataBar_3: \"Red data bar\",\r\n        solidColorDataBar_4: \"Orange data bar\",\r\n        solidColorDataBar_5: \"Light blue data bar\",\r\n        solidColorDataBar_6: \"Purple data bar\",\r\n        colorGradation: \"color gradation\",\r\n        colorGradation_1: \"Green-yellow-red color gradation\",\r\n        colorGradation_2: \"Red-yellow-green color gradation\",\r\n        colorGradation_3: \"Green-white-red color gradation\",\r\n        colorGradation_4: \"Red-white-green color gradation\",\r\n        colorGradation_5: \"Blue-white-red color gradation\",\r\n        colorGradation_6: \"Red-white-blue color gradation\",\r\n        colorGradation_7: \"White-red color gradation\",\r\n        colorGradation_8: \"Red-white color gradation\",\r\n        colorGradation_9: \"Green-white color gradation\",\r\n        colorGradation_10: \"White-green color gradation\",\r\n        colorGradation_11: \"Green-yellow color gradation\",\r\n        colorGradation_12: \"Yellow-green color gradation\",\r\n        icons: \"icons\",\r\n        pleaseSelectIcon: \"Please click to select a group of icons:\",\r\n        cellValue: \"Cell value\",\r\n        specificText: \"Specific text\",\r\n        occurrence: \"Date\",\r\n        greaterThan: \"Greater than\",\r\n        lessThan: \"Less than\",\r\n        between: \"Between\",\r\n        equal: \"Equal\",\r\n        in: \"In\",\r\n        between2: \"\",\r\n        contain: \"Contain\",\r\n        textContains: \"Text contains\",\r\n        duplicateValue: \"Duplicate value\",\r\n        uniqueValue: \"Unique value\",\r\n        top: \"Top\",\r\n        top10: \"Top 10\",\r\n        top10_percent: \"Top 10%\",\r\n        last: \"Last\",\r\n        last10: \"Last 10\",\r\n        last10_percent: \"Last 10%\",\r\n        oneself: \"\",\r\n        above: \"Above\",\r\n        aboveAverage: \"Above average\",\r\n        below: \"Below\",\r\n        belowAverage: \"Below average\",\r\n        all: \"All\",\r\n        yesterday: \"YTD\",\r\n        today: \"Today\",\r\n        tomorrow: \"Tomorrow\",\r\n        lastWeek: \"Last week\",\r\n        thisWeek: \"This week\",\r\n        lastMonth: \"Last month\",\r\n        thisMonth: \"This month\",\r\n        lastYear: \"Last year\",\r\n        thisYear: \"This year\",\r\n        last7days: \"Last 7 days\",\r\n        last30days: \"Last 30 days\",\r\n        next7days: \"Next 7 days\",\r\n        next30days: \"Next 30 days\",\r\n        next60days: \"Next 60 days\",\r\n        chooseRuleType: \"Choose rule type\",\r\n        editRuleDescription: \"Edit rule description\",\r\n        newFormatRule: \"New format rule\",\r\n        editFormatRule: \"Edit format rule\",\r\n        formatStyle: \"Style\",\r\n        fillType: \"Fill\",\r\n        color: \"Color\",\r\n        twocolor: \"Two-color\",\r\n        tricolor: \"Tricolor\",\r\n        multicolor: \"Multi color\",\r\n        grayColor: \"Gray color\",\r\n        gradient: \"Gradient\",\r\n        solid: \"Solid\",\r\n        maxValue: \"Max value\",\r\n        medianValue: \"Median value\",\r\n        minValue: \"Min value\",\r\n        direction: \"Direction\",\r\n        threeWayArrow: \"Three-way arrow\",\r\n        fourWayArrow: \"Four-way arrow\",\r\n        fiveWayArrow: \"Five-way arrow\",\r\n        threeTriangles: \"Three triangles\",\r\n        shape: \"Shape\",\r\n        threeColorTrafficLight: \"Three-color traffic light\",\r\n        fourColorTrafficLight: \"Four-color traffic light\",\r\n        threeSigns: \"Three signs\",\r\n        greenRedBlackGradient: \"Green-red-black gradient\",\r\n        rimless: \"Rimless\",\r\n        bordered: \"Bordered\",\r\n        mark: \"Mark\",\r\n        threeSymbols: \"Three symbols\",\r\n        tricolorFlag: \"Tricolor flag\",\r\n        circled: \"Circled\",\r\n        noCircle: \"No circle\",\r\n        grade: \"Grade\",\r\n        grade4: \"4 Grade\",\r\n        grade5: \"5 Grade\",\r\n        threeStars: \"3 Stars\",\r\n        fiveQuadrantDiagram: \"Five-quadrant diagram\",\r\n        fiveBoxes: \"5 Boxes\",\r\n    },\r\n    insertLink: {\r\n        linkText: \"Text\",\r\n        linkType: \"Link type\",\r\n        external: \"External link\",\r\n        internal: \"Internal link\",\r\n        linkAddress: \"Link address\",\r\n        linkSheet: \"Worksheet\",\r\n        linkCell: \"Cell reference\",\r\n        linkTooltip: \"Tooltip\",\r\n        placeholder1: \"Please enter the web link address\",\r\n        placeholder2: \"Please enter the cell to be quoted, example A1\",\r\n        placeholder3: \"Please enter the prompt content\",\r\n        tooltipInfo1: \"Please enter a valid link\",\r\n        tooltipInfo2: \"Please enter the correct cell reference\",\r\n    },\r\n    dataVerification: {\r\n        cellRange: \"Cell range\",\r\n        selectCellRange: \"Click to select a cell range\",\r\n        selectCellRange2: \"Please select a range of cells\",\r\n        verificationCondition: \"Verification condition\",\r\n        allowMultiSelect: \"Allow multiple selection\",\r\n        dropdown: \"drop-down list\",\r\n        checkbox: \"Checkbox\",\r\n        number: \"Number\",\r\n        number_integer: \"Number-integer\",\r\n        number_decimal: \"Number-decimal\",\r\n        text_content: \"Text-content\",\r\n        text_length: \"Text-length\",\r\n        date: \"Date\",\r\n        validity: \"Effectiveness\",\r\n        placeholder1: \"Please enter the options, separated by commas, such as 1,2,3,4,5\",\r\n        placeholder2: \"Please enter content\",\r\n        placeholder3: \"Numeric value, such as 10\",\r\n        placeholder4: \"Please enter the specified text\",\r\n        placeholder5: \"Please enter the prompt displayed when the cell is selected\",\r\n        selected: \"Selected\",\r\n        notSelected: \"Not selected\",\r\n        between: \"Between\",\r\n        notBetween: \"Not between\",\r\n        equal: \"Equal\",\r\n        notEqualTo: \"Not equal to\",\r\n        moreThanThe: \"More than the\",\r\n        lessThan: \"Less than\",\r\n        greaterOrEqualTo: \"Greater or equal to\",\r\n        lessThanOrEqualTo: \"Less than or equal to\",\r\n        include: \"Include\",\r\n        exclude: \"Exclude\",\r\n        earlierThan: \"Earlier than\",\r\n        noEarlierThan: \"No earlier than\",\r\n        laterThan: \"Later than\",\r\n        noLaterThan: \"No later than\",\r\n        identificationNumber: \"Identification number\",\r\n        phoneNumber: \"Phone number\",\r\n        remote: \"Automatic remote acquisition option\",\r\n        prohibitInput: \"Prohibit input when input data is invalid\",\r\n        hintShow: \"Show prompt when the cell is selected\",\r\n        deleteVerification: \"Delete verification\",\r\n        tooltipInfo1: \"The drop-down list option cannot be empty\",\r\n        tooltipInfo2: \"Checkbox content cannot be empty\",\r\n        tooltipInfo3: \"The value entered is not a numeric type\",\r\n        tooltipInfo4: \"The value 2 cannot be less than the value 1\",\r\n        tooltipInfo5: \"The text content cannot be empty\",\r\n        tooltipInfo6: \"The value entered is not a date type\",\r\n        tooltipInfo7: \"Date 2 cannot be less than date 1\",\r\n        textlengthInteger: \"Text length must be an integer greater than or equal to 0\",\r\n    },\r\n    formula: {\r\n        sum: \"Sum\",\r\n        average: \"Average\",\r\n        count: \"Count\",\r\n        max: \"Max\",\r\n        min: \"Min\",\r\n        ifGenerate: \"If formula generator\",\r\n        find: \"Learn more\",\r\n\r\n        tipNotBelongToIf: \"This cell function does not belong to the if formula!\",\r\n        tipSelectCell: \"Please select the cell to insert the function\",\r\n\r\n        ifGenCompareValueTitle: \"Comparison value\",\r\n        ifGenSelectCellTitle: \"Click to select cell\",\r\n        ifGenRangeTitle: \"Range\",\r\n        ifGenRangeTo: \"to\",\r\n        ifGenRangeEvaluate: \"Range evaluate\",\r\n        ifGenSelectRangeTitle: \"Click to select range\",\r\n        ifGenCutWay: \"Partition way\",\r\n        ifGenCutSame: \"Same Partition value\",\r\n        ifGenCutNpiece: \"Partition by N\",\r\n        ifGenCutCustom: \"Custom\",\r\n        ifGenCutConfirm: \"Confirm\",\r\n\r\n        ifGenTipSelectCell: \"Select cells\",\r\n        ifGenTipSelectCellPlace: \"Please select cells\",\r\n\r\n        ifGenTipSelectRange: \"Select range\",\r\n        ifGenTipSelectRangePlace: \"Please select range\",\r\n\r\n        ifGenTipNotNullValue: \"The comparison value cannot be empty!\",\r\n        ifGenTipLableTitile: \"Label\",\r\n        ifGenTipRangeNotforNull: \"The range cannot be empty!\",\r\n        ifGenTipCutValueNotforNull: \"The partition value cannot be empty!\",\r\n        ifGenTipNotGenCondition: \"No conditions are available for generation!\",\r\n    },\r\n    formulaMore: {\r\n        valueTitle: \"Value\",\r\n        tipSelectDataRange: \"Select data range\",\r\n        tipDataRangeTile: \"Data range\",\r\n        findFunctionTitle: \"Search function\",\r\n        tipInputFunctionName: \"Function name or brief description of function\",\r\n\r\n        Array: \"Array\",\r\n        Database: \"Database\",\r\n        Date: \"Date\",\r\n        Engineering: \"Engineering\",\r\n        Filter: \"Filter\",\r\n        Financial: \"Financial\",\r\n        luckysheet: \"Luckysheet\",\r\n        other: \"Other\",\r\n        Logical: \"Logical\",\r\n        Lookup: \"Lookup\",\r\n        Math: \"Math\",\r\n        Operator: \"Operator\",\r\n        Parser: \"Parser\",\r\n        Statistical: \"Statistical\",\r\n        Text: \"Text\",\r\n        dataMining: \"Data Mining\",\r\n\r\n        selectFunctionTitle: \"Select a function\",\r\n        calculationResult: \"Result\",\r\n\r\n        tipSuccessText: \"Success\",\r\n        tipParamErrorText: \"Parameter type error\",\r\n\r\n        helpClose: \"Close\",\r\n        helpCollapse: \"Collapse\",\r\n        helpExample: \"Example\",\r\n        helpAbstract: \"Abstract\",\r\n\r\n        execfunctionError: \"Error in the formula\",\r\n        execfunctionSelfError: \"The formula cannot refer to its own cell\",\r\n        execfunctionSelfErrorResult:\r\n            \"The formula cannot refer to its own cell, which will lead to inaccurate calculation results\",\r\n\r\n        allowRepeatText: \"Repeat\",\r\n        allowOptionText: \"Option\",\r\n\r\n        selectCategory: \"Or select a category\",\r\n    },\r\n    drag: {\r\n        noMerge: \"Cannot perform this operation on merged cells\",\r\n        affectPivot: \"This change cannot be made to the selected cell because it will affect the pivot table!\",\r\n        noMulti: \"Cannot perform this operation on multiple selection areas, please select a single area\",\r\n        noPaste: \"Unable to paste this content here, please select a cell in the paste area and try to paste again\",\r\n        noPartMerge: \"Cannot perform this operation on partially merged cells\",\r\n\r\n        inputCorrect: \"Please enter the correct value\",\r\n        notLessOne: \"The number of rows and columns cannot be less than 1\",\r\n        offsetColumnLessZero: \"The offset column cannot be negative!\",\r\n\r\n        pasteMustKeybordAlert: \"Copy and paste in the Sheet: Ctrl + C to copy, Ctrl + V to paste, Ctrl + X to cut\",\r\n        pasteMustKeybordAlertHTMLTitle: \"Copy and paste in the Sheet\",\r\n        pasteMustKeybordAlertHTML:\r\n            \"<span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + C</span>&nbsp;&nbsp;to copy<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + V</span>&nbsp;&nbsp;to paste<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + X</span>&nbsp;&nbsp;to cut\",\r\n    },\r\n    paste: {\r\n        warning: \"Warning\",\r\n        errorNotAllowMulti:\r\n            \"Cannot perform this operation on multiple selection areas, please select a single range and try again\",\r\n        errorNotAllowMerged: \"Cannot make partial changes to merged cells\",\r\n    },\r\n    pivotTable: {\r\n        title: \"Pivot Table\",\r\n        closePannel: \"Close\",\r\n        editRange: \"Range\",\r\n        tipPivotFieldSelected: \"Select the fields\",\r\n        tipClearSelectedField: \"Clear all fields\",\r\n        btnClearSelectedField: \"Clear\",\r\n        btnFilter: \"Filter\",\r\n        titleRow: \"Row\",\r\n        titleColumn: \"Column\",\r\n        titleValue: \"Value\",\r\n        tipShowColumn: \"Statistics fields are displayed as columns\",\r\n        tipShowRow: \"Statistics fields are displayed as rows\",\r\n\r\n        titleSelectionDataRange: \"Select range\",\r\n        titleDataRange: \"Data range\",\r\n\r\n        valueSum: \"SUM\",\r\n\r\n        valueStatisticsSUM: \"Sum\",\r\n        valueStatisticsCOUNT: \"Count\",\r\n        valueStatisticsCOUNTA: \"Count A\",\r\n        valueStatisticsCOUNTUNIQUE: \"Count Unique\",\r\n        valueStatisticsAVERAGE: \"Average\",\r\n        valueStatisticsMAX: \"Max\",\r\n        valueStatisticsMIN: \"Min\",\r\n        valueStatisticsMEDIAN: \"Median\",\r\n        valueStatisticsPRODUCT: \"Product\",\r\n        valueStatisticsSTDEV: \"Stdev\",\r\n\r\n        valueStatisticsSTDEVP: \"Stdevp\",\r\n        valueStatisticslet: \"Var\",\r\n        valueStatisticsVARP: \"VarP\",\r\n\r\n        errorNotAllowEdit: \"This operation is prohibited in non-editing mode!\",\r\n        errorNotAllowMulti:\r\n            \"Cannot perform this operation on multiple selection areas, please select a single range and try again\",\r\n        errorSelectRange: \"Please select the range of the new pivot table\",\r\n        errorIsDamage: \"The source data of this pivot table is corrupted!\",\r\n        errorNotAllowPivotData: \"Cannot select pivot table as source data!\",\r\n        errorSelectionRange: \"Selection failed, wrong input range!\",\r\n        errorIncreaseRange: \"Please expand the selected range!\",\r\n\r\n        titleAddColumn: \"Add column to pivot table\",\r\n        titleMoveColumn: \"Move the column to the white box below\",\r\n        titleClearColumnFilter: \"Clear the filter for this column\",\r\n        titleFilterColumn: \"Filter\",\r\n\r\n        titleSort: \"Sort\",\r\n        titleNoSort: \"No sort\",\r\n        titleSortAsc: \"ASC\",\r\n        titleSortDesc: \"DESC\",\r\n        titleSortBy: \"Sort by\",\r\n        titleShowSum: \"Show total\",\r\n        titleStasticTrue: \"Yes\",\r\n        titleStasticFalse: \"No\",\r\n    },\r\n    dropCell: {\r\n        copyCell: \"Copy\",\r\n        sequence: \"Sequence\",\r\n        onlyFormat: \"Only format\",\r\n        noFormat: \"Not format\",\r\n        day: \"Day\",\r\n        workDay: \"Work Day\",\r\n        month: \"Month\",\r\n        year: \"Year\",\r\n        chineseNumber: \"Chinese numbers\",\r\n    },\r\n    imageCtrl: {\r\n        borderTile: \"Image border color\",\r\n        borderCur: \"Color\",\r\n    },\r\n    protection: {\r\n        protectiontTitle: \"Protection\",\r\n        enterPassword: \"Enter a password (optional)\",\r\n        enterHintTitle: \"Prompt when editing is prohibited (optional)\",\r\n        enterHint:\r\n            \"The cell or chart you are trying to change is in a protected worksheet. If you want to change it, please unprotect the worksheet. You may need to enter a password\",\r\n        swichProtectionTip: \"Protect the sheet and contents of locked cells\",\r\n        authorityTitle: \"Allow users of this sheet to:\",\r\n        selectLockedCells: \"Select locked cells\",\r\n        selectunLockedCells: \"Select unlocked cells\",\r\n        formatCells: \"Format cells\",\r\n        formatColumns: \"Format columns\",\r\n        formatRows: \"Format rows\",\r\n        insertColumns: \"Insert columns\",\r\n        insertRows: \"Insert rows\",\r\n        insertHyperlinks: \"Insert hyperlinks\",\r\n        deleteColumns: \"Delete columns\",\r\n        deleteRows: \"Delete rows\",\r\n        sort: \"Sort\",\r\n        filter: \"Filter\",\r\n        usePivotTablereports: \"Use Pivot Table reports\",\r\n        editObjects: \"Edit objects\",\r\n        editScenarios: \"Edit scenarios\",\r\n\r\n        allowRangeTitle: \"Allow users of range to:\",\r\n        allowRangeAdd: \"New...\",\r\n\r\n        allowRangeAddTitle: \"Title\",\r\n        allowRangeAddSqrf: \"Reference\",\r\n        selectCellRange: \"Click to select a cell range\",\r\n        selectCellRangeHolder: \"Cell range\",\r\n        allowRangeAddTitlePassword: \"Password\",\r\n        allowRangeAddTitleHint: \"Prompt\",\r\n        allowRangeAddTitleHintTitle: \"Prompt when a password is set (optional)\",\r\n        allowRangeAddtitleDefault: \"Input range name\",\r\n\r\n        rangeItemDblclick: \"Double click to edit\",\r\n        rangeItemHasPassword: \"Has password\",\r\n\r\n        rangeItemErrorTitleNull: \"Title is null\",\r\n        rangeItemErrorRangeNull: \"Reference is null\",\r\n        rangeItemErrorRange: \"Reference is error\",\r\n\r\n        validationTitle: \"Password validation\",\r\n        validationTips: \"Need to enter a password to unlock the protection of the worksheet\",\r\n        validationInputHint: \"Enter a password\",\r\n\r\n        checkPasswordNullalert: \"Password is required!\",\r\n        checkPasswordWrongalert: \"Incorrect password, please try again!\",\r\n\r\n        checkPasswordSucceedalert: \"Unlock Succeed!\",\r\n        defaultRangeHintText: \"The cell is being password protected.\",\r\n        defaultSheetHintText:\r\n            \"The cell or chart is in a protected worksheet. To make changes, please unprotect the worksheet. You may need to enter a password\",\r\n    },\r\n    cellFormat: {\r\n        cellFormatTitle: \"Format cells\",\r\n        protection: \"Protection\",\r\n        locked: \"Locked\",\r\n        hidden: \"Hidden\",\r\n        protectionTips:\r\n            \"To lock cells or hide formulas, protect the worksheet. On the toolbar, Click Protect Sheet Button\",\r\n        tipsPart: \"Partial checked\",\r\n        tipsAll: \"All checked\",\r\n\r\n        selectionIsNullAlert: \"Selection is required!\",\r\n        sheetDataIsNullAlert: \"error, Data is none!\",\r\n    },\r\n    print: {\r\n        normalBtn: \"Normal\",\r\n        layoutBtn: \"Page Layout\",\r\n        pageBtn: \"Page break preview\",\r\n\r\n        menuItemPrint: \"Print (Ctrl+P)\",\r\n        menuItemAreas: \"Print areas\",\r\n        menuItemRows: \"Print title rows\",\r\n        menuItemColumns: \"Print title columns\",\r\n        suggest: \"Any suggestions for the print function?\",\r\n        range: \"Print Range\",\r\n        size: \"Paper Size\",\r\n        direction: \"Print Direction\",\r\n        horizontal: \"Horizontal\",\r\n        vertical: \"Vertical\",\r\n        title: \"Print Setup\",\r\n        current: \"Current Sheet\",\r\n        area: \"Selected Range\",\r\n        letter: \"letter\",\r\n        paper: \"tabloid paper\",\r\n        law: \"official paper\",\r\n        admin: \"administrative paper\",\r\n        expire: \"expired\",\r\n        remain: \"remaining days\",\r\n        error: \"error\",\r\n        showLine: \"show grid line\",\r\n        show: \"show\",\r\n        hide: \"hide\",\r\n        preview: \"preview\",\r\n    },\r\n    edit: {\r\n        typing: \"typing\",\r\n    },\r\n    websocket: {\r\n        success: \"WebSocket connection success\",\r\n        refresh: \"An error occurred in the WebSocket connection, please refresh the page!\",\r\n        wait: \"An error occurred in the WebSocket connection, please be patient!\",\r\n        close: \"WebSocket connection closed\",\r\n        contact:\r\n            \"Server communication error occurred, please refresh the page and try again, if not, please contact the administrator!\",\r\n        support: \"The current browser does not support WebSocket\",\r\n    },\r\n    exportXlsx: {\r\n        notice: \"Please configure the export plugin\",\r\n        serverError: \"server is under maintenance\",\r\n        title: \"Export XLSX\",\r\n        range: \"Range\",\r\n        currentSheet: \"Current sheet\",\r\n        allSheets: \"All sheets\",\r\n    },\r\n};\r\n"
  },
  {
    "path": "src/locale/es.js",
    "content": "export default {\r\n    functionlist: {\r\n        \"SUMIF\": {\r\n            \"d\": \"Returns a conditional sum across a range.\",\r\n            \"a\": \"A conditional sum across a range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"range\",\r\n                    \"detail\": \"The range which is tested against `criterion`.\"\r\n                },\r\n                {\r\n                    \"name\": \"criterion\",\r\n                    \"detail\": \"The pattern or test to apply to `range`.\"\r\n                },\r\n                {\r\n                    \"name\": \"sum_range\",\r\n                    \"detail\": \"The range to be summed, if different from `range`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TAN\": {\r\n            \"d\": \"Returns the tangent of an angle provided in radians.\",\r\n            \"a\": \"Tangent of an angle provided in radians.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"angle\",\r\n                    \"detail\": \"The angle to find the tangent of, in radians.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TANH\": {\r\n            \"d\": \"Returns the hyperbolic tangent of any real number.\",\r\n            \"a\": \"Hyperbolic tangent of any real number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"Any real value to calculate the hyperbolic tangent of.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CEILING\": {\r\n            \"d\": \"Rounds a number up to the nearest integer multiple of specified significance `factor`.\",\r\n            \"a\": \"Rounds number up to nearest multiple of a factor.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to round up to the nearest integer multiple of `factor`.\"\r\n                },\r\n                {\r\n                    \"name\": \"factor\",\r\n                    \"detail\": \"The number to whose multiples `value` will be rounded.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ATAN\": {\r\n            \"d\": \"Returns the inverse tangent of a value, in radians.\",\r\n            \"a\": \"Inverse tangent of a value, in radians.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value for which to calculate the inverse tangent.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ASINH\": {\r\n            \"d\": \"Returns the inverse hyperbolic sine of a number.\",\r\n            \"a\": \"Inverse hyperbolic sine of a number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value for which to calculate the inverse hyperbolic sine.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ABS\": {\r\n            \"d\": \"Returns the absolute value of a number.\",\r\n            \"a\": \"Absolute value of a number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The number of which to return the absolute value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ACOS\": {\r\n            \"d\": \"Returns the inverse cosine of a value, in radians.\",\r\n            \"a\": \"Inverse cosine of a value, in radians.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value for which to calculate the inverse cosine. Must be between `-1` and `1`, inclusive.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ACOSH\": {\r\n            \"d\": \"Returns the inverse hyperbolic cosine of a number.\",\r\n            \"a\": \"Inverse hyperbolic cosine of a number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value for which to calculate the inverse hyperbolic cosine. Must be greater than or equal to `1`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MULTINOMIAL\": {\r\n            \"d\": \"Returns the factorial of the sum of values divided by the product of the values' factorials.\",\r\n            \"a\": \"Multinomial distribution function.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to consider.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ATANH\": {\r\n            \"d\": \"Returns the inverse hyperbolic tangent of a number.\",\r\n            \"a\": \"Inverse hyperbolic tangent of a number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value for which to calculate the inverse hyperbolic tangent. Must be between -1 and 1, exclusive.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ATAN2\": {\r\n            \"d\": \"Returns the angle between the x-axis and a line segment from the origin (0,0) to specified coordinate pair (`x`,`y`), in radians.\",\r\n            \"a\": \"Arctangent of a value.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The x coordinate of the endpoint of the line segment for which to calculate the angle from the x-axis.\"\r\n                },\r\n                {\r\n                    \"name\": \"y\",\r\n                    \"detail\": \"The y coordinate of the endpoint of the line segment for which to calculate the angle from the x-axis.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUNTBLANK\": {\r\n            \"d\": \"Returns the number of empty values in a list of values and ranges.\",\r\n            \"a\": \"Number of empty values.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range in which to count the number of blanks.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COSH\": {\r\n            \"d\": \"Returns the hyperbolic cosine of any real number.\",\r\n            \"a\": \"Hyperbolic cosine of any real number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"Any real value to calculate the hyperbolic cosine of.\"\r\n                }\r\n            ]\r\n        },\r\n        \"INT\": {\r\n            \"d\": \"Rounds a number down to the nearest integer that is less than or equal to it.\",\r\n            \"a\": \"Rounds number down to nearest integer.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to round down to the nearest integer.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISEVEN\": {\r\n            \"d\": \"Checks whether the provided value is even.\",\r\n            \"a\": \"Whether the provided value is even.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to be verified as even.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISODD\": {\r\n            \"d\": \"Checks whether the provided value is odd.\",\r\n            \"a\": \"Whether the provided value is odd.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to be verified as odd.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LCM\": {\r\n            \"d\": \"Returns the least common multiple of one or more integers.\",\r\n            \"a\": \"Least common multiple of one or more integers.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range whose factors to consider in a calculation to find the least common multiple.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges whose factors to consider to find the least common multiple.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LN\": {\r\n            \"d\": \"Returns the logarithm of a number, base e (Euler's number).\",\r\n            \"a\": \"The logarithm of a number, base e (euler's number).\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value for which to calculate the logarithm, base e.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOG\": {\r\n            \"d\": \"Returns the logarithm of a number with respect to a base.\",\r\n            \"a\": \"The logarithm of a number with respect to a base.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value for which to calculate the logarithm.\"\r\n                },\r\n                {\r\n                    \"name\": \"base\",\r\n                    \"detail\": \"The base to use for calculation of the logarithm.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOG10\": {\r\n            \"d\": \"Returns the logarithm of a number, base 10.\",\r\n            \"a\": \"The logarithm of a number, base 10.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value for which to calculate the logarithm, base 10.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MOD\": {\r\n            \"d\": \"Returns the result of the modulo operator, the remainder after a division operation.\",\r\n            \"a\": \"Modulo (remainder) operator.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"dividend\",\r\n                    \"detail\": \"The number to be divided to find the remainder.\"\r\n                },\r\n                {\r\n                    \"name\": \"divisor\",\r\n                    \"detail\": \"The number to divide by.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MROUND\": {\r\n            \"d\": \"Rounds one number to the nearest integer multiple of another.\",\r\n            \"a\": \"Rounds a number to the nearest integer multiple.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The number to round to the nearest integer multiple of another.\"\r\n                },\r\n                {\r\n                    \"name\": \"factor\",\r\n                    \"detail\": \"The number to whose multiples `value` will be rounded.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ODD\": {\r\n            \"d\": \"Rounds a number up to the nearest odd integer.\",\r\n            \"a\": \"Rounds a number up to the nearest odd integer.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to round to the next greatest odd number.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUMSQ\": {\r\n            \"d\": \"Returns the sum of the squares of a series of numbers and/or cells.\",\r\n            \"a\": \"Sum of squares.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first number or range whose squares to add together.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional numbers or ranges whose squares to add to the square(s) of `value1`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COMBIN\": {\r\n            \"d\": \"Returns the number of ways to choose some number of objects from a pool of a given size of objects.\",\r\n            \"a\": \"Number of combinations from a set of objects.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"n\",\r\n                    \"detail\": \"The size of the pool of objects to choose from.\"\r\n                },\r\n                {\r\n                    \"name\": \"k\",\r\n                    \"detail\": \"The number of objects to choose.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUM\": {\r\n            \"d\": \"Returns the sum of a series of numbers and/or cells.\",\r\n            \"a\": \"Sum of a series of numbers and/or cells.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first number or range to add together.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional numbers or ranges to add to `value1`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUBTOTAL\": {\r\n            \"d\": \"Returns a subtotal for a vertical range of cells using a specified aggregation function.\",\r\n            \"a\": \"Subtotal for a range using a specific function.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"function_code\",\r\n                    \"detail\": \"The function to use in subtotal aggregation.\"\r\n                },\r\n                {\r\n                    \"name\": \"range1\",\r\n                    \"detail\": \"The first range over which to calculate a subtotal.\"\r\n                },\r\n                {\r\n                    \"name\": \"range2\",\r\n                    \"detail\": \"Additional ranges over which to calculate subtotals.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ASIN\": {\r\n            \"d\": \"Returns the inverse sine of a value, in radians.\",\r\n            \"a\": \"Inverse sine of a value, in radians.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value for which to calculate the inverse sine. Must be between `-1` and `1`, inclusive.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUNTIF\": {\r\n            \"d\": \"Returns a conditional count across a range.\",\r\n            \"a\": \"A conditional count across a range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"range\",\r\n                    \"detail\": \"The range that is tested against `criterion`.\"\r\n                },\r\n                {\r\n                    \"name\": \"criterion\",\r\n                    \"detail\": \"The pattern or test to apply to `range`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"RADIANS\": {\r\n            \"d\": \"Converts an angle value in degrees to radians.\",\r\n            \"a\": \"Converts an angle value in degrees to radians.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"angle\",\r\n                    \"detail\": \"The angle to convert from degrees to radians.\"\r\n                }\r\n            ]\r\n        },\r\n        \"RAND\": {\r\n            \"d\": \"Returns a random number between 0 inclusive and 1 exclusive.\",\r\n            \"a\": \"A random number between 0 inclusive and 1 exclusive.\",\r\n            \"p\": []\r\n        },\r\n        \"COUNTUNIQUE\": {\r\n            \"d\": \"Counts the number of unique values in a list of specified values and ranges.\",\r\n            \"a\": \"Counts number of unique values in a range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range to consider for uniqueness.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to consider for uniqueness.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DEGREES\": {\r\n            \"d\": \"Converts an angle value in radians to degrees.\",\r\n            \"a\": \"Converts an angle value in radians to degrees.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"angle\",\r\n                    \"detail\": \"The angle to convert from radians to degrees.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ERFC\": {\r\n            \"d\": \"Returns the complementary Gauss error function of a value.\",\r\n            \"a\": \"Complementary gauss error function of a value.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"z\",\r\n                    \"detail\": \"The number for which to calculate the complementary Gauss error function.\"\r\n                }\r\n            ]\r\n        },\r\n        \"EVEN\": {\r\n            \"d\": \"Rounds a number up to the nearest even integer.\",\r\n            \"a\": \"Rounds a number up to the nearest even integer.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to round to the next greatest even number.\"\r\n                }\r\n            ]\r\n        },\r\n        \"EXP\": {\r\n            \"d\": \"Returns Euler's number, e (~2.718) raised to a power.\",\r\n            \"a\": \"Euler's number, e (~2.718) raised to a power.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"exponent\",\r\n                    \"detail\": \"The exponent to raise e to.\"\r\n                }\r\n            ]\r\n        },\r\n        \"FACT\": {\r\n            \"d\": \"Returns the factorial of a number.\",\r\n            \"a\": \"Factorial of a number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The number or reference to a number whose factorial will be calculated and returned.\"\r\n                }\r\n            ]\r\n        },\r\n        \"FACTDOUBLE\": {\r\n            \"d\": \"Returns the \\\"double factorial\\\" of a number.\",\r\n            \"a\": \"\\\"double factorial\\\" of a number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The number or reference to a number whose double factorial will be calculated and returned.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PI\": {\r\n            \"d\": \"Returns the value of Pi to 14 decimal places.\",\r\n            \"a\": \"The number pi.\",\r\n            \"p\": []\r\n        },\r\n        \"FLOOR\": {\r\n            \"d\": \"Rounds a number down to the nearest integer multiple of specified significance `factor`.\",\r\n            \"a\": \"Rounds number down to nearest multiple of a factor.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to round down to the nearest integer multiple of `factor`.\"\r\n                },\r\n                {\r\n                    \"name\": \"factor\",\r\n                    \"detail\": \"The number to whose multiples `value` will be rounded.\"\r\n                }\r\n            ]\r\n        },\r\n        \"GCD\": {\r\n            \"d\": \"Returns the greatest common divisor of one or more integers.\",\r\n            \"a\": \"Greatest common divisor of one or more integers.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range whose factors to consider in a calculation to find the greatest common divisor.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges whose factors to consider to find the greatest common divisor.\"\r\n                }\r\n            ]\r\n        },\r\n        \"RANDBETWEEN\": {\r\n            \"d\": \"Returns a uniformly random integer between two values, inclusive.\",\r\n            \"a\": \"Random integer between two values, inclusive.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"low\",\r\n                    \"detail\": \"The low end of the random range.\"\r\n                },\r\n                {\r\n                    \"name\": \"high\",\r\n                    \"detail\": \"The high end of the random range.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ROUND\": {\r\n            \"d\": \"Rounds a number to a certain number of decimal places according to standard rules.\",\r\n            \"a\": \"Rounds a number according to standard rules.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to round to `places` number of places.\"\r\n                },\r\n                {\r\n                    \"name\": \"places\",\r\n                    \"detail\": \"The number of decimal places to which to round.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ROUNDDOWN\": {\r\n            \"d\": \"Rounds a number to a certain number of decimal places, always rounding down to the next valid increment.\",\r\n            \"a\": \"Rounds down a number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to round to `places` number of places, always rounding down.\"\r\n                },\r\n                {\r\n                    \"name\": \"places\",\r\n                    \"detail\": \"The number of decimal places to which to round.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ROUNDUP\": {\r\n            \"d\": \"Rounds a number to a certain number of decimal places, always rounding up to the next valid increment.\",\r\n            \"a\": \"Rounds up a number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to round to `places` number of places, always rounding up.\"\r\n                },\r\n                {\r\n                    \"name\": \"places\",\r\n                    \"detail\": \"The number of decimal places to which to round.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SERIESSUM\": {\r\n            \"d\": \"Given parameters `x`, `n`, `m`, and `a`, returns the power series sum a\",\r\n            \"a\": \"Sum of a power series.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the power series. Varies depending on the type of approximation, may be angle, exponent, or some other value.\"\r\n                },\r\n                {\r\n                    \"name\": \"n\",\r\n                    \"detail\": \"The initial power to which to raise `x` in the power series.\"\r\n                },\r\n                {\r\n                    \"name\": \"m\",\r\n                    \"detail\": \"The additive increment by which to increase `x`.\"\r\n                },\r\n                {\r\n                    \"name\": \"a\",\r\n                    \"detail\": \"The array or range containing the coefficients of the power series.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SIGN\": {\r\n            \"d\": \"Given an input number, returns `-1` if it is negative, `1` if positive, and `0` if it is zero.\",\r\n            \"a\": \"Sign of a provided number (+/-/0).\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value whose sign will be evaluated.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SIN\": {\r\n            \"d\": \"Returns the sine of an angle provided in radians.\",\r\n            \"a\": \"Sine of an angle provided in radians.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"angle\",\r\n                    \"detail\": \"The angle to find the sine of, in radians.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SINH\": {\r\n            \"d\": \"Returns the hyperbolic sine of any real number.\",\r\n            \"a\": \"Hyperbolic sine of any real number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"Any real value to calculate the hyperbolic sine of.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SQRT\": {\r\n            \"d\": \"Returns the positive square root of a positive number.\",\r\n            \"a\": \"Positive square root of a positive number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The number for which to calculate the positive square root.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SQRTPI\": {\r\n            \"d\": \"Returns the positive square root of the product of Pi and the given positive number.\",\r\n            \"a\": \"Square root of the product of pi and number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The number which will be multiplied by Pi and have the product's square root returned\"\r\n                }\r\n            ]\r\n        },\r\n        \"GAMMALN\": {\r\n            \"d\": \"Returns the logarithm of a specified Gamma function, base e (Euler's number).\",\r\n            \"a\": \"Logarithm of gamma function.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The input to the Gamma function. The natural logarithm of Gamma(`value`) will be returned.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COS\": {\r\n            \"d\": \"Returns the cosine of an angle provided in radians.\",\r\n            \"a\": \"Cosine of an angle provided in radians.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"angle\",\r\n                    \"detail\": \"The angle to find the cosine of, in radians.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TRUNC\": {\r\n            \"d\": \"Truncates a number to a certain number of significant digits by omitting less significant digits.\",\r\n            \"a\": \"Truncates a number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to be truncated.\"\r\n                },\r\n                {\r\n                    \"name\": \"places\",\r\n                    \"detail\": \"The number of significant digits to the right of the decimal point to retain.\"\r\n                }\r\n            ]\r\n        },\r\n        \"QUOTIENT\": {\r\n            \"d\": \"Returns one number divided by another.\",\r\n            \"a\": \"One number divided by another.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"dividend\",\r\n                    \"detail\": \"The number to be divided.\"\r\n                },\r\n                {\r\n                    \"name\": \"divisor\",\r\n                    \"detail\": \"The number to divide by.\"\r\n                }\r\n            ]\r\n        },\r\n        \"POWER\": {\r\n            \"d\": \"Returns a number raised to a power.\",\r\n            \"a\": \"A number raised to a power.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"base\",\r\n                    \"detail\": \"The number to raise to the `exponent` power.\"\r\n                },\r\n                {\r\n                    \"name\": \"exponent\",\r\n                    \"detail\": \"The exponent to raise `base` to.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUMIFS\": {\r\n            \"d\": \"Returns the sum of a range depending on multiple criteria.\",\r\n            \"a\": \"Sums a range depending on multiple criteria.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"sum_range\",\r\n                    \"detail\": \"The range to sum.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria_range1\",\r\n                    \"detail\": \"The range to check against criterion1.\"\r\n                },\r\n                {\r\n                    \"name\": \"criterion1\",\r\n                    \"detail\": \"The pattern or test to apply to criteria_range1.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria_range2\",\r\n                    \"detail\": \"Additional ranges to check.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUNTIFS\": {\r\n            \"d\": \"Returns the count of a range depending on multiple criteria.\",\r\n            \"a\": \"Count values depending on multiple criteria.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"criteria_range1\",\r\n                    \"detail\": \"The range to check against `criterion1`.\"\r\n                },\r\n                {\r\n                    \"name\": \"criterion1\",\r\n                    \"detail\": \"The pattern or test to apply to `criteria_range1`.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria_range2\",\r\n                    \"detail\": \"Additional ranges to check.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PRODUCT\": {\r\n            \"d\": \"Returns the result of multiplying a series of numbers together.\",\r\n            \"a\": \"Result of multiplying a series of numbers together.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"factor1\",\r\n                    \"detail\": \"The first number or range to calculate for the product.\"\r\n                },\r\n                {\r\n                    \"name\": \"factor2\",\r\n                    \"detail\": \"More numbers or ranges to calculate for the product.\"\r\n                }\r\n            ]\r\n        },\r\n        \"HARMEAN\": {\r\n            \"d\": \"Calculates the harmonic mean of a dataset.\",\r\n            \"a\": \"The harmonic mean of a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range of the population.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to include in the population.\"\r\n                }\r\n            ]\r\n        },\r\n        \"HYPGEOMDIST\": {\r\n            \"d\": \"Calculates the probability of drawing a certain number of successes in a certain number of tries given a population of a certain size containing a certain number of successes, without replacement of draws.\",\r\n            \"a\": \"Hypergeometric distribution probability.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"num_successes\",\r\n                    \"detail\": \"The desired number of successes.\"\r\n                },\r\n                {\r\n                    \"name\": \"num_draws\",\r\n                    \"detail\": \"The number of permitted draws.\"\r\n                },\r\n                {\r\n                    \"name\": \"successes_in_pop\",\r\n                    \"detail\": \"The total number of successes in the population.\"\r\n                },\r\n                {\r\n                    \"name\": \"pop_size\",\r\n                    \"detail\": \"The total size of the population\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"Determine the logical value of the function form. \\n\\nIf cumulative is TRUE(), HYPGEOM.DIST returns the cumulative distribution function;\\n\\nif FALSE(), it returns the probability density function.\"\r\n                }\r\n            ]\r\n        },\r\n        \"INTERCEPT\": {\r\n            \"d\": \"Calculates the y-value at which the line resulting from linear regression of a dataset will intersect the y-axis (x=0).\",\r\n            \"a\": \"Y-intercept of line derived via linear regression.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data_y\",\r\n                    \"detail\": \"The range representing the array or matrix of dependent data.\"\r\n                },\r\n                {\r\n                    \"name\": \"data_x\",\r\n                    \"detail\": \"The range representing the array or matrix of independent data.\"\r\n                }\r\n            ]\r\n        },\r\n        \"KURT\": {\r\n            \"d\": \"Calculates the kurtosis of a dataset, which describes the shape, and in particular the \\\"peakedness\\\" of that dataset.\",\r\n            \"a\": \"Kurtosis of a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range of the dataset.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to include in the dataset.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LARGE\": {\r\n            \"d\": \"Returns the nth largest element from a data set, where n is user-defined.\",\r\n            \"a\": \"Nth largest element from a data set.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"Array or range containing the dataset to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"n\",\r\n                    \"detail\": \"The rank from largest to smallest of the element to return.\"\r\n                }\r\n            ]\r\n        },\r\n        \"STDEVA\": {\r\n            \"d\": \"Calculates the standard deviation based on a sample, setting text to the value `0`.\",\r\n            \"a\": \"Standard deviation of sample (text as 0).\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range of the sample.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to include in the sample.\"\r\n                }\r\n            ]\r\n        },\r\n        \"STDEVP\": {\r\n            \"d\": \"Calculates the standard deviation based on an entire population.\",\r\n            \"a\": \"Standard deviation of an entire population.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range of the population.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to include in the population.\"\r\n                }\r\n            ]\r\n        },\r\n        \"GEOMEAN\": {\r\n            \"d\": \"Calculates the geometric mean of a dataset.\",\r\n            \"a\": \"The geometric mean of a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range of the population.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to include in the population.\"\r\n                }\r\n            ]\r\n        },\r\n        \"RANK_EQ\": {\r\n            \"d\": \"Returns the rank of a specified value in a dataset. If there is more than one entry of the same value in the dataset, the top rank of the entries will be returned.\",\r\n            \"a\": \"Top rank of a specified value in a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value whose rank will be determined.\"\r\n                },\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"The array or range containing the dataset to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"is_ascending\",\r\n                    \"detail\": \"Whether to consider the values in `data` in descending or ascending order. If omitted, the default is descending (FALSE).\"\r\n                }\r\n            ]\r\n        },\r\n        \"RANK_AVG\": {\r\n            \"d\": \"Returns the rank of a specified value in a dataset. If there is more than one entry of the same value in the dataset, the average rank of the entries will be returned.\",\r\n            \"a\": \"Average rank of a specified value in a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value whose rank will be determined.\"\r\n                },\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"The array or range containing the dataset to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"is_ascending\",\r\n                    \"detail\": \"Whether to consider the values in `data` in descending or ascending order. If omitted, the default is descending (FALSE).\"\r\n                }\r\n            ]\r\n        },\r\n        \"PERCENTRANK_EXC\": {\r\n            \"d\": \"Returns the percentage rank (percentile) from 0 to 1 exclusive of a specified value in a dataset.\",\r\n            \"a\": \"Percentage rank (percentile) from 0 to 1 exclusive.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"The array or range containing the dataset to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value whose percentage rank will be determined.\"\r\n                },\r\n                {\r\n                    \"name\": \"significant_digits\",\r\n                    \"detail\": \"The number of significant figures to use in the calculation. Default is 3.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PERCENTRANK_INC\": {\r\n            \"d\": \"Returns the percentage rank (percentile) from 0 to 1 inclusive of a specified value in a dataset.\",\r\n            \"a\": \"Percentage rank (percentile) from 0 to 1 inclusive.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"The array or range containing the dataset to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value whose percentage rank will be determined.\"\r\n                },\r\n                {\r\n                    \"name\": \"significant_digits\",\r\n                    \"detail\": \"The number of significant figures to use in the calculation. Default is 3.\"\r\n                }\r\n            ]\r\n        },\r\n        \"FORECAST\": {\r\n            \"d\": \"Calculates the expected y-value for a specified x based on a linear regression of a dataset.\",\r\n            \"a\": \"Expected y-value based of linear regression.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The value on the x-axis to forecast.\"\r\n                },\r\n                {\r\n                    \"name\": \"data_y\",\r\n                    \"detail\": \"The range representing the array or matrix of dependent data.\"\r\n                },\r\n                {\r\n                    \"name\": \"data_x\",\r\n                    \"detail\": \"The range representing the array or matrix of independent data.\"\r\n                }\r\n            ]\r\n        },\r\n        \"FISHERINV\": {\r\n            \"d\": \"Returns the inverse Fisher transformation of a specified value.\",\r\n            \"a\": \"Inverse fisher transformation of a specified value.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value for which to calculate the inverse Fisher transformation.\"\r\n                }\r\n            ]\r\n        },\r\n        \"FISHER\": {\r\n            \"d\": \"Returns the Fisher transformation of a specified value.\",\r\n            \"a\": \"Fisher transformation of a specified value.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value for which to calculate the Fisher transformation.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MODE_SNGL\": {\r\n            \"d\": \"Returns the most commonly occurring value in a dataset.\",\r\n            \"a\": \"Most commonly occurring value in a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range to consider when calculating mode.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to consider when calculating mode.\"\r\n                }\r\n            ]\r\n        },\r\n        \"WEIBULL_DIST\": {\r\n            \"d\": \"Returns the value of the Weibull distribution function (or Weibull cumulative distribution function) for a specified shape and scale.\",\r\n            \"a\": \"Weibull distribution function.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the Weibull distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"shape\",\r\n                    \"detail\": \"The shape parameter of the Weibull distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"scale\",\r\n                    \"detail\": \"The scale parameter of the Weibull distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"Whether to use the cumulative distribution function.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUNT\": {\r\n            \"d\": \"Returns the number of numeric values in a dataset.\",\r\n            \"a\": \"The number of numeric values in dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range to consider when counting.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to consider when counting.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUNTA\": {\r\n            \"d\": \"Returns the number of values in a dataset.\",\r\n            \"a\": \"The number of values in a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range to consider when counting.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to consider when counting.\"\r\n                }\r\n            ]\r\n        },\r\n        \"AVEDEV\": {\r\n            \"d\": \"Calculates the average of the magnitudes of deviations of data from a dataset's mean.\",\r\n            \"a\": \"Average magnitude of deviations from mean.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range of the sample.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to include in the sample.\"\r\n                }\r\n            ]\r\n        },\r\n        \"AVERAGE\": {\r\n            \"d\": \"Returns the numerical average value in a dataset, ignoring text.\",\r\n            \"a\": \"Numerical average value in a dataset, ignoring text.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range to consider when calculating the average value.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to consider when calculating the average value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"AVERAGEA\": {\r\n            \"d\": \"Returns the numerical average value in a dataset.\",\r\n            \"a\": \"Numerical average value in a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range to consider when calculating the average value.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to consider when calculating the average value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"BINOM_DIST\": {\r\n            \"d\": \"Calculates the probability of drawing a certain number of successes (or a maximum number of successes) in a certain number of tries given a population of a certain size containing a certain number of successes, with replacement of draws.\",\r\n            \"a\": \"Binomial distribution probability.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"num_successes\",\r\n                    \"detail\": \"The number of successes for which to calculate the probability in `num_trials` trials.\"\r\n                },\r\n                {\r\n                    \"name\": \"num_trials\",\r\n                    \"detail\": \"The number of independent trials.\"\r\n                },\r\n                {\r\n                    \"name\": \"prob_success\",\r\n                    \"detail\": \"The probability of success in any given trial.\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"Whether to use the binomial cumulative distribution.\"\r\n                }\r\n            ]\r\n        },\r\n        \"BINOM_INV\": {\r\n            \"d\": \"Calculates the smallest value for which the cumulative binomial distribution is greater than or equal to a specified criteria.\",\r\n            \"a\": \"Inverse cumulative binomial distribution function.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"num_trials\",\r\n                    \"detail\": \"The number of independent trials.\"\r\n                },\r\n                {\r\n                    \"name\": \"prob_success\",\r\n                    \"detail\": \"The probability of success in any given trial.\"\r\n                },\r\n                {\r\n                    \"name\": \"target_prob\",\r\n                    \"detail\": \"The desired threshold probability.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CONFIDENCE_NORM\": {\r\n            \"d\": \"Calculates the width of half the confidence interval for a normal distribution.\",\r\n            \"a\": \"Confidence interval for a normal distribution.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"alpha\",\r\n                    \"detail\": \"One minus the desired confidence level. E.g. `0.1` for `0.9`, or 90%, confidence.\"\r\n                },\r\n                {\r\n                    \"name\": \"standard_deviation\",\r\n                    \"detail\": \"The standard deviation of the population.\"\r\n                },\r\n                {\r\n                    \"name\": \"pop_size\",\r\n                    \"detail\": \"The size of the population.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CORREL\": {\r\n            \"d\": \"Calculates r, the Pearson product-moment correlation coefficient of a dataset.\",\r\n            \"a\": \"Pearson Product-Moment Correlation Coefficient.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data_y\",\r\n                    \"detail\": \"The range representing the array or matrix of dependent data.\"\r\n                },\r\n                {\r\n                    \"name\": \"data_x\",\r\n                    \"detail\": \"The range representing the array or matrix of independent data.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COVARIANCE_P\": {\r\n            \"d\": \"Calculates the covariance of a dataset.\",\r\n            \"a\": \"The covariance of a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data_y\",\r\n                    \"detail\": \"The range representing the array or matrix of dependent data.\"\r\n                },\r\n                {\r\n                    \"name\": \"data_x\",\r\n                    \"detail\": \"The range representing the array or matrix of independent data.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COVARIANCE_S\": {\r\n            \"d\": \"Calculates the sample covariance of a dataset.\",\r\n            \"a\": \"The sample covariance of a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data_y\",\r\n                    \"detail\": \"The range representing the array or matrix of dependent data.\"\r\n                },\r\n                {\r\n                    \"name\": \"data_x\",\r\n                    \"detail\": \"The range representing the array or matrix of independent data.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DEVSQ\": {\r\n            \"d\": \"Calculates the sum of squares of deviations based on a sample.\",\r\n            \"a\": \"The sum of squares of deviations based on a sample.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range of the sample.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to include in the sample.\"\r\n                }\r\n            ]\r\n        },\r\n        \"EXPON_DIST\": {\r\n            \"d\": \"Returns the value of the exponential distribution function with a specified lambda at a specified value.\",\r\n            \"a\": \"Exponential distribution function.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the exponential distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"lambda\",\r\n                    \"detail\": \"The lambda to specify the exponential distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"Whether to use the exponential cumulative distribution.\"\r\n                }\r\n            ]\r\n        },\r\n        \"AVERAGEIF\": {\r\n            \"d\": \"Returns the average of a range depending on criteria.\",\r\n            \"a\": \"Average of values depending on criteria.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"criteria_range\",\r\n                    \"detail\": \"The range to check against `criterion`.\"\r\n                },\r\n                {\r\n                    \"name\": \"criterion\",\r\n                    \"detail\": \"The pattern or test to apply to `criteria_range`.\"\r\n                },\r\n                {\r\n                    \"name\": \"average_range\",\r\n                    \"detail\": \"The range to average. If not included, `criteria_range` is used for the average instead.\"\r\n                }\r\n            ]\r\n        },\r\n        \"AVERAGEIFS\": {\r\n            \"d\": \"Returns the average of a range depending on multiple criteria.\",\r\n            \"a\": \"Average of values depending on multiple criteria.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"average_range\",\r\n                    \"detail\": \"The range to average.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria_range1\",\r\n                    \"detail\": \"The range to check against `criterion1`.\"\r\n                },\r\n                {\r\n                    \"name\": \"criterion1\",\r\n                    \"detail\": \"The pattern or test to apply to `criteria_range1`.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria_range2\",\r\n                    \"detail\": \"Additional ranges to check.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PERMUT\": {\r\n            \"d\": \"Returns the number of ways to choose some number of objects from a pool of a given size of objects, considering order.\",\r\n            \"a\": \"Number of permutations from a number of objects.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"n\",\r\n                    \"detail\": \"The size of the pool of objects to choose from.\"\r\n                },\r\n                {\r\n                    \"name\": \"k\",\r\n                    \"detail\": \"The number of objects to choose.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TRIMMEAN\": {\r\n            \"d\": \"Calculates the mean of a dataset excluding some proportion of data from the high and low ends of the dataset.\",\r\n            \"a\": \"Mean of a dataset excluding high/low ends.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"Array or range containing the dataset to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"exclude_proportion\",\r\n                    \"detail\": \"The proportion of the dataset to exclude, from the extremities of the set.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PERCENTILE_EXC\": {\r\n            \"d\": \"Returns the value at a given percentile of a dataset exclusive of 0 and 1.\",\r\n            \"a\": \"Value at a given percentile of a dataset exclusive of 0 and 1.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"The array or range containing the dataset to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"percentile\",\r\n                    \"detail\": \"The percentile, exclusive of 0 and 1, whose value within 'data' will be calculated and returned.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PERCENTILE_INC\": {\r\n            \"d\": \"Returns the value at a given percentile of a dataset.\",\r\n            \"a\": \"Value at a given percentile of a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"The array or range containing the dataset to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"percentile\",\r\n                    \"detail\": \"The percentile whose value within `data` will be calculated and returned.`\"\r\n                }\r\n            ]\r\n        },\r\n        \"PEARSON\": {\r\n            \"d\": \"Calculates r, the Pearson product-moment correlation coefficient of a dataset.\",\r\n            \"a\": \"Pearson Product-Moment Correlation Coefficient.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data_y\",\r\n                    \"detail\": \"The range representing the array or matrix of dependent data.\"\r\n                },\r\n                {\r\n                    \"name\": \"data_x\",\r\n                    \"detail\": \"The range representing the array or matrix of independent data.\"\r\n                }\r\n            ]\r\n        },\r\n        \"NORM_S_INV\": {\r\n            \"d\": \"Returns the value of the inverse standard normal distribution function for a specified value.\",\r\n            \"a\": \"Inverse standard normal distribution function.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the inverse standard normal distribution function.\"\r\n                }\r\n            ]\r\n        },\r\n        \"NORM_S_DIST\": {\r\n            \"d\": \"Returns the value of the standard normal cumulative distribution function for a specified value.\",\r\n            \"a\": \"Standard normal cumulative distribution function.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the standard normal cumulative distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"Determine the logical value of the function form. \\n\\nIf TRUE(), it returns the cumulative distribution function;\\n\\nIf it is FALSE(), it returns the probability density function.\"\r\n                }\r\n            ]\r\n        },\r\n        \"NORM_INV\": {\r\n            \"d\": \"Returns the value of the inverse normal distribution function for a specified value, mean, and standard deviation.\",\r\n            \"a\": \"Inverse normal distribution function.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the inverse normal distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"mean\",\r\n                    \"detail\": \"The mean (mu) of the normal distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"standard_deviation\",\r\n                    \"detail\": \"The standard deviation (sigma) of the normal distribution function.\"\r\n                }\r\n            ]\r\n        },\r\n        \"NORM_DIST\": {\r\n            \"d\": \"Returns the value of the normal distribution function (or normal cumulative distribution function) for a specified value, mean, and standard deviation.\",\r\n            \"a\": \"Normal distribution function.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the normal distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"mean\",\r\n                    \"detail\": \"The mean (mu) of the normal distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"standard_deviation\",\r\n                    \"detail\": \"The standard deviation (sigma) of the normal distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"Whether to use the normal cumulative distribution function rather than the distribution function.\"\r\n                }\r\n            ]\r\n        },\r\n        \"NEGBINOM_DIST\": {\r\n            \"d\": \"Calculates the probability of drawing a certain number of failures before a certain number of successes given a probability of success in independent trials.\",\r\n            \"a\": \"Negative binomial distribution probability.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"num_failures\",\r\n                    \"detail\": \"The number of failures to model.\"\r\n                },\r\n                {\r\n                    \"name\": \"num_successes\",\r\n                    \"detail\": \"The number of successes to model.\"\r\n                },\r\n                {\r\n                    \"name\": \"prob_success\",\r\n                    \"detail\": \"The probability of success in any given trial.\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"Determine the logical value of the function form. \\n\\nIf TRUE(), it returns the cumulative distribution function;\\n\\nIf it is FALSE(), it returns the probability density function.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MINA\": {\r\n            \"d\": \"Returns the minimum numeric value in a dataset.\",\r\n            \"a\": \"Minimum numeric value in a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range to consider when calculating the minimum value.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to consider when calculating the minimum value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MIN\": {\r\n            \"d\": \"Returns the minimum value in a numeric dataset.\",\r\n            \"a\": \"Minimum value in a numeric dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range to consider when calculating the minimum value.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to consider when calculating the minimum value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MEDIAN\": {\r\n            \"d\": \"Returns the median value in a numeric dataset.\",\r\n            \"a\": \"Median value in a numeric dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range to consider when calculating the median value.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to consider when calculating the median value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MAXA\": {\r\n            \"d\": \"Returns the maximum numeric value in a dataset.\",\r\n            \"a\": \"Maximum numeric value in a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range to consider when calculating the maximum value.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to consider when calculating the maximum value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MAX\": {\r\n            \"d\": \"Returns the maximum value in a numeric dataset.\",\r\n            \"a\": \"Maximum value in a numeric dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range to consider when calculating the maximum value.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to consider when calculating the maximum value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOGNORM_INV\": {\r\n            \"d\": \"Returns the value of the inverse log-normal cumulative distribution with given mean and standard deviation at a specified value.\",\r\n            \"a\": \"Inverse log-normal cumulative distribution function.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the inverse log-normal cumulative distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"mean\",\r\n                    \"detail\": \"The mean (mu) of the inverse log-normal cumulative distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"standard_deviation\",\r\n                    \"detail\": \"The standard deviation (sigma) of the inverse log-normal cumulative distribution function.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOGNORM_DIST\": {\r\n            \"d\": \"Returns the value of the log-normal cumulative distribution with given mean and standard deviation at a specified value.\",\r\n            \"a\": \"Log-normal cumulative distribution probability.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the log-normal cumulative distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"mean\",\r\n                    \"detail\": \"The mean (mu) of the log-normal cumulative distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"standard_deviation\",\r\n                    \"detail\": \"The standard deviation (sigma) of the log-normal cumulative distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"Determine the logical value of the function form. \\n\\nIf TRUE(), it returns the cumulative distribution function;\\n\\nIf it is FALSE(), it returns the probability density function.\"\r\n                }\r\n            ]\r\n        },\r\n        \"Z_TEST\": {\r\n            \"d\": \"Returns the one-tailed p-value of a Z-test with standard distribution.\",\r\n            \"a\": \"One-tailed p-value of a z-test.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"The array or range containing the dataset to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The test statistic to use in the Z-test.\"\r\n                },\r\n                {\r\n                    \"name\": \"standard_deviation\",\r\n                    \"detail\": \"The standard deviation to assume for the Z-test. If this is not provided, the standard deviation of the data will be used.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PROB\": {\r\n            \"d\": \"Given a set of values and corresponding probabilities, calculates the probability that a value chosen at random falls between two limits.\",\r\n            \"a\": \"Probability values lie in a range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"Array or range containing the dataset to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"probabilities\",\r\n                    \"detail\": \"Array or range containing probabilities corresponding to `data`.\"\r\n                },\r\n                {\r\n                    \"name\": \"low_limit\",\r\n                    \"detail\": \"The lower bound on the value range for which to calculate the probability.\"\r\n                },\r\n                {\r\n                    \"name\": \"high_limit\",\r\n                    \"detail\": \"The upper bound on the value range for which to calculate the probability.\"\r\n                }\r\n            ]\r\n        },\r\n        \"QUARTILE_EXC\": {\r\n            \"d\": \"Returns a value nearest to a specified quartile of a dataset exclusive of 0 and 4.\",\r\n            \"a\": \"Value nearest to a specific quartile of a dataset exclusive of 0 and 4.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"The array or range containing the dataset to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"quartile_number\",\r\n                    \"detail\": \"Which quartile to return.\"\r\n                }\r\n            ]\r\n        },\r\n        \"QUARTILE_INC\": {\r\n            \"d\": \"Returns a value nearest to a specified quartile of a dataset.\",\r\n            \"a\": \"Value nearest to a specific quartile of a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"The array or range containing the dataset to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"quartile_number\",\r\n                    \"detail\": \"Which quartile value to return.\"\r\n                }\r\n            ]\r\n        },\r\n        \"POISSON_DIST\": {\r\n            \"d\": \"Returns the value of the Poisson distribution function (or Poisson cumulative distribution function) for a specified value and mean.\",\r\n            \"a\": \"Poisson distribution function.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the Poisson distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"mean\",\r\n                    \"detail\": \"The mean (mu) of the Poisson distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"Whether to use the Poisson cumulative distribution function rather than the distribution function.\"\r\n                }\r\n            ]\r\n        },\r\n        \"RSQ\": {\r\n            \"d\": \"Calculates the square of r, the Pearson product-moment correlation coefficient of a dataset.\",\r\n            \"a\": \"Square of the correlation coefficient.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data_y\",\r\n                    \"detail\": \"The range representing the array or matrix of dependent data.\"\r\n                },\r\n                {\r\n                    \"name\": \"data_x\",\r\n                    \"detail\": \"The range representing the array or matrix of independent data.\"\r\n                }\r\n            ]\r\n        },\r\n        \"T_DIST\": {\r\n            \"d\": \"Calculates the left tail probability for a Student's t-distribution with a given input (x).\",\r\n            \"a\": \"The left-tailed Student's t-distribution\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the t-distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom\",\r\n                    \"detail\": \"The number of degrees of freedom.\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"If cumulative is TRUE, T.DIST returns the cumulative distribution function; if FALSE, it returns the probability density function.\"\r\n                }\r\n            ]\r\n        },\r\n        \"T_DIST_2T\": {\r\n            \"d\": \"Calculates the probability for two tailed Student's t-distribution with a given input (x).\",\r\n            \"a\": \"The two tailed Student's t-distribution\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the t-distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom\",\r\n                    \"detail\": \"The number of degrees of freedom.\"\r\n                }\r\n            ]\r\n        },\r\n        \"T_DIST_RT\": {\r\n            \"d\": \"Calculates the right tail probability for a Student's t-distribution with a given input (x).\",\r\n            \"a\": \"The right-tailed Student's t-distribution\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the t-distribution function.\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom\",\r\n                    \"detail\": \"The number of degrees of freedom.\"\r\n                }\r\n            ]\r\n        },\r\n        \"T_INV\": {\r\n            \"d\": \"Calculates the negative inverse of the one-tailed TDIST function.\",\r\n            \"a\": \"T.INV\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"probability\",\r\n                    \"detail\": \"The probability associated with the two-tailed t-distribution.\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom\",\r\n                    \"detail\": \"The number of degrees of freedom.\"\r\n                }\r\n            ]\r\n        },\r\n        \"T_INV_2T\": {\r\n            \"d\": \"Calculates the inverse of the two-tailed TDIST function.\",\r\n            \"a\": \"T.INV.2T\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"probability\",\r\n                    \"detail\": \"The probability associated with the two-tailed t-distribution.\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom\",\r\n                    \"detail\": \"The number of degrees of freedom.\"\r\n                }\r\n            ]\r\n        },\r\n        \"T_TEST\": {\r\n            \"d\": \"t-test. Returns the probability associated with Student's t-test. Determines whether two samples are likely to have come from the same two underlying populations that have the same mean.\",\r\n            \"a\": \"Returns the probability associated with t-test.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"range1\",\r\n                    \"detail\": \"The first sample of data or group of cells to consider for the t-test.\"\r\n                },\r\n                {\r\n                    \"name\": \"range2\",\r\n                    \"detail\": \"The second sample of data or group of cells to consider for the t-test.\"\r\n                },\r\n                {\r\n                    \"name\": \"tails\",\r\n                    \"detail\": \"Specifies the number of distribution tails.\"\r\n                },\r\n                {\r\n                    \"name\": \"type\",\r\n                    \"detail\": \"Specifies the type of t-test.\"\r\n                }\r\n            ]\r\n        },\r\n        \"F_DIST\": {\r\n            \"d\": \"Calculates the left-tailed F probability distribution (degree of diversity) for two data sets with given input x. Alternately called Fisher-Snedecor distribution or Snedecor's F distribution.\",\r\n            \"a\": \"F probability distribution (left-tailed).\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the F probability distribution function. The value at which to evaluate the function.\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom1\",\r\n                    \"detail\": \"The numerator of the number of degrees of freedom.\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom2\",\r\n                    \"detail\": \"The denominator of the number of degrees of freedom.\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"Logical value that determines the form of the function.\"\r\n                }\r\n            ]\r\n        },\r\n        \"F_DIST_RT\": {\r\n            \"d\": \"Calculates the right-tailed F probability distribution (degree of diversity) for two data sets with given input x. Alternately called Fisher-Snedecor distribution or Snedecor's F distribution.\",\r\n            \"a\": \"F probability distribution.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"The input to the F probability distribution function. The value at which to evaluate the function.\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom1\",\r\n                    \"detail\": \"The numerator of the number of degrees of freedom.\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom2\",\r\n                    \"detail\": \"The denominator of the number of degrees of freedom.\"\r\n                }\r\n            ]\r\n        },\r\n        \"VAR_P\": {\r\n            \"d\": \"Calculates the variance based on an entire population.\",\r\n            \"a\": \"Variance of entire population.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range of the population.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to include in the population.\"\r\n                }\r\n            ]\r\n        },\r\n        \"VAR_S\": {\r\n            \"d\": \"Calculates the variance based on a sample.\",\r\n            \"a\": \"Variance.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range of the sample.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to include in the sample.\"\r\n                }\r\n            ]\r\n        },\r\n        \"VARA\": {\r\n            \"d\": \"Calculates the variance based on a sample, setting text to the value `0`.\",\r\n            \"a\": \"Variance of sample (text as 0).\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range of the sample.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to include in the sample.\"\r\n                }\r\n            ]\r\n        },\r\n        \"VARPA\": {\r\n            \"d\": \"Calculates the variance based on an entire population, setting text to the value `0`.\",\r\n            \"a\": \"Variance of entire population (text as 0).\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range of the population.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to include in the population.\"\r\n                }\r\n            ]\r\n        },\r\n        \"STEYX\": {\r\n            \"d\": \"Calculates the standard error of the predicted y-value for each x in the regression of a dataset.\",\r\n            \"a\": \"Standard error of predicted y-values in regression.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data_y\",\r\n                    \"detail\": \"The range representing the array or matrix of dependent data.\"\r\n                },\r\n                {\r\n                    \"name\": \"data_x\",\r\n                    \"detail\": \"The range representing the array or matrix of independent data.\"\r\n                }\r\n            ]\r\n        },\r\n        \"STANDARDIZE\": {\r\n            \"d\": \"Calculates the normalized equivalent of a random variable given mean and standard deviation of the distribution.\",\r\n            \"a\": \"Normalized equivalent of a random variable.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value of the random variable to normalize.\"\r\n                },\r\n                {\r\n                    \"name\": \"mean\",\r\n                    \"detail\": \"The mean of the distribution.\"\r\n                },\r\n                {\r\n                    \"name\": \"standard_deviation\",\r\n                    \"detail\": \"The standard deviation of the distribution.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SMALL\": {\r\n            \"d\": \"Returns the nth smallest element from a data set, where n is user-defined.\",\r\n            \"a\": \"Nth smallest element in a data set.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"The array or range containing the dataset to consider.\"\r\n                },\r\n                {\r\n                    \"name\": \"n\",\r\n                    \"detail\": \"The rank from smallest to largest of the element to return.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SLOPE\": {\r\n            \"d\": \"Calculates the slope of the line resulting from linear regression of a dataset.\",\r\n            \"a\": \"Slope of line from linear regression of data.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data_y\",\r\n                    \"detail\": \"The range representing the array or matrix of dependent data.\"\r\n                },\r\n                {\r\n                    \"name\": \"data_x\",\r\n                    \"detail\": \"The range representing the array or matrix of independent data.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SKEW\": {\r\n            \"d\": \"Calculates the skewness of a dataset, which describes the symmetry of that dataset about the mean.\",\r\n            \"a\": \"Skewness of a dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range of the dataset.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to include in the dataset.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SKEW_P\": {\r\n            \"d\": \"Calculates the skewness of a dataset, which describes the symmetry of that dataset about the mean. This assumes the dataset is for the population.\",\r\n            \"a\": \"Skewness of a population's dataset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value or range of the dataset.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional values or ranges to include in the dataset.\"\r\n                }\r\n            ]\r\n        },\r\n        \"VLOOKUP\": {\r\n            \"d\": \"Vertical lookup. Searches down the first column of a range for a key and returns the value of a specified cell in the row found.\",\r\n            \"a\": \"Vertical lookup.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"search_key\",\r\n                    \"detail\": \"The value to search for. For example, `42`, `\\\"Cats\\\"`, or `I24`.\"\r\n                },\r\n                {\r\n                    \"name\": \"range\",\r\n                    \"detail\": \"The range to consider for the search. The first column in the range is searched for the key specified in `search_key`.\"\r\n                },\r\n                {\r\n                    \"name\": \"index\",\r\n                    \"detail\": \"The column index of the value to be returned, where the first column in `range` is numbered 1.\"\r\n                },\r\n                {\r\n                    \"name\": \"is_sorted\",\r\n                    \"detail\": \"Indicates whether the column to be searched (the first column of the specified range) is sorted, in which case the closest match for `search_key` will be returned.\"\r\n                }\r\n            ]\r\n        },\r\n        \"HLOOKUP\": {\r\n            \"d\": \"Horizontal lookup. Searches across the first row of a range for a key and returns the value of a specified cell in the column found.\",\r\n            \"a\": \"Horizontal lookup\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"search_key\",\r\n                    \"detail\": \"The value to search for. For example, `42`, `\\\"Cats\\\"`, or `I24`.\"\r\n                },\r\n                {\r\n                    \"name\": \"range\",\r\n                    \"detail\": \"The range to consider for the search. The first row in the range is searched for the key specified in `search_key`.\"\r\n                },\r\n                {\r\n                    \"name\": \"index\",\r\n                    \"detail\": \"The row index of the value to be returned, where the first row in `range` is numbered 1.\"\r\n                },\r\n                {\r\n                    \"name\": \"is_sorted\",\r\n                    \"detail\": \"Indicates whether the row to be searched (the first row of the specified range) is sorted.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOOKUP\": {\r\n            \"d\": \"Looks through a sorted row or column for a key and returns the value of the cell in a result range located in the same position as the search row or column.\",\r\n            \"a\": \"Look up a value.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"search_key\",\r\n                    \"detail\": \"The value to search for in the row or column. For example, `42`, `\\\"Cats\\\"`, or `I24`.\"\r\n                },\r\n                {\r\n                    \"name\": \"search_range|search_result_array\",\r\n                    \"detail\": \"One method of using this function is to provide a single sorted row or column `search_range` to look through for the `search_key` with a second argument `result_range`. The other way is to combine these two arguments into one `search_result_array` where the first row or column is searched and a value is returned from the last row or column in the array. If `search_key` is not found, a non-exact match may be returned.\"\r\n                },\r\n                {\r\n                    \"name\": \"result_range\",\r\n                    \"detail\": \"The range from which to return a result. The value returned corresponds to the location where `search_key` is found in `search_range`. This range must be only a single row or column and should not be used if using the `search_result_array` method.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ADDRESS\": {\r\n            \"d\": \"Returns a cell reference as a string.\",\r\n            \"a\": \"Cell reference as a string.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"row\",\r\n                    \"detail\": \"The row number of the cell reference\"\r\n                },\r\n                {\r\n                    \"name\": \"column\",\r\n                    \"detail\": \"The column number (not name) of the cell reference. `A` is column number `1`.\"\r\n                },\r\n                {\r\n                    \"name\": \"absolute_relative_mode\",\r\n                    \"detail\": \"An indicator of whether the reference is row/column absolute. `1` is row and column absolute (e.g. $A$1), `2` is row absolute and column relative (e.g. A$1), `3` is row relative and column absolute (e.g. $A1), and `4` is row and column relative (e.g. A1).\"\r\n                },\r\n                {\r\n                    \"name\": \"use_a1_notation\",\r\n                    \"detail\": \"A boolean indicating whether to use `A1` style notation (TRUE) or `R1C1` style notation (FALSE).\"\r\n                },\r\n                {\r\n                    \"name\": \"sheet\",\r\n                    \"detail\": \"Text indicating the name of the sheet into which the address points.\"\r\n                }\r\n            ]\r\n        },\r\n        \"INDIRECT\": {\r\n            \"d\": \"Returns a cell reference specified by a string.\",\r\n            \"a\": \"A cell reference specified by a string.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cell_reference_as_string\",\r\n                    \"detail\": \"A cell reference, written as a string with surrounding quotation marks.\"\r\n                },\r\n                {\r\n                    \"name\": \"is_A1_notation\",\r\n                    \"detail\": \"Indicates if the cell reference is in A1 notation (TRUE) or R1C1 notation (FALSE).\"\r\n                }\r\n            ]\r\n        },\r\n        \"ROW\": {\r\n            \"d\": \"Returns the row number of a specified cell.\",\r\n            \"a\": \"Row number of a specified cell.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cell_reference\",\r\n                    \"detail\": \"The cell whose row number will be returned.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ROWS\": {\r\n            \"d\": \"Returns the number of rows in a specified array or range.\",\r\n            \"a\": \"Number of rows in a specified array or range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"range\",\r\n                    \"detail\": \"The range whose row count will be returned.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COLUMN\": {\r\n            \"d\": \"Returns the column number of a specified cell, with `A=1`.\",\r\n            \"a\": \"Column number of a specified cell.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cell_reference\",\r\n                    \"detail\": \"The cell whose column number will be returned. Column `A` corresponds to `1`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COLUMNS\": {\r\n            \"d\": \"Returns the number of columns in a specified array or range.\",\r\n            \"a\": \"Number of columns in a specified array or range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"range\",\r\n                    \"detail\": \"The range whose column count will be returned.\"\r\n                }\r\n            ]\r\n        },\r\n        \"OFFSET\": {\r\n            \"d\": \"Returns a range reference shifted a specified number of rows and columns from a starting cell reference.\",\r\n            \"a\": \"A range reference offset relative to a cell.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cell_reference\",\r\n                    \"detail\": \"The starting point from which to count the offset rows and columns.\"\r\n                },\r\n                {\r\n                    \"name\": \"offset_rows\",\r\n                    \"detail\": \"The number of rows to offset by.\"\r\n                },\r\n                {\r\n                    \"name\": \"offset_columns\",\r\n                    \"detail\": \"The number of columns to offset by.\"\r\n                },\r\n                {\r\n                    \"name\": \"height\",\r\n                    \"detail\": \"The height of the range to return starting at the offset target.\"\r\n                },\r\n                {\r\n                    \"name\": \"width\",\r\n                    \"detail\": \"The width of the range to return starting at the offset target.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MATCH\": {\r\n            \"d\": \"Returns the relative position of an item in a range that matches a specified value.\",\r\n            \"a\": \"Position of item in range that matches value.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"search_key\",\r\n                    \"detail\": \"The value to search for. For example, `42`, `\\\"Cats\\\"`, or `I24`.\"\r\n                },\r\n                {\r\n                    \"name\": \"range\",\r\n                    \"detail\": \"The one-dimensional array to be searched.\"\r\n                },\r\n                {\r\n                    \"name\": \"search_type\",\r\n                    \"detail\": \"The search method. `1` (default) finds the largest value less than or equal to `search_key` when `range` is sorted in ascending order. `0` finds the exact value when `range` is unsorted. `-1` finds the smallest value greater than or equal to `search_key` when `range` is sorted in descending order.\"\r\n                }\r\n            ]\r\n        },\r\n        \"INDEX\": {\r\n            \"d\": \"Returns the content of a cell, specified by row and column offset.\",\r\n            \"a\": \"Content of cell specified by row and column offset.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"reference\",\r\n                    \"detail\": \"The array of cells to be offset into.\"\r\n                },\r\n                {\r\n                    \"name\": \"row\",\r\n                    \"detail\": \"The number of offset rows.\"\r\n                },\r\n                {\r\n                    \"name\": \"column\",\r\n                    \"detail\": \"The number of offset columns.\"\r\n                }\r\n            ]\r\n        },\r\n        \"GETPIVOTDATA\": {\r\n            \"d\": \"Extracts an aggregated value from a pivot table that corresponds to the specified row and column headings.\",\r\n            \"a\": \"Extracts an aggregated value from a pivot table that corresponds to the specified row and column headings.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value_name\",\r\n                    \"detail\": \"The name of the value in the pivot table for which you want to get data.\"\r\n                },\r\n                {\r\n                    \"name\": \"any_pivot_table_cell\",\r\n                    \"detail\": \"Any reference to a cell in the desired pivot table (top corner recommended).\"\r\n                },\r\n                {\r\n                    \"name\": \"original_column\",\r\n                    \"detail\": \"The name of the column in the original data set (not the pivot table).\"\r\n                },\r\n                {\r\n                    \"name\": \"pivot_item\",\r\n                    \"detail\": \"The name of the row or column shown in the pivot table corresponding to *original_column* that you want to retrieve.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CHOOSE\": {\r\n            \"d\": \"Returns an element from a list of choices based on index.\",\r\n            \"a\": \"An element from a list of choices based on index.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"index\",\r\n                    \"detail\": \"Which choice (of the up to 30 provided) to return.\"\r\n                },\r\n                {\r\n                    \"name\": \"choice1\",\r\n                    \"detail\": \"A potential value to return. Required. May be a reference to a cell or an individual value.\"\r\n                },\r\n                {\r\n                    \"name\": \"choice2\",\r\n                    \"detail\": \"Additional values among which to choose.\"\r\n                }\r\n            ]\r\n        },\r\n        \"HYPERLINK\": {\r\n            \"d\": \"Creates a hyperlink inside a cell.\",\r\n            \"a\": \"Creates a hyperlink inside a cell.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"url\",\r\n                    \"detail\": \"The full URL of the link location enclosed in quotation marks, or a reference to a cell containing such a URL.\"\r\n                },\r\n                {\r\n                    \"name\": \"link_label\",\r\n                    \"detail\": \"The text to display in the cell as the link, enclosed in quotation marks, or a reference to a cell containing such a label.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TIME\": {\r\n            \"d\": \"Converts a provided hour, minute, and second into a time.\",\r\n            \"a\": \"Converts hour/minute/second into a time.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"hour\",\r\n                    \"detail\": \"The hour component of the time.\"\r\n                },\r\n                {\r\n                    \"name\": \"minute\",\r\n                    \"detail\": \"The minute component of the time.\"\r\n                },\r\n                {\r\n                    \"name\": \"second\",\r\n                    \"detail\": \"The second component of the time.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TIMEVALUE\": {\r\n            \"d\": \"Returns the fraction of a 24-hour day the time represents.\",\r\n            \"a\": \"Converts a time string into its serial number representation.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"time_string\",\r\n                    \"detail\": \"The string that holds the time representation.\"\r\n                }\r\n            ]\r\n        },\r\n        \"EOMONTH\": {\r\n            \"d\": \"Returns a date on the last day of a month that falls a specified number of months before or after another date.\",\r\n            \"a\": \"Last day of a month before or after a date.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"The date from which to calculate the result.\"\r\n                },\r\n                {\r\n                    \"name\": \"months\",\r\n                    \"detail\": \"The number of months before (negative) or after (positive) 'start_date' to consider.\"\r\n                }\r\n            ]\r\n        },\r\n        \"EDATE\": {\r\n            \"d\": \"Returns a date a specified number of months before or after another date.\",\r\n            \"a\": \"Date a number of months before/after another date.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"The date from which to calculate the result.\"\r\n                },\r\n                {\r\n                    \"name\": \"months\",\r\n                    \"detail\": \"The number of months before (negative) or after (positive) 'start_date' to calculate.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SECOND\": {\r\n            \"d\": \"Returns the second component of a specific time, in numeric format.\",\r\n            \"a\": \"Second component of a specific time.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"time\",\r\n                    \"detail\": \"The time from which to calculate the second component\"\r\n                }\r\n            ]\r\n        },\r\n        \"MINUTE\": {\r\n            \"d\": \"Returns the minute component of a specific time, in numeric format.\",\r\n            \"a\": \"Minute component of a specific time.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"time\",\r\n                    \"detail\": \"The time from which to calculate the minute component.\"\r\n                }\r\n            ]\r\n        },\r\n        \"HOUR\": {\r\n            \"d\": \"Returns the hour component of a specific time, in numeric format.\",\r\n            \"a\": \"Hour component of a specific time.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"time\",\r\n                    \"detail\": \"The time from which to calculate the hour component.\"\r\n                }\r\n            ]\r\n        },\r\n        \"NOW\": {\r\n            \"d\": \"Returns the current date and time as a date value.\",\r\n            \"a\": \"Current date and time as a date value.\",\r\n            \"p\": []\r\n        },\r\n        \"NETWORKDAYS\": {\r\n            \"d\": \"Returns the number of net working days between two provided days.\",\r\n            \"a\": \"Net working days between two provided days.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"The start date of the period from which to calculate the number of net working days.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_date\",\r\n                    \"detail\": \"The end date of the period from which to calculate the number of net working days.\"\r\n                },\r\n                {\r\n                    \"name\": \"holidays\",\r\n                    \"detail\": \"A range or array constant containing the date serial numbers to consider holidays.\"\r\n                }\r\n            ]\r\n        },\r\n        \"NETWORKDAYS_INTL\": {\r\n            \"d\": \"Returns the number of net working days between two provided days excluding specified weekend days and holidays.\",\r\n            \"a\": \"Net working days between two dates (specifying weekends).\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"The start date of the period from which to calculate the number of net working days.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_date\",\r\n                    \"detail\": \"The end date of the period from which to calculate the number of net working days.\"\r\n                },\r\n                {\r\n                    \"name\": \"weekend\",\r\n                    \"detail\": \"A number or string representing which days of the week are considered weekends.\"\r\n                },\r\n                {\r\n                    \"name\": \"holidays\",\r\n                    \"detail\": \"A range or array constant containing the dates to consider as holidays.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISOWEEKNUM\": {\r\n            \"d\": \"Returns a number representing the ISO week of the year where the provided date falls.\",\r\n            \"a\": \"ISO week number of the year.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"date\",\r\n                    \"detail\": \"The date for which to determine the ISO week number. Must be a reference to a cell containing a date, a function returning a date type, or a number.\"\r\n                }\r\n            ]\r\n        },\r\n        \"WEEKNUM\": {\r\n            \"d\": \"Returns a number representing the week of the year where the provided date falls.\",\r\n            \"a\": \"Week number of the year.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"date\",\r\n                    \"detail\": \"The date for which to determine the week number. Must be a reference to a cell containing a date, a function returning a date type, or a number.\"\r\n                },\r\n                {\r\n                    \"name\": \"type\",\r\n                    \"detail\": \"A number representing the day that a week starts on. Sunday = 1.\"\r\n                }\r\n            ]\r\n        },\r\n        \"WEEKDAY\": {\r\n            \"d\": \"Returns a number representing the day of the week of the date provided.\",\r\n            \"a\": \"Day of the week of the date provided (as number).\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"date\",\r\n                    \"detail\": \"The date for which to determine the day of the week. Must be a reference to a cell containing a date, a function returning a date type, or a number.\"\r\n                },\r\n                {\r\n                    \"name\": \"type\",\r\n                    \"detail\": \"A number indicating which numbering system to use to represent weekdays. By default, counts starting with Sunday = 1.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DAY\": {\r\n            \"d\": \"Returns the day of the month that a specific date falls on, in numeric format.\",\r\n            \"a\": \"Day of the month that a specific date falls on.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"date\",\r\n                    \"detail\": \"The date from which to extract the day.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DAYS\": {\r\n            \"d\": \"Returns the number of days between two dates.\",\r\n            \"a\": \"Number of days between two dates.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"end_date\",\r\n                    \"detail\": \"The end of the date range.\"\r\n                },\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"The start of the date range.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DAYS360\": {\r\n            \"d\": \"Returns the difference between two days based on the 360 day year used in some financial interest calculations.\",\r\n            \"a\": \"Days between two dates on a 360-day year.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_date\",\r\n                    \"detail\": \"The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\"\r\n                },\r\n                {\r\n                    \"name\": \"method\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATE\": {\r\n            \"d\": \"Converts a provided year, month, and day into a date.\",\r\n            \"a\": \"Converts year/month/day into a date.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"year\",\r\n                    \"detail\": \"The year component of the date.\"\r\n                },\r\n                {\r\n                    \"name\": \"month\",\r\n                    \"detail\": \"The month component of the date.\"\r\n                },\r\n                {\r\n                    \"name\": \"day\",\r\n                    \"detail\": \"The day component of the date.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATEVALUE\": {\r\n            \"d\": \"Converts a provided date string in a known format to a date value.\",\r\n            \"a\": \"Converts a date string to a date value.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"date_string\",\r\n                    \"detail\": \"The string representing the date.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATEDIF\": {\r\n            \"d\": \"Calculates the number of days, months, or years between two dates.\",\r\n            \"a\": \"Date Difference.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_date\",\r\n                    \"detail\": \"The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\"\r\n                },\r\n                {\r\n                    \"name\": \"unit\",\r\n                    \"detail\": \"A string abbreviation for unit of time. For example, \\\"M\\\" for month. Accepted values are \\\"Y\\\",\\\"M\\\",\\\"D\\\",\\\"MD\\\",\\\"YM\\\",\\\"YD\\\".\"\r\n                }\r\n            ]\r\n        },\r\n        \"WORKDAY\": {\r\n            \"d\": \"Calculates the date after a number of working days from a specified start date.\",\r\n            \"a\": \"Number of working days from start date.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"The date from which to begin counting.\"\r\n                },\r\n                {\r\n                    \"name\": \"num_days\",\r\n                    \"detail\": \"The number of working days to advance from `start_date`. If negative, counts backwards.\"\r\n                },\r\n                {\r\n                    \"name\": \"holidays\",\r\n                    \"detail\": \"A range or array constant containing the dates to consider holidays.\"\r\n                }\r\n            ]\r\n        },\r\n        \"WORKDAY_INTL\": {\r\n            \"d\": \"Calculates the date after a specified number of workdays excluding specified weekend days and holidays.\",\r\n            \"a\": \"Date after a number of workdays (specifying weekends).\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"The date from which to begin counting.\"\r\n                },\r\n                {\r\n                    \"name\": \"num_days\",\r\n                    \"detail\": \"The number of working days to advance from `start_date`. If negative, counts backwards.\"\r\n                },\r\n                {\r\n                    \"name\": \"weekend\",\r\n                    \"detail\": \"A number or string representing which days of the week are considered weekends.\"\r\n                },\r\n                {\r\n                    \"name\": \"holidays\",\r\n                    \"detail\": \"A range or array constant containing the dates to consider holidays.\"\r\n                }\r\n            ]\r\n        },\r\n        \"YEAR\": {\r\n            \"d\": \"Returns the year specified by a given date.\",\r\n            \"a\": \"Year specified by a given date.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"date\",\r\n                    \"detail\": \"The date from which to extract the year.\"\r\n                }\r\n            ]\r\n        },\r\n        \"YEARFRAC\": {\r\n            \"d\": \"Returns the number of years, including fractional years, between two dates using a specified day count convention.\",\r\n            \"a\": \"Exact number of years between two dates.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"The start date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_date\",\r\n                    \"detail\": \"The end date to consider in the calculation. Must be a reference to a cell containing a date, a function returning a date type, or a number.\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TODAY\": {\r\n            \"d\": \"Returns the current date as a date value.\",\r\n            \"a\": \"Current date as a date value.\",\r\n            \"p\": []\r\n        },\r\n        \"MONTH\": {\r\n            \"d\": \"Returns the month of the year a specific date falls in, in numeric format.\",\r\n            \"a\": \"Month of the year a specific date falls in.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"date\",\r\n                    \"detail\": \"The date from which to extract the month.\"\r\n                }\r\n            ]\r\n        },\r\n        \"EFFECT\": {\r\n            \"d\": \"Calculates the annual effective interest rate given the nominal rate and number of compounding periods per year.\",\r\n            \"a\": \"Annual effective interest rate.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"nominal_rate\",\r\n                    \"detail\": \"The nominal interest rate per year.\"\r\n                },\r\n                {\r\n                    \"name\": \"periods_per_year\",\r\n                    \"detail\": \"The number of compounding periods per year.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DOLLAR\": {\r\n            \"d\": \"Formats a number into the currency specific to your spreadsheet locale.\",\r\n            \"a\": \"Formats a number as currency specific to your spreadsheet locale.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"The value to be formatted.\"\r\n                },\r\n                {\r\n                    \"name\": \"number_of_places\",\r\n                    \"detail\": \"The number of decimal places to display.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DOLLARDE\": {\r\n            \"d\": \"Converts a price quotation given as a decimal fraction into a decimal value.\",\r\n            \"a\": \"Converts a decimal fraction to decimal value.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"fractional_price\",\r\n                    \"detail\": \"The price quotation given using fractional decimal conventions.\"\r\n                },\r\n                {\r\n                    \"name\": \"unit\",\r\n                    \"detail\": \"The units of the fraction, e.g. `8` for 1/8ths or `32` for 1/32nds.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DOLLARFR\": {\r\n            \"d\": \"Converts a price quotation given as a decimal value into a decimal fraction.\",\r\n            \"a\": \"Converts a decimal value to decimal fraction.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"decimal_price\",\r\n                    \"detail\": \"The price quotation given as a decimal value.\"\r\n                },\r\n                {\r\n                    \"name\": \"unit\",\r\n                    \"detail\": \"The units of the desired fraction, e.g. `8` for 1/8ths or `32` for 1/32nds.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DB\": {\r\n            \"d\": \"Calculates the depreciation of an asset for a specified period using the arithmetic declining balance method.\",\r\n            \"a\": \"Depreciation via declining balance method.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cost\",\r\n                    \"detail\": \"The initial cost of the asset.\"\r\n                },\r\n                {\r\n                    \"name\": \"salvage\",\r\n                    \"detail\": \"The value of the asset at the end of depreciation.\"\r\n                },\r\n                {\r\n                    \"name\": \"life\",\r\n                    \"detail\": \"The number of periods over which the asset is depreciated.\"\r\n                },\r\n                {\r\n                    \"name\": \"period\",\r\n                    \"detail\": \"The single period within `life` for which to calculate depreciation.\"\r\n                },\r\n                {\r\n                    \"name\": \"month\",\r\n                    \"detail\": \"The number of months in the first year of depreciation.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DDB\": {\r\n            \"d\": \"Calculates the depreciation of an asset for a specified period using the double-declining balance method.\",\r\n            \"a\": \"Depreciation via double-declining balance method.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cost\",\r\n                    \"detail\": \"The initial cost of the asset.\"\r\n                },\r\n                {\r\n                    \"name\": \"salvage\",\r\n                    \"detail\": \"The value of the asset at the end of depreciation.\"\r\n                },\r\n                {\r\n                    \"name\": \"life\",\r\n                    \"detail\": \"The number of periods over which the asset is depreciated.\"\r\n                },\r\n                {\r\n                    \"name\": \"period\",\r\n                    \"detail\": \"The single period within `life` for which to calculate depreciation.\"\r\n                },\r\n                {\r\n                    \"name\": \"factor\",\r\n                    \"detail\": \"The factor by which depreciation decreases.\"\r\n                }\r\n            ]\r\n        },\r\n        \"RATE\": {\r\n            \"d\": \"Calculates the interest rate of an annuity investment based on constant-amount periodic payments and the assumption of a constant interest rate.\",\r\n            \"a\": \"Interest rate of an annuity investment.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number_of_periods\",\r\n                    \"detail\": \"The number of payments to be made.\"\r\n                },\r\n                {\r\n                    \"name\": \"payment_per_period\",\r\n                    \"detail\": \"The amount per period to be paid.\"\r\n                },\r\n                {\r\n                    \"name\": \"present_value\",\r\n                    \"detail\": \"The current value of the annuity.\"\r\n                },\r\n                {\r\n                    \"name\": \"future_value\",\r\n                    \"detail\": \"The future value remaining after the final payment has been made.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_or_beginning\",\r\n                    \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\"\r\n                },\r\n                {\r\n                    \"name\": \"rate_guess\",\r\n                    \"detail\": \"An estimate for what the interest rate will be.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CUMPRINC\": {\r\n            \"d\": \"Calculates the cumulative principal paid over a range of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            \"a\": \"Cumulative principal paid over a set of periods.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The interest rate.\"\r\n                },\r\n                {\r\n                    \"name\": \"number_of_periods\",\r\n                    \"detail\": \"The number of payments to be made.\"\r\n                },\r\n                {\r\n                    \"name\": \"present_value\",\r\n                    \"detail\": \"The current value of the annuity.\"\r\n                },\r\n                {\r\n                    \"name\": \"first_period\",\r\n                    \"detail\": \"The number of the payment period to begin the cumulative calculation.\"\r\n                },\r\n                {\r\n                    \"name\": \"last_period\",\r\n                    \"detail\": \"The number of the payment period to end the cumulative calculation.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_or_beginning\",\r\n                    \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUPNUM\": {\r\n            \"d\": \"Calculates the number of coupons, or interest payments, between the settlement date and the maturity date of the investment.\",\r\n            \"a\": \"Number of coupons between settlement and maturity.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SYD\": {\r\n            \"d\": \"Calculates the depreciation of an asset for a specified period using the sum of years digits method.\",\r\n            \"a\": \"Depreciation via sum of years digits method.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cost\",\r\n                    \"detail\": \"The initial cost of the asset.\"\r\n                },\r\n                {\r\n                    \"name\": \"salvage\",\r\n                    \"detail\": \"The value of the asset at the end of depreciation.\"\r\n                },\r\n                {\r\n                    \"name\": \"life\",\r\n                    \"detail\": \"The number of periods over which the asset is depreciated.\"\r\n                },\r\n                {\r\n                    \"name\": \"period\",\r\n                    \"detail\": \"The single period within `life` for which to calculate depreciation.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TBILLEQ\": {\r\n            \"d\": \"Calculates the equivalent annualized rate of return of a US Treasury Bill based on discount rate.\",\r\n            \"a\": \"Equivalent rate of return for a Treasury bill.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"discount\",\r\n                    \"detail\": \"The discount rate of the bill at time of purchase.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TBILLYIELD\": {\r\n            \"d\": \"Calculates the yield of a US Treasury Bill based on price.\",\r\n            \"a\": \"The yield of a us treasury bill based on price.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"price\",\r\n                    \"detail\": \"The price at which the security is bought per 100 face value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TBILLPRICE\": {\r\n            \"d\": \"Calculates the price of a US Treasury Bill based on discount rate.\",\r\n            \"a\": \"Price of US treasury bill.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"discount\",\r\n                    \"detail\": \"The discount rate of the bill at time of purchase.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PV\": {\r\n            \"d\": \"Calculates the present value of an annuity investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            \"a\": \"Present value of an annuity investment.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The interest rate.\"\r\n                },\r\n                {\r\n                    \"name\": \"number_of_periods\",\r\n                    \"detail\": \"The number of payments to be made.\"\r\n                },\r\n                {\r\n                    \"name\": \"payment_amount\",\r\n                    \"detail\": \"The amount per period to be paid.\"\r\n                },\r\n                {\r\n                    \"name\": \"future_value\",\r\n                    \"detail\": \"The future value remaining after the final payment has been made.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_or_beginning\",\r\n                    \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ACCRINT\": {\r\n            \"d\": \"Calculates the accrued interest of a security that has periodic payments.\",\r\n            \"a\": \"Accrued interest of security with periodic payments.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"issue\",\r\n                    \"detail\": \"The date the security was initially issued.\"\r\n                },\r\n                {\r\n                    \"name\": \"first_payment\",\r\n                    \"detail\": \"The first date interest will be paid.\"\r\n                },\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The annualized rate of interest.\"\r\n                },\r\n                {\r\n                    \"name\": \"redemption\",\r\n                    \"detail\": \"The redemption amount per 100 face value, or par.\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                },\r\n                {\r\n                    \"name\": \"calc_method\",\r\n                    \"detail\": \"[Optional-defaults to TRUE()] - A logical value that specifies the method used to calculate the total accrued interest when the settlement date is later than the first interest accrual date. \\n\\nIf the value is TRUE, the total accrued interest from the issue date to the settlement date is returned. \\n\\nIf the value is FALSE, return the accrued interest from the first interest accrual date to the settlement date.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ACCRINTM\": {\r\n            \"d\": \"Calculates the accrued interest of a security that pays interest at maturity.\",\r\n            \"a\": \"Accrued interest of security paying at maturity.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"issue\",\r\n                    \"detail\": \"The date the security was initially issued.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity date of the security.\"\r\n                },\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The annualized rate of interest.\"\r\n                },\r\n                {\r\n                    \"name\": \"redemption\",\r\n                    \"detail\": \"The redemption amount per 100 face value, or par.\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUPDAYBS\": {\r\n            \"d\": \"Calculates the number of days from the first coupon, or interest payment, until settlement.\",\r\n            \"a\": \"Number of days from first coupon to settlement.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUPDAYS\": {\r\n            \"d\": \"Calculates the number of days in the coupon, or interest payment, period that contains the specified settlement date.\",\r\n            \"a\": \"Days in coupon period containing settlement date.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUPDAYSNC\": {\r\n            \"d\": \"Calculates the number of days from the settlement date until the next coupon, or interest payment.\",\r\n            \"a\": \"Days from settlement until next coupon.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUPNCD\": {\r\n            \"d\": \"Calculates next coupon, or interest payment, date after the settlement date.\",\r\n            \"a\": \"Next coupon date after the settlement date.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUPPCD\": {\r\n            \"d\": \"Calculates last coupon, or interest payment, date before the settlement date.\",\r\n            \"a\": \"Last coupon date before settlement date.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"FV\": {\r\n            \"d\": \"Calculates the future value of an annuity investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            \"a\": \"Future value of an annuity investment.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The interest rate.\"\r\n                },\r\n                {\r\n                    \"name\": \"number_of_periods\",\r\n                    \"detail\": \"The number of payments to be made.\"\r\n                },\r\n                {\r\n                    \"name\": \"payment_amount\",\r\n                    \"detail\": \"The amount per period to be paid.\"\r\n                },\r\n                {\r\n                    \"name\": \"present_value\",\r\n                    \"detail\": \"The current value of the annuity.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_or_beginning\",\r\n                    \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\"\r\n                }\r\n            ]\r\n        },\r\n        \"FVSCHEDULE\": {\r\n            \"d\": \"Calculates the future value of some principal based on a specified series of potentially varying interest rates.\",\r\n            \"a\": \"Future value of principal from series of rates.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"principal\",\r\n                    \"detail\": \"The amount of initial capital or value to compound against.\"\r\n                },\r\n                {\r\n                    \"name\": \"rate_schedule\",\r\n                    \"detail\": \"A series of interest rates to compound against the `principal`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"YIELD\": {\r\n            \"d\": \"Calculates the annual yield of a security paying periodic interest, such as a US Treasury Bond, based on price.\",\r\n            \"a\": \"Annual yield of a security paying periodic interest.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The annualized rate of interest.\"\r\n                },\r\n                {\r\n                    \"name\": \"price\",\r\n                    \"detail\": \"The price at which the security is bought per 100 face value.\"\r\n                },\r\n                {\r\n                    \"name\": \"redemption\",\r\n                    \"detail\": \"The redemption amount per 100 face value, or par.\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"YIELDDISC\": {\r\n            \"d\": \"Calculates the annual yield of a discount (non-interest-bearing) security, based on price.\",\r\n            \"a\": \"Annual yield of a discount security.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"price\",\r\n                    \"detail\": \"The price at which the security is bought per 100 face value.\"\r\n                },\r\n                {\r\n                    \"name\": \"redemption\",\r\n                    \"detail\": \"The redemption amount per 100 face value, or par.\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"NOMINAL\": {\r\n            \"d\": \"Calculates the annual nominal interest rate given the effective rate and number of compounding periods per year.\",\r\n            \"a\": \"Annual nominal interest rate.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"effective_rate\",\r\n                    \"detail\": \"The effective interest rate per year.\"\r\n                },\r\n                {\r\n                    \"name\": \"periods_per_year\",\r\n                    \"detail\": \"The number of compounding periods per year.\"\r\n                }\r\n            ]\r\n        },\r\n        \"XIRR\": {\r\n            \"d\": \"Calculates the internal rate of return of an investment based on a specified series of potentially irregularly spaced cash flows.\",\r\n            \"a\": \"Internal rate of return given non-periodic cashflows.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cashflow_amounts\",\r\n                    \"detail\": \"An array or range containing the income or payments associated with the investment.\"\r\n                },\r\n                {\r\n                    \"name\": \"cashflow_dates\",\r\n                    \"detail\": \"An array or range with dates corresponding to the cash flows in `cashflow_amounts`.\"\r\n                },\r\n                {\r\n                    \"name\": \"rate_guess\",\r\n                    \"detail\": \"An estimate for what the internal rate of return will be.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MIRR\": {\r\n            \"d\": \"Calculates the modified internal rate of return on an investment based on a series of periodic cash flows and the difference between the interest rate paid on financing versus the return received on reinvested income.\",\r\n            \"a\": \"Modified internal rate of return.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cashflow_amounts\",\r\n                    \"detail\": \"An array or range containing the income or payments associated with the investment.\"\r\n                },\r\n                {\r\n                    \"name\": \"financing_rate\",\r\n                    \"detail\": \"The interest rate paid on funds invested.\"\r\n                },\r\n                {\r\n                    \"name\": \"reinvestment_return_rate\",\r\n                    \"detail\": \"The return (as a percentage) earned on reinvestment of income received from the investment.\"\r\n                }\r\n            ]\r\n        },\r\n        \"IRR\": {\r\n            \"d\": \"Calculates the internal rate of return on an investment based on a series of periodic cash flows.\",\r\n            \"a\": \"Internal rate of return given periodic cashflows.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cashflow_amounts\",\r\n                    \"detail\": \"An array or range containing the income or payments associated with the investment.\"\r\n                },\r\n                {\r\n                    \"name\": \"rate_guess\",\r\n                    \"detail\": \"An estimate for what the internal rate of return will be.\"\r\n                }\r\n            ]\r\n        },\r\n        \"NPV\": {\r\n            \"d\": \"Calculates the net present value of an investment based on a series of periodic cash flows and a discount rate.\",\r\n            \"a\": \"The net present value of an investment based on a series of periodic cash flows and a discount rate.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"discount\",\r\n                    \"detail\": \"The discount rate of the investment over one period.\"\r\n                },\r\n                {\r\n                    \"name\": \"cashflow1\",\r\n                    \"detail\": \"The first future cash flow.\"\r\n                },\r\n                {\r\n                    \"name\": \"cashflow2\",\r\n                    \"detail\": \"Additional future cash flows.\"\r\n                }\r\n            ]\r\n        },\r\n        \"XNPV\": {\r\n            \"d\": \"Calculates the net present value of an investment based on a specified series of potentially irregularly spaced cash flows and a discount rate.\",\r\n            \"a\": \"Net present value given non-periodic cashflows.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"discount\",\r\n                    \"detail\": \"The discount rate of the investment over one period.\"\r\n                },\r\n                {\r\n                    \"name\": \"cashflow_amounts\",\r\n                    \"detail\": \"A range of cells containing the income or payments associated with the investment.\"\r\n                },\r\n                {\r\n                    \"name\": \"cashflow_dates\",\r\n                    \"detail\": \"A range of cells with dates corresponding to the cash flows in `cashflow_amounts`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CUMIPMT\": {\r\n            \"d\": \"Calculates the cumulative interest over a range of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            \"a\": \"Cumulative interest paid over a set of periods.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The interest rate.\"\r\n                },\r\n                {\r\n                    \"name\": \"number_of_periods\",\r\n                    \"detail\": \"The number of payments to be made.\"\r\n                },\r\n                {\r\n                    \"name\": \"present_value\",\r\n                    \"detail\": \"The current value of the annuity.\"\r\n                },\r\n                {\r\n                    \"name\": \"first_period\",\r\n                    \"detail\": \"The number of the payment period to begin the cumulative calculation.\"\r\n                },\r\n                {\r\n                    \"name\": \"last_period\",\r\n                    \"detail\": \"The number of the payment period to end the cumulative calculation.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_or_beginning\",\r\n                    \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PMT\": {\r\n            \"d\": \"Calculates the periodic payment for an annuity investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            \"a\": \"Periodic payment for an annuity investment.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The interest rate.\"\r\n                },\r\n                {\r\n                    \"name\": \"number_of_periods\",\r\n                    \"detail\": \"The number of payments to be made.\"\r\n                },\r\n                {\r\n                    \"name\": \"present_value\",\r\n                    \"detail\": \"The current value of the annuity.\"\r\n                },\r\n                {\r\n                    \"name\": \"future_value\",\r\n                    \"detail\": \"The future value remaining after the final payment has been made.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_or_beginning\",\r\n                    \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\"\r\n                }\r\n            ]\r\n        },\r\n        \"IPMT\": {\r\n            \"d\": \"Calculates the payment on interest for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            \"a\": \"Payment on interest for an investment.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The interest rate.\"\r\n                },\r\n                {\r\n                    \"name\": \"period\",\r\n                    \"detail\": \"The amortization period, in terms of number of periods.\"\r\n                },\r\n                {\r\n                    \"name\": \"number_of_periods\",\r\n                    \"detail\": \"The number of payments to be made.\"\r\n                },\r\n                {\r\n                    \"name\": \"present_value\",\r\n                    \"detail\": \"The current value of the annuity.\"\r\n                },\r\n                {\r\n                    \"name\": \"future_value\",\r\n                    \"detail\": \"The future value remaining after the final payment has been made.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_or_beginning\",\r\n                    \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PPMT\": {\r\n            \"d\": \"Calculates the payment on the principal of an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            \"a\": \"Payment on the principal of an investment.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The interest rate.\"\r\n                },\r\n                {\r\n                    \"name\": \"period\",\r\n                    \"detail\": \"The amortization period, in terms of number of periods.\"\r\n                },\r\n                {\r\n                    \"name\": \"number_of_periods\",\r\n                    \"detail\": \"The number of payments to be made.\"\r\n                },\r\n                {\r\n                    \"name\": \"present_value\",\r\n                    \"detail\": \"The current value of the annuity.\"\r\n                },\r\n                {\r\n                    \"name\": \"future_value\",\r\n                    \"detail\": \"The future value remaining after the final payment has been made.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_or_beginning\",\r\n                    \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\"\r\n                }\r\n            ]\r\n        },\r\n        \"INTRATE\": {\r\n            \"d\": \"Calculates the effective interest rate generated when an investment is purchased at one price and sold at another with no interest or dividends generated by the investment itself.\",\r\n            \"a\": \"Calculates effective interest rate.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"buy_date\",\r\n                    \"detail\": \"The date of purchase of the investment.\"\r\n                },\r\n                {\r\n                    \"name\": \"sell_date\",\r\n                    \"detail\": \"The date of sale of the investment.\"\r\n                },\r\n                {\r\n                    \"name\": \"buy_price\",\r\n                    \"detail\": \"The price at which the investment was purchased.\"\r\n                },\r\n                {\r\n                    \"name\": \"sell_price\",\r\n                    \"detail\": \"The price at which the investment was sold.\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PRICE\": {\r\n            \"d\": \"Calculates the price of a security paying periodic interest, such as a US Treasury Bond, based on expected yield.\",\r\n            \"a\": \"Price of a security paying periodic interest.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The annualized rate of interest.\"\r\n                },\r\n                {\r\n                    \"name\": \"yield\",\r\n                    \"detail\": \"The expected annual yield of the security.\"\r\n                },\r\n                {\r\n                    \"name\": \"redemption\",\r\n                    \"detail\": \"The redemption amount per 100 face value, or par.\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PRICEDISC\": {\r\n            \"d\": \"Calculates the price of a discount (non-interest-bearing) security, based on expected yield.\",\r\n            \"a\": \"Price of a discount security.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"discount\",\r\n                    \"detail\": \"The discount rate of the security at time of purchase.\"\r\n                },\r\n                {\r\n                    \"name\": \"redemption\",\r\n                    \"detail\": \"The redemption amount per 100 face value, or par.\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PRICEMAT\": {\r\n            \"d\": \"Calculates the price of a security paying interest at maturity, based on expected yield.\",\r\n            \"a\": \"Price of security paying interest at maturity.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"issue\",\r\n                    \"detail\": \"The date the security was initially issued.\"\r\n                },\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The annualized rate of interest.\"\r\n                },\r\n                {\r\n                    \"name\": \"yield\",\r\n                    \"detail\": \"The expected annual yield of the security.\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"RECEIVED\": {\r\n            \"d\": \"Calculates the amount received at maturity for an investment in fixed-income securities purchased on a given date.\",\r\n            \"a\": \"Amount received at maturity for a security.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"investment\",\r\n                    \"detail\": \"The amount invested (irrespective of face value of each security).\"\r\n                },\r\n                {\r\n                    \"name\": \"discount\",\r\n                    \"detail\": \"The discount rate of the security invested in.\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DISC\": {\r\n            \"d\": \"Calculates the discount rate of a security based on price.\",\r\n            \"a\": \"The discount rate of a security based on price.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"price\",\r\n                    \"detail\": \"The price at which the security is bought per 100 face value.\"\r\n                },\r\n                {\r\n                    \"name\": \"redemption\",\r\n                    \"detail\": \"The redemption amount per 100 face value, or par.\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"NPER\": {\r\n            \"d\": \"Calculates the number of payment periods for an investment based on constant-amount periodic payments and a constant interest rate.\",\r\n            \"a\": \"Number of payment periods for an investment.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The interest rate.\"\r\n                },\r\n                {\r\n                    \"name\": \"payment_amount\",\r\n                    \"detail\": \"The amount of each payment made.\"\r\n                },\r\n                {\r\n                    \"name\": \"present_value\",\r\n                    \"detail\": \"The current value of the annuity.\"\r\n                },\r\n                {\r\n                    \"name\": \"future_value\",\r\n                    \"detail\": \"The future value remaining after the final payment has been made.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_or_beginning\",\r\n                    \"detail\": \"Whether payments are due at the end (`0`) or beginning (`1`) of each period.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SLN\": {\r\n            \"d\": \"Calculates the depreciation of an asset for one period using the straight-line method.\",\r\n            \"a\": \"Depreciation of asset using the straight-line method.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cost\",\r\n                    \"detail\": \"The initial cost of the asset.\"\r\n                },\r\n                {\r\n                    \"name\": \"salvage\",\r\n                    \"detail\": \"The value of the asset at the end of depreciation.\"\r\n                },\r\n                {\r\n                    \"name\": \"life\",\r\n                    \"detail\": \"The number of periods over which the asset is depreciated.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DURATION\": {\r\n            \"d\": \"Calculates the number of compounding periods required for an investment of a specified present value appreciating at a given rate to reach a target value.\",\r\n            \"a\": \"Number of periods for an investment to reach a value.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The annualized rate of interest.\"\r\n                },\r\n                {\r\n                    \"name\": \"yield\",\r\n                    \"detail\": \"The expected annual yield of the security.\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MDURATION\": {\r\n            \"d\": \"Calculates the modified Macaulay duration of a security paying periodic interest, such as a US Treasury Bond, based on expected yield.\",\r\n            \"a\": \"Modified Macaulay duration.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"The settlement date of the security, the date after issuance when the security is delivered to the buyer.\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"The maturity or end date of the security, when it can be redeemed at face, or par value.\"\r\n                },\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"The annualized rate of interest.\"\r\n                },\r\n                {\r\n                    \"name\": \"yield\",\r\n                    \"detail\": \"The expected annual yield of the security.\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"The number of interest or coupon payments per year (1, 2, or 4).\"\r\n                },\r\n                {\r\n                    \"name\": \"day_count_convention\",\r\n                    \"detail\": \"An indicator of what day count method to use.\"\r\n                }\r\n            ]\r\n        },\r\n        \"BIN2DEC\": {\r\n            \"d\": \"Converts a signed binary number to decimal format.\",\r\n            \"a\": \"Converts a signed binary number to decimal format.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"signed_binary_number\",\r\n                    \"detail\": \"The signed 10-bit binary value to be converted to decimal, provided as a string.\"\r\n                }\r\n            ]\r\n        },\r\n        \"BIN2HEX\": {\r\n            \"d\": \"Converts a signed binary number to signed hexadecimal format.\",\r\n            \"a\": \"Converts a binary number to hexadecimal.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"signed_binary_number\",\r\n                    \"detail\": \"The signed 10-bit binary value to be converted to signed hexademical, provided as a string.\"\r\n                },\r\n                {\r\n                    \"name\": \"significant_digits\",\r\n                    \"detail\": \"The number of significant digits to ensure in the result.\"\r\n                }\r\n            ]\r\n        },\r\n        \"BIN2OCT\": {\r\n            \"d\": \"Converts a signed binary number to signed octal format.\",\r\n            \"a\": \"Converts a binary number to octal.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"signed_binary_number\",\r\n                    \"detail\": \"The signed 10-bit binary value to be converted to signed octal, provided as a string.\"\r\n                },\r\n                {\r\n                    \"name\": \"significant_digits\",\r\n                    \"detail\": \"The number of significant digits to ensure in the result.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DEC2BIN\": {\r\n            \"d\": \"Converts a decimal number to signed binary format.\",\r\n            \"a\": \"Converts a decimal number to signed binary format.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"decimal_number\",\r\n                    \"detail\": \"The decimal value to be converted to signed binary, provided as a string.\"\r\n                },\r\n                {\r\n                    \"name\": \"significant_digits\",\r\n                    \"detail\": \"The number of significant digits to ensure in the result.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DEC2HEX\": {\r\n            \"d\": \"Converts a decimal number to signed hexadecimal format.\",\r\n            \"a\": \"Converts a decimal number to hexadecimal.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"decimal_number\",\r\n                    \"detail\": \"The decimal value to be converted to signed hexadecimal, provided as a string.\"\r\n                },\r\n                {\r\n                    \"name\": \"significant_digits\",\r\n                    \"detail\": \"The number of significant digits to ensure in the result.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DEC2OCT\": {\r\n            \"d\": \"Converts a decimal number to signed octal format.\",\r\n            \"a\": \"Converts a decimal number to signed octal format.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"decimal_number\",\r\n                    \"detail\": \"The decimal value to be converted to signed octal, provided as a string.\"\r\n                },\r\n                {\r\n                    \"name\": \"significant_digits\",\r\n                    \"detail\": \"The number of significant digits to ensure in the result.\"\r\n                }\r\n            ]\r\n        },\r\n        \"HEX2BIN\": {\r\n            \"d\": \"Converts a signed hexadecimal number to signed binary format.\",\r\n            \"a\": \"Converts a hexadecimal number to binary.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"signed_hexadecimal_number\",\r\n                    \"detail\": \"The signed 40-bit hexadecimal value to be converted to signed binary, provided as a string.\"\r\n                },\r\n                {\r\n                    \"name\": \"significant_digits\",\r\n                    \"detail\": \"The number of significant digits to ensure in the result.\"\r\n                }\r\n            ]\r\n        },\r\n        \"HEX2DEC\": {\r\n            \"d\": \"Converts a signed hexadecimal number to decimal format.\",\r\n            \"a\": \"Converts a hexadecimal number to decimal.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"signed_hexadecimal_number\",\r\n                    \"detail\": \"The signed 40-bit hexadecimal value to be converted to decimal, provided as a string.\"\r\n                }\r\n            ]\r\n        },\r\n        \"HEX2OCT\": {\r\n            \"d\": \"Converts a signed hexadecimal number to signed octal format.\",\r\n            \"a\": \"Converts a hexadecimal number to octal.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"signed_hexadecimal_number\",\r\n                    \"detail\": \"The signed 40-bit hexadecimal value to be converted to signed octal, provided as a string.\"\r\n                },\r\n                {\r\n                    \"name\": \"significant_digits\",\r\n                    \"detail\": \"The number of significant digits to ensure in the result.\"\r\n                }\r\n            ]\r\n        },\r\n        \"OCT2BIN\": {\r\n            \"d\": \"Converts a signed octal number to signed binary format.\",\r\n            \"a\": \"Converts an octal number to binary.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"signed_octal_number\",\r\n                    \"detail\": \"The signed 30-bit octal value to be converted to signed binary, provided as a string.\"\r\n                },\r\n                {\r\n                    \"name\": \"significant_digits\",\r\n                    \"detail\": \"The number of significant digits to ensure in the result.\"\r\n                }\r\n            ]\r\n        },\r\n        \"OCT2DEC\": {\r\n            \"d\": \"Converts a signed octal number to decimal format.\",\r\n            \"a\": \"Converts a signed octal number to decimal format.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"signed_octal_number\",\r\n                    \"detail\": \"The signed 30-bit octal value to be converted to decimal, provided as a string.\"\r\n                }\r\n            ]\r\n        },\r\n        \"OCT2HEX\": {\r\n            \"d\": \"Converts a signed octal number to signed hexadecimal format.\",\r\n            \"a\": \"Converts an octal number to hexadecimal.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"signed_octal_number\",\r\n                    \"detail\": \"The signed 30-bit octal value to be converted to signed hexadecimal, provided as a string.\"\r\n                },\r\n                {\r\n                    \"name\": \"significant_digits\",\r\n                    \"detail\": \"The number of significant digits to ensure in the result.\"\r\n                }\r\n            ]\r\n        },\r\n        \"COMPLEX\": {\r\n            \"d\": \"Creates a complex number given real and imaginary coefficients.\",\r\n            \"a\": \"Creates a complex number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"real_part\",\r\n                    \"detail\": \"The real coefficient.\"\r\n                },\r\n                {\r\n                    \"name\": \"imaginary_part\",\r\n                    \"detail\": \"The imaginary coefficient.\"\r\n                },\r\n                {\r\n                    \"name\": \"suffix\",\r\n                    \"detail\": \"The suffix for the imaginary coefficient, can only be 'i' or 'j'. If omitted, 'i' will be used.\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMREAL\": {\r\n            \"d\": \"Returns the real coefficient of a complex number.\",\r\n            \"a\": \"The real coefficient of a complex number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"complex_number\",\r\n                    \"detail\": \"The complex number, in the a+bi or a+bj format.\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMAGINARY\": {\r\n            \"d\": \"Returns the imaginary coefficient of a complex number.\",\r\n            \"a\": \"The imaginary coefficient of a complex number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"complex_number\",\r\n                    \"detail\": \"The complex number, in the a+bi or a+bj format.\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMCONJUGATE\": {\r\n            \"d\": \"Returns the complex conjugate of a number.\",\r\n            \"a\": \"The complex conjugate of a number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"The complex number to calculate the conjugate for.\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMABS\": {\r\n            \"d\": \"Returns absolute value (or modulus) of a complex number.\",\r\n            \"a\": \"The absolute value of a complex number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"The complex number to calculate the absolute value of.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DELTA\": {\r\n            \"d\": \"Compare two numeric values, returning 1 if they're equal.\",\r\n            \"a\": \"Compare two numeric values.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number1\",\r\n                    \"detail\": \"The first number to compare.\"\r\n                },\r\n                {\r\n                    \"name\": \"number2\",\r\n                    \"detail\": \"The second number to compare.\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMSUM\": {\r\n            \"d\": \"Returns the sum of a series of complex numbers.\",\r\n            \"a\": \"Sum of a series of complex numbers.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first complex number or range to add together.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"Additional complex numbers or ranges to add to `value1`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMSUB\": {\r\n            \"d\": \"Returns the difference between two complex numbers.\",\r\n            \"a\": \"The difference between two complex numbers.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"first_number\",\r\n                    \"detail\": \"The complex number to subtract second_number from.\"\r\n                },\r\n                {\r\n                    \"name\": \"second_number\",\r\n                    \"detail\": \"The complex number to subtract from first_number.\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMPRODUCT\": {\r\n            \"d\": \"Returns the result of multiplying a series of complex numbers together.\",\r\n            \"a\": \"Result of multiplying a series of complex numbers together.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"factor1\",\r\n                    \"detail\": \"The first number or range to calculate for the product.\"\r\n                },\r\n                {\r\n                    \"name\": \"factor2\",\r\n                    \"detail\": \"Additional complex numbers or ranges to calculate for the product.\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMDIV\": {\r\n            \"d\": \"Returns one complex number divided by another.\",\r\n            \"a\": \"One complex number divided by another.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"dividend\",\r\n                    \"detail\": \"The complex number to be divided.\"\r\n                },\r\n                {\r\n                    \"name\": \"divisor\",\r\n                    \"detail\": \"The complex number to divide by.\"\r\n                }\r\n            ]\r\n        },\r\n        \"NOT\": {\r\n            \"d\": \"Returns the opposite of a logical value - `NOT(TRUE)` returns `FALSE`; `NOT(FALSE)` returns `TRUE`.\",\r\n            \"a\": \"Returns opposite of provided logical value.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"logical_expression\",\r\n                    \"detail\": \"An expression or reference to a cell holding an expression that represents some logical value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TRUE\": {\r\n            \"d\": \"Returns the logical value `TRUE`.\",\r\n            \"a\": \"Logical value `true`.\",\r\n            \"p\": []\r\n        },\r\n        \"FALSE\": {\r\n            \"d\": \"Returns the logical value `FALSE`.\",\r\n            \"a\": \"Logical value `false`.\",\r\n            \"p\": []\r\n        },\r\n        \"AND\": {\r\n            \"d\": \"Returns true if all of the provided arguments are logically true, and false if any of the provided arguments are logically false.\",\r\n            \"a\": \"Logical `and` operator.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"logical_expression1\",\r\n                    \"detail\": \"An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`, or an expression that can be coerced to a logical value.\"\r\n                },\r\n                {\r\n                    \"name\": \"logical_expression2\",\r\n                    \"detail\": \"More expressions that represent logical values.\"\r\n                }\r\n            ]\r\n        },\r\n        \"IFERROR\": {\r\n            \"d\": \"Returns the first argument if it is not an error value, otherwise returns the second argument if present, or a blank if the second argument is absent.\",\r\n            \"a\": \"Value if it is not an error, otherwise 2nd argument.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to return if `value` itself is not an error.\"\r\n                },\r\n                {\r\n                    \"name\": \"value_if_error\",\r\n                    \"detail\": \"The value the function returns if `value` is an error.\"\r\n                }\r\n            ]\r\n        },\r\n        \"IF\": {\r\n            \"d\": \"Returns one value if a logical expression is `TRUE` and another if it is `FALSE`.\",\r\n            \"a\": \"Returns value depending on logical expression.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"logical_expression\",\r\n                    \"detail\": \"An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`.\"\r\n                },\r\n                {\r\n                    \"name\": \"value_if_true\",\r\n                    \"detail\": \"The value the function returns if `logical_expression` is `TRUE`.\"\r\n                },\r\n                {\r\n                    \"name\": \"value_if_false\",\r\n                    \"detail\": \"The value the function returns if `logical_expression` is `FALSE`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"OR\": {\r\n            \"d\": \"Returns true if any of the provided arguments are logically true, and false if all of the provided arguments are logically false.\",\r\n            \"a\": \"Logical `or` operator.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"logical_expression1\",\r\n                    \"detail\": \"An expression or reference to a cell containing an expression that represents some logical value, i.e. `TRUE` or `FALSE`, or an expression that can be coerced to a logical value.\"\r\n                },\r\n                {\r\n                    \"name\": \"logical_expression2\",\r\n                    \"detail\": \"More expressions that evaluate to logical values.\"\r\n                }\r\n            ]\r\n        },\r\n        \"NE\": {\r\n            \"d\": \"Returns `TRUE` if two specified values are not equal and `FALSE` otherwise. Equivalent to the `!=` operator.\",\r\n            \"a\": \"Not equal.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"The value to test against `value1` for inequality.\"\r\n                }\r\n            ]\r\n        },\r\n        \"EQ\": {\r\n            \"d\": \"Returns `TRUE` if two specified values are equal and `FALSE` otherwise. Equivalent to the `==` operator.\",\r\n            \"a\": \"Equal.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first value.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"The value to test against `value1` for equality.\"\r\n                }\r\n            ]\r\n        },\r\n        \"GT\": {\r\n            \"d\": \"Returns `TRUE` if the first argument is strictly greater than the second, and `FALSE` otherwise. Equivalent to the `>` operator.\",\r\n            \"a\": \"Strictly greater than.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The value to test as being greater than `value2`.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"The second value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"GTE\": {\r\n            \"d\": \"Returns `TRUE` if the first argument is greater than or equal to the second, and `FALSE` otherwise. Equivalent to the `>=` operator.\",\r\n            \"a\": \"Greater than or equal to.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The value to test as being greater than or equal to `value2`.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"The second value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LT\": {\r\n            \"d\": \"Returns `TRUE` if the first argument is strictly less than the second, and `FALSE` otherwise. Equivalent to the `<` operator.\",\r\n            \"a\": \"Less than.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The value to test as being less than `value2`.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"The second value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LTE\": {\r\n            \"d\": \"Returns `TRUE` if the first argument is less than or equal to the second, and `FALSE` otherwise. Equivalent to the `<=` operator.\",\r\n            \"a\": \"Less than or equal to.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The value to test as being less than or equal to `value2`.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"The second value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ADD\": {\r\n            \"d\": \"Returns the sum of two numbers. Equivalent to the `+` operator.\",\r\n            \"a\": \"Sum of two numbers\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The first addend.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"The second addend.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MINUS\": {\r\n            \"d\": \"Returns the difference of two numbers. Equivalent to the `-` operator.\",\r\n            \"a\": \"Difference of two numbers\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The minuend, or number to be subtracted from.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"The subtrahend, or number to subtract from `value1`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MULTIPLY\": {\r\n            \"d\": \"Returns the product of two numbers. Equivalent to the `*` operator.\",\r\n            \"a\": \"Product of two numbers\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"factor1\",\r\n                    \"detail\": \"The first multiplicand.\"\r\n                },\r\n                {\r\n                    \"name\": \"factor2\",\r\n                    \"detail\": \"The second multiplicand.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DIVIDE\": {\r\n            \"d\": \"Returns one number divided by another. Equivalent to the `/` operator.\",\r\n            \"a\": \"One number divided by another\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"dividend\",\r\n                    \"detail\": \"The number to be divided.\"\r\n                },\r\n                {\r\n                    \"name\": \"divisor\",\r\n                    \"detail\": \"The number to divide by.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CONCAT\": {\r\n            \"d\": \"Returns the concatenation of two values. Equivalent to the `&` operator.\",\r\n            \"a\": \"Concatenation of two values\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"The value to which `value2` will be appended.\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"The value to append to `value1`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"UNARY_PERCENT\": {\r\n            \"d\": \"Returns a value interpreted as a percentage; that is, `UNARY_PERCENT(100)` equals `1`.\",\r\n            \"a\": \"Value interpreted as a percentage.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"percentage\",\r\n                    \"detail\": \"The value to interpret as a percentage.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CONCATENATE\": {\r\n            \"d\": \"Appends strings to one another.\",\r\n            \"a\": \"Appends strings to one another.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"string1\",\r\n                    \"detail\": \"The initial string.\"\r\n                },\r\n                {\r\n                    \"name\": \"string2\",\r\n                    \"detail\": \"More strings to append in sequence.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CODE\": {\r\n            \"d\": \"Returns the numeric Unicode map value of the first character in the string provided.\",\r\n            \"a\": \"Numeric unicode map value of character.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"string\",\r\n                    \"detail\": \"The string whose first character's Unicode map value will be returned.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CHAR\": {\r\n            \"d\": \"Convert a number into a character according to the current Unicode table.\",\r\n            \"a\": \"Gets character associated with number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"table_number\",\r\n                    \"detail\": \"The number of the character to look up from the current Unicode table in decimal format.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ARABIC\": {\r\n            \"d\": \"Computes the value of a Roman numeral.\",\r\n            \"a\": \"Computes the value of a roman numeral.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"roman_numeral\",\r\n                    \"detail\": \"The Roman numeral to format, whose value must be between 1 and 3999, inclusive.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ROMAN\": {\r\n            \"d\": \"Formats a number in Roman numerals.\",\r\n            \"a\": \"Formats a number in Roman numerals.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"The number to format, between 1 and 3999, inclusive.\"\r\n                }\r\n            ]\r\n        },\r\n        \"REGEXEXTRACT\": {\r\n            \"d\": \"Extracts matching substrings according to a regular expression.\",\r\n            \"a\": \"Extracts matching substrings with regular expression.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"The input text.\"\r\n                },\r\n                {\r\n                    \"name\": \"regular_expression\",\r\n                    \"detail\": \"The first part of `text` that matches this expression will be returned.\"\r\n                }\r\n            ]\r\n        },\r\n        \"REGEXMATCH\": {\r\n            \"d\": \"Whether a piece of text matches a regular expression.\",\r\n            \"a\": \"Whether a piece of text matches regular expression.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"The text to be tested against the regular expression.\"\r\n                },\r\n                {\r\n                    \"name\": \"regular_expression\",\r\n                    \"detail\": \"The regular expression to test the text against.\"\r\n                }\r\n            ]\r\n        },\r\n        \"REGEXREPLACE\": {\r\n            \"d\": \"Replaces part of a text string with a different text string using regular expressions.\",\r\n            \"a\": \"Replaces text with regular expressions.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"The text, a part of which will be replaced.\"\r\n                },\r\n                {\r\n                    \"name\": \"regular_expression\",\r\n                    \"detail\": \"The regular expression.  All matching instances in `text` will be replaced.\"\r\n                },\r\n                {\r\n                    \"name\": \"replacement\",\r\n                    \"detail\": \"The text which will be inserted into the original text.\"\r\n                }\r\n            ]\r\n        },\r\n        \"T\": {\r\n            \"d\": \"Returns string arguments as text, or the empty string if the value is not text.\",\r\n            \"a\": \"String arguments as text.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The argument to be converted to text.\"\r\n                }\r\n            ]\r\n        },\r\n        \"FIXED\": {\r\n            \"d\": \"Formats a number with a fixed number of decimal places.\",\r\n            \"a\": \"Formats number with fixed number of decimal places.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"The number to format.\"\r\n                },\r\n                {\r\n                    \"name\": \"number_of_places\",\r\n                    \"detail\": \"The number of decimal places to display in the result.\"\r\n                },\r\n                {\r\n                    \"name\": \"suppress_separator\",\r\n                    \"detail\": \"Whether or not to suppress the thousands separator used in some locales (e.g. `1,000` becomes `1000`). Separators will be present if this value is 0 or omitted, and absent otherwise.\"\r\n                }\r\n            ]\r\n        },\r\n        \"FIND\": {\r\n            \"d\": \"Returns the position at which a string is first found within text where the capitalization of letters matters. Returns `#VALUE!` if the string is not found.\",\r\n            \"a\": \"First position of string found in text, case-sensitive.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"search_for\",\r\n                    \"detail\": \"The string to look for within `text_to_search`.\"\r\n                },\r\n                {\r\n                    \"name\": \"text_to_search\",\r\n                    \"detail\": \"The text to search for the first occurrence of `search_for`.\"\r\n                },\r\n                {\r\n                    \"name\": \"starting_at\",\r\n                    \"detail\": \"The character within `text_to_search` at which to start the search.\"\r\n                }\r\n            ]\r\n        },\r\n        \"FINDB\": {\r\n            \"d\": \"Returns the position at which a string is first found within text counting each double-character as 2.\",\r\n            \"a\": \"Position at which a string is first found within text (binary).\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"search_for\",\r\n                    \"detail\": \"The string to look for within `text_to_search`.\"\r\n                },\r\n                {\r\n                    \"name\": \"text_to_search\",\r\n                    \"detail\": \"The text to search for the first occurrence of `search_for`.\"\r\n                },\r\n                {\r\n                    \"name\": \"starting_at\",\r\n                    \"detail\": \"The character within `text_to_search` at which to start the search.\"\r\n                }\r\n            ]\r\n        },\r\n        \"JOIN\": {\r\n            \"d\": \"Concatenates the elements of one or more one-dimensional arrays using a specified delimiter.\",\r\n            \"a\": \"Concatenates elements of arrays with delimiter.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"delimiter\",\r\n                    \"detail\": \"The character or string to place between each concatenated value.\"\r\n                },\r\n                {\r\n                    \"name\": \"value_or_array1\",\r\n                    \"detail\": \"The value or values to be appended using `delimiter`.\"\r\n                },\r\n                {\r\n                    \"name\": \"value_or_array2\",\r\n                    \"detail\": \"More values to be appended using `delimiter`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LEFT\": {\r\n            \"d\": \"Returns a substring from the beginning of a specified string.\",\r\n            \"a\": \"Substring from beginning of specified string.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"string\",\r\n                    \"detail\": \"The string from which the left portion will be returned.\"\r\n                },\r\n                {\r\n                    \"name\": \"number_of_characters\",\r\n                    \"detail\": \"The number of characters to return from the left side of `string`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"RIGHT\": {\r\n            \"d\": \"Returns a substring from the end of a specified string.\",\r\n            \"a\": \"A substring from the end of a specified string.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"string\",\r\n                    \"detail\": \"The string from which the right portion will be returned.\"\r\n                },\r\n                {\r\n                    \"name\": \"number_of_characters\",\r\n                    \"detail\": \"The number of characters to return from the right side of `string`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MID\": {\r\n            \"d\": \"Returns a segment of a string.\",\r\n            \"a\": \"A segment of a string.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"string\",\r\n                    \"detail\": \"The string to extract a segment from.\"\r\n                },\r\n                {\r\n                    \"name\": \"starting_at\",\r\n                    \"detail\": \"The index from the left of `string` from which to begin extracting. The first character in `string` has the index 1.\"\r\n                },\r\n                {\r\n                    \"name\": \"extract_length\",\r\n                    \"detail\": \"The length of the segment to extract.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LEN\": {\r\n            \"d\": \"Returns the length of a string.\",\r\n            \"a\": \"Length of a string.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"The string whose length will be returned.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LENB\": {\r\n            \"d\": \"Returns the length of a string in bytes.\",\r\n            \"a\": \"Length of a string in bytes.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"The string whose length will be returned.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOWER\": {\r\n            \"d\": \"Converts a specified string to lowercase.\",\r\n            \"a\": \"Converts a specified string to lowercase.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"The string to convert to lowercase.\"\r\n                }\r\n            ]\r\n        },\r\n        \"UPPER\": {\r\n            \"d\": \"Converts a specified string to uppercase.\",\r\n            \"a\": \"Converts a specified string to uppercase.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"The string to convert to uppercase.\"\r\n                }\r\n            ]\r\n        },\r\n        \"EXACT\": {\r\n            \"d\": \"Tests whether two strings are identical.\",\r\n            \"a\": \"Tests whether two strings are identical.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"string1\",\r\n                    \"detail\": \"The first string to compare\"\r\n                },\r\n                {\r\n                    \"name\": \"string2\",\r\n                    \"detail\": \"The second string to compare\"\r\n                }\r\n            ]\r\n        },\r\n        \"REPLACE\": {\r\n            \"d\": \"Replaces part of a text string with a different text string.\",\r\n            \"a\": \"Replaces part of a text string with different text.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"The text, a part of which will be replaced.\"\r\n                },\r\n                {\r\n                    \"name\": \"position\",\r\n                    \"detail\": \"The position where the replacement will begin (starting from 1).\"\r\n                },\r\n                {\r\n                    \"name\": \"length\",\r\n                    \"detail\": \"The number of characters in the text to be replaced.\"\r\n                },\r\n                {\r\n                    \"name\": \"new_text\",\r\n                    \"detail\": \"The text which will be inserted into the original text.\"\r\n                }\r\n            ]\r\n        },\r\n        \"REPT\": {\r\n            \"d\": \"Returns specified text repeated a number of times.\",\r\n            \"a\": \"Specified text repeated a number of times.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text_to_repeat\",\r\n                    \"detail\": \"The character or string to repeat.\"\r\n                },\r\n                {\r\n                    \"name\": \"number_of_repetitions\",\r\n                    \"detail\": \"The number of times `text_to_repeat` should appear in the value returned.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SEARCH\": {\r\n            \"d\": \"Returns the position at which a string is first found within text and ignores capitalization of letters. Returns `#VALUE!` if the string is not found.\",\r\n            \"a\": \"First position of string found in text, ignoring case.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"search_for\",\r\n                    \"detail\": \"The string to look for within `text_to_search`.\"\r\n                },\r\n                {\r\n                    \"name\": \"text_to_search\",\r\n                    \"detail\": \"The text to search for the first occurrence of `search_for`.\"\r\n                },\r\n                {\r\n                    \"name\": \"starting_at\",\r\n                    \"detail\": \"The character within `text_to_search` at which to start the search.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUBSTITUTE\": {\r\n            \"d\": \"Replaces existing text with new text in a string.\",\r\n            \"a\": \"Replaces existing text with new text in a string.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text_to_search\",\r\n                    \"detail\": \"The text within which to search and replace.\"\r\n                },\r\n                {\r\n                    \"name\": \"search_for\",\r\n                    \"detail\": \"The string to search for within `text_to_search`.\"\r\n                },\r\n                {\r\n                    \"name\": \"replace_with\",\r\n                    \"detail\": \"The string that will replace `search_for`.\"\r\n                },\r\n                {\r\n                    \"name\": \"occurrence_number\",\r\n                    \"detail\": \"The instance of `search_for` within `text_to_search` to replace with `replace_with`. By default, all occurrences of `search_for` are replaced; however, if `occurrence_number` is specified, only the indicated instance of `search_for` is replaced.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CLEAN\": {\r\n            \"d\": \"Returns the text with the non-printable ASCII characters removed.\",\r\n            \"a\": \"Removes non-printable characters from a piece of text.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"The text whose non-printable characters are to be removed.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TEXT\": {\r\n            \"d\": \"Converts a number into text according to a specified format.\",\r\n            \"a\": \"Formats a number into text.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"The number, date, or time to format.\"\r\n                },\r\n                {\r\n                    \"name\": \"format\",\r\n                    \"detail\": \"The pattern by which to format the number, enclosed in quotation marks.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TRIM\": {\r\n            \"d\": \"Removes leading, trailing, and repeated spaces in text.\",\r\n            \"a\": \"Removes space characters.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"The text or reference to a cell containing text to be trimmed.\"\r\n                }\r\n            ]\r\n        },\r\n        \"VALUE\": {\r\n            \"d\": \"Converts a string in any of the date, time or number formats that Google Sheets understands into a number.\",\r\n            \"a\": \"Converts a date/time/number string into a number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"The string containing the value to be converted.\"\r\n                }\r\n            ]\r\n        },\r\n        \"PROPER\": {\r\n            \"d\": \"Capitalizes each word in a specified string.\",\r\n            \"a\": \"Capitalizes each word in a specified string.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text_to_capitalize\",\r\n                    \"detail\": \"The text which will be returned with the first letter of each word in uppercase and all other letters in lowercase.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CONVERT\": {\r\n            \"d\": \"Converts a numeric value to a different unit of measure.\",\r\n            \"a\": \"Unit conversion for numbers.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The numeric value in `start_unit` to convert to `end_unit`.\"\r\n                },\r\n                {\r\n                    \"name\": \"start_unit\",\r\n                    \"detail\": \"The starting unit, the unit currently assigned to `value`.\"\r\n                },\r\n                {\r\n                    \"name\": \"end_unit\",\r\n                    \"detail\": \"The unit of measure into which to convert the argument, `value`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUMX2MY2\": {\r\n            \"d\": \"Calculates the sum of the differences of the squares of values in two arrays.\",\r\n            \"a\": \"Sum of the differences of squares.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array_x\",\r\n                    \"detail\": \"The array or range of values whose squares will be reduced by the squares of corresponding entries in `array_y` and added together.\"\r\n                },\r\n                {\r\n                    \"name\": \"array_y\",\r\n                    \"detail\": \"The array or range of values whose squares will be subtracted from the squares of corresponding entries in `array_x` and added together.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUMX2PY2\": {\r\n            \"d\": \"Calculates the sum of the sums of the squares of values in two arrays.\",\r\n            \"a\": \"Sum of the sums of squares.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array_x\",\r\n                    \"detail\": \"The array or range of values whose squares will be added to the squares of corresponding entries in `array_y` and added together.\"\r\n                },\r\n                {\r\n                    \"name\": \"array_y\",\r\n                    \"detail\": \"The array or range of values whose squares will be added to the squares of corresponding entries in `array_x` and added together.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUMXMY2\": {\r\n            \"d\": \"Calculates the sum of the squares of differences of values in two arrays.\",\r\n            \"a\": \"Sum of the squares of differences.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array_x\",\r\n                    \"detail\": \"The array or range of values that will be reduced by corresponding entries in `array_y`, squared, and added together.\"\r\n                },\r\n                {\r\n                    \"name\": \"array_y\",\r\n                    \"detail\": \"The array or range of values that will be subtracted from corresponding entries in `array_x`, the result squared, and all such results added together.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TRANSPOSE\": {\r\n            \"d\": \"Transposes the rows and columns of an array or range of cells.\",\r\n            \"a\": \"Transposes the rows and columns of an array.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array_or_range\",\r\n                    \"detail\": \"The array or range whose rows and columns will be swapped.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TREND\": {\r\n            \"d\": \"Given partial data about a linear trend, fits an ideal linear trend using the least squares method and/or predicts further values.\",\r\n            \"a\": \"Fits points to linear trend derived via least-squares.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"known_data_y\",\r\n                    \"detail\": \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal linear trend.\"\r\n                },\r\n                {\r\n                    \"name\": \"known_data_x\",\r\n                    \"detail\": \"The values of the independent variable(s) corresponding with `known_data_y`.\"\r\n                },\r\n                {\r\n                    \"name\": \"new_data_x\",\r\n                    \"detail\": \"The data points to return the `y` values for on the ideal curve fit.\"\r\n                },\r\n                {\r\n                    \"name\": \"b\",\r\n                    \"detail\": \"Given a general linear form of `y = m*x+b` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `0` and only calculates the `m` values if `FALSE`, i.e. forces the curve fit to pass through the origin.\"\r\n                }\r\n            ]\r\n        },\r\n        \"FREQUENCY\": {\r\n            \"d\": \"Calculates the frequency distribution of a one-column array into specified classes.\",\r\n            \"a\": \"The frequency distribution of array.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"The array or range containing the values to be counted.\"\r\n                },\r\n                {\r\n                    \"name\": \"classes\",\r\n                    \"detail\": \"The array or range containing the set of classes.\"\r\n                }\r\n            ]\r\n        },\r\n        \"GROWTH\": {\r\n            \"d\": \"Given partial data about an exponential growth trend, fits an ideal exponential growth trend and/or predicts further values.\",\r\n            \"a\": \"Fits points to exponential growth trend.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"known_data_y\",\r\n                    \"detail\": \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal exponential growth curve.\"\r\n                },\r\n                {\r\n                    \"name\": \"known_data_x\",\r\n                    \"detail\": \"The values of the independent variable(s) corresponding with `known_data_y`.\"\r\n                },\r\n                {\r\n                    \"name\": \"new_data_x\",\r\n                    \"detail\": \"The data points to return the `y` values for on the ideal curve fit.\"\r\n                },\r\n                {\r\n                    \"name\": \"b\",\r\n                    \"detail\": \"Given a general exponential form of `y = b*m^x` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `1` and only calculates the `m` values if `FALSE`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LINEST\": {\r\n            \"d\": \"Given partial data about a linear trend, calculates various parameters about the ideal linear trend using the least-squares method.\",\r\n            \"a\": \"Best-fit linear trend via least-squares.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"known_data_y\",\r\n                    \"detail\": \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal linear trend.\"\r\n                },\r\n                {\r\n                    \"name\": \"known_data_x\",\r\n                    \"detail\": \"The values of the independent variable(s) corresponding with `known_data_y`.\"\r\n                },\r\n                {\r\n                    \"name\": \"calculate_b\",\r\n                    \"detail\": \"Given a linear form of `y = m*x+b`, calculates the y-intercept (`b`) if `TRUE`. Otherwise, forces `b` to be `0` and only calculates the `m` values if `FALSE`, i.e. forces the curve fit to pass through the origin.\"\r\n                },\r\n                {\r\n                    \"name\": \"verbose\",\r\n                    \"detail\": \"A flag specifying whether to return additional regression statistics or only the linear coefficients and the y-intercept (default).\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOGEST\": {\r\n            \"d\": \"Given partial data about an exponential growth curve, calculates various parameters about the best fit ideal exponential growth curve.\",\r\n            \"a\": \"Best-fit exponential growth curve.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"known_data_y\",\r\n                    \"detail\": \"The array or range containing dependent (y) values that are already known, used to curve fit an ideal exponential growth curve.\"\r\n                },\r\n                {\r\n                    \"name\": \"known_data_x\",\r\n                    \"detail\": \"The values of the independent variable(s) corresponding with `known_data_y`.\"\r\n                },\r\n                {\r\n                    \"name\": \"b\",\r\n                    \"detail\": \"Given a general exponential form of `y = b*m^x` for a curve fit, calculates `b` if `TRUE` or forces `b` to be `1` and only calculates the `m` values if `FALSE`.\"\r\n                },\r\n                {\r\n                    \"name\": \"verbose\",\r\n                    \"detail\": \"A flag specifying whether to return additional regression statistics or only the calculated coefficient and exponents.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MDETERM\": {\r\n            \"d\": \"Returns the matrix determinant of a square matrix specified as an array or range.\",\r\n            \"a\": \"Matrix determinant of a square matrix.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"square_matrix\",\r\n                    \"detail\": \"An array or range with an equal number of rows and columns representing a matrix whose determinant will be calculated.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MINVERSE\": {\r\n            \"d\": \"Returns the multiplicative inverse of a square matrix specified as an array or range.\",\r\n            \"a\": \"Multiplicative inverse of square matrix.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"square_matrix\",\r\n                    \"detail\": \"An array or range with an equal number of rows and columns representing a matrix whose multiplicative inverse will be calculated.\"\r\n                }\r\n            ]\r\n        },\r\n        \"MMULT\": {\r\n            \"d\": \"Calculates the matrix product of two matrices specified as arrays or ranges.\",\r\n            \"a\": \"The matrix product of two matrices.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"matrix1\",\r\n                    \"detail\": \"The first matrix in the matrix multiplication operation, represented as an array or range.\"\r\n                },\r\n                {\r\n                    \"name\": \"matrix2\",\r\n                    \"detail\": \"The second matrix in the matrix multiplication operation, represented as an array or range.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUMPRODUCT\": {\r\n            \"d\": \"Calculates the sum of the products of corresponding entries in two equal-sized arrays or ranges.\",\r\n            \"a\": \"Sum of products of elements in two arrays.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array1\",\r\n                    \"detail\": \"The first array or range whose entries will be multiplied with corresponding entries in the second such array or range.\"\r\n                },\r\n                {\r\n                    \"name\": \"array2\",\r\n                    \"detail\": \"The second array or range whose entries will be multiplied with corresponding entries in the first such array or range.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISFORMULA\": {\r\n            \"d\": \"Checks whether a value is a formula.\",\r\n            \"a\": \"Whether a value is a formula.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cell\",\r\n                    \"detail\": \"The cell to be verified as containing a formula.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CELL\": {\r\n            \"d\": \"Returns the requested information about the specified cell.\",\r\n            \"a\": \"Gets information about a cell.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"info_type\",\r\n                    \"detail\": \"The type of information requested (see article for available types)\"\r\n                },\r\n                {\r\n                    \"name\": \"reference\",\r\n                    \"detail\": \"The reference to the cell.\"\r\n                }\r\n            ]\r\n        },\r\n        \"NA\": {\r\n            \"d\": \"Returns the \\\"value not available\\\" error, `#N/A`.\",\r\n            \"a\": \"The `#N/A` error.\",\r\n            \"p\": []\r\n        },\r\n        \"ERROR_TYPE\": {\r\n            \"d\": \"Returns a number corresponding to the error value in a different cell.\",\r\n            \"a\": \"Error value of cell (as number).\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"reference\",\r\n                    \"detail\": \"The cell to find the error number for although you can also provide the error value directly.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISBLANK\": {\r\n            \"d\": \"Checks whether the referenced cell is empty.\",\r\n            \"a\": \"Whether the referenced cell is empty.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"Reference to the cell that will be checked for emptiness.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISERR\": {\r\n            \"d\": \"Checks whether a value is an error other than `#N/A`.\",\r\n            \"a\": \"Whether a value is an error other than `#n/a`.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to be verified as an error type other than `#N/A`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISERROR\": {\r\n            \"d\": \"Checks whether a value is an error.\",\r\n            \"a\": \"Whether a value is an error.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to be verified as an error type.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISLOGICAL\": {\r\n            \"d\": \"Checks whether a value is `TRUE` or `FALSE`.\",\r\n            \"a\": \"Whether a value is `true` or `false`.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to be verified as a logical `TRUE` or `FALSE`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISNA\": {\r\n            \"d\": \"Checks whether a value is the error `#N/A`.\",\r\n            \"a\": \"Whether a value is the error `#n/a`.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to be compared with the error value `#N/A`.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISNONTEXT\": {\r\n            \"d\": \"Checks whether a value is non-textual.\",\r\n            \"a\": \"Whether a value is non-textual.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to be checked.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISNUMBER\": {\r\n            \"d\": \"Checks whether a value is a number.\",\r\n            \"a\": \"Whether a value is a number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to be verified as a number.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISREF\": {\r\n            \"d\": \"Checks whether a value is a valid cell reference.\",\r\n            \"a\": \"Whether a value is a valid cell reference.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to be verified as a cell reference.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISTEXT\": {\r\n            \"d\": \"Checks whether a value is text.\",\r\n            \"a\": \"Whether a value is text.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to be verified as text.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TYPE\": {\r\n            \"d\": \"Returns a number associated with the type of data passed into the function.\",\r\n            \"a\": \"Get the type of a value.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value whose type is to be determined.\"\r\n                }\r\n            ]\r\n        },\r\n        \"N\": {\r\n            \"d\": \"Returns the argument provided as a number. Text is converted to 0 and errors are returned as-is.\",\r\n            \"a\": \"Argument provided as a number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The argument to be converted to a number.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TO_DATE\": {\r\n            \"d\": \"Converts a provided number to a date.\",\r\n            \"a\": \"Converts a provided number to a date.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The argument or reference to a cell to be converted to a date.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TO_PURE_NUMBER\": {\r\n            \"d\": \"Converts a provided date/time, percentage, currency or other formatted numeric value to a pure number without formatting.\",\r\n            \"a\": \"Converts any numeric value to a pure number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The argument or reference to a cell to be converted to a pure number.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TO_TEXT\": {\r\n            \"d\": \"Converts a provided numeric value to a text value.\",\r\n            \"a\": \"Converts a provided numeric value to a text value.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The argument or reference to a cell to be converted to text.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TO_DOLLARS\": {\r\n            \"d\": \"Converts a provided number to a dollar value.\",\r\n            \"a\": \"Converts a provided number to a dollar value.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The argument or reference to a cell to be converted to a dollar value.\"\r\n                }\r\n            ]\r\n        },\r\n        \"TO_PERCENT\": {\r\n            \"d\": \"Converts a provided number to a percentage.\",\r\n            \"a\": \"Converts a provided number to a percentage.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The argument or reference to a cell to be converted to a percentage.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DGET\": {\r\n            \"d\": \"Returns a single value from a database table-like array or range using a SQL-like query.\",\r\n            \"a\": \"Single value from a table-like range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DMAX\": {\r\n            \"d\": \"Returns the maximum value selected from a database table-like array or range using a SQL-like query.\",\r\n            \"a\": \"Maximum of values from a table-like range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DMIN\": {\r\n            \"d\": \"Returns the minimum value selected from a database table-like array or range using a SQL-like query.\",\r\n            \"a\": \"Minimum of values from a table-like range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DAVERAGE\": {\r\n            \"d\": \"Returns the average of a set of values selected from a database table-like array or range using a SQL-like query.\",\r\n            \"a\": \"Average of a set of values from a table-like range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DCOUNT\": {\r\n            \"d\": \"Counts numeric values selected from a database table-like array or range using a SQL-like query.\",\r\n            \"a\": \"Counts values from a table-like range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DCOUNTA\": {\r\n            \"d\": \"Counts values, including text, selected from a database table-like array or range using a SQL-like query.\",\r\n            \"a\": \"Counts values and text from a table-like range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DPRODUCT\": {\r\n            \"d\": \"Returns the product of values selected from a database table-like array or range using a SQL-like query.\",\r\n            \"a\": \"Product of values from a table-like range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DSTDEV\": {\r\n            \"d\": \"Returns the standard deviation of a population sample selected from a database table-like array or range using a SQL-like query.\",\r\n            \"a\": \"Standard deviation of population sample from table.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DSTDEVP\": {\r\n            \"d\": \"Returns the standard deviation of an entire population selected from a database table-like array or range using a SQL-like query.\",\r\n            \"a\": \"Standard deviation of entire population from table.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DSUM\": {\r\n            \"d\": \"Returns the sum of values selected from a database table-like array or range using a SQL-like query.\",\r\n            \"a\": \"Sum of values from a table-like range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DVAR\": {\r\n            \"d\": \"Returns the variance of a population sample selected from a database table-like array or range using a SQL-like query.\",\r\n            \"a\": \"Variance of population sample from table-like range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DVARP\": {\r\n            \"d\": \"Returns the variance of an entire population selected from a database table-like array or range using a SQL-like query.\",\r\n            \"a\": \"Variance of a population from a table-like range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"The array or range containing the data to consider, structured in such a way that the first row contains the labels for each column's values.\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"Indicates which column in `database` contains the values to be extracted and operated on.\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"An array or range containing zero or more criteria to filter the `database` values by before operating.\"\r\n                }\r\n            ]\r\n        },\r\n        \"AGE_BY_IDCARD\": {\r\n            \"d\": \"Calculate the age based on the Chinese ID number. Support 15 or 18\",\r\n            \"a\": \"Get age based on ID number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"ID number\",\r\n                    \"detail\": \"15-digit or 18-digit ID number or range.\"\r\n                },\r\n                {\r\n                    \"name\": \"Deadline\",\r\n                    \"detail\": \"The deadline or range of age calculation. The default is the current day.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SEX_BY_IDCARD\": {\r\n            \"d\": \"Calculate gender based on Chinese ID number. Support 15 or 18\",\r\n            \"a\": \"Get gender based on ID number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"ID number\",\r\n                    \"detail\": \"15-digit or 18-digit ID number or range.\"\r\n                }\r\n            ]\r\n        },\r\n        \"BIRTHDAY_BY_IDCARD\": {\r\n            \"d\": \"Calculate the birthday based on the Chinese ID number. Support 15 or 18\",\r\n            \"a\": \"Get the birthday based on the ID number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"ID number\",\r\n                    \"detail\": \"15-digit or 18-digit ID number or range.\"\r\n                },\r\n                {\r\n                    \"name\": \"Birthday format\",\r\n                    \"detail\": \"Date type, default:0:[1900/01/01], 1:[1900-01-01], 2:[1900年1月1日]\"\r\n                }\r\n            ]\r\n        },\r\n        \"PROVINCE_BY_IDCARD\": {\r\n            \"d\": \"Calculate the province of birthplace based on the Chinese ID number. Support 15 or 18\",\r\n            \"a\": \"Get the province of birthplace based on the ID number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"ID number\",\r\n                    \"detail\": \"15-digit or 18-digit ID number or range.\"\r\n                }\r\n            ]\r\n        },\r\n        \"CITY_BY_IDCARD\": {\r\n            \"d\": \"Calculate the city of birthplace based on the Chinese ID number. Support 15 or 18\",\r\n            \"a\": \"Get the city of birthplace based on the ID number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"ID number\",\r\n                    \"detail\": \"15-digit or 18-digit ID number or range.\"\r\n                }\r\n            ]\r\n        },\r\n        \"STAR_BY_IDCARD\": {\r\n            \"d\": \"Calculate the constellation based on the Chinese ID number. Support 15 or 18\",\r\n            \"a\": \"Get the constellation based on the ID number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"ID number\",\r\n                    \"detail\": \"15-digit or 18-digit ID number or range.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ANIMAL_BY_IDCARD\": {\r\n            \"d\": \"Calculate the zodiac (rat, ox, tiger, rabbit...) based on the Chinese ID number. Support 15 or 18\",\r\n            \"a\": \"Get the zodiac according to the ID number.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"ID number\",\r\n                    \"detail\": \"15-digit or 18-digit ID number or range.\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISIDCARD\": {\r\n            \"d\": \"Verify that the format of the ID card is correct. Support 15 or 18\",\r\n            \"a\": \"Verify the correctness of the ID card format.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"ID number\",\r\n                    \"detail\": \"15-digit or 18-digit ID number or range.\"\r\n                }\r\n            ]\r\n        },\r\n        \"DM_TEXT_CUTWORD\": {\r\n            \"d\": \"Text segmentation. Split a series of words into a series of individual words\",\r\n            \"a\": \"Chinese text segmentation.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Text\",\r\n                    \"detail\": \"Any text that needs word segmentation.\"\r\n                },\r\n                {\r\n                    \"name\": \"Word segmentation mode\",\r\n                    \"detail\": \"The default is 0[precision mode], 1[full mode], 2[search engine mode].\"\r\n                }\r\n            ]\r\n        },\r\n        \"DM_TEXT_TFIDF\": {\r\n            \"d\": \"Use tf-idf algorithm for keyword extraction. Identify keywords from a series of text\",\r\n            \"a\": \"tf-idf keyword recognition.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Text\",\r\n                    \"detail\": \"Any text that needs word segmentation.\"\r\n                },\r\n                {\r\n                    \"name\": \"Number of keywords\",\r\n                    \"detail\": \"The number of keywords returned by the algorithm, the default is 20\"\r\n                },\r\n                {\r\n                    \"name\": \"Corpus\",\r\n                    \"detail\": \"Select a corpus in a specific field, the default is 0[General], 1[Finance], 2[Medical]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DM_TEXT_TEXTRANK\": {\r\n            \"d\": \"Use TextRank algorithm to extract keywords. Identify keywords from a series of text\",\r\n            \"a\": \"TextRank keyword recognition.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Text\",\r\n                    \"detail\": \"Any text that needs word segmentation.\"\r\n                },\r\n                {\r\n                    \"name\": \"Number of keywords\",\r\n                    \"detail\": \"The number of keywords returned by the algorithm, the default is 20\"\r\n                },\r\n                {\r\n                    \"name\": \"Corpus\",\r\n                    \"detail\": \"Select a corpus in a specific field, the default is 0[General], 1[Finance], 2[Medical]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATA_CN_STOCK_CLOSE\": {\r\n            \"d\": \"According to the stock code and date, return the corresponding stock closing price of A shares.\",\r\n            \"a\": \"Returns the closing price of stock.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Stock code\",\r\n                    \"detail\": \"6-digit stock code, required.\"\r\n                },\r\n                {\r\n                    \"name\": \"Date\",\r\n                    \"detail\": \"The trading day of the stock, the default is the latest trading day\"\r\n                },\r\n                {\r\n                    \"name\": \"Reversion and exclusion\",\r\n                    \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATA_CN_STOCK_OPEN\": {\r\n            \"d\": \"According to the stock code and date, return the opening price of stock.\",\r\n            \"a\": \"Return the opening price of a shares.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Stock code\",\r\n                    \"detail\": \"6-digit stock code, required.\"\r\n                },\r\n                {\r\n                    \"name\": \"Date\",\r\n                    \"detail\": \"The trading day of the stock, the default is the latest trading day\"\r\n                },\r\n                {\r\n                    \"name\": \"Reversion and exclusion\",\r\n                    \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATA_CN_STOCK_MAX\": {\r\n            \"d\": \"According to the stock code and date, return the highest price of stock.\",\r\n            \"a\": \"Return the highest price of stock.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Stock code\",\r\n                    \"detail\": \"6-digit stock code, required.\"\r\n                },\r\n                {\r\n                    \"name\": \"Date\",\r\n                    \"detail\": \"The trading day of the stock, the default is the latest trading day\"\r\n                },\r\n                {\r\n                    \"name\": \"Reversion and exclusion\",\r\n                    \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATA_CN_STOCK_MIN\": {\r\n            \"d\": \"According to the stock code and date, return the lowest price of stock.\",\r\n            \"a\": \"Returns the lowest price of stock.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Stock code\",\r\n                    \"detail\": \"6-digit stock code, required.\"\r\n                },\r\n                {\r\n                    \"name\": \"Date\",\r\n                    \"detail\": \"The trading day of the stock, the default is the latest trading day\"\r\n                },\r\n                {\r\n                    \"name\": \"Reversion and exclusion\",\r\n                    \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATA_CN_STOCK_VOLUMN\": {\r\n            \"d\": \"According to the stock code and date, return the corresponding stock trading volume of A shares.\",\r\n            \"a\": \"Returns the corresponding stock trading volume of A shares.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Stock code\",\r\n                    \"detail\": \"6-digit stock code, required.\"\r\n                },\r\n                {\r\n                    \"name\": \"Date\",\r\n                    \"detail\": \"The trading day of the stock, the default is the latest trading day\"\r\n                },\r\n                {\r\n                    \"name\": \"Reversion and exclusion\",\r\n                    \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATA_CN_STOCK_AMOUNT\": {\r\n            \"d\": \"According to the stock code and date, return the corresponding stock turnover of A shares.\",\r\n            \"a\": \"Returns the corresponding stock turnover of A shares.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Stock code\",\r\n                    \"detail\": \"6-digit stock code, required.\"\r\n                },\r\n                {\r\n                    \"name\": \"Date\",\r\n                    \"detail\": \"The trading day of the stock, the default is the latest trading day\"\r\n                },\r\n                {\r\n                    \"name\": \"Reversion and exclusion\",\r\n                    \"detail\": \"Select the ex right restoration type of the stock, default to 0 [former reversion], 1 [original price], 2 [post reversion]\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISDATE\": {\r\n            \"d\": \"Returns whether a value is a date.\",\r\n            \"a\": \"Whether a value is a date.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"The value to be verified as a date.\"\r\n                }\r\n            ]\r\n        },\r\n        \"LINESPLINES\": {\r\n            \"d\": \"Generate sparklines embedded in the cell to describe the continuous trend of data\",\r\n            \"a\": \"Generate sparklines line chart\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Range\",\r\n                    \"detail\": \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\"\r\n                },\r\n                {\r\n                    \"name\": \"Line color\",\r\n                    \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9\"\r\n                },\r\n                {\r\n                    \"name\": \"Line thickness\",\r\n                    \"detail\": \"Line thickness of the line graph, the default is 1px\"\r\n                },\r\n                {\r\n                    \"name\": \"Auxiliary line\",\r\n                    \"detail\": \"A horizontal line, which can be min, max, avg, median, range or custom value, default 0 none\"\r\n                },\r\n                {\r\n                    \"name\": \"Auxiliary line color\",\r\n                    \"detail\": \"Color setting of auxiliary line, same as line color configuration, default #000\"\r\n                },\r\n                {\r\n                    \"name\": \"Maximum mark\",\r\n                    \"detail\": \"Identifies the maximum value of the line graph, the same line color configuration, default 0 does not display\"\r\n                },\r\n                {\r\n                    \"name\": \"Minimum mark\",\r\n                    \"detail\": \"Identify the minimum value of the line graph, the same line color configuration, default 0 does not display\"\r\n                },\r\n                {\r\n                    \"name\": \"Mark size\",\r\n                    \"detail\": \"The maximum and minimum mark size settings, the default is 1.5\"\r\n                }\r\n            ]\r\n        },\r\n        \"AREASPLINES\": {\r\n            \"d\": \"Generate sparklines embedded in the cell area chart, generally used to describe the continuous cumulative value trend of the data\",\r\n            \"a\": \"Generate sparklines area chart\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Range\",\r\n                    \"detail\": \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\"\r\n                },\r\n                {\r\n                    \"name\": \"Line color\",\r\n                    \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9\"\r\n                },\r\n                {\r\n                    \"name\": \"Fill color\",\r\n                    \"detail\": \"Form an area chart, the same line color configuration, default 0 does not display\"\r\n                },\r\n                {\r\n                    \"name\": \"Line thickness\",\r\n                    \"detail\": \"Line thickness of the line graph, the default is 1px\"\r\n                },\r\n                {\r\n                    \"name\": \"Auxiliary line\",\r\n                    \"detail\": \"A horizontal line, which can be min, max, avg, median, range or custom value, default 0 none\"\r\n                },\r\n                {\r\n                    \"name\": \"Auxiliary line color\",\r\n                    \"detail\": \"Color setting of auxiliary line, same as line color configuration, default #000\"\r\n                }\r\n            ]\r\n        },\r\n        \"COLUMNSPLINES\": {\r\n            \"d\": \"Generate sparklines embedded in the vertical histogram of cells, generally used to describe the size of discrete data\",\r\n            \"a\": \"Generate sparklines vertical histogram\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Range\",\r\n                    \"detail\": \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\"\r\n                },\r\n                {\r\n                    \"name\": \"Bar interval\",\r\n                    \"detail\": \"The distance between bars, the default is 1\"\r\n                },\r\n                {\r\n                    \"name\": \"Bar color\",\r\n                    \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c\"\r\n                },\r\n                {\r\n                    \"name\": \"Negative bar color\",\r\n                    \"detail\": \"Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552\"\r\n                },\r\n                {\r\n                    \"name\": \"Max\",\r\n                    \"detail\": \"The maximum value of the bar chart, used to standardize the length of the bar chart, the default is to automatically calculate false, auto, null\"\r\n                },\r\n                {\r\n                    \"name\": \"Color palette\",\r\n                    \"detail\": \"The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty\"\r\n                }\r\n            ]\r\n        },\r\n        \"STACKCOLUMNSPLINES\": {\r\n            \"d\": \"Generate sparklines, a cumulative vertical histogram embedded in a cell, generally used to describe the numerical size of multiple dimensions of discrete data\",\r\n            \"a\": \"Generate sparklines cumulative vertical histogram\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Range\",\r\n                    \"detail\": \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\"\r\n                },\r\n                {\r\n                    \"name\": \"Stack by column\",\r\n                    \"detail\": \"If you need to stack by row, set this item to false or 0, the default is 1\"\r\n                },\r\n                {\r\n                    \"name\": \"Bar interval\",\r\n                    \"detail\": \"The distance between bars, the default is 1\"\r\n                },\r\n                {\r\n                    \"name\": \"Max\",\r\n                    \"detail\": \"The maximum value of the cumulative bar, used to regulate the length of the bar, the default is to automatically calculate false, auto, null\"\r\n                },\r\n                {\r\n                    \"name\": \"Color palette\",\r\n                    \"detail\": \"The color palette can individually set the bar color of each dimension, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\"\r\n                }\r\n            ]\r\n        },\r\n        \"BARSPLINES\": {\r\n            \"d\": \"Generate sparklines embedded in the cell, generally used to describe the size of discrete data\",\r\n            \"a\": \"Generate sparklines horizontal bar graph\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Range\",\r\n                    \"detail\": \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\"\r\n                },\r\n                {\r\n                    \"name\": \"Bar interval\",\r\n                    \"detail\": \"The distance between bars, the default is 1\"\r\n                },\r\n                {\r\n                    \"name\": \"Bar color\",\r\n                    \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c\"\r\n                },\r\n                {\r\n                    \"name\": \"Negative bar color\",\r\n                    \"detail\": \"Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552\"\r\n                },\r\n                {\r\n                    \"name\": \"Max\",\r\n                    \"detail\": \"The maximum value of the bar chart, used to standardize the length of the bar chart, the default is to automatically calculate false, auto, null\"\r\n                },\r\n                {\r\n                    \"name\": \"Color palette\",\r\n                    \"detail\": \"The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty\"\r\n                }\r\n            ]\r\n        },\r\n        \"STACKBARSPLINES\": {\r\n            \"d\": \"Generate sparklines, a cumulative horizontal bar graph embedded in a cell, which is generally used to describe the numerical size of multiple dimensions of discrete data\",\r\n            \"a\": \"Generate sparklines cumulative horizontal bar graph\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Range\",\r\n                    \"detail\": \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\"\r\n                },\r\n                {\r\n                    \"name\": \"Stack by column\",\r\n                    \"detail\": \"If you need to stack by row, set this item to false or 0, the default is 1\"\r\n                },\r\n                {\r\n                    \"name\": \"Bar interval\",\r\n                    \"detail\": \"The distance between bars, the default is 1\"\r\n                },\r\n                {\r\n                    \"name\": \"Max\",\r\n                    \"detail\": \"The maximum value of the cumulative bar, used to regulate the length of the bar, the default is to automatically calculate false, auto, null\"\r\n                },\r\n                {\r\n                    \"name\": \"Color palette\",\r\n                    \"detail\": \"The color palette can individually set the bar color of each dimension, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\"\r\n                }\r\n            ]\r\n        },\r\n        \"DISCRETESPLINES\": {\r\n            \"d\": \"Generate sparklines embedded in the cell, generally used to describe the trend of discrete data\",\r\n            \"a\": \"Generate sparklines discrete graph\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Range\",\r\n                    \"detail\": \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\"\r\n                },\r\n                {\r\n                    \"name\": \"Segmentation threshold\",\r\n                    \"detail\": \"Discrete graph column color distinction, for example: if the value is 0, blue is greater than 0, red is less than 0, and the default is 0\"\r\n                },\r\n                {\r\n                    \"name\": \"Above threshold color\",\r\n                    \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #2ec7c9\"\r\n                },\r\n                {\r\n                    \"name\": \"Below threshold color\",\r\n                    \"detail\": \"The color setting of the bar below the threshold, the same as the color above the threshold, default #fc5c5c\"\r\n                }\r\n            ]\r\n        },\r\n        \"TRISTATESPLINES\": {\r\n            \"d\": \"Generate sparklines, a three-state graph embedded in the cell, which is generally used to describe the trend of three situations, such as winning, losing, or drawing.\",\r\n            \"a\": \"Generate sparklines three-state graph\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Range\",\r\n                    \"detail\": \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\"\r\n                },\r\n                {\r\n                    \"name\": \"Bar interval\",\r\n                    \"detail\": \"The distance between bars, the default is 1\"\r\n                },\r\n                {\r\n                    \"name\": \"Bar color\",\r\n                    \"detail\": \"The line color of the line graph can be range A1, color table index value or specific color value. Set it to 0 or false to not display it. It supports regx, rgb, rgba, etc. Default #fc5c5c\"\r\n                },\r\n                {\r\n                    \"name\": \"Negative bar color\",\r\n                    \"detail\": \"Negative bar color setting, representing the color of negative value, same as the bar color configuration, default #97b552\"\r\n                },\r\n                {\r\n                    \"name\": \"Zero value bar color\",\r\n                    \"detail\": \"Zero value bar color setting, representing 0 value color, the same color configuration of the bar, default #999\"\r\n                },\r\n                {\r\n                    \"name\": \"Color palette\",\r\n                    \"detail\": \"The color palette can set the color of each bar individually, multiple settings can be set, and two formats are supported: 1 color such as #000, which means that the color of the first bar is black; 2 value range: color, such as -2:# 000 indicates that the bar with a value of -2 is black, 0:5:#000 indicates that the bar with a value of 0-5 is black, and the default is empty\"\r\n                }\r\n            ]\r\n        },\r\n        \"PIESPLINES\": {\r\n            \"d\": \"Generate sparklines pie chart embedded in the cell, generally used to describe the proportion of data\",\r\n            \"a\": \"Generate sparklines pie chart\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Range\",\r\n                    \"detail\": \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\"\r\n                },\r\n                {\r\n                    \"name\": \"Rotation angle\",\r\n                    \"detail\": \"The rotation angle of the pie chart, the default is 0\"\r\n                },\r\n                {\r\n                    \"name\": \"border\",\r\n                    \"detail\": \"Pie chart border size, default is none 0\"\r\n                },\r\n                {\r\n                    \"name\": \"Border color\",\r\n                    \"detail\": \"The border color of the pie chart, the default is #000\"\r\n                },\r\n                {\r\n                    \"name\": \"Color palette\",\r\n                    \"detail\": \"The color of the slice can be set in the palette, which can be set to the range of A1:A10, etc. The default is #2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\"\r\n                }\r\n            ]\r\n        },\r\n        \"BOXSPLINES\": {\r\n            \"d\": \"Generate sparklines embedded in the cell box plot, generally used to describe the statistical distribution of the data set\",\r\n            \"a\": \"Generate sparklines box plot\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Range\",\r\n                    \"detail\": \"Range，Values can be calculated effectively, such as A1:A20, {1,2,3,4,5}, etc.\"\r\n                },\r\n                {\r\n                    \"name\": \"Outlier ratio\",\r\n                    \"detail\": \"The threshold range of outliers, if it is 0 or false, it will not be displayed, the default is 1.5 times\"\r\n                },\r\n                {\r\n                    \"name\": \"Target value\",\r\n                    \"detail\": \"The target value setting on the box plot, the default is false and does not display\"\r\n                },\r\n                {\r\n                    \"name\": \"Point size\",\r\n                    \"detail\": \"The radius of the target point and outlier is set, the default is 1.5\"\r\n                }\r\n            ]\r\n        },\r\n        \"BULLETSPLINES\": {\r\n            \"d\": \"Generate sparklines embedded in the cell, generally used to describe the task achievement rate\",\r\n            \"a\": \"Generating sparklines bullets\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Target\",\r\n                    \"detail\": \"The numerical value can be calculated effectively for the achieved target value, such as A1, 100, etc.\"\r\n                },\r\n                {\r\n                    \"name\": \"achieved\",\r\n                    \"detail\": \"Only when the value is completed can the value be calculated effectively, such as A1, 100, etc.\"\r\n                },\r\n                {\r\n                    \"name\": \"Contrast\",\r\n                    \"detail\": \"Comparative values, such as excess, minimum, and bottom line for awards, can be effectively calculated, such as A1, 100, etc. You can set up to 9 comparison values\"\r\n                }\r\n            ]\r\n        },\r\n        \"COMPOSESPLINES\": {\r\n            \"d\": \"Support multiple types of pictures in the same cell, each parameter represents a sparklines diagram\",\r\n            \"a\": \"Combine sparklines graphs into one cell\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"config\",\r\n                    \"detail\": \"Sparklines chart settings, such as A1:A20, a completed pie chart, line chart settings, etc.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SORT\": {\r\n            \"d\": \"Sorts the rows of a given array or range by the values in one or more columns.\",\r\n            \"a\": \"Sorts rows of range by specified column.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"range\",\r\n                    \"detail\": \"The data to be sorted.\"\r\n                },\r\n                {\r\n                    \"name\": \"sort_column\",\r\n                    \"detail\": \"The index of the column in `range` or a range outside of `range` containing the values by which to sort.\"\r\n                },\r\n                {\r\n                    \"name\": \"is_ascending\",\r\n                    \"detail\": \"`TRUE` or `FALSE` indicating whether to sort `sort_column` in ascending order. `FALSE` sorts in descending order.\"\r\n                },\r\n                {\r\n                    \"name\": \"sort_column2\",\r\n                    \"detail\": \"Additional columns.\"\r\n                }\r\n            ]\r\n        },\r\n        \"FILTER\": {\r\n            \"d\": \"Returns a filtered version of the source range, returning only rows or columns which meet the specified conditions.\",\r\n            \"a\": \"Filters a range based off provided conditions.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"range\",\r\n                    \"detail\": \"The data to be filtered.\"\r\n                },\r\n                {\r\n                    \"name\": \"condition1\",\r\n                    \"detail\": \"A column or row containing true or false values corresponding to the first column or row of `range`, or an array formula evaluating to true or false.\"\r\n                },\r\n                {\r\n                    \"name\": \"condition2\",\r\n                    \"detail\": \"Additional rows or columns containing boolean values `TRUE` or `FALSE` indicating whether the corresponding row or column in `range` should pass through `FILTER`. Can also contain array formula expressions which evaluate to such rows or columns. All conditions must be of the same type (row or column). Mixing row conditions and column conditions is not permitted.\"\r\n                }\r\n            ]\r\n        },\r\n        \"UNIQUE\": {\r\n            \"d\": \"Returns unique rows in the provided source range, discarding duplicates. Rows are returned in the order in which they first appear in the source range.\",\r\n            \"a\": \"Unique rows in the provided source range.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"range\",\r\n                    \"detail\": \"The data to filter by unique entries.\"\r\n                },\r\n                {\r\n                    \"name\": \"by_col\",\r\n                    \"detail\": \"[Option] - Logical value, indicating how to compare; by row = FALSE() or omitted; by column = TRUE().\"\r\n                },\r\n                {\r\n                    \"name\": \"occurs_once\",\r\n                    \"detail\": \"[Option] - Logical value, only one occurrence in the unique value is returned = TRUE(); including all unique values = FALSE() or omitted.\"\r\n                }\r\n            ]\r\n        },\r\n        \"RANDARRAY\": {\r\n            \"d\": \"Returns a grid of random numbers between 0 inclusive and 1 exclusive. The grid size will match the provided rows and columns arguments. If neither rows nor columns are provided, then the grid will be size 1 x 1.\",\r\n            \"a\": \"Returns a grid of random numbers.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rows\",\r\n                    \"detail\": \"The number of rows to populate with a random number.\"\r\n                },\r\n                {\r\n                    \"name\": \"columns\",\r\n                    \"detail\": \"The number of columns to populate with a random number.\"\r\n                }\r\n            ]\r\n        },\r\n        \"SEQUENCE\": {\r\n            \"d\": \"Returns a grid of sequential numbers starting at a specified start value and  increasing by a specified step size. By default, the sequence starts at and  increases by 1.\",\r\n            \"a\": \"Returns a grid of sequential numbers.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rows\",\r\n                    \"detail\": \"The number of rows in the function's resulting grid.\"\r\n                },\r\n                {\r\n                    \"name\": \"columns\",\r\n                    \"detail\": \"The number of columns in the function's resulting grid. If omitted, the result grid will have 1 column.\"\r\n                },\r\n                {\r\n                    \"name\": \"start\",\r\n                    \"detail\": \"The number, at which to start the sequence. If omitted, the sequence will start at 1.\"\r\n                },\r\n                {\r\n                    \"name\": \"step\",\r\n                    \"detail\": \"The amount each value in the sequence will differ by. If omitted, each value will differ by 1.\"\r\n                }\r\n            ]\r\n        },\r\n        \"EVALUATE\": {\r\n            \"d\": \"Evaluate a formula or expression expressed in words and return the result\",\r\n            \"a\": \"Evaluate according to literal formula or expression.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"expression\",\r\n                    \"detail\": \"Formula or expression\"\r\n                }\r\n            ]\r\n        },\r\n        \"REMOTE\": {\r\n            \"d\": \"Calls a function on a remote server\",\r\n            \"a\": \"Calls a function on a remote back end server/API.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"remote_expression\",\r\n                    \"detail\": \"Formula\"\r\n                }\r\n            ]\r\n        }\r\n    },\r\n    toolbar: {\r\n        undo: 'Deshacer',\r\n        redo: 'Rehacer',\r\n        paintFormat: 'Clonar formato',\r\n        currencyFormat: 'Formato de moneda',\r\n        percentageFormat: 'Formato de porcentaje',\r\n        numberDecrease: 'Menos decimales',\r\n        numberIncrease: 'Más decimales',\r\n        moreFormats:'Más formatos',\r\n        font: 'Fuente',\r\n        fontSize: 'Tamaño Fuente',\r\n        bold: 'Negrita (Ctrl+B)',\r\n        italic : 'Itálica (Ctrl+I)',\r\n        strikethrough: 'Tachar (Alt+Shift+5)',\r\n        underline: 'Guion bajo',\r\n        textColor: 'Color texto',\r\n        chooseColor: 'elegir color',\r\n        resetColor: 'Reinicializar',\r\n        customColor: 'PERSONALIZADO',\r\n        alternatingColors: 'Colores alternos',\r\n        confirmColor: 'Vale',\r\n        cancelColor: 'Cancelar',\r\n        collapse: 'Recoger',\r\n        fillColor: 'Color de relleno',\r\n        border: 'Borde',\r\n        borderStyle: 'Estilo Borde',\r\n        mergeCell: 'Juntar celdas',\r\n        chooseMergeType: 'Elegir tipo de unión',\r\n        horizontalAlign: 'Alineación Horizontal',\r\n        verticalAlign: 'Alineación Vertical',\r\n        alignment: 'Alineación',\r\n        textWrap: 'Ajuste de texto',\r\n        textWrapMode: 'Modo de ajuste de texto',\r\n        textRotate: 'Rotar texto',\r\n        textRotateMode: 'Modo de rotar texto',\r\n        freezeTopRow: 'Fijar fila superior',\r\n        sortAndFilter: 'Ordenar y filtrar',\r\n        findAndReplace: 'Buscar y reemplazar',\r\n        sum: 'SUMA',\r\n        autoSum: 'SUMA automática',\r\n        moreFunction: 'Más funciones',\r\n        conditionalFormat: 'Formato condicional',\r\n        postil: 'Comentario',\r\n        pivotTable: 'Tabla Dinámica',\r\n        chart: 'Gráfica',\r\n        screenshot: 'Captura de pantalla',\r\n        splitColumn: 'Separar texto',\r\n        insertImage: 'Insertar imagen',\r\n        exportXlsx: \"Exportar Xlsx\",\r\n        dataVerification: 'Verificación de datos',\r\n        protection:\"Proteger la hoja\",\r\n\r\n        clearText:\"Limpiar color\",\r\n        noColorSelectedText:\"Ningún color seleccionado\",\r\n\r\n        toolMore:\"Más\",\r\n        toolLess:\"Menos\",\r\n        toolClose:\"Cerrar\",\r\n        toolMoreTip:\"Más funcionalidades\",\r\n        moreOptions:\"Más opciones\",\r\n\r\n        cellFormat:\"Configuración formato de celda\",\r\n        print:\"Imprimir\",\r\n    },\r\n    alternatingColors:{\r\n        applyRange: 'Aplicar a rango',\r\n        selectRange: 'Seleccionar un rango de datos',\r\n        header: 'Cabecera',\r\n        footer: 'Pie',\r\n\r\n        errorInfo:\"No se puede realizar esta operación en varias áreas de selección, selecciona una sola área y vuelve a intentarlo\",\r\n        textTitle:\"Estilo Formato\",\r\n        custom:\"PERSONALIZADO\",\r\n        close:\"cerrar\",\r\n        selectionTextColor:\"Haz clic para seleccionar el color del texto\",\r\n        selectionCellColor:\"Haz clic para seleccionar el color de la celda\",\r\n        removeColor:\"Eliminar colores alternos\",\r\n        colorShow:\"color\",\r\n        currentColor:\"Actual\",\r\n\r\n        tipSelectRange:\"Selecciona la gama de colores alternos\",\r\n        errorNoRange:\"No hay ningún rango seleccionado\",\r\n        errorExistColors:\"Los colores alternos ya existen y no se pueden editar\",\r\n    },\r\n    button: {\r\n        confirm: 'Vale',\r\n        cancel: 'Cancelar',\r\n        close:\"Cerrar\",\r\n        update:\"Actualizar\",\r\n        delete:\"Eliminar\",\r\n        insert:\"Insertar\",\r\n        prevPage: \"Previous\",\r\n        nextPage: \"Next\",\r\n        total: \"total:\"\r\n    },\r\n    paint:{\r\n        start: 'Inicio clonar formato',\r\n        end: 'ESC',\r\n\r\n        tipSelectRange:\"Selecciona el rango que quieres copiar\",\r\n        tipNotMulti:\"No se puede realizar esta operación en un rango de selección múltiple\",\r\n    },\r\n    format:{\r\n        moreCurrency: 'Más formatos de moneda',\r\n        moreDateTime: 'Más formatos de fecha y hora',\r\n        moreNumber: 'Más formatos de número',\r\n\r\n        titleCurrency: 'Formatos de moneda',\r\n        decimalPlaces: 'Decimales',\r\n        titleDateTime: 'Formatos de fecha y hora',\r\n        titleNumber: 'Formatos de números'\r\n    },\r\n    info:{\r\n        detailUpdate: 'Nuevo abierto',\r\n        detailSave: 'Cache local restaurado',\r\n        row: '',\r\n        column: '',\r\n        loading:\"Cargando...\",\r\n\r\n        copy:\"Copiar\",\r\n        return:\"Salir\",\r\n        rename:\"Renombrar\",\r\n        tips:\"Renombrar Libro\",\r\n        noName:\"Hoja sin título\",\r\n        wait:\"esperando actualización\",\r\n\r\n        add:\"Añadir\",\r\n        addLast:\"más filas al final\",\r\n        backTop:\"Volver arriba\",\r\n        pageInfo:'Total ${total}，página ${totalPage}，actual ${currentPage}',\r\n        nextPage:\"Siguiente\",\r\n\r\n        tipInputNumber:\"Introduce el número\",\r\n        tipInputNumberLimit:\"El rango de aumento está limitado a 1-100\",\r\n\r\n        tipRowHeightLimit:\"La altura de la fila debe estar entre 0 ~ 545\",\r\n        tipColumnWidthLimit:\"El ancho de la columna debe estar entre 0 ~ 2038\",\r\n        pageInfoFull:'Total ${total}，página ${totalPage}，Se muestran todos los datos',\r\n    },\r\n    currencyDetail:{\r\n        RMB:'RMB',\r\n        USdollar:'Dólar US',\r\n        EUR:'EUR',\r\n        GBP:'GBP',\r\n        HK:'HK',\r\n        JPY:'JPY',\r\n        AlbanianLek:'Albanian Lek',\r\n        AlgerianDinar:'Algerian Dinar',\r\n        Afghani:'Afghani',\r\n        ArgentinePeso:'Argentine Peso',\r\n        UnitedArabEmiratesDirham:'United Arab Emirates Dirham',\r\n        ArubanFlorin:'Aruban Florin',\r\n        OmaniRial:'Omani Rial',\r\n        Azerbaijanimanat:'Azerbaijani manat',\r\n        EgyptianPound:'Egyptian Pound',\r\n        EthiopianBirr:'Ethiopian Birr',\r\n        AngolaKwanza:'Angola Kwanza',\r\n        AustralianDollar:'Australian Dollar',\r\n        Patacas:'Patacas',\r\n        BarbadosDollar:'Barbados Dollar',\r\n        PapuaNewGuineaKina:'Papua New Guinea Kina',\r\n        BahamianDollar:'Bahamian Dollar',\r\n        PakistanRupee:'Pakistan Rupee',\r\n        ParaguayanGuarani:'Paraguayan Guarani',\r\n        BahrainiDinar:'Bahraini Dinar',\r\n        PanamanianBalboa:'Panamanian Balboa',\r\n        Brazilianreal:'Brazilian real',\r\n        Belarusianruble:'Belarusian ruble',\r\n        BermudianDollar:'Bermudian Dollar',\r\n        BulgarianLev:'Bulgarian Lev',\r\n        IcelandKrona:'Iceland Krona',\r\n        BosniaHerzegovinaConvertibleMark:'Bosnia-Herzegovina Convertible Mark',\r\n        PolishZloty:'Polish Zloty',\r\n        Boliviano:'Boliviano',\r\n        BelizeDollar:'Belize Dollar',\r\n        BotswanaPula:'Botswana Pula',\r\n        NotDannuzhamu:'Not Dannuzhamu',\r\n        BurundiFranc:'Burundi Franc',\r\n        NorthKoreanWon:'North Korean Won',\r\n        DanishKrone:'Danish Krone',\r\n        EastCaribbeanDollar:'East Caribbean Dollar',\r\n        DominicaPeso:'Dominica Peso',\r\n        RussianRuble:'Russian Ruble',\r\n        EritreanNakfa:'Eritrean Nakfa',\r\n        CFAfranc:'CFA franc',\r\n        PhilippinePeso:'Philippine Peso',\r\n        FijiDollar:'Fiji Dollar',\r\n        CapeVerdeEscudo:'Cape Verde Escudo',\r\n        FalklandIslandsPound:'Falkland Islands Pound',\r\n        GambianDalasi:'Gambian Dalasi',\r\n        Congolesefranc:'Congolese franc',\r\n        ColombianPeso:'Colombian Peso',\r\n        CostaRicanColon:'Costa Rican Colon',\r\n        CubanPeso:'Cuban Peso',\r\n        Cubanconvertiblepeso:'Cuban convertible peso',\r\n        GuyanaDollar:'Guyana Dollar',\r\n        KazakhstanTenge:'Kazakhstan Tenge',\r\n        Haitiangourde:'Haitian gourde',\r\n        won:'won',\r\n        NetherlandsAntillesGuilder:'Netherlands Antilles Guilder',\r\n        Honduraslempiras:'Honduras lempiras',\r\n        DjiboutiFranc:'Djibouti Franc',\r\n        KyrgyzstanSom:'Kyrgyzstan Som',\r\n        GuineaFranc:'Guinea Franc',\r\n        CanadianDollar:'Canadian Dollar',\r\n        GhanaianCedi:'Ghanaian Cedi',\r\n        Cambodianriel:'Cambodian riel',\r\n        CzechKoruna:'Czech Koruna',\r\n        ZimbabweDollar:'Zimbabwe Dollar',\r\n        QatariRiyal:'Qatari Riyal',\r\n        CaymanIslandsDollar:'Cayman Islands Dollar',\r\n        Comorianfranc:'Comorian franc',\r\n        KuwaitiDinar:'Kuwaiti Dinar',\r\n        CroatianKuna:'Croatian Kuna',\r\n        KenyanShilling:'Kenyan Shilling',\r\n        LesothoLoti:'Lesotho Loti',\r\n        LaoKip:'Lao Kip',\r\n        LebanesePound:'Lebanese Pound',\r\n        Lithuanianlitas:'Lithuanian litas',\r\n        LibyanDinar:'Libyan Dinar',\r\n        LiberianDollar:'Liberian Dollar',\r\n        RwandaFranc:'Rwanda Franc',\r\n        RomanianLeu:'Romanian Leu',\r\n        MalagasyAriary:'Malagasy Ariary',\r\n        MaldivianRufiyaa:'Maldivian Rufiyaa',\r\n        MalawiKwacha:'Malawi Kwacha',\r\n        MalaysianRinggit:'Malaysian Ringgit',\r\n        MacedoniawearingDinar:'Macedonia wearing Dinar',\r\n        MauritiusRupee:'Mauritius Rupee',\r\n        MauritanianOuguiya:'Mauritanian Ouguiya',\r\n        MongolianTugrik:'Mongolian Tugrik',\r\n        BangladeshiTaka:'Bangladeshi Taka',\r\n        PeruvianNuevoSol:'Peruvian Nuevo Sol',\r\n        MyanmarKyat:'Myanmar Kyat',\r\n        MoldovanLeu:'Moldovan Leu',\r\n        MoroccanDirham:'Moroccan Dirham',\r\n        MozambiqueMetical:'Mozambique Metical',\r\n        MexicanPeso:'Mexican Peso',\r\n        NamibianDollar:'Namibian Dollar',\r\n        SouthAfricanRand:'South African Rand',\r\n        SouthSudanesePound:'South Sudanese Pound',\r\n        NicaraguaCordoba:'Nicaragua Cordoba',\r\n        NepaleseRupee:'Nepalese Rupee',\r\n        NigerianNaira:'Nigerian Naira',\r\n        NorwegianKrone:'Norwegian Krone',\r\n        GeorgianLari:'Georgian Lari',\r\n        RMBOffshore:'RMB (Offshore)',\r\n        SwedishKrona:'Swedish Krona',\r\n        SwissFranc:'Swiss Franc',\r\n        SerbianDinar:'Serbian Dinar',\r\n        SierraLeone:'Sierra Leone',\r\n        SeychellesRupee:'Seychelles Rupee',\r\n        SaudiRiyal:'Saudi Riyal',\r\n        SaoTomeDobra:'Sao Tome Dobra',\r\n        SaintHelenapound:'Saint Helena pound',\r\n        SriLankaRupee:'Sri Lanka Rupee',\r\n        SwazilandLilangeni:'Swaziland Lilangeni',\r\n        SudanesePound:'Sudanese Pound',\r\n        Surinamesedollar:'Surinamese dollar',\r\n        SolomonIslandsDollar:'Solomon Islands Dollar',\r\n        SomaliShilling:'Somali Shilling',\r\n        TajikistanSomoni:'Tajikistan Somoni',\r\n        PacificFranc:'Pacific Franc',\r\n        ThaiBaht:'Thai Baht',\r\n        TanzanianShilling:'Tanzanian Shilling',\r\n        TonganPaanga:\"Tongan Pa'anga\",\r\n        TrinidadandTobagoDollar:'Trinidad and Tobago Dollar',\r\n        TunisianDinar:'Tunisian Dinar',\r\n        TurkishLira:'Turkish Lira',\r\n        VanuatuVatu:'Vanuatu Vatu',\r\n        GuatemalanQuetzal:'Guatemalan Quetzal',\r\n        CommissionBolivar:'Commission Bolivar',\r\n        BruneiDollar:'Brunei Dollar',\r\n        UgandanShilling:'Ugandan Shilling',\r\n        UkrainianHryvnia:'Ukrainian Hryvnia',\r\n        UruguayanPeso:'Uruguayan Peso',\r\n        Uzbekistansom:'Uzbekistan som',\r\n        WesternSamoaTala:'Western Samoa Tala',\r\n        SingaporeDollar:'Singapore Dollar',\r\n        NT:'NT',\r\n        NewZealandDollar:'New Zealand Dollar',\r\n        HungarianForint:'Hungarian Forint',\r\n        SyrianPound:'Syrian Pound',\r\n        JamaicanDollar:'Jamaican Dollar',\r\n        ArmenianDram:'Armenian Dram',\r\n        YemeniRial:'Yemeni Rial',\r\n        IraqiDinar:'Iraqi Dinar',\r\n        IranianRial:'Iranian Rial',\r\n        NewIsraeliShekel:'New Israeli Shekel',\r\n        IndianRupee:'Indian Rupee',\r\n        IndonesianRupiah:'Indonesian Rupiah',\r\n        JordanianDinar:'Jordanian Dinar',\r\n        VND:'VND',\r\n        ZambianKwacha:'Zambian Kwacha',\r\n        GibraltarPound:'Gibraltar Pound',\r\n        ChileanPeso:'Chilean Peso',\r\n        CFAFrancBEAC:'CFA Franc BEAC'\r\n    },\r\n    defaultFmt:[\r\n        { \"text\": 'Automático', \"value\": \"General\", \"example\": \"\" },\r\n        { \"text\": 'Texto', \"value\": \"@\", \"example\": \"\" },\r\n        { \"text\": \"\", \"value\": \"partir\", \"example\": \"\" },\r\n        { \"text\": 'Número', \"value\": \"##0.00\", \"example\": \"1000.12\" },\r\n        { \"text\": 'Porcentaje', \"value\": \"#0.00%\", \"example\": \"12.21%\" },\r\n        { \"text\": 'Científico', \"value\": \"0.00E+00\", \"example\": \"1.01E+5\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": 'Contabilidad', \"value\": \"¥(0.00)\", \"example\": \"¥(1200.09)\" },\r\n\r\n\r\n        { \"text\": 'Moneda', \"value\": \"¥0.00\", \"example\": \"¥1200.09\" },\r\n\r\n\r\n        { \"text\": \"\", \"value\": \"partir\", \"example\": \"\" },\r\n        { \"text\": 'Fecha', \"value\": \"yyyy-MM-dd\", \"example\": \"2017-11-29\" },\r\n        { \"text\": 'Hora', \"value\": \"hh:mm AM/PM\", \"example\": \"3:00 PM\" },\r\n        { \"text\": 'Hora 24H', \"value\": \"hh:mm\", \"example\": \"15:00\" },\r\n        { \"text\": 'Fecha Hora', \"value\": \"yyyy-MM-dd hh:mm AM/PM\", \"example\": \"2017-11-29 3:00 PM\" },\r\n        { \"text\": 'Fecha Hora 24 H', \"value\": \"yyyy-MM-dd hh:mm\", \"example\": \"2017-11-29 15:00\" },\r\n        { \"text\": \"\", \"value\": \"partir\", \"example\": \"\" },\r\n        { \"text\": 'Formatos personalizados', \"value\": \"fmtOtherSelf\", \"example\": \"más\" }\r\n    ],\r\n    dateFmtList:[\r\n        {\r\n            \"name\": \"1930-08-05\",\r\n            \"value\": \"yyyy-MM-dd\"\r\n        },\r\n        {\r\n            \"name\": \"1930/8/5\",\r\n            \"value\": \"yyyy/MM/dd\"\r\n        },\r\n        {\r\n            \"name\": \"08-05\",\r\n            \"value\": \"MM-dd\"\r\n        },\r\n        {\r\n            \"name\": \"8-5\",\r\n            \"value\": \"M-d\"\r\n        },\r\n        {\r\n            \"name\": \"13:30:30\",\r\n            \"value\": \"h:mm:ss\"\r\n        },\r\n        {\r\n            \"name\": \"13:30\",\r\n            \"value\": \"h:mm\"\r\n        },\r\n        {\r\n            \"name\": \"PM 01:30\",\r\n            \"value\": 'AM/PM hh:mm'\r\n        },\r\n        {\r\n            \"name\": \"PM 1:30\",\r\n            \"value\": 'AM/PM h:mm'\r\n        },\r\n        {\r\n            \"name\": \"PM 1:30:30\",\r\n            \"value\": 'AM/PM h:mm:ss'\r\n        },\r\n        {\r\n            \"name\": \"08-05 PM 01:30\",\r\n            \"value\": \"MM-dd AM/PM hh:mm\"\r\n        }\r\n    ],\r\n    fontFamily:{\r\n        MicrosoftYaHei:\"YaHei\",\r\n    },\r\n    fontarray: [\"Times New Roman\",\"Arial\",\"Tahoma\",\"Verdana\"],\r\n    fontjson: {\"times new roman\":0,\"arial\":1,\"tahoma\":2,\"verdana\":3},\r\n    border:{\r\n        borderTop:'borderTop',\r\n        borderBottom:'borderBottom',\r\n        borderLeft:'borderLeft',\r\n        borderRight:'borderRight',\r\n        borderNone:'borderNone',\r\n        borderAll:'borderAll',\r\n        borderOutside:'borderOutside',\r\n        borderInside:'borderInside',\r\n        borderHorizontal:'borderHorizontal',\r\n        borderVertical:'borderVertical',\r\n        borderColor:'borderColor',\r\n        borderSize:'borderSize',\r\n    },\r\n    merge:{\r\n        mergeAll:\"Unir todo\",\r\n        mergeV:\"Verticalmente\",\r\n        mergeH:\"Horizontalmente\",\r\n        mergeCancel:\"Separar\",\r\n        overlappingError:\"No se pueden fusionar áreas superpuestas\",\r\n        partiallyError:\"No se puede realizar esta operación en celdas parcialmente unidas\",\r\n    },\r\n    align:{\r\n        left:\"izquierda\",\r\n        center:\"centro\",\r\n        right:\"derecha\",\r\n\r\n        top:\"Arriba\",\r\n        middle:\"Centro\",\r\n        bottom:\"Abajo\",\r\n    },\r\n    textWrap:{\r\n        \"overflow\":\"Desbordar\",\r\n        \"wrap\":\"Ajustar\",\r\n        \"clip\":\"Cortar\",\r\n    },\r\n    rotation:{\r\n        \"none\":\"Ninguno\",\r\n        \"angleup\":\"Ladear Arriba\",\r\n        \"angledown\":\"Ladear Abajo\",\r\n        \"vertical\":\"Apilar Verticalmente\",\r\n        \"rotationUp\":\"Rotar Arriba\",\r\n        \"rotationDown\":\"Rotar Abajo\"\r\n    },\r\n    freezen:{\r\n        default:\"Fijar\",\r\n        freezenRow:\"Primera Fila\",\r\n        freezenColumn:\"Primera Columna\",\r\n        freezenRC:\"Ambas\",\r\n        freezenRowRange:\"Fijar rango filas\",\r\n        freezenColumnRange:\"Fijar rango columnas\",\r\n        freezenRCRange:\"Fijar ambos rangos\",\r\n        freezenCancel:\"Cancelar\",\r\n\r\n        noSeletionError:\"No hay rango para seleccionar\",\r\n        rangeRCOverErrorTitle: \"Recordatorio de congelación\",\r\n        rangeRCOverError: \"El panel de congelación excede el rango visible y puede causar que no funcione correctamente. Reinicie el área de congelación.\"\r\n    },\r\n    sort:{\r\n        \"asc\":\"Ascendente \",\r\n        \"desc\":\"Descendente \",\r\n        \"custom\":\"Ordenación personalizada\",\r\n\r\n        \"hasTitle\":\"Los datos tienen una fila de encabezado\",\r\n        \"sortBy\":\"Ordenar por\",\r\n        \"addOthers\":\"Añadir otra columna de ordenación\",\r\n        \"close\":\"cerrar\",\r\n        \"confirm\":\"ordenar\",\r\n\r\n        \"columnOperation\":\"Columna\",\r\n        \"secondaryTitle\":\"y después por\",\r\n\r\n        \"sortTitle\":\"Ordenar rango\",\r\n\r\n        \"sortRangeTitle\":\"Ordenar rango de\",\r\n        \"sortRangeTitleTo\":\"a\",\r\n\r\n\r\n        \"noRangeError\":\"No se puede realizar esta operación en múltiples áreas de selección, selecciona un solo rango e intenta nuevamente\",\r\n        \"mergeError\":\"Hay celdas combinadas en la selección, ¡esta operación no se puede realizar!\",\r\n        \"columnSortMergeError\":\"La ordenación de las columnas se extiende a toda la selección de la tabla. Esta operación no puede realizarse si hay celdas fusionadas. Utilice la función de clasificación de la barra de herramientas.\",\r\n    },\r\n    filter:{\r\n       filter:\"crear filtro\",\r\n\r\n       sortByAsc:\"Ordenar A-Z\",\r\n       sortByDesc:\"Ordenar Z-A\",\r\n       filterByColor:\"Filtrar por color\",\r\n       filterByCondition:\"Filtrar por condición\",\r\n       filterByValues:\"Filtrar por valores\",\r\n\r\n       filiterInputNone:\"Ninguno\",\r\n\r\n       filiterInputTip:\"Introduce valor de filtro\",\r\n       filiterRangeStart:\"\",\r\n       filiterRangeStartTip:\"Valor para fórmula\",\r\n       filiterRangeEnd:\"e\",\r\n       filiterRangeEndTip:\"Valor para fórmula\",\r\n\r\n       filterValueByAllBtn:\"Seleccionar todos\",\r\n       filterValueByClearBtn:\"Limpiar\",\r\n       filterValueByInverseBtn:\"Invertir\",\r\n       filterValueByTip:\"filtrar por valores\",\r\n       filterConform:\"Confirmar\",\r\n       filterCancel:\"Cancelar\",\r\n       clearFilter:\"Quitar filtro\",\r\n\r\n       conditionNone:\"Ninguno\",\r\n       conditionCellIsNull: \"Está vacío\",\r\n       conditionCellNotNull: \"No está vacío\",\r\n       conditionCellTextContain: \"El texto contiene\",\r\n       conditionCellTextNotContain: \"El texto no contiene\",\r\n       conditionCellTextStart: \"El texto empieza con\",\r\n       conditionCellTextEnd: \"El texto termina con\",\r\n       conditionCellTextEqual: \"El texto es exactamente\",\r\n       conditionCellDateEqual: \"La fecha es\",\r\n       conditionCellDateBefore: \"La fecha es anterior\",\r\n       conditionCellDateAfter: \"La fecha es posterior\",\r\n       conditionCellGreater: \"Mayor que\",\r\n       conditionCellGreaterEqual: \"Mayor o igual que\",\r\n       conditionCellLess: \"Menor que\",\r\n       conditionCellLessEqual: \"Menor o igual que\",\r\n       conditionCellEqual: \"Es igual a\",\r\n       conditionCellNotEqual: \"No es igual a\",\r\n       conditionCellBetween: \"Está entre\",\r\n       conditionCellNotBetween: \"No está entre\",\r\n\r\n        filiterMoreDataTip:\"¡Gran cantidad de datos! por favor espera\",\r\n        filiterMonthText:\"Mes\",\r\n        filiterYearText:\"Año\",\r\n        filiterByColorTip:\"Filtrar por color de celda\",\r\n        filiterByTextColorTip:\"Filtrar por color de fuente\",\r\n        filterContainerOneColorTip:\"Esta columna contiene solo un color\",\r\n        filterDateFormatTip:\"Format fecha\",\r\n\r\n        valueBlank:\"(Nulo)\",\r\n        mergeError:\"Hay celdas combinadas en la selección del filtro, ¡esta operación no se puede realizar!\",\r\n    },\r\n    rightclick: {\r\n        copy: 'Copiar',\r\n        copyAs: 'Copiar como',\r\n        paste: 'Pegar',\r\n        insert: 'Insertar',\r\n        delete: 'Eliminar',\r\n        deleteCell: 'Eliminar celda',\r\n        deleteSelected: 'Eliminar seleccionado ',\r\n        hide: 'Esconder',\r\n        hideSelected: 'Esconder seleccionado ',\r\n        showHide: 'Mostrar ocultos ',\r\n        to: 'Hacia',\r\n        left: 'Izquierda',\r\n        right: 'Derecha',\r\n        top: 'Arriba',\r\n        bottom: 'Abajo',\r\n        moveLeft: 'Mover izquierda',\r\n        moveUp: 'Mover arriba',\r\n        add: 'Añadir',\r\n        row: 'Fila',\r\n        column: 'Columna',\r\n        width: 'Ancho',\r\n        height: 'Alto',\r\n        number: 'Número',\r\n        confirm: 'Confirmar',\r\n        orderAZ: 'Ordenar A-Z',\r\n        orderZA: 'Ordenar Z-A',\r\n        clearContent: 'Limpiar contenido',\r\n        matrix: 'Operación de Matriz',\r\n        sortSelection: 'Ordenar',\r\n        filterSelection: 'Filtrar',\r\n        chartGeneration: 'Crear gráfico',\r\n        firstLineTitle: 'título primera línea',\r\n        untitled: 'sin título',\r\n        array1: 'Matriz unidimensional',\r\n        array2: 'Matriz bidimensional',\r\n        array3: 'Matrices multidimensionales',\r\n        diagonal: 'Diagonal',\r\n        antiDiagonal: 'Anti-diagonal',\r\n        diagonalOffset: 'Desplazamiento Diagonal',\r\n        offset: 'Desplazamiento',\r\n        boolean: 'Booleana',\r\n        flip: 'Voltear',\r\n        upAndDown: 'Arriba y abajo',\r\n        leftAndRight: 'Izquierda y derecha',\r\n        clockwise: 'Sentido horario',\r\n        counterclockwise: 'Sentido anti-horario',\r\n        transpose: 'Transponer',\r\n        matrixCalculation: 'Cálculo de matrices',\r\n        plus: 'Suma',\r\n        minus: 'Resta',\r\n        multiply: 'Multiplicación',\r\n        divided: 'División',\r\n        power: 'Exponenciación',\r\n        root: 'Raíz Cuadrada',\r\n        log: 'Logaritmo',\r\n        delete0: 'Eliminar valores nulos en ambos extremos',\r\n        removeDuplicate: 'Eliminar valores duplicados',\r\n        byRow: 'Por fila',\r\n        byCol: 'Por columna',\r\n        generateNewMatrix: 'Generar nueva matriz',\r\n\r\n    },\r\n    comment:{\r\n        \"insert\":\"Insertar\",\r\n        \"edit\":\"Editar\",\r\n        \"delete\":\"Elimiar\",\r\n        \"showOne\":\"Mostrar/Ocular\",\r\n        \"showAll\":\"Mostrar/Ocular Todo\"\r\n    },\r\n    screenshot:{\r\n        screenshotTipNoSelection:\"Selecciona el alcance de la captura de pantalla\",\r\n        screenshotTipTitle:\"¡Advertencia!\",\r\n        screenshotTipHasMerge:\"Esta operación no se puede realizar en celdas combinadas\",\r\n        screenshotTipHasMulti:\"Esta operación no se puede realizar en varios rangos de selección\",\r\n        screenshotTipSuccess:\"Exitoso\",\r\n        screenshotImageName:\"Captura de pantalla\",\r\n\r\n        downLoadClose:\"Cerrar\",\r\n        downLoadCopy:\"Copiar al portapapeles\",\r\n        downLoadBtn:\"Descargar\",\r\n        browserNotTip:\"no es compatible con el navegador IE.\",\r\n        rightclickTip:\"Haz clic con el botón derecho en la imagen y selecciona \\\"copiar\\\"\",\r\n        successTip:\"Con éxito (si falla el pegado, haz clic con el botón derecho en la imagen para \\\"copiar imagen\\\")\",\r\n    },\r\n    splitText:{\r\n        splitDelimiters:\"Delimitadores\",\r\n        splitOther:\"Otros\",\r\n        splitContinueSymbol:\"Los separadores consecutivos se tratan como uno solo\",\r\n        splitDataPreview:\"Previsualizar\",\r\n        splitTextTitle:\"Partir texto\",\r\n        splitConfirmToExe:\"Ya hay datos aquí, ¿quieres reemplazarlos?\",\r\n\r\n        tipNoMulti: \"No se puede realizar esta operación en varias áreas de selección, selecciona una única área y vuelve a intentarlo\",\r\n        tipNoMultiColumn: \"Solo se puede convertir una columna de datos a la vez. El área seleccionado puede tener varias filas, pero no varias columnas. Vuelve a intentarlo después de seleccionar un solo rango de columnas\",\r\n    },\r\n    imageText:{\r\n        imageSetting: 'Configuración de imagen',\r\n        close: 'Cerrar',\r\n        conventional: 'Convencional',\r\n        moveCell1: 'Mover y cambiar el tamaño de las celdas',\r\n        moveCell2: 'Mover y no cambiar el tamaño de la celda',\r\n        moveCell3: 'No mover ni cambiar el tamaño de la celda',\r\n        fixedPos: 'Posición fija',\r\n        border: 'Borde',\r\n        width: 'Ancho',\r\n        radius: 'Radio',\r\n        style: 'Estilo',\r\n        solid: 'Sólido',\r\n        dashed: 'Discontinua',\r\n        dotted: 'Punteado',\r\n        double: 'Doble',\r\n        color: 'Color',\r\n    },\r\n    punctuation:{\r\n        \"tab\":\"Tabulación\",\r\n        \"semicolon\":\"punto y coma\",\r\n        \"comma\":\"coma\",\r\n        \"space\":\"espacio\",\r\n\r\n    },\r\n    findAndReplace:{\r\n        find:\"Encontrar\",\r\n        replace:\"Reemplazar\",\r\n        goto:\"Ir a\",\r\n        location:\"Ubicación\",\r\n        formula:\"Fórmula\",\r\n        date:\"Fecha\",\r\n        number:\"Número\",\r\n        string:\"Texto\",\r\n        error:\"Error\",\r\n        condition:\"Condición\",\r\n        rowSpan:\"Intervalo de filas\",\r\n        columnSpan:\"Intervalo de columnas\",\r\n        locationExample:\"Ubicación\",\r\n        lessTwoRowTip:\"Selecciona al menos dos filas\",\r\n        lessTwoColumnTip:\"Selecciona al menos dos columnas\",\r\n\r\n        findTextbox:\"Encontrar Contenido\",\r\n        replaceTextbox:\"Reemplazar Contenido\",\r\n\r\n        regexTextbox:\"Expresión Regular\",\r\n        wholeTextbox:\"Palabra entera\",\r\n        distinguishTextbox:\"Distingue mayúsculas y minúsculas\",\r\n\r\n        allReplaceBtn:\"Reemplazar Todo\",\r\n        replaceBtn:\"Reemplazar\",\r\n        allFindBtn:\"Encontrar Todo\",\r\n        findBtn:\"Encontrar siguiente\",\r\n\r\n        noFindTip:\"No se encontró el contenido\",\r\n        modeTip:\"Esta operación no está disponible en este modo\",\r\n\r\n        searchTargetSheet:\"Hoja\",\r\n        searchTargetCell:\"Celda\",\r\n        searchTargetValue:\"Valor\",\r\n\r\n        searchInputTip:\"Introduce el contenido de la búsqueda\",\r\n\r\n        noReplceTip:\"No hay nada que reemplazar\",\r\n        noMatchTip:\"No se encontraron coincidencias\",\r\n\r\n        successTip:\"${xlength} elementos encontrados\",\r\n\r\n        locationConstant:\"Constante\",\r\n        locationFormula:\"Fórmula\",\r\n        locationDate:\"Fecha\",\r\n        locationDigital:\"Número\",\r\n        locationString:\"Texto\",\r\n        locationBool:\"Lógicos\",\r\n        locationError:\"Error\",\r\n        locationNull:\"Nulo\",\r\n        locationCondition:\"Formato condicional\",\r\n        locationRowSpan:\"Intervalo fila\",\r\n        locationColumnSpan:\"Intervalo columna\",\r\n\r\n        locationTiplessTwoRow:\"Selecciona al menos dos filas\",\r\n        locationTiplessTwoColumn:\"Selecciona al menos dos columnas\",\r\n        locationTipNotFindCell:\"Celda no encontrada\"\r\n    },\r\n    sheetconfig: {\r\n        delete: 'Eliminar',\r\n        copy: 'Copiar',\r\n        rename: 'Renombrar',\r\n        changeColor: 'Cambiar color',\r\n        hide: 'Ocultar',\r\n        unhide: 'Mostrar',\r\n        moveLeft: 'Mover izquierda',\r\n        moveRight: 'Mover derecja',\r\n        resetColor: 'Reiniciar color',\r\n        cancelText: 'Cancelar',\r\n        chooseText: 'Confirmar color',\r\n\r\n        tipNameRepeat:\"¡El nombre de la página de la pestaña no se puede repetir! Revísalo\",\r\n        noMoreSheet:\"El libro de trabajo contiene al menos una hoja de trabajo visual. Para eliminar la hoja de trabajo seleccionada, inserta una nueva hoja de trabajo o muestra una hoja de trabajo oculta\",\r\n        confirmDelete:\"¿Estás seguro de eliminar\",\r\n        redoDelete:\"Se puede deshacer con Ctrl+Z\",\r\n        noHide:\"No se puede ocultar, al menos conserva una etiqueta de hoja\",\r\n        chartEditNoOpt:\"¡Esta operación no está permitida en el modo de edición de gráficos!\",\r\n        sheetNameSpecCharError:\"El nombre no puede contener:[ ] : \\ ? * / ' \\\"\",\r\n        sheetNamecannotIsEmptyError:\"El nombre de la hoja no puede estar vacío\"\r\n    },\r\n    conditionformat: {\r\n        conditionformat_greaterThan: 'Conditionformat-GreaterThan',\r\n        conditionformat_greaterThan_title: 'Dar formato a celdas mayores que',\r\n        conditionformat_lessThan: 'Conditionformat-LessThan',\r\n        conditionformat_lessThan_title: 'Dar formato a celdas más pequeñas que',\r\n        conditionformat_betweenness: 'Conditionformat-Betweenness',\r\n        conditionformat_betweenness_title: 'Dar formato a celdas con valores entre',\r\n        conditionformat_equal: 'Conditionformat-Equal',\r\n        conditionformat_equal_title: 'Dar formato a celdas iguales a',\r\n        conditionformat_textContains: 'Conditionformat-TextContains',\r\n        conditionformat_textContains_title: 'Dar formato a las celdas que contienen el siguiente texto',\r\n        conditionformat_occurrenceDate: 'Conditionformat-OccurrenceDate',\r\n        conditionformat_occurrenceDate_title: 'Dar formato a celdas que contienen las siguientes fechas',\r\n        conditionformat_duplicateValue: 'Conditionformat-DuplicateValue',\r\n        conditionformat_duplicateValue_title: 'Dar formato a celdas que contienen los siguientes tipos de valores',\r\n        conditionformat_top10: 'Conditionformat-Top10',\r\n        conditionformat_top10_percent: 'Conditionformat-Top10%',\r\n        conditionformat_top10_title: 'Formatea las celdas con el valor más alto',\r\n        conditionformat_last10: 'Conditionformat-Last10',\r\n        conditionformat_last10_percent: 'Conditionformat-Last10%',\r\n        conditionformat_last10_title: 'Formatea las celdas con el valor más pequeño',\r\n        conditionformat_AboveAverage: 'Conditionformat-AboveAverage',\r\n        conditionformat_AboveAverage_title: 'Dar formato a celdas por encima del promedio',\r\n        conditionformat_SubAverage: 'Conditionformat-SubAverage',\r\n        conditionformat_SubAverage_title: 'Dar formato a celdas por debajo del promedio',\r\n        rule: 'Regla',\r\n        newRule: 'Nueva regla',\r\n        editRule: 'Editar regla',\r\n        deleteRule: 'Eliminar regla',\r\n        deleteCellRule: 'Eliminar regla de celda',\r\n        deleteSheetRule: 'Eliminar regla de hoja',\r\n        manageRules: 'Reglas administración',\r\n        showRules: 'Muestra sus reglas de formato',\r\n        highlightCellRules: 'Resaltar reglas de celda',\r\n        itemSelectionRules: 'Reglas de selección de elementos',\r\n        conditionformatManageRules: 'Administrador de reglas de formato condicional',\r\n        format: 'Formatear',\r\n        setFormat: 'Establecer formato',\r\n        setAs: 'Establecer como',\r\n        setAsByArea: 'Para el área seleccionada, establecer',\r\n        applyRange: 'Aplicar rango',\r\n        selectRange: 'Seleccionar rango de aplicación',\r\n        selectRange_percent: 'Porcentaje del rango seleccionado',\r\n        selectRange_average: 'Valor promedio del rango seleccionado',\r\n        selectRange_value: 'Valor en el rango seleccionado',\r\n        pleaseSelectRange: 'Selecciona el rango de aplicación',\r\n        selectDataRange: 'Seleccionar rango de datos',\r\n        selectCell: 'seleccionar celda',\r\n        pleaseSelectCell: 'Selecciona una celda',\r\n        pleaseSelectADate: 'Selecciona una fecha',\r\n        pleaseEnterInteger: 'Introduzca un número entero entre 1 y 1000',\r\n        onlySingleCell: 'Solo se puede hacer referencia a una sola celda',\r\n        conditionValueCanOnly: 'El valor de la condición solo puede ser un número o una sola celda',\r\n        ruleTypeItem1: 'Aplicar formato a todas las celdas según sus valores respectivos',\r\n        ruleTypeItem2: 'Solo formatear celdas que contengan',\r\n        ruleTypeItem2_title: 'Solo para celdas que cumplan las siguientes condiciones',\r\n        ruleTypeItem3: 'Aplicar formato solo a los números superiores o inferiores',\r\n        ruleTypeItem3_title: 'Es el valor en la siguiente clasificación',\r\n        ruleTypeItem4: 'Aplicar formato solo a los valores superiores o inferiores al promedio',\r\n        ruleTypeItem4_title: 'Es un valor que cumple las siguientes condiciones',\r\n        ruleTypeItem5: 'Aplicar formato solo a valores únicos o repetidos',\r\n        ruleTypeItem6: 'Use fórmulas para determinar qué celdas formatear',\r\n        formula: 'fórmula',\r\n        textColor: 'Color Texto',\r\n        cellColor: 'Color Celda',\r\n        confirm: 'Confirma',\r\n        confirmColor: 'Confirma color',\r\n        cancel: 'Cancela',\r\n        close: 'Cierra',\r\n        clearColorSelect: 'Limpiar selección de color',\r\n        sheet: 'Hoja',\r\n        currentSheet: 'Hoja actual',\r\n        dataBar: 'Barra de datos',\r\n        dataBarColor: 'Color barra de datos',\r\n        gradientDataBar_1: 'Barra de datos de degradado azul-blanco',\r\n        gradientDataBar_2: 'Barra de datos de degradado verde-blanco',\r\n        gradientDataBar_3: 'Barra de datos de degradado rojo-blanco',\r\n        gradientDataBar_4: 'Rayas de degradado de color naranja-blanco',\r\n        gradientDataBar_5: 'Rayas de degradado azul claro-blancas',\r\n        gradientDataBar_6: 'Barra de datos de degradado púrpura-blanco',\r\n        solidColorDataBar_1: 'Barra de datos azul',\r\n        solidColorDataBar_2: 'Barra de datos verde',\r\n        solidColorDataBar_3: 'Barra de datos roja',\r\n        solidColorDataBar_4: 'Barra de datos naranja',\r\n        solidColorDataBar_5: 'Barra de datos azul claro',\r\n        solidColorDataBar_6: 'Barra de datos púrpura',\r\n        colorGradation: 'Degradado de color',\r\n        colorGradation_1: 'Gradación de color verde-amarillo-rojo',\r\n        colorGradation_2: 'Gradación de color rojo-amarillo-verde',\r\n        colorGradation_3: 'Gradación de color verde-blanco-rojo',\r\n        colorGradation_4: 'Gradación de color rojo-blanco-verde',\r\n        colorGradation_5: 'Gradación de color azul-blanco-rojo',\r\n        colorGradation_6: 'Gradación de color rojo-blanco-azul',\r\n        colorGradation_7: 'Gradación de color blanco-rojo',\r\n        colorGradation_8: 'Gradación de color rojo-blanco',\r\n        colorGradation_9: 'Gradación de color verde-blanco',\r\n        colorGradation_10: 'Gradación de color blanco-verde',\r\n        colorGradation_11: 'Gradación de color verde-amarillo',\r\n        colorGradation_12: 'Gradación de color amarillo-verde',\r\n        icons: 'iconos',\r\n        pleaseSelectIcon: 'Haz clic para seleccionar un grupo de iconos:',\r\n        cellValue: 'Valor de celda',\r\n        specificText: 'Texto específico',\r\n        occurrence: 'Fecha',\r\n        greaterThan: 'Mayor que',\r\n        lessThan: 'Menor que',\r\n        between: 'Entre',\r\n        equal: 'Igual',\r\n        in: 'En',\r\n        between2: '',\r\n        contain: 'Contiene',\r\n        textContains: 'Texto contiene',\r\n        duplicateValue: 'Valor duplicado',\r\n        uniqueValue: 'Valor Unico',\r\n        top: 'Mejor',\r\n        top10: '10 mejores',\r\n        top10_percent: '10% mejores',\r\n        last: 'Ultimo',\r\n        last10: 'Ultimos 10',\r\n        last10_percent: 'Ultimos 10%',\r\n        oneself: '',\r\n        above: 'Encima',\r\n        aboveAverage: 'Encima media',\r\n        below: 'Debajo',\r\n        belowAverage: 'Debajo media',\r\n        all: 'Todos',\r\n        yesterday: 'Año a fecha',\r\n        today: 'Hoy',\r\n        tomorrow: 'Mañana',\r\n        lastWeek: 'Ultima semana',\r\n        thisWeek: 'Esta semana',\r\n        lastMonth: 'Ultimo mes',\r\n        thisMonth: 'Este mes',\r\n        lastYear: 'Ultimo año',\r\n        thisYear: 'Este año',\r\n        last7days: 'Ultimos 7 días',\r\n        last30days: 'Ultimos 30 días',\r\n        next7days: 'Siguientes 7 días',\r\n        next30days: 'Siguientes 30 días',\r\n        next60days: 'Siguientes 60 días',\r\n        chooseRuleType: 'Elige el tipo de regla',\r\n        editRuleDescription: 'Editar descripción de regla',\r\n        newFormatRule: 'Nueva regla de formato',\r\n        editFormatRule: 'Editar regla de formato',\r\n        formatStyle: 'Estilo',\r\n        fillType: 'Rellenar',\r\n        color: 'Color',\r\n        twocolor: 'Dos colores',\r\n        tricolor: 'Tricolor',\r\n        multicolor: 'Multi color',\r\n        grayColor: 'Color gris',\r\n        gradient: 'Gradiente',\r\n        solid: 'Sólido',\r\n        maxValue: 'Valor máximo',\r\n        medianValue: 'Valor mediano',\r\n        minValue: 'Valor mínimo',\r\n        direction: 'Dirección',\r\n        threeWayArrow: 'Flecha de tres direcciones',\r\n        fourWayArrow: 'Flecha de cuatro direcciones',\r\n        fiveWayArrow: 'Flecha de cinco direcciones',\r\n        threeTriangles: 'Tres triángulos',\r\n        shape: 'Forma',\r\n        threeColorTrafficLight: 'Semáforo de tres colores',\r\n        fourColorTrafficLight: 'Semáforo de cuatro colores',\r\n        threeSigns: 'Tres signos',\r\n        greenRedBlackGradient: 'Gradiente verde-rojo-negro',\r\n        rimless: 'Sin aros',\r\n        bordered: 'Bordeado',\r\n        mark: 'Marcar',\r\n        threeSymbols: 'Tres símbolos',\r\n        tricolorFlag: 'Bandera tricolor',\r\n        circled: 'Rodeado',\r\n        noCircle: 'Sin círculo',\r\n        grade: 'Grado',\r\n        grade4: '4 Grado',\r\n        grade5: '5 Grado',\r\n        threeStars: '3 Estrellas',\r\n        fiveQuadrantDiagram: 'Diagrama de cinco cuadrantes',\r\n        fiveBoxes: '5 Cajas',\r\n    },\r\n    dataVerification: {\r\n        cellRange: 'Rango celdas',\r\n        selectCellRange: 'Haz clic para seleccionar un rango de celdas',\r\n        selectCellRange2: 'Selecciona un rango de celdas',\r\n        verificationCondition: 'Condición de verificación',\r\n        allowMultiSelect: \"Permitir selección múltiple\",\r\n        dropdown: 'lista desplegable',\r\n        checkbox: 'Casilla de verificación',\r\n        number: 'Número',\r\n        number_integer: 'Número entero',\r\n        number_decimal: 'Número decimal',\r\n        text_content: 'Contenido texto',\r\n        text_length: 'Longitud texto',\r\n        date: 'Fecha',\r\n        validity: 'Eficacia',\r\n        placeholder1: 'Introduce las opciones, separadas por comas, como 1,2,3,4,5',\r\n        placeholder2: 'Introduce contenido',\r\n        placeholder3: 'Valor numérico, como 10',\r\n        placeholder4: 'Introduce el texto especificado',\r\n        placeholder5: 'Introduce el mensaje que se muestra cuando se selecciona la celda',\r\n        selected: 'Seleccionado',\r\n        notSelected: 'No seleccionado',\r\n        between: 'Entre',\r\n        notBetween: 'No entre',\r\n        equal: 'Iqual',\r\n        notEqualTo: 'No iqual a',\r\n        moreThanThe: 'Más que el',\r\n        lessThan: 'Menos que',\r\n        greaterOrEqualTo: 'Mayor o igual a',\r\n        lessThanOrEqualTo: 'Menor o igual a',\r\n        include: 'Incluir',\r\n        exclude: 'Excluir',\r\n        earlierThan: 'Antes de',\r\n        noEarlierThan: 'No antes de',\r\n        laterThan: 'Después de',\r\n        noLaterThan: 'No después de',\r\n        identificationNumber: 'Número de identificación',\r\n        phoneNumber: 'Número de teléfono',\r\n        remote: 'Opción de adquisición remota automática',\r\n        prohibitInput: 'Prohibir la entrada cuando los datos de entrada no son válidos',\r\n        hintShow: 'Mostrar mensaje cuando se selecciona la celda',\r\n        deleteVerification: 'Eliminar verificación',\r\n        tooltipInfo1: 'La opción de la lista desplegable no puede estar vacía',\r\n        tooltipInfo2: 'El contenido de la casilla de verificación no puede estar vacío',\r\n        tooltipInfo3: 'El valor ingresado no es un tipo numérico',\r\n        tooltipInfo4: 'El segundo valor no puede ser menor que el primero',\r\n        tooltipInfo5: 'El contenido del texto no puede estar vacío',\r\n        tooltipInfo6: 'El valor ingresado no es una fecha',\r\n        tooltipInfo7: 'La segunda fecha no puede ser menor que la primera',\r\n        textlengthInteger: 'La longitud del texto debe ser un entero mayor o igual a 0',\r\n    },\r\n    formula:{\r\n        sum:\"Suma\",\r\n        average:\"Media\",\r\n        count:\"Contar\",\r\n        max:\"Máx\",\r\n        min:\"Mín\",\r\n        ifGenerate:\"Generador de fórmula SI\",\r\n        find:\"Aprender más\",\r\n\r\n        tipNotBelongToIf: \"¡Esta función de celda no pertenece a la fórmula SI!\",\r\n        tipSelectCell: \"Selecciona la celda para insertar la función\",\r\n\r\n        ifGenCompareValueTitle:\"Valor de comparación\",\r\n        ifGenSelectCellTitle:\"Haz click para seleccionar una celda\",\r\n        ifGenRangeTitle:\"Rango\",\r\n        ifGenRangeTo:\"a\",\r\n        ifGenRangeEvaluate:\"Evaluar rango\",\r\n        ifGenSelectRangeTitle:\"Haz click para seleccionar rango\",\r\n        ifGenCutWay:\"Forma particionado\",\r\n        ifGenCutSame:\"Mismo valor de particionado\",\r\n        ifGenCutNpiece:\"Particionar por N\",\r\n        ifGenCutCustom:\"Personalizado\",\r\n        ifGenCutConfirm:\"Confirma\",\r\n\r\n        ifGenTipSelectCell:\"Selecciona celdas\",\r\n        ifGenTipSelectCellPlace:\"Por favor selecciona celdas\",\r\n\r\n        ifGenTipSelectRange:\"Selecciona rango\",\r\n        ifGenTipSelectRangePlace:\"Por favor selecciona rango\",\r\n\r\n        ifGenTipNotNullValue:\"El valor de comparación no puede ser vacío!\",\r\n        ifGenTipLableTitile:\"Etiqueta\",\r\n        ifGenTipRangeNotforNull:\"El rango no puede quedar vacío!\",\r\n        ifGenTipCutValueNotforNull:\"El valor de partición no puede ser vacío!\",\r\n        ifGenTipNotGenCondition:\"No hay condiciones disponibles para la generación!\",\r\n    },\r\n    formulaMore:{\r\n        valueTitle:\"Valor\",\r\n        tipSelectDataRange:\"Selecciona rango de datos\",\r\n        tipDataRangeTile:\"Rango de datos\",\r\n        findFunctionTitle:\"Función de búsqueda\",\r\n        tipInputFunctionName:\"Nombre o breve descripción de la función\",\r\n\r\n        \"Array\":\"Vector\",\r\n        \"Database\":\"Base de datos\",\r\n        \"Date\":\"Fecha\",\r\n        \"Engineering\":\"Ingeniería\",\r\n        \"Filter\":\"Filtro\",\r\n        \"Financial\":\"Financiero\",\r\n        \"luckysheet\":\"Luckysheet\",\r\n        \"other\":\"Otro\",\r\n        \"Logical\":\"Lógica\",\r\n        \"Lookup\":\"Búsqueda\",\r\n        \"Math\":\"Matemático\",\r\n        \"Operator\":\"Operadores\",\r\n        \"Parser\":\"Compilador\",\r\n        \"Statistical\":\"Estadístico\",\r\n        \"Text\":\"Texto\",\r\n        \"dataMining\":\"Minería de datos\",\r\n\r\n        \"selectFunctionTitle\":\"Selecciona una función\",\r\n        \"calculationResult\":\"Resultado\",\r\n\r\n        tipSuccessText:\"Exito\",\r\n        tipParamErrorText:\"Parámetro erróneo\",\r\n\r\n        \"helpClose\":\"Cerrar\",\r\n        \"helpCollapse\":\"Recoger\",\r\n        \"helpExample\":\"Ejemplo\",\r\n        \"helpAbstract\":\"Resumen\",\r\n\r\n        \"execfunctionError\":'Error en la fórmula',\r\n        \"execfunctionSelfError\":'La fórmula no puede hacer referencia a su propia celda',\r\n        \"execfunctionSelfErrorResult\":'La fórmula no puede hacer referencia a su propia celda, lo que dará lugar a resultados de cálculo inexactos',\r\n\r\n        \"allowRepeatText\":\"Repetir\",\r\n        \"allowOptionText\":\"Opción\",\r\n\r\n        \"selectCategory\":\"O selecciona una categoría\",\r\n    },\r\n    drag:{\r\n        noMerge: \"No se puede realizar esta operación en celdas combinadas\",\r\n        afectarPivot: \"¡Este cambio no se puede realizar en la celda seleccionada porque afectará a la tabla dinámica!\",\r\n        noMulti: \"No se puede realizar esta operación en varias áreas de selección, selecciona una sola área\",\r\n        noPaste: \"No se puede pegar este contenido aquí, selecciona una celda en el área de pegado e intenta pegar nuevamente\",\r\n        noPartMerge: \"No se puede realizar esta operación en celdas parcialmente fusionadas\",\r\n\r\n        inputCorrect:\"Introduce el valor correcto\",\r\n        notLessOne:\"El número de filas y columnas no puede ser inferior a 1\",\r\n        offsetColumnLessZero:\"¡La columna de desplazamiento no puede ser negativa!\",\r\n\r\n        pasteMustKeybordAlert:\"在表格中进行复制粘贴: Ctrl + C 进行复制, Ctrl + V 进行粘贴, Ctrl + X 进行剪切\",\r\n        pasteMustKeybordAlertHTMLTitle:\"在表格中进行复制粘贴\",\r\n        pasteMustKeybordAlertHTML:\"<span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + C</span>&nbsp;&nbsp;进行复制<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + V</span>&nbsp;&nbsp;进行粘贴<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + X</span>&nbsp;&nbsp;进行剪切\",\r\n    },\r\n    paste: {\r\n        warning:\"Advertencia\",\r\n        errorNotAllowMulti:\"No se puede realizar esta operación en varias áreas de selección, selecciona un solo rango y vuelve a intentarlo\",\r\n        errorNotAllowMerged: \"No se pueden realizar cambios parciales en las celdas fusionadas\",\r\n    },\r\n    pivotTable:{\r\n        title:\"Tabla Dinámica\",\r\n        closePannel:\"Cerrar\",\r\n        editRange:\"Rango\",\r\n        tipPivotFieldSelected:\"Selecciona los campos\",\r\n        tipClearSelectedField:\"Limpiar todos los campos\",\r\n        btnClearSelectedField:\"Limpiar\",\r\n        btnFilter:\"Filtrar\",\r\n        titleRow:\"Fila\",\r\n        titleColumn:\"Columna\",\r\n        titleValue:\"Valor\",\r\n        tipShowColumn: \"Los campos de estadísticas se muestran como columnas\",\r\n        tipShowRow: \"Los campos de estadísticas se muestran como filas\",\r\n\r\n        titleSelectionDataRange:\"Selecciona rango\",\r\n        titleDataRange:\"Rango de datos\",\r\n\r\n        valueSum:\"SUMA\",\r\n\r\n        valueStatisticsSUM:\"Suma\",\r\n        valueStatisticsCOUNT:\"Contar\",\r\n        valueStatisticsCOUNTA:\"Contar A\",\r\n        valueStatisticsCOUNTUNIQUE:\"Contar Distintos\",\r\n        valueStatisticsAVERAGE:\"Media\",\r\n        valueStatisticsMAX:\"Máx\",\r\n        valueStatisticsMIN:\"Mín\",\r\n        valueStatisticsMEDIAN:\"Mediana\",\r\n        valueStatisticsPRODUCT:\"Producto\",\r\n        valueStatisticsSTDEV:\"Desviación Estándar\",\r\n\r\n        valueStatisticsSTDEVP:\"Stdevp\",\r\n        valueStatisticslet:\"Varianza\",\r\n        valueStatisticsVARP:\"VarP\",\r\n\r\n        errorNotAllowEdit: \"¡Esta operación está prohibida en el modo sin edición!\",\r\n        errorNotAllowMulti: \"No se puede realizar esta operación en varias áreas de selección, selecciona un solo rango y vuelve a intentarlo\",\r\n        errorSelectRange: \"Seleccione el rango de la nueva tabla dinámica\",\r\n        errorIsDamage: \"¡Los datos de origen de esta tabla dinámica están dañados!\",\r\n        errorNotAllowPivotData: \"¡No se puede seleccionar la tabla dinámica como datos de origen!\",\r\n        errorSelectionRange: \"¡La selección falló, rango de entrada incorrecto!\",\r\n        errorIncreaseRange: \"¡Por favor, expande el rango seleccionado!\",\r\n\r\n        titleAddColumn:\"Añadir columna a la tabla dinámica\",\r\n        titleMoveColumn:\"Muever la columna a la celda en blanco de abajo\",\r\n        titleClearColumnFilter:\"Quitar el filtro de esta columna\",\r\n        titleFilterColumn:\"Filtro\",\r\n\r\n        titleSort:\"Ordenar\",\r\n        titleNoSort:\"No Ordenar\",\r\n        titleSortAsc:\"ASC\",\r\n        titleSortDesc:\"DESC\",\r\n        titleSortBy:\"Ordenar por\",\r\n        titleShowSum:\"Mostrar total\",\r\n        titleStasticTrue:\"Sí\",\r\n        titleStasticFalse:\"No\",\r\n    },\r\n    dropCell:{\r\n        copyCell:\"Copiar\",\r\n        sequence:\"Secuencia\",\r\n        onlyFormat:\"Solo formato\",\r\n        noFormat:\"Sin formato\",\r\n        day:\"Día\",\r\n        workDay:\"Día Laborable\",\r\n        month:\"Mes\",\r\n        year:\"Año\",\r\n        chineseNumber:\"Números Chinos\",\r\n    },\r\n    imageCtrl:{\r\n        borderTile:\"Color de borde de imagen\",\r\n        borderCur:\"Color\",\r\n    },\r\n    protection:{\r\n        protectiontTitle:\"Protección\",\r\n        enterPassword:\"Introduce una contraseña (opcional)\",\r\n        enterHintTitle:\"Preguntar cuando la edición está prohibida (opcional)\",\r\n        enterHint:\"La celda o el gráfico que estás intentando cambiar se encuentra en una hoja de trabajo protegida. Si quieres cambiarlo, desprotege la hoja de trabajo. Es posible que tengas que ingresar una contraseña\",\r\n        swichProtectionTip:\"Protege la hoja y el contenido de las celdas bloqueadas\",\r\n        authorityTitle:\"Permitir a los usuarios de esta hoja:\",\r\n        selectLockedCells:\"Selecciona celdas bloqueadas\",\r\n        selectunLockedCells:\"Selecciona celdas desbloqueadas\",\r\n        formatCells:\"Formatear celdas\",\r\n        formatColumns:\"Formatear columnas\",\r\n        formatRows:\"Formatear filas\",\r\n        insertColumns:\"Insertar columnas\",\r\n        insertRows:\"Insertar filas\",\r\n        insertHyperlinks:\"Insertar enlaces\",\r\n        deleteColumns:\"Eliminar columnas\",\r\n        deleteRows:\"Eliminar filas\",\r\n        sort:\"Ordenar\",\r\n        filter:\"Filtrar\",\r\n        usePivotTablereports:\"Usar informes de tabla dinámica\",\r\n        editObjects:\"Editar objetos\",\r\n        editScenarios:\"Editar escenarios\",\r\n\r\n        allowRangeTitle:\"Permitir a los usuarios del rango:\",\r\n        allowRangeAdd:\"Nuevo...\",\r\n\r\n        allowRangeAddTitle:\"Título\",\r\n        allowRangeAddSqrf:\"Referencia\",\r\n        selectCellRange: 'Haz clic para seleccionar un rango de celdas',\r\n        selectCellRangeHolder:\"Rango de celdas\",\r\n        allowRangeAddTitlePassword:\"Contraseña\",\r\n        allowRangeAddTitleHint:\"Pregunta\",\r\n        allowRangeAddTitleHintTitle:\"Preguntar cuando hay una contraseña (opcional)\",\r\n        allowRangeAddtitleDefault:\"Nombre del rango de entrada\",\r\n\r\n        rangeItemDblclick:\"Haz doble clic para editar\",\r\n        rangeItemHasPassword:\"Tiene contraseña\",\r\n\r\n        rangeItemErrorTitleNull:\"El título es nulo\",\r\n        rangeItemErrorRangeNull:\"La referencia es nula\",\r\n        rangeItemErrorRange:\"La reference tiene un error\",\r\n\r\n        validationTitle:\"Validación de contraseña\",\r\n        validationTips:\"Hay que ingresar una contraseña para desbloquear la protección de la hoja de trabajo\",\r\n        validationInputHint:\"Introduce una contraseña\",\r\n\r\n        checkPasswordNullalert:\"Contraseña requerida!\",\r\n        checkPasswordWrongalert:\"¡Contraseña incorrecta. Por favor, prueba de nuevo!\",\r\n\r\n        checkPasswordSucceedalert:\"Desbloqueo conseguido!\",\r\n        defaultRangeHintText:\"La celda está protegida con contraseña.\",\r\n        defaultSheetHintText:\"La celda o el gráfico están en una hoja de trabajo protegida. Para realizar cambios, desprotege la hoja de trabajo. Es posible que tengas que ingresar una contraseña\",\r\n    },\r\n    cellFormat:{\r\n        cellFormatTitle:\"Formatear celdas\",\r\n        protection:\"Protección\",\r\n        locked:\"Bloqueado\",\r\n        hidden:\"Escondido\",\r\n        protectionTips:\"Para bloquear celdas u ocultar fórmulas, protege la hoja de trabajo. En la barra de herramientas, haz clic en el botón Proteger hoja\",\r\n        tipsPart:\"Comprobado parcial\",\r\n        tipsAll:\"Todo seleccionado\",\r\n\r\n        selectionIsNullAlert:\"Se requiere una selección!\",\r\n        sheetDataIsNullAlert:\"error, no hay datos!\",\r\n\r\n    },\r\n    print:{\r\n        normalBtn:\"Normal\",\r\n        layoutBtn:\"Disposición de página\",\r\n        pageBtn:\"Previsualización de saltos de página\",\r\n\r\n        menuItemPrint:\"Imprimir (Ctrl+P)\",\r\n        menuItemAreas:\"Imprimir áreas\",\r\n        menuItemRows:\"Imprimir títulos de filas\",\r\n        menuItemColumns:\"Imprimir títulos de columnas\",\r\n    },\r\n    edit:{\r\n        typing:\"mecanografía\",\r\n    },\r\n    websocket:{\r\n        success: 'Éxito de la conexión de WebSocket',\r\n        refresh: 'Se produjo un error en la conexión de WebSocket, ¡actualice la página!',\r\n        wait: 'Se produjo un error en la conexión de WebSocket, ¡tenga paciencia!',\r\n        close: 'Conexión WebSocket cerrada',\r\n        contact: 'Ocurrió un error de comunicación con el servidor, actualice la página y vuelva a intentarlo; de lo contrario, comuníquese con el administrador.',\r\n        support: 'El navegador actual no es compatible con WebSocket',\r\n    },\r\n    exportXlsx:{\r\n        notice:'Configure el complemento de exportación',\r\n        serverError:'El servidor está en mantenimiento',\r\n        title: \"Exportar XLSX\",\r\n        range: \"alcance\",\r\n        currentSheet: \"Hoja de trabajo actual\",\r\n        allSheets: \"Todas las hojas\",\r\n    }\r\n  };\r\n"
  },
  {
    "path": "src/locale/locale.js",
    "content": "import en from './en'\r\nimport zh from './zh'\r\nimport es from './es'\r\nimport zh_tw from './zh_tw'\r\nimport Store from '../store';\r\n\r\nexport const locales = {en,zh,es,zh_tw}\r\n\r\nfunction locale(){\r\n    return locales[Store.lang];\r\n}\r\n\r\nexport default locale;"
  },
  {
    "path": "src/locale/zh.js",
    "content": "export default {\r\n    functionlist: {\r\n        SUMIF: {\r\n            d: \"对范围中符合指定条件的值求和。\",\r\n            a: \"对范围中符合指定条件的值求和。\",\r\n            p: [\r\n                {\r\n                    name: \"范围\",\r\n                    detail: \"要根据条件进行检测的范围。\",\r\n                },\r\n                {\r\n                    name: \"条件\",\r\n                    detail:\r\n                        \"要应用于范围的模式或测试条件。\\n\\n如果范围包含的是要检测的文本，则条件必须为字符串。条件可以包含通配符，包括用于匹配单个字符的?或用于匹配零个或连续多个字符的*。要匹配问号星号本身，请在该字符前面加上波浪号(~)前缀（即~?和~*）。字符串条件必须用引号括起来。函数会检查范围中的每个单元格与条件是否相等或匹配（如果使用了通配符）。\\n\\n如果范围包含的是要检测的数字，则条件可以是字符串也可以是数字。如果给定的条件是一个数字，则检查范围中的每个单元格是否等于条件。另外，条件也可能是包含数字的字符串（也将对其进行相等检测），或者带有以下前缀的数字：=（检查是否相等）、>（检查范围单元格的值是否大于条件值）或<（检查范围单元格的值是否小于条件值）\",\r\n                },\r\n                {\r\n                    name: \"求和范围\",\r\n                    detail: \"要求和的范围（如果与范围不同）。\",\r\n                },\r\n            ],\r\n        },\r\n        TAN: {\r\n            d: \"返回已知角度的正切值。\",\r\n            a: \"返回已知角度的正切值。\",\r\n            p: [\r\n                {\r\n                    name: \"角度\",\r\n                    detail: \"要求其正切值的角度，以弧度表示。\",\r\n                },\r\n            ],\r\n        },\r\n        TANH: {\r\n            d: \"返回给定实数的双曲正切值。\",\r\n            a: \"返回给定实数的双曲正切值。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要计算其双曲正切值的实数。\",\r\n                },\r\n            ],\r\n        },\r\n        CEILING: {\r\n            d: \"将数值向上取整为最接近的指定因数的倍数。\",\r\n            a: \"将数值向上取整为最接近的指定因数的倍数。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要向上舍入的数值。\",\r\n                },\r\n                {\r\n                    name: \"因数\",\r\n                    detail: \"要将值舍入到此数的整数倍。\",\r\n                },\r\n            ],\r\n        },\r\n        ATAN: {\r\n            d: \"返回数值的反正切值，以弧度表示。\",\r\n            a: \"返回数值的反正切值\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要计算其反正切值的数值。\",\r\n                },\r\n            ],\r\n        },\r\n        ASINH: {\r\n            d: \"返回数值的反双曲正弦值。\",\r\n            a: \"返回数值的反双曲正弦值。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要计算其反双曲正弦值的数值。\",\r\n                },\r\n            ],\r\n        },\r\n        ABS: {\r\n            d: \"返回数值的绝对值。\",\r\n            a: \"返回数值的绝对值。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"要返回其绝对值的数。\",\r\n                },\r\n            ],\r\n        },\r\n        ACOS: {\r\n            d: \"返回数值的反余弦值，以弧度表示。\",\r\n            a: \"返回数值的反余弦值\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要计算其反余弦值的数值。必须介于-1和1之间，包括两端值。\",\r\n                },\r\n            ],\r\n        },\r\n        ACOSH: {\r\n            d: \"返回数值的反双曲余弦值。\",\r\n            a: \"返回数值的反双曲余弦值。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要计算其反双曲余弦值的数值。必须大于等于1。\",\r\n                },\r\n            ],\r\n        },\r\n        MULTINOMIAL: {\r\n            d: \"返回参数和的阶乘除以各参数阶乘的乘积后得到的值。\",\r\n            a: \"返回参数和的阶乘除以各参数阶乘的乘积后得到的值。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"用于计算的第一项数值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2\",\r\n                    detail: \"用于计算的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        ATANH: {\r\n            d: \"返回数值的反双曲正切值。\",\r\n            a: \"返回数值的反双曲正切值。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要计算其反双曲正切值的数值。必须介于-1和1之间（不包括-1和1）。\",\r\n                },\r\n            ],\r\n        },\r\n        ATAN2: {\r\n            d: \"以弧度为单位返回 x 轴与从原点 (0,0) 到指定坐标点 (`x`,`y`) 之间连线的夹角。\",\r\n            a: \"以弧度为单位返回 x 轴与从原点 (0,0) 到指定坐标点 (`x`,`y`) 之间连线的夹角。\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"要计算其与x轴夹角大小的线段的终点x坐标。\",\r\n                },\r\n                {\r\n                    name: \"y\",\r\n                    detail: \"要计算其与x轴夹角大小的线段的终点y坐标。\",\r\n                },\r\n            ],\r\n        },\r\n        COUNTBLANK: {\r\n            d: \"返回给定范围内的空单元格数。\",\r\n            a: \"返回给定范围内的空单元格数。\",\r\n            p: [\r\n                {\r\n                    name: \"范围\",\r\n                    detail: \"要统计空白单元格数量的范围。\",\r\n                },\r\n            ],\r\n        },\r\n        COSH: {\r\n            d: \"返回给定实数的双曲余弦值。\",\r\n            a: \"返回给定实数的双曲余弦值。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要计算其双曲余弦值的实数值。\",\r\n                },\r\n            ],\r\n        },\r\n        INT: {\r\n            d: \"将数值向下取整为小于或等于该数的最接近的整数。\",\r\n            a: \"将数值向下取整为小于或等于该数的最接近的整数。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要向下取整为最接近的整数的数值。\",\r\n                },\r\n            ],\r\n        },\r\n        ISEVEN: {\r\n            d: \"检查所提供的数值是否为偶数。\",\r\n            a: \"检查所提供的数值是否为偶数。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail:\r\n                        \"要验证其是否为偶数的数值。\\n\\n如果值为偶数或指向包含偶数的单元格的引用，ISEVEN将返回TRUE，否则返回FALSE。\",\r\n                },\r\n            ],\r\n        },\r\n        ISODD: {\r\n            d: \"检查所提供的数值是否为奇数。\",\r\n            a: \"检查所提供的数值是否为奇数。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail:\r\n                        \"要验证其是否为奇数的数值。\\n\\n如果值为奇数或指向包含奇数的单元格，ISODD将返回TRUE，否则返回FALSE。\",\r\n                },\r\n            ],\r\n        },\r\n        LCM: {\r\n            d: \"返回一个或多个整数的最小公倍数。\",\r\n            a: \"返回一个或多个整数的最小公倍数。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"要在求最小公倍数数的计算中检查其因数的第一项数值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2\",\r\n                    detail: \"[可选] - 在求最小公倍数时要考虑其因数的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        LN: {\r\n            d: \"返回数值以 e（欧拉数）为底的对数。\",\r\n            a: \"返回数值以 e（欧拉数）为底的对数。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要以 e 为底数计算其对数的值。\\n\\n值必须为正数。\",\r\n                },\r\n            ],\r\n        },\r\n        LOG: {\r\n            d: \"根据指定底数返回数字的对数。\",\r\n            a: \"根据指定底数返回数字的对数。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"想要计算其对数的正实数。\",\r\n                },\r\n                {\r\n                    name: \"底数\",\r\n                    detail: \"[可选] - 对数的底数。\",\r\n                },\r\n            ],\r\n        },\r\n        LOG10: {\r\n            d: \"返回数值以10为底的对数。\",\r\n            a: \"返回数值以10为底的对数。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要计算其以10为底的对数的数值。\\n\\n值必须为正值。\",\r\n                },\r\n            ],\r\n        },\r\n        MOD: {\r\n            d: \"返回两数相除的余数, 结果的符号与除数相同。\",\r\n            a: \"返回两数相除的余数。\",\r\n            p: [\r\n                {\r\n                    name: \"被除数\",\r\n                    detail: \"要将其相除以得到余数的数值。\",\r\n                },\r\n                {\r\n                    name: \"除数\",\r\n                    detail: \"用于除其他数的数值。\",\r\n                },\r\n            ],\r\n        },\r\n        MROUND: {\r\n            d: \"将数值取整为另一整数最接近的整数倍。\",\r\n            a: \"将数值取整为另一整数最接近的整数倍。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要取整为另一整数最接近的整数倍的数值。\",\r\n                },\r\n                {\r\n                    name: \"因数\",\r\n                    detail: \"值将取此因数的整数倍。\",\r\n                },\r\n            ],\r\n        },\r\n        ODD: {\r\n            d: \"将数值向上取整为最接近的奇整数。\",\r\n            a: \"将数值向上取整为最接近的奇整数。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail:\r\n                        \"要向上取整的数值，取整值为大于此值的最接近的奇数。\\n\\n如果值为负数，则将其取整为绝对值大于该值的相邻负奇数。\",\r\n                },\r\n            ],\r\n        },\r\n        SUMSQ: {\r\n            d: \"返回一组数值和/或单元格的平方总和。\",\r\n            a: \"返回一组数值和/或单元格的平方总和。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"要将其平方相加的第一个数值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 要将其平方与值1的平方相加的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        COMBIN: {\r\n            d: \"给定集合中的对象总数和要选择的对象数量，返回共有多少种不同选择方式。\",\r\n            a: \"给定集合中的对象总数和要选择的对象数量\",\r\n            p: [\r\n                {\r\n                    name: \"n\",\r\n                    detail: \"要从中进行选择的对象集合的大小。\",\r\n                },\r\n                {\r\n                    name: \"k\",\r\n                    detail: \"要选择的对象数量。\",\r\n                },\r\n            ],\r\n        },\r\n        SUM: {\r\n            d: \"返回一组数值和/或单元格的总和。\",\r\n            a: \"返回一组数值和/或单元格的总和。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"要相加的第一个数值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2\",\r\n                    detail: \"[可选] - 要相加的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        SUBTOTAL: {\r\n            d: \"使用指定的汇总函数，返回一系列纵向单元格的分类汇总。\",\r\n            a: \"使用指定的汇总函数\",\r\n            p: [\r\n                {\r\n                    name: \"函数代码\",\r\n                    detail:\r\n                        \"用于计算分类汇总的函数。\\n\\n1代表AVERAGE\\n\\n2代表COUNT\\n\\n3代表COUNTA\\n\\n4代表MAX\\n\\n5代表MIN\\n\\n6代表PRODUCT\\n\\n7代表STDEV\\n\\n8代表STDEVP\\n\\n9代表SUM\\n\\n10代表VAR\\n\\n11代表VARP\\n\\n通过在这些2位代码前附加10（对于1位代码）或1（对于2位代码），可以将隐藏值忽略。例如，102代表忽略隐藏单元格的COUNT，而110则代表忽略隐藏值的VAR。\",\r\n                },\r\n                {\r\n                    name: \"范围1\",\r\n                    detail: \"要计算分类汇总的第一个范围。\",\r\n                },\r\n                {\r\n                    name: \"范围2\",\r\n                    detail: \"[可选] - 要计算分类汇总的其他范围。\",\r\n                },\r\n            ],\r\n        },\r\n        ASIN: {\r\n            d: \"返回数值的反正弦值，以弧度表示。\",\r\n            a: \"返回数值的反正弦值\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要计算其反正弦值的数值。必须介于-1和1之间，包括两端值。\",\r\n                },\r\n            ],\r\n        },\r\n        COUNTIF: {\r\n            d: \"返回范围内满足某个条件的单元格的数量。\",\r\n            a: \"返回范围内满足某个条件的单元格的数量。\",\r\n            p: [\r\n                {\r\n                    name: \"范围\",\r\n                    detail: \"要根据条件进行检测的范围。\",\r\n                },\r\n                {\r\n                    name: \"条件\",\r\n                    detail:\r\n                        \"要应用于范围的模式或测试条件。\\n\\n如果范围包含的是要检测的文本，则条件必须为字符串。条件可以包含通配符，包括用于匹配单个字符的?或用于匹配零个或连续多个字符的*。要匹配问号星号本身，请在该字符前面加上波浪号(~)前缀（即~?和~*）。字符串条件必须用引号括起来。函数会检查范围中的每个单元格与条件是否相等或匹配（如果使用了通配符）。\\n\\n如果范围包含的是要检测的数字，则条件可以是字符串也可以是数字。如果给定的条件是一个数字，则检查范围中的每个单元格是否等于条件。另外，条件也可能是包含数字的字符串（也将对其进行相等检测），或者带有以下前缀的数字：=、>、>=、<或<=，这些条件将分别用于检查范围中的单元格是否等于、大于、大于等于、小于、小于等于条件值。\",\r\n                },\r\n            ],\r\n        },\r\n        RADIANS: {\r\n            d: \"将以度表示的角度值转换为弧度。\",\r\n            a: \"将以度表示的角度值转换为弧度。\",\r\n            p: [\r\n                {\r\n                    name: \"角度\",\r\n                    detail: \"要从度转换为弧度的角度。\",\r\n                },\r\n            ],\r\n        },\r\n        RAND: {\r\n            d: \"返回一个介于0和1之间（包括0但不包括1）的随机数。\",\r\n            a: \"返回一个介于0和1之间（包括0但不包括1）的随机数。\",\r\n            p: [],\r\n        },\r\n        COUNTUNIQUE: {\r\n            d: \"计算一列指定值和范围中不重复数值的个数。\",\r\n            a: \"计算一列指定值和范围中不重复数值的个数。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"要检查其是否唯一的第一个值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2\",\r\n                    detail: \"[可选] - 要检查是否唯一的其他值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        DEGREES: {\r\n            d: \"将以弧度表示的角度值转换为度。\",\r\n            a: \"将以弧度表示的角度值转换为度。\",\r\n            p: [\r\n                {\r\n                    name: \"角度\",\r\n                    detail: \"要从弧度转换为度的角度。\",\r\n                },\r\n            ],\r\n        },\r\n        ERFC: {\r\n            d: \"返回数值的互补高斯误差函数。\",\r\n            a: \"返回数值的互补高斯误差函数。\",\r\n            p: [\r\n                {\r\n                    name: \"z\",\r\n                    detail: \"要为其计算互补高斯误差函数的数值。\",\r\n                },\r\n            ],\r\n        },\r\n        EVEN: {\r\n            d: \"将数值向上取整为最接近的偶整数。\",\r\n            a: \"将数值向上取整为最接近的偶整数。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail:\r\n                        \"要向上取整的数值，取整值为大于此值的最接近的偶数。\\n\\n如果值为负数，则将其取整为绝对值大于该值的相邻负偶数。\",\r\n                },\r\n            ],\r\n        },\r\n        EXP: {\r\n            d: \"返回欧拉数 e (~2.718) 的指定次幂。\",\r\n            a: \"返回欧拉数 e (~2.718) 的指定次幂。\",\r\n            p: [\r\n                {\r\n                    name: \"指数\",\r\n                    detail: \"指定e的自乘幂次值。\",\r\n                },\r\n            ],\r\n        },\r\n        FACT: {\r\n            d: \"返回数值的阶乘。\",\r\n            a: \"返回数值的阶乘。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要计算并返回其阶乘的数字或对数字（所在单元格）的引用。\",\r\n                },\r\n            ],\r\n        },\r\n        FACTDOUBLE: {\r\n            d: \"返回数值的“双阶乘”。\",\r\n            a: \"返回数值的“双阶乘”。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要计算并返回其双阶乘的数字或对数字（所在单元格）的引用。\",\r\n                },\r\n            ],\r\n        },\r\n        PI: {\r\n            d: \"返回带有14位小数的 PI 值。\",\r\n            a: \"返回带有14位小数的 PI 值。\",\r\n            p: [],\r\n        },\r\n        FLOOR: {\r\n            d: \"将数值向下取整为指定因数的最接近的整数倍。\",\r\n            a: \"将数值向下取整为指定因数的最接近的整数倍。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要向下舍入为因数的最接近整数倍的数值。\",\r\n                },\r\n                {\r\n                    name: \"因数\",\r\n                    detail: \"要将值舍入到此数的整数倍。\\n\\n因数不得为0。\",\r\n                },\r\n            ],\r\n        },\r\n        GCD: {\r\n            d: \"返回一个或多个整数的最大公约数。\",\r\n            a: \"返回一个或多个整数的最大公约数。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"要在查找最大公约数的计算中检查其因数的第一项数值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2\",\r\n                    detail: \"[可选] - 在求最大公约数时要考虑其因数的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        RANDBETWEEN: {\r\n            d: \"返回介于两个整数之间（包括这两个整数）的随机数。\",\r\n            a: \"返回介于两个整数之间（包括这两个整数）的随机数。\",\r\n            p: [\r\n                {\r\n                    name: \"下界\",\r\n                    detail: \"随机值范围的下界。\",\r\n                },\r\n                {\r\n                    name: \"上界\",\r\n                    detail: \"随机值范围的上界。\",\r\n                },\r\n            ],\r\n        },\r\n        ROUND: {\r\n            d: \"将数字四舍五入到指定的位数。\",\r\n            a: \"将数字四舍五入到指定的位数。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要四舍五入的数字。\",\r\n                },\r\n                {\r\n                    name: \"位数\",\r\n                    detail:\r\n                        \"要进行四舍五入运算的位数。\\n\\n位数可以取负值，在这种情况下会将值的小数点左侧部分舍入到指定的位数。\",\r\n                },\r\n            ],\r\n        },\r\n        ROUNDDOWN: {\r\n            d: \"朝着零的方向将数字进行向下舍入。\",\r\n            a: \"朝着零的方向将数字进行向下舍入。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"需要向下舍入的任意实数。\",\r\n                },\r\n                {\r\n                    name: \"位数\",\r\n                    detail:\r\n                        \"要通过舍入达到的小数位数。\\n\\n位数可以取负值，在这种情况下会将值的小数点左侧部分舍入到指定的位数。\",\r\n                },\r\n            ],\r\n        },\r\n        ROUNDUP: {\r\n            d: \"朝着远离 0（零）的方向将数字进行向上舍入。\",\r\n            a: \"朝着远离 0（零）的方向将数字进行向上舍入。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要将其舍入为位数位数字的值，始终向上舍入。\",\r\n                },\r\n                {\r\n                    name: \"位数\",\r\n                    detail:\r\n                        \"要通过舍入达到的小数位数。\\n\\n位数可以取负值，在这种情况下会将值的小数点左侧部分舍入到指定的位数。\",\r\n                },\r\n            ],\r\n        },\r\n        SERIESSUM: {\r\n            d:\r\n                \"给定参数 x、n、m 和 a，返回幂级数的和 a1xn + a2x(n+m) + ... + aix(n+(i-1)m)，其中 i 为范围 a 中的项数。\",\r\n            a: \"给定参数 x、n、m 和 a\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"幂级数的输入值。随相应的近似类型而变，有可能为角度、指数或其他一些值。\",\r\n                },\r\n                {\r\n                    name: \"n\",\r\n                    detail: \"在幂级数中x的初始自乘幂次。\",\r\n                },\r\n                {\r\n                    name: \"m\",\r\n                    detail: \"x的幂次中的附加增量。\",\r\n                },\r\n                {\r\n                    name: \"a\",\r\n                    detail: \"包含幂级数系数的数组或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        SIGN: {\r\n            d: \"给定输入数值，如果为负返回-1；如果为正返回1；如果为零则返回0。\",\r\n            a: \"给定输入数值\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要返回其符号的数值。\",\r\n                },\r\n            ],\r\n        },\r\n        SIN: {\r\n            d: \"给定角度（以弧度表示），返回其正弦值。\",\r\n            a: \"给定角度（以弧度表示）\",\r\n            p: [\r\n                {\r\n                    name: \"角度\",\r\n                    detail: \"要返回其正弦值的角度，以弧度表示。\",\r\n                },\r\n            ],\r\n        },\r\n        SINH: {\r\n            d: \"返回给定实数的双曲正弦值。\",\r\n            a: \"返回给定实数的双曲正弦值。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要计算其双曲正弦值的实数值。\",\r\n                },\r\n            ],\r\n        },\r\n        SQRT: {\r\n            d: \"返回一个正数的正平方根。\",\r\n            a: \"返回一个正数的正平方根。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要计算其正平方根的数值。\\n\\n值必须为正数；如果为负，SQRT 将返回 #NUM! 错误。\",\r\n                },\r\n            ],\r\n        },\r\n        SQRTPI: {\r\n            d: \"返回 PI 与给定正数乘积的正平方根。\",\r\n            a: \"返回 PI 与给定正数乘积的正平方根。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail:\r\n                        \"要将其与 PI 相乘并返回该乘积的平方根的数值\\n\\n值必须为正数；如果为负数，SQRTPI 将返回 #NUM! 错误。\",\r\n                },\r\n            ],\r\n        },\r\n        GAMMALN: {\r\n            d: \"返回指定伽玛函数的以 e（欧拉数）为底的对数。\",\r\n            a: \"返回指定伽玛函数的以 e（欧拉数）为底的对数。\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"伽玛函数的输入值。返回的将是伽玛 (值) 的自然对数。\\n\\n值必须为正数。\",\r\n                },\r\n            ],\r\n        },\r\n        COS: {\r\n            d: \"返回给定角度的余弦值（角度以弧度表示）。\",\r\n            a: \"返回给定角度的余弦值（角度以弧度表示）。\",\r\n            p: [\r\n                {\r\n                    name: \"角度\",\r\n                    detail: \"要取其余弦值的角度，以弧度表示。\",\r\n                },\r\n            ],\r\n        },\r\n        TRUNC: {\r\n            d: \"截除指定有效位之外的部分，取数据的指定有效位。\",\r\n            a: \"截除指定有效位之外的部分\",\r\n            p: [\r\n                {\r\n                    name: \"值\",\r\n                    detail: \"要截取的数据。\",\r\n                },\r\n                {\r\n                    name: \"位数\",\r\n                    detail:\r\n                        \"[可选 - 默认值为0] - 小数点右侧要保留的有效位数。\\n\\n如果位数大于值中的有效位数，则将“值”原样返回。\\n\\n位数可以取负值，在这种情况下会将小数点左侧指定位数的值更改为零。小数点右侧的所有位数都会被舍弃。如果值的所有位都被更改为零，则TRUNC会返回0。\",\r\n                },\r\n            ],\r\n        },\r\n        QUOTIENT: {\r\n            d: \"返回以一个数除以另一个数所得的结果，不包含余数。\",\r\n            a: \"返回以一个数除以另一个数所得的结果\",\r\n            p: [\r\n                {\r\n                    name: \"被除数\",\r\n                    detail: \"要被除的数值。\",\r\n                },\r\n                {\r\n                    name: \"除数\",\r\n                    detail: \"用于除其他数的数值。\\n\\n除数不得为0。\",\r\n                },\r\n            ],\r\n        },\r\n        POWER: {\r\n            d: \"返回数值的指定次幂。\",\r\n            a: \"返回数值的指定次幂。\",\r\n            p: [\r\n                {\r\n                    name: \"底数\",\r\n                    detail: \"要计算其指数次幂的数值。\\n\\n如果底数为负，则指数必须为整数。\",\r\n                },\r\n                {\r\n                    name: \"指数\",\r\n                    detail: \"指定底数的自乘幂次值。\",\r\n                },\r\n            ],\r\n        },\r\n        SUMIFS: {\r\n            d: \"根据多项条件返回范围之和。\",\r\n            a: \"根据多项条件返回范围之和。\",\r\n            p: [\r\n                {\r\n                    name: \"求和范围\",\r\n                    detail: \"要对其求和的范围。\",\r\n                },\r\n                {\r\n                    name: \"条件范围1\",\r\n                    detail: \"要在哪个范围内检查条件1。\",\r\n                },\r\n                {\r\n                    name: \"条件1\",\r\n                    detail: \"要应用于条件范围1的模式或测试条件。\",\r\n                },\r\n                {\r\n                    name: \"条件范围2, 条件2...\",\r\n                    detail: \"[ 可选 ] - 要检查的其他范围和条件。\",\r\n                },\r\n            ],\r\n        },\r\n        GET_TARGET: {\r\n            d: \"查询目标数据。\",\r\n            a: \"查询目标数据。\",\r\n            p: [],\r\n        },\r\n        GET_AIRTABLE_DATA: {\r\n            d: \"查询AirTable数据。\",\r\n            a: \"查询AirTable数据。\",\r\n            p: [\r\n                {\r\n                    name: \"AirTable 地址\",\r\n                    detail: \"AirTable URL链接地址\",\r\n                },\r\n                {\r\n                    name: \"排序列\",\r\n                    detail: \"表示要排序的列的数字。\",\r\n                },\r\n                {\r\n                    name: \"是否升序\",\r\n                    detail: \"[可选] - 1 或 0 表示是否按升序对 `排序列` 进行排序。 0 按降序排列，1 按升序排列。\",\r\n                },\r\n            ],\r\n        },\r\n        ASK_AI: {\r\n            d: \"向AI提问。\",\r\n            a: \"向AI提问。\",\r\n            p: [\r\n                {\r\n                    name: \"问题\",\r\n                    detail: \"向AI咨询，你想得到的数据。\",\r\n                },\r\n                {\r\n                    name: \"条件范围\",\r\n                    detail: \"要在哪个范围内处理数据。\",\r\n                },\r\n            ],\r\n        },\r\n        COUNTIFS: {\r\n            d: \"根据多项条件返回范围中的单元格数量。\",\r\n            a: \"根据多项条件返回范围中的单元格数量。\",\r\n            p: [\r\n                {\r\n                    name: \"条件范围1\",\r\n                    detail: \"要在哪个范围内检查条件1。\",\r\n                },\r\n                {\r\n                    name: \"条件1\",\r\n                    detail: \"要应用于条件范围1的模式或测试条件。\",\r\n                },\r\n                {\r\n                    name: \"条件范围2, 条件2...\",\r\n                    detail: \"[ 可选 ] - 要检查的其他范围和条件，可重复。\",\r\n                },\r\n            ],\r\n        },\r\n        PRODUCT: {\r\n            d: \"返回将一组数相乘所得的结果。\",\r\n            a: \"返回将一组数相乘所得的结果。\",\r\n            p: [\r\n                {\r\n                    name: \"乘数1\",\r\n                    detail: \"用于计算乘积的第一个数值或范围。\",\r\n                },\r\n                {\r\n                    name: \"乘数2 ... 乘数30\",\r\n                    detail: \"[可选] - 要相乘的其他数值。\",\r\n                },\r\n            ],\r\n        },\r\n        HARMEAN: {\r\n            d: \"计算数据集的调和平均值。\",\r\n            a: \"计算数据集的调和平均值。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"样本中的第一项值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 数据集中包含的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        HYPGEOMDIST: {\r\n            d:\r\n                \"返回超几何分布。 如果已知样本量、总体成功次数和总体大小，则 HYPGEOM.DIST 返回样本取得已知成功次数的概率。\",\r\n            a: \"返回超几何分布。\",\r\n            p: [\r\n                {\r\n                    name: \"Sample_s\",\r\n                    detail: \"样本中成功的次数。\",\r\n                },\r\n                {\r\n                    name: \"Number_sample\",\r\n                    detail: \"样本量。\",\r\n                },\r\n                {\r\n                    name: \"Population_s\",\r\n                    detail: \"总体中成功的次数。\",\r\n                },\r\n                {\r\n                    name: \"Number_pop\",\r\n                    detail: \"总体大小。\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"决定函数形式的逻辑值。\\n\\n如果 cumulative 为 TRUE()，则 HYPGEOM.DIST 返回累积分布函数；\\n\\n如果为 FALSE()，则返回概率密度函数。\",\r\n                },\r\n            ],\r\n        },\r\n        INTERCEPT: {\r\n            d: \"计算数据集的线性回归方程直线与 Y 轴的相交点 (x=0) 的 y 值。\",\r\n            a: \"计算数据集的线性回归方程直线与 Y 轴的相交点 (x=0) 的 y 值。\",\r\n            p: [\r\n                {\r\n                    name: \"数据_y\",\r\n                    detail: \"代表因变量数据数组或矩阵的范围。\",\r\n                },\r\n                {\r\n                    name: \"数据_x\",\r\n                    detail: \"代表自变量数据数组或矩阵的范围。\",\r\n                },\r\n            ],\r\n        },\r\n        KURT: {\r\n            d: \"计算数据集的峭度，该指标指示数据集（分布）的形态，尤其是该形态的陡峭程度。\",\r\n            a: \"计算数据集的峭度\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"数据集中的第一个值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 数据集中包含的其他值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        LARGE: {\r\n            d: \"返回数据集中第 n 个最大元素，n 由用户指定。\",\r\n            a: \"返回数据集中第 n 个最大元素\",\r\n            p: [\r\n                {\r\n                    name: \"数据\",\r\n                    detail: \"包含相关数据集的数组或范围。\",\r\n                },\r\n                {\r\n                    name: \"n\",\r\n                    detail:\r\n                        \"要返回的元素的排行位置（从大到小顺序）。\\n\\n例如，将n设为4将使LARGE返回数据中排名第4的最大元素。\",\r\n                },\r\n            ],\r\n        },\r\n        STDEVA: {\r\n            d: \"基于样本计算标准偏差，将文本取值为0。\",\r\n            a: \"基于样本计算标准偏差\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"样本中的第一项值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2,…\",\r\n                    detail: \"[可选] - 样本中包含的其他值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        STDEVP: {\r\n            d: \"基于样本总体计算标准偏差。\",\r\n            a: \"基于样本总体计算标准偏差。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"数据集中的第一个值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 数据集中包含的其他值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        GEOMEAN: {\r\n            d: \"计算数据集的几何平均值。\",\r\n            a: \"计算数据集的几何平均值。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"样本中的第一项值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 数据集中包含的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        RANK_EQ: {\r\n            d: \"返回指定值在数据集中的排名。如果相同的值在数据集中存在多项，则返回其中的最高排名。\",\r\n            a: \"返回指定值在数据集中的排名。如果相同的值在数据集中存在多项，则返回其中的最高排名。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"要确定其排名的值。\",\r\n                },\r\n                {\r\n                    name: \"ref\",\r\n                    detail: \"包含相关数据集的数组或范围。\",\r\n                },\r\n                {\r\n                    name: \"order\",\r\n                    detail: \"[可选 - 默认为按降序 (FALSE()) ] - 要按升序还是按降序考虑“data”中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        RANK_AVG: {\r\n            d: \"返回指定值在数据集中的排名。如果相同的值在数据集中存在多项，则返回这些项排名的平均值。\",\r\n            a: \"返回指定值在数据集中的排名。如果相同的值在数据集中存在多项，则返回这些项排名的平均值。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"要确定其排名的值。\",\r\n                },\r\n                {\r\n                    name: \"ref\",\r\n                    detail: \"包含相关数据集的数组或范围。\",\r\n                },\r\n                {\r\n                    name: \"order\",\r\n                    detail: \"[可选 - 默认为按降序 (FALSE()) ] - 要按升序还是按降序考虑“data”中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        PERCENTRANK_EXC: {\r\n            d: \"以百分数形式返回指定值在给定数据集中的百分比排名（介于0和1之间，不包括两端值）。\",\r\n            a: \"以百分数形式返回指定值在给定数据集中的百分比排名（介于0和1之间，不包括两端值）。\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"包含相关数据集的数组或范围。\",\r\n                },\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"要确定其百分比排位的值。\",\r\n                },\r\n                {\r\n                    name: \"significance\",\r\n                    detail: \"[可选 - 默认值为 3] - 要在计算中使用的有效位数。\",\r\n                },\r\n            ],\r\n        },\r\n        PERCENTRANK_INC: {\r\n            d: \"以百分比形式返回指定值在给定数据集中的百分比排名（介于0和1之间，包括两端值）。\",\r\n            a: \"以百分比形式返回指定值在给定数据集中的百分比排名（介于0和1之间，包括两端值）。\",\r\n            p: [\r\n                {\r\n                    name: \"data\",\r\n                    detail: \"包含相关数据集的数组或范围。\",\r\n                },\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"要确定其百分比排位的值。\",\r\n                },\r\n                {\r\n                    name: \"significance\",\r\n                    detail: \"[可选 - 默认值为 3] - 要在计算中使用的有效位数。\",\r\n                },\r\n            ],\r\n        },\r\n        FORECAST: {\r\n            d: \"基于数据集的线性回归，计算指定 x 的预期 y 值。\",\r\n            a: \"基于数据集的线性回归\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"x轴上用于预测的值。\",\r\n                },\r\n                {\r\n                    name: \"数据_y\",\r\n                    detail: \"代表因变量数据数组或矩阵的范围。\",\r\n                },\r\n                {\r\n                    name: \"数据_x\",\r\n                    detail: \"代表自变量数据数组或矩阵的范围。\",\r\n                },\r\n            ],\r\n        },\r\n        FISHERINV: {\r\n            d: \"返回指定数值的 Fisher 逆变换。\",\r\n            a: \"返回指定数值的 Fisher 逆变换。\",\r\n            p: [\r\n                {\r\n                    name: \"y\",\r\n                    detail: \"要计算其Fisher逆变换的数值。\",\r\n                },\r\n            ],\r\n        },\r\n        FISHER: {\r\n            d: \"返回指定数值的 Fisher 变换。\",\r\n            a: \"返回指定数值的 Fisher 变换。\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"要计算其Fisher变换的数值。\",\r\n                },\r\n            ],\r\n        },\r\n        MODE_SNGL: {\r\n            d: \"返回数据集中出现次数最多的值。\",\r\n            a: \"返回数据集中出现次数最多的值。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"计算模式时要检查的第一个值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 在计算模式时要考虑的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        WEIBULL_DIST: {\r\n            d: \"给定形状和尺度，返回韦伯分布函数（或韦伯累积分布函数）的值。\",\r\n            a: \"给定形状和尺度\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"WEIBULL 分布函数的输入值。\",\r\n                },\r\n                {\r\n                    name: \"alpha\",\r\n                    detail: \"Weibull 分布函数的形状参数。\\n\\nalpha 值必须大于 0。\",\r\n                },\r\n                {\r\n                    name: \"beta\",\r\n                    detail: \"Weibull 分布函数的尺度参数。\\n\\nbeta 值必须大于 0。\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail: \"TRUE() 表示使用累积分布函数，FALSE() 则表示使用概率密度函数。\",\r\n                },\r\n            ],\r\n        },\r\n        COUNT: {\r\n            d: \"返回数据集中数值的个数。\",\r\n            a: \"返回数据集中数值的个数。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"计数时要检查的第一个值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 在计数时要检查的其他值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        COUNTA: {\r\n            d: \"返回数据集中值的数量。\",\r\n            a: \"返回数据集中值的数量。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"计数时要检查的第一个值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 在计数时要检查的其他值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        AVEDEV: {\r\n            d: \"计算数据与数据集均值之间的偏差大小的平均值。\",\r\n            a: \"计算数据与数据集均值之间的偏差大小的平均值。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"样本中的第一项值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 样本中包含的其他值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        AVERAGE: {\r\n            d: \"返回数据集的算术平均值，对文本忽略不计。\",\r\n            a: \"返回数据集的算术平均值\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"计算平均值时用到的第一个数值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 在计算平均值时要考虑的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        AVERAGEA: {\r\n            d: \"返回数据集的算术平均值。\",\r\n            a: \"返回数据集的算术平均值。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"计算平均值时用到的第一个数值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 在计算平均值时要考虑的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        BINOM_DIST: {\r\n            d: \"返回一元二项式分布的概率。\",\r\n            a: \"返回一元二项式分布的概率。\",\r\n            p: [\r\n                {\r\n                    name: \"number_s\",\r\n                    detail: \"试验的成功次数。\",\r\n                },\r\n                {\r\n                    name: \"trials\",\r\n                    detail: \"独立检验的次数。\",\r\n                },\r\n                {\r\n                    name: \"probability_s\",\r\n                    detail: \"任一给定检验的成功概率。\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail: \"是否使用二项式累积分布。\",\r\n                },\r\n            ],\r\n        },\r\n        BINOM_INV: {\r\n            d: \"计算累积二项式分布大于或等于指定条件的最小值。\",\r\n            a: \"计算累积二项式分布大于或等于指定条件的最小值。\",\r\n            p: [\r\n                {\r\n                    name: \"trials\",\r\n                    detail: \"贝努利试验次数。\",\r\n                },\r\n                {\r\n                    name: \"probability_s\",\r\n                    detail: \"任一次给定检验的成功概率。\",\r\n                },\r\n                {\r\n                    name: \"alpha\",\r\n                    detail: \"期望的临界概率。\",\r\n                },\r\n            ],\r\n        },\r\n        CONFIDENCE_NORM: {\r\n            d: \"计算正态分布的置信区间的一半宽度。\",\r\n            a: \"计算正态分布的置信区间的一半宽度。\",\r\n            p: [\r\n                {\r\n                    name: \"alpha\",\r\n                    detail:\r\n                        \"用来计算置信水平的显著性水平。\\n\\n置信水平等于 100*(1 - alpha)%，亦即，如果 alpha 为 0.05，则置信水平为 95%。\",\r\n                },\r\n                {\r\n                    name: \"standard_dev\",\r\n                    detail: \"数据区域的总体标准偏差。\",\r\n                },\r\n                {\r\n                    name: \"size\",\r\n                    detail: \"样本总量的大小。\",\r\n                },\r\n            ],\r\n        },\r\n        CORREL: {\r\n            d: \"计算给定数据集的皮尔逊积矩相关系数 r。\",\r\n            a: \"计算给定数据集的皮尔逊积矩相关系数 r。\",\r\n            p: [\r\n                {\r\n                    name: \"数据_y\",\r\n                    detail: \"代表因变量数据数组或矩阵的范围。\",\r\n                },\r\n                {\r\n                    name: \"数据_x\",\r\n                    detail: \"代表自变量数据数组或矩阵的范围。\",\r\n                },\r\n            ],\r\n        },\r\n        COVARIANCE_P: {\r\n            d: \"计算数据集的总体协方差。\",\r\n            a: \"计算数据集的总体协方差。\",\r\n            p: [\r\n                {\r\n                    name: \"数据_x\",\r\n                    detail: \"代表自变量数据数组或矩阵的范围。\",\r\n                },\r\n                {\r\n                    name: \"数据_y\",\r\n                    detail: \"代表因变量数据数组或矩阵的范围。\",\r\n                },\r\n            ],\r\n        },\r\n        COVARIANCE_S: {\r\n            d: \"计算数据集的样本协方差。\",\r\n            a: \"计算数据集的样本协方差。\",\r\n            p: [\r\n                {\r\n                    name: \"数据_x\",\r\n                    detail: \"代表自变量数据数组或矩阵的范围。\",\r\n                },\r\n                {\r\n                    name: \"数据_y\",\r\n                    detail: \"代表因变量数据数组或矩阵的范围。\",\r\n                },\r\n            ],\r\n        },\r\n        DEVSQ: {\r\n            d: \"基于样本计算其偏差的平方和。\",\r\n            a: \"基于样本计算其偏差的平方和。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"样本中的第一项值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 样本中包含的其他值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        EXPON_DIST: {\r\n            d: \"返回带有指定 Lambda 和指定值的指数分布函数的值。\",\r\n            a: \"返回带有指定 Lambda 和指定值的指数分布函数的值。\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"指数分布函数的输入值。\",\r\n                },\r\n                {\r\n                    name: \"lambda\",\r\n                    detail: \"用于指定指数分布函数的 lambda 值。\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail: \"是否使用指数累积分布。\",\r\n                },\r\n            ],\r\n        },\r\n        AVERAGEIF: {\r\n            d: \"根据条件返回范围的平均值。\",\r\n            a: \"根据条件返回范围的平均值。\",\r\n            p: [\r\n                {\r\n                    name: \"criteria_range\",\r\n                    detail: \"要对其检查 criterion 的范围。\",\r\n                },\r\n                {\r\n                    name: \"criterion\",\r\n                    detail:\r\n                        '要应用于 criteria_range 的模式或测试条件。\\n\\n等于：\"文本\" 或 1 或 \"=文本\" 或 \"=1\"\\n\\n大于：\">1\"\\n\\n大于等于：\">=1\"\\n\\n小于：\"<1\"\\n\\n小于等于：\"<=1\"\\n\\n不等于：\"<>1\"或\"<>文本\"',\r\n                },\r\n                {\r\n                    name: \"average_range\",\r\n                    detail: \"[可选] - 要计算平均值的范围。如果未提供此参数，则改用 criteria_range 来计算平均值。\",\r\n                },\r\n            ],\r\n        },\r\n        AVERAGEIFS: {\r\n            d: \"根据多项条件返回范围的平均值。\",\r\n            a: \"根据多项条件返回范围的平均值。\",\r\n            p: [\r\n                {\r\n                    name: \"average_range\",\r\n                    detail: \"要计算平均值的范围。\",\r\n                },\r\n                {\r\n                    name: \"criteria_range1\",\r\n                    detail: \"要对其检查 criterion1 的范围。\",\r\n                },\r\n                {\r\n                    name: \"criterion1\",\r\n                    detail: \"要应用于 criteria_range1 的模式或测试条件。\",\r\n                },\r\n                {\r\n                    name: \"criteria_range2, criterion2, ...\",\r\n                    detail: \"[可选] - 要检查的其他范围和条件。\",\r\n                },\r\n            ],\r\n        },\r\n        PERMUT: {\r\n            d: \"返回可从数字对象中选择的给定数目对象的排列数。\",\r\n            a: \"返回可从数字对象中选择的给定数目对象的排列数。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"表示对象个数的整数。\",\r\n                },\r\n                {\r\n                    name: \"number_chosen\",\r\n                    detail: \"表示每个排列中对象个数的整数。\",\r\n                },\r\n            ],\r\n        },\r\n        TRIMMEAN: {\r\n            d: \"在排除数据集高低两端的部分数据之后计算所得的均值。\",\r\n            a: \"在排除数据集高低两端的部分数据之后计算所得的均值。\",\r\n            p: [\r\n                {\r\n                    name: \"数据\",\r\n                    detail: \"包含相关数据集的数组或范围。\",\r\n                },\r\n                {\r\n                    name: \"排除比例\",\r\n                    detail: \"要从数据集的极值部分排除的数据占数据集的比例。\\n\\n排除比例必须大于等于0且小于1。\",\r\n                },\r\n            ],\r\n        },\r\n        PERCENTILE_EXC: {\r\n            d: \"返回数组的 K 百分点值，K 介于 0 到 1 之间，不含 0 与 1。\",\r\n            a: \"返回数组的 K 百分点值，K 介于 0 到 1 之间，不含 0 与 1。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"定义相对位置的数组或数据区域。\",\r\n                },\r\n                {\r\n                    name: \"k\",\r\n                    detail: \"0 到 1 之间的百分点值，不包含 0 和 1。\",\r\n                },\r\n            ],\r\n        },\r\n        PERCENTILE_INC: {\r\n            d: \"返回数组的 K 百分点值，K 介于 0 到 1 之间，包含 0 与 1。\",\r\n            a: \"返回数组的 K 百分点值，K 介于 0 到 1 之间，包含 0 与 1。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"定义相对位置的数组或数据区域。\",\r\n                },\r\n                {\r\n                    name: \"k\",\r\n                    detail: \"0 到 1 之间的百分点值，包含 0 和 1。\",\r\n                },\r\n            ],\r\n        },\r\n        PEARSON: {\r\n            d: \"返回皮尔生(Pearson)乘积矩相关系数 r。\",\r\n            a: \"返回皮尔生(Pearson)乘积矩相关系数 r。\",\r\n            p: [\r\n                {\r\n                    name: \"数据_x\",\r\n                    detail: \"代表自变量数据数组或矩阵的范围。\",\r\n                },\r\n                {\r\n                    name: \"数据_y\",\r\n                    detail: \"代表因变量数据数组或矩阵的范围。\",\r\n                },\r\n            ],\r\n        },\r\n        NORM_S_INV: {\r\n            d: \"返回标准正态累积分布函数的反函数值。 该分布的平均值为 0，标准偏差为 1。\",\r\n            a: \"返回标准正态累积分布函数的反函数值。 该分布的平均值为 0，标准偏差为 1。\",\r\n            p: [\r\n                {\r\n                    name: \"probability\",\r\n                    detail: \"对应于正态分布的概率。\",\r\n                },\r\n            ],\r\n        },\r\n        NORM_S_DIST: {\r\n            d: \"返回标准正态分布函数（该分布的平均值为 0，标准偏差为 1）。\",\r\n            a: \"返回标准正态分布函数（该分布的平均值为 0，标准偏差为 1）。\",\r\n            p: [\r\n                {\r\n                    name: \"z\",\r\n                    detail: \"需要计算其分布的数值。\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"决定函数形式的逻辑值。\\n\\n如果为 TRUE()，则返回累积分布函数；\\n\\n如果为 FALSE()，则返回概率密度函数。\",\r\n                },\r\n            ],\r\n        },\r\n        NORM_INV: {\r\n            d: \"返回指定平均值和标准偏差的正态累积分布函数的反函数值。\",\r\n            a: \"返回指定平均值和标准偏差的正态累积分布函数的反函数值。\",\r\n            p: [\r\n                {\r\n                    name: \"probability\",\r\n                    detail: \"对应于正态分布的概率。\",\r\n                },\r\n                {\r\n                    name: \"mean\",\r\n                    detail: \"分布的算术平均值。\",\r\n                },\r\n                {\r\n                    name: \"standard_dev\",\r\n                    detail: \"分布的标准偏差。\",\r\n                },\r\n            ],\r\n        },\r\n        NORM_DIST: {\r\n            d: \"返回指定平均值和标准偏差的正态分布函数。\",\r\n            a: \"返回指定平均值和标准偏差的正态分布函数。\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"需要计算其分布的数值。\",\r\n                },\r\n                {\r\n                    name: \"mean\",\r\n                    detail: \"分布的算术平均值。\",\r\n                },\r\n                {\r\n                    name: \"standard_dev\",\r\n                    detail: \"分布的标准偏差。\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"决定函数形式的逻辑值。\\n\\n如果为 TRUE()，则返回累积分布函数；\\n\\n如果为 FALSE()，则返回概率密度函数。\",\r\n                },\r\n            ],\r\n        },\r\n        NEGBINOM_DIST: {\r\n            d: \"返回负二项式分布。\",\r\n            a: \"返回负二项式分布。\",\r\n            p: [\r\n                {\r\n                    name: \"number_f\",\r\n                    detail: \"要模拟的失败次数。\",\r\n                },\r\n                {\r\n                    name: \"number_s\",\r\n                    detail: \"要模拟的成功次数。\",\r\n                },\r\n                {\r\n                    name: \"probability_s\",\r\n                    detail: \"任一次给定检验的成功概率。\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"决定函数形式的逻辑值。\\n\\n如果为 TRUE()，则返回累积分布函数；\\n\\n如果为 FALSE()，则返回概率密度函数。\",\r\n                },\r\n            ],\r\n        },\r\n        MINA: {\r\n            d: \"返回数据集中的最小数值。\",\r\n            a: \"返回数据集中的最小数值。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"计算最小值时所用的第一个值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2\",\r\n                    detail: \"[可选] - 在计算最小值时要考虑的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        MIN: {\r\n            d: \"返回数值数据集中的最小值。\",\r\n            a: \"返回数值数据集中的最小值。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"计算最小值时所用的第一个值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2\",\r\n                    detail: \"[可选] - 在计算最小值时要考虑的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        MEDIAN: {\r\n            d: \"返回数值数据集中的中值。\",\r\n            a: \"返回数值数据集中的中值。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"计算中值时所用的第一个数值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2\",\r\n                    detail: \"[可选] - 在计算中值时要考虑的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        MAXA: {\r\n            d: \"返回数据集中的最大数值。\",\r\n            a: \"返回数据集中的最大数值。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"计算最大值时所用的第一个值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 在计算最大值时要考虑的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        MAX: {\r\n            d: \"返回数值数据集中的最大值。\",\r\n            a: \"返回数值数据集中的最大值。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"计算最大值时所用的第一个值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2\",\r\n                    detail: \"[可选] - 在计算最大值时要考虑的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        LOGNORM_INV: {\r\n            d: \"返回 x 的对数累积分布函数的反函数值。\",\r\n            a: \"返回 x 的对数累积分布函数的反函数值。\",\r\n            p: [\r\n                {\r\n                    name: \"probability\",\r\n                    detail: \"与对数分布相关的概率，介于 0 与 1 之间（不含 0 与 1）。\",\r\n                },\r\n                {\r\n                    name: \"mean\",\r\n                    detail: \"ln(x) 的平均值。\",\r\n                },\r\n                {\r\n                    name: \"standard_dev\",\r\n                    detail: \"ln(x) 的标准偏差，正数。\",\r\n                },\r\n            ],\r\n        },\r\n        LOGNORM_DIST: {\r\n            d: \"返回 x 的对数分布函数。\",\r\n            a: \"返回 x 的对数分布函数。\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"用来计算函数的值。\",\r\n                },\r\n                {\r\n                    name: \"mean\",\r\n                    detail: \"ln(x) 的平均值。\",\r\n                },\r\n                {\r\n                    name: \"standard_dev\",\r\n                    detail: \"ln(x) 的标准偏差，正数。\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"决定函数形式的逻辑值。\\n\\n如果为 TRUE()，则返回累积分布函数；\\n\\n如果为 FALSE()，则返回概率密度函数。\",\r\n                },\r\n            ],\r\n        },\r\n        Z_TEST: {\r\n            d: \"返回 z 检验的单尾 P 值。\",\r\n            a: \"返回 z 检验的单尾 P 值。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"用来检验 x 的数组或数据区域。\",\r\n                },\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"要测试的值。\",\r\n                },\r\n                {\r\n                    name: \"sigma\",\r\n                    detail: \"[可选] - 总体（已知）标准偏差。 如果省略，则使用样本标准偏差。\",\r\n                },\r\n            ],\r\n        },\r\n        PROB: {\r\n            d: \"返回区域中的数值落在指定区间内的概率。\",\r\n            a: \"返回区域中的数值落在指定区间内的概率。\",\r\n            p: [\r\n                {\r\n                    name: \"x_range\",\r\n                    detail: \"具有各自相应概率值的 x 数值区域。\",\r\n                },\r\n                {\r\n                    name: \"prob_range\",\r\n                    detail: \"与 x_range 中的值相关联的一组概率值。\",\r\n                },\r\n                {\r\n                    name: \"lower_limit\",\r\n                    detail: \"要计算其概率的数值下界。\",\r\n                },\r\n                {\r\n                    name: \"upper_limit\",\r\n                    detail:\r\n                        \"[可选 - 默认值为下界] - 要计算其概率的可选数值上界。\\n\\n如果省略上界，PROB则计算随机选取相应值的次数恰好等于下界的概率。\",\r\n                },\r\n            ],\r\n        },\r\n        QUARTILE_EXC: {\r\n            d: \"基于 0 到 1 之间（不包括 0 和 1）的百分点值返回数据集的四分位数。\",\r\n            a: \"基于 0 到 1 之间（不包括 0 和 1）的百分点值返回数据集的四分位数。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"要求得四分位数值的数组或数字型单元格区域。\",\r\n                },\r\n                {\r\n                    name: \"quart\",\r\n                    detail:\r\n                        \"要返回第几个四分位值。\\n\\n1返回数据中最靠近第一个四分位值的值（25%标记）。\\n\\n2返回数据中最接近中值的值（50%标记）。\\n\\n3返回数据中最接近第三个四分位值的值（75%标记）。\",\r\n                },\r\n            ],\r\n        },\r\n        QUARTILE_INC: {\r\n            d: \"根据 0 到 1 之间的百分点值（包含 0 和 1）返回数据集的四分位数。\",\r\n            a: \"根据 0 到 1 之间的百分点值（包含 0 和 1）返回数据集的四分位数。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"要求得四分位数值的数组或数字型单元格区域。\",\r\n                },\r\n                {\r\n                    name: \"quart\",\r\n                    detail:\r\n                        \"要返回第几个四分位值。\\n\\n0返回数据中的最小值（0%标记）。\\n\\n1返回数据中最靠近第一个四分位值的值（25%标记）。\\n\\n2返回数据中最接近中值的值（50%标记）。\\n\\n3返回数据中最接近第三个四分位值的值（75%标记）。\\n\\n4返回数据中的最大值（100%标记）。\",\r\n                },\r\n            ],\r\n        },\r\n        POISSON_DIST: {\r\n            d: \"返回泊松分布。\",\r\n            a: \"返回泊松分布。\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"事件数。\",\r\n                },\r\n                {\r\n                    name: \"mean\",\r\n                    detail: \"期望值。非负数\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"一逻辑值，确定所返回的概率分布的形式。\\n\\n如果为 TRUE()，则返回发生的随机事件数在零（含零）和 x（含 x）之间的累积泊松概率；\\n\\n如果为 FALSE()，则返回发生的事件数正好是 x 的泊松概率密度函数。\",\r\n                },\r\n            ],\r\n        },\r\n        RSQ: {\r\n            d: \"返回皮尔生(Pearson)乘积矩相关系数 r 的平方。\",\r\n            a: \"返回皮尔生(Pearson)乘积矩相关系数 r 的平方。\",\r\n            p: [\r\n                {\r\n                    name: \"数据_y\",\r\n                    detail: \"代表因变量数据数组或矩阵的范围。\",\r\n                },\r\n                {\r\n                    name: \"数据_x\",\r\n                    detail: \"代表自变量数据数组或矩阵的范围。\",\r\n                },\r\n            ],\r\n        },\r\n        T_DIST: {\r\n            d: \"返回学生的左尾 t 分布。\",\r\n            a: \"返回学生的左尾 t 分布。\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"T-分布函数的输入。\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom\",\r\n                    detail: \"自由度数值。\",\r\n                },\r\n                {\r\n                    name: \"tails\",\r\n                    detail:\r\n                        \"决定函数形式的逻辑值。\\n\\n如果 cumulative 为 TRUE()，则 HYPGEOM.DIST 返回累积分布函数；\\n\\n如果为 FALSE()，则返回概率密度函数。\",\r\n                },\r\n            ],\r\n        },\r\n        T_DIST_2T: {\r\n            d: \"返回学生的双尾 t 分布。\",\r\n            a: \"返回学生的双尾 t 分布。\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"T-分布函数的输入。\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom\",\r\n                    detail: \"自由度数值。\",\r\n                },\r\n            ],\r\n        },\r\n        T_DIST_RT: {\r\n            d: \"返回学生的右尾 t 分布。\",\r\n            a: \"返回学生的右尾 t 分布。\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"T-分布函数的输入。\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom\",\r\n                    detail: \"自由度数值。\",\r\n                },\r\n            ],\r\n        },\r\n        T_INV: {\r\n            d: \"返回学生的 t 分布的左尾反函数。\",\r\n            a: \"返回学生的 t 分布的左尾反函数。\",\r\n            p: [\r\n                {\r\n                    name: \"probability\",\r\n                    detail: \"与学生的 t 分布相关的概率。\\n\\n必须大于 0 且小于 1。\",\r\n                },\r\n                {\r\n                    name: \"deg_freedom\",\r\n                    detail: \"自由度数值。\\n\\n如果所提供的参数不是整数，将截取其整数部分。\\n\\n必须大于等于 1。\",\r\n                },\r\n            ],\r\n        },\r\n        T_INV_2T: {\r\n            d: \"返回学生 t 分布的双尾反函数。\",\r\n            a: \"返回学生 t 分布的双尾反函数。\",\r\n            p: [\r\n                {\r\n                    name: \"probability\",\r\n                    detail: \"与学生的 t 分布相关的概率。\\n\\n必须大于 0 且小于1。\",\r\n                },\r\n                {\r\n                    name: \"deg_freedom\",\r\n                    detail: \"自由度数值。\\n\\n如果所提供的参数不是整数，将截取其整数部分。\\n\\n必须大于等于 1。\",\r\n                },\r\n            ],\r\n        },\r\n        T_TEST: {\r\n            d: \"返回与t-检验相关的概率。用于判断两个样本是否可能是出自平均值相同的两个样本总体。\",\r\n            a: \"返回与t-检验相关的概率。用于判断两个样本是否可能是出自平均值相同的两个样本总体。\",\r\n            p: [\r\n                {\r\n                    name: \"array1\",\r\n                    detail: \"将用于 t 检验的第一个数据样本或第一组单元格。\",\r\n                },\r\n                {\r\n                    name: \"array2\",\r\n                    detail: \"将用于 t 检验的第二个数据样本或第二组单元格。\",\r\n                },\r\n                {\r\n                    name: \"tails\",\r\n                    detail: \"指定分布的尾数。\\n\\n如果为 1：使用单尾分布。\\n\\n如果为 2：使用双尾分布。\",\r\n                },\r\n                {\r\n                    name: \"type\",\r\n                    detail:\r\n                        \"指定 t 检验的类型。\\n\\n如果为 1：执行配对检验。\\n\\n如果为 2：执行双样本等方差（同方差）检验。\\n\\n如果为3：执行双样本不等方差（异方差）检验。\",\r\n                },\r\n            ],\r\n        },\r\n        F_DIST: {\r\n            d:\r\n                \"给定输入值 x，计算两个数据集的左尾 F 概率分布（差异程度）。此分布也称为 Fisher-Snedecor 分布或 Snedecor F 分布。\",\r\n            a: \"给定输入值 x\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"用来计算函数的值。\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom1\",\r\n                    detail: \"分子自由度。\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom2\",\r\n                    detail: \"分母自由度。\",\r\n                },\r\n                {\r\n                    name: \"cumulative\",\r\n                    detail:\r\n                        \"用于确定函数形式的逻辑值。默认值为 FALSE。\\n\\n如果为 TRUE()：F.DIST 将返回累积分布函数值。\\n\\n如果为 FALSE()：F.DIST 将返回概率密度函数值。\",\r\n                },\r\n            ],\r\n        },\r\n        F_DIST_RT: {\r\n            d:\r\n                \"给定输入x，计算两个数据集的右尾F概率分布（差异程度）。 此分布也称为Fisher-Snedecor分布或Snedecor F分布。\",\r\n            a: \"给定输入x\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"用来计算函数的值。\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom1\",\r\n                    detail: \"分子自由度。\",\r\n                },\r\n                {\r\n                    name: \"degrees_freedom2\",\r\n                    detail: \"分母自由度。\",\r\n                },\r\n            ],\r\n        },\r\n        VAR_P: {\r\n            d: \"基于样本总体计算方差。\",\r\n            a: \"基于样本总体计算方差。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"数据集中的第一个值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, …\",\r\n                    detail: \"[可选] - 数据集中包含的其他值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        VAR_S: {\r\n            d: \"基于样本计算方差。\",\r\n            a: \"基于样本计算方差。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"样本中的第一项值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, …\",\r\n                    detail: \"[可选] - 样本中包含的其他值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        VARA: {\r\n            d: \"基于样本计算方差，将文本取值为0。\",\r\n            a: \"基于样本计算方差\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"样本中的第一项值或范围。\",\r\n                },\r\n                {\r\n                    name: \"value2, ...\",\r\n                    detail: \"[可选] - 样本中包含的其他值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        VARPA: {\r\n            d: \"基于样本总体计算方差，将文本取值为0。\",\r\n            a: \"基于样本总体计算方差\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"样本中的第一项值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 数据集中包含的其他数值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        STEYX: {\r\n            d: \"返回通过线性回归法预测每个 x 的 y 值时所产生的标准误差。\",\r\n            a: \"返回通过线性回归法预测每个 x 的 y 值时所产生的标准误差。\",\r\n            p: [\r\n                {\r\n                    name: \"数据_y\",\r\n                    detail: \"代表因变量数据数组或矩阵的范围。\",\r\n                },\r\n                {\r\n                    name: \"数据_x\",\r\n                    detail: \"代表自变量数据数组或矩阵的范围。\",\r\n                },\r\n            ],\r\n        },\r\n        STANDARDIZE: {\r\n            d: \"给定分布的均值和标准偏差，计算一个随机变量正态化的相应值。\",\r\n            a: \"给定分布的均值和标准偏差，计算一个随机变量正态化的相应值。\",\r\n            p: [\r\n                {\r\n                    name: \"x\",\r\n                    detail: \"要正态化的随机变量值。\",\r\n                },\r\n                {\r\n                    name: \"mean\",\r\n                    detail: \"分布的均值。\",\r\n                },\r\n                {\r\n                    name: \"standard_dev\",\r\n                    detail: \"分布的标准偏差。\",\r\n                },\r\n            ],\r\n        },\r\n        SMALL: {\r\n            d: \"返回数据集中的第 k 个最小值。\",\r\n            a: \"返回数据集中的第 k 个最小值。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"需要找到第 k 个最小值的数组或数值数据区域。\",\r\n                },\r\n                {\r\n                    name: \"k\",\r\n                    detail: \"要返回的数据在数组或数据区域里的位置（从小到大）。\",\r\n                },\r\n            ],\r\n        },\r\n        SLOPE: {\r\n            d: \"计算通过数据集的线性回归得到的直线的斜率。\",\r\n            a: \"计算通过数据集的线性回归得到的直线的斜率。\",\r\n            p: [\r\n                {\r\n                    name: \"数据_y\",\r\n                    detail: \"代表因变量数据数组或矩阵的范围。\",\r\n                },\r\n                {\r\n                    name: \"数据_x\",\r\n                    detail: \"代表自变量数据数组或矩阵的范围。\",\r\n                },\r\n            ],\r\n        },\r\n        SKEW: {\r\n            d:\r\n                \"返回分布的偏斜度。 偏斜度表明分布相对于平均值的不对称程度。 正偏斜度表明分布的不对称尾部趋向于更多正值。 负偏斜度表明分布的不对称尾部趋向于更多负值。\",\r\n            a: \"返回分布的偏斜度。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"数据集中的第一个值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 数据集中包含的其他值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        SKEW_P: {\r\n            d: \"返回基于样本总体的分布不对称度：表明分布相对于平均值的不对称程度。\",\r\n            a: \"返回基于样本总体的分布不对称度：表明分布相对于平均值的不对称程度。\",\r\n            p: [\r\n                {\r\n                    name: \"值1\",\r\n                    detail: \"数据集中的第一个值或范围。\",\r\n                },\r\n                {\r\n                    name: \"值2, ...\",\r\n                    detail: \"[可选] - 数据集中包含的其他值或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        VLOOKUP: {\r\n            d: \"纵向查找。在范围的第一列中自上而下搜索某个键值，并返回所找到的行中指定单元格的值。\",\r\n            a: \"纵向查找。在范围的第一列中自上而下搜索某个键值\",\r\n            p: [\r\n                {\r\n                    name: \"搜索键值\",\r\n                    detail: '要搜索的值，如 42、\"Cats\" 或 I24。',\r\n                },\r\n                {\r\n                    name: \"范围\",\r\n                    detail: \"要进行搜索的范围。VLOOKUP 将在该范围的第一列中搜索搜索键值中指定的键值。\",\r\n                },\r\n                {\r\n                    name: \"索引\",\r\n                    detail:\r\n                        \"要返回的值的列索引，范围中的第一列编号为 1。\\n\\n如果索引不是介于 1 和范围中的列数之间，将返回 #VALUE! 。\",\r\n                },\r\n                {\r\n                    name: \"已排序\",\r\n                    detail:\r\n                        \"[默认值为 TRUE() ] - 指示要搜索的列（指定范围的第一列）是否已排序。大多数情况下，建议设为 FALSE()。\\n\\n建议将已排序设为 FALSE。如果设为 FALSE，将返回完全匹配项。如果存在多个匹配值，将返回找到的第一个值对应的单元格的内容，如果找不到匹配值，则返回 #N/A。\\n\\n如果将已排序设为 TRUE 或省略，将返回（小于或等于搜索键值的）最接近的匹配项。如果搜索的列中所有的值均大于搜索键值，则返回 #N/A。\",\r\n                },\r\n            ],\r\n        },\r\n        HLOOKUP: {\r\n            d: \"横向查找。在范围的第一行中搜索某个键值，并返回所找到的列中指定单元格的值。\",\r\n            a: \"横向查找。在范围的第一行中搜索某个键值\",\r\n            p: [\r\n                {\r\n                    name: \"搜索键值\",\r\n                    detail: '要搜索的值。例如，42、\"Cats\"或I24。',\r\n                },\r\n                {\r\n                    name: \"范围\",\r\n                    detail: \"要进行搜索的范围。将在该范围的第一行中搜索在搜索键值中指定的键值。\",\r\n                },\r\n                {\r\n                    name: \"索引\",\r\n                    detail:\r\n                        \"要返回的值的行索引，范围中的第一行编号为1。\\n\\n如果索引不是介于1和范围中的行数之间，将返回#VALUE!。\",\r\n                },\r\n                {\r\n                    name: \"已排序\",\r\n                    detail:\r\n                        \"[可选 - 默认值为TRUE()] - 指示要搜索的行（指定范围的第一行）是否已排序。\\n\\n如果将已排序设为TRUE或省略，将返回最接近的匹配值（小于或等于搜索键值）。如果在搜索的行中所有的值均大于搜索键值，则返回#N/A。\\n\\n如果将已排序设为TRUE或将其省略，而范围的首行并非处于已排序状态，则返回值可能会是错误的。\\n\\n如果将已排序设为FALSE，则仅返回完全匹配。如果存在多个匹配值，将返回与找到的第一个值对应的单元格的内容，如果找不到匹配值则返回#N/A。\",\r\n                },\r\n            ],\r\n        },\r\n        LOOKUP: {\r\n            d: \"在行或列中查找相应键，并将相应单元格的值返回到与搜索行或列所在位置相同的结果范围中。\",\r\n            a: \"在行或列中查找相应键\",\r\n            p: [\r\n                {\r\n                    name: \"搜索键值\",\r\n                    detail: '要在行或列中搜索的值。例如，42、\"Cats\" 或 I24。',\r\n                },\r\n                {\r\n                    name: \"搜索范围 | 搜索结果数组\",\r\n                    detail:\r\n                        \"使用 LOOKUP 的一种方法是给定单行或单列形式的搜索范围进行搜索查找，这种方式要用到另一个参数结果范围。另一种方式是将这两个参数合并为一个搜索结果数组，其中第一行或第一列用于搜索，并将返回值放在该数组的最后一行或最后一列中。\",\r\n                },\r\n                {\r\n                    name: \"结果范围\",\r\n                    detail:\r\n                        \"[ 可选 ] - 用于存放返回结果的范围。返回值对应于在搜索范围中找到搜索键值的位置。此范围必须仅为单行或单列，而如果您使用的是搜索结果数组方式，则不应提供此参数。\",\r\n                },\r\n            ],\r\n        },\r\n        ADDRESS: {\r\n            d: \"返回字符串形式的单元格引用。\",\r\n            a: \"返回字符串形式的单元格引用。\",\r\n            p: [\r\n                {\r\n                    name: \"row_num\",\r\n                    detail: \"一个数值，指定要在单元格引用中使用的行号。\",\r\n                },\r\n                {\r\n                    name: \"column_num\",\r\n                    detail: \"一个数值，指定要在单元格引用中使用的列号（而非名称）。A列的编号为1。\",\r\n                },\r\n                {\r\n                    name: \"abs_num\",\r\n                    detail:\r\n                        \"[可选 - 默认值为1] - 一个数值，指定要返回的引用类型。\\n\\n1 表示行列均采用绝对值（例如$A$1）；\\n\\n2 表示采用绝对行号，相对列标（例如A$1）；\\n\\n3 表示采用相对行号，绝对列标（例如$A1）；\\n\\n4 表示行列均采用相对值（例如A1）。\",\r\n                },\r\n                {\r\n                    name: \"A1\",\r\n                    detail: \"[可选 - 默认值为TRUE()] - 一个布尔值，指示采用A1标记形式(TRUE)还是R1C1标记形式(FALSE)。\",\r\n                },\r\n                {\r\n                    name: \"sheet_text\",\r\n                    detail: \"[可选 - 默认缺省] - 用于指定地址所指向的工作表名称。\",\r\n                },\r\n            ],\r\n        },\r\n        INDIRECT: {\r\n            d: \"返回以字符串指定的单元格引用。\",\r\n            a: \"返回以字符串指定的单元格引用。\",\r\n            p: [\r\n                {\r\n                    name: \"ref_text\",\r\n                    detail: \"以带引号的字符串形式提供的单元格引用。\",\r\n                },\r\n                {\r\n                    name: \"A1\",\r\n                    detail: \"[可选 - 默认值为TRUE()] - 一个布尔值，指示采用A1标记形式(TRUE)还是R1C1标记形式(FALSE)。\",\r\n                },\r\n            ],\r\n        },\r\n        ROW: {\r\n            d: \"返回指定单元格的行号\",\r\n            a: \"返回指定单元格的行号\",\r\n            p: [\r\n                {\r\n                    name: \"reference\",\r\n                    detail:\r\n                        \"[可选 - 默认为此公式所在的单元格] - 要返回其行号的单元格。\\n\\n如果单元格引用指向的范围其宽度大于一个单元格，而此公式不是用作数组公式的，这时会仅返回单元格引用中首行的编号值。\",\r\n                },\r\n            ],\r\n        },\r\n        ROWS: {\r\n            d: \"返回指定数组或范围中的行数。\",\r\n            a: \"返回指定数组或范围中的行数。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"要返回其行数的范围。\",\r\n                },\r\n            ],\r\n        },\r\n        COLUMN: {\r\n            d: \"按照 `A=1` 的规则返回指定单元格的列号。\",\r\n            a: \"按照 `A=1` 的规则返回指定单元格的列号。\",\r\n            p: [\r\n                {\r\n                    name: \"reference\",\r\n                    detail:\r\n                        \"[可选 - 默认为包含此公式的单元格] - 要返回其列号的单元格。A列对应的编号为1。\\n\\n如果单元格引用是宽度超过一个单元格的范围，而此公式不是作为数组公式来使用的，因此将返回单元格引用中的第一列的位置。\",\r\n                },\r\n            ],\r\n        },\r\n        COLUMNS: {\r\n            d: \"返回指定数组或范围中的列数。\",\r\n            a: \"返回指定数组或范围中的列数。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"要返回其列数的范围。\",\r\n                },\r\n            ],\r\n        },\r\n        OFFSET: {\r\n            d: \"给定某范围的起始单元格引用以及该范围涵盖的行列数量，返回该范围的引用。\",\r\n            a: \"给定某范围的起始单元格引用以及该范围涵盖的行列数量，返回该范围的引用。\",\r\n            p: [\r\n                {\r\n                    name: \"reference\",\r\n                    detail: \"用于计算行列偏移量的起点。\",\r\n                },\r\n                {\r\n                    name: \"rows\",\r\n                    detail:\r\n                        \"要偏移的行数。\\n\\n行偏移量必须是整数，但也可以是负数。如果提供的参数带有小数，小数部分将被截去。\",\r\n                },\r\n                {\r\n                    name: \"cols\",\r\n                    detail:\r\n                        \"要偏移的列数。\\n\\n列偏移量必须是整数，但也可以是负数。如果提供的参数带有小数，小数部分将被截去。\",\r\n                },\r\n                {\r\n                    name: \"height\",\r\n                    detail: \"[可选] - 要从偏移目标开始返回的范围的高度。\",\r\n                },\r\n                {\r\n                    name: \"width\",\r\n                    detail: \"[可选] - 要从偏移目标开始返回的范围的宽度。\",\r\n                },\r\n            ],\r\n        },\r\n        MATCH: {\r\n            d: \"在单元格中搜索指定项，然后返回该项在单元格区域中的相对位置。\",\r\n            a: \"在单元格中搜索指定项，然后返回该项在单元格区域中的相对位置。\",\r\n            p: [\r\n                {\r\n                    name: \"lookup_value\",\r\n                    detail: \"要在 lookup_array 中匹配的值。\",\r\n                },\r\n                {\r\n                    name: \"lookup_array\",\r\n                    detail: \"要搜索的单元格区域。\\n\\n如果所用的范围的高度和宽度均大于1，MATCH将返回#N/A!。\",\r\n                },\r\n                {\r\n                    name: \"match_type\",\r\n                    detail:\r\n                        \"[可选 - 默认值为1] - 要采用的搜索方式。\\n\\n1为默认类型，此时MATCH会假设范围已按升序排序，并返回小于等于搜索键值的最大值。\\n\\n0表示完全匹配，在范围未排序的情况下需要使用此方式。\\n\\n-1让MATCH假设范围是按降序排序的，并返回大于等于搜索键值的最小值。\",\r\n                },\r\n            ],\r\n        },\r\n        INDEX: {\r\n            d: \"返回表格或中的元素值，此元素由行号和列号的索引值给定。\",\r\n            a: \"返回表格或中的元素值，此元素由行号和列号的索引值给定。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"单元格区域或数组常量。\",\r\n                },\r\n                {\r\n                    name: \"row_num\",\r\n                    detail: \"选择数组中的某行，函数从该行返回数值。\",\r\n                },\r\n                {\r\n                    name: \"column_num\",\r\n                    detail: \"选择数组中的某列，函数从该列返回数值。\",\r\n                },\r\n            ],\r\n        },\r\n        GETPIVOTDATA: {\r\n            d: \"从与指定行和列标题对应的数据透视表中提取汇总值。\",\r\n            a: \"从与指定行和列标题对应的数据透视表中提取汇总值。\",\r\n            p: [\r\n                {\r\n                    name: \"data_field\",\r\n                    detail:\r\n                        \"您想从数据透视表中获取其数据的值名称。\\n值名称必须括在引号中或是指向包含相关文本的任何单元格的引用。\\n如果有多个值字段，则必须使用数据透视表中显示的确切名称（如“销售总额”）。\",\r\n                },\r\n                {\r\n                    name: \"pivot_table\",\r\n                    detail: \"目标数据透视表中的任何单元格的引用（推荐位于顶角的单元格）。\",\r\n                },\r\n                {\r\n                    name: \"field1\",\r\n                    detail: \"[可选] - 源数据集（不是数据透视表）中列的名称。\",\r\n                },\r\n                {\r\n                    name: \"item1\",\r\n                    detail: \"[可选] - 数据透视表中显示的与您要检索的字段名称 1 相对应的行或列的名称。\",\r\n                },\r\n            ],\r\n        },\r\n        CHOOSE: {\r\n            d: \"基于索引返回选项列表中的元素。\",\r\n            a: \"基于索引返回选项列表中的元素。\",\r\n            p: [\r\n                {\r\n                    name: \"index_num\",\r\n                    detail: \"指定要返回哪一项。\\n\\n如果索引为零、负值或大于提供的选择数量，将返回#VALUE!错误。\",\r\n                },\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"一项可能的返回值。必须提供。可以是单元格引用或单独的值。\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"[可选] - 其他可以选择的值。选择\",\r\n                },\r\n            ],\r\n        },\r\n        HYPERLINK: {\r\n            d: \"在单元格内创建一个超链接。\",\r\n            a: \"在单元格内创建一个超链接。\",\r\n            p: [\r\n                {\r\n                    name: \"网址\",\r\n                    detail:\r\n                        \"以引号括住的链接位置的完整网址，或对包含这种网址的单元格的引用。\\n\\n仅允许某些链接类型。其中包括：http://、https://、mailto:、aim:、ftp://、gopher://、telnet://和news://，明确禁用使用其他协议。如果指定的是其他协议，将会在单元格中显示链接标签，但该标签不会以链接形式呈现。\\n\\n如果未指定协议，则假设使用http://，并将其作为网址的前缀。\",\r\n                },\r\n                {\r\n                    name: \"链接标签\",\r\n                    detail:\r\n                        '[可选 - 默认为网址] - 要在单元格中作为链接显示的文本（用引号括起来的），或者指向包含这种标签的单元格的引用。\\n\\n如果链接标签是指向某个空单元格的引用，如果网址有效，就将其作为链接显示，否则作为纯文本显示。\\n\\n如果链接标签为空字符串常量(\"\")，所在单元格显示的内容将为空白，但通过点击该单元格或转入该单元格仍然可以访问链接。',\r\n                },\r\n            ],\r\n        },\r\n        TIME: {\r\n            d: \"将给定的小时、分钟和秒转换为时间。\",\r\n            a: \"将给定的小时、分钟和秒转换为时间。\",\r\n            p: [\r\n                {\r\n                    name: \"小时\",\r\n                    detail: \"0（零）到 32767 之间的数字，代表小时。\\n\\n任何大于 23 的值都会除以 24，余数将作为小时值。\",\r\n                },\r\n                {\r\n                    name: \"分钟\",\r\n                    detail: \"0（零）到 32767 之间的数字，代表分钟。\\n\\n任何大于 59 的值将转换为小时和分钟。\",\r\n                },\r\n                {\r\n                    name: \"秒\",\r\n                    detail: \"0（零）到 32767 之间的数字，代表秒。\\n\\n任何大于 59 的值将转换为小时、分钟和秒。\",\r\n                },\r\n            ],\r\n        },\r\n        TIMEVALUE: {\r\n            d: \"按一天24小时返回该时间的分数表示。\",\r\n            a: \"按一天24小时返回该时间的分数表示。\",\r\n            p: [\r\n                {\r\n                    name: \"time_text\",\r\n                    detail: \"用于表示时间的字符串。\",\r\n                },\r\n            ],\r\n        },\r\n        EOMONTH: {\r\n            d: \"返回某个月份最后一天的序列号，该月份在另一个日期之前或之后的数个月（月数由参数指定）。\",\r\n            a: \"返回某个月份最后一天的序列号\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail: \"用于计算结果的参照日期。\",\r\n                },\r\n                {\r\n                    name: \"months\",\r\n                    detail: \"用于计算的起始日期之前（负）或之后（正）的月数。返回的是计算所得月份的最后那天。\",\r\n                },\r\n            ],\r\n        },\r\n        EDATE: {\r\n            d: \"返回表示某个日期的序列号，该日期在另一个日期的数月之前/之后。\",\r\n            a: \"返回表示某个日期的序列号\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail: \"用于计算结果的参照日期。\",\r\n                },\r\n                {\r\n                    name: \"months\",\r\n                    detail: \"用于计算的起始日期之前（负）或之后（正）的月数。\",\r\n                },\r\n            ],\r\n        },\r\n        SECOND: {\r\n            d: \"返回时间值的秒数。 秒数是 0（零）到 59 范围内的整数。\",\r\n            a: \"返回时间值的秒数。 秒数是 0（零）到 59 范围内的整数。\",\r\n            p: [\r\n                {\r\n                    name: \"时间\",\r\n                    detail:\r\n                        \"用于计算秒钟部分的时间。必须为以下值之一：指向包含日期/时间值的单元格的引用、返回日期/时间的函数或者数字。\",\r\n                },\r\n            ],\r\n        },\r\n        MINUTE: {\r\n            d: \"以数字格式返回特定时间的分钟部分。\",\r\n            a: \"以数字格式返回特定时间的分钟部分。\",\r\n            p: [\r\n                {\r\n                    name: \"时间\",\r\n                    detail:\r\n                        \"用于计算分钟部分的时间。必须为以下值之一：指向包含日期/时间值的单元格的引用、返回日期/时间的函数或者数字。\",\r\n                },\r\n            ],\r\n        },\r\n        HOUR: {\r\n            d: \"以数字格式返回特定时间的小时部分。\",\r\n            a: \"以数字格式返回特定时间的小时部分。\",\r\n            p: [\r\n                {\r\n                    name: \"时间\",\r\n                    detail:\r\n                        \"用于计算小时部分的时间。必须为以下值之一：指向包含日期/时间值的单元格的引用、返回日期/时间的函数或者数字。\",\r\n                },\r\n            ],\r\n        },\r\n        NOW: {\r\n            d: \"以日期值格式返回当前日期和时间。\",\r\n            a: \"以日期值格式返回当前日期和时间。\",\r\n            p: [],\r\n        },\r\n        NETWORKDAYS: {\r\n            d: \"返回所提供的两个日期之间的净工作日天数。\",\r\n            a: \"返回所提供的两个日期之间的净工作日天数。\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail: \"用于计算净工作日天数的时间段开始日期。\",\r\n                },\r\n                {\r\n                    name: \"end_date\",\r\n                    detail: \"用于计算净工作日天数的时间段结束日期。\",\r\n                },\r\n                {\r\n                    name: \"holidays\",\r\n                    detail:\r\n                        \"[可选] - 一个范围或数组常量，其中包含作为节假日的日期序号。\\n\\n在节假日数组中提供的值必须是日期序号值（例如由N所返回的值）或日期值（例如由DATE、DATEVALUE或TO_DATE返回的值）。由范围指定的值应该是标准的日期值或日期序数值。\",\r\n                },\r\n            ],\r\n        },\r\n        NETWORKDAYS_INTL: {\r\n            d: \"返回给定的两个日期之间的净工作日天数（排除指定的周末和节假日）。\",\r\n            a: \"返回给定的两个日期之间的净工作日天数（排除指定的周末和节假日）。\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail: \"用于计算净工作日天数的时间段开始日期。\",\r\n                },\r\n                {\r\n                    name: \"end_date\",\r\n                    detail: \"用于计算净工作日天数的时间段结束日期。\",\r\n                },\r\n                {\r\n                    name: \"weekend\",\r\n                    detail:\r\n                        \"[可选 - 默认值为1] - 用于表示哪些天为周末的数字或字符串。\\n字符串方式：可以使用由0和1组成的字符串来指定周末，串中的第一个数字字符代表周一，最后一个则代表周日。零表示这一天是工作日，1表示这一天为周末。例如，“0000011”表示将周六和周日作为周末。\\n数字方式：这种方式不使用上述字符串形式，而是使用一个数字。1 =周六/周日为周末，2 =周日/周一为周末，依此类推则7 =周五/周六。11 =周日为唯一周末，12 =周一为唯一周末，依此类推则17 =周六为唯一周末。\",\r\n                },\r\n                {\r\n                    name: \"holidays\",\r\n                    detail:\r\n                        \"[ 可选 ] - 这是一个范围或数组常量，其中包含作为节假日的日期。\\n在节假日数组内提供的值必须为日期序数值（例如N的返回值）或日期值（例如DATE、DATEVALUE或TO_DATE的返回值）。由范围指定的值应该是标准的日期值或日期序数值。\",\r\n                },\r\n            ],\r\n        },\r\n        ISOWEEKNUM: {\r\n            d: \"返回给定日期在全年中的 ISO 周数。\",\r\n            a: \"返回给定日期在全年中的 ISO 周数。\",\r\n            p: [\r\n                {\r\n                    name: \"date\",\r\n                    detail: \"用于日期和时间计算的日期-时间代码。\",\r\n                },\r\n            ],\r\n        },\r\n        WEEKNUM: {\r\n            d: \"返回特定日期的周数。\",\r\n            a: \"返回特定日期的周数。\",\r\n            p: [\r\n                {\r\n                    name: \"serial_number\",\r\n                    detail: \"要确定其位于第几周的日期，必须是对包含日期的单元格的引用、返回日期类型的函数或者数字。\",\r\n                },\r\n                {\r\n                    name: \"return_type\",\r\n                    detail:\r\n                        \"[可选 - 默认值为 1 ] - 代表一周起始日的数字，系统也使用该数字来确定一年的第一周（1=周日，2=周一）。\",\r\n                },\r\n            ],\r\n        },\r\n        WEEKDAY: {\r\n            d: \"返回一个数字，对应于给定日期所在的星期几。\",\r\n            a: \"返回一个数字，对应于给定日期所在的星期几。\",\r\n            p: [\r\n                {\r\n                    name: \"serial_number\",\r\n                    detail: \"要为其确定星期几的日期。必须是对包含日期的单元格的引用、返回日期类型的函数或者数字。\",\r\n                },\r\n                {\r\n                    name: \"return_type\",\r\n                    detail:\r\n                        \"[可选 - 默认值为 1] - 以数字指示使用哪种编号顺序来表示星期几。默认情况下，按星期日 (= 1) 开始计算。\\n\\n如果类型为 1，则星期值将从星期日开始算起，并且星期日的值为 1，因此星期六的值就是 7。\\n\\n如果类型为 2，则星期值将从星期一开始算起，并且星期一的值为 1，因此星期日的值就是 7。\\n\\n如果类型为 3，则星期值将从星期一算起，并且星期一的值为 0，因此星期日的值就是 6。\",\r\n                },\r\n            ],\r\n        },\r\n        DAY: {\r\n            d: \"以数字格式返回特定日期所在的当月几号。\",\r\n            a: \"以数字格式返回特定日期所在的当月几号。\",\r\n            p: [\r\n                {\r\n                    name: \"serial_number\",\r\n                    detail:\r\n                        \"要从中提取具体几号的日期。必须是以下一种：对包含日期的单元格的引用、返回日期类型的函数或者数字。\",\r\n                },\r\n            ],\r\n        },\r\n        DAYS: {\r\n            d: \"返回两个日期之间的天数。\",\r\n            a: \"返回两个日期之间的天数。\",\r\n            p: [\r\n                {\r\n                    name: \"end_date\",\r\n                    detail:\r\n                        \"计算中要使用的结束日期。必须是以下一种：对包含日期的单元格的引用、返回日期类型的函数或者数字。\",\r\n                },\r\n                {\r\n                    name: \"start_date\",\r\n                    detail:\r\n                        \"计算中要使用的开始日期。必须是以下一种：对包含日期的单元格的引用、返回日期类型的函数或者数字。\",\r\n                },\r\n            ],\r\n        },\r\n        DAYS360: {\r\n            d: \"按照每年360天，返回两个日期之间的差（用于计算利息）。\",\r\n            a: \"按照每年360天，返回两个日期之间的差（用于计算利息）。\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail:\r\n                        \"计算中要使用的开始日期。必须是以下一种：对包含日期的单元格的引用、返回日期类型的函数或者数字。\",\r\n                },\r\n                {\r\n                    name: \"end_date\",\r\n                    detail:\r\n                        \"计算中要使用的结束日期。必须是以下一种：对包含日期的单元格的引用、返回日期类型的函数或者数字。\",\r\n                },\r\n                {\r\n                    name: \"method\",\r\n                    detail:\r\n                        \"[可选 - 默认为FALSE()] - 指示要使用哪种天数计算方法。\\n\\nFALSE - 采用美国 (NASD) 方法时，如果起始日期为某月的最后一天，为便于计算，会将起始日期的当月几号更改为30。此外，如果结束日期是所在月份的最后一天，而且起始日期在其所在月的30号之前，则将结束日期更改为结束日期之后那个月的第一天，否则将结束日期更改为该月的30号。\\n\\nTRUE - 采用欧洲方法时，会将所有日期在31号的起始日期或结束日期更改为当月的30号。\",\r\n                },\r\n            ],\r\n        },\r\n        DATE: {\r\n            d: \"将提供的年、月、日转换为日期。\",\r\n            a: \"将提供的年、月、日转换为日期。\",\r\n            p: [\r\n                {\r\n                    name: \"year\",\r\n                    detail:\r\n                        \"日期的年份部分，包含一到四位数字。\\n\\n介于 0（零）到 1899 之间，会将该值与 1900 相加来计算年份；\\n\\n介于 1900 到 9999 之间，将使用该数值作为年份；\\n\\n小于 0 或大于等于 10000，返回 错误值 #NUM!。\",\r\n                },\r\n                {\r\n                    name: \"month\",\r\n                    detail:\r\n                        \"日期的月份部分，一个正整数或负整数。\\n\\n如果 month 大于 12，则 month 会将该月份数与指定年中的第一个月相加。\\n\\n如果 month 小于 1，month 则从指定年份的一月份开始递减该月份数，然后再加上 1 个月。\",\r\n                },\r\n                {\r\n                    name: \"day\",\r\n                    detail:\r\n                        \"日期的日部分，一个正整数或负整数。\\n\\n如果 day 大于月中指定的天数，则 day 会将天数与该月中的第一天相加。\\n\\n如果 day 小于 1，则 day 从指定月份的第一天开始递减该天数，然后再加上 1 天。\",\r\n                },\r\n            ],\r\n        },\r\n        DATEVALUE: {\r\n            d: \"将提供的日期字符串转换为日期的序列号。\",\r\n            a: \"将提供的日期字符串转换为日期的序列号。\",\r\n            p: [\r\n                {\r\n                    name: \"date_text\",\r\n                    detail: \"表示日期的字符串。\",\r\n                },\r\n            ],\r\n        },\r\n        DATEDIF: {\r\n            d: \"计算两个日期之间的天数、月数或年数。\",\r\n            a: \"计算两个日期之间的天数、月数或年数。\",\r\n            p: [\r\n                {\r\n                    name: \"起始日期\",\r\n                    detail: \"计算中要使用的开始日期。必须是对包含DATE值的单元格的引用、返回DATE类型的函数或数字。\",\r\n                },\r\n                {\r\n                    name: \"结束日期\",\r\n                    detail: \"计算中要使用的结束日期。必须是对包含DATE值的单元格的引用、返回DATE类型的函数或数字。\",\r\n                },\r\n                {\r\n                    name: \"单位\",\r\n                    detail:\r\n                        '时间单位的缩写文字。例如 \"M\" 代表月。有效值包括：\"Y\"、\"M\"、\"D\"、\"MD\"、\"YM\" 和 \"YD\"。\\n\\n\"Y\"：返回起始日期和结束日期之间的整年数。\\n\\n\"M\"：返回起始日期和结束日期之间的整月数。\\n\\n\"D\"：返回起始日期和结束日期之间的天数。\\n\\n\"MD\"：返回起始日期和结束日期之间的天数（不计整月数）。\\n\\n\"YM\"：返回起始日期和结束日期之间的整月数（不计整年数）。\\n\\n\"YD\"：返回起始日期和结束日期之间的天数（假设起始日期和结束日期的间隔不超过一年）。',\r\n                },\r\n            ],\r\n        },\r\n        WORKDAY: {\r\n            d: \"指定工作日天数，计算结束日期。\",\r\n            a: \"指定工作日天数，计算结束日期。\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail: \"计算的开始日期。\",\r\n                },\r\n                {\r\n                    name: \"days\",\r\n                    detail:\r\n                        \"start_date 之前或之后不含周末及节假日的天数。\\n\\n为正值将生成未来日期；\\n\\n为负值生成过去日期。\",\r\n                },\r\n                {\r\n                    name: \"holidays\",\r\n                    detail:\r\n                        \"[可选] - 一个范围或数组常量，其中包含作为节假日的日期序号。\\n\\n在节假日数组中提供的值必须是日期序号值（例如由N所返回的值）或日期值（例如由DATE、DATEVALUE或TO_DATE返回的值）。由范围指定的值应该是标准的日期值或日期序数值。\",\r\n                },\r\n            ],\r\n        },\r\n        WORKDAY_INTL: {\r\n            d: \"返回指定的若干个工作日之前或之后的日期的序列号（使用自定义周末参数）。 \",\r\n            a: \"返回指定的若干个工作日之前或之后的日期的序列号（使用自定义周末参数）。 \",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail: \"开始日期（将被截尾取整）。\",\r\n                },\r\n                {\r\n                    name: \"days\",\r\n                    detail:\r\n                        \"start_date 之前或之后的工作日的天数。\\n\\n正值表示未来日期；\\n\\n负值表示过去日期；\\n\\n零值表示开始日期。\",\r\n                },\r\n                {\r\n                    name: \"weekend\",\r\n                    detail:\r\n                        \"[可选 - 默认值为1] - 用于表示哪些天为周末的数字或字符串。\\n字符串方式：可以使用由0和1组成的字符串来指定周末，串中的第一个数字字符代表周一，最后一个则代表周日。零表示这一天是工作日，1表示这一天为周末。例如，“0000011”表示将周六和周日作为周末。\\n数字方式：这种方式不使用上述字符串形式，而是使用一个数字。1 =周六/周日为周末，2 =周日/周一为周末，依此类推则7 =周五/周六。11 =周日为唯一周末，12 =周一为唯一周末，依此类推则17 =周六为唯一周末。\",\r\n                },\r\n                {\r\n                    name: \"holidays\",\r\n                    detail:\r\n                        \"[ 可选 ] - 这是一个范围或数组常量，其中包含作为节假日的日期。\\n在节假日数组内提供的值必须为日期序数值（例如N的返回值）或日期值（例如DATE、DATEVALUE或TO_DATE的返回值）。由范围指定的值应该是标准的日期值或日期序数值。\",\r\n                },\r\n            ],\r\n        },\r\n        YEAR: {\r\n            d: \"返回对应于某个日期的年份。 Year 作为 1900 - 9999 之间的整数返回。\",\r\n            a: \"返回对应于某个日期的年份。 Year 作为 1900 - 9999 之间的整数返回。\",\r\n            p: [\r\n                {\r\n                    name: \"serial_number\",\r\n                    detail:\r\n                        \"用于计算年份的日期。必须是以下一种：对包含日期的单元格的引用、返回日期类型的函数或者数字。\",\r\n                },\r\n            ],\r\n        },\r\n        YEARFRAC: {\r\n            d: \"返回 start_date 和 end_date 之间的天数占全年天数的百分比。\",\r\n            a: \"返回 start_date 和 end_date 之间的天数占全年天数的百分比。\",\r\n            p: [\r\n                {\r\n                    name: \"start_date\",\r\n                    detail:\r\n                        \"计算中要使用的开始日期。必须是以下一种：对包含日期的单元格的引用、返回日期类型的函数或者数字。\",\r\n                },\r\n                {\r\n                    name: \"end_date\",\r\n                    detail:\r\n                        \"计算中要使用的结束日期。必须是以下一种：对包含日期的单元格的引用、返回日期类型的函数或者数字。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 要使用的日计数基准类型。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        TODAY: {\r\n            d: \"以日期值格式返回当前日期。\",\r\n            a: \"以日期值格式返回当前日期。\",\r\n            p: [],\r\n        },\r\n        MONTH: {\r\n            d: \"返回日期（以序列数表示）中的月份。 月份是介于 1（一月）到 12（十二月）之间的整数。\",\r\n            a: \"返回日期（以序列数表示）中的月份。 月份是介于 1（一月）到 12（十二月）之间的整数。\",\r\n            p: [\r\n                {\r\n                    name: \"serial_number\",\r\n                    detail:\r\n                        \"要从中提取月份的日期。必须是以下一种：对包含日期的单元格的引用、返回日期类型的函数或者数字。\",\r\n                },\r\n            ],\r\n        },\r\n        EFFECT: {\r\n            d: \"根据名义利率及每年的复利计息期数来计算实际年利率。\",\r\n            a: \"根据名义利率及每年的复利计息期数来计算实际年利率。\",\r\n            p: [\r\n                {\r\n                    name: \"nominal_rate\",\r\n                    detail: \"每年的名义利率。\",\r\n                },\r\n                {\r\n                    name: \"npery\",\r\n                    detail: \"每年的复利计算期数。\",\r\n                },\r\n            ],\r\n        },\r\n        DOLLAR: {\r\n            d: \"将数字格式设置为与语言区域相对应的货币格式。\",\r\n            a: \"将数字格式设置为与语言区域相对应的货币格式。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"要设置格式的值。\",\r\n                },\r\n                {\r\n                    name: \"decimals\",\r\n                    detail: \"[可选 - 默认值为 2] - 要显示的小数位数。\\n\\n如果这是负数，则将数字四舍五入到小数点左侧。\",\r\n                },\r\n            ],\r\n        },\r\n        DOLLARDE: {\r\n            d: \"将以整数部分和分数部分转换为以小数部分表示的金额数字\",\r\n            a: \"将以整数部分和分数部分转换为以小数部分表示的金额数字\",\r\n            p: [\r\n                {\r\n                    name: \"fractional_dollar\",\r\n                    detail: \"以整数部份和分数部分表示的数字，用小数点隔开。\",\r\n                },\r\n                {\r\n                    name: \"fraction\",\r\n                    detail: \"用作分数中的分母的整数。\",\r\n                },\r\n            ],\r\n        },\r\n        DOLLARFR: {\r\n            d: \"将小数转换为分数表示的金额数字。\",\r\n            a: \"将小数转换为分数表示的金额数字。\",\r\n            p: [\r\n                {\r\n                    name: \"decimal_dollar\",\r\n                    detail: \"小数。\",\r\n                },\r\n                {\r\n                    name: \"fraction\",\r\n                    detail: \"用作分数中的分母的整数。\",\r\n                },\r\n            ],\r\n        },\r\n        DB: {\r\n            d: \"使用固定余额递减法，返回指定期间内某项固定资产的折旧值。\",\r\n            a: \"使用固定余额递减法，返回指定期间内某项固定资产的折旧值。\",\r\n            p: [\r\n                {\r\n                    name: \"cost\",\r\n                    detail: \"资产原值。\",\r\n                },\r\n                {\r\n                    name: \"salvage\",\r\n                    detail: \"折旧末尾时的值（有时也称为资产残值）。\",\r\n                },\r\n                {\r\n                    name: \"life\",\r\n                    detail: \"资产的折旧期数（有时也称作资产的使用寿命）。\",\r\n                },\r\n                {\r\n                    name: \"period\",\r\n                    detail: \"在使用期限内要计算折旧的折旧期。\",\r\n                },\r\n                {\r\n                    name: \"month\",\r\n                    detail: \"[可选 - 默认值为12] - 折旧第一年中的月数。\",\r\n                },\r\n            ],\r\n        },\r\n        DDB: {\r\n            d: \"用双倍余额递减法，返回指定期间内某项固定资产的折旧值。\",\r\n            a: \"用双倍余额递减法，返回指定期间内某项固定资产的折旧值。\",\r\n            p: [\r\n                {\r\n                    name: \"cost\",\r\n                    detail: \"资产原值。\",\r\n                },\r\n                {\r\n                    name: \"salvage\",\r\n                    detail: \"折旧末尾时的值（有时也称为资产残值）。\",\r\n                },\r\n                {\r\n                    name: \"life\",\r\n                    detail: \"资产的折旧期数（有时也称作资产的使用寿命）。\",\r\n                },\r\n                {\r\n                    name: \"period\",\r\n                    detail: \"在使用期限内要计算折旧的折旧期。\",\r\n                },\r\n                {\r\n                    name: \"factor\",\r\n                    detail: \"[可选 - 默认值为2] - 折旧的递减系数。\",\r\n                },\r\n            ],\r\n        },\r\n        RATE: {\r\n            d: \"返回年金每期的利率。\",\r\n            a: \"返回年金每期的利率。\",\r\n            p: [\r\n                {\r\n                    name: \"nper\",\r\n                    detail: \"年金的付款总期数。\",\r\n                },\r\n                {\r\n                    name: \"pmt\",\r\n                    detail: \"每期的付款金额，在年金周期内不能更改。\",\r\n                },\r\n                {\r\n                    name: \"pv\",\r\n                    detail: \"现值即一系列未来付款当前值的总和。\",\r\n                },\r\n                {\r\n                    name: \"fv\",\r\n                    detail: \"[可选 - 默认值为0] - 未来值，或在最后一次付款后希望得到的现金余额。\",\r\n                },\r\n                {\r\n                    name: \"type\",\r\n                    detail: \"[可选 - 默认值为0] - 指定各期的付款时间是在期初还是期末。\\n\\n0 表示期末；\\n\\n1 表示期初。\",\r\n                },\r\n                {\r\n                    name: \"guess\",\r\n                    detail: \"[可选 - 默认值为0.1] - 预期利率。\",\r\n                },\r\n            ],\r\n        },\r\n        CUMPRINC: {\r\n            d: \"基于等额分期付款和固定利率，计算投资在多个付款期内的累计本金偿还额。\",\r\n            a: \"基于等额分期付款和固定利率，计算投资在多个付款期内的累计本金偿还额。\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"利率。\",\r\n                },\r\n                {\r\n                    name: \"nper\",\r\n                    detail: \"总付款期数。\",\r\n                },\r\n                {\r\n                    name: \"pv\",\r\n                    detail: \"年金的现值。\",\r\n                },\r\n                {\r\n                    name: \"start_period\",\r\n                    detail: \"开始累计计算的付款期序号。\\n\\n首期必须大于等于1。\",\r\n                },\r\n                {\r\n                    name: \"end_period\",\r\n                    detail: \"结束累计计算的付款期序号。\\n\\n末期必须大于首期。\",\r\n                },\r\n                {\r\n                    name: \"type\",\r\n                    detail: \"指定各期的付款时间是在期初还是期末。\\n\\n0 表示期末；\\n\\n1 表示期初。\",\r\n                },\r\n            ],\r\n        },\r\n        COUPNUM: {\r\n            d: \"返回在结算日和到期日之间的付息次数，向上舍入到最近的整数。\",\r\n            a: \"返回在结算日和到期日之间的付息次数，向上舍入到最近的整数。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail:\r\n                        \"年付息次数。\\n\\n如果按年支付，frequency = 1；\\n\\n按半年期支付，frequency = 2；\\n\\n按季支付，frequency = 4。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        SYD: {\r\n            d: \"返回在指定期间内资产按年限总和折旧法计算的折旧。\",\r\n            a: \"返回在指定期间内资产按年限总和折旧法计算的折旧。\",\r\n            p: [\r\n                {\r\n                    name: \"cost\",\r\n                    detail: \"资产原值。\",\r\n                },\r\n                {\r\n                    name: \"salvage\",\r\n                    detail: \"折旧末尾时的值（有时也称为资产残值）。\",\r\n                },\r\n                {\r\n                    name: \"life\",\r\n                    detail: \"资产的折旧期数（有时也称作资产的使用寿命）。\",\r\n                },\r\n                {\r\n                    name: \"period\",\r\n                    detail: \"在使用期限内要计算折旧的折旧期。\",\r\n                },\r\n            ],\r\n        },\r\n        TBILLEQ: {\r\n            d: \"基于贴现率计算美国政府短期债券的等效年化收益率。\",\r\n            a: \"基于贴现率计算美国政府短期债券的等效年化收益率。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"债券的结算日期，此日期为债券发行后交付给买家的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"债券的到期或结束日期，届时可将其以面值或票面价值赎回。\",\r\n                },\r\n                {\r\n                    name: \"discount\",\r\n                    detail: \"债券购买时的贴现率。\",\r\n                },\r\n            ],\r\n        },\r\n        TBILLYIELD: {\r\n            d: \"基于价格计算美国政府短期债券的收益率。\",\r\n            a: \"基于价格计算美国政府短期债券的收益率。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"债券的结算日期，此日期为债券发行后交付给买家的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"债券的到期或结束日期，届时可将其以面值或票面价值赎回。\",\r\n                },\r\n                {\r\n                    name: \"pr\",\r\n                    detail: \"债券的购买价格。\",\r\n                },\r\n            ],\r\n        },\r\n        TBILLPRICE: {\r\n            d: \"基于贴现率计算美国政府短期债券的价格。\",\r\n            a: \"基于贴现率计算美国政府短期债券的价格。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"债券的结算日期，此日期为债券发行后交付给买家的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"债券的到期或结束日期，届时可将其以面值或票面价值赎回。\",\r\n                },\r\n                {\r\n                    name: \"discount\",\r\n                    detail: \"债券购买时的贴现率。\",\r\n                },\r\n            ],\r\n        },\r\n        PV: {\r\n            d: \"基于等额分期付款和固定利率，计算年金投资的现值。\",\r\n            a: \"基于等额分期付款和固定利率，计算年金投资的现值。\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"各期利率。\",\r\n                },\r\n                {\r\n                    name: \"nper\",\r\n                    detail: \"年金的付款总期数。\",\r\n                },\r\n                {\r\n                    name: \"pmt\",\r\n                    detail: \"每期的付款金额，在年金周期内不能更改。\",\r\n                },\r\n                {\r\n                    name: \"fv\",\r\n                    detail: \"[可选] - 未来值，或在最后一次付款后希望得到的现金余额。\",\r\n                },\r\n                {\r\n                    name: \"type\",\r\n                    detail: \"[可选 - 默认值为0] - 指定各期的付款时间是在期初还是期末。\\n\\n0 表示期末；\\n\\n1 表示期初。\",\r\n                },\r\n            ],\r\n        },\r\n        ACCRINT: {\r\n            d: \"返回定期付息证券的应计利息。\",\r\n            a: \"返回定期付息证券的应计利息。\",\r\n            p: [\r\n                {\r\n                    name: \"issue\",\r\n                    detail: \"有价证券的发行日。\",\r\n                },\r\n                {\r\n                    name: \"first_interest\",\r\n                    detail: \"有价证券的首次计息日。\",\r\n                },\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"有价证券的年息票利率。\",\r\n                },\r\n                {\r\n                    name: \"par\",\r\n                    detail: \"证券的票面值。\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail:\r\n                        \"年付息次数。\\n\\n如果按年支付，frequency = 1；\\n\\n按半年期支付，frequency = 2；\\n\\n按季支付，frequency = 4。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示““欧洲30/360”方法” - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n                {\r\n                    name: \"calc_method\",\r\n                    detail:\r\n                        \"[可选 - 默认为TRUE()] - 一个逻辑值，指定当结算日期晚于首次计息日期时用于计算总应计利息的方法。\\n\\n如果值为 TRUE，则返回从发行日到结算日的总应计利息。\\n\\n如果值为 FALSE，则返回从首次计息日到结算日的应计利息。\",\r\n                },\r\n            ],\r\n        },\r\n        ACCRINTM: {\r\n            d: \"返回在到期日支付利息的有价证券的应计利息。\",\r\n            a: \"返回在到期日支付利息的有价证券的应计利息。\",\r\n            p: [\r\n                {\r\n                    name: \"issue\",\r\n                    detail: \"有价证券的发行日。\",\r\n                },\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的到期日。\",\r\n                },\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"有价证券的年息票利率。\",\r\n                },\r\n                {\r\n                    name: \"par\",\r\n                    detail: \"证券的票面值。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        COUPDAYBS: {\r\n            d: \"返回从付息期开始到结算日的天数。\",\r\n            a: \"返回从付息期开始到结算日的天数。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail:\r\n                        \"年付息次数。\\n\\n如果按年支付，frequency = 1；\\n\\n按半年期支付，frequency = 2；\\n\\n按季支付，frequency = 4。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        COUPDAYS: {\r\n            d: \"返回结算日所在的付息期的天数。\",\r\n            a: \"返回结算日所在的付息期的天数。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail:\r\n                        \"年付息次数。\\n\\n如果按年支付，frequency = 1；\\n\\n按半年期支付，frequency = 2；\\n\\n按季支付，frequency = 4。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        COUPDAYSNC: {\r\n            d: \"返回从结算日到下一票息支付日之间的天数。\",\r\n            a: \"返回从结算日到下一票息支付日之间的天数。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail:\r\n                        \"年付息次数。\\n\\n如果按年支付，frequency = 1；\\n\\n按半年期支付，frequency = 2；\\n\\n按季支付，frequency = 4。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        COUPNCD: {\r\n            d: \"计算结算日之后的下一票息或利息派发日期。\",\r\n            a: \"计算结算日之后的下一票息或利息派发日期。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail:\r\n                        \"年付息次数。\\n\\n如果按年支付，frequency = 1；\\n\\n按半年期支付，frequency = 2；\\n\\n按季支付，frequency = 4。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        COUPPCD: {\r\n            d: \"计算结算日之前的最后一个票息或利息支付日。\",\r\n            a: \"计算结算日之前的最后一个票息或利息支付日。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail:\r\n                        \"年付息次数。\\n\\n如果按年支付，frequency = 1；\\n\\n按半年期支付，frequency = 2；\\n\\n按季支付，frequency = 4。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        FV: {\r\n            d: \"基于等额分期付款和固定利率，计算年金投资的未来价值。\",\r\n            a: \"基于等额分期付款和固定利率，计算年金投资的未来价值。\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"各期利率。\",\r\n                },\r\n                {\r\n                    name: \"nper\",\r\n                    detail: \"年金的付款总期数。\",\r\n                },\r\n                {\r\n                    name: \"pmt\",\r\n                    detail: \"各期所应支付的金额，在整个年金期间保持不变。\",\r\n                },\r\n                {\r\n                    name: \"pv\",\r\n                    detail: \"[可选 - 默认值为 0 ] - 现值，或一系列未来付款的当前值的累积和。\",\r\n                },\r\n                {\r\n                    name: \"type\",\r\n                    detail:\r\n                        \"[可选 - 默认值为 0 ] - 指定各期的付款时间是在期初还是期末。\\n\\n0 表示期末；\\n\\n1 表示期初。\",\r\n                },\r\n            ],\r\n        },\r\n        FVSCHEDULE: {\r\n            d: \"返回应用一系列复利率计算的初始本金的未来值。\",\r\n            a: \"返回应用一系列复利率计算的初始本金的未来值。\",\r\n            p: [\r\n                {\r\n                    name: \"principal\",\r\n                    detail: \"现值。\",\r\n                },\r\n                {\r\n                    name: \"schedule\",\r\n                    detail:\r\n                        \"用于计算本金复利的一组利率。\\n\\n利率表必须是范围或数组，其中包含要用于计算复利的一组利率。这些利率值应该以十进制小数形式表示，或者使用UNARY_PERCENT以百分比形式表示，即表示为0.09或UNARY_PERCENT(9)，而不要表示为9。\",\r\n                },\r\n            ],\r\n        },\r\n        YIELD: {\r\n            d: \"返回定期支付利息的债券的收益率。\",\r\n            a: \"返回定期支付利息的债券的收益率。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"有价证券的年息票利率。\",\r\n                },\r\n                {\r\n                    name: \"pr\",\r\n                    detail: \"有价证券的价格。\",\r\n                },\r\n                {\r\n                    name: \"redemption\",\r\n                    detail: \"有价证券的清偿价值。\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail:\r\n                        \"年付息次数。\\n\\n如果按年支付，frequency = 1；\\n\\n按半年期支付，frequency = 2；\\n\\n按季支付，frequency = 4。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        YIELDDISC: {\r\n            d: \"基于价格计算折价发行的（不带息）债券的年收益率。\",\r\n            a: \"基于价格计算折价发行的（不带息）债券的年收益率。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"pr\",\r\n                    detail: \"有价证券的价格。\",\r\n                },\r\n                {\r\n                    name: \"redemption\",\r\n                    detail: \"有价证券的清偿价值。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        NOMINAL: {\r\n            d: \"基于给定的实际利率和年复利期数，返回名义年利率。\",\r\n            a: \"基于给定的实际利率和年复利期数，返回名义年利率。\",\r\n            p: [\r\n                {\r\n                    name: \"effect_rate\",\r\n                    detail: \"每年的实际利率。\",\r\n                },\r\n                {\r\n                    name: \"npery\",\r\n                    detail: \"每年的复利期数。\",\r\n                },\r\n            ],\r\n        },\r\n        XIRR: {\r\n            d: \"返回一组不一定定期发生的现金流的内部收益率。\",\r\n            a: \"返回一组不一定定期发生的现金流的内部收益率。\",\r\n            p: [\r\n                {\r\n                    name: \"values\",\r\n                    detail:\r\n                        \"其中含有投资相关收益或支出的数组或范围。\\n\\n现金流数额中必须至少包含一项负的和一项正的现金流金额才能计算回报率。\",\r\n                },\r\n                {\r\n                    name: \"dates\",\r\n                    detail: \"与现金流数额参数中的现金流对应的日期数组或范围。\",\r\n                },\r\n                {\r\n                    name: \"guess\",\r\n                    detail: \"[可选 - 默认值为0.1] - 对内部回报率的估算值。\",\r\n                },\r\n            ],\r\n        },\r\n        MIRR: {\r\n            d: \"返回一系列定期现金流的修改后内部收益率。\",\r\n            a: \"返回一系列定期现金流的修改后内部收益率。\",\r\n            p: [\r\n                {\r\n                    name: \"values\",\r\n                    detail:\r\n                        \"其中含有投资相关收益或支出的数组或范围。\\n\\n现金流数额中必须至少包含一项负的和一项正的现金流金额才能计算回报率。\",\r\n                },\r\n                {\r\n                    name: \"finance_rate\",\r\n                    detail: \"现金流中使用的资金支付的利率。\",\r\n                },\r\n                {\r\n                    name: \"reinvest_rate\",\r\n                    detail: \"将现金流再投资的收益率。\",\r\n                },\r\n            ],\r\n        },\r\n        IRR: {\r\n            d: \"返回由值中的数字表示的一系列现金流的内部收益率。 \",\r\n            a: \"返回由值中的数字表示的一系列现金流的内部收益率。 \",\r\n            p: [\r\n                {\r\n                    name: \"values\",\r\n                    detail:\r\n                        \"其中含有投资相关收益或支出的数组或范围。\\n\\n现金流数额中必须至少包含一项负的和一项正的现金流金额才能计算回报率。\",\r\n                },\r\n                {\r\n                    name: \"guess\",\r\n                    detail: \"[可选 - 默认为 0.1] - 内部收益率的估值。\",\r\n                },\r\n            ],\r\n        },\r\n        NPV: {\r\n            d: \"使用贴现率和一系列未来支出（负值）和收益（正值）来计算一项投资的净现值。\",\r\n            a: \"使用贴现率和一系列未来支出（负值）和收益（正值）来计算一项投资的净现值。\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"某一期间的贴现率。\",\r\n                },\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"第一笔支出（负值）和收益（正值）。\",\r\n                },\r\n                {\r\n                    name: \"value2, ...\",\r\n                    detail: \"[可选] - 其他支出（负值）和收益（正值）。\",\r\n                },\r\n            ],\r\n        },\r\n        XNPV: {\r\n            d: \"返回一组现金流的净现值，这些现金流不一定定期发生。\",\r\n            a: \"返回一组现金流的净现值，这些现金流不一定定期发生。\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"应用于现金流的贴现率。\",\r\n                },\r\n                {\r\n                    name: \"values\",\r\n                    detail: \"与 dates 中的支付时间相对应的一系列现金流。\",\r\n                },\r\n                {\r\n                    name: \"dates\",\r\n                    detail: \"与现金流支付相对应的支付日期表。\",\r\n                },\r\n            ],\r\n        },\r\n        CUMIPMT: {\r\n            d: \"基于等额分期付款和固定利率，计算投资在一系列付款期内的累计利息。\",\r\n            a: \"基于等额分期付款和固定利率，计算投资在一系列付款期内的累计利息。\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"利息率。\",\r\n                },\r\n                {\r\n                    name: \"nper\",\r\n                    detail: \"总付款期数。\",\r\n                },\r\n                {\r\n                    name: \"pv\",\r\n                    detail: \"现值。\",\r\n                },\r\n                {\r\n                    name: \"start_period\",\r\n                    detail: \"开始累计计算的付款期序号。\\n\\n首期必须大于等于1。\",\r\n                },\r\n                {\r\n                    name: \"end_period\",\r\n                    detail: \"结束累计计算的付款期序号。\\n\\n末期必须大于首期。\",\r\n                },\r\n                {\r\n                    name: \"type\",\r\n                    detail: \"指定各期的付款时间是在期初还是期末。\\n\\n0 表示期末；\\n\\n1 表示期初。\",\r\n                },\r\n            ],\r\n        },\r\n        PMT: {\r\n            d: \"用于根据固定付款额和固定利率计算贷款的付款额。\",\r\n            a: \"用于根据固定付款额和固定利率计算贷款的付款额。\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"贷款利率。\",\r\n                },\r\n                {\r\n                    name: \"nper\",\r\n                    detail: \"该项贷款的付款总数。\",\r\n                },\r\n                {\r\n                    name: \"pv\",\r\n                    detail: \"现值，或一系列未来付款额现在所值的总额，也叫本金。\",\r\n                },\r\n                {\r\n                    name: \"fv\",\r\n                    detail: \"[可选 - 默认值为 0] - 未来值，或在最后一次付款后希望得到的现金余额。\",\r\n                },\r\n                {\r\n                    name: \"type\",\r\n                    detail:\r\n                        \"[可选 - 默认值为 0] - 指定各期的付款时间是在期初还是期末。\\n\\n0 表示期末；\\n\\n1 表示期初。\",\r\n                },\r\n            ],\r\n        },\r\n        IPMT: {\r\n            d: \"基于固定利率及等额分期付款方式，返回给定期数内对投资的利息偿还额。\",\r\n            a: \"基于固定利率及等额分期付款方式，返回给定期数内对投资的利息偿还额。\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"各期利率。\",\r\n                },\r\n                {\r\n                    name: \"per\",\r\n                    detail: \"用于计算其利息数额的期数，必须在 1 到 nper 之间。\",\r\n                },\r\n                {\r\n                    name: \"nper\",\r\n                    detail: \"年金的付款总期数。\",\r\n                },\r\n                {\r\n                    name: \"pv\",\r\n                    detail: \"现值，或一系列未来付款的当前值的累积和。\",\r\n                },\r\n                {\r\n                    name: \"fv\",\r\n                    detail: \"[可选 - 默认值为 0] - 未来值，或在最后一次付款后希望得到的现金余额。\",\r\n                },\r\n                {\r\n                    name: \"type\",\r\n                    detail:\r\n                        \"[可选 - 默认值为 0] - 指定各期的付款时间是在期初还是期末。\\n\\n0 表示期末；\\n\\n1 表示期初。\",\r\n                },\r\n            ],\r\n        },\r\n        PPMT: {\r\n            d: \"返回根据定期固定付款和固定利率而定的投资在已知期间内的本金偿付额。\",\r\n            a: \"返回根据定期固定付款和固定利率而定的投资在已知期间内的本金偿付额。\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"各期利率。\",\r\n                },\r\n                {\r\n                    name: \"per\",\r\n                    detail: \"指定期数，该值必须在 1 到 nper 范围内。\",\r\n                },\r\n                {\r\n                    name: \"nper\",\r\n                    detail: \"年金的付款总期数。\",\r\n                },\r\n                {\r\n                    name: \"pv\",\r\n                    detail: \"现值即一系列未来付款当前值的总和。\",\r\n                },\r\n                {\r\n                    name: \"fv\",\r\n                    detail: \"[可选 - 默认值为 0] - 未来值，或在最后一次付款后希望得到的现金余额。\",\r\n                },\r\n                {\r\n                    name: \"type\",\r\n                    detail:\r\n                        \"[可选 - 默认值为 0] - 指定各期的付款时间是在期初还是期末。\\n\\n0 表示期末；\\n\\n1 表示期初。\",\r\n                },\r\n            ],\r\n        },\r\n        INTRATE: {\r\n            d: \"返回完全投资型证券的利率。\",\r\n            a: \"返回完全投资型证券的利率。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"investment\",\r\n                    detail: \"有价证券的投资额。\",\r\n                },\r\n                {\r\n                    name: \"redemption\",\r\n                    detail: \"有价证券到期时的兑换值。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        PRICE: {\r\n            d: \"返回定期付息的面值 ￥100 的有价证券的价格。\",\r\n            a: \"返回定期付息的面值 ￥100 的有价证券的价格。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"有价证券的年息票利率。\",\r\n                },\r\n                {\r\n                    name: \"yld\",\r\n                    detail: \"有价证券的年收益率。\",\r\n                },\r\n                {\r\n                    name: \"redemption\",\r\n                    detail: \"面值 ￥100 的有价证券的清偿价值。\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail:\r\n                        \"年付息次数。\\n\\n如果按年支付，frequency = 1；\\n\\n按半年期支付，frequency = 2；\\n\\n按季支付，frequency = 4。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        PRICEDISC: {\r\n            d: \"返回折价发行的面值 ￥100 的有价证券的价格。\",\r\n            a: \"返回折价发行的面值 ￥100 的有价证券的价格。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"discount\",\r\n                    detail: \"有价证券的贴现率。\",\r\n                },\r\n                {\r\n                    name: \"redemption\",\r\n                    detail: \"面值 ￥100 的有价证券的清偿价值。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        PRICEMAT: {\r\n            d: \"返回到期付息的面值 ￥100 的有价证券的价格。\",\r\n            a: \"返回到期付息的面值 ￥100 的有价证券的价格。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"issue\",\r\n                    detail: \"有价证券的发行日。\",\r\n                },\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"有价证券在发行日的利率。\",\r\n                },\r\n                {\r\n                    name: \"yld\",\r\n                    detail: \"有价证券的年收益率。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        RECEIVED: {\r\n            d: \"返回一次性付息的有价证券到期收回的金额。\",\r\n            a: \"返回一次性付息的有价证券到期收回的金额。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"investment\",\r\n                    detail: \"有价证券的投资额。\",\r\n                },\r\n                {\r\n                    name: \"discount\",\r\n                    detail: \"有价证券的贴现率。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        DISC: {\r\n            d: \"返回有价证券的贴现率。\",\r\n            a: \"返回有价证券的贴现率。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"pr\",\r\n                    detail: \"有价证券的价格（按面值为 ￥100 计算）。\",\r\n                },\r\n                {\r\n                    name: \"redemption\",\r\n                    detail: \"面值 ￥100 的有价证券的清偿价值。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        NPER: {\r\n            d: \"基于固定利率及等额分期付款方式，返回某项投资的总期数。\",\r\n            a: \"基于固定利率及等额分期付款方式，返回某项投资的总期数。\",\r\n            p: [\r\n                {\r\n                    name: \"rate\",\r\n                    detail: \"各期利率。\",\r\n                },\r\n                {\r\n                    name: \"pmt\",\r\n                    detail: \"各期所应支付的金额，在整个年金期间保持不变。\",\r\n                },\r\n                {\r\n                    name: \"pv\",\r\n                    detail: \"现值，或一系列未来付款的当前值的累积和。\",\r\n                },\r\n                {\r\n                    name: \"fv\",\r\n                    detail: \"[可选 - 默认值为0] - 未来值，或在最后一次付款后希望得到的现金余额。\",\r\n                },\r\n                {\r\n                    name: \"type\",\r\n                    detail: \"[可选 - 默认值为0] - 指定各期的付款时间是在期初还是期末。\\n\\n0 表示期末；\\n\\n1 表示期初。\",\r\n                },\r\n            ],\r\n        },\r\n        SLN: {\r\n            d: \"返回一个期间内的资产的直线折旧。\",\r\n            a: \"返回一个期间内的资产的直线折旧。\",\r\n            p: [\r\n                {\r\n                    name: \"cost\",\r\n                    detail: \"资产原值。\",\r\n                },\r\n                {\r\n                    name: \"salvage\",\r\n                    detail: \"折旧末尾时的值（有时也称为资产残值）。\",\r\n                },\r\n                {\r\n                    name: \"life\",\r\n                    detail: \"资产的折旧期数（有时也称作资产的使用寿命）。\",\r\n                },\r\n            ],\r\n        },\r\n        DURATION: {\r\n            d: \"返回假设面值 ￥100 的定期付息有价证券的修正期限。\",\r\n            a: \"返回假设面值 ￥100 的定期付息有价证券的修正期限。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"coupon\",\r\n                    detail: \"有价证券的年息票利率。\",\r\n                },\r\n                {\r\n                    name: \"yld\",\r\n                    detail: \"有价证券的年收益率。\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail:\r\n                        \"年付息次数。\\n\\n如果按年支付，frequency = 1；\\n\\n按半年期支付，frequency = 2；\\n\\n按季支付，frequency = 4。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        MDURATION: {\r\n            d: \"返回假设面值 ￥100 的有价证券的 Macauley 修正期限。\",\r\n            a: \"返回假设面值 ￥100 的有价证券的 Macauley 修正期限。\",\r\n            p: [\r\n                {\r\n                    name: \"settlement\",\r\n                    detail: \"有价证券的结算日。 有价证券结算日是在发行日之后，有价证券卖给购买者的日期。\",\r\n                },\r\n                {\r\n                    name: \"maturity\",\r\n                    detail: \"有价证券的到期日。 到期日是有价证券有效期截止时的日期。\",\r\n                },\r\n                {\r\n                    name: \"coupon\",\r\n                    detail: \"有价证券的年息票利率。\",\r\n                },\r\n                {\r\n                    name: \"yld\",\r\n                    detail: \"有价证券的年收益率。\",\r\n                },\r\n                {\r\n                    name: \"frequency\",\r\n                    detail:\r\n                        \"年付息次数。\\n\\n如果按年支付，frequency = 1；\\n\\n按半年期支付，frequency = 2；\\n\\n按季支付，frequency = 4。\",\r\n                },\r\n                {\r\n                    name: \"basis\",\r\n                    detail:\r\n                        \"[可选 - 默认为0] - 指示要使用哪种天数计算方法。\\n\\n0表示“美国(NASD) 30/360”方法 - 此方法按照美国全国证券交易商协会标准，假设每月30天、每年360天，并对所输入的月末日期进行具体调整。\\n\\n1表示“实际/实际”方法 - 此方法计算基于指定日期之间的实际天数和所涉及的年份中的实际天数进行计算。此方法用于美国长期债券，也是在非财经用途方面使用最多的方法。\\n\\n2表示“实际/360”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为360天。\\n\\n3表示“实际/365”方法 - 此方法基于指定日期之间的实际天数进行计算，但假定每年为365天。\\n\\n4表示“欧洲30/360”方法 - 类似于0，此方法基于每月30天、每年360天进行计算，但按照欧洲金融惯例对月末日期进行调整。\",\r\n                },\r\n            ],\r\n        },\r\n        BIN2DEC: {\r\n            d: \"将二进制数转换为十进制数。\",\r\n            a: \"将二进制数转换为十进制数。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail:\r\n                        '要转换为十进制数的带符号的10位二进制数值（以字符串形式提供）。\\n\\n带符号的二进制数的最高位是符号位；也就是说，负数是以二的补码形式表示的。\\n\\n对于此函数，最大的正数输入值为0111111111，最小的负数输入值为1000000000。\\n\\n如果所提供的带符号的二进制数是有效的二进制数，会自动将其转换为相应的字符串输入。例如，BIN2DEC(100)和BIN2DEC(\"100\")得出的结果相同，均为4。',\r\n                },\r\n            ],\r\n        },\r\n        BIN2HEX: {\r\n            d: \"将二进制数转换为十六进制数。\",\r\n            a: \"将二进制数转换为十六进制数。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail:\r\n                        '要转换为带符号的十六进制数的带符号的10位二进制数值（以字符串形式提供）。\\n\\n带符号的二进制数的最高位是符号位；也就是说，负数是以二的补码形式表示的。\\n\\n对于此函数，最大的正数输入值为0111111111，最小的负数输入值为1000000000。\\n\\n如果所提供的带符号的二进制数是有效的二进制数，会自动将其转换为相应的字符串输入。例如，BIN2HEX(11111)和BIN2HEX(\"11111\")得出 的结果相同，均为1F。',\r\n                },\r\n                {\r\n                    name: \"places\",\r\n                    detail:\r\n                        '[ 可选 ] - 结果中要确保的有效位数。\\n\\n如果设置的有效位数大于结果中的有效位数，则在结果的左侧填充0，使总有效位数达到有效位数。例如，BIN2HEX(\"11111\",8)所得的结果值为0000001F。\\n\\n如果带符号的二进制数的最高位为1，则忽略此值；即当提供的带符号的二进制数大于等于1000000000时忽略此值。',\r\n                },\r\n            ],\r\n        },\r\n        BIN2OCT: {\r\n            d: \"将二进制数转换为八进制数。\",\r\n            a: \"将二进制数转换为八进制数。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail:\r\n                        '要转换为带符号的八进制数的带符号的10位二进制数值（以字符串形式提供）。\\n\\n带符号的二进制数的最高位是符号位；也就是说，负数是以二的补码形式表示的。\\n\\n对于此函数，最大的正数输入值为0111111111，最小的负数输入值为1000000000。\\n\\n如果所提供的带符号的二进制数是有效的二进制数，会自动将其转换为相应的字符串输入。例如，BIN2OCT(11111)和BIN2OCT(\"11111\")得出的结果相同，均为37。',\r\n                },\r\n                {\r\n                    name: \"places\",\r\n                    detail:\r\n                        '[ 可选 ] - 结果中要确保的有效位数。\\n\\n如果设置的有效位数大于结果中的有效位数，则在结果的左侧填充0，使总有效位数达到有效位数。例如，BIN2OCT(\"11111\")得到的结果值为00000037。\\n\\n如果带符号的二进制数的最高位为1，则忽略此值；即当提供的带符号的二进制数大于等于1000000000时忽略此值。',\r\n                },\r\n            ],\r\n        },\r\n        DEC2BIN: {\r\n            d: \"将十进制数转换为二进制数。\",\r\n            a: \"将十进制数转换为二进制数。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail:\r\n                        '要转换为带符号的二进制数的十进制数值（以字符串形式提供）。\\n\\n对于此函数，最大的正数输入值为511，最小的负数输入值为-512。\\n\\n如果所提供的十进制数是有效的十进制数，会自动将其转换为相应的字符串输入。例如，DEC2BIN(199)和DEC2BIN(\"199\")得出的结果相同，均为11000111。',\r\n                },\r\n                {\r\n                    name: \"places\",\r\n                    detail:\r\n                        \"[ 可选 ] - 结果中要确保的有效位数。\\n\\n如果设置的有效位数大于结果中的有效位数，则在结果的左侧填充0，使总有效位数达到有效位数。\\n\\n如果十进制数为负数，则忽略此值。\",\r\n                },\r\n            ],\r\n        },\r\n        DEC2HEX: {\r\n            d: \"将十进制数转换为十六进制数。\",\r\n            a: \"将十进制数转换为十六进制数。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail:\r\n                        '要转换为带符号的十六进制数的十进制数值（以字符串形式提供）。\\n\\n此函数可接受的最大正数值为549755813887，最小负数值为-549755814888。\\n\\n如果所提供的十进制数是有效的十进制数，会自动将其转换为相应的字符串输入。例如，DEC2HEX(100)和DEC2HEX(\"100\")得出的结果相同，均为64。',\r\n                },\r\n                {\r\n                    name: \"places\",\r\n                    detail:\r\n                        \"[ 可选 ] - 结果中要确保的有效位数。\\n\\n如果设置的有效位数大于结果中的有效位数，则在结果的左侧填充0，使总有效位数达到有效位数。\\n\\n如果十进制数为负数，则忽略此值。\",\r\n                },\r\n            ],\r\n        },\r\n        DEC2OCT: {\r\n            d: \"将十进制数转换为八进制数。\",\r\n            a: \"将十进制数转换为八进制数。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail:\r\n                        '要转换为带符号的八进制数的十进制数值（以字符串形式提供）。\\n\\n此函数可接受的最大正数值为536870911，最小负数值为-53687092。\\n\\n如果所提供的十进制数是有效的十进制数，会自动将其转换为相应的字符串输入。例如，DEC2OCT(199)和DEC2OCT(\"199\")得出的结果相同，均为307。',\r\n                },\r\n                {\r\n                    name: \"places\",\r\n                    detail:\r\n                        \"[ 可选 ] - 结果中要确保的有效位数。\\n\\n如果设置的有效位数大于结果中的有效位数，则在结果的左侧填充0，使总有效位数达到有效位数。\\n\\n如果十进制数为负数，则忽略此值。\",\r\n                },\r\n            ],\r\n        },\r\n        HEX2BIN: {\r\n            d: \"将十六进制数转换为二进制数。\",\r\n            a: \"将十六进制数转换为二进制数。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail:\r\n                        '要转换为带符号的二进制数的带符号的40位十六进制数值（以字符串形式提供）。\\n\\n带符号的十六进制数的最高位是符号位；也就是说，负数是以二的补码形式表示的。\\n\\n此函数可接受的最大正数值为1FF，最小负数值为FFFFFFFE00。\\n\\n如果所提供的带符号的十六进制数是有效的十六进制数，函数会自动将其转换为相应的字符串输入。例如，HEX2BIN(199)和HEX2BIN(\"199\")得出的结果相同，均为110011001。',\r\n                },\r\n                {\r\n                    name: \"places\",\r\n                    detail:\r\n                        \"[ 可选 ] - 结果中要确保的有效位数。\\n\\n如果设置的有效位数大于结果中的有效位数，则在结果的左侧填充0，使总有效位数达到有效位数。\\n\\n如果带符号的十六进制数的最高位为1，则忽略此值；即当提供的带符号的十六进制数大于等于8000000000时忽略此值。\",\r\n                },\r\n            ],\r\n        },\r\n        HEX2DEC: {\r\n            d: \"将十六进制数转换为十进制数。\",\r\n            a: \"将十六进制数转换为十进制数。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail:\r\n                        '要转换为十进制数的带符号的40位十六进制数值（以字符串形式提供）。\\n\\n带符号的十六进制数的最高位是符号位；也就是说，负数是以二的补码形式表示的。\\n\\n此函数可接受的最大正数值为7fffffffff，最小负数值为8000000000。\\n\\n如果所提供的带符号的十六进制数是有效的十六进制数，函数会自动将其转换为相应的字符串输入。例如，HEX2DEC(199)和HEX2DEC(\"199\")得出的结果相同，均为409。',\r\n                },\r\n            ],\r\n        },\r\n        HEX2OCT: {\r\n            d: \"将十六进制数转换为八进制数。\",\r\n            a: \"将十六进制数转换为八进制数。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail:\r\n                        '要转换为带符号的八进制数的带符号的40位十六进制数值（以字符串形式提供）。\\n\\n带符号的十六进制数的最高位是符号位；也就是说，负数是以二的补码形式表示的。\\n\\n此函数可接受的最大正数值为1FFFFFFF，最小负数值为FFE0000000。\\n\\n如果所提供的带符号的十六进制数是有效的十六进制数，函数会自动将其转换为相应的字符串输入。例如，HEX2OCT(199)和HEX2OCT(\"199\")得出的结果相同，均为631。',\r\n                },\r\n                {\r\n                    name: \"places\",\r\n                    detail:\r\n                        \"[ 可选 ] - 结果中要确保的有效位数。\\n\\n如果设置的有效位数大于结果中的有效位数，则在结果的左侧填充0，使总有效位数达到有效位数。\\n\\n如果带符号的十六进制数的最高位为1，则忽略此值；即当给定的带符号的十六进制数大于等于8000000000时忽略此值。\",\r\n                },\r\n            ],\r\n        },\r\n        OCT2BIN: {\r\n            d: \"将八进制数转换为二进制数。\",\r\n            a: \"将八进制数转换为二进制数。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail:\r\n                        '要转换为带符号的二进制数的带符号的30位八进制数值（以字符串形式提供）。\\n\\n带符号的八进制数的最高位是符号位；也就是说，负数是以二的补码形式表示的。\\n\\n此函数可接受的最大正数值为777，最小负数值为7777777000。\\n\\n如果所提供的带符号的八进制数是有效的八进制数，函数会自动将其转换为相应的字符串输入。例如，OCT2BIN(177)和OCT2BIN(\"177\")得出的结果相同，均为1111111。',\r\n                },\r\n                {\r\n                    name: \"places\",\r\n                    detail:\r\n                        \"[ 可选 ] - 结果中要确保的有效位数。\\n\\n如果设置的有效位数大于结果中的有效位数，则在结果的左侧填充0，使总有效位数达到有效位数。\\n\\n如果带符号的八进制数的最高位为1，则忽略此值；即当给定的带符号的八进制数大于等于4000000000时忽略此值。\",\r\n                },\r\n            ],\r\n        },\r\n        OCT2DEC: {\r\n            d: \"将八进制数转换为十进制数。\",\r\n            a: \"将八进制数转换为十进制数。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail:\r\n                        '要转换为十进制数的带符号的30位八进制数值（以字符串形式提供）。\\n\\n带符号的ba进制数的最高位是符号位；也就是说，负数是以二的补码形式表示的。\\n\\n此函数可接受的最大正数值为3777777777，最小负数值为4000000000。\\n\\n如果所提供的带符号的八进制数是有效的八进制数，函数会自动将其转换为相应的字符串输入。例如，OCT2DEC(177)和OCT2DEC(\"177\")得出的结果相同，均为127。',\r\n                },\r\n            ],\r\n        },\r\n        OCT2HEX: {\r\n            d: \"将八进制数转换为十六进制数。\",\r\n            a: \"将八进制数转换为十六进制数。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail:\r\n                        '要转换为带符号的十六进制数的带符号的30位八进制数值（以字符串形式提供）。\\n\\n带符号的ba进制数的最高位是符号位；也就是说，负数是以二的补码形式表示的。\\n\\n此函数可接受的最大正数值为3777777777，最小负数值为4000000000。\\n\\n如果所提供的带符号的八进制数是有效的八进制数，函数会自动将其转换为相应的字符串输入。例如，OCT2HEX(177)和OCT2HEX(\"177\")得出的结果相同，均为7F。',\r\n                },\r\n                {\r\n                    name: \"places\",\r\n                    detail:\r\n                        \"[ 可选 ] - 结果中要确保的有效位数。\\n\\n如果设置的有效位数大于结果中的有效位数，则在结果的左侧填充0，使总有效位数达到有效位数。\\n\\n如果带符号的八进制数的最高位为1，则忽略此值；即当给定的带符号的八进制数大于等于4000000000时忽略此值。\",\r\n                },\r\n            ],\r\n        },\r\n        COMPLEX: {\r\n            d: \"将实系数及虚系数转换为 x+yi 或 x+yj 形式的复数。\",\r\n            a: \"将实系数及虚系数转换为 x+yi 或 x+yj 形式的复数。\",\r\n            p: [\r\n                {\r\n                    name: \"real_num\",\r\n                    detail: \"复数的实系数。\",\r\n                },\r\n                {\r\n                    name: \"i_num\",\r\n                    detail: \"复数的虚系数。\",\r\n                },\r\n                {\r\n                    name: \"suffix\",\r\n                    detail: '[可选 - 默认为 \"i\"] - 复数中虚系数的后缀。',\r\n                },\r\n            ],\r\n        },\r\n        IMREAL: {\r\n            d: \"返回以 x+yi 或 x+yj 文本格式表示的复数的实系数。\",\r\n            a: \"返回以 x+yi 或 x+yj 文本格式表示的复数的实系数。\",\r\n            p: [\r\n                {\r\n                    name: \"inumber\",\r\n                    detail: \"需要计算其实系数的复数。\",\r\n                },\r\n            ],\r\n        },\r\n        IMAGINARY: {\r\n            d: \"返回以 x+yi 或 x+yj 文本格式表示的复数的虚系数。\",\r\n            a: \"返回以 x+yi 或 x+yj 文本格式表示的复数的虚系数。\",\r\n            p: [\r\n                {\r\n                    name: \"inumber\",\r\n                    detail: \"需要计算其虚系数的复数。\",\r\n                },\r\n            ],\r\n        },\r\n        IMCONJUGATE: {\r\n            d: \"返回以 x+yi 或 x+yj 文本格式表示的复数的共轭复数。\",\r\n            a: \"返回以 x+yi 或 x+yj 文本格式表示的复数的共轭复数。\",\r\n            p: [\r\n                {\r\n                    name: \"inumber\",\r\n                    detail: \"需要计算其共轭数的复数。\",\r\n                },\r\n            ],\r\n        },\r\n        IMABS: {\r\n            d: \"返回以 x+yi 或 x+yj 文本格式表示的复数的绝对值（模）。\",\r\n            a: \"返回以 x+yi 或 x+yj 文本格式表示的复数的绝对值（模）。\",\r\n            p: [\r\n                {\r\n                    name: \"inumber\",\r\n                    detail: \"要计算其绝对值的复数。\",\r\n                },\r\n            ],\r\n        },\r\n        DELTA: {\r\n            d: \"检验两个值是否相等。 如果 number1=number2，则返回 1；否则返回 0。\",\r\n            a: \"检验两个值是否相等。 如果 number1=number2，则返回 1；否则返回 0。\",\r\n            p: [\r\n                {\r\n                    name: \"number1\",\r\n                    detail: \"第一个数字。\",\r\n                },\r\n                {\r\n                    name: \"number2\",\r\n                    detail: \"[可选 - 默认为 0] - 第二个数字。\",\r\n                },\r\n            ],\r\n        },\r\n        IMSUM: {\r\n            d: \"返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 个复数的和。\",\r\n            a: \"返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 个复数的和。\",\r\n            p: [\r\n                {\r\n                    name: \"inumber1\",\r\n                    detail: \"要相加的第一个复数\",\r\n                },\r\n                {\r\n                    name: \"inumber2, …\",\r\n                    detail: \"[可选] - 要与值1 相加的其他复数\",\r\n                },\r\n            ],\r\n        },\r\n        IMSUB: {\r\n            d: \"返回以 x+yi 或 x+yj 文本格式表示的两个复数的差。\",\r\n            a: \"返回以 x+yi 或 x+yj 文本格式表示的两个复数的差。\",\r\n            p: [\r\n                {\r\n                    name: \"inumber1\",\r\n                    detail: \"从（复）数中减去 inumber2。\",\r\n                },\r\n                {\r\n                    name: \"inumber2\",\r\n                    detail: \"从 inumber1 中减（复）数。\",\r\n                },\r\n            ],\r\n        },\r\n        IMPRODUCT: {\r\n            d: \"返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 个复数的乘积。\",\r\n            a: \"返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 个复数的乘积。\",\r\n            p: [\r\n                {\r\n                    name: \"inumber1\",\r\n                    detail: \"用于计算乘积的第一个复数\",\r\n                },\r\n                {\r\n                    name: \"inumber2, …\",\r\n                    detail: \"[可选] - 要相乘的其他复数。\",\r\n                },\r\n            ],\r\n        },\r\n        IMDIV: {\r\n            d: \"返回以 x+yi 或 x+yj 文本格式表示的两个复数的商。\",\r\n            a: \"返回以 x+yi 或 x+yj 文本格式表示的两个复数的商。\",\r\n            p: [\r\n                {\r\n                    name: \"inumber1\",\r\n                    detail: \"复数分子或被除数。\",\r\n                },\r\n                {\r\n                    name: \"inumber2\",\r\n                    detail: \"复数分母或除数。\",\r\n                },\r\n            ],\r\n        },\r\n        NOT: {\r\n            d: \"返回某个逻辑值的相反值 - “NOT(TRUE())”将返回 FALSE；“NOT(FALSE())”将返回 TRUE。\",\r\n            a: \"返回某个逻辑值的相反值 - “NOT(TRUE())”将返回 FALSE；“NOT(FALSE())”将返回 TRUE。\",\r\n            p: [\r\n                {\r\n                    name: \"logical\",\r\n                    detail: \"计算结果为 TRUE 或 FALSE 的任何值或表达式。\",\r\n                },\r\n            ],\r\n        },\r\n        TRUE: {\r\n            d: \"返回逻辑值 TRUE。\",\r\n            a: \"返回逻辑值 TRUE。\",\r\n            p: [],\r\n        },\r\n        FALSE: {\r\n            d: \"返回逻辑值 FALSE。\",\r\n            a: \"返回逻辑值 FALSE。\",\r\n            p: [],\r\n        },\r\n        AND: {\r\n            d: \"所有参数的计算结果为 TRUE 时，返回 TRUE；只要有一个参数的计算结果为 FALSE，即返回 FALSE。\",\r\n            a: \"所有参数的计算结果为 TRUE 时，返回 TRUE；只要有一个参数的计算结果为 FALSE，即返回 FALSE。\",\r\n            p: [\r\n                {\r\n                    name: \"logical1\",\r\n                    detail: \"要测试的第一个条件，其计算结果可以为 TRUE 或 FALSE。\",\r\n                },\r\n                {\r\n                    name: \"logical2,...\",\r\n                    detail: \"[可选] - 要测试的其他条件，其计算结果可以为 TRUE 或 FALSE，最多可包含 255 个条件。\",\r\n                },\r\n            ],\r\n        },\r\n        IFERROR: {\r\n            d: \"如果第一个参数不是错误值，就返回第一个参数；否则，返回第二个参数。\",\r\n            a: \"如果第一个参数不是错误值\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"检查是否存在错误的参数。\",\r\n                },\r\n                {\r\n                    name: \"value_if_error\",\r\n                    detail:\r\n                        \"公式的计算结果错误时返回的值。 计算以下错误类型：#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME? 或 #NULL!。\",\r\n                },\r\n            ],\r\n        },\r\n        IF: {\r\n            d: \"当逻辑表达式的值为 TRUE 时返回一个值，而当其为 FALSE 时返回另一个值。\",\r\n            a: \"当逻辑表达式的值为 TRUE 时返回一个值，而当其为 FALSE 时返回另一个值。\",\r\n            p: [\r\n                {\r\n                    name: \"logical_test\",\r\n                    detail: \"一个表达式或对包含表达式的单元格的引用，该表达式代表某种逻辑值（即TRUE或FALSE）。\",\r\n                },\r\n                {\r\n                    name: \"value_if_true\",\r\n                    detail: \"当逻辑表达式为TRUE时的返回值。\",\r\n                },\r\n                {\r\n                    name: \"value_if_false\",\r\n                    detail: \"[可选 - 默认为空白] - 当逻辑表达式等于FALSE时的函数返回值。\",\r\n                },\r\n            ],\r\n        },\r\n        OR: {\r\n            d: \"只要有一个参数的计算结果为 TRUE 时，返回 TRUE；所有参数的计算结果为 FALSE，即返回 FALSE。\",\r\n            a: \"只要有一个参数的计算结果为 TRUE 时，返回 TRUE；所有参数的计算结果为 FALSE，即返回 FALSE。\",\r\n            p: [\r\n                {\r\n                    name: \"logical1\",\r\n                    detail: \"要测试的第一个条件，其计算结果可以为 TRUE 或 FALSE。\",\r\n                },\r\n                {\r\n                    name: \"逻辑表达式2\",\r\n                    detail:\r\n                        \"[可选] - 其他表达式或对包含表达式的单元格的引用，这些表达式代表某种逻辑值（即TRUE或FALSE）或者可以强制转换为逻辑值。\",\r\n                },\r\n            ],\r\n        },\r\n        NE: {\r\n            d: \"如果指定的值不相等，则返回“TRUE”；否则返回“FALSE”。相当于“<>”运算符。\",\r\n            a: \"如果指定的值不相等，则返回“TRUE”；否则返回“FALSE”。相当于“<>”运算符。\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"第一个值。\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"要检查是否与 value1 不相等的值。\",\r\n                },\r\n            ],\r\n        },\r\n        EQ: {\r\n            d: \"如果指定的值相等，则返回“TRUE”；否则返回“FALSE”。相当于“=”运算符。\",\r\n            a: \"如果指定的值相等，则返回“TRUE”；否则返回“FALSE”。相当于“=”运算符。\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"第一个值。\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"要检查是否与 value1 相等的值。\",\r\n                },\r\n            ],\r\n        },\r\n        GT: {\r\n            d: \"如果第一个参数严格大于第二个，则返回 TRUE；否则返回 FALSE。相当于“>”运算符。\",\r\n            a: \"如果第一个参数严格大于第二个，则返回 TRUE；否则返回 FALSE。相当于“>”运算符。\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"要测试其是否大于 value2 的值。\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"第二个值。\",\r\n                },\r\n            ],\r\n        },\r\n        GTE: {\r\n            d: \"如果第一个参数大于或等于第二个，则返回 TRUE；否则返回 FALSE。相当于“>=”运算符。\",\r\n            a: \"如果第一个参数大于或等于第二个，则返回 TRUE；否则返回 FALSE。相当于“>=”运算符。\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"要测试其是否大于等于 value2 的值。\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"第二个值。\",\r\n                },\r\n            ],\r\n        },\r\n        LT: {\r\n            d: \"如果第一个参数严格小于第二个，则返回 TRUE；否则返回 FALSE。相当于“<”运算符。\",\r\n            a: \"如果第一个参数严格小于第二个，则返回 TRUE；否则返回 FALSE。相当于“<”运算符。\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"要测试其是否小于 value2 的值。\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"第二个值。\",\r\n                },\r\n            ],\r\n        },\r\n        LTE: {\r\n            d: \"如果第一个参数小于或等于第二个，则返回 TRUE；否则返回 FALSE。相当于“<=”运算符。\",\r\n            a: \"如果第一个参数小于或等于第二个，则返回 TRUE；否则返回 FALSE。相当于“<=”运算符。\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"要测试其是否小于等于 value2 的值。\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"第二个值。\",\r\n                },\r\n            ],\r\n        },\r\n        ADD: {\r\n            d: \"返回两个数值之和。相当于 `+` 运算符。\",\r\n            a: \"返回两个数值之和。相当于 `+` 运算符。\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"第一个加数。\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"第二个加数。\",\r\n                },\r\n            ],\r\n        },\r\n        MINUS: {\r\n            d: \"返回两个数值之差。相当于“-”运算符。\",\r\n            a: \"返回两个数值之差。相当于“-”运算符。\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"被减数，即要对其计减的数值。\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"减数，即要从 value1 中减除的数值。\",\r\n                },\r\n            ],\r\n        },\r\n        MULTIPLY: {\r\n            d: \"返回两个数的乘积。相当于“*”运算符。\",\r\n            a: \"返回两个数的乘积。相当于“*”运算符。\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"第一个乘数。\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"第二个乘数。\",\r\n                },\r\n            ],\r\n        },\r\n        DIVIDE: {\r\n            d: \"返回两个参数相除所得的结果。相当于 `/` 运算符。\",\r\n            a: \"返回两个参数相除所得的结果。相当于 `/` 运算符。\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"要被除的数值。\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"用于除其他数的数值。\\n\\n除数不得为0。\",\r\n                },\r\n            ],\r\n        },\r\n        CONCAT: {\r\n            d: \"返回两个值的串联。相当于 `&` 运算符。\",\r\n            a: \"返回两个值的串联。相当于 `&` 运算符。\",\r\n            p: [\r\n                {\r\n                    name: \"value1\",\r\n                    detail: \"value2 将附于其后的值。\",\r\n                },\r\n                {\r\n                    name: \"value2\",\r\n                    detail: \"要附于 value1 之后的值。\",\r\n                },\r\n            ],\r\n        },\r\n        UNARY_PERCENT: {\r\n            d: \"返回按百分比解释的数值。例如，“UNARY_PERCENT(100)”等于1。\",\r\n            a: \"返回按百分比解释的数值。例如，“UNARY_PERCENT(100)”等于1。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"要作为百分比解释的数值。\",\r\n                },\r\n            ],\r\n        },\r\n        CONCATENATE: {\r\n            d: \"将两个或多个文本字符串联接为一个字符串。\",\r\n            a: \"将两个或多个文本字符串联接为一个字符串。\",\r\n            p: [\r\n                {\r\n                    name: \"text1\",\r\n                    detail: \"初始字符串。\",\r\n                },\r\n                {\r\n                    name: \"text2 ...\",\r\n                    detail: \"[可选] - 要按顺序连接在一起的其他字符串。\",\r\n                },\r\n            ],\r\n        },\r\n        CODE: {\r\n            d: \"返回所提供的字符串中首字符的 Unicode 映射值。\",\r\n            a: \"返回所提供的字符串中首字符的 Unicode 映射值。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"要返回其首字符的Unicode映射值的字符串。\",\r\n                },\r\n            ],\r\n        },\r\n        CHAR: {\r\n            d: \"按照当前 Unicode 编码表，将数字转换为对应的字符。\",\r\n            a: \"按照当前 Unicode 编码表，将数字转换为对应的字符。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"介于 1 到 255 之间的数字。\",\r\n                },\r\n            ],\r\n        },\r\n        ARABIC: {\r\n            d: \"将罗马数字转换为阿拉伯数字。\",\r\n            a: \"将罗马数字转换为阿拉伯数字。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"要转换格式的罗马数字\",\r\n                },\r\n            ],\r\n        },\r\n        ROMAN: {\r\n            d: \"将数字格式设置为罗马数字形式。\",\r\n            a: \"将数字格式设置为罗马数字形式。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"要设置格式的数字，介于1到3999之间（包括这两个数字）。\",\r\n                },\r\n            ],\r\n        },\r\n        REGEXEXTRACT: {\r\n            d: \"按照正则表达式提取匹配的子串。\",\r\n            a: \"按照正则表达式提取匹配的子串。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"输入文本。\",\r\n                },\r\n                {\r\n                    name: \"regular_expression\",\r\n                    detail: \"此函数将返回文本中符合此表达式的第一个子串。\",\r\n                },\r\n            ],\r\n        },\r\n        REGEXMATCH: {\r\n            d: \"判断一段文本是否与正则表达式相匹配。\",\r\n            a: \"判断一段文本是否与正则表达式相匹配。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"要用正则表达式测试的文本。\",\r\n                },\r\n                {\r\n                    name: \"regular_expression\",\r\n                    detail: \"用来测试文本的正则表达式。\",\r\n                },\r\n            ],\r\n        },\r\n        REGEXREPLACE: {\r\n            d: \"使用正则表达式将文本字符串中的一部分替换为其他文本字符串。\",\r\n            a: \"使用正则表达式将文本字符串中的一部分替换为其他文本字符串。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"要对其局部进行替换操作的文本。\",\r\n                },\r\n                {\r\n                    name: \"regular_expression\",\r\n                    detail: \"正则表达式。 text 中所有匹配的实例都将被替换。\",\r\n                },\r\n                {\r\n                    name: \"replacement\",\r\n                    detail: \"要插入到原有文本中的文本。\",\r\n                },\r\n            ],\r\n        },\r\n        T: {\r\n            d: \"返回文本格式的字符串参数。\",\r\n            a: \"返回文本格式的字符串参数。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要转换为文本的参数。\\n\\n如果值为文本，T将返回值本身。\\n\\n如果值为指向包含文本的单元格的引用，T将返回值中的内容。\\n\\n如果值为错误值或包含错误值的单元格，T将返回该错误值。\\n\\n对于所有其他情况，T将返回空串。\",\r\n                },\r\n            ],\r\n        },\r\n        FIXED: {\r\n            d: \"以固定的小数位数设置数字的格式。\",\r\n            a: \"以固定的小数位数设置数字的格式。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"要进行舍入并转换为文本的数字。\",\r\n                },\r\n                {\r\n                    name: \"decimals\",\r\n                    detail:\r\n                        \"[可选 - 默认值为2] - 结果中要显示的小数位数。\\n\\n如果数值的有效位数小于小数位数，将以零填充。如果数值的有效位数大于小数位数，则将其舍入到所需的小数位数而不是将其截断。\",\r\n                },\r\n                {\r\n                    name: \"no_commas\",\r\n                    detail:\r\n                        \"[可选 - 默认值为FALSE()] - 一个逻辑值，如果为 TRUE()，则会禁止 FIXED 在返回的文本中包含逗号。\",\r\n                },\r\n            ],\r\n        },\r\n        FIND: {\r\n            d: \"返回字符串在文本中首次出现的位置（区分大小写）。\",\r\n            a: \"返回字符串在文本中首次出现的位置（区分大小写）。\",\r\n            p: [\r\n                {\r\n                    name: \"find_text\",\r\n                    detail: \"要在要搜索的文本中查找的字符串。\",\r\n                },\r\n                {\r\n                    name: \"within_text\",\r\n                    detail: \"要在其中搜索搜索字符串的首次出现位置的文本。\",\r\n                },\r\n                {\r\n                    name: \"start_num\",\r\n                    detail: \"[可选 - 默认值为1] - 要在要搜索的文本中开始搜索的字符位置。\",\r\n                },\r\n            ],\r\n        },\r\n        FINDB: {\r\n            d: \"返回某个字符串在文本中首次出现的位置（每个双字节字符占两个位置）。\",\r\n            a: \"返回某个字符串在文本中首次出现的位置（每个双字节字符占两个位置）。\",\r\n            p: [\r\n                {\r\n                    name: \"find_text\",\r\n                    detail: \"要在要搜索的文本中查找的字符串。\",\r\n                },\r\n                {\r\n                    name: \"within_text\",\r\n                    detail: \"要在其中搜索搜索字符串的首次出现位置的文本。\",\r\n                },\r\n                {\r\n                    name: \"start_num\",\r\n                    detail: \"[可选 - 默认值为 1] - 要在要搜索的文本中开始搜索的字符位置。\",\r\n                },\r\n            ],\r\n        },\r\n        JOIN: {\r\n            d: \"将一个或多个使用指定定界符的一维数组的元素连接到一起。\",\r\n            a: \"将一个或多个使用指定定界符的一维数组的元素连接到一起。\",\r\n            p: [\r\n                {\r\n                    name: \"separator\",\r\n                    detail: \"置于相互连接的值之间的字符或字符串。\\n\\n定界符可以为空，例如JOIN(,{1,2,3})。\",\r\n                },\r\n                {\r\n                    name: \"array1\",\r\n                    detail: \"要使用定界符连接的一个或多个值。\",\r\n                },\r\n                {\r\n                    name: \"array2, ...\",\r\n                    detail: \"[可选] - 要使用定界符连接的其他值或数组。\",\r\n                },\r\n            ],\r\n        },\r\n        LEFT: {\r\n            d: \"从文本字符串的第一个字符开始返回指定个数的字符。\",\r\n            a: \"从文本字符串的第一个字符开始返回指定个数的字符。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"包含要提取的字符的文本字符串。\",\r\n                },\r\n                {\r\n                    name: \"num_chars\",\r\n                    detail: \"[可选 - 默认值为1] - 指定要由 LEFT 提取的字符的数量。\",\r\n                },\r\n            ],\r\n        },\r\n        RIGHT: {\r\n            d: \"根据所指定的字符数返回文本字符串中最后一个或多个字符。\",\r\n            a: \"根据所指定的字符数返回文本字符串中最后一个或多个字符。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"包含要提取的字符的文本字符串。\",\r\n                },\r\n                {\r\n                    name: \"num_chars\",\r\n                    detail: \"[可选 - 默认值为1] - 指定要由 RIGHT 提取的字符的数量。\",\r\n                },\r\n            ],\r\n        },\r\n        MID: {\r\n            d: \"返回文本字符串中从指定位置开始的特定数目的字符。\",\r\n            a: \"返回文本字符串中从指定位置开始的特定数目的字符。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"包含要提取的字符的文本字符串。\",\r\n                },\r\n                {\r\n                    name: \"start_num\",\r\n                    detail: \"要从字符串中开始提取的位置。字符串中第一个字符的索引为1。\",\r\n                },\r\n                {\r\n                    name: \"num_chars\",\r\n                    detail:\r\n                        \"指定要由 MID 提取的字符的数量。\\n\\n如果提取的字符数尚不足提取长度个字符时就到达了字符串尾部，则MID返回从开始位置到字符串尾部的字符。\",\r\n                },\r\n            ],\r\n        },\r\n        LEN: {\r\n            d: \"返回给定字符串的长度。\",\r\n            a: \"返回给定字符串的长度。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"要返回其长度的字符串。\",\r\n                },\r\n            ],\r\n        },\r\n        LENB: {\r\n            d: \"返回文本中所包含的字符数。与双字节字符集(DBCS)一起使用。\",\r\n            a: \"返回文本中所包含的字符数。与双字节字符集(DBCS)一起使用。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"要返回其字节数的字符串。（一个汉字为两个字节数）\",\r\n                },\r\n            ],\r\n        },\r\n        LOWER: {\r\n            d: \"将指定字符串中的字母转换为小写。\",\r\n            a: \"将指定字符串中的字母转换为小写。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"要转换为小写的字符串。\",\r\n                },\r\n            ],\r\n        },\r\n        UPPER: {\r\n            d: \"将指定字符串中的字母转换为大写。\",\r\n            a: \"将指定字符串中的字母转换为大写。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"要转换为大写的字符串。\",\r\n                },\r\n            ],\r\n        },\r\n        EXACT: {\r\n            d: \"比较两个字符串是否相同。\",\r\n            a: \"比较两个字符串是否相同。\",\r\n            p: [\r\n                {\r\n                    name: \"text1\",\r\n                    detail: \"要比较的第一个字符串。\",\r\n                },\r\n                {\r\n                    name: \"text2\",\r\n                    detail: \"要比较的第二个字符串。\",\r\n                },\r\n            ],\r\n        },\r\n        REPLACE: {\r\n            d: \"将文本字符串的一部分替换为其他文本字符串。\",\r\n            a: \"将文本字符串的一部分替换为其他文本字符串。\",\r\n            p: [\r\n                {\r\n                    name: \"old_text\",\r\n                    detail: \"要对其局部进行替换操作的文本。\",\r\n                },\r\n                {\r\n                    name: \"start_num\",\r\n                    detail: \"开始进行替换操作的位置（文本开头位置为 1）。\",\r\n                },\r\n                {\r\n                    name: \"num_chars\",\r\n                    detail: \"要在文本中替换的字符个数。\",\r\n                },\r\n                {\r\n                    name: \"new_text\",\r\n                    detail: \"要插入到原有文本中的文本。\",\r\n                },\r\n            ],\r\n        },\r\n        REPT: {\r\n            d: \"返回指定文本的多次重复。\",\r\n            a: \"返回指定文本的多次重复。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"要重复的字符或字符串。\",\r\n                },\r\n                {\r\n                    name: \"number_times\",\r\n                    detail:\r\n                        \"要重复的文本要在返回值中出现的次数。\\n\\n最大重复次数为100。即使重复次数大于100，REPT也仅将相应文本重复100次。\",\r\n                },\r\n            ],\r\n        },\r\n        SEARCH: {\r\n            d: \"返回字符串在文本中首次出现的位置（不区分大小写）。\",\r\n            a: \"返回字符串在文本中首次出现的位置（不区分大小写）。\",\r\n            p: [\r\n                {\r\n                    name: \"find_text\",\r\n                    detail: \"要在要搜索的文本中查找的字符串。\",\r\n                },\r\n                {\r\n                    name: \"within_text\",\r\n                    detail: \"要在其中搜索搜索字符串的首次出现位置的文本。\",\r\n                },\r\n                {\r\n                    name: \"start_num\",\r\n                    detail: \"[ 可选 - 默认值为1 ] - 要在要搜索的文本中开始搜索的字符位置。\",\r\n                },\r\n            ],\r\n        },\r\n        SUBSTITUTE: {\r\n            d: \"在文本字符串中用 new_text 替换 old_text。\",\r\n            a: \"在文本字符串中用 new_text 替换 old_text。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"需要替换其中字符的文本，或对含有文本（需要替换其中字符）的单元格的引用。\",\r\n                },\r\n                {\r\n                    name: \"old_text\",\r\n                    detail: \"需要替换的文本。\",\r\n                },\r\n                {\r\n                    name: \"new_text\",\r\n                    detail: \"用于替换 old_text 的文本。\",\r\n                },\r\n                {\r\n                    name: \"instance_num\",\r\n                    detail:\r\n                        \"[ 可选 ] - 指定要用 new_text 替换 old_text 的事件。 如果指定了 instance_num，则只有满足要求的 old_text 被替换。 否则，文本中出现的所有 old_text 都会更改为 new_text。\",\r\n                },\r\n            ],\r\n        },\r\n        CLEAN: {\r\n            d: \"移除文本中的不可打印 ASCII 字符后将其返回。\",\r\n            a: \"移除文本中的不可打印 ASCII 字符后将其返回。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"要移除其中不可打印字符的文本。\",\r\n                },\r\n            ],\r\n        },\r\n        TEXT: {\r\n            d: \"按照指定格式将数字转换为文本。\",\r\n            a: \"按照指定格式将数字转换为文本。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"要设置格式的数字、日期或时间。\",\r\n                },\r\n                {\r\n                    name: \"format_text\",\r\n                    detail:\r\n                        '以括号括起来的模式串，将按该模式设置数字的格式。\\n\\n0表示在数值位数少于格式指定的位数时必定以零填充。例如，TEXT(12.3,\"000.00\")将返回012.30。当数值的小数位数超过模式指定的小数位数时，四舍五入为指定的小数位数。例如，TEXT(12.305,\"00.00\")将返回12.31。\\n\\n#类似于0，但并不是在小数点的两侧都以零填充。例如，TEXT(12.3,\"###.##\")将返回12.3。',\r\n                },\r\n            ],\r\n        },\r\n        TRIM: {\r\n            d: \"删除指定字符串前后的空格。\",\r\n            a: \"删除指定字符串前后的空格。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"要修剪的字符串或指向包含该字符串的单元格的引用。\",\r\n                },\r\n            ],\r\n        },\r\n        VALUE: {\r\n            d: \"将可识别的任何日期、时间或数字格式的字符串转换为数字。\",\r\n            a: \"将可识别的任何日期、时间或数字格式的字符串转换为数字。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"包含要转换的值的字符串。\",\r\n                },\r\n            ],\r\n        },\r\n        PROPER: {\r\n            d: \"将指定字符串中每个单词的首字母转为大写。\",\r\n            a: \"将指定字符串中每个单词的首字母转为大写。\",\r\n            p: [\r\n                {\r\n                    name: \"text\",\r\n                    detail: \"要转换的文本，其中每个单词的首字母都将转为大写，所有其他字母则转为小写。\",\r\n                },\r\n            ],\r\n        },\r\n        CONVERT: {\r\n            d: \"将数字从一种度量系统转换为另一种度量系统。\",\r\n            a: \"将数字从一种度量系统转换为另一种度量系统。\",\r\n            p: [\r\n                {\r\n                    name: \"number\",\r\n                    detail: \"是以 from_unit 为单位的需要进行转换的数值。\",\r\n                },\r\n                {\r\n                    name: \"from_unit\",\r\n                    detail: \"是数值的单位。\",\r\n                },\r\n                {\r\n                    name: \"to_unit\",\r\n                    detail: \"是结果的单位。\",\r\n                },\r\n            ],\r\n        },\r\n        SUMX2MY2: {\r\n            d: \"返回两数组中对应数值的平方差之和。\",\r\n            a: \"返回两数组中对应数值的平方差之和。\",\r\n            p: [\r\n                {\r\n                    name: \"array_x\",\r\n                    detail: \"第一个数组或数值区域。\",\r\n                },\r\n                {\r\n                    name: \"array_y\",\r\n                    detail: \"第二个数组或数值区域。\",\r\n                },\r\n            ],\r\n        },\r\n        SUMX2PY2: {\r\n            d: \"返回两数组中对应数值的平方和之和。\",\r\n            a: \"返回两数组中对应数值的平方和之和。\",\r\n            p: [\r\n                {\r\n                    name: \"array_x\",\r\n                    detail: \"第一个数组或数值区域。\",\r\n                },\r\n                {\r\n                    name: \"array_y\",\r\n                    detail: \"第二个数组或数值区域。\",\r\n                },\r\n            ],\r\n        },\r\n        SUMXMY2: {\r\n            d: \"返回两数组中对应数值之差的平方和。\",\r\n            a: \"返回两数组中对应数值之差的平方和。\",\r\n            p: [\r\n                {\r\n                    name: \"array_x\",\r\n                    detail: \"第一个数组或数值区域。\",\r\n                },\r\n                {\r\n                    name: \"array_y\",\r\n                    detail: \"第二个数组或数值区域。\",\r\n                },\r\n            ],\r\n        },\r\n        TRANSPOSE: {\r\n            d: \"将数组或单元格范围的行列转置。\",\r\n            a: \"将数组或单元格范围的行列转置。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"要将其行列互换的数组或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        TREND: {\r\n            d: \"返回线性趋势值。\",\r\n            a: \"返回线性趋势值。\",\r\n            p: [\r\n                {\r\n                    name: \"known_y\",\r\n                    detail:\r\n                        \"关系表达式 y = mx + b 中已知的 y 值集合。\\n\\n如果 known_y 为二维数组或范围，则 known_x 的维数必须与之相同，或者省略此参数。\\n\\n如果 known_y 为一维数组或范围，known_x 则可代表二维数组或范围中的多个自变量。也就是说，如果 known_y 为单行，则将 known_x 中的每行解释为各自独立的值，类似情况也适用于 known_y 为单列的情况。\",\r\n                },\r\n                {\r\n                    name: \"known_x\",\r\n                    detail:\r\n                        \"[可选 - 默认该数组为{1,2,3,...},其大小与 known_y 相同] - 关系表达式 y = mx + b 中已知的可选 x 值集合。\\n\\n如果 known_y 为一维数组或范围，known_x 则可代表二维数组或范围中的多个自变量。也就是说，如果 known_y 为单行，则将 known_x 中的每行解释为各自独立的值，类似情况也适用于 known_y 为单列的情况。\",\r\n                },\r\n                {\r\n                    name: \"new_x\",\r\n                    detail: \"[可选 - 默认与 known_x 相同] -  需要函数 TREND 返回对应 y 值的新 x 值。\",\r\n                },\r\n                {\r\n                    name: \"const\",\r\n                    detail:\r\n                        \"[可选 - 默认值为TRUE()] - 一个逻辑值，用于指定是否将常量 b 强制设为 0。\\n\\nTRUE() 表示 b 将按正常计算；\\n\\nFALSE() 表示 b 将被设为 0（零），m 将被调整以使 y = mx。\",\r\n                },\r\n            ],\r\n        },\r\n        FREQUENCY: {\r\n            d: \"计算数值在某个区域内的出现频率，然后返回一个垂直数组。\",\r\n            a: \"计算数值在某个区域内的出现频率，然后返回一个垂直数组。\",\r\n            p: [\r\n                {\r\n                    name: \"data_array\",\r\n                    detail: \"要对其频率进行计数的一组数值或对这组数值的引用。\",\r\n                },\r\n                {\r\n                    name: \"bins_array\",\r\n                    detail:\r\n                        \"要将 data_array 中的值插入到的间隔数组或对间隔的引用。\\n\\n为清晰起见，应将类别排序，但如果未排序，FREQUENCY会在内部对这些指定的值进行排序并返回正确结果。\",\r\n                },\r\n            ],\r\n        },\r\n        GROWTH: {\r\n            d: \"使用现有数据计算预测的指数等比。\",\r\n            a: \"使用现有数据计算预测的指数等比。\",\r\n            p: [\r\n                {\r\n                    name: \"known_y\",\r\n                    detail:\r\n                        \"关系表达式 y = b*m^x 中已知的 y 值集合。\\n\\n如果已知数据_y为二维数组或范围，则已知数据_x的维数必须与之相同，或者省略此参数。\\n\\n如果已知数据_y为一维数组或范围，已知数据_x则可代表二维数组或范围中的多个自变量。也就是说，如果已知数据_y为单行，则将已知数据_x中的每行解释为各自独立的值，类似情况也适用于已知数据_y为单列的情况。\",\r\n                },\r\n                {\r\n                    name: \"known_x\",\r\n                    detail:\r\n                        \"[可选 - 默认该数组为{1,2,3,...},其大小与 known_y 相同] - 关系表达式 y = b*m^x 中已知的可选 x 值集合。\\n\\n如果已知数据_y为一维数组或范围，已知数据_x则可代表二维数组或范围中的多个自变量。也就是说，如果已知数据_y为单行，则将已知数据_x中的每行解释为各自独立的值，类似情况也适用于已知数据_y为单列的情况。\",\r\n                },\r\n                {\r\n                    name: \"new_x\",\r\n                    detail: \"[可选 - 默认与 known_x 相同] - 需要函数 GROWTH 返回对应 y 值的新 x 值。\",\r\n                },\r\n                {\r\n                    name: \"const\",\r\n                    detail:\r\n                        \"[可选 - 默认值为TRUE()] -一个逻辑值，用于指定是否将常量 b 强制设为 1。\\n\\nTRUE() 表示 b 将按正常计算；\\n\\nFALSE() 表示 b 将被设为 1，m 将被调整以使 y = m^x。\",\r\n                },\r\n            ],\r\n        },\r\n        LINEST: {\r\n            d: \"可通过使用最小二乘法计算与现有数据最佳拟合的直线，来计算某直线的统计值，然后返回描述此直线的数组。\",\r\n            a: \"可通过使用最小二乘法计算与现有数据最佳拟合的直线，来计算某直线的统计值，然后返回描述此直线的数组。\",\r\n            p: [\r\n                {\r\n                    name: \"known_y\",\r\n                    detail:\r\n                        \"关系表达式 y = mx + b 中已知的 y 值集合。\\n\\n如果 known_y 为二维数组或范围，则 known_x 的维数必须与之相同，或者省略此参数。\\n\\n如果 known_y 为一维数组或范围，known_x 则可代表二维数组或范围中的多个自变量。也就是说，如果 known_y 为单行，则将 known_x 中的每行解释为各自独立的值，类似情况也适用于 known_y 为单列的情况。\",\r\n                },\r\n                {\r\n                    name: \"known_x\",\r\n                    detail:\r\n                        \"[可选 - 默认该数组为{1,2,3,...},其大小与 known_y 相同] - 关系表达式 y = mx + b 中已知的可选 x 值集合。\\n\\n如果 known_y 为一维数组或范围，known_x 则可代表二维数组或范围中的多个自变量。也就是说，如果 known_y 为单行，则将 known_x 中的每行解释为各自独立的值，类似情况也适用于 known_y 为单列的情况。\",\r\n                },\r\n                {\r\n                    name: \"const\",\r\n                    detail:\r\n                        \"[可选 - 默认值为TRUE()] - 一个逻辑值，用于指定是否将常量 b 强制设为 0。\\n\\nTRUE() 表示 b 将按正常计算；\\n\\nFALSE() 表示 b 将被设为 0（零），m 将被调整以使 y = mx。\",\r\n                },\r\n                {\r\n                    name: \"stats\",\r\n                    detail:\r\n                        \"[可选 - 默认值为FALSE()] - 一个逻辑值，用于指定是否返回附加回归统计值。\\n\\n如果详细为TRUE，除了对应于每个自变量的一组线性系数和y截距之外，LINEST还返回以下信息：\\n\\n每项系数和截距的标准误差、\\n\\n限定系数（介于0和1之间，1表示完全相关）、\\n\\n因变量值的标准误差、\\n\\nF统计或F观测值，指示所观测到的因变量和自变量变量之间的关系是随机的还是线性的、\\n\\n自由度，用于在参照表中查找F统计值以估算可信度、\\n\\n回归平方和，以及\\n\\n残差平方和。\",\r\n                },\r\n            ],\r\n        },\r\n        LOGEST: {\r\n            d: \"在回归分析中，计算最符合数据的指数回归拟合曲线，并返回描述该曲线的数值数组。\",\r\n            a: \"在回归分析中，计算最符合数据的指数回归拟合曲线，并返回描述该曲线的数值数组。\",\r\n            p: [\r\n                {\r\n                    name: \"known_y\",\r\n                    detail:\r\n                        \"关系表达式 y = mx + b 中已知的 y 值集合。\\n\\n如果 known_y 为二维数组或范围，则 known_x 的维数必须与之相同，或者省略此参数。\\n\\n如果 known_y 为一维数组或范围，known_x 则可代表二维数组或范围中的多个自变量。也就是说，如果 known_y 为单行，则将 known_x 中的每行解释为各自独立的值，类似情况也适用于 known_y 为单列的情况。\",\r\n                },\r\n                {\r\n                    name: \"known_x\",\r\n                    detail:\r\n                        \"[可选 - 默认该数组为{1,2,3,...},其大小与 known_y 相同] - 关系表达式 y = mx + b 中已知的可选 x 值集合。\\n\\n如果 known_y 为一维数组或范围，known_x 则可代表二维数组或范围中的多个自变量。也就是说，如果 known_y 为单行，则将 known_x 中的每行解释为各自独立的值，类似情况也适用于 known_y 为单列的情况。\",\r\n                },\r\n                {\r\n                    name: \"const\",\r\n                    detail:\r\n                        \"[可选 - 默认值为TRUE()] - 一个逻辑值，用于指定是否将常量 b 强制设为 0。\\n\\nTRUE() 表示 b 将按正常计算；\\n\\nFALSE() 表示 b 将被设为 0（零），m 将被调整以使 y = mx。\",\r\n                },\r\n                {\r\n                    name: \"stats\",\r\n                    detail:\r\n                        \"[可选 - 默认值为FALSE()] - 一个逻辑值，用于指定是否返回附加回归统计值。\\n\\n如果详细为TRUE，则除了为每个自变量和系数 b 返回一组指数值之外，LOGEST 还将返回以下数据：\\n\\n每项指数和系数的标准误差、\\n\\n限定系数（介于 0 和 1 之间，1 表示完全相关）、\\n\\n因变量值的标准误差、\\n\\nF 统计或 F 观测值，指示所观测到的因变量和自变量之间的关系是随机的还是指数的、\\n\\n自由度 - 用于在参照表中查找 F 统计值以估算可信度、\\n\\n回归平方和，以及\\n\\n残差平方和。\",\r\n                },\r\n            ],\r\n        },\r\n        MDETERM: {\r\n            d: \"返回一个数组的矩阵行列式的值。\",\r\n            a: \"返回一个数组的矩阵行列式的值。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"行数和列数相等的数值数组。\",\r\n                },\r\n            ],\r\n        },\r\n        MINVERSE: {\r\n            d: \"返回数组中存储的矩阵的逆矩阵。\",\r\n            a: \"返回数组中存储的矩阵的逆矩阵。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"行数和列数相等的数值数组。\",\r\n                },\r\n            ],\r\n        },\r\n        MMULT: {\r\n            d: \"返回两个数组的矩阵乘积。结果矩阵的行数与 array1 的行数相同，矩阵的列数与 array2 的列数相同。\",\r\n            a: \"返回两个数组的矩阵乘积。结果矩阵的行数与 array1 的行数相同，矩阵的列数与 array2 的列数相同。\",\r\n            p: [\r\n                {\r\n                    name: \"array1\",\r\n                    detail: \"要进行矩阵乘法运算的第一个矩阵数组。\\n\\narray1 列数必须与 array2 的行数相同\",\r\n                },\r\n                {\r\n                    name: \"array2\",\r\n                    detail: \"要进行矩阵乘法运算的第二个矩阵数组。\\n\\narray2 的行数必须与 array1 列数相同\",\r\n                },\r\n            ],\r\n        },\r\n        SUMPRODUCT: {\r\n            d: \"在给定的几组数组中，将数组间对应的元素相乘，并返回乘积之和。\",\r\n            a: \"在给定的几组数组中，将数组间对应的元素相乘，并返回乘积之和。\",\r\n            p: [\r\n                {\r\n                    name: \"array1\",\r\n                    detail: \"其相应元素需要进行相乘并求和的第一个数组参数。\",\r\n                },\r\n                {\r\n                    name: \"array2\",\r\n                    detail: \"[可选] - 其相应元素需要进行相乘并求和的其它数组参数。\",\r\n                },\r\n            ],\r\n        },\r\n        ISFORMULA: {\r\n            d: \"检查公式是否位于引用的单元格中。\",\r\n            a: \"检查公式是否位于引用的单元格中。\",\r\n            p: [\r\n                {\r\n                    name: \"cell\",\r\n                    detail:\r\n                        \"要检查是否存在公式的单元格。\\n\\n如果 cell 为包含公式的单元格，则 ISFORMULA 将返回 TRUE。如果 cell 为相应单元格范围，则当该范围内的首个单元格包含公式时，系统会返回 TRUE。如果是任何其他值，系统都将返回 FALSE。\",\r\n                },\r\n            ],\r\n        },\r\n        CELL: {\r\n            d: \"返回有关单元格的格式、位置或内容的信息。\",\r\n            a: \"返回有关单元格的格式、位置或内容的信息。\",\r\n            p: [\r\n                {\r\n                    name: \"info_type\",\r\n                    detail: \"一个文本值，指定要返回的单元格信息的类型。\",\r\n                },\r\n                {\r\n                    name: \"reference\",\r\n                    detail: \"需要其相关信息的单元格。\",\r\n                },\r\n            ],\r\n        },\r\n        NA: {\r\n            d: \"返回错误值 #N/A。\",\r\n            a: \"返回错误值 #N/A。\",\r\n            p: [],\r\n        },\r\n        ERROR_TYPE: {\r\n            d: \"返回与其他单元格中的错误值相对应的数字。\",\r\n            a: \"返回与其他单元格中的错误值相对应的数字。\",\r\n            p: [\r\n                {\r\n                    name: \"error_val\",\r\n                    detail: \"用于查找错误号的单元格，虽然您也可以直接提供错误值。\",\r\n                },\r\n            ],\r\n        },\r\n        ISBLANK: {\r\n            d: \"检查所引用的单元格是否为空。\",\r\n            a: \"检查所引用的单元格是否为空。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail: \"对要检查其是否为空的单元格的引用。\\n\\n如果是空单元格，则 TRUE；否则返回 FALSE。\",\r\n                },\r\n            ],\r\n        },\r\n        ISERR: {\r\n            d: \"检查某个值是否为 #N/A 以外的错误值。\",\r\n            a: \"检查某个值是否为 #N/A 以外的错误值。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要验证其是否为#N/A以外的错误类型的值。\\n\\n如果值是除#N/A之外的任何错误（包括#DIV/0!、#NAME?、#NULL!、#NUM!、#VALUE!和#REF!），ISERR将返回TRUE。\",\r\n                },\r\n            ],\r\n        },\r\n        ISERROR: {\r\n            d: \"检查某个值是否为错误值。\",\r\n            a: \"检查某个值是否为错误值。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要验证其是否为错误类型的值。\\n\\n只要值是某种错误值（包括#DIV/0!、#N/A、#NAME?、#NULL!、#NUM!、#VALUE!和#REF!），ISERROR就会返回TRUE。\",\r\n                },\r\n            ],\r\n        },\r\n        ISLOGICAL: {\r\n            d: \"检查某个值是 TRUE 还是 FALSE。\",\r\n            a: \"检查某个值是 TRUE 还是 FALSE。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要验证其为逻辑TRUE还是逻辑FALSE的值。\\n\\n*如果值为TRUE或FALSE，或为指向值为TRUE或FALSE的单元格的引用，ISLOGICAL将返回TRUE。\",\r\n                },\r\n            ],\r\n        },\r\n        ISNA: {\r\n            d: \"检查某个值是否为错误值 #N/A。\",\r\n            a: \"检查某个值是否为错误值 #N/A。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要与错误值#N/A进行比较的值。\\n\\n*如果值为#N/A或指向包含#N/A的单元格的引用，则ISNA将返回TRUE，否则返回FALSE。\",\r\n                },\r\n            ],\r\n        },\r\n        ISNONTEXT: {\r\n            d: \"检查某个值是否为非文本。\",\r\n            a: \"检查某个值是否为非文本。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要检查的文本。\\n\\n*如果参数为文本值或指向包含文本的单元格的引用，ISNONTEXT将返回FALSE，否则返回TRUE。\\n\\n当值为指向空单元格的引用时，ISNONTEXT会返回TRUE。\\n\\n当值为空字符串时，ISNONTEXT将返回FALSE，因为空串被视作文本。\",\r\n                },\r\n            ],\r\n        },\r\n        ISNUMBER: {\r\n            d: \"检查某个值是否为数字。\",\r\n            a: \"检查某个值是否为数字。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要验证其是否为数字的值。\\n\\n*如果参数为数字或指向内容为数字值的单元格的引用，ISNUMBER将返回TRUE，否则返回FALSE。\",\r\n                },\r\n            ],\r\n        },\r\n        ISREF: {\r\n            d: \"检查某个值是否为有效的单元格引用。\",\r\n            a: \"检查某个值是否为有效的单元格引用。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要验证其是否为单元格引用的值。\\n\\n*如果参数是有效的单元格引用，ISREF将返回TRUE，否则返回FALSE。\",\r\n                },\r\n            ],\r\n        },\r\n        ISTEXT: {\r\n            d: \"检查某个值是否为文本。\",\r\n            a: \"检查某个值是否为文本。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要验证其是否为文本的值。\\n\\n如果参数为文本值或指向包含文本值的单元格的引用，ISTEXT将返回TRUE，否则返回FALSE。\",\r\n                },\r\n            ],\r\n        },\r\n        TYPE: {\r\n            d: \"返回数值的类型。\",\r\n            a: \"返回数值的类型。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要确定其类型的数据。\\n\\n数字 返回 1;\\n\\n文本 返回 2;\\n\\n逻辑值 返回 4;\\n\\n错误值 返回 16;\\n\\n数组 返回 64;\",\r\n                },\r\n            ],\r\n        },\r\n        N: {\r\n            d: \"返回转化为数值后的值。\",\r\n            a: \"返回转化为数值后的值。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要转换为数字的参数。\\n\\n如果值为数字，则返回该数字。\\n\\n如果值为日期，则返回该日期的序列号。\\n\\n如果值为TRUE，则返回1。\\n\\n如果值为FALSE，则返回0。\\n\\n如果值为错误值，则返回错误值。\\n\\n如果值为其他值，则返回0。\",\r\n                },\r\n            ],\r\n        },\r\n        TO_DATE: {\r\n            d: \"将指定的数字转换为日期。\",\r\n            a: \"将指定的数字转换为日期。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要转换为日期的参数或其单元格引用。\\n\\n如果值为数字或指向内容为数值的单元格的引用，TO_DATE会将值转换为相应的日期并返回，值代表从十二月30日到对应的日期之间的天数，\\n\\n负值表示对应的日期在十二月30日之前，而小数值则代表一天中从午夜算起的时间。\\n如果值不是数字或指向内容为数值的单元格的引用，则TO_DATE将在不做任何修改的情况下返回值。\",\r\n                },\r\n            ],\r\n        },\r\n        TO_PURE_NUMBER: {\r\n            d: \"将给定的日期/时间、百分比、货币金额或其他格式的数值转换为不带格式的纯数字。\",\r\n            a: \"将给定的日期/时间、百分比、货币金额或其他格式的数值转换为不带格式的纯数字。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要转换为纯数字的参数或其单元格引用。\\n\\n如果值为数字或指向包含数值的单元格的引用，TO_PURE_NUMBER将以不带任何格式与解释的形式返回值。\\n\\n如果值不是数字或指向内容为数值的单元格的引用，则TO_PERCENT将在不做任何修改的情况下返回值。\",\r\n                },\r\n            ],\r\n        },\r\n        TO_TEXT: {\r\n            d: \"将给定的数字值转换为文本格式。\",\r\n            a: \"将给定的数字值转换为文本格式。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要转换为文本的参数或其单元格引用。\\n\\n如果值为数字或指向包含数值的单元格的引用，TO_TEXT将返回字符串形式的值，并保持现有格式。即原为货币的仍为货币，原为十进制数的仍为十进制数，原为百分比的仍为百分比，原为日期的仍为日期。\\n\\n如果值不是数字或指向内容为数值的单元格的引用，则TO_TEXT将在不做任何修改的情况下返回值。\",\r\n                },\r\n            ],\r\n        },\r\n        TO_DOLLARS: {\r\n            d: \"将指定的数字转换为美元金额。\",\r\n            a: \"将指定的数字转换为美元金额。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要转换为美元金额的参数或其单元格引用。\\n\\n如果值不是数字或指向内容为数值的单元格的引用，则 TO_DOLLARS 将在不做任何修改的情况下返回值。\",\r\n                },\r\n            ],\r\n        },\r\n        TO_PERCENT: {\r\n            d: \"将指定的数字转换为百分比。\",\r\n            a: \"将指定的数字转换为百分比。\",\r\n            p: [\r\n                {\r\n                    name: \"value\",\r\n                    detail:\r\n                        \"要转换为百分比的参数或其单元格引用。\\n\\n如果值为数字或指向包含数值的单元格的引用，TO_PERCENT会以1 = 100%为标准，将值转换为百分比。\\n\\n如果值不是数字或指向内容为数值的单元格的引用，则TO_PERCENT将在不做任何修改的情况下返回值。\",\r\n                },\r\n            ],\r\n        },\r\n        DGET: {\r\n            d: \"使用 SQL 式查询，从列表或数据库的列中提取符合指定条件的单个值。\",\r\n            a: \"使用 SQL 式查询，从列表或数据库的列中提取符合指定条件的单个值。\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail: \"构成列表或数据库的单元格区域，列表的第一行包含每一列的标签。\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail:\r\n                        \"指定 database 中的哪一列包含要提取和用于计算的值。\\n\\nfield 可以是与 database 第一行中某个列标题对应的文本标签，也可以是指定相关列的数字索引，第一列的索引值为 1。\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail: \"包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        DMAX: {\r\n            d: \"使用 SQL 式查询，返回列表或数据库中满足指定条件的记录字段（列）中的最大数字。\",\r\n            a: \"使用 SQL 式查询，返回列表或数据库中满足指定条件的记录字段（列）中的最大数字。\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail: \"构成列表或数据库的单元格区域，列表的第一行包含每一列的标签。\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail:\r\n                        \"指定 database 中的哪一列包含要提取和用于计算的值。\\n\\nfield 可以是与 database 第一行中某个列标题对应的文本标签，也可以是指定相关列的数字索引，第一列的索引值为 1。\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail: \"包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        DMIN: {\r\n            d: \"使用 SQL 式查询，返回列表或数据库中满足指定条件的记录字段（列）中的最小数字。\",\r\n            a: \"使用 SQL 式查询，返回列表或数据库中满足指定条件的记录字段（列）中的最小数字。\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail: \"构成列表或数据库的单元格区域，列表的第一行包含每一列的标签。\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail:\r\n                        \"指定 database 中的哪一列包含要提取和用于计算的值。\\n\\nfield 可以是与 database 第一行中某个列标题对应的文本标签，也可以是指定相关列的数字索引，第一列的索引值为 1。\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail: \"包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        DAVERAGE: {\r\n            d: \"使用 SQL 式查询，对列表或数据库中满足指定条件的记录字段（列）中的数值求平均值。\",\r\n            a: \"使用 SQL 式查询，对列表或数据库中满足指定条件的记录字段（列）中的数值求平均值。\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail: \"构成列表或数据库的单元格区域，列表的第一行包含每一列的标签。\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail:\r\n                        \"指定 database 中的哪一列包含要提取和用于计算的值。\\n\\nfield 可以是与 database 第一行中某个列标题对应的文本标签，也可以是指定相关列的数字索引，第一列的索引值为 1。\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail: \"包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        DCOUNT: {\r\n            d: \"使用 SQL 式查询，返回列表或数据库中满足指定条件的记录字段（列）中包含数字的单元格的个数。\",\r\n            a: \"使用 SQL 式查询，返回列表或数据库中满足指定条件的记录字段（列）中包含数字的单元格的个数。\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail: \"构成列表或数据库的单元格区域，列表的第一行包含每一列的标签。\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail:\r\n                        \"指定 database 中的哪一列包含要提取和用于计算的值。\\n\\nfield 可以是与 database 第一行中某个列标题对应的文本标签，也可以是指定相关列的数字索引，第一列的索引值为 1。\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail: \"包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        DCOUNTA: {\r\n            d: \"使用 SQL 式查询，返回列表或数据库中满足指定条件的记录字段（列）中的非空单元格的个数。\",\r\n            a: \"使用 SQL 式查询，返回列表或数据库中满足指定条件的记录字段（列）中的非空单元格的个数。\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail: \"构成列表或数据库的单元格区域，列表的第一行包含每一列的标签。\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail:\r\n                        \"指定 database 中的哪一列包含要提取和用于计算的值。\\n\\nfield 可以是与 database 第一行中某个列标题对应的文本标签，也可以是指定相关列的数字索引，第一列的索引值为 1。\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail: \"包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        DPRODUCT: {\r\n            d: \"使用 SQL 式查询，返回列表或数据库中满足指定条件的记录字段（列）中的数值的乘积。\",\r\n            a: \"使用 SQL 式查询，返回列表或数据库中满足指定条件的记录字段（列）中的数值的乘积。\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail: \"构成列表或数据库的单元格区域，列表的第一行包含每一列的标签。\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail:\r\n                        \"指定 database 中的哪一列包含要提取和用于计算的值。\\n\\nfield 可以是与 database 第一行中某个列标题对应的文本标签，也可以是指定相关列的数字索引，第一列的索引值为 1。\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail: \"包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        DSTDEV: {\r\n            d:\r\n                \"使用 SQL 式查询，返回利用列表或数据库中满足指定条件的记录字段（列）中的数字作为一个样本估算出的总体标准偏差。\",\r\n            a:\r\n                \"使用 SQL 式查询，返回利用列表或数据库中满足指定条件的记录字段（列）中的数字作为一个样本估算出的总体标准偏差。\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail: \"构成列表或数据库的单元格区域，列表的第一行包含每一列的标签。\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail:\r\n                        \"指定 database 中的哪一列包含要提取和用于计算的值。\\n\\nfield 可以是与 database 第一行中某个列标题对应的文本标签，也可以是指定相关列的数字索引，第一列的索引值为 1。\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail: \"包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        DSTDEVP: {\r\n            d:\r\n                \"使用 SQL 式查询，返回利用列表或数据库中满足指定条件的记录字段（列）中的数字作为样本总体计算出的总体标准偏差。\",\r\n            a:\r\n                \"使用 SQL 式查询，返回利用列表或数据库中满足指定条件的记录字段（列）中的数字作为样本总体计算出的总体标准偏差。\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail: \"构成列表或数据库的单元格区域，列表的第一行包含每一列的标签。\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail:\r\n                        \"指定 database 中的哪一列包含要提取和用于计算的值。\\n\\nfield 可以是与 database 第一行中某个列标题对应的文本标签，也可以是指定相关列的数字索引，第一列的索引值为 1。\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail: \"包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        DSUM: {\r\n            d: \"使用 SQL 式查询，返回列表或数据库中满足指定条件的记录字段（列）中的数字之和。\",\r\n            a: \"使用 SQL 式查询，返回列表或数据库中满足指定条件的记录字段（列）中的数字之和。\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail: \"构成列表或数据库的单元格区域，列表的第一行包含每一列的标签。\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail:\r\n                        \"指定 database 中的哪一列包含要提取和用于计算的值。\\n\\nfield 可以是与 database 第一行中某个列标题对应的文本标签，也可以是指定相关列的数字索引，第一列的索引值为 1。\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail: \"包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        DVAR: {\r\n            d:\r\n                \"使用 SQL 式查询，返回利用列表或数据库中满足指定条件的记录字段（列）中的数字作为一个样本估算出的总体方差。\",\r\n            a:\r\n                \"使用 SQL 式查询，返回利用列表或数据库中满足指定条件的记录字段（列）中的数字作为一个样本估算出的总体方差。\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail: \"构成列表或数据库的单元格区域，列表的第一行包含每一列的标签。\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail:\r\n                        \"指定 database 中的哪一列包含要提取和用于计算的值。\\n\\nfield 可以是与 database 第一行中某个列标题对应的文本标签，也可以是指定相关列的数字索引，第一列的索引值为 1。\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail: \"包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        DVARP: {\r\n            d:\r\n                \"使用 SQL 式查询，通过使用列表或数据库中满足指定条件的记录字段（列）中的数字计算样本总体的样本总体方差。\",\r\n            a:\r\n                \"使用 SQL 式查询，通过使用列表或数据库中满足指定条件的记录字段（列）中的数字计算样本总体的样本总体方差。\",\r\n            p: [\r\n                {\r\n                    name: \"database\",\r\n                    detail: \"构成列表或数据库的单元格区域，列表的第一行包含每一列的标签。\",\r\n                },\r\n                {\r\n                    name: \"field\",\r\n                    detail:\r\n                        \"指定 database 中的哪一列包含要提取和用于计算的值。\\n\\nfield 可以是与 database 第一行中某个列标题对应的文本标签，也可以是指定相关列的数字索引，第一列的索引值为 1。\",\r\n                },\r\n                {\r\n                    name: \"criteria\",\r\n                    detail: \"包含所指定条件的单元格区域。计算之前将使用这些条件来过滤 database 中的值。\",\r\n                },\r\n            ],\r\n        },\r\n        AGE_BY_IDCARD: {\r\n            d: \"根据中国身份证号计算出年龄。支持15位或18位身份证\",\r\n            a: \"根据身份证号得到年龄。\",\r\n            p: [\r\n                {\r\n                    name: \"身份证号\",\r\n                    detail: \"15位或者18位的身份证号或范围。\",\r\n                },\r\n                {\r\n                    name: \"截止日期\",\r\n                    detail: \"年龄计算的截止日期或范围，默认为当日。\",\r\n                },\r\n            ],\r\n        },\r\n        SEX_BY_IDCARD: {\r\n            d: \"根据中国身份证号计算出性别。支持15位或18位身份证\",\r\n            a: \"根据身份证号得到性别。\",\r\n            p: [\r\n                {\r\n                    name: \"身份证号\",\r\n                    detail: \"15位或者18位的身份证号或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        BIRTHDAY_BY_IDCARD: {\r\n            d: \"根据中国身份证号计算出生日。支持15位或18位身份证\",\r\n            a: \"根据身份证号得到生日。\",\r\n            p: [\r\n                {\r\n                    name: \"身份证号\",\r\n                    detail: \"15位或者18位的身份证号或范围。\",\r\n                },\r\n                {\r\n                    name: \"生日格式\",\r\n                    detail: \"日期类型,默认0:[1900/01/01], 1:[1900-01-01], 2:[1900年1月1日]\",\r\n                },\r\n            ],\r\n        },\r\n        PROVINCE_BY_IDCARD: {\r\n            d: \"根据中国身份证号计算出籍贯的省份。支持15位或18位身份证\",\r\n            a: \"根据身份证号得到籍贯的省份。\",\r\n            p: [\r\n                {\r\n                    name: \"身份证号\",\r\n                    detail: \"15位或者18位的身份证号或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        CITY_BY_IDCARD: {\r\n            d: \"根据中国身份证号计算出籍贯的城市。支持15位或18位身份证\",\r\n            a: \"根据身份证号得到籍贯的城市。\",\r\n            p: [\r\n                {\r\n                    name: \"身份证号\",\r\n                    detail: \"15位或者18位的身份证号或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        STAR_BY_IDCARD: {\r\n            d: \"根据中国身份证号计算出星座。支持15位或18位身份证\",\r\n            a: \"根据身份证号得到星座。\",\r\n            p: [\r\n                {\r\n                    name: \"身份证号\",\r\n                    detail: \"15位或者18位的身份证号或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        ANIMAL_BY_IDCARD: {\r\n            d: \"根据中国身份证号计算出生肖（鼠、牛、虎、兔...）。支持15位或18位身份证\",\r\n            a: \"根据身份证号得到生肖。\",\r\n            p: [\r\n                {\r\n                    name: \"身份证号\",\r\n                    detail: \"15位或者18位的身份证号或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        ISIDCARD: {\r\n            d: \"验证身份证的格式是否正确。支持15位或18位身份证\",\r\n            a: \"验证身份证格式正确性。\",\r\n            p: [\r\n                {\r\n                    name: \"身份证号\",\r\n                    detail: \"15位或者18位的身份证号或范围。\",\r\n                },\r\n            ],\r\n        },\r\n        DM_TEXT_CUTWORD: {\r\n            d: \"文本分词。把一连串文字拆分为一系列单独词语\",\r\n            a: \"中文文本分词。\",\r\n            p: [\r\n                {\r\n                    name: \"文本\",\r\n                    detail: \"任意需要分词的文本。\",\r\n                },\r\n                {\r\n                    name: \"分词模式\",\r\n                    detail: \"默认为0[精确模式], 1[全模式], 2[搜索引擎模式]。\",\r\n                },\r\n            ],\r\n        },\r\n        DM_TEXT_TFIDF: {\r\n            d: \"采用tf-idf算法进行关键词提取。从一连串文字中识别关键词\",\r\n            a: \"tf-idf关键词识别。\",\r\n            p: [\r\n                {\r\n                    name: \"文本\",\r\n                    detail: \"任意需要分词的文本。\",\r\n                },\r\n                {\r\n                    name: \"关键词个数\",\r\n                    detail: \"算法返回的关键词个数，默认20\",\r\n                },\r\n                {\r\n                    name: \"语料库\",\r\n                    detail: \"选择特定领域的语料库，默认0[通用], 1[金融], 2[医疗]\",\r\n                },\r\n            ],\r\n        },\r\n        DM_TEXT_TEXTRANK: {\r\n            d: \"采用TextRank算法进行关键词提取。从一连串文字中识别关键词\",\r\n            a: \"TextRank关键词识别。\",\r\n            p: [\r\n                {\r\n                    name: \"文本\",\r\n                    detail: \"任意需要分词的文本。\",\r\n                },\r\n                {\r\n                    name: \"关键词个数\",\r\n                    detail: \"算法返回的关键词个数，默认20\",\r\n                },\r\n                {\r\n                    name: \"语料库\",\r\n                    detail: \"选择特定领域的语料库，默认0[通用], 1[金融], 2[医疗]\",\r\n                },\r\n            ],\r\n        },\r\n        DATA_CN_STOCK_CLOSE: {\r\n            d: \"根据股票代码和日期，返回A股对应股票收盘价。\",\r\n            a: \"返回A股对应股票收盘价。\",\r\n            p: [\r\n                {\r\n                    name: \"股票代码\",\r\n                    detail: \"6位股票代码，必填项。\",\r\n                },\r\n                {\r\n                    name: \"日期\",\r\n                    detail: \"股票的交易日，默认为最新交易日\",\r\n                },\r\n                {\r\n                    name: \"复权除权\",\r\n                    detail: \"选择股票的除权复权类型，默认0[前复权], 1[原始价格], 2[后复权]\",\r\n                },\r\n            ],\r\n        },\r\n        DATA_CN_STOCK_OPEN: {\r\n            d: \"根据股票代码和日期，返回A股对应股票开盘价。\",\r\n            a: \"返回A股对应股票开盘价。\",\r\n            p: [\r\n                {\r\n                    name: \"股票代码\",\r\n                    detail: \"6位股票代码，必填项。\",\r\n                },\r\n                {\r\n                    name: \"日期\",\r\n                    detail: \"股票的交易日，默认为最新交易日\",\r\n                },\r\n                {\r\n                    name: \"复权除权\",\r\n                    detail: \"选择股票的除权复权类型，默认0[前复权], 1[原始价格], 2[后复权]\",\r\n                },\r\n            ],\r\n        },\r\n        DATA_CN_STOCK_MAX: {\r\n            d: \"根据股票代码和日期，返回A股对应股票最高价。\",\r\n            a: \"返回A股对应股票最高价。\",\r\n            p: [\r\n                {\r\n                    name: \"股票代码\",\r\n                    detail: \"6位股票代码，必填项。\",\r\n                },\r\n                {\r\n                    name: \"日期\",\r\n                    detail: \"股票的交易日，默认为最新交易日\",\r\n                },\r\n                {\r\n                    name: \"复权除权\",\r\n                    detail: \"选择股票的除权复权类型，默认0[前复权], 1[原始价格], 2[后复权]\",\r\n                },\r\n            ],\r\n        },\r\n        DATA_CN_STOCK_MIN: {\r\n            d: \"根据股票代码和日期，返回A股对应股票最低价。\",\r\n            a: \"返回A股对应股票最低价。\",\r\n            p: [\r\n                {\r\n                    name: \"股票代码\",\r\n                    detail: \"6位股票代码，必填项。\",\r\n                },\r\n                {\r\n                    name: \"日期\",\r\n                    detail: \"股票的交易日，默认为最新交易日\",\r\n                },\r\n                {\r\n                    name: \"复权除权\",\r\n                    detail: \"选择股票的除权复权类型，默认0[前复权], 1[原始价格], 2[后复权]\",\r\n                },\r\n            ],\r\n        },\r\n        DATA_CN_STOCK_VOLUMN: {\r\n            d: \"根据股票代码和日期，返回A股对应股票成交量。\",\r\n            a: \"返回A股对应股票成交量。\",\r\n            p: [\r\n                {\r\n                    name: \"股票代码\",\r\n                    detail: \"6位股票代码，必填项。\",\r\n                },\r\n                {\r\n                    name: \"日期\",\r\n                    detail: \"股票的交易日，默认为最新交易日\",\r\n                },\r\n                {\r\n                    name: \"复权除权\",\r\n                    detail: \"选择股票的除权复权类型，默认0[前复权], 1[原始价格], 2[后复权]\",\r\n                },\r\n            ],\r\n        },\r\n        DATA_CN_STOCK_AMOUNT: {\r\n            d: \"根据股票代码和日期，返回A股对应股票成交额。\",\r\n            a: \"返回A股对应股票成交额。\",\r\n            p: [\r\n                {\r\n                    name: \"股票代码\",\r\n                    detail: \"6位股票代码，必填项。\",\r\n                },\r\n                {\r\n                    name: \"日期\",\r\n                    detail: \"股票的交易日，默认为最新交易日\",\r\n                },\r\n                {\r\n                    name: \"复权除权\",\r\n                    detail: \"选择股票的除权复权类型，默认0[前复权], 1[原始价格], 2[后复权]\",\r\n                },\r\n            ],\r\n        },\r\n        ISDATE: {\r\n            d: \"验证日期的格式是否正确。支持多种日期格式\",\r\n            a: \"验证日期格式正确性。\",\r\n            p: [\r\n                {\r\n                    name: \"日期\",\r\n                    detail: \"日期值，例如1990/01/01, 1990年1月1日等。\",\r\n                },\r\n            ],\r\n        },\r\n        LINESPLINES: {\r\n            d: \"生成嵌入在单元格内的折线图sparklines，用于描述数据的连续走势\",\r\n            a: \"生成单元格折线图\",\r\n            p: [\r\n                {\r\n                    name: \"数据范围\",\r\n                    detail: \"数据范围，数值才能被有效计算，例如A1:A20， {1,2,3,4,5}等。\",\r\n                },\r\n                {\r\n                    name: \"线条颜色\",\r\n                    detail:\r\n                        \"线图的线条颜色，可以是否个范围A1、色表索引数值或者具体颜色值，设置为0或false则不显示，支持regx、rgb、rgba等。默认#2ec7c9\",\r\n                },\r\n                {\r\n                    name: \"线条粗细\",\r\n                    detail: \"折线图线段粗细，默认为1px\",\r\n                },\r\n                {\r\n                    name: \"辅助线\",\r\n                    detail: \"一条横线，可以是min、max、avg、median、范围或自定义数值，默认0无\",\r\n                },\r\n                {\r\n                    name: \"辅助线颜色\",\r\n                    detail: \"辅助线的颜色设置，同线条颜色配置，默认#000\",\r\n                },\r\n                {\r\n                    name: \"最大值标识\",\r\n                    detail: \"标识线图最大值，同线条颜色配置，默认0不显示\",\r\n                },\r\n                {\r\n                    name: \"最小值标识\",\r\n                    detail: \"标识线图最小值，同线条颜色配置，默认0不显示\",\r\n                },\r\n                {\r\n                    name: \"标识大小\",\r\n                    detail: \"最大值和最小值的标识大小设置，默认为1.5\",\r\n                },\r\n            ],\r\n        },\r\n        AREASPLINES: {\r\n            d: \"生成嵌入在单元格内的面积图sparklines，一般用于描述数据的连续累积值走势\",\r\n            a: \"生成单元格面积图\",\r\n            p: [\r\n                {\r\n                    name: \"数据范围\",\r\n                    detail: \"数据范围，数值才能被有效计算，例如A1:A20， {1,2,3,4,5}等。\",\r\n                },\r\n                {\r\n                    name: \"线条颜色\",\r\n                    detail:\r\n                        \"线图的线条颜色，可以是否个范围A1、色表索引数值或者具体颜色值，设置为0或false则不显示，支持regx、rgb、rgba等。默认#2ec7c9\",\r\n                },\r\n                {\r\n                    name: \"填充颜色\",\r\n                    detail: \"形成面积图，同线条颜色配置，默认0不显示\",\r\n                },\r\n                {\r\n                    name: \"线条粗细\",\r\n                    detail: \"折线图线段粗细，默认为1px\",\r\n                },\r\n                {\r\n                    name: \"辅助线\",\r\n                    detail: \"一条横线，可以是min、max、avg、median、范围或自定义数值，默认0无\",\r\n                },\r\n                {\r\n                    name: \"辅助线颜色\",\r\n                    detail: \"辅助线的颜色设置，同线条颜色配置，默认#000\",\r\n                },\r\n            ],\r\n        },\r\n        COLUMNSPLINES: {\r\n            d: \"生成嵌入在单元格内的垂直柱状图sparklines，一般用于描述离散数据之间的大小情况\",\r\n            a: \"生成单元格垂直柱状图\",\r\n            p: [\r\n                {\r\n                    name: \"数据范围\",\r\n                    detail: \"数据范围，数值才能被有效计算，例如A1:A20， {1,2,3,4,5}等。\",\r\n                },\r\n                {\r\n                    name: \"柱条间隔\",\r\n                    detail: \"柱条之间的间隔距离，默认为1\",\r\n                },\r\n                {\r\n                    name: \"柱条颜色\",\r\n                    detail:\r\n                        \"线图的线条颜色，可以是否个范围A1、色表索引数值或者具体颜色值，设置为0或false则不显示，支持regx、rgb、rgba等。默认#fc5c5c\",\r\n                },\r\n                {\r\n                    name: \"负向柱条颜色\",\r\n                    detail: \"负向柱条颜色设置，代表负值的颜色，同柱条颜色配置，默认#97b552\",\r\n                },\r\n                {\r\n                    name: \"最大值\",\r\n                    detail: \"柱图最大值，用于规范柱图长度，默认为自动计算false、auto、null\",\r\n                },\r\n                {\r\n                    name: \"色板\",\r\n                    detail:\r\n                        \"调色板可以单独设置每个柱条的颜色，可设置多个，支持两种格式：1颜色例如#000，代表第一个柱的颜色是黑色；2数值范围:颜色，例如-2:#000表示数值为-2的柱为黑色，0:5:#000表示数值0-5的柱为黑色，默认为空\",\r\n                },\r\n            ],\r\n        },\r\n        STACKCOLUMNSPLINES: {\r\n            d: \"生成嵌入在单元格内的累积垂直柱状图sparklines，一般用于描述离散数据多个维度的数值大小\",\r\n            a: \"生成单元格累积垂直柱状图\",\r\n            p: [\r\n                {\r\n                    name: \"数据范围\",\r\n                    detail: \"数据范围，数值才能被有效计算，例如A1:A20， {1,2,3,4,5}等。\",\r\n                },\r\n                {\r\n                    name: \"按列堆积\",\r\n                    detail: \"如果需要按行堆积则本项设为false或0，默认为是1\",\r\n                },\r\n                {\r\n                    name: \"柱条间隔\",\r\n                    detail: \"柱条之间的间隔距离，默认为1\",\r\n                },\r\n                {\r\n                    name: \"最大值\",\r\n                    detail: \"累积柱图最大值，用于规范柱图长度，默认为自动计算false、auto、null\",\r\n                },\r\n                {\r\n                    name: \"累积色板\",\r\n                    detail:\r\n                        \"调色板可以单独设置每个维度的柱条颜色，可设置为A1:A10等范围，默认为#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n                },\r\n            ],\r\n        },\r\n        BARSPLINES: {\r\n            d: \"生成嵌入在单元格内的横向条形图sparklines，一般用于描述离散数据之间的大小情况\",\r\n            a: \"生成单元格横向条形图\",\r\n            p: [\r\n                {\r\n                    name: \"数据范围\",\r\n                    detail: \"数据范围，数值才能被有效计算，例如A1:A20， {1,2,3,4,5}等。\",\r\n                },\r\n                {\r\n                    name: \"柱条间隔\",\r\n                    detail: \"柱条之间的间隔距离，默认为1\",\r\n                },\r\n                {\r\n                    name: \"柱条颜色\",\r\n                    detail:\r\n                        \"线图的线条颜色，可以是否个范围A1、色表索引数值或者具体颜色值，设置为0或false则不显示，支持regx、rgb、rgba等。默认#fc5c5c\",\r\n                },\r\n                {\r\n                    name: \"负向柱条颜色\",\r\n                    detail: \"负向柱条颜色设置，代表负值的颜色，同柱条颜色配置，默认#97b552\",\r\n                },\r\n                {\r\n                    name: \"最大值\",\r\n                    detail: \"柱图最大值，用于规范柱图长度，默认为自动计算false、auto、null\",\r\n                },\r\n                {\r\n                    name: \"色板\",\r\n                    detail:\r\n                        \"调色板可以单独设置每个柱条的颜色，可设置多个，支持两种格式：1颜色例如#000，代表第一个柱的颜色是黑色；2数值范围:颜色，例如-2:#000表示数值为-2的柱为黑色，0:5:#000表示数值0-5的柱为黑色，默认为空\",\r\n                },\r\n            ],\r\n        },\r\n        STACKBARSPLINES: {\r\n            d: \"生成嵌入在单元格内的累积横向条形图sparklines，一般用于描述离散数据多个维度的数值大小\",\r\n            a: \"生成单元格累积横向条形图\",\r\n            p: [\r\n                {\r\n                    name: \"数据范围\",\r\n                    detail: \"数据范围，数值才能被有效计算，例如A1:A20， {1,2,3,4,5}等。\",\r\n                },\r\n                {\r\n                    name: \"按列堆积\",\r\n                    detail: \"如果需要按行堆积则本项设为false或0，默认为是1\",\r\n                },\r\n                {\r\n                    name: \"柱条间隔\",\r\n                    detail: \"柱条之间的间隔距离，默认为1\",\r\n                },\r\n                {\r\n                    name: \"最大值\",\r\n                    detail: \"累积柱图最大值，用于规范柱图长度，默认为自动计算false、auto、null\",\r\n                },\r\n                {\r\n                    name: \"累积色板\",\r\n                    detail:\r\n                        \"调色板可以单独设置每个维度的柱条颜色，可设置为A1:A10等范围，默认为#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n                },\r\n            ],\r\n        },\r\n        DISCRETESPLINES: {\r\n            d: \"生成嵌入在单元格内的离散图sparklines，一般用于描述离散数据走势\",\r\n            a: \"生成单元格离散图\",\r\n            p: [\r\n                {\r\n                    name: \"数据范围\",\r\n                    detail: \"数据范围，数值才能被有效计算，例如A1:A20， {1,2,3,4,5}等。\",\r\n                },\r\n                {\r\n                    name: \"分割阈值\",\r\n                    detail: \"离散图柱形颜色的区分，例如：该值为0，则大于0为蓝色，小于0为红色，默认为0\",\r\n                },\r\n                {\r\n                    name: \"阈值以上颜色\",\r\n                    detail:\r\n                        \"线图的线条颜色，可以是否个范围A1、色表索引数值或者具体颜色值，设置为0或false则不显示，支持regx、rgb、rgba等。默认#2ec7c9\",\r\n                },\r\n                {\r\n                    name: \"阈值以下颜色\",\r\n                    detail: \"阈值以下柱条颜色设置，同阈值以上颜色，默认#fc5c5c\",\r\n                },\r\n            ],\r\n        },\r\n        TRISTATESPLINES: {\r\n            d: \"生成嵌入在单元格内的三态图sparklines，一般用于描述三种态势的走势例如胜负平\",\r\n            a: \"生成单元格三态图\",\r\n            p: [\r\n                {\r\n                    name: \"数据范围\",\r\n                    detail: \"数据范围，数值才能被有效计算，例如A1:A20， {1,2,3,4,5}等。\",\r\n                },\r\n                {\r\n                    name: \"柱条间隔\",\r\n                    detail: \"柱条之间的间隔距离，默认为1\",\r\n                },\r\n                {\r\n                    name: \"柱条颜色\",\r\n                    detail:\r\n                        \"线图的线条颜色，可以是否个范围A1、色表索引数值或者具体颜色值，设置为0或false则不显示，支持regx、rgb、rgba等。默认#fc5c5c\",\r\n                },\r\n                {\r\n                    name: \"负向柱条颜色\",\r\n                    detail: \"负向柱条颜色设置，代表负值的颜色，同柱条颜色配置，默认#97b552\",\r\n                },\r\n                {\r\n                    name: \"零值柱条颜色\",\r\n                    detail: \"零值柱条颜色设置，代表0值颜色，同柱条颜色配置，默认#999\",\r\n                },\r\n                {\r\n                    name: \"色板\",\r\n                    detail:\r\n                        \"调色板可以单独设置每个柱条的颜色，可设置多个，支持两种格式：1颜色例如#000，代表第一个柱的颜色是黑色；2数值范围:颜色，例如-2:#000表示数值为-2的柱为黑色，0-5:#000表示数值0-5的柱为黑色，默认为空\",\r\n                },\r\n            ],\r\n        },\r\n        PIESPLINES: {\r\n            d: \"生成嵌入在单元格内的饼图sparklines，一般用于描述数据占比\",\r\n            a: \"生成单元格饼图\",\r\n            p: [\r\n                {\r\n                    name: \"数据范围\",\r\n                    detail: \"数据范围，数值才能被有效计算，例如A1:A20， {1,2,3,4,5}等。\",\r\n                },\r\n                {\r\n                    name: \"旋转角度\",\r\n                    detail: \"饼图的旋转角度，默认为0\",\r\n                },\r\n                {\r\n                    name: \"饼图边框\",\r\n                    detail: \"饼图边框大小，默认为无0\",\r\n                },\r\n                {\r\n                    name: \"边框颜色\",\r\n                    detail: \"饼图边框颜色，默认为#000\",\r\n                },\r\n                {\r\n                    name: \"饼图色板\",\r\n                    detail:\r\n                        \"调色板可以设置切片的颜色，可设置为A1:A10等范围，默认为#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\",\r\n                },\r\n            ],\r\n        },\r\n        BOXSPLINES: {\r\n            d: \"生成嵌入在单元格内的箱线图sparklines，一般用于描述数据集的统计分布\",\r\n            a: \"生成单元格箱线图\",\r\n            p: [\r\n                {\r\n                    name: \"数据范围\",\r\n                    detail: \"数据范围，数值才能被有效计算，例如A1:A20， {1,2,3,4,5}等。\",\r\n                },\r\n                {\r\n                    name: \"离群点比例\",\r\n                    detail: \"离群点的阈值范围，如果为0或false则不显示，默认为1.5倍\",\r\n                },\r\n                {\r\n                    name: \"目标点值\",\r\n                    detail: \"箱线图上的目标值设置，默认为false不显示\",\r\n                },\r\n                {\r\n                    name: \"数据点大小\",\r\n                    detail: \"目标点和离群点的半径大小设置，默认为1.5\",\r\n                },\r\n            ],\r\n        },\r\n        BULLETSPLINES: {\r\n            d: \"生成嵌入在单元格内的子弹图sparklines，一般用于描述任务达成率\",\r\n            a: \"生成单元格子弹图\",\r\n            p: [\r\n                {\r\n                    name: \"目标\",\r\n                    detail: \"达成的目标值，数值才能被有效计算，例如A1， 100等。\",\r\n                },\r\n                {\r\n                    name: \"实际完成\",\r\n                    detail: \"目前完成值，数值才能被有效计算，例如A1， 100等。\",\r\n                },\r\n                {\r\n                    name: \"对比值\",\r\n                    detail:\r\n                        \"对比值，例如超额、最低、获奖底线等，数值才能被有效计算，例如A1， 100等。可以设置最多9个对比值\",\r\n                },\r\n            ],\r\n        },\r\n        COMPOSESPLINES: {\r\n            d: \"支持多个类型的图画在同一个单元格,每个参数代表一个sparklines图\",\r\n            a: \"组合sparklines图到一个单元格\",\r\n            p: [\r\n                {\r\n                    name: \"图设置\",\r\n                    detail: \"sparklines图设置，例如A1:A20， 一个完成的饼图、线图设置等。\",\r\n                },\r\n            ],\r\n        },\r\n        SORT: {\r\n            d: \"返回数组中元素的排序数组。返回的数组与提供的数组参数形状相同。\",\r\n            a: \"返回数组中元素的排序数组。返回的数组与提供的数组参数形状相同。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"要排序的范围或数组。\",\r\n                },\r\n                {\r\n                    name: \"sort_index\",\r\n                    detail: \"[可选] - 表示要排序的行或列的数字。（默认row1/col1）\",\r\n                },\r\n                {\r\n                    name: \"sort_order\",\r\n                    detail: \"[可选] - 表示所需排序顺序的数字；1表示升序（默认），-1表示降序。\",\r\n                },\r\n                {\r\n                    name: \"by_col\",\r\n                    detail: \"[可选] - 表示所需排序方向的逻辑值；按行排序为FALSE()（默认），按列排序为TRUE()。\",\r\n                },\r\n            ],\r\n        },\r\n        FILTER: {\r\n            d: \"基于一个布尔（真/假）数组过滤一个数组。\",\r\n            a: \"基于一个布尔（真/假）数组过滤一个数组。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"要筛选的数组或范围。\",\r\n                },\r\n                {\r\n                    name: \"include\",\r\n                    detail: \"布尔数组，其高度或宽度与数组相同\",\r\n                },\r\n                {\r\n                    name: \"if_empty\",\r\n                    detail: \"[可选] - 如果包含数组中的所有值都为空(filter不返回任何值)，则返回的值。\",\r\n                },\r\n            ],\r\n        },\r\n        UNIQUE: {\r\n            d: \"返回列表或区域中的唯一值的列表。\",\r\n            a: \"返回列表或区域中的唯一值的列表。\",\r\n            p: [\r\n                {\r\n                    name: \"array\",\r\n                    detail: \"从其返回唯一值的数组或区域。\",\r\n                },\r\n                {\r\n                    name: \"by_col\",\r\n                    detail: \"[可选] - 逻辑值，指示如何比较；按行 = FALSE() 或省略；按列 = TRUE()。\",\r\n                },\r\n                {\r\n                    name: \"occurs_once\",\r\n                    detail: \"[可选] - 逻辑值，仅返回唯一值中出现一次 = TRUE()；包括所有唯一值 = FALSE() 或省略。\",\r\n                },\r\n            ],\r\n        },\r\n        RANDARRAY: {\r\n            d: \"返回 0 到 1 之间的随机数字数组。\",\r\n            a: \"返回 0 到 1 之间的随机数字数组。\",\r\n            p: [\r\n                {\r\n                    name: \"rows\",\r\n                    detail: \"[可选] - 要返回的行数。\",\r\n                },\r\n                {\r\n                    name: \"cols\",\r\n                    detail: \"[可选] - 要返回的列数。\",\r\n                },\r\n            ],\r\n        },\r\n        SEQUENCE: {\r\n            d: \"生成数字序列的列表。\",\r\n            a: \"生成数字序列的列表。\",\r\n            p: [\r\n                {\r\n                    name: \"rows\",\r\n                    detail: \"要返回的行数。\",\r\n                },\r\n                {\r\n                    name: \"cols\",\r\n                    detail: \"[可选] - 要返回的列数。\",\r\n                },\r\n                {\r\n                    name: \"start\",\r\n                    detail: \"[可选] - 序列中的第一个数字。\",\r\n                },\r\n                {\r\n                    name: \"step\",\r\n                    detail: \"[可选] - 序列中每个序列值的增量。\",\r\n                },\r\n            ],\r\n        },\r\n        EVALUATE: {\r\n            d: \"对以文字表示的公式或者表达式求值，并返回结果。\",\r\n            a: \"根据文字公式或者表达式求值。\",\r\n            p: [\r\n                {\r\n                    name: \"公式\",\r\n                    detail: \"公式或表达式\",\r\n                },\r\n            ],\r\n        },\r\n        REMOTE: {\r\n            d: \"Calls a function on a remote server\",\r\n            a: \"Calls a function on a remote back end server/API.\",\r\n            p: [\r\n                {\r\n                    name: \"remote_expression\",\r\n                    detail: \"Formula\",\r\n                },\r\n            ],\r\n        },\r\n    },\r\n    toolbar: {\r\n        undo: \"撤销\",\r\n        redo: \"重做\",\r\n        paintFormat: \"格式刷\",\r\n        currencyFormat: \"货币格式\",\r\n        percentageFormat: \"百分比格式\",\r\n        numberDecrease: \"减少小数位数\",\r\n        numberIncrease: \"增加小数位数\",\r\n        moreFormats: \"更多格式\",\r\n        font: \"字体\",\r\n        fontSize: \"字号大小\",\r\n        bold: \"粗体 (Ctrl+B)\",\r\n        italic: \"斜体 (Ctrl+I)\",\r\n        strikethrough: \"删除线 (Alt+Shift+5)\",\r\n        underline: \"下划线\",\r\n        textColor: \"文本颜色\",\r\n        chooseColor: \"颜色选择\",\r\n        resetColor: \"重置颜色\",\r\n        customColor: \"自定义\",\r\n        alternatingColors: \"交替颜色\",\r\n        confirmColor: \"确定颜色\",\r\n        cancelColor: \"取消\",\r\n        collapse: \"收起\",\r\n        fillColor: \"单元格颜色\",\r\n        border: \"边框\",\r\n        borderStyle: \"边框类型\",\r\n        mergeCell: \"合并单元格\",\r\n        chooseMergeType: \"选择合并类型\",\r\n        horizontalAlign: \"水平对齐\",\r\n        verticalAlign: \"垂直对齐\",\r\n        alignment: \"对齐方式\",\r\n        textWrap: \"文本换行\",\r\n        textWrapMode: \"换行方式\",\r\n        textRotate: \"文本旋转\",\r\n        textRotateMode: \"旋转方式\",\r\n        freezeTopRow: \"冻结第一行\",\r\n        sortAndFilter: \"排序和筛选\",\r\n        findAndReplace: \"查找替换\",\r\n        sum: \"求和\",\r\n        autoSum: \"自动求和\",\r\n        moreFunction: \"更多函数\",\r\n        conditionalFormat: \"条件格式\",\r\n        postil: \"批注\",\r\n        pivotTable: \"数据透视表\",\r\n        chart: \"图表\",\r\n        screenshot: \"截图\",\r\n        splitColumn: \"分列\",\r\n        insertImage: \"插入图片\",\r\n        exportXlsx: \"导出Xlsx\",\r\n        insertLink: \"插入链接\",\r\n        dataVerification: \"数据验证\",\r\n        protection: \"保护工作表内容\",\r\n\r\n        clearText: \"清除颜色选择\",\r\n        noColorSelectedText: \"没有颜色被选择\",\r\n\r\n        toolMore: \"更多\",\r\n        toolLess: \"少于\",\r\n        toolClose: \"收起\",\r\n        toolMoreTip: \"更多功能\",\r\n        moreOptions: \"更多选项\",\r\n\r\n        cellFormat: \"设置单元格格式\",\r\n        print: \"打印\",\r\n    },\r\n    alternatingColors: {\r\n        applyRange: \"应用范围\",\r\n        selectRange: \"选择应用范围\",\r\n        header: \"页眉\",\r\n        footer: \"页脚\",\r\n\r\n        errorInfo: \"不能对多重选择区域执行此操作，请选择单个区域，然后再试\",\r\n        textTitle: \"格式样式\",\r\n        custom: \"自定义\",\r\n        close: \"关闭\",\r\n        selectionTextColor: \"选择文本颜色\",\r\n        selectionCellColor: \"选择单元格颜色\",\r\n        removeColor: \"移除交替颜色\",\r\n        colorShow: \"颜色\",\r\n        currentColor: \"当前颜色\",\r\n\r\n        tipSelectRange: \"请选择交替颜色应用范围\",\r\n        errorNoRange: \"您选择的应用范围不是选区！\",\r\n        errorExistColors: \"您选择的应用范围已存在交替颜色且不属于你要编辑的应用范围！\",\r\n    },\r\n    button: {\r\n        confirm: \"确定\",\r\n        cancel: \"取消\",\r\n        close: \"关闭\",\r\n        update: \"更新\",\r\n        delete: \"删除\",\r\n        insert: \"新建\",\r\n        prevPage: \"上一页\",\r\n        nextPage: \"下一页\",\r\n        total: \"总共：\",\r\n    },\r\n    paint: {\r\n        start: \"格式刷开启\",\r\n        end: \"ESC键退出\",\r\n\r\n        tipSelectRange: \"请选择需要复制格式的区域\",\r\n        tipNotMulti: \"无法对多重选择区域执行此操作\",\r\n    },\r\n    format: {\r\n        moreCurrency: \"更多货币格式\",\r\n        moreDateTime: \"更多日期与时间格式\",\r\n        moreNumber: \"更多数字格式\",\r\n\r\n        titleCurrency: \"货币格式\",\r\n        decimalPlaces: \"小数位数\",\r\n        titleDateTime: \"日期与时间格式\",\r\n        titleNumber: \"数字格式\",\r\n    },\r\n    info: {\r\n        detailUpdate: \"新打开\",\r\n        detailSave: \"已恢复本地缓存\",\r\n        row: \"行\",\r\n        column: \"列\",\r\n        loading: \"渲染中···\",\r\n\r\n        copy: \"副本\",\r\n        return: \"返回\",\r\n        rename: \"重命名\",\r\n        tips: \"表格重命名\",\r\n        noName: \"无标题的电子表格\",\r\n        wait: \"待更新\",\r\n\r\n        add: \"添加\",\r\n        addLast: \"在底部添加\",\r\n        backTop: \"回到顶部\",\r\n        pageInfo: \"共${total}条，${totalPage}页，当前已显示${currentPage}页\",\r\n        nextPage: \"下一页\",\r\n\r\n        tipInputNumber: \"请输入数字\",\r\n        tipInputNumberLimit: \"增加范围限制在1-100\",\r\n\r\n        tipRowHeightLimit: \"行高必须在0 ~ 545之间\",\r\n        tipColumnWidthLimit: \"列宽必须在0 ~ 2038之间\",\r\n        pageInfoFull: \"共${total}条，${totalPage}页，已显示全部数据\",\r\n    },\r\n    currencyDetail: {\r\n        RMB: \"人民币\",\r\n        USdollar: \"美元\",\r\n        EUR: \"欧元\",\r\n        GBP: \"英镑\",\r\n        HK: \"港元\",\r\n        JPY: \"日元\",\r\n        AlbanianLek: \"阿尔巴尼亚列克\",\r\n        AlgerianDinar: \"阿尔及利亚第纳尔\",\r\n        Afghani: \"阿富汗尼\",\r\n        ArgentinePeso: \"阿根廷比索\",\r\n        UnitedArabEmiratesDirham: \"阿拉伯联合酋长国迪拉姆\",\r\n        ArubanFlorin: \"阿鲁巴弗罗林\",\r\n        OmaniRial: \"阿曼里亚尔\",\r\n        Azerbaijanimanat: \"阿塞拜疆马纳特\",\r\n        EgyptianPound: \"埃及镑\",\r\n        EthiopianBirr: \"埃塞俄比亚比尔\",\r\n        AngolaKwanza: \"安哥拉宽扎\",\r\n        AustralianDollar: \"澳大利亚元\",\r\n        Patacas: \"澳门元\",\r\n        BarbadosDollar: \"巴巴多斯元\",\r\n        PapuaNewGuineaKina: \"巴布亚新几内亚基那\",\r\n        BahamianDollar: \"巴哈马元\",\r\n        PakistanRupee: \"巴基斯坦卢比\",\r\n        ParaguayanGuarani: \"巴拉圭瓜拉尼\",\r\n        BahrainiDinar: \"巴林第纳尔\",\r\n        PanamanianBalboa: \"巴拿马巴波亚\",\r\n        Brazilianreal: \"巴西里亚伊\",\r\n        Belarusianruble: \"白俄罗斯卢布\",\r\n        BermudianDollar: \"百慕大元\",\r\n        BulgarianLev: \"保加利亚列弗\",\r\n        IcelandKrona: \"冰岛克朗\",\r\n        BosniaHerzegovinaConvertibleMark: \"波黑可兑换马克\",\r\n        PolishZloty: \"波兰兹罗提\",\r\n        Boliviano: \"玻利维亚诺\",\r\n        BelizeDollar: \"伯利兹元\",\r\n        BotswanaPula: \"博茨瓦纳普拉\",\r\n        NotDannuzhamu: \"不丹努扎姆\",\r\n        BurundiFranc: \"布隆迪法郎\",\r\n        NorthKoreanWon: \"朝鲜圆\",\r\n        DanishKrone: \"丹麦克朗\",\r\n        EastCaribbeanDollar: \"东加勒比元\",\r\n        DominicaPeso: \"多米尼加比索\",\r\n        RussianRuble: \"俄国卢布\",\r\n        EritreanNakfa: \"厄立特里亚纳克法\",\r\n        CFAfranc: \"非洲金融共同体法郎\",\r\n        PhilippinePeso: \"菲律宾比索\",\r\n        FijiDollar: \"斐济元\",\r\n        CapeVerdeEscudo: \"佛得角埃斯库多\",\r\n        FalklandIslandsPound: \"福克兰群岛镑\",\r\n        GambianDalasi: \"冈比亚达拉西\",\r\n        Congolesefranc: \"刚果法郎\",\r\n        ColombianPeso: \"哥伦比亚比索\",\r\n        CostaRicanColon: \"哥斯达黎加科朗\",\r\n        CubanPeso: \"古巴比索\",\r\n        Cubanconvertiblepeso: \"古巴可兑换比索\",\r\n        GuyanaDollar: \"圭亚那元\",\r\n        KazakhstanTenge: \"哈萨克斯坦坚戈\",\r\n        Haitiangourde: \"海地古德\",\r\n        won: \"韩元\",\r\n        NetherlandsAntillesGuilder: \"荷属安的列斯盾\",\r\n        Honduraslempiras: \"洪都拉斯拉伦皮拉\",\r\n        DjiboutiFranc: \"吉布提法郎\",\r\n        KyrgyzstanSom: \"吉尔吉斯斯坦索姆\",\r\n        GuineaFranc: \"几内亚法郎\",\r\n        CanadianDollar: \"加拿大元\",\r\n        GhanaianCedi: \"加纳塞地\",\r\n        Cambodianriel: \"柬埔寨瑞尔\",\r\n        CzechKoruna: \"捷克克朗\",\r\n        ZimbabweDollar: \"津巴布韦元\",\r\n        QatariRiyal: \"卡塔尔里亚尔\",\r\n        CaymanIslandsDollar: \"开曼群岛元\",\r\n        Comorianfranc: \"科摩罗法郎\",\r\n        KuwaitiDinar: \"科威特第纳尔\",\r\n        CroatianKuna: \"克罗地亚库纳\",\r\n        KenyanShilling: \"肯尼亚先令\",\r\n        LesothoLoti: \"莱索托洛蒂\",\r\n        LaoKip: \"老挝基普\",\r\n        LebanesePound: \"黎巴嫩镑\",\r\n        Lithuanianlitas: \"立陶宛立特\",\r\n        LibyanDinar: \"利比亚第纳尔\",\r\n        LiberianDollar: \"利比亚元\",\r\n        RwandaFranc: \"卢旺达法郎\",\r\n        RomanianLeu: \"罗马尼亚列伊\",\r\n        MalagasyAriary: \"马达加斯加阿里亚里\",\r\n        MaldivianRufiyaa: \"马尔代夫拉菲亚\",\r\n        MalawiKwacha: \"马拉维克瓦查\",\r\n        MalaysianRinggit: \"马来西亚林吉特\",\r\n        MacedoniawearingDinar: \"马其顿戴第纳尔\",\r\n        MauritiusRupee: \"毛里求斯卢比\",\r\n        MauritanianOuguiya: \"毛里塔尼亚乌吉亚\",\r\n        MongolianTugrik: \"蒙古图格里克\",\r\n        BangladeshiTaka: \"孟加拉塔卡\",\r\n        PeruvianNuevoSol: \"秘鲁新索尔\",\r\n        MyanmarKyat: \"缅甸开亚特\",\r\n        MoldovanLeu: \"摩尔多瓦列伊\",\r\n        MoroccanDirham: \"摩洛哥迪拉姆\",\r\n        MozambiqueMetical: \"莫桑比克梅蒂卡尔\",\r\n        MexicanPeso: \"墨西哥比索\",\r\n        NamibianDollar: \"纳米比亚元\",\r\n        SouthAfricanRand: \"南非兰特\",\r\n        SouthSudanesePound: \"南苏丹镑\",\r\n        NicaraguaCordoba: \"尼加拉瓜科多巴\",\r\n        NepaleseRupee: \"尼泊尔卢比\",\r\n        NigerianNaira: \"尼日利亚奈拉\",\r\n        NorwegianKrone: \"挪威克朗\",\r\n        GeorgianLari: \"乔治亚拉瑞\",\r\n        RMBOffshore: \"人民币（离岸）\",\r\n        SwedishKrona: \"瑞典克朗\",\r\n        SwissFranc: \"瑞士法郎\",\r\n        SerbianDinar: \"塞尔维亚第纳尔\",\r\n        SierraLeone: \"塞拉利昂利昂\",\r\n        SeychellesRupee: \"塞舌尔卢比\",\r\n        SaudiRiyal: \"沙特里亚尔\",\r\n        SaoTomeDobra: \"圣多美多布拉\",\r\n        SaintHelenapound: \"圣赫勒拿群岛磅\",\r\n        SriLankaRupee: \"斯里兰卡卢比\",\r\n        SwazilandLilangeni: \"斯威士兰里兰吉尼\",\r\n        SudanesePound: \"苏丹镑\",\r\n        Surinamesedollar: \"苏里南元\",\r\n        SolomonIslandsDollar: \"所罗门群岛元\",\r\n        SomaliShilling: \"索马里先令\",\r\n        TajikistanSomoni: \"塔吉克斯坦索莫尼\",\r\n        PacificFranc: \"太平洋法郎\",\r\n        ThaiBaht: \"泰国铢\",\r\n        TanzanianShilling: \"坦桑尼亚先令\",\r\n        TonganPaanga: \"汤加潘加\",\r\n        TrinidadandTobagoDollar: \"特立尼达和多巴哥元\",\r\n        TunisianDinar: \"突尼斯第纳尔\",\r\n        TurkishLira: \"土耳其里拉\",\r\n        VanuatuVatu: \"瓦努阿图瓦图\",\r\n        GuatemalanQuetzal: \"危地马拉格查尔\",\r\n        CommissionBolivar: \"委内瑞拉博利瓦\",\r\n        BruneiDollar: \"文莱元\",\r\n        UgandanShilling: \"乌干达先令\",\r\n        UkrainianHryvnia: \"乌克兰格里夫尼亚\",\r\n        UruguayanPeso: \"乌拉圭比索\",\r\n        Uzbekistansom: \"乌兹别克斯坦苏姆\",\r\n        WesternSamoaTala: \"西萨摩亚塔拉\",\r\n        SingaporeDollar: \"新加坡元\",\r\n        NT: \"新台币\",\r\n        NewZealandDollar: \"新西兰元\",\r\n        HungarianForint: \"匈牙利福林\",\r\n        SyrianPound: \"叙利亚镑\",\r\n        JamaicanDollar: \"牙买加元\",\r\n        ArmenianDram: \"亚美尼亚德拉姆\",\r\n        YemeniRial: \"也门里亚尔\",\r\n        IraqiDinar: \"伊拉克第纳尔\",\r\n        IranianRial: \"伊朗里亚尔\",\r\n        NewIsraeliShekel: \"以色列新谢克尔\",\r\n        IndianRupee: \"印度卢比\",\r\n        IndonesianRupiah: \"印度尼西亚卢比\",\r\n        JordanianDinar: \"约旦第纳尔\",\r\n        VND: \"越南盾\",\r\n        ZambianKwacha: \"赞比亚克瓦查\",\r\n        GibraltarPound: \"直布罗陀镑\",\r\n        ChileanPeso: \"智利比索\",\r\n        CFAFrancBEAC: \"中非金融合作法郎\",\r\n    },\r\n    defaultFmt: [\r\n        { text: \"自动\", value: \"General\", example: \"\" },\r\n        { text: \"纯文本\", value: \"@\", example: \"\" },\r\n        { text: \"\", value: \"split\", example: \"\" },\r\n        { text: \"数字\", value: \"##0.00\", example: \"1000.12\" },\r\n        { text: \"百分比\", value: \"#0.00%\", example: \"12.21%\" },\r\n        { text: \"科学计数\", value: \"0.00E+00\", example: \"1.01E+5\" },\r\n        { text: \"\", value: \"split\", example: \"\" },\r\n        { text: \"会计\", value: \"¥(0.00)\", example: \"¥(1200.09)\" },\r\n        //{ \"text\": \"财务\", \"value\": \"(#.####)\", \"example\": \"(1200.09)\" },\r\n        { text: \"万元\", value: \"w\", example: \"1亿2000万2500\" },\r\n        { text: \"货币\", value: \"¥0.00\", example: \"¥1200.09\" },\r\n        //{ \"text\": \"货币整数\", \"value\": \"¥####\", \"example\": \"¥1200\" },\r\n        { text: \"万元2位小数\", value: \"w0.00\", example: \"2万2500.55\" },\r\n        { text: \"\", value: \"split\", example: \"\" },\r\n        { text: \"日期\", value: \"yyyy-MM-dd\", example: \"2017-11-29\" },\r\n        { text: \"时间\", value: \"hh:mm AM/PM\", example: \"3:00 PM\" },\r\n        { text: \"时间24H\", value: \"hh:mm\", example: \"15:00\" },\r\n        { text: \"日期时间\", value: \"yyyy-MM-dd hh:mm AM/PM\", example: \"2017-11-29 3:00 PM\" },\r\n        { text: \"日期时间24H\", value: \"yyyy-MM-dd hh:mm\", example: \"2017-11-29 15:00\" },\r\n        { text: \"\", value: \"split\", example: \"\" },\r\n        { text: \"自定义格式\", value: \"fmtOtherSelf\", example: \"more\" },\r\n    ],\r\n    dateFmtList: [\r\n        {\r\n            name: \"1930-08-05\",\r\n            value: \"yyyy-MM-dd\",\r\n        },\r\n        {\r\n            name: \"1930/8/5\",\r\n            value: \"yyyy/MM/dd\",\r\n        },\r\n        {\r\n            name: \"1930年8月5日\",\r\n            value: 'yyyy\"年\"M\"月\"d\"日\"',\r\n        },\r\n        {\r\n            name: \"08-05\",\r\n            value: \"MM-dd\",\r\n        },\r\n        {\r\n            name: \"8-5\",\r\n            value: \"M-d\",\r\n        },\r\n        {\r\n            name: \"8月5日\",\r\n            value: 'M\"月\"d\"日\"',\r\n        },\r\n        {\r\n            name: \"13:30:30\",\r\n            value: \"h:mm:ss\",\r\n        },\r\n        {\r\n            name: \"13:30\",\r\n            value: \"h:mm\",\r\n        },\r\n        {\r\n            name: \"下午01:30\",\r\n            value: \"上午/下午 hh:mm\",\r\n        },\r\n        {\r\n            name: \"下午1:30\",\r\n            value: \"上午/下午 h:mm\",\r\n        },\r\n        {\r\n            name: \"下午1:30:30\",\r\n            value: \"上午/下午 h:mm:ss\",\r\n        },\r\n        {\r\n            name: \"08-05 下午01:30\",\r\n            value: \"MM-dd 上午/下午 hh:mm\",\r\n        },\r\n        // {\r\n        //     \"name\": \"1930年8月5日星期二\",\r\n        //     \"value\": ''\r\n        // },\r\n        // {\r\n        //     \"name\": \"1930年8月5日星期二 下午1:30:30\",\r\n        //     \"value\": ''\r\n        // },\r\n    ],\r\n    fontFamily: {\r\n        MicrosoftYaHei: \"Microsoft YaHei\",\r\n    },\r\n    fontarray: [\r\n        \"Times New Roman\",\r\n        \"Arial\",\r\n        \"Tahoma\",\r\n        \"Verdana\",\r\n        \"微软雅黑\",\r\n        \"宋体\",\r\n        \"黑体\",\r\n        \"楷体\",\r\n        \"仿宋\",\r\n        \"新宋体\",\r\n        \"华文新魏\",\r\n        \"华文行楷\",\r\n        \"华文隶书\",\r\n    ],\r\n    fontjson: {\r\n        \"times new roman\": 0,\r\n        arial: 1,\r\n        tahoma: 2,\r\n        verdana: 3,\r\n        微软雅黑: 4,\r\n        \"microsoft yahei\": 4,\r\n        宋体: 5,\r\n        simsun: 5,\r\n        黑体: 6,\r\n        simhei: 6,\r\n        楷体: 7,\r\n        kaiti: 7,\r\n        仿宋: 8,\r\n        fangsong: 8,\r\n        新宋体: 9,\r\n        nsimsun: 9,\r\n        华文新魏: 10,\r\n        stxinwei: 10,\r\n        华文行楷: 11,\r\n        stxingkai: 11,\r\n        华文隶书: 12,\r\n        stliti: 12,\r\n    },\r\n    border: {\r\n        borderTop: \"上框线\",\r\n        borderBottom: \"下框线\",\r\n        borderLeft: \"左框线\",\r\n        borderRight: \"右框线\",\r\n        borderNone: \"无\",\r\n        borderAll: \"所有\",\r\n        borderOutside: \"外侧\",\r\n        borderInside: \"内侧\",\r\n        borderHorizontal: \"内侧横线\",\r\n        borderVertical: \"内侧竖线\",\r\n        borderColor: \"边框颜色\",\r\n        borderSize: \"边框粗细\",\r\n    },\r\n    merge: {\r\n        mergeAll: \"全部合并\",\r\n        mergeV: \"垂直合并\",\r\n        mergeH: \"水平合并\",\r\n        mergeCancel: \"取消合并\",\r\n        overlappingError: \"不能合并重叠区域\",\r\n        partiallyError: \"无法对部分合并单元格执行此操作\",\r\n    },\r\n    align: {\r\n        left: \"左对齐\",\r\n        center: \"中间对齐\",\r\n        right: \"右对齐\",\r\n\r\n        top: \"顶部对齐\",\r\n        middle: \"居中对齐\",\r\n        bottom: \"底部对齐\",\r\n    },\r\n    textWrap: {\r\n        overflow: \"溢出\",\r\n        wrap: \"自动换行\",\r\n        clip: \"截断\",\r\n    },\r\n    rotation: {\r\n        none: \"无旋转\",\r\n        angleup: \"向上倾斜\",\r\n        angledown: \"向下倾斜\",\r\n        vertical: \"竖排文字\",\r\n        rotationUp: \"向上90°\",\r\n        rotationDown: \"向下90°\",\r\n    },\r\n    freezen: {\r\n        default: \"冻结第一行\",\r\n        freezenRow: \"冻结第一行\",\r\n        freezenColumn: \"冻结第A列\",\r\n        freezenRC: \"冻结第一行第A列\",\r\n        freezenRowRange: \"冻结行到选区\",\r\n        freezenColumnRange: \"冻结列到选区\",\r\n        freezenRCRange: \"冻结行列到选区\",\r\n        freezenCancel: \"取消冻结\",\r\n\r\n        noSeletionError: \"没有选区\",\r\n        rangeRCOverErrorTitle: \"冻结提醒\",\r\n        rangeRCOverError: \"冻结窗格超过可见范围，会导致无法正常操作，请重新设置冻结区域。\",\r\n    },\r\n    sort: {\r\n        asc: \"升序\",\r\n        desc: \"降序\",\r\n        custom: \"自定义排序\",\r\n\r\n        hasTitle: \"数据具有标题行\",\r\n        sortBy: \"排序依据\",\r\n        addOthers: \"添加其他排序列\",\r\n        close: \"关闭\",\r\n        confirm: \"排序\",\r\n\r\n        columnOperation: \"列\",\r\n        secondaryTitle: \"次要排序\",\r\n\r\n        sortTitle: \"排序范围\",\r\n\r\n        sortRangeTitle: \"排序范围从\",\r\n        sortRangeTitleTo: \"到\",\r\n\r\n        noRangeError: \"不能对多重选择区域执行此操作，请选择单个区域，然后再试\",\r\n        mergeError: \"选区有合并单元格，无法执行此操作！\",\r\n        columnSortMergeError: \"列排序会扩展至整个表格选区，选区有合并单元格，无法执行此操作，请选择功能栏排序功能！\",\r\n    },\r\n    filter: {\r\n        filter: \"筛选\",\r\n        clearFilter: \"清除筛选\",\r\n\r\n        sortByAsc: \"以A-Z升序排列\",\r\n        sortByDesc: \"以Z-A降序排列\",\r\n        filterByColor: \"按颜色筛选\",\r\n        filterByCondition: \"按条件过滤\",\r\n        filterByValues: \"按值过滤\",\r\n\r\n        filiterInputNone: \"无\",\r\n\r\n        filiterInputTip: \"输入筛选值\",\r\n        filiterRangeStart: \"从\",\r\n        filiterRangeStartTip: \"范围开始\",\r\n        filiterRangeEnd: \"到\",\r\n        filiterRangeEndTip: \"范围结束\",\r\n\r\n        filterValueByAllBtn: \"全选\",\r\n        filterValueByClearBtn: \"清除\",\r\n        filterValueByInverseBtn: \"反选\",\r\n        filterValueByTip: \"按照值进行筛选\",\r\n        filterConform: \"确 认\",\r\n        filterCancel: \"取 消\",\r\n\r\n        conditionNone: \"无\",\r\n        conditionCellIsNull: \"单元格为空\",\r\n        conditionCellNotNull: \"单元格有数据\",\r\n        conditionCellTextContain: \"文本包含\",\r\n        conditionCellTextNotContain: \"文本不包含\",\r\n        conditionCellTextStart: \"文本开头为\",\r\n        conditionCellTextEnd: \"文本结尾为\",\r\n        conditionCellTextEqual: \"文本等于\",\r\n        conditionCellDateEqual: \"日期等于\",\r\n        conditionCellDateBefore: \"日期早于\",\r\n        conditionCellDateAfter: \"日期晚于\",\r\n        conditionCellGreater: \"大于\",\r\n        conditionCellGreaterEqual: \"大于等于\",\r\n        conditionCellLess: \"小于\",\r\n        conditionCellLessEqual: \"小于等于\",\r\n        conditionCellEqual: \"等于\",\r\n        conditionCellNotEqual: \"不等于\",\r\n        conditionCellBetween: \"介于\",\r\n        conditionCellNotBetween: \"不在其中\",\r\n\r\n        filiterMoreDataTip: \"数据量大！请稍后\",\r\n        filiterMonthText: \"月\",\r\n        filiterYearText: \"年\",\r\n        filiterByColorTip: \"按单元格颜色筛选\",\r\n        filiterByTextColorTip: \"按单元格字体颜色筛选\",\r\n        filterContainerOneColorTip: \"本列仅包含一种颜色\",\r\n        filterDateFormatTip: \"日期格式\",\r\n\r\n        valueBlank: \"(空白)\",\r\n        mergeError: \"筛选选区有合并单元格，无法执行此操作！\",\r\n    },\r\n    rightclick: {\r\n        copy: \"复制\",\r\n        copyAs: \"复制为\",\r\n        paste: \"粘贴\",\r\n        insert: \"插入\",\r\n        delete: \"删除\",\r\n        deleteCell: \"删除单元格\",\r\n        deleteSelected: \"删除选中\",\r\n        hide: \"隐藏\",\r\n        hideSelected: \"隐藏选中\",\r\n        showHide: \"显示隐藏\",\r\n        to: \"向\",\r\n        left: \"左\",\r\n        right: \"右\",\r\n        top: \"上\",\r\n        bottom: \"下\",\r\n        moveLeft: \"左移\",\r\n        moveUp: \"上移\",\r\n        add: \"增加\",\r\n        row: \"行\",\r\n        column: \"列\",\r\n        width: \"宽\",\r\n        height: \"高\",\r\n        number: \"数字\",\r\n        confirm: \"确认\",\r\n        orderAZ: \"A-Z顺序排列\",\r\n        orderZA: \"Z-A降序排列\",\r\n        clearContent: \"清除内容\",\r\n        matrix: \"矩阵操作选区\",\r\n        sortSelection: \"排序选区\",\r\n        filterSelection: \"筛选选区\",\r\n        chartGeneration: \"图表生成\",\r\n        firstLineTitle: \"首行为标题\",\r\n        untitled: \"无标题\",\r\n        array1: \"一维数组\",\r\n        array2: \"二维数组\",\r\n        array3: \"多维数组\",\r\n        diagonal: \"对角线\",\r\n        antiDiagonal: \"反对角线\",\r\n        diagonalOffset: \"对角偏移\",\r\n        offset: \"偏移量\",\r\n        boolean: \"布尔值\",\r\n        flip: \"翻转\",\r\n        upAndDown: \"上下\",\r\n        leftAndRight: \"左右\",\r\n        clockwise: \"顺时针\",\r\n        counterclockwise: \"逆时针\",\r\n        transpose: \"转置\",\r\n        matrixCalculation: \"矩阵计算\",\r\n        plus: \"加\",\r\n        minus: \"减\",\r\n        multiply: \"乘\",\r\n        divided: \"除\",\r\n        power: \"次方\",\r\n        root: \"次方根\",\r\n        log: \"log\",\r\n        delete0: \"删除两端0值\",\r\n        removeDuplicate: \"删除重复值\",\r\n        byRow: \"按行\",\r\n        byCol: \"按列\",\r\n        generateNewMatrix: \"生成新矩阵\",\r\n    },\r\n    comment: {\r\n        insert: \"新建批注\",\r\n        edit: \"编辑批注\",\r\n        delete: \"删除\",\r\n        showOne: \"显示/隐藏批注\",\r\n        showAll: \"显示/隐藏所有批注\",\r\n    },\r\n    screenshot: {\r\n        screenshotTipNoSelection: \"请框选需要截图的范围\",\r\n        screenshotTipTitle: \"提示！\",\r\n        screenshotTipHasMerge: \"无法对合并单元格执行此操作\",\r\n        screenshotTipHasMulti: \"无法对多重选择区域执行此操作\",\r\n        screenshotTipSuccess: \"截取成功\",\r\n        screenshotImageName: \"截图\",\r\n\r\n        downLoadClose: \"关闭\",\r\n        downLoadCopy: \"复制到剪切板\",\r\n        downLoadBtn: \"下载\",\r\n        browserNotTip: \"下载功能IE浏览器不支持！\",\r\n        rightclickTip: \"请在图片上右键点击'复制'\",\r\n        successTip: \"已成功复制（如果粘贴失败，请在图片上右键点击'复制图片'）\",\r\n    },\r\n    splitText: {\r\n        splitDelimiters: \"分割符号\",\r\n        splitOther: \"其它\",\r\n        splitContinueSymbol: \"连续分隔符号视为单个处理\",\r\n        splitDataPreview: \"数据预览\",\r\n        splitTextTitle: \"文本分列\",\r\n        splitConfirmToExe: \"此处已有数据，是否替换它？\",\r\n\r\n        tipNoMulti: \"不能对多重选择区域执行此操作，请选择单个区域，然后再试\",\r\n        tipNoMultiColumn: \"一次只能转换一列数据，选定区域可以有多行，但不能有多列，请在选定单列区域以后再试\",\r\n    },\r\n    imageText: {\r\n        imageSetting: \"图片设置\",\r\n        close: \"关闭\",\r\n        conventional: \"常规\",\r\n        moveCell1: \"移动并调整单元格大小\",\r\n        moveCell2: \"移动并且不调整单元格的大小\",\r\n        moveCell3: \"不要移动单元格并调整其大小\",\r\n        fixedPos: \"固定位置\",\r\n        border: \"边框\",\r\n        width: \"宽度\",\r\n        radius: \"半径\",\r\n        style: \"样式\",\r\n        solid: \"实线\",\r\n        dashed: \"虚线\",\r\n        dotted: \"点状\",\r\n        double: \"双线\",\r\n        color: \"颜色\",\r\n    },\r\n    punctuation: {\r\n        tab: \"Tab 键\",\r\n        semicolon: \"分号\",\r\n        comma: \"逗号\",\r\n        space: \"空格\",\r\n    },\r\n    findAndReplace: {\r\n        find: \"查找\",\r\n        replace: \"替换\",\r\n        goto: \"转到\",\r\n        location: \"定位条件\",\r\n        formula: \"公式\",\r\n        date: \"日期\",\r\n        number: \"数字\",\r\n        string: \"字符\",\r\n        error: \"错误\",\r\n        condition: \"条件格式\",\r\n        rowSpan: \"间隔行\",\r\n        columnSpan: \"间隔列\",\r\n        locationExample: \"定位\",\r\n        lessTwoRowTip: \"请选择最少两行\",\r\n        lessTwoColumnTip: \"请选择最少两行\",\r\n\r\n        findTextbox: \"查找内容\",\r\n        replaceTextbox: \"替换内容\",\r\n\r\n        regexTextbox: \"正则表达式匹配\",\r\n        wholeTextbox: \"整词匹配\",\r\n        distinguishTextbox: \"区分大小写匹配\",\r\n\r\n        allReplaceBtn: \"全部替换\",\r\n        replaceBtn: \"替换\",\r\n        allFindBtn: \"查找全部\",\r\n        findBtn: \"查找下一个\",\r\n\r\n        noFindTip: \"没有查找到该内容\",\r\n        modeTip: \"该模式下不可进行此操作\",\r\n\r\n        searchTargetSheet: \"工作表\",\r\n        searchTargetCell: \"单元格\",\r\n        searchTargetValue: \"值\",\r\n\r\n        searchInputTip: \"请输入查找内容\",\r\n\r\n        noReplceTip: \"没有可替换的内容\",\r\n        noMatchTip: \"找不到匹配项\",\r\n\r\n        successTip: \"已经帮您搜索并进行了${xlength}处替换\",\r\n\r\n        locationConstant: \"常量\",\r\n        locationFormula: \"公式\",\r\n        locationDate: \"日期\",\r\n        locationDigital: \"数字\",\r\n        locationString: \"字符\",\r\n        locationBool: \"逻辑值\",\r\n        locationError: \"错误\",\r\n        locationNull: \"空值\",\r\n        locationCondition: \"条件格式\",\r\n        locationRowSpan: \"间隔行\",\r\n        locationColumnSpan: \"间隔列\",\r\n\r\n        locationTiplessTwoRow: \"请选择最少两行\",\r\n        locationTiplessTwoColumn: \"请选择最少两列\",\r\n        locationTipNotFindCell: \"未找到单元格\",\r\n    },\r\n    sheetconfig: {\r\n        delete: \"删除\",\r\n        copy: \"复制\",\r\n        rename: \"重命名\",\r\n        changeColor: \"更改颜色\",\r\n        hide: \"隐藏\",\r\n        unhide: \"取消隐藏\",\r\n        moveLeft: \"向左移\",\r\n        moveRight: \"向右移\",\r\n        resetColor: \"重置颜色\",\r\n        cancelText: \"取消\",\r\n        chooseText: \"确定颜色\",\r\n\r\n        tipNameRepeat: \"标签页的名称不能重复！请重新修改\",\r\n        noMoreSheet:\r\n            \"工作薄内至少含有一张可视工作表。若需删除选定的工作表，请先插入一张新工作表或显示一张隐藏的工作表。\",\r\n        confirmDelete: \"是否删除\",\r\n        redoDelete: \"可以通过Ctrl+Z撤销删除\",\r\n        noHide: \"不能隐藏, 至少保留一个sheet标签\",\r\n        chartEditNoOpt: \"图表编辑模式下不允许该操作！\",\r\n        sheetNameSpecCharError: \"名称不能超过31个字符，首尾不能是' 且名称不能包含:\\r\\n[ ] : \\\\ ? * /\",\r\n        sheetNamecannotIsEmptyError: \"名称不能为空!\",\r\n    },\r\n    conditionformat: {\r\n        conditionformat_greaterThan: \"条件格式——大于\",\r\n        conditionformat_greaterThan_title: \"为大于以下值的单元格设置格式\",\r\n        conditionformat_lessThan: \"条件格式——小于\",\r\n        conditionformat_lessThan_title: \"为小于以下值的单元格设置格式\",\r\n        conditionformat_betweenness: \"条件格式——介于\",\r\n        conditionformat_betweenness_title: \"为介于以下值的单元格设置格式\",\r\n        conditionformat_equal: \"条件格式——等于\",\r\n        conditionformat_equal_title: \"为等于以下值的单元格设置格式\",\r\n        conditionformat_textContains: \"条件格式——文本包含\",\r\n        conditionformat_textContains_title: \"为包含以下文本的单元格设置格式\",\r\n        conditionformat_occurrenceDate: \"条件格式——发生日期\",\r\n        conditionformat_occurrenceDate_title: \"为包含以下日期的单元格设置格式\",\r\n        conditionformat_duplicateValue: \"条件格式——重复值\",\r\n        conditionformat_duplicateValue_title: \"为包含以下类型值的单元格设置格式\",\r\n        conditionformat_top10: \"条件格式——前 10 项\",\r\n        conditionformat_top10_percent: \"条件格式——前 10%\",\r\n        conditionformat_top10_title: \"为值最大的那些单元格设置格式\",\r\n        conditionformat_last10: \"条件格式——最后 10 项\",\r\n        conditionformat_last10_percent: \"条件格式——最后 10%\",\r\n        conditionformat_last10_title: \"为值最小的那些单元格设置格式\",\r\n        conditionformat_AboveAverage: \"条件格式——高于平均值\",\r\n        conditionformat_AboveAverage_title: \"为高于平均值的单元格设置格式\",\r\n        conditionformat_SubAverage: \"条件格式——低于平均值\",\r\n        conditionformat_SubAverage_title: \"为低于平均值的单元格设置格式\",\r\n        rule: \"规则\",\r\n        newRule: \"新建规则\",\r\n        editRule: \"编辑规则\",\r\n        deleteRule: \"删除规则\",\r\n        deleteCellRule: \"清除所选单元格的规则\",\r\n        deleteSheetRule: \"清除整个工作表的规则\",\r\n        manageRules: \"管理规则\",\r\n        showRules: \"显示其格式规则\",\r\n        highlightCellRules: \"突出显示单元格规则\",\r\n        itemSelectionRules: \"项目选取规则\",\r\n        conditionformatManageRules: \"条件格式规则管理器\",\r\n        format: \"格式\",\r\n        setFormat: \"设置格式\",\r\n        setAs: \"设置为\",\r\n        setAsByArea: \"针对选定区域，设置为\",\r\n        applyRange: \"应用范围\",\r\n        selectRange: \"点击选择应用范围\",\r\n        selectRange_percent: \"所选范围的百分比\",\r\n        selectRange_average: \"选定范围的平均值\",\r\n        selectRange_value: \"选定范围中的数值\",\r\n        pleaseSelectRange: \"请选择应用范围\",\r\n        selectDataRange: \"点击选择数据范围\",\r\n        selectCell: \"选择单元格\",\r\n        pleaseSelectCell: \"请选择单元格\",\r\n        pleaseSelectADate: \"请选择日期\",\r\n        pleaseEnterInteger: \"请输入一个介于 1 和 1000 之间的整数\",\r\n        onlySingleCell: \"只能对单个单元格进行引用\",\r\n        conditionValueCanOnly: \"条件值只能是数字或者单个单元格\",\r\n        ruleTypeItem1: \"基于各自值设置所有单元格的格式\",\r\n        ruleTypeItem2: \"只为包含以下内容的单元格设置格式\",\r\n        ruleTypeItem2_title: \"只为满足以下条件的单元格\",\r\n        ruleTypeItem3: \"仅对排名靠前或靠后的数值设置格式\",\r\n        ruleTypeItem3_title: \"为以下排名内的值\",\r\n        ruleTypeItem4: \"仅对高于或低于平均值的数值设置格式\",\r\n        ruleTypeItem4_title: \"为满足以下条件的值\",\r\n        ruleTypeItem5: \"仅对唯一值或重复值设置格式\",\r\n        ruleTypeItem6: \"使用公式确定要设置格式的单元格\",\r\n        formula: \"公式\",\r\n        textColor: \"文本颜色\",\r\n        cellColor: \"单元格颜色\",\r\n        confirm: \"确定\",\r\n        confirmColor: \"确定颜色\",\r\n        cancel: \"取消\",\r\n        close: \"关闭\",\r\n        clearColorSelect: \"清除颜色选择\",\r\n        sheet: \"表\",\r\n        currentSheet: \"当前工作表\",\r\n        dataBar: \"数据条\",\r\n        dataBarColor: \"数据条颜色\",\r\n        gradientDataBar_1: \"蓝-白渐变数据条\",\r\n        gradientDataBar_2: \"绿-白渐变数据条\",\r\n        gradientDataBar_3: \"红-白渐变数据条\",\r\n        gradientDataBar_4: \"橙-白渐变数据条\",\r\n        gradientDataBar_5: \"浅蓝-白渐变数据条\",\r\n        gradientDataBar_6: \"紫-白渐变数据条\",\r\n        solidColorDataBar_1: \"蓝色数据条\",\r\n        solidColorDataBar_2: \"绿色数据条\",\r\n        solidColorDataBar_3: \"红色数据条\",\r\n        solidColorDataBar_4: \"橙色数据条\",\r\n        solidColorDataBar_5: \"浅蓝色数据条\",\r\n        solidColorDataBar_6: \"紫色数据条\",\r\n        colorGradation: \"色阶\",\r\n        colorGradation_1: \"绿-黄-红色阶\",\r\n        colorGradation_2: \"红-黄-绿色阶\",\r\n        colorGradation_3: \"绿-白-红色阶\",\r\n        colorGradation_4: \"红-白-绿色阶\",\r\n        colorGradation_5: \"蓝-白-红色阶\",\r\n        colorGradation_6: \"红-白-蓝色阶\",\r\n        colorGradation_7: \"白-红色阶\",\r\n        colorGradation_8: \"红-白色阶\",\r\n        colorGradation_9: \"绿-白色阶\",\r\n        colorGradation_10: \"白-绿色阶\",\r\n        colorGradation_11: \"绿-黄色阶\",\r\n        colorGradation_12: \"黄-绿色阶\",\r\n        icons: \"图标集\",\r\n        pleaseSelectIcon: \"请点击选择一组图标：\",\r\n        cellValue: \"单元格值\",\r\n        specificText: \"特定文本\",\r\n        occurrence: \"发生日期\",\r\n        greaterThan: \"大于\",\r\n        lessThan: \"小于\",\r\n        between: \"介于\",\r\n        equal: \"等于\",\r\n        in: \"和\",\r\n        to: \"到\",\r\n        between2: \"之间\",\r\n        contain: \"包含\",\r\n        textContains: \"文本包含\",\r\n        duplicateValue: \"重复值\",\r\n        uniqueValue: \"唯一值\",\r\n        top: \"前\",\r\n        top10: \"前 10 项\",\r\n        top10_percent: \"前 10%\",\r\n        last: \"后\",\r\n        last10: \"后 10 项\",\r\n        last10_percent: \"后 10%\",\r\n        oneself: \"个\",\r\n        above: \"高于\",\r\n        aboveAverage: \"高于平均值\",\r\n        below: \"低于\",\r\n        belowAverage: \"低于平均值\",\r\n        all: \"全部\",\r\n        yesterday: \"昨天\",\r\n        today: \"今天\",\r\n        tomorrow: \"明天\",\r\n        lastWeek: \"上周\",\r\n        thisWeek: \"本周\",\r\n        lastMonth: \"上月\",\r\n        thisMonth: \"本月\",\r\n        lastYear: \"去年\",\r\n        thisYear: \"本年\",\r\n        last7days: \"最近7天\",\r\n        last30days: \"最近30天\",\r\n        next7days: \"未来7天\",\r\n        next30days: \"未来30天\",\r\n        next60days: \"未来60天\",\r\n        chooseRuleType: \"选择规则类型\",\r\n        editRuleDescription: \"编辑规则说明\",\r\n        newFormatRule: \"新建格式规则\",\r\n        editFormatRule: \"编辑格式规则\",\r\n        formatStyle: \"格式样式\",\r\n        fillType: \"填充类型\",\r\n        color: \"颜色\",\r\n        twocolor: \"双色\",\r\n        tricolor: \"三色\",\r\n        multicolor: \"彩色\",\r\n        grayColor: \"灰色\",\r\n        gradient: \"渐变\",\r\n        solid: \"实心\",\r\n        maxValue: \"最大值\",\r\n        medianValue: \"中间值\",\r\n        minValue: \"最小值\",\r\n        direction: \"方向\",\r\n        threeWayArrow: \"三向箭头\",\r\n        fourWayArrow: \"四向箭头\",\r\n        fiveWayArrow: \"五向箭头\",\r\n        threeTriangles: \"3个三角形\",\r\n        shape: \"形状\",\r\n        threeColorTrafficLight: \"三色交通灯\",\r\n        fourColorTrafficLight: \"四色交通灯\",\r\n        threeSigns: \"三标志\",\r\n        greenRedBlackGradient: \"绿-红-黑渐变\",\r\n        rimless: \"无边框\",\r\n        bordered: \"有边框\",\r\n        mark: \"标记\",\r\n        threeSymbols: \"三个符号\",\r\n        tricolorFlag: \"三色旗\",\r\n        circled: \"有圆圈\",\r\n        noCircle: \"无圆圈\",\r\n        grade: \"等级\",\r\n        grade4: \"四等级\",\r\n        grade5: \"五等级\",\r\n        threeStars: \"3个星形\",\r\n        fiveQuadrantDiagram: \"五象限图\",\r\n        fiveBoxes: \"5个框\",\r\n    },\r\n    insertLink: {\r\n        linkText: \"文本\",\r\n        linkType: \"链接类型\",\r\n        external: \"外部链接\",\r\n        internal: \"内部链接\",\r\n        linkAddress: \"链接地址\",\r\n        linkSheet: \"工作表\",\r\n        linkCell: \"单元格引用\",\r\n        linkTooltip: \"提示\",\r\n        placeholder1: \"请输入网页链接地址\",\r\n        placeholder2: \"请输入要引用的单元格，例A1\",\r\n        placeholder3: \"请输入提示内容\",\r\n        tooltipInfo1: \"请输入有效的链接\",\r\n        tooltipInfo2: \"请输入正确的单元格引用\",\r\n    },\r\n    dataVerification: {\r\n        cellRange: \"单元格范围\",\r\n        selectCellRange: \"点击选择单元格范围\",\r\n        selectCellRange2: \"请选择单元格范围\",\r\n        verificationCondition: \"验证条件\",\r\n        allowMultiSelect: \"是否允许多选\",\r\n        dropdown: \"下拉列表\",\r\n        checkbox: \"复选框\",\r\n        number: \"数字\",\r\n        number_integer: \"数字-整数\",\r\n        number_decimal: \"数字-小数\",\r\n        text_content: \"文本-内容\",\r\n        text_length: \"文本-长度\",\r\n        date: \"日期\",\r\n        validity: \"有效性\",\r\n        placeholder1: \"请输入选项，以英文逗号分隔，如1,2,3,4,5\",\r\n        placeholder2: \"请输入内容\",\r\n        placeholder3: \"数值，如10\",\r\n        placeholder4: \"请输入指定的文本\",\r\n        placeholder5: \"请输入选中单元格时显示的提示语\",\r\n        selected: \"选择时\",\r\n        notSelected: \"未选择\",\r\n        between: \"介于\",\r\n        notBetween: \"不介于\",\r\n        equal: \"等于\",\r\n        notEqualTo: \"不等于\",\r\n        moreThanThe: \"大于\",\r\n        lessThan: \"小于\",\r\n        greaterOrEqualTo: \"大于等于\",\r\n        lessThanOrEqualTo: \"小于等于\",\r\n        include: \"包括\",\r\n        exclude: \"不包括\",\r\n        earlierThan: \"早于\",\r\n        noEarlierThan: \"不早于\",\r\n        laterThan: \"晚于\",\r\n        noLaterThan: \"不晚于\",\r\n        identificationNumber: \"身份证号码\",\r\n        phoneNumber: \"手机号\",\r\n        remote: \"自动远程获取选项\",\r\n        prohibitInput: \"输入数据无效时禁止输入\",\r\n        hintShow: \"选中单元格时显示提示语\",\r\n        deleteVerification: \"删除验证\",\r\n        tooltipInfo1: \"下拉列表选项不可为空\",\r\n        tooltipInfo2: \"复选框内容不可为空\",\r\n        tooltipInfo3: \"输入的值不是数值类型\",\r\n        tooltipInfo4: \"数值2不能小于数值1\",\r\n        tooltipInfo5: \"文本内容不能为空\",\r\n        tooltipInfo6: \"输入的值不是日期类型\",\r\n        tooltipInfo7: \"日期2不能小于日期1\",\r\n        textlengthInteger: \"文本长度必须是大于等于0的整数\",\r\n    },\r\n    formula: {\r\n        sum: \"求和\",\r\n        average: \"平均值\",\r\n        count: \"计数\",\r\n        max: \"最大值\",\r\n        min: \"最小值\",\r\n        ifGenerate: \"if公式生成器\",\r\n        find: \"更多函数\",\r\n\r\n        tipNotBelongToIf: \"该单元格函数不属于if公式！\",\r\n        tipSelectCell: \"请选择单元格插入函数\",\r\n\r\n        ifGenCompareValueTitle: \"比较值\",\r\n        ifGenSelectCellTitle: \"点击选择单元格\",\r\n        ifGenRangeTitle: \"范围\",\r\n        ifGenRangeTo: \"至\",\r\n        ifGenRangeEvaluate: \"范围评估\",\r\n        ifGenSelectRangeTitle: \"点击选择范围\",\r\n        ifGenCutWay: \"划分方式\",\r\n        ifGenCutSame: \"划分值相同\",\r\n        ifGenCutNpiece: \"划分为N份\",\r\n        ifGenCutCustom: \"自定义输入\",\r\n        ifGenCutConfirm: \"生成\",\r\n\r\n        ifGenTipSelectCell: \"选择单元格\",\r\n        ifGenTipSelectCellPlace: \"请选择单元格\",\r\n\r\n        ifGenTipSelectRange: \"选择单范围\",\r\n        ifGenTipSelectRangePlace: \"请选择范围\",\r\n\r\n        ifGenTipNotNullValue: \"比较值不能为空！\",\r\n        ifGenTipLableTitile: \"标签\",\r\n        ifGenTipRangeNotforNull: \"范围不能为空！\",\r\n        ifGenTipCutValueNotforNull: \"划分值不能为空！\",\r\n        ifGenTipNotGenCondition: \"没有生成可用的条件！\",\r\n    },\r\n    formulaMore: {\r\n        valueTitle: \"值\",\r\n        tipSelectDataRange: \"选取数据范围\",\r\n        tipDataRangeTile: \"数据范围\",\r\n        findFunctionTitle: \"查找函数\",\r\n        tipInputFunctionName: \"请输入您要查找的函数名称或函数功能的简要描述\",\r\n\r\n        Array: \"数组\",\r\n        Database: \"数据源\",\r\n        Date: \"日期\",\r\n        Engineering: \"工程计算\",\r\n        Filter: \"过滤器\",\r\n        Financial: \"财务\",\r\n        luckysheet: \"Luckysheet内置\",\r\n        other: \"其它\",\r\n        Logical: \"逻辑\",\r\n        Lookup: \"查找\",\r\n        Math: \"数学\",\r\n        Operator: \"运算符\",\r\n        Parser: \"转换工具\",\r\n        Statistical: \"统计\",\r\n        Text: \"文本\",\r\n        dataMining: \"数据挖掘\",\r\n\r\n        selectFunctionTitle: \"选择函数\",\r\n        calculationResult: \"计算结果\",\r\n\r\n        tipSuccessText: \"成功\",\r\n        tipParamErrorText: \"参数类型错误\",\r\n\r\n        helpClose: \"关闭\",\r\n        helpCollapse: \"收起\",\r\n        helpExample: \"示例\",\r\n        helpAbstract: \"摘要\",\r\n\r\n        execfunctionError: '提示\", \"公式存在错误',\r\n        execfunctionSelfError: \"公式不可引用其本身的单元格\",\r\n        execfunctionSelfErrorResult: \"公式不可引用其本身的单元格，会导致计算结果不准确\",\r\n\r\n        allowRepeatText: \"可重复\",\r\n        allowOptionText: \"可选\",\r\n\r\n        selectCategory: \"或选择类别\",\r\n    },\r\n    drag: {\r\n        noMerge: \"无法对合并单元格执行此操作\",\r\n        affectPivot: \"无法对所选单元格进行此更改，因为它会影响数据透视表！\",\r\n        noMulti: \"无法对多重选择区域执行此操作,请选择单个区域\",\r\n        noPaste: \"无法在此处粘贴此内容，请选择粘贴区域的一个单元格，然后再次尝试粘贴\",\r\n        noPartMerge: \"无法对部分合并单元格执行此操作\",\r\n\r\n        inputCorrect: \"请输入正确的数值\",\r\n        notLessOne: \"行列数不能小于1\",\r\n        offsetColumnLessZero: \"偏移列不能为负数！\",\r\n\r\n        pasteMustKeybordAlert: \"Copy and paste in the Sheet: Ctrl + C to copy, Ctrl + V to paste, Ctrl + X to cut\",\r\n        pasteMustKeybordAlertHTMLTitle: \"Copy and paste in the Sheet\",\r\n        pasteMustKeybordAlertHTML:\r\n            \"<span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + C</span>&nbsp;&nbsp;to copy<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + V</span>&nbsp;&nbsp;to paste<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + X</span>&nbsp;&nbsp;to cut\",\r\n    },\r\n    paste: {\r\n        warning: \"提示\",\r\n        errorNotAllowMulti: \"不能对多重选择区域执行此操作，请选择单个区域，然后再试\",\r\n        errorNotAllowMerged: \"不能对合并单元格做部分更改\",\r\n    },\r\n    pivotTable: {\r\n        title: \"数据透视表\",\r\n        closePannel: \"关闭\",\r\n        editRange: \"编辑范围\",\r\n        tipPivotFieldSelected: \"选择需要添加到数据透视表的字段\",\r\n        tipClearSelectedField: \"清除所有已选字段\",\r\n        btnClearSelectedField: \"清除\",\r\n        btnFilter: \"筛选\",\r\n        titleRow: \"行\",\r\n        titleColumn: \"列\",\r\n        titleValue: \"数值\",\r\n        tipShowColumn: \"统计字段显示为列\",\r\n        tipShowRow: \"统计字段显示为行\",\r\n\r\n        titleSelectionDataRange: \"选取数据范围\",\r\n        titleDataRange: \"数据范围\",\r\n\r\n        valueSum: \"总计\",\r\n\r\n        valueStatisticsSUM: \"求和\",\r\n        valueStatisticsCOUNT: \"数值计数\",\r\n        valueStatisticsCOUNTA: \"计数\",\r\n        valueStatisticsCOUNTUNIQUE: \"去重计数\",\r\n        valueStatisticsAVERAGE: \"平均值\",\r\n        valueStatisticsMAX: \"最大值\",\r\n        valueStatisticsMIN: \"最小值\",\r\n        valueStatisticsMEDIAN: \"中位数\",\r\n        valueStatisticsPRODUCT: \"乘积\",\r\n        valueStatisticsSTDEV: \"标准差\",\r\n\r\n        valueStatisticsSTDEVP: \"整体标准差\",\r\n        valueStatisticslet: \"方差\",\r\n        valueStatisticsVARP: \"整体方差\",\r\n\r\n        errorNotAllowEdit: \"非编辑模式下禁止该操作！\",\r\n        errorNotAllowMulti: \"不能对多重选择区域执行此操作，请选择单个区域，然后再试\",\r\n        errorSelectRange: \"请选择新建透视表的区域\",\r\n        errorIsDamage: \"此数据透视表的源数据已损坏！\",\r\n        errorNotAllowPivotData: \"不可选择数据透视表为源数据！\",\r\n        errorSelectionRange: \"选择失败, 输入范围错误！\",\r\n        errorIncreaseRange: \"请扩大选择的数据范围!\",\r\n\r\n        titleAddColumn: \"添加列到数据透视表\",\r\n        titleMoveColumn: \"移动该列到下方白框\",\r\n        titleClearColumnFilter: \"清除该列的筛选条件\",\r\n        titleFilterColumn: \"筛选该列\",\r\n\r\n        titleSort: \"排序\",\r\n        titleNoSort: \"无排序\",\r\n        titleSortAsc: \"升序\",\r\n        titleSortDesc: \"降序\",\r\n        titleSortBy: \"排序依据\",\r\n        titleShowSum: \"显示总计\",\r\n        titleStasticTrue: \"是\",\r\n        titleStasticFalse: \"否\",\r\n    },\r\n    dropCell: {\r\n        copyCell: \"复制单元格\",\r\n        sequence: \"填充序列\",\r\n        onlyFormat: \"仅填充格式\",\r\n        noFormat: \"不带格式填充\",\r\n        day: \"以天数填充\",\r\n        workDay: \"以工作日填充\",\r\n        month: \"以月填充\",\r\n        year: \"以年填充\",\r\n        chineseNumber: \"以中文小写数字填充\",\r\n    },\r\n    imageCtrl: {\r\n        borderTile: \"图片边框颜色选择\",\r\n        borderCur: \"当前颜色\",\r\n    },\r\n    protection: {\r\n        protectiontTitle: \"保护工作表\",\r\n        enterPassword: \"请输入密码（可留空）\",\r\n        enterHint: \"您试图更改的单元格或图表位于受保护的工作表中。若要更改，请取消工作表保护。您可能需要输入密码\",\r\n        swichProtectionTip: \"保护工作表及锁定的单元格内容\",\r\n        authorityTitle: \"允许此工作表的用户进行:\",\r\n        selectLockedCells: \"选定锁定单元格\",\r\n        selectunLockedCells: \"选定解除锁定的单元格\",\r\n        formatCells: \"设置单元格格式\",\r\n        formatColumns: \"设置列格式\",\r\n        formatRows: \"设置行格式\",\r\n        insertColumns: \"插入列\",\r\n        insertRows: \"插入行\",\r\n        insertHyperlinks: \"插入超链接\",\r\n        deleteColumns: \"删除列\",\r\n        deleteRows: \"删除行\",\r\n        sort: \"排序\",\r\n        filter: \"使用自动筛选\",\r\n        usePivotTablereports: \"使用数据透视表和报表\",\r\n        editObjects: \"编辑对象\",\r\n        editScenarios: \"编辑方案\",\r\n\r\n        allowRangeTitle: \"允许用户编辑区域\",\r\n        allowRangeAdd: \"新建...\",\r\n\r\n        allowRangeAddTitle: \"标题\",\r\n        allowRangeAddSqrf: \"引用单元格\",\r\n        selectCellRange: \"点击选择单元格范围\",\r\n        selectCellRangeHolder: \"请输入单元格范围\",\r\n        allowRangeAddTitlePassword: \"密码\",\r\n        allowRangeAddTitleHint: \"提示\",\r\n        allowRangeAddTitleHintTitle: \"设置密码后，提示用户输入密码(可留空)\",\r\n        allowRangeAddtitleDefault: \"请输入区域名称\",\r\n\r\n        rangeItemDblclick: \"双击进行编辑\",\r\n        rangeItemHasPassword: \"已设置密码\",\r\n\r\n        rangeItemErrorTitleNull: \"标题不能为空\",\r\n        rangeItemErrorRangeNull: \"单元格范围不能为空\",\r\n        rangeItemErrorRange: \"单元格范围格式错误\",\r\n\r\n        validationTitle: \"验证提示\",\r\n        validationTips: \"需要输入密码来撤销工作表的保护\",\r\n        validationInputHint: \"请输入密码\",\r\n\r\n        checkPasswordNullalert: \"密码不能为空！\",\r\n        checkPasswordWrongalert: \"密码错误，请重试！\",\r\n\r\n        checkPasswordSucceedalert: \"解锁成功，可以编辑该区域!\",\r\n        defaultRangeHintText: \"该单元格正在受密码保护。\",\r\n        defaultSheetHintText:\r\n            \"该单元格或图表位于受保护的工作表中，若要进行更改，请取消工作表保护，您可能需要输入密码。\",\r\n    },\r\n    cellFormat: {\r\n        cellFormatTitle: \"设置单元格格式\",\r\n        protection: \"保护\",\r\n        locked: \"锁定单元格\",\r\n        hidden: \"隐藏公式\",\r\n        protectionTips: \"只有保护工作表功能(在菜单栏点击保护工作表按钮进行设置)开启后，锁定单元格或隐藏公式才能生效\",\r\n        tipsPart: \"部分选中\",\r\n        tipsAll: \"全部选中\",\r\n        selectionIsNullAlert: \"请选择一个范围！\",\r\n        sheetDataIsNullAlert: \"数据为空无法设置！\",\r\n    },\r\n    print: {\r\n        normalBtn: \"常规视图\",\r\n        layoutBtn: \"页面布局\",\r\n        pageBtn: \"分页预览\",\r\n\r\n        menuItemPrint: \"打印(Ctrl+P)\",\r\n        menuItemAreas: \"打印区域\",\r\n        menuItemRows: \"打印标题行\",\r\n        menuItemColumns: \"打印标题列\",\r\n        suggest: \"对打印功能有什么建议？\",\r\n        range: \"打印范围\",\r\n        size: \"纸张大小\",\r\n        direction: \"打印方向\",\r\n        horizontal: \"横向\",\r\n        vertical: \"纵向\",\r\n        title: \"打印设置\",\r\n        current: \"当前工作表\",\r\n        area: \"选中区域\",\r\n        letter: \"信封\",\r\n        paper: \"小报用纸\",\r\n        law: \"法定用纸\",\r\n        admin: \"行政用纸\",\r\n        expire: \"已过期\",\r\n        remain: \"剩余天数\",\r\n        error: \"错误\",\r\n        showLine: \"显示网格线\",\r\n        show: \"显示\",\r\n        hide: \"隐藏\",\r\n        preview: \"预览\",\r\n    },\r\n    edit: {\r\n        typing: \"正在输入\",\r\n    },\r\n    websocket: {\r\n        success: \"WebSocket连接成功\",\r\n        refresh: \"WebSocket连接发生错误, 请刷新页面！\",\r\n        wait: \"WebSocket连接发生错误, 请耐心等待！\",\r\n        close: \"WebSocket连接关闭\",\r\n        contact: \"服务器通信发生错误，请刷新页面后再试，如若不行请联系管理员！\",\r\n        support: \"当前浏览器不支持WebSocket\",\r\n    },\r\n    exportXlsx: {\r\n        notice: \"请配置导出插件\",\r\n        serverError: \"服务器正在维护\",\r\n        title: \"导出XLSX\",\r\n        range: \"范围\",\r\n        currentSheet: \"当前工作表\",\r\n        allSheets: \"所有工作表\",\r\n    },\r\n};\r\n"
  },
  {
    "path": "src/locale/zh_tw.js",
    "content": "export default {\r\n    functionlist: {\r\n        \"SUMIF\": {\r\n            \"d\": \"對範圍中符合指定條件的值求和。\",\r\n            \"a\": \"對範圍中符合指定條件的值求和。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"範圍\",\r\n                    \"detail\": \"要根據條件進行檢測的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"條件\",\r\n                    \"detail\": \"要應用於範圍的模式或測試條件。\\n\\n如果範圍包含的是要檢測的文字,則條件必須為字串。條件可以包含萬用字元,包括用於匹配單個字元的？或用於匹配零個或連續多個字元的*。要匹配問號星號本身,請在該字元前面加上波浪號（~）首碼（即~？和~*）。字串條件必須用引號括起來。函數會檢查範圍中的每個儲存格與條件是否相等或匹配（如果使用了萬用字元）。\\n\\n如果範圍包含的是要檢測的數位,則條件可以是字串也可以是數位。如果給定的條件是一個數位,則檢查範圍中的每個儲存格是否等於條件。另外,條件也可能是包含數位的字串（也將對其進行相等檢測）,或者帶有以下首碼的數位:=（檢查是否相等）、>（檢查範圍儲存格的值是否大於條件值）或<（檢查範圍儲存格的值是否小於條件值）\"\r\n                },\r\n                {\r\n                    \"name\": \"求和範圍\",\r\n                    \"detail\": \"要求和的範圍（如果與範圍不同）。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TAN\": {\r\n            \"d\": \"返回已知角度的正切值。\",\r\n            \"a\": \"返回已知角度的正切值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"角度\",\r\n                    \"detail\": \"要求其正切值的角度,以弧度表示。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TANH\": {\r\n            \"d\": \"返回給定實數的雙曲正切值。\",\r\n            \"a\": \"返回給定實數的雙曲正切值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要計算其雙曲正切值的實數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CEILING\": {\r\n            \"d\": \"將數值向上取整為最接近的指定因數的倍數。\",\r\n            \"a\": \"將數值向上取整為最接近的指定因數的倍數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要向上舍入的數值。\"\r\n                },\r\n                {\r\n                    \"name\": \"因數\",\r\n                    \"detail\": \"要將值舍入到此數的整數倍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ATAN\": {\r\n            \"d\": \"返回數值的反正切值,以弧度表示。\",\r\n            \"a\": \"返回數值的反正切值\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要計算其反正切值的數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ASINH\": {\r\n            \"d\": \"返回數值的反雙曲正弦值。\",\r\n            \"a\": \"返回數值的反雙曲正弦值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要計算其反雙曲正弦值的數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ABS\": {\r\n            \"d\": \"返回數值的絕對值。\",\r\n            \"a\": \"返回數值的絕對值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要返回其絕對值的數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ACOS\": {\r\n            \"d\": \"返回數值的反余弦值,以弧度表示。\",\r\n            \"a\": \"返回數值的反余弦值\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要計算其反余弦值的數值。必須介於-1和1之間,包括兩端值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ACOSH\": {\r\n            \"d\": \"返回數值的反雙曲余弦值。\",\r\n            \"a\": \"返回數值的反雙曲余弦值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要計算其反雙曲余弦值的數值。必須大於等於1。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MULTINOMIAL\": {\r\n            \"d\": \"返回參數和的階乘除以各參數階乘的乘積後得到的值。\",\r\n            \"a\": \"返回參數和的階乘除以各參數階乘的乘積後得到的值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"用於計算的第一項數值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2\",\r\n                    \"detail\": \"用於計算的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ATANH\": {\r\n            \"d\": \"返回數值的反雙曲正切值。\",\r\n            \"a\": \"返回數值的反雙曲正切值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要計算其反雙曲正切值的數值。必須介於-1和1之間（不包括-1和1）。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ATAN2\": {\r\n            \"d\": \"以弧度為組織返回x軸與從原點（0,0）到指定座標點（`x`,`y`）之間連線的夾角。\",\r\n            \"a\": \"以弧度為組織返回x軸與從原點（0,0）到指定座標點（`x`,`y`）之間連線的夾角。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"要計算其與x軸夾角大小的線段的終點x座標。\"\r\n                },\r\n                {\r\n                    \"name\": \"y\",\r\n                    \"detail\": \"要計算其與x軸夾角大小的線段的終點y座標。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUNTBLANK\": {\r\n            \"d\": \"返回給定範圍內的空儲存格數。\",\r\n            \"a\": \"返回給定範圍內的空儲存格數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"範圍\",\r\n                    \"detail\": \"要統計空白儲存格數量的範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COSH\": {\r\n            \"d\": \"返回給定實數的雙曲余弦值。\",\r\n            \"a\": \"返回給定實數的雙曲余弦值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要計算其雙曲余弦值的實數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"INT\": {\r\n            \"d\": \"數值向下取整為小於或等於該數的最接近的整數。\",\r\n            \"a\": \"數值向下取整為小於或等於該數的最接近的整數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要向下取整為最接近的整數的數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISEVEN\": {\r\n            \"d\": \"檢查所提供的數值是否為偶數。\",\r\n            \"a\": \"檢查所提供的數值是否為偶數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要驗證其是否為偶數的數值。\\n\\n如果值為偶數或指向包含偶數的儲存格的引用,ISEVEN將返回TRUE,否則返回FALSE。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISODD\": {\r\n            \"d\": \"檢查所提供的數值是否為奇數。\",\r\n            \"a\": \"檢查所提供的數值是否為奇數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要驗證其是否為奇數的數值。\\n\\n如果值為奇數或指向包含奇數的儲存格,ISODD將返回TRUE,否則返回FALSE。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LCM\": {\r\n            \"d\": \"返回一個或多個整數的最小公倍數。\",\r\n            \"a\": \"返回一個或多個整數的最小公倍數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"要在求最小公倍數數的計算中檢查其因數的第一項數值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2\",\r\n                    \"detail\": \"[可選] - 在求最小公倍數時要考慮其因數的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LN\": {\r\n            \"d\": \"返回數值以e（歐拉數）為底的對數。\",\r\n            \"a\": \"返回數值以e（歐拉數）為底的對數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要以e為底數計算其對數的值。\\n\\n值必須為正數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOG\": {\r\n            \"d\": \"根據指定底數返回數位的對數。\",\r\n            \"a\": \"根據指定底數返回數位的對數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"想要計算其對數的正實數。\"\r\n                },\r\n                {\r\n                    \"name\": \"底數\",\r\n                    \"detail\": \"[可選] - 對數的底數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOG10\": {\r\n            \"d\": \"返回數值以10為底的對數。\",\r\n            \"a\": \"返回數值以10為底的對數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要計算其以10為底的對數的數值。\\n\\n值必須為正值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MOD\": {\r\n            \"d\": \"返回兩數相除的餘數,結果的符號與除數相同。\",\r\n            \"a\": \"返回兩數相除的餘數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"被除數\",\r\n                    \"detail\": \"要將其相除以得到餘數的數值。\"\r\n                },\r\n                {\r\n                    \"name\": \"除數\",\r\n                    \"detail\": \"用於除其他數的數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MROUND\": {\r\n            \"d\": \"將數值取整為另一整數最接近的整數倍。\",\r\n            \"a\": \"將數值取整為另一整數最接近的整數倍。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要取整為另一整數最接近的整數倍的數值。\"\r\n                },\r\n                {\r\n                    \"name\": \"因數\",\r\n                    \"detail\": \"值將取此因數的整數倍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ODD\": {\r\n            \"d\": \"將數值向上取整為最接近的奇整數。\",\r\n            \"a\": \"將數值向上取整為最接近的奇整數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要向上取整的數值,取整值為大於此值的最接近的奇數。\\n\\n如果值為負數,則將其取整為絕對值大於該值的相鄰負奇數\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUMSQ\": {\r\n            \"d\": \"返回一組數值和/或儲存格的平方總和。\",\r\n            \"a\": \"返回一組數值和/或儲存格的平方總和。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"要將其平方相加的第一個數值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 要將其平方與值1的平方相加的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COMBIN\": {\r\n            \"d\": \"給定集合中的對象總數和要選擇的對象數量,返回共有多少種不同選擇管道。\",\r\n            \"a\": \"給定集合中的對象總數和要選擇的對象數量\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"n\",\r\n                    \"detail\": \"要從中進行選擇的對象集合的大小。\"\r\n                },\r\n                {\r\n                    \"name\": \"k\",\r\n                    \"detail\": \"要選擇的對象數量。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUM\": {\r\n            \"d\": \"返回一組數值和/或儲存格的總和。\",\r\n            \"a\": \"返回一組數值和/或儲存格的總和。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"要相加的第一個數值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2\",\r\n                    \"detail\": \"[可選] - 要相加的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUBTOTAL\": {\r\n            \"d\": \"使用指定的匯總函數,返回一系列縱向儲存格的分類匯總。\",\r\n            \"a\": \"使用指定的匯總函數\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"函數程式碼\",\r\n                    \"detail\": \"用於計算分類匯總的函數。\\n\\n1代表AVERAGE\\n\\n2代表COUNT\\n\\n3代表COUNTA\\n\\n4代表MAX\\n\\n5代表MIN\\n\\n6代表PRODUCT\\n\\n7代表STDEV\\n\\n8代表STDEVP\\n\\n9代表SUM\\n\\n10代表VAR\\n\\n11代表VARP\\n\\n通過在這些2位程式碼前附加10（對於1位程式碼）或1（對於2位程式碼）,可以將隱藏值忽略。例如,102代表忽略隱藏儲存格的COUNT,而110則代表忽略隱藏值的VAR。\"\r\n                },\r\n                {\r\n                    \"name\": \"範圍1\",\r\n                    \"detail\": \"要計算分類匯總的第一個範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"範圍2\",\r\n                    \"detail\": \"[可選] - 要計算分類匯總的其他範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ASIN\": {\r\n            \"d\": \"返回數值的反正弦值,以弧度表示。\",\r\n            \"a\": \"返回數值的反正弦值\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要計算其反正弦值的數值。必須介於-1和1之間,包括兩端值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUNTIF\": {\r\n            \"d\": \"返回範圍內滿足某個條件的儲存格的數量。\",\r\n            \"a\": \"返回範圍內滿足某個條件的儲存格的數量。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"範圍\",\r\n                    \"detail\": \"要根據條件進行檢測的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"條件\",\r\n                    \"detail\": \"要應用於範圍的模式或測試條件。\\n\\n如果範圍包含的是要檢測的文字,則條件必須為字串。條件可以包含萬用字元,包括用於匹配單個字元的？或用於匹配零個或連續多個字元的*。要匹配問號星號本身,請在該字元前面加上波浪號（~）首碼（即~？和~*）。字串條件必須用引號括起來。函數會檢查範圍中的每個儲存格與條件是否相等或匹配（如果使用了萬用字元）。\\n\\n如果範圍包含的是要檢測的數位,則條件可以是字串也可以是數位。如果給定的條件是一個數位,則檢查範圍中的每個儲存格是否等於條件。另外,條件也可能是包含數位的字串（也將對其進行相等檢測）,或者帶有以下首碼的數位:=、>、>=、<或<=,這些條件將分別用於檢查範圍中的儲存格是否等於、大於、大於等於、小於、小於等於條件值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"RADIANS\": {\r\n            \"d\": \"將以度表示的角度值轉換為弧度。\",\r\n            \"a\": \"將以度表示的角度值轉換為弧度。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"角度\",\r\n                    \"detail\": \"要從度轉換為弧度的角度。\"\r\n                }\r\n            ]\r\n        },\r\n        \"RAND\": {\r\n            \"d\": \"返回一個介於0和1之間（包括0但不包括1）的亂數。\",\r\n            \"a\": \"返回一個介於0和1之間（包括0但不包括1）的亂數。\",\r\n            \"p\": []\r\n        },\r\n        \"COUNTUNIQUE\": {\r\n            \"d\": \"計算一列指定值和範圍中不重複數值的個數。\",\r\n            \"a\": \"計算一列指定值和範圍中不重複數值的個數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"要檢查其是否唯一的第一個值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2\",\r\n                    \"detail\": \"[可選] - 要檢查是否唯一的其他值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DEGREES\": {\r\n            \"d\": \"將以弧度表示的角度值轉換為度。\",\r\n            \"a\": \"將以弧度表示的角度值轉換為度。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"角度\",\r\n                    \"detail\": \"要從弧度轉換為度的角度。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ERFC\": {\r\n            \"d\": \"返回數值的互補高斯誤差函數。\",\r\n            \"a\": \"返回數值的互補高斯誤差函數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"z\",\r\n                    \"detail\": \"要為其計算互補高斯誤差函數的數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"EVEN\": {\r\n            \"d\": \"將數值向上取整為最接近的偶整數。\",\r\n            \"a\": \"將數值向上取整為最接近的偶整數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要向上取整的數值,取整值為大於此值的最接近的偶數。\\n\\n如果值為負數,則將其取整為絕對值大於該值的相鄰負偶數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"EXP\": {\r\n            \"d\": \"返回歐拉數e（~2.718）的指定次幂。\",\r\n            \"a\": \"返回歐拉數e（~2.718）的指定次幂。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"指數\",\r\n                    \"detail\": \"指定e的自乘幂次值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"FACT\": {\r\n            \"d\": \"返回數值的階乘。\",\r\n            \"a\": \"返回數值的階乘。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要計算並返回其階乘的數位或對數位（所在儲存格）的引用。\"\r\n                }\r\n            ]\r\n        },\r\n        \"FACTDOUBLE\": {\r\n            \"d\": \"返回數值的\\\"雙階乘\\\"。\",\r\n            \"a\": \"返回數值的\\\"雙階乘\\\"。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要計算並返回其雙階乘的數位或對數位（所在儲存格）的引用。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PI\": {\r\n            \"d\": \"返回帶有14位小數的PI值。\",\r\n            \"a\": \"返回帶有14位小數的PI值。\",\r\n            \"p\": []\r\n        },\r\n        \"FLOOR\": {\r\n            \"d\": \"將數值向下取整為指定因數的最接近的整數倍。\",\r\n            \"a\": \"將數值向下取整為指定因數的最接近的整數倍。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要向下舍入為因數的最接近整數倍的數值。\"\r\n                },\r\n                {\r\n                    \"name\": \"因數\",\r\n                    \"detail\": \"要將值舍入到此數的整數倍。\\n\\n因數不得為0。\"\r\n                }\r\n            ]\r\n        },\r\n        \"GCD\": {\r\n            \"d\": \"返回一個或多個整數的最大公約數。\",\r\n            \"a\": \"返回一個或多個整數的最大公約數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"要在查找最大公約數的計算中檢查其因數的第一項數值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2\",\r\n                    \"detail\": \"[可選] - 在求最大公約數時要考慮其因數的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"RANDBETWEEN\": {\r\n            \"d\": \"返回介於兩個整數之間（包括這兩個整數）的亂數。\",\r\n            \"a\": \"返回介於兩個整數之間（包括這兩個整數）的亂數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"下界\",\r\n                    \"detail\": \"隨機值範圍的下界。\"\r\n                },\r\n                {\r\n                    \"name\": \"上界\",\r\n                    \"detail\": \"隨機值範圍的上界。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ROUND\": {\r\n            \"d\": \"將數位四捨五入到指定的位數。\",\r\n            \"a\": \"將數位四捨五入到指定的位數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要四捨五入的數位。\"\r\n                },\r\n                {\r\n                    \"name\": \"位數\",\r\n                    \"detail\": \"要進行四捨五入運算的位數。\\n\\n位數可以取負值,在這種情況下會將值的小數點左側部分舍入到指定的位數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ROUNDDOWN\": {\r\n            \"d\": \"朝著零的方向將數位進行向下舍入。\",\r\n            \"a\": \"朝著零的方向將數位進行向下舍入。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"需要向下舍入的任意實數。\"\r\n                },\r\n                {\r\n                    \"name\": \"位數\",\r\n                    \"detail\": \"要通過舍入達到的小數位數。\\n\\n位數可以取負值,在這種情況下會將值的小數點左側部分舍入到指定的位數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ROUNDUP\": {\r\n            \"d\": \"朝著遠離0（零）的方向將數位進行向上舍入。\",\r\n            \"a\": \"朝著遠離0（零）的方向將數位進行向上舍入。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要將其舍入為位數位數位的值,始終向上舍入。\"\r\n                },\r\n                {\r\n                    \"name\": \"位數\",\r\n                    \"detail\": \"要通過舍入達到的小數位數。\\n\\n位數可以取負值,在這種情況下會將值的小數點左側部分舍入到指定的位數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SERIESSUM\": {\r\n            \"d\": \"給定參數x、n、m和a,返回幂級數的和a1xn + a2x（n+m）+…+ aix（n+（i-1）m）,其中i為範圍a中的項數。\",\r\n            \"a\": \"給定參數x、n、m和a\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"幂級數的輸入值。隨相應的近似類型而變,有可能為角度、指數或其他一些值。\"\r\n                },\r\n                {\r\n                    \"name\": \"n\",\r\n                    \"detail\": \"在幂級數中x的初始自乘幂次。\"\r\n                },\r\n                {\r\n                    \"name\": \"m\",\r\n                    \"detail\": \"x的幂次中的附加增量。\"\r\n                },\r\n                {\r\n                    \"name\": \"a\",\r\n                    \"detail\": \"包含幂級數係數的數組或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SIGN\": {\r\n            \"d\": \"給定輸入數值,如果為負返回-1；如果為正返回1；如果為零則返回0。\",\r\n            \"a\": \"給定輸入數值\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要返回其符號的數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SIN\": {\r\n            \"d\": \"給定角度（以弧度表示）,返回其正弦值。\",\r\n            \"a\": \"給定角度（以弧度表示）\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"角度\",\r\n                    \"detail\": \"要返回其正弦值的角度,以弧度表示。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SINH\": {\r\n            \"d\": \"返回給定實數的雙曲正弦值。\",\r\n            \"a\": \"返回給定實數的雙曲正弦值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要計算其雙曲正弦值的實數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SQRT\": {\r\n            \"d\": \"返回一個正數的正平方根。\",\r\n            \"a\": \"返回一個正數的正平方根。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要計算其正平方根的數值。\\n\\n值必須為正數；如果為負,SQRT將返回#NUM！錯誤。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SQRTPI\": {\r\n            \"d\": \"返回PI與給定正數乘積的正平方根。\",\r\n            \"a\": \"返回PI與給定正數乘積的正平方根。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要將其與PI相乘並返回該乘積的平方根的數值\\n\\n值必須為正數；如果為負數,SQRTPI將返回#NUM！錯誤。\"\r\n                }\r\n            ]\r\n        },\r\n        \"GAMMALN\": {\r\n            \"d\": \"返回指定伽瑪函數的以e（歐拉數）為底的對數。\",\r\n            \"a\": \"返回指定伽瑪函數的以e（歐拉數）為底的對數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"伽瑪函數的輸入值。返回的將是伽瑪（值）的自然對數。\\n\\n值必須為正數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COS\": {\r\n            \"d\": \"返回給定角度的余弦值（角度以弧度表示）。\",\r\n            \"a\": \"返回給定角度的余弦值（角度以弧度表示）。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"角度\",\r\n                    \"detail\": \"要取其余弦值的角度,以弧度表示。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TRUNC\": {\r\n            \"d\": \"除指定有效位之外的部分,取數據的指定有效位。\",\r\n            \"a\": \"除指定有效位之外的部分\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值\",\r\n                    \"detail\": \"要截取的數據。\"\r\n                },\r\n                {\r\n                    \"name\": \"位數\",\r\n                    \"detail\": \"[可選 - 預設值為0] - 小數點右側要保留的有效位數。\\n\\n如果位數大於值中的有效位數,則將\\\"值\\\"原樣返回。\\n\\n位數可以取負值,在這種情況下會將小數點左側指定位數的值更改為零。小數點右側的所有位數都會被捨棄。如果值的所有位都被更改為零,則TRUNC會返回0。\"\r\n                }\r\n            ]\r\n        },\r\n        \"QUOTIENT\": {\r\n            \"d\": \"返回以一個數除以另一個數所得的結果,不包含餘數。\",\r\n            \"a\": \"返回以一個數除以另一個數所得的結果\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"被除數\",\r\n                    \"detail\": \"要被除的數值。\"\r\n                },\r\n                {\r\n                    \"name\": \"除數\",\r\n                    \"detail\": \"用於除其他數的數值。\\n\\n除數不得為0\"\r\n                }\r\n            ]\r\n        },\r\n        \"POWER\": {\r\n            \"d\": \"返回數值的指定次幂。\",\r\n            \"a\": \"返回數值的指定次幂。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"底數\",\r\n                    \"detail\": \"要計算其指數次幂的數值。\\n\\n如果底數為負,則指數必須為整數。\"\r\n                },\r\n                {\r\n                    \"name\": \"指數\",\r\n                    \"detail\": \"指定底數的自乘幂次值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUMIFS\": {\r\n            \"d\": \"根據多項條件返回範圍之和。\",\r\n            \"a\": \"根據多項條件返回範圍之和。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"求和範圍\",\r\n                    \"detail\": \"要對其求和的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"條件範圍1\",\r\n                    \"detail\": \"要在哪個範圍內檢查條件1。\"\r\n                },\r\n                {\r\n                    \"name\": \"條件1\",\r\n                    \"detail\": \"要應用於條件範圍1的模式或測試條件。\"\r\n                },\r\n                {\r\n                    \"name\": \"條件範圍2,條件2…\",\r\n                    \"detail\": \"[ 可選 ] - 要檢查的其他範圍和條件。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUNTIFS\": {\r\n            \"d\": \"根據多項條件返回範圍中的儲存格數量。\",\r\n            \"a\": \"根據多項條件返回範圍中的儲存格數量。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"條件範圍1\",\r\n                    \"detail\": \"要在哪個範圍內檢查條件1。\"\r\n                },\r\n                {\r\n                    \"name\": \"條件1\",\r\n                    \"detail\": \"要應用於條件範圍1的模式或測試條件。\"\r\n                },\r\n                {\r\n                    \"name\": \"條件範圍2,條件2…\",\r\n                    \"detail\": \"[ 可選 ] - 要檢查的其他範圍和條件,可重複。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PRODUCT\": {\r\n            \"d\": \"返回將一組數相乘所得的結果。\",\r\n            \"a\": \"返回將一組數相乘所得的結果。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"乘數1\",\r\n                    \"detail\": \"用於計算乘積的第一個數值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"乘數2 ... 乘數30\",\r\n                    \"detail\": \"[可選] - 要相乘的其他數值\"\r\n                }\r\n            ]\r\n        },\r\n        \"HARMEAN\": {\r\n            \"d\": \"計算數據集的調和平均值。\",\r\n            \"a\": \"計算數據集的調和平均值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"樣本中的第一項值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 數據集中包含的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"HYPGEOMDIST\": {\r\n            \"d\": \"返回超幾何分佈。如果已知樣本量、總體成功次數和總體大小,則 HYPGEOM.DIST 返回樣本取得已知成功次數的概率。\",\r\n            \"a\": \"返回超幾何分佈。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"Sample_s\",\r\n                    \"detail\": \"樣本中成功的次數。\"\r\n                },\r\n                {\r\n                    \"name\": \"Number_sample\",\r\n                    \"detail\": \"樣本量。\"\r\n                },\r\n                {\r\n                    \"name\": \"Population_s\",\r\n                    \"detail\": \"總體中成功的次數。\"\r\n                },\r\n                {\r\n                    \"name\": \"Number_pop\",\r\n                    \"detail\": \"總體大小。\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"决定函數形式的邏輯值。\\n\\n如果cumulative為TRUE（）,則HYPGEOM.DIST返回累積分佈函數；\\n\\n如果為FALSE（）,則返回概率密度函數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"INTERCEPT\": {\r\n            \"d\": \"計算數據集的線性回歸方程直線與 Y 軸的相交點（x=0）的y值。\",\r\n            \"a\": \"計算數據集的線性回歸方程直線與 Y 軸的相交點（x=0）的y值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據_y\",\r\n                    \"detail\": \"代表因變數數據數組或矩陣的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"數據_x\",\r\n                    \"detail\": \"代表引數數據數組或矩陣的範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"KURT\": {\r\n            \"d\": \"計算數據集的峭度,該名額訓示數據集（分佈）的形態,尤其是該形態的陡峭程度。\",\r\n            \"a\": \"計算數據集的峭度\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"數據集中的第一個值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 數據集中包含的其他值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LARGE\": {\r\n            \"d\": \"返回數據集中第 n 個最大元素,n 由用戶指定。\",\r\n            \"a\": \"返回數據集中第 n 個最大元素\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據\",\r\n                    \"detail\": \"包含相關數據集的數組或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"n\",\r\n                    \"detail\": \"要返回的元素的排行位置（從大到小順序）。\\n\\n例如,將n設為4將使LARGE返回數據中排名第4的最大元素。\"\r\n                }\r\n            ]\r\n        },\r\n        \"STDEVA\": {\r\n            \"d\": \"基於樣本計算標準差,將文字取值為0。\",\r\n            \"a\": \"基於樣本計算標準差\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"樣本中的第一項值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2,…\",\r\n                    \"detail\": \"[可選] - 樣本中包含的其他值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"STDEVP\": {\r\n            \"d\": \"基於樣本總體計算標準差。\",\r\n            \"a\": \"基於樣本總體計算標準差。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"數據集中的第一個值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 數據集中包含的其他值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"GEOMEAN\": {\r\n            \"d\": \"計算數據集的幾何平均值。\",\r\n            \"a\": \"計算數據集的幾何平均值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"樣本中的第一項值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 數據集中包含的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"RANK_EQ\": {\r\n            \"d\": \"返回指定值在數據集中的排名。如果相同的值在數據集中存在多項,則返回其中的最高排名。\",\r\n            \"a\": \"返回指定值在數據集中的排名。如果相同的值在數據集中存在多項,則返回其中的最高排名。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要確定其排名的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"ref\",\r\n                    \"detail\": \"包含相關數據集的數組或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"order\",\r\n                    \"detail\": \"[可選-默認為按降序（FALSE（））] - 要按昇冪還是按降序考慮\\\"data\\\"中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"RANK_AVG\": {\r\n            \"d\": \"返回指定值在數據集中的排名。如果相同的值在數據集中存在多項,則返回這些項排名的平均值。\",\r\n            \"a\": \"返回指定值在數據集中的排名。如果相同的值在數據集中存在多項,則返回這些項排名的平均值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要確定其排名的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"ref\",\r\n                    \"detail\": \"包含相關數據集的數組或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"order\",\r\n                    \"detail\": \"[可選-默認為按降序（FALSE（））] - 要按昇冪還是按降序考慮\\\"data\\\"中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PERCENTRANK_EXC\": {\r\n            \"d\": \"以百分數形式返回指定值在給定數據集中的百分比排名（介於0和1之間,不包括兩端值）。\",\r\n            \"a\": \"以百分數形式返回指定值在給定數據集中的百分比排名（介於0和1之間,不包括兩端值）。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"包含相關數據集的數組或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"要確定其百分比排位的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"significance\",\r\n                    \"detail\": \"[可選-預設值為3] - 要在計算中使用的有效位數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PERCENTRANK_INC\": {\r\n            \"d\": \"以百分比形式返回指定值在給定數據集中的百分比排名（介於0和1之間,包括兩端值）。\",\r\n            \"a\": \"以百分比形式返回指定值在給定數據集中的百分比排名（介於0和1之間,包括兩端值）。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data\",\r\n                    \"detail\": \"包含相關數據集的數組或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"要確定其百分比排位的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"significance\",\r\n                    \"detail\": \"[可選-預設值為3] - 要在計算中使用的有效位數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"FORECAST\": {\r\n            \"d\": \"基於數據集的線性回歸,計算指定 x 的預期 y 值。\",\r\n            \"a\": \"基於數據集的線性回歸\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"x軸上用於預測的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"數據_y\",\r\n                    \"detail\": \"代表因變數數據數組或矩陣的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"數據_x\",\r\n                    \"detail\": \"代表引數數據數組或矩陣的範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"FISHERINV\": {\r\n            \"d\": \"返回指定數值的 Fisher 逆變換。\",\r\n            \"a\": \"返回指定數值的 Fisher 逆變換。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"y\",\r\n                    \"detail\": \"要計算其Fisher逆變換的數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"FISHER\": {\r\n            \"d\": \"返回指定數值的 Fisher 變換。\",\r\n            \"a\": \"返回指定數值的 Fisher 變換。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"要計算其Fisher變換的數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MODE_SNGL\": {\r\n            \"d\": \"返回數據集中出現次數最多的值。\",\r\n            \"a\": \"返回數據集中出現次數最多的值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"計算模式時要檢查的第一個值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 在計算模式時要考慮的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"WEIBULL_DIST\": {\r\n            \"d\": \"給定形狀和尺度,返回韋伯分佈函數（或韋伯累積分佈函數）的值。\",\r\n            \"a\": \"給定形狀和尺度\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"WEIBULL 分佈函數的輸入值。\"\r\n                },\r\n                {\r\n                    \"name\": \"alpha\",\r\n                    \"detail\": \"Weibull 分佈函數的形狀參數。\\n\\n alpha值必須大於0。\"\r\n                },\r\n                {\r\n                    \"name\": \"beta\",\r\n                    \"detail\": \"Weibull 分佈函數的尺度參數。\\n\\n beta值必須大於0。\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"TRUE（）表示使用累積分佈函數,FALSE（）則表示使用概率密度函數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUNT\": {\r\n            \"d\": \"返回數據集中數值的個數。\",\r\n            \"a\": \"返回數據集中數值的個數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"計數時要檢查的第一個值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 在計數時要檢查的其他值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUNTA\": {\r\n            \"d\": \"返回數據集中值的數量。\",\r\n            \"a\": \"返回數據集中值的數量。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"計數時要檢查的第一個值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 在計數時要檢查的其他值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"AVEDEV\": {\r\n            \"d\": \"計算數據與數據集平均值之間的偏差大小的平均值。\",\r\n            \"a\": \"計算數據與數據集平均值之間的偏差大小的平均值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"樣本中的第一項值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 樣本中包含的其他值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"AVERAGE\": {\r\n            \"d\": \"返回數據集的算術平均值,對文字忽略不計。\",\r\n            \"a\": \"返回數據集的算術平均值\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"計算平均值時用到的第一個數值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 在計算平均值時要考慮的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"AVERAGEA\": {\r\n            \"d\": \"返回數據集的算術平均值。\",\r\n            \"a\": \"返回數據集的算術平均值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"計算平均值時用到的第一個數值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 在計算平均值時要考慮的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"BINOM_DIST\": {\r\n            \"d\": \"返回一元二項式分佈的概率。\",\r\n            \"a\": \"返回一元二項式分佈的概率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number_s\",\r\n                    \"detail\": \"試驗的成功次數。\"\r\n                },\r\n                {\r\n                    \"name\": \"trials\",\r\n                    \"detail\": \"獨立檢驗的次數。\"\r\n                },\r\n                {\r\n                    \"name\": \"probability_s\",\r\n                    \"detail\": \"任一給定檢驗的成功概率。\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"是否使用二項式累積分佈。\"\r\n                }\r\n            ]\r\n        },\r\n        \"BINOM_INV\": {\r\n            \"d\": \"計算累積二項式分佈大於或等於指定條件的最小值。\",\r\n            \"a\": \"計算累積二項式分佈大於或等於指定條件的最小值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"trials\",\r\n                    \"detail\": \"貝努利試驗次數。\"\r\n                },\r\n                {\r\n                    \"name\": \"probability_s\",\r\n                    \"detail\": \"任一次給定檢驗的成功概率。\"\r\n                },\r\n                {\r\n                    \"name\": \"alpha\",\r\n                    \"detail\": \"期望的臨界概率。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CONFIDENCE_NORM\": {\r\n            \"d\": \"計算常态分配的置信區間的一半寬度。\",\r\n            \"a\": \"計算常态分配的置信區間的一半寬度。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"alpha\",\r\n                    \"detail\": \"用來計算置信水准的顯著性水准。\\n\\n置信水准等於100*（1 - alpha）%,亦即,如果 alpha 為0.05,則置信水准為 95%。\"\r\n                },\r\n                {\r\n                    \"name\": \"standard_dev\",\r\n                    \"detail\": \"數據區域的總體標準差。\"\r\n                },\r\n                {\r\n                    \"name\": \"size\",\r\n                    \"detail\": \"樣本總量的大小。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CORREL\": {\r\n            \"d\": \"計算給定數據集的皮爾遜積矩相關係數 r。\",\r\n            \"a\": \"計算給定數據集的皮爾遜積矩相關係數 r。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據_y\",\r\n                    \"detail\": \"代表因變數數據數組或矩陣的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"數據_x\",\r\n                    \"detail\": \"代表引數數據數組或矩陣的範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COVARIANCE_P\": {\r\n            \"d\": \"計算數據集的總體協方差。\",\r\n            \"a\": \"計算數據集的總體協方差。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據_x\",\r\n                    \"detail\": \"代表引數數據數組或矩陣的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"數據_y\",\r\n                    \"detail\": \"代表因變數數據數組或矩陣的範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COVARIANCE_S\": {\r\n            \"d\": \"計算數據集的樣本協方差。\",\r\n            \"a\": \"計算數據集的樣本協方差。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據_x\",\r\n                    \"detail\": \"代表引數數據數組或矩陣的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"數據_y\",\r\n                    \"detail\": \"代表因變數數據數組或矩陣的範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DEVSQ\": {\r\n            \"d\": \"基於樣本計算其偏差的平方和。\",\r\n            \"a\": \"基於樣本計算其偏差的平方和。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"樣本中的第一項值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 樣本中包含的其他值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"EXPON_DIST\": {\r\n            \"d\": \"返回帶有指定 Lambda 和指定值的指數分佈函數的值。\",\r\n            \"a\": \"返回帶有指定 Lambda 和指定值的指數分佈函數的值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"指數分佈函數的輸入值。\"\r\n                },\r\n                {\r\n                    \"name\": \"lambda\",\r\n                    \"detail\": \"用於指定指數分佈函數的 lambda 值。\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"是否使用指數累積分佈。\"\r\n                }\r\n            ]\r\n        },\r\n        \"AVERAGEIF\": {\r\n            \"d\": \"根據條件返回範圍的平均值。\",\r\n            \"a\": \"根據條件返回範圍的平均值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"criteria_range\",\r\n                    \"detail\": \"要對其檢查 criterion 的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"criterion\",\r\n                    \"detail\": \"要應用於criteria_range的模式或測試條件。\\n\\n等於:\\\"文字\\\" 或 1 或 \\\"=文字\\\" 或 \\\"=1\\\"\\n\\n大於:\\\">1\\\"\\n\\n大於等於:\\\">=1\\\"\\n\\n小於:\\\"<1\\\"\\n\\n小於等於:\\\"<=1\\\"\\n\\n不等於:\\\"<>1\\\"或\\\"<>文字\\\"\"\r\n                },\r\n                {\r\n                    \"name\": \"average_range\",\r\n                    \"detail\": \"[可選] - 要計算平均值的範圍。如果未提供此參數,則改用criteria_range來計算平均值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"AVERAGEIFS\": {\r\n            \"d\": \"根據多項條件返回範圍的平均值。\",\r\n            \"a\": \"根據多項條件返回範圍的平均值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"average_range\",\r\n                    \"detail\": \"要計算平均值的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria_range1\",\r\n                    \"detail\": \"要對其檢查 criterion1 的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"criterion1\",\r\n                    \"detail\": \"要應用於criteria_range1的模式或測試條件。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria_range2, criterion2, ...\",\r\n                    \"detail\": \"[可選] - 要檢查的其他範圍和條件。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PERMUT\": {\r\n            \"d\": \"返回可從數位對象中選擇的給定數目對象的排列數。\",\r\n            \"a\": \"返回可從數位對象中選擇的給定數目對象的排列數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"表示對象個數的整數。\"\r\n                },\r\n                {\r\n                    \"name\": \"number_chosen\",\r\n                    \"detail\": \"表示每個排列中對象個數的整數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TRIMMEAN\": {\r\n            \"d\": \"在排除數據集高低兩端的部分數據之後計算所得的平均值。\",\r\n            \"a\": \"在排除數據集高低兩端的部分數據之後計算所得的平均值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據\",\r\n                    \"detail\": \"包含相關數據集的數組或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"排除比例\",\r\n                    \"detail\": \"要從數據集的極值部分排除的數據占數據集的比例。\\n\\n排除比例必須大於等於0且小於1。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PERCENTILE_EXC\": {\r\n            \"d\": \"返回數組的 K 百分點值,K 介於0到1之間,不含0與1。\",\r\n            \"a\": \"返回數組的 K 百分點值,K 介於0到1之間,不含0與1。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"定義相對位置的數組或數據區域。\"\r\n                },\r\n                {\r\n                    \"name\": \"k\",\r\n                    \"detail\": \"0 到 1 之間的百分點值,不包含 0 和 1。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PERCENTILE_INC\": {\r\n            \"d\": \"返回數組的 K 百分點值,K 介於 0 到 1 之間,包含 0 與 1。\",\r\n            \"a\": \"返回數組的 K 百分點值,K 介於 0 到 1 之間,包含 0 與 1。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"定義相對位置的數組或數據區域。\"\r\n                },\r\n                {\r\n                    \"name\": \"k\",\r\n                    \"detail\": \"0 到 1 之間的百分點值,包含 0 和 1。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PEARSON\": {\r\n            \"d\": \"回皮爾生（Pearson）乘積矩相關係數 r。\",\r\n            \"a\": \"回皮爾生（Pearson）乘積矩相關係數 r。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據_x\",\r\n                    \"detail\": \"代表引數數據數組或矩陣的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"數據_y\",\r\n                    \"detail\": \"代表因變數數據數組或矩陣的範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"NORM_S_INV\": {\r\n            \"d\": \"返回標準正態累積分佈函數的反函數值。該分佈的平均值為0,標準差為1。\",\r\n            \"a\": \"返回標準正態累積分佈函數的反函數值。該分佈的平均值為0,標準差為1。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"probability\",\r\n                    \"detail\": \"對應於常态分配的概率。\"\r\n                }\r\n            ]\r\n        },\r\n        \"NORM_S_DIST\": {\r\n            \"d\": \"返回標準常态分配函數（該分佈的平均值為0,標準差為1）。\",\r\n            \"a\": \"返回標準常态分配函數（該分佈的平均值為0,標準差為1）。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"z\",\r\n                    \"detail\": \"需要計算其分佈的數值。\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"决定函數形式的邏輯值。\\n\\n如果為TRUE（）,則返回累積分佈函數；\\n\\n如果為FALSE（）,則返回概率密度函數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"NORM_INV\": {\r\n            \"d\": \"返回指定平均值和標準差的正態累積分佈函數的反函數值。\",\r\n            \"a\": \"返回指定平均值和標準差的正態累積分佈函數的反函數值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"probability\",\r\n                    \"detail\": \"對應於常态分配的概率。\"\r\n                },\r\n                {\r\n                    \"name\": \"mean\",\r\n                    \"detail\": \"分佈的算術平均值。\"\r\n                },\r\n                {\r\n                    \"name\": \"standard_dev\",\r\n                    \"detail\": \"分佈的標準差。\"\r\n                }\r\n            ]\r\n        },\r\n        \"NORM_DIST\": {\r\n            \"d\": \"返回指定平均值和標準差的常态分配函數。\",\r\n            \"a\": \"返回指定平均值和標準差的常态分配函數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"需要計算其分佈的數值。\"\r\n                },\r\n                {\r\n                    \"name\": \"mean\",\r\n                    \"detail\": \"分佈的算術平均值。\"\r\n                },\r\n                {\r\n                    \"name\": \"standard_dev\",\r\n                    \"detail\": \"分佈的標準差。\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"决定函數形式的邏輯值。\\n\\n如果為TRUE（）,則返回累積分佈函數；\\n\\n如果為FALSE（）,則返回概率密度函數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"NEGBINOM_DIST\": {\r\n            \"d\": \"返回負二項式分佈。\",\r\n            \"a\": \"返回負二項式分佈。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number_f\",\r\n                    \"detail\": \"要類比的失敗次數。\"\r\n                },\r\n                {\r\n                    \"name\": \"number_s\",\r\n                    \"detail\": \"要類比的成功次數。\"\r\n                },\r\n                {\r\n                    \"name\": \"probability_s\",\r\n                    \"detail\": \"任一次給定檢驗的成功概率。\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"决定函數形式的邏輯值。\\n\\n如果為TRUE（）,則返回累積分佈函數；\\n\\n如果為FALSE（）,則返回概率密度函數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MINA\": {\r\n            \"d\": \"返回數據集中的最小數值。\",\r\n            \"a\": \"返回數據集中的最小數值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"計算最小值時所用的第一個值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2\",\r\n                    \"detail\": \"[可選] - 在計算最小值時要考慮的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MIN\": {\r\n            \"d\": \"返回數值數據集中的最小值。\",\r\n            \"a\": \"返回數值數據集中的最小值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"計算最小值時所用的第一個值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2\",\r\n                    \"detail\": \"[可選] - 在計算最小值時要考慮的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MEDIAN\": {\r\n            \"d\": \"返回數值數據集中的中值。\",\r\n            \"a\": \"返回數值數據集中的中值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"計算中值時所用的第一個數值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2\",\r\n                    \"detail\": \"[可選] - 在計算中值時要考慮的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MAXA\": {\r\n            \"d\": \"返回數據集中的最大數值。\",\r\n            \"a\": \"返回數據集中的最大數值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"計算最大值時所用的第一個值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 在計算最大值時要考慮的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MAX\": {\r\n            \"d\": \"返回數值數據集中的最大值。\",\r\n            \"a\": \"返回數值數據集中的最大值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"計算最大值時所用的第一個值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2\",\r\n                    \"detail\": \"[可選] - 在計算最大值時要考慮的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOGNORM_INV\": {\r\n            \"d\": \"返回 x 的對數累積分佈函數的反函數值。\",\r\n            \"a\": \"返回 x 的對數累積分佈函數的反函數值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"probability\",\r\n                    \"detail\": \"與對數分佈相關的概率,介於0與1之間（不含0與1）。\"\r\n                },\r\n                {\r\n                    \"name\": \"mean\",\r\n                    \"detail\": \"ln(x) 的平均值。\"\r\n                },\r\n                {\r\n                    \"name\": \"standard_dev\",\r\n                    \"detail\": \"ln(x) 的標準差,正數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOGNORM_DIST\": {\r\n            \"d\": \"返回 x 的對數分佈函數。\",\r\n            \"a\": \"返回 x 的對數分佈函數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"用來計算函數的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"mean\",\r\n                    \"detail\": \"ln(x) 的平均值。\"\r\n                },\r\n                {\r\n                    \"name\": \"standard_dev\",\r\n                    \"detail\": \"ln(x) 的標準差,正數。\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"决定函數形式的邏輯值。\\n\\n如果為TRUE（）,則返回累積分佈函數；\\n\\n如果為FALSE（）,則返回概率密度函數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"Z_TEST\": {\r\n            \"d\": \"返回 z 檢驗的單尾 P 值。\",\r\n            \"a\": \"返回 z 檢驗的單尾 P 值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"用來檢驗 x 的數組或數據區域。\"\r\n                },\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"要測試的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"sigma\",\r\n                    \"detail\": \"[可選] - 總體（已知）標準差。如果省略,則使用樣本標準差。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PROB\": {\r\n            \"d\": \"返回區域中的數值落在指定區間內的概率。\",\r\n            \"a\": \"返回區域中的數值落在指定區間內的概率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x_range\",\r\n                    \"detail\": \"具有各自相應概率值的 x 數值區域。\"\r\n                },\r\n                {\r\n                    \"name\": \"prob_range\",\r\n                    \"detail\": \"與 x_range 中的值相關聯的一組概率值。\"\r\n                },\r\n                {\r\n                    \"name\": \"lower_limit\",\r\n                    \"detail\": \"要計算其概率的數值下界。\"\r\n                },\r\n                {\r\n                    \"name\": \"upper_limit\",\r\n                    \"detail\": \"[可選 - 預設值為下界] - 要計算其概率的可選數值上界。\\n\\n如果省略上界,PROB則計算隨機選取相應值的次數恰好等於下界的概率。\"\r\n                }\r\n            ]\r\n        },\r\n        \"QUARTILE_EXC\": {\r\n            \"d\": \"基於 0 到 1 之間（不包括 0 和 1）的百分點值返回數據集的四分位數。\",\r\n            \"a\": \"基於 0 到 1 之間（不包括 0 和 1）的百分點值返回數據集的四分位數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"要求得四分位數值的數組或數字型儲存格區域。\"\r\n                },\r\n                {\r\n                    \"name\": \"quart\",\r\n                    \"detail\": \"要返回第幾個四分位值。\\n\\n1返回數據中最靠近第一個四分位值的值（25%標記）。\\n\\n2返回數據中最接近中值的值（50%標記）。\\n\\n3返回數據中最接近第三個四分位值的值（75%標記）。\"\r\n                }\r\n            ]\r\n        },\r\n        \"QUARTILE_INC\": {\r\n            \"d\": \"根據 0 到 1 之間的百分點值（包含 0 和 1）返回數據集的四分位數。\",\r\n            \"a\": \"根據 0 到 1 之間的百分點值（包含 0 和 1）返回數據集的四分位數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"要求得四分位數值的數組或數字型儲存格區域。\"\r\n                },\r\n                {\r\n                    \"name\": \"quart\",\r\n                    \"detail\": \"要返回第幾個四分位值。\\n\\n0返回數據中的最小值（0%標記）。\\n\\n1返回數據中最靠近第一個四分位值的值（25%標記）。\\n\\n2返回數據中最接近中值的值（50%標記）。\\n\\n3返回數據中最接近第三個四分位值的值（75%標記）。\\n\\n4返回數據中的最大值（100%標記）。\"\r\n                }\r\n            ]\r\n        },\r\n        \"POISSON_DIST\": {\r\n            \"d\": \"返回泊松分布。\",\r\n            \"a\": \"返回泊松分布。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"事件數。\"\r\n                },\r\n                {\r\n                    \"name\": \"mean\",\r\n                    \"detail\": \"期望值。非負數\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"一 邏輯值,確定所返回的概率分佈的形式。\\n\\n如果為TRUE（）,則返回發生的隨機事件數在零（含零）和x（含x）之間的累積泊松概率；\\n\\n如果為FALSE（）,則返回發生的事件數正好是x的泊松概率密度函數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"RSQ\": {\r\n            \"d\": \"返回皮爾生(Pearson)乘積矩相關係數r的平方。\",\r\n            \"a\": \"返回皮爾生(Pearson)乘積矩相關係數r的平方。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據_y\",\r\n                    \"detail\": \"代表因變數數據數組或矩陣的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"數據_x\",\r\n                    \"detail\": \"代表引數數據數組或矩陣的範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"T_DIST\": {\r\n            \"d\": \"返回學生的左尾 t 分佈。\",\r\n            \"a\": \"返回學生的左尾 t 分佈。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"T-分佈函數的輸入。\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom\",\r\n                    \"detail\": \"自由度數值。\"\r\n                },\r\n                {\r\n                    \"name\": \"tails\",\r\n                    \"detail\": \"决定函數形式的邏輯值。\\n\\n如果cumulative為TRUE（）,則HYPGEOM.DIST返回累積分佈函數；\\n\\n如果為FALSE（）,則返回概率密度函數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"T_DIST_2T\": {\r\n            \"d\": \"返回學生的雙尾 t 分佈。\",\r\n            \"a\": \"返回學生的雙尾 t 分佈。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"T-分佈函數的輸入。\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom\",\r\n                    \"detail\": \"自由度數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"T_DIST_RT\": {\r\n            \"d\": \"返回學生的右尾 t 分佈。\",\r\n            \"a\": \"返回學生的右尾 t 分佈。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"T-分佈函數的輸入。\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom\",\r\n                    \"detail\": \"自由度數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"T_INV\": {\r\n            \"d\": \"返回學生的 t 分佈的左尾反函數。\",\r\n            \"a\": \"返回學生的 t 分佈的左尾反函數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"probability\",\r\n                    \"detail\": \"與學生的 t 分佈相關的概率。\\n\\n必須大於 0 且小於 1。\"\r\n                },\r\n                {\r\n                    \"name\": \"deg_freedom\",\r\n                    \"detail\": \"自由度數值。\\n\\n如果所提供的參數不是整數,將截取其整數部分。\\n\\n必須大於等於1。\"\r\n                }\r\n            ]\r\n        },\r\n        \"T_INV_2T\": {\r\n            \"d\": \"返回學生 t 分佈的雙尾反函數。\",\r\n            \"a\": \"返回學生 t 分佈的雙尾反函數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"probability\",\r\n                    \"detail\": \"與學生的t分佈相關的概率。\\n\\n必須大於 0 且小於 1。\"\r\n                },\r\n                {\r\n                    \"name\": \"deg_freedom\",\r\n                    \"detail\": \"自由度數值。\\n\\n如果所提供的參數不是整數,將截取其整數部分。\\n\\n必須大於等於1。\"\r\n                }\r\n            ]\r\n        },\r\n        \"T_TEST\": {\r\n            \"d\": \"返回與t-檢驗相關的概率。用於判斷兩個樣本是否可能是出自平均值相同的兩個樣本總體。\",\r\n            \"a\": \"返回與t-檢驗相關的概率。用於判斷兩個樣本是否可能是出自平均值相同的兩個樣本總體。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array1\",\r\n                    \"detail\": \"將用於t檢驗的第一個數據樣本或第一組儲存格。\"\r\n                },\r\n                {\r\n                    \"name\": \"array2\",\r\n                    \"detail\": \"將用於t檢驗的第二個數據樣本或第二組儲存格。\"\r\n                },\r\n                {\r\n                    \"name\": \"tails\",\r\n                    \"detail\": \"指定分佈的尾數。\\n\\n如果為 1:使用單尾分佈。\\n\\n如果為 2:使用雙尾分佈。\"\r\n                },\r\n                {\r\n                    \"name\": \"type\",\r\n                    \"detail\": \"指定t檢驗的類型。\\n\\n如果為 1:執行配對檢驗。\\n\\n如果為 2:執行雙樣本等方差（同方差）檢驗。\\n\\n如果為 3:執行雙樣本不等方差（异方差）檢驗。\"\r\n                }\r\n            ]\r\n        },\r\n        \"F_DIST\": {\r\n            \"d\": \"給定輸入值 x,計算兩個數據集的左尾 F 概率分佈（差异程度）。此分佈也稱為 Fisher-Snedecor 分佈或Snedecor F 分佈。\",\r\n            \"a\": \"給定輸入值 x\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"用來計算函數的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom1\",\r\n                    \"detail\": \"分子自由度。\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom2\",\r\n                    \"detail\": \"分母自由度。\"\r\n                },\r\n                {\r\n                    \"name\": \"cumulative\",\r\n                    \"detail\": \"用於確定函數形式的邏輯值。預設值為 FALSE。\\n\\n如果為 TRUE（）:F.DIST將返回累積分佈函數值。\\n\\n如果為FALSE（）:F.DIST將返回概率密度函數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"F_DIST_RT\": {\r\n            \"d\": \"給定輸入x,計算兩個數據集的右尾F概率分佈（差异程度）。此分佈也稱為Fisher-Snedecor分佈或Snedecor F分佈。\",\r\n            \"a\": \"給定輸入 x\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"用來計算函數的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom1\",\r\n                    \"detail\": \"分子自由度。\"\r\n                },\r\n                {\r\n                    \"name\": \"degrees_freedom2\",\r\n                    \"detail\": \"分母自由度。\"\r\n                }\r\n            ]\r\n        },\r\n        \"VAR_P\": {\r\n            \"d\": \"基於樣本總體計算方差。\",\r\n            \"a\": \"基於樣本總體計算方差。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"數據集中的第一個值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, …\",\r\n                    \"detail\": \"[可選] - 數據集中包含的其他值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"VAR_S\": {\r\n            \"d\": \"基於樣本計算方差。\",\r\n            \"a\": \"基於樣本計算方差。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"樣本中的第一項值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, …\",\r\n                    \"detail\": \"[可選] - 樣本中包含的其他值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"VARA\": {\r\n            \"d\": \"基于样本计算方差,将文本取值为0。\",\r\n            \"a\": \"基于样本计算方差\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"樣本中的第一項值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2, ...\",\r\n                    \"detail\": \"[可選] - 樣本中包含的其他值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"VARPA\": {\r\n            \"d\": \"基於樣本總體計算方差,將文字取值為0。\",\r\n            \"a\": \"基於樣本總體計算方差\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"樣本中的第一項值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 數據集中包含的其他數值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"STEYX\": {\r\n            \"d\": \"返回通過線性回歸法預測每個 x 的 y 值時所產生的標準誤差。\",\r\n            \"a\": \"返回通過線性回歸法預測每個 x 的 y 值時所產生的標準誤差。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據_y\",\r\n                    \"detail\": \"代表因變數數據數組或矩陣的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"數據_x\",\r\n                    \"detail\": \"代表引數數據數組或矩陣的範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"STANDARDIZE\": {\r\n            \"d\": \"給定分佈的平均值和標準差,計算一個隨機變數正態化的相應值。\",\r\n            \"a\": \"給定分佈的平均值和標準差,計算一個隨機變數正態化的相應值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"x\",\r\n                    \"detail\": \"要正態化的隨機變數值。\"\r\n                },\r\n                {\r\n                    \"name\": \"mean\",\r\n                    \"detail\": \"分佈的平均值。\"\r\n                },\r\n                {\r\n                    \"name\": \"standard_dev\",\r\n                    \"detail\": \"分佈的標準差。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SMALL\": {\r\n            \"d\": \"返回數據集中的第k個最小值。\",\r\n            \"a\": \"返回數據集中的第k個最小值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"需要找到第k個最小值的數組或數值數據區域。\"\r\n                },\r\n                {\r\n                    \"name\": \"k\",\r\n                    \"detail\": \"要返回的數據在數組或數據區域裏的位置（從小到大）。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SLOPE\": {\r\n            \"d\": \"計算通過數據集的線性回歸得到的直線的斜率。\",\r\n            \"a\": \"計算通過數據集的線性回歸得到的直線的斜率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據_y\",\r\n                    \"detail\": \"代表因變數數據數組或矩陣的範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"數據_x\",\r\n                    \"detail\": \"代表引數數據數組或矩陣的範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SKEW\": {\r\n            \"d\": \"返回分佈的偏斜度。偏斜度表明分佈相對於平均值的不對稱程度。正偏斜度表明分佈的不對稱尾部趨向於更多正值。負偏斜度表明分佈的不對稱尾部趨向於更多負值。\",\r\n            \"a\": \"返回分佈的偏斜度。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"數據集中的第一個值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 數據集中包含的其他值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SKEW_P\": {\r\n            \"d\": \"返回基於樣本總體的分佈不對稱度:表明分佈相對於平均值的不對稱程度。\",\r\n            \"a\": \"返回基於樣本總體的分佈不對稱度:表明分佈相對於平均值的不對稱程度。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"值1\",\r\n                    \"detail\": \"數據集中的第一個值或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"值2, ...\",\r\n                    \"detail\": \"[可選] - 數據集中包含的其他值或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"VLOOKUP\": {\r\n            \"d\": \"縱向查找。在範圍的第一列中自上而下蒐索某個鍵值,並返回所找到的行中指定儲存格的值。\",\r\n            \"a\": \"縱向查找。在範圍的第一列中自上而下蒐索某個鍵值\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"蒐索鍵值\",\r\n                    \"detail\": \"要蒐索的值,如 42、\\\"Cats\\\" 或 I24。\"\r\n                },\r\n                {\r\n                    \"name\": \"範圍\",\r\n                    \"detail\": \"要進行蒐索的範圍。VLOOKUP 將在該範圍的第一列中蒐索蒐索鍵值中指定的鍵值。\"\r\n                },\r\n                {\r\n                    \"name\": \"索引\",\r\n                    \"detail\": \"要返回的值的列索引,範圍中的第一列編號為1。\\n\\n如果索引不是介於1和範圍中的列數之間,將返回#VALUE！。\"\r\n                },\r\n                {\r\n                    \"name\": \"已排序\",\r\n                    \"detail\": \"[預設值為TRUE()] -訓示要蒐索的列（指定範圍的第一列）是否已排序。大多數情况下,建議設為FALSE（）。\\n\\n建議將已排序設為FALSE。如果設為FALSE,將返回完全匹配項。如果存在多個匹配值,將返回找到的第一個值對應的儲存格的內容,如果找不到匹配值,則返回#N/A。\\n\\n如果將已排序設為TRUE或省略,將返回（小於或等於蒐索鍵值的）最接近的匹配項。如果蒐索的列中所有的值均大於蒐索鍵值,則返回#N/A。\"\r\n                }\r\n            ]\r\n        },\r\n        \"HLOOKUP\": {\r\n            \"d\": \"橫向查找。在範圍的第一行中蒐索某個鍵值,並返回所找到的列中指定儲存格的值。\",\r\n            \"a\": \"橫向查找。在範圍的第一行中蒐索某個鍵值\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"蒐索鍵值\",\r\n                    \"detail\": \"要蒐索的值。例如,42、\\\"Cats\\\"或I24。\"\r\n                },\r\n                {\r\n                    \"name\": \"範圍\",\r\n                    \"detail\": \"要進行蒐索的範圍。將在該範圍的第一行中蒐索在蒐索鍵值中指定的鍵值。\"\r\n                },\r\n                {\r\n                    \"name\": \"索引\",\r\n                    \"detail\": \"要返回的值的行索引,範圍中的第一行編號為1。\\n\\n如果索引不是介於1和範圍中的行數之間,將返回#VALUE！。\"\r\n                },\r\n                {\r\n                    \"name\": \"已排序\",\r\n                    \"detail\": \"[可選 - 預設值為TRUE()] - 訓示要蒐索的行（指定範圍的第一行）是否已排序。\\n\\n如果將已排序設為TRUE或省略,將返回最接近的匹配值（小於或等於蒐索鍵值）。如果在蒐索的行中所有的值均大於蒐索鍵值,則返回#N/A。\\n\\n如果將已排序設為TRUE或將其省略,而範圍的首行並非處於已排序狀態,則返回值可能會是錯誤的。\\n\\n如果將已排序設為FALSE,則僅返回完全匹配。如果存在多個匹配值,將返回與找到的第一個值對應的儲存格的內容,如果找不到匹配值則返回#N/A。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOOKUP\": {\r\n            \"d\": \"在行或列中查找相應鍵,並將相應儲存格的值返回到與蒐索行或列所在位置相同的結果範圍中。\",\r\n            \"a\": \"在行或列中查找相應鍵\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"蒐索鍵值\",\r\n                    \"detail\": \"要在行或列中蒐索的值。例如,42、\\\"Cats\\\" 或 I24。\"\r\n                },\r\n                {\r\n                    \"name\": \"搜索範圍 | 搜索結果數組\",\r\n                    \"detail\": \"使用LOOKUP的一種方法是給定單行或單列形式的搜索範圍進行蒐索查找,這種管道要用到另一個參數結果範圍。另一種管道是將這兩個參數合併為一個搜索結果數組,其中第一行或第一列用於蒐索,並將返回值放在該數組的最後一行或最後一列中。\"\r\n                },\r\n                {\r\n                    \"name\": \"結果範圍\",\r\n                    \"detail\": \"[ 可選 ] - 用於存放返回結果的範圍。返回值對應於在搜索範圍中找到蒐索鍵值的位置。此範圍必須僅為單行或單列,而如果您使用的是搜索結果數組管道,則不應提供此參數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ADDRESS\": {\r\n            \"d\": \"返回字串形式的儲存格引用。\",\r\n            \"a\": \"返回字串形式的儲存格引用。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"row_num\",\r\n                    \"detail\": \"一個數值,指定要在儲存格引用中使用的行號。\"\r\n                },\r\n                {\r\n                    \"name\": \"column_num\",\r\n                    \"detail\": \"一個數值,指定要在儲存格引用中使用的列號（而非名稱）。A列的編號為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"abs_num\",\r\n                    \"detail\": \"[可選 - 預設值為1] - 一個數值,指定要返回的參考類型。\\n\\n1表示行列均採用絕對值（例如$A$1）；\\n\\n2表示採用絕對行號,相對列標（例如A$1）；\\n\\n3表示採用相對行號,絕對列標（例如$A1）；\\n\\n4表示行列均採用相對值（例如A1）。\"\r\n                },\r\n                {\r\n                    \"name\": \"A1\",\r\n                    \"detail\": \"[可選 - 預設值為TRUE（）] - 一個布林值,訓示採用A1標記形式（TRUE）還是R1C1標記形式（FALSE）。\"\r\n                },\r\n                {\r\n                    \"name\": \"sheet_text\",\r\n                    \"detail\": \"[可選 - 默認預設] - 用於指定地址所指向的工作表名稱。\"\r\n                }\r\n            ]\r\n        },\r\n        \"INDIRECT\": {\r\n            \"d\": \"返回以字串指定的儲存格引用。\",\r\n            \"a\": \"返回以字串指定的儲存格引用。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"ref_text\",\r\n                    \"detail\": \"以帶引號的字串形式提供的儲存格引用。\"\r\n                },\r\n                {\r\n                    \"name\": \"A1\",\r\n                    \"detail\": \"[可選 - 預設值為TRUE（）] - 一個布林值,訓示採用A1標記形式（TRUE）還是R1C1標記形式（FALSE）。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ROW\": {\r\n            \"d\": \"返回指定儲存格的行號\",\r\n            \"a\": \"返回指定儲存格的行號\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"reference\",\r\n                    \"detail\": \"[可選 - 默認為此公式所在的儲存格] - 要返回其行號的儲存格。\\n\\n如果儲存格引用指向的範圍其寬度大於一個儲存格,而此公式不是用作數組公式的,這時會僅返回儲存格引用中首行的編號值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ROWS\": {\r\n            \"d\": \"返回指定數組或範圍中的行數。\",\r\n            \"a\": \"返回指定數組或範圍中的行數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"要返回其行數的範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COLUMN\": {\r\n            \"d\": \"按照 `A=1` 的規則返回指定儲存格的列號。\",\r\n            \"a\": \"按照 `A=1` 的規則返回指定儲存格的列號。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"reference\",\r\n                    \"detail\": \"[可選 - 默認為包含此公式的儲存格] - 要返回其列號的儲存格。A列對應的編號為1。\\n\\n如果儲存格引用是寬度超過一個儲存格的範圍,而此公式不是作為數組公式來使用的,囙此將返回儲存格引用中的第一列的位置。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COLUMNS\": {\r\n            \"d\": \"返回指定數組或範圍中的列數。\",\r\n            \"a\": \"返回指定數組或範圍中的列數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"要返回其列數的範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"OFFSET\": {\r\n            \"d\": \"給定某範圍的起始儲存格引用以及該範圍涵蓋的行列數量,返回該範圍的引用。\",\r\n            \"a\": \"給定某範圍的起始儲存格引用以及該範圍涵蓋的行列數量,返回該範圍的引用。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"reference\",\r\n                    \"detail\": \"用於計算行列偏移量的起點。\"\r\n                },\r\n                {\r\n                    \"name\": \"rows\",\r\n                    \"detail\": \"要偏移的行數。\\n\\n行偏移量必須是整數,但也可以是負數。如果提供的參數帶有小數,小數部分將被截去。\"\r\n                },\r\n                {\r\n                    \"name\": \"cols\",\r\n                    \"detail\": \"要偏移的列數。\\n\\n列偏移量必須是整數,但也可以是負數。如果提供的參數帶有小數,小數部分將被截去。\"\r\n                },\r\n                {\r\n                    \"name\": \"height\",\r\n                    \"detail\": \"[可選] - 要從偏移目標開始返回的範圍的高度。\"\r\n                },\r\n                {\r\n                    \"name\": \"width\",\r\n                    \"detail\": \"[可選] - 要從偏移目標開始返回的範圍的寬度。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MATCH\": {\r\n            \"d\": \"在儲存格中蒐索指定項,然後返回該項在儲存格區域中的相對位置。\",\r\n            \"a\": \"在儲存格中蒐索指定項,然後返回該項在儲存格區域中的相對位置。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"lookup_value\",\r\n                    \"detail\": \"要在 lookup_array 中匹配的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"lookup_array\",\r\n                    \"detail\": \"要蒐索的儲存格區域。\\n\\n如果所用的範圍的高度和寬度均大於1,MATCH將返回#N/A！。\"\r\n                },\r\n                {\r\n                    \"name\": \"match_type\",\r\n                    \"detail\": \"[可選 - 預設值為1] - 要採用的蒐索管道。\\n\\n1為默認類型,此時MATCH會假設範圍已按昇冪排序,並返回小於等於蒐索鍵值的最大值。\\n\\n0表示完全匹配,在範圍未排序的情况下需要使用此管道。\\n\\n-1讓MATCH假設範圍是按降序排序的,並返回大於等於蒐索鍵值的最小值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"INDEX\": {\r\n            \"d\": \"返回表格或中的元素值,此元素由行號和列號的索引值給定。\",\r\n            \"a\": \"返回表格或中的元素值,此元素由行號和列號的索引值給定。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"儲存格區域或數組常數。\"\r\n                },\r\n                {\r\n                    \"name\": \"row_num\",\r\n                    \"detail\": \"選擇數組中的某行,函數從該行返回數值。\"\r\n                },\r\n                {\r\n                    \"name\": \"column_num\",\r\n                    \"detail\": \"選擇數組中的某列,函數從該列返回數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"GETPIVOTDATA\": {\r\n            \"d\": \"從與指定行和列標題對應的數據透視錶中選取匯總值。\",\r\n            \"a\": \"從與指定行和列標題對應的數據透視錶中選取匯總值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data_field\",\r\n                    \"detail\": \"您想從數據透視錶中獲取其數據的值名稱。\\n值名稱必須括在引號中或是指向包含相關文字的任何儲存格的引用。\\n如果有多個值欄位,則必須使用數據透視錶中顯示的確切名稱（如\\\"銷售總額\\\"）。\"\r\n                },\r\n                {\r\n                    \"name\": \"pivot_table\",\r\n                    \"detail\": \"目標數據透視錶中的任何儲存格的引用（推薦位於頂角的儲存格）。\"\r\n                },\r\n                {\r\n                    \"name\": \"field1\",\r\n                    \"detail\": \"[可選] - 源數據集（不是數據透視錶）中列的名稱。\"\r\n                },\r\n                {\r\n                    \"name\": \"item1\",\r\n                    \"detail\": \"[可選] - 數據透視錶中顯示的與您要檢索的欄位名稱1相對應的行或列的名稱。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CHOOSE\": {\r\n            \"d\": \"基於索引返回選項清單中的元素。\",\r\n            \"a\": \"基於索引返回選項清單中的元素。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"index_num\",\r\n                    \"detail\": \"指定要返回哪一項。\\n\\n如果索引為零、負值或大於提供的選擇數量,將返回#VALUE！錯誤。\"\r\n                },\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"一項可能的返回值。必須提供。可以是儲存格引用或單獨的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"[可選] - 其他可以選擇的值。選擇\"\r\n                }\r\n            ]\r\n        },\r\n        \"HYPERLINK\": {\r\n            \"d\": \"在儲存格內創建一個超連結。\",\r\n            \"a\": \"在儲存格內創建一個超連結。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"網址\",\r\n                    \"detail\": \"以引號括住的連結位置的完整網址,或對包含這種網址的儲存格的引用。\\n\\n僅允許某些連結類型。其中包括:http://、https://、mailto:、aim:、ftp://、gopher://、telnet://和news://,明確禁用使用其他協定。如果指定的是其他協定,將會在儲存格中顯示連結標籤,但該標籤不會以連結形式呈現。\\n\\n如果未指定協定,則假設使用http://,並將其作為網址的首碼。\"\r\n                },\r\n                {\r\n                    \"name\": \"連結標籤\",\r\n                    \"detail\": \"[可選-默認為網址] - 要在儲存格中作為連結顯示的文字（用引號括起來的）,或者指向包含這種標籤的儲存格的引用。\\n\\n如果連結標籤是指向某個空儲存格的引用,如果網址有效,就將其作為連結顯示,否則作為純文字顯示。\\n\\n如果連結標籤為空字串常數（\\\"\\\"）,所在儲存格顯示的內容將為空白,但通過點擊該儲存格或轉入該儲存格仍然可以訪問連結。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TIME\": {\r\n            \"d\": \"將給定的小時、分鐘和秒轉換為時間。\",\r\n            \"a\": \"將給定的小時、分鐘和秒轉換為時間。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"小時\",\r\n                    \"detail\": \"0（零）到 32767 之間的數位,代表小時。\\n\\n任何大於 23 的值都會除以24,餘數將作為小時值。\"\r\n                },\r\n                {\r\n                    \"name\": \"分鐘\",\r\n                    \"detail\": \"0（零）到 32767 之間的數位,代表分鐘。\\n\\n任何大於 59 的值將轉換為小時和分鐘。\"\r\n                },\r\n                {\r\n                    \"name\": \"秒\",\r\n                    \"detail\": \"0（零）到 32767 之間的數位,代表秒。\\n\\n任何大於 59 的值將轉換為小時、分鐘和秒。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TIMEVALUE\": {\r\n            \"d\": \"按一天24小時返回該時間的分數表示。\",\r\n            \"a\": \"按一天24小時返回該時間的分數表示。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"time_text\",\r\n                    \"detail\": \"用於表示時間的字串。\"\r\n                }\r\n            ]\r\n        },\r\n        \"EOMONTH\": {\r\n            \"d\": \"返回某個月份最後一天的序號,該月份在另一個日期之前或之後的數個月（月數由參數指定）。\",\r\n            \"a\": \"返回某個月份最後一天的序號\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"用於計算結果的參照日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"months\",\r\n                    \"detail\": \"用於計算的起始日期之前（負）或之後（正）的月數。返回的是計算所得月份的最後那天。\"\r\n                }\r\n            ]\r\n        },\r\n        \"EDATE\": {\r\n            \"d\": \"返回表示某個日期的序號,該日期在另一個日期的數月之前/之後。\",\r\n            \"a\": \"返回表示某個日期的序號\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"用於計算結果的參照日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"months\",\r\n                    \"detail\": \"用於計算的起始日期之前（負）或之後（正）的月數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SECOND\": {\r\n            \"d\": \"返回時間值的秒數。秒數是0（零）到59範圍內的整數。\",\r\n            \"a\": \"返回時間值的秒數。秒數是0（零）到59範圍內的整數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"時間\",\r\n                    \"detail\": \"用於計算秒鐘部分的時間。必須為以下值之一:指向包含日期/時間值的儲存格的引用、返回日期/時間的函數或者數位。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MINUTE\": {\r\n            \"d\": \"以數位格式返回特定時間的分鐘部分。\",\r\n            \"a\": \"以數位格式返回特定時間的分鐘部分。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"時間\",\r\n                    \"detail\": \"用於計算分鐘部分的時間。必須為以下值之一:指向包含日期/時間值的儲存格的引用、返回日期/時間的函數或者數位。\"\r\n                }\r\n            ]\r\n        },\r\n        \"HOUR\": {\r\n            \"d\": \"以數位格式返回特定時間的小時部分。\",\r\n            \"a\": \"以數位格式返回特定時間的小時部分。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"時間\",\r\n                    \"detail\": \"用於計算小時部分的時間。必須為以下值之一:指向包含日期/時間值的儲存格的引用、返回日期/時間的函數或者數位。\"\r\n                }\r\n            ]\r\n        },\r\n        \"NOW\": {\r\n            \"d\": \"以日期值格式返回當前日期和時間。\",\r\n            \"a\": \"以日期值格式返回當前日期和時間。\",\r\n            \"p\": []\r\n        },\r\n        \"NETWORKDAYS\": {\r\n            \"d\": \"返回所提供的兩個日期之間的淨工作日天數。\",\r\n            \"a\": \"返回所提供的兩個日期之間的淨工作日天數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"用於計算淨工作日天數的時間段開始日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"end_date\",\r\n                    \"detail\": \"用於計算淨工作日天數的時間段結束日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"holidays\",\r\n                    \"detail\": \"[可選] - 一個範圍或數組常數,其中包含作為節假日的日期序號。\\n\\n在節假日數組中提供的值必須是日期序號值（例如由N所返回的值）或日期值（例如由DATE、DATEVALUE或TO_DATE返回的值）。由範圍指定的值應該是標準的日期值或日期序數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"NETWORKDAYS_INTL\": {\r\n            \"d\": \"返回給定的兩個日期之間的淨工作日天數（排除指定的週末和節假日）。\",\r\n            \"a\": \"返回給定的兩個日期之間的淨工作日天數（排除指定的週末和節假日）。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"用於計算淨工作日天數的時間段開始日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"end_date\",\r\n                    \"detail\": \"用於計算淨工作日天數的時間段結束日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"weekend\",\r\n                    \"detail\": \"[可選-預設值為1] - 用於表示哪些天為週末的數位或字串。\\n字串管道:可以使用由0和1組成的字串來指定週末,串中的第一個數位字元代表週一,最後一個則代表周日。零表示這一天是工作日,1 表示這一天為週末。例如,\\\"0000011\\\"表示將週六和周日作為週末。\\n數位管道:這種管道不使用上述字串形式,而是使用一個數位。1 =週六/周日為週末,2 =周日/週一為週末,依此類推則7 =週五/週六。11 =周日為唯一週末,12 =週一為唯一週末,依此類推則17 =週六為唯一週末。\"\r\n                },\r\n                {\r\n                    \"name\": \"holidays\",\r\n                    \"detail\": \"[可選] - 這是一個範圍或數組常數,其中包含作為節假日的日期。\\n在節假日數組內提供的值必須為日期序數值（例如N的返回值）或日期值（例如DATE、DATEVALUE或TO_DATE的返回值）。由範圍指定的值應該是標準的日期值或日期序數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISOWEEKNUM\": {\r\n            \"d\": \"返回給定日期在全年中的 ISO 周數。\",\r\n            \"a\": \"返回給定日期在全年中的 ISO 周數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"date\",\r\n                    \"detail\": \"用於日期和時間計算的日期-時間程式碼。\"\r\n                }\r\n            ]\r\n        },\r\n        \"WEEKNUM\": {\r\n            \"d\": \"返回特定日期的周數。\",\r\n            \"a\": \"返回特定日期的周數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"serial_number\",\r\n                    \"detail\": \"要確定其位於第幾周的日期,必須是對包含日期的儲存格的引用、返回日期類型的函數或者數位。\"\r\n                },\r\n                {\r\n                    \"name\": \"return_type\",\r\n                    \"detail\": \"[可選-預設值為1 ] - 代表一周起始日的數位,系統也使用該數位來確定一年的第一周（1=周日,2=週一）。\"\r\n                }\r\n            ]\r\n        },\r\n        \"WEEKDAY\": {\r\n            \"d\": \"返回一個數位,對應於給定日期所在的星期幾。\",\r\n            \"a\": \"返回一個數位,對應於給定日期所在的星期幾。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"serial_number\",\r\n                    \"detail\": \"要為其確定星期幾的日期。必須是對包含日期的儲存格的引用、返回日期類型的函數或者數位。\"\r\n                },\r\n                {\r\n                    \"name\": \"return_type\",\r\n                    \"detail\": \"[可選-預設值為1] -以數位訓示使用哪種編號順序來表示星期幾。默認情况下,按星期日（= 1）開始計算。\\n\\n如果類型為1,則星期值將從星期日開始算起,並且星期日的值為1,囙此星期六的值就是7。\\n\\n如果類型為2,則星期值將從星期一開始算起,並且星期一的值為1,囙此星期日的值就是7。\\n\\n如果類型為3,則星期值將從星期一算起,並且星期一的值為0,囙此星期日的值就是6。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DAY\": {\r\n            \"d\": \"以數位格式返回特定日期所在的當月幾號。\",\r\n            \"a\": \"以數位格式返回特定日期所在的當月幾號。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"serial_number\",\r\n                    \"detail\": \"要從中選取具體幾號的日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DAYS\": {\r\n            \"d\": \"返回兩個日期之間的天數。\",\r\n            \"a\": \"返回兩個日期之間的天數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"end_date\",\r\n                    \"detail\": \"計算中要使用的結束日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。\"\r\n                },\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"計算中要使用的開始日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DAYS360\": {\r\n            \"d\": \"按照每年360天,返回兩個日期之間的差（用於計算利息）。\",\r\n            \"a\": \"按照每年360天,返回兩個日期之間的差（用於計算利息）。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"計算中要使用的開始日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。\"\r\n                },\r\n                {\r\n                    \"name\": \"end_date\",\r\n                    \"detail\": \"計算中要使用的結束日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。\"\r\n                },\r\n                {\r\n                    \"name\": \"method\",\r\n                    \"detail\": \"[可選 - 默認為FALSE（）] - 訓示要使用哪種天數計算方法。\\n\\nFALSE -採用美國（NASD）方法時,如果起始日期為某月的最後一天,為便於計算,會將起始日期的當月幾號更改為30。此外,如果結束日期是所在月份的最後一天,而且起始日期在其所在月的30號之前,則將結束日期更改為結束日期之後那個月的第一天,否則將結束日期更改為該月的30號。\\n\\nTRUE -採用歐洲方法時,會將所有日期在31號的起始日期或結束日期更改為當月的30號。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATE\": {\r\n            \"d\": \"將提供的年、月、日轉換為日期。\",\r\n            \"a\": \"將提供的年、月、日轉換為日期。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"year\",\r\n                    \"detail\": \"日期的年份部分,包含一到四位數位。\\n\\n介於0（零）到 1899 之間,會將該值與 1900 相加來計算年份；\\n\\n介於 1900 到 9999 之間,將使用該數值作為年份；\\n\\n小於0或大於等於 10000,返回錯誤值#NUM！。\"\r\n                },\r\n                {\r\n                    \"name\": \"month\",\r\n                    \"detail\": \"日期的月份部分,一個正整數或負整數。\\n\\n如果 month 大於 12,則 month 會將該月份數與指定年中的第一個月相加。\\n\\n如果 month 小於 1,month 則從指定年份的一月份開始遞減該月份數,然後再加上 1 個月。\"\r\n                },\r\n                {\r\n                    \"name\": \"day\",\r\n                    \"detail\": \"日期的日部分,一個正整數或負整數。\\n\\n如果 day 大於月中指定的天數,則 day 會將天數與該月中的第一天相加。\\n\\n如果 day 小於1,則 day 從指定月份的第一天開始遞減該天數,然後再加上 1 天。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATEVALUE\": {\r\n            \"d\": \"將提供的日期字串轉換為日期的序號。\",\r\n            \"a\": \"將提供的日期字串轉換為日期的序號。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"date_text\",\r\n                    \"detail\": \"表示日期的字串。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATEDIF\": {\r\n            \"d\": \"計算兩個日期之間的天數、月數或年數。\",\r\n            \"a\": \"計算兩個日期之間的天數、月數或年數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"起始日期\",\r\n                    \"detail\": \"計算中要使用的開始日期。必須是對包含DATE值的儲存格的引用、返回DATE類型的函數或數位。\"\r\n                },\r\n                {\r\n                    \"name\": \"結束日期\",\r\n                    \"detail\": \"計算中要使用的結束日期。必須是對包含DATE值的儲存格的引用、返回DATE類型的函數或數位。\"\r\n                },\r\n                {\r\n                    \"name\": \"組織\",\r\n                    \"detail\": \"時間組織的縮寫文字。例如\\\"M\\\"代表月。有效值包括:\\\"Y\\\"、\\\"M\\\"、\\\"D\\\"、\\\"MD\\\"、\\\"YM\\\"和\\\"YD\\\"。\\n\\n\\\"Y\\\":返回起始日期和結束日期之間的整年數。\\n\\n\\\"M\\\":返回起始日期和結束日期之間的整月數。\\n\\n\\\"D\\\":返回起始日期和結束日期之間的天數。\\n\\n\\\"MD\\\":返回起始日期和結束日期之間的天數（不計整月數）。\\n\\n\\\"YM\\\":返回起始日期和結束日期之間的整月數（不計整年數）。\\n\\n\\\"YD\\\":返回起始日期和結束日期之間的天數（假設起始日期和結束日期的間隔不超過一年）。\"\r\n                }\r\n            ]\r\n        },\r\n        \"WORKDAY\": {\r\n            \"d\": \"指定工作日天數,計算結束日期。\",\r\n            \"a\": \"指定工作日天數,計算結束日期。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"計算的開始日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"days\",\r\n                    \"detail\": \"start_date之前或之後不含週末及節假日的天數。\\n\\n為正值將生成未來日期；\\n\\n為負值生成過去日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"holidays\",\r\n                    \"detail\": \"[可選] - 一個範圍或數組常數,其中包含作為節假日的日期序號。\\n\\n在節假日數組中提供的值必須是日期序號值（例如由N所返回的值）或日期值（例如由DATE、DATEVALUE或TO_DATE返回的值）。由範圍指定的值應該是標準的日期值或日期序數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"WORKDAY_INTL\": {\r\n            \"d\": \"返回指定的若干個工作日之前或之後的日期的序號（使用自定義週末參數）。 \",\r\n            \"a\": \"返回指定的若干個工作日之前或之後的日期的序號（使用自定義週末參數）。 \",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"開始日期（將被截尾取整）。\"\r\n                },\r\n                {\r\n                    \"name\": \"days\",\r\n                    \"detail\": \"start_date之前或之後的工作日的天數。\\n\\n正值表示未來日期；\\n\\n負值表示過去日期；\\n\\n零值表示開始日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"weekend\",\r\n                    \"detail\": \"[可選 - 預設值為1] - 用於表示哪些天為週末的數位或字串。\\n字串管道:可以使用由0和1組成的字串來指定週末,串中的第一個數位字元代表週一,最後一個則代表周日。零表示這一天是工作日,1表示這一天為週末。例如,\\\"0000011\\\"表示將週六和周日作為週末。\\n數位管道:這種管道不使用上述字串形式,而是使用一個數位。1 =週六/周日為週末,2 =周日/週一為週末,依此類推則7 =週五/週六。11 =周日為唯一週末,12 =週一為唯一週末,依此類推則17 =週六為唯一週末。\"\r\n                },\r\n                {\r\n                    \"name\": \"holidays\",\r\n                    \"detail\": \"[可選] - 這是一個範圍或數組常數,其中包含作為節假日的日期。\\n在節假日數組內提供的值必須為日期序數值（例如N的返回值）或日期值（例如DATE、DATEVALUE或TO_DATE的返回值）。由範圍指定的值應該是標準的日期值或日期序數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"YEAR\": {\r\n            \"d\": \"返回對應於某個日期的年份。Year作為 1900 - 9999 之間的整數返回。\",\r\n            \"a\": \"返回對應於某個日期的年份。Year作為 1900 - 9999 之間的整數返回。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"serial_number\",\r\n                    \"detail\": \"用於計算年份的日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。\"\r\n                }\r\n            ]\r\n        },\r\n        \"YEARFRAC\": {\r\n            \"d\": \"返回 start_date 和 end_date 之間的天數占全年天數的百分比。\",\r\n            \"a\": \"返回 start_date 和 end_date 之間的天數占全年天數的百分比。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"start_date\",\r\n                    \"detail\": \"計算中要使用的開始日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。\"\r\n                },\r\n                {\r\n                    \"name\": \"end_date\",\r\n                    \"detail\": \"計算中要使用的結束日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 要使用的日計數基準類型。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TODAY\": {\r\n            \"d\": \"以日期值格式返回當前日期。\",\r\n            \"a\": \"以日期值格式返回當前日期。\",\r\n            \"p\": []\r\n        },\r\n        \"MONTH\": {\r\n            \"d\": \"返回日期（以序列數表示）中的月份。月份是介於1（一月）到12（十二月）之間的整數。\",\r\n            \"a\": \"返回日期（以序列數表示）中的月份。月份是介於1（一月）到12（十二月）之間的整數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"serial_number\",\r\n                    \"detail\": \"要從中選取月份的日期。必須是以下一種:對包含日期的儲存格的引用、返回日期類型的函數或者數位。\"\r\n                }\r\n            ]\r\n        },\r\n        \"EFFECT\": {\r\n            \"d\": \"根據名義利率及每年的複利計息期數來計算實際年利率。\",\r\n            \"a\": \"根據名義利率及每年的複利計息期數來計算實際年利率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"nominal_rate\",\r\n                    \"detail\": \"每年的名義利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"npery\",\r\n                    \"detail\": \"每年的複利計算期數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DOLLAR\": {\r\n            \"d\": \"將數位格式設定為與語言區域相對應的貨幣格式。\",\r\n            \"a\": \"將數位格式設定為與語言區域相對應的貨幣格式。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要設定格式的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"decimals\",\r\n                    \"detail\": \"[可選 - 預設值為2] - 要顯示的小數位數。\\n\\n如果這是負數,則將數位四捨五入到小數點左側。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DOLLARDE\": {\r\n            \"d\": \"將以整數部分和分數部分轉換為以小數部分表示的金額數位\",\r\n            \"a\": \"將以整數部分和分數部分轉換為以小數部分表示的金額數位\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"fractional_dollar\",\r\n                    \"detail\": \"以整數部份和分數部分表示的數位,用小數點隔開。\"\r\n                },\r\n                {\r\n                    \"name\": \"fraction\",\r\n                    \"detail\": \"用作分數中的分母的整數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DOLLARFR\": {\r\n            \"d\": \"將小數轉換為分數表示的金額數位。\",\r\n            \"a\": \"將小數轉換為分數表示的金額數位。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"decimal_dollar\",\r\n                    \"detail\": \"小數。\"\r\n                },\r\n                {\r\n                    \"name\": \"fraction\",\r\n                    \"detail\": \"用作分數中的分母的整數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DB\": {\r\n            \"d\": \"使用固定餘額遞減法,返回指定期間內某項固定資產的折舊值。\",\r\n            \"a\": \"使用固定餘額遞減法,返回指定期間內某項固定資產的折舊值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cost\",\r\n                    \"detail\": \"資產原值。\"\r\n                },\r\n                {\r\n                    \"name\": \"salvage\",\r\n                    \"detail\": \"折舊末尾時的值（有時也稱為資產殘值）。\"\r\n                },\r\n                {\r\n                    \"name\": \"life\",\r\n                    \"detail\": \"資產的折舊期數（有時也稱作資產的使用壽命）。\"\r\n                },\r\n                {\r\n                    \"name\": \"period\",\r\n                    \"detail\": \"在使用期限內要計算折舊的折舊期。\"\r\n                },\r\n                {\r\n                    \"name\": \"month\",\r\n                    \"detail\": \"[可選 - 預設值為12] - 折舊第一年中的月數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DDB\": {\r\n            \"d\": \"用雙倍餘額遞減法,返回指定期間內某項固定資產的折舊值。\",\r\n            \"a\": \"用雙倍餘額遞減法,返回指定期間內某項固定資產的折舊值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cost\",\r\n                    \"detail\": \"资产原值。\"\r\n                },\r\n                {\r\n                    \"name\": \"salvage\",\r\n                    \"detail\": \"折舊末尾時的值（有時也稱為資產殘值）。\"\r\n                },\r\n                {\r\n                    \"name\": \"life\",\r\n                    \"detail\": \"資產的折舊期數（有時也稱作資產的使用壽命）。\"\r\n                },\r\n                {\r\n                    \"name\": \"period\",\r\n                    \"detail\": \"在使用期限內要計算折舊的折舊期。\"\r\n                },\r\n                {\r\n                    \"name\": \"factor\",\r\n                    \"detail\": \"[可選 - 預設值為2] - 折舊的遞減係數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"RATE\": {\r\n            \"d\": \"返回年金每期的利率。\",\r\n            \"a\": \"返回年金每期的利率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"nper\",\r\n                    \"detail\": \"年金的付款總期數。\"\r\n                },\r\n                {\r\n                    \"name\": \"pmt\",\r\n                    \"detail\": \"每期的付款金額,在年金週期內不能更改。\"\r\n                },\r\n                {\r\n                    \"name\": \"pv\",\r\n                    \"detail\": \"現值即一系列未來付款當前值的總和。\"\r\n                },\r\n                {\r\n                    \"name\": \"fv\",\r\n                    \"detail\": \"[可選 - 預設值為0] - 未來值,或在最後一次付款後希望得到的現金餘額。\"\r\n                },\r\n                {\r\n                    \"name\": \"type\",\r\n                    \"detail\": \"[可選 - 預設值為0] - 指定各期的付款時間是在期初還是期末。\\n\\n0表示期末；\\n\\n1表示期初。\"\r\n                },\r\n                {\r\n                    \"name\": \"guess\",\r\n                    \"detail\": \"[可選 - 預設值為0.1] - 預期利率。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CUMPRINC\": {\r\n            \"d\": \"基於等額分期付款和固定利率,計算投資在多個付款期內的累計本金償還額。\",\r\n            \"a\": \"基於等額分期付款和固定利率,計算投資在多個付款期內的累計本金償還額。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"nper\",\r\n                    \"detail\": \"總付款期數。\"\r\n                },\r\n                {\r\n                    \"name\": \"pv\",\r\n                    \"detail\": \"年金的現值。\"\r\n                },\r\n                {\r\n                    \"name\": \"start_period\",\r\n                    \"detail\": \"開始累計計算的付款期序號。\\n\\n首期必須大於等於1。\"\r\n                },\r\n                {\r\n                    \"name\": \"end_period\",\r\n                    \"detail\": \"結束累計計算的付款期序號。\\n\\n末期必須大於首期。\"\r\n                },\r\n                {\r\n                    \"name\": \"type\",\r\n                    \"detail\": \"指定各期的付款時間是在期初還是期末。\\n\\n0表示期末；\\n\\n1表示期初。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUPNUM\": {\r\n            \"d\": \"返回在結算日和到期日之間的付息次數，向上舍入到最近的整數\",\r\n            \"a\": \"返回在結算日和到期日之間的付息次數，向上舍入到最近的整數\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"年付息次數。\\n\\n如果按年支付,frequency = 1；\\n\\n按半年期支付,frequency = 2；\\n\\n按季支付,frequency = 4。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SYD\": {\r\n            \"d\": \"返回在指定期間內資產按年限總和折舊法計算的折舊。\",\r\n            \"a\": \"返回在指定期間內資產按年限總和折舊法計算的折舊。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cost\",\r\n                    \"detail\": \"資產原值。\"\r\n                },\r\n                {\r\n                    \"name\": \"salvage\",\r\n                    \"detail\": \"折舊末尾時的值（有時也稱為資產殘值）。\"\r\n                },\r\n                {\r\n                    \"name\": \"life\",\r\n                    \"detail\": \"資產的折舊期數（有時也稱作資產的使用壽命）。\"\r\n                },\r\n                {\r\n                    \"name\": \"period\",\r\n                    \"detail\": \"在使用期限內要計算折舊的折舊期。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TBILLEQ\": {\r\n            \"d\": \"基於貼現率計算美國政府短期債券的等效年化收益率。\",\r\n            \"a\": \"基於貼現率計算美國政府短期債券的等效年化收益率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"債券的結算日期,此日期為債券發行後交付給買家的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"債券的到期或結束日期,届時可將其以面值或票面價值贖回。\"\r\n                },\r\n                {\r\n                    \"name\": \"discount\",\r\n                    \"detail\": \"債券購買時的貼現率。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TBILLYIELD\": {\r\n            \"d\": \"基於價格計算美國政府短期債券的收益率。\",\r\n            \"a\": \"基於價格計算美國政府短期債券的收益率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"債券的結算日期,此日期為債券發行後交付給買家的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"債券的到期或結束日期,届時可將其以面值或票面價值贖回。\"\r\n                },\r\n                {\r\n                    \"name\": \"pr\",\r\n                    \"detail\": \"債券的購買價格。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TBILLPRICE\": {\r\n            \"d\": \"基於貼現率計算美國政府短期債券的價格。\",\r\n            \"a\": \"基於貼現率計算美國政府短期債券的價格。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"債券的結算日期,此日期為債券發行後交付給買家的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"債券的到期或結束日期,届時可將其以面值或票面價值贖回。\"\r\n                },\r\n                {\r\n                    \"name\": \"discount\",\r\n                    \"detail\": \"債券購買時的貼現率。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PV\": {\r\n            \"d\": \"基於等額分期付款和固定利率,計算年金投資的現值。\",\r\n            \"a\": \"基於等額分期付款和固定利率,計算年金投資的現值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"各期利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"nper\",\r\n                    \"detail\": \"年金的付款總期數。\"\r\n                },\r\n                {\r\n                    \"name\": \"pmt\",\r\n                    \"detail\": \"每期的付款金額,在年金週期內不能更改。\"\r\n                },\r\n                {\r\n                    \"name\": \"fv\",\r\n                    \"detail\": \"[可選] - 未來值,或在最後一次付款後希望得到的現金餘額。\"\r\n                },\r\n                {\r\n                    \"name\": \"type\",\r\n                    \"detail\": \"[可選 - 預設值為0] - 指定各期的付款時間是在期初還是期末。\\n\\n0表示期末；\\n\\n1表示期初。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ACCRINT\": {\r\n            \"d\": \"返回定期付息證券的應計利息。\",\r\n            \"a\": \"返回定期付息證券的應計利息。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"issue\",\r\n                    \"detail\": \"有價證券的發行日。\"\r\n                },\r\n                {\r\n                    \"name\": \"first_interest\",\r\n                    \"detail\": \"有價證券的首次計息日。\"\r\n                },\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"有價證券的年息票利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"par\",\r\n                    \"detail\": \"證券的票面值。\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"年付息次數。\\n\\n如果按年支付,frequency = 1；\\n\\n按半年期支付,frequency = 2；\\n\\n按季支付,frequency = 4。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"\\\"歐洲30/360\\\"方法\\\"-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                },\r\n                {\r\n                    \"name\": \"calc_method\",\r\n                    \"detail\": \"[可選 - 默認為TRUE（）] - 一個邏輯值,指定當結算日期晚於首次計息日期時用於計算總應計利息的方法。\\n\\n如果值為TRUE,則返回從發行日到結算日的總應計利息。\\n\\n如果值為FALSE,則返回從首次計息日到結算日的應計利息。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ACCRINTM\": {\r\n            \"d\": \"返回在到期日支付利息的有價證券的應計利息。\",\r\n            \"a\": \"返回在到期日支付利息的有價證券的應計利息。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"issue\",\r\n                    \"detail\": \"有價證券的發行日。\"\r\n                },\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的到期日。\"\r\n                },\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"有價證券的年息票利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"par\",\r\n                    \"detail\": \"證券的票面值。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUPDAYBS\": {\r\n            \"d\": \"返回從付息期開始到結算日的天數。\",\r\n            \"a\": \"返回從付息期開始到結算日的天數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"年付息次數。\\n\\n如果按年支付,frequency = 1；\\n\\n按半年期支付,frequency = 2；\\n\\n按季支付,frequency = 4。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUPDAYS\": {\r\n            \"d\": \"返回結算日所在的付息期的天數。\",\r\n            \"a\": \"返回結算日所在的付息期的天數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"年付息次數。\\n\\n如果按年支付,frequency = 1；\\n\\n按半年期支付,frequency = 2；\\n\\n按季支付,frequency = 4。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] -訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUPDAYSNC\": {\r\n            \"d\": \"返回從結算日到下一票息支付日之間的天數。\",\r\n            \"a\": \"返回從結算日到下一票息支付日之間的天數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"年付息次數。\\n\\n如果按年支付,frequency = 1；\\n\\n按半年期支付,frequency = 2；\\n\\n按季支付,frequency = 4。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法  - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUPNCD\": {\r\n            \"d\": \"計算結算日之後的下一票息或利息派發日期。\",\r\n            \"a\": \"計算結算日之後的下一票息或利息派發日期。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"年付息次數。\\n\\n如果按年支付,frequency = 1；\\n\\n按半年期支付,frequency = 2；\\n\\n按季支付,frequency = 4。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COUPPCD\": {\r\n            \"d\": \"計算結算日之前的最後一個票息或利息支付日。\",\r\n            \"a\": \"計算結算日之前的最後一個票息或利息支付日。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"年付息次數。\\n\\n如果按年支付,frequency = 1；\\n\\n按半年期支付,frequency = 2；\\n\\n按季支付,frequency = 4 。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"FV\": {\r\n            \"d\": \"基於等額分期付款和固定利率,計算年金投資的未來價值。\",\r\n            \"a\": \"基於等額分期付款和固定利率,計算年金投資的未來價值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"各期利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"nper\",\r\n                    \"detail\": \"年金的付款總期數。\"\r\n                },\r\n                {\r\n                    \"name\": \"pmt\",\r\n                    \"detail\": \"各期所應支付的金額,在整個年金期間保持不變。\"\r\n                },\r\n                {\r\n                    \"name\": \"pv\",\r\n                    \"detail\": \"[可選 - 預設值為0 ] - 現值,或一系列未來付款的當前值的累積和。\"\r\n                },\r\n                {\r\n                    \"name\": \"type\",\r\n                    \"detail\": \"[可選 - 預設值為0 ] - 指定各期的付款時間是在期初還是期末。\\n\\n0表示期末；\\n\\n1表示期初。\"\r\n                }\r\n            ]\r\n        },\r\n        \"FVSCHEDULE\": {\r\n            \"d\": \"返回應用一系列複利率計算的初始本金的未來值。\",\r\n            \"a\": \"返回應用一系列複利率計算的初始本金的未來值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"principal\",\r\n                    \"detail\": \"現值。\"\r\n                },\r\n                {\r\n                    \"name\": \"schedule\",\r\n                    \"detail\": \"用於計算本金複利的一組利率。\\n\\n利率錶必須是範圍或數組,其中包含要用於計算複利的一組利率。這些利率值應該以十進位小數形式表示,或者使用UNARY_PERCENT以百分比形式表示,即表示為0.09或UNARY_PERCENT（9）,而不要表示為9。\"\r\n                }\r\n            ]\r\n        },\r\n        \"YIELD\": {\r\n            \"d\": \"返回定期支付利息的債券的收益率。\",\r\n            \"a\": \"返回定期支付利息的債券的收益率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"有價證券的年息票利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"pr\",\r\n                    \"detail\": \"有價證券的價格。\"\r\n                },\r\n                {\r\n                    \"name\": \"redemption\",\r\n                    \"detail\": \"有價證券的清償價值。\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"年付息次數。\\n\\n如果按年支付,frequency = 1；\\n\\n按半年期支付,frequency = 2；\\n\\n按季支付,frequency = 4。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法 - 此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"YIELDDISC\": {\r\n            \"d\": \"基於價格計算折價發行的（不帶息）債券的年收益率。\",\r\n            \"a\": \"基於價格計算折價發行的（不帶息）債券的年收益率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"pr\",\r\n                    \"detail\": \"有價證券的價格。\"\r\n                },\r\n                {\r\n                    \"name\": \"redemption\",\r\n                    \"detail\": \"有價證券的清償價值。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法 - 此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"NOMINAL\": {\r\n            \"d\": \"基於給定的實際利率和年複利期數,返回名義年利率。\",\r\n            \"a\": \"基於給定的實際利率和年複利期數,返回名義年利率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"effect_rate\",\r\n                    \"detail\": \"每年的實際利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"npery\",\r\n                    \"detail\": \"每年的複利期數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"XIRR\": {\r\n            \"d\": \"返回一組不一定定期發生的現金流的內部收益率。\",\r\n            \"a\": \"返回一組不一定定期發生的現金流的內部收益率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"values\",\r\n                    \"detail\": \"其中含有投資相關收益或支出的數組或範圍。\\n\\n現金流數額中必須至少包含一項負的和一項正的現金流金額才能計算回報率。\"\r\n                },\r\n                {\r\n                    \"name\": \"dates\",\r\n                    \"detail\": \"與現金流數額參數中的現金流對應的日期數組或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"guess\",\r\n                    \"detail\": \"[可選 - 預設值為0.1] - 對內部回報率的估算值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MIRR\": {\r\n            \"d\": \"返回一系列定期現金流的修改後內部收益率。\",\r\n            \"a\": \"返回一系列定期現金流的修改後內部收益率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"values\",\r\n                    \"detail\": \"其中含有投資相關收益或支出的數組或範圍。\\n\\n現金流數額中必須至少包含一項負的和一項正的現金流金額才能計算回報率。\"\r\n                },\r\n                {\r\n                    \"name\": \"finance_rate\",\r\n                    \"detail\": \"現金流中使用的資金支付的利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"reinvest_rate\",\r\n                    \"detail\": \"將現金流再投資的收益率。\"\r\n                }\r\n            ]\r\n        },\r\n        \"IRR\": {\r\n            \"d\": \"返回由值中的數位表示的一系列現金流的內部收益率。 \",\r\n            \"a\": \"返回由值中的數位表示的一系列現金流的內部收益率。 \",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"values\",\r\n                    \"detail\": \"其中含有投資相關收益或支出的數組或範圍。\\n\\n現金流數額中必須至少包含一項負的和一項正的現金流金額才能計算回報率。\"\r\n                },\r\n                {\r\n                    \"name\": \"guess\",\r\n                    \"detail\": \"[可選 - 默認為0.1] - 內部收益率的估值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"NPV\": {\r\n            \"d\": \"使用貼現率和一系列未來支出（負值）和收益（正值）來計算一項投資的淨現值。\",\r\n            \"a\": \"使用貼現率和一系列未來支出（負值）和收益（正值）來計算一項投資的淨現值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"某一期間的貼現率。\"\r\n                },\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"第一筆支出（負值）和收益（正值）。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2, ...\",\r\n                    \"detail\": \"[可選] - 其他支出（負值）和收益（正值）。\"\r\n                }\r\n            ]\r\n        },\r\n        \"XNPV\": {\r\n            \"d\": \"返回一組現金流的淨現值,這些現金流不一定定期發生。\",\r\n            \"a\": \"返回一組現金流的淨現值,這些現金流不一定定期發生。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"應用於現金流的貼現率。\"\r\n                },\r\n                {\r\n                    \"name\": \"values\",\r\n                    \"detail\": \"與dates中的支付時間相對應的一系列現金流。\"\r\n                },\r\n                {\r\n                    \"name\": \"dates\",\r\n                    \"detail\": \"與現金流支付相對應的支付日期錶。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CUMIPMT\": {\r\n            \"d\": \"基於等額分期付款和固定利率,計算投資在一系列付款期內的累計利息。\",\r\n            \"a\": \"基於等額分期付款和固定利率,計算投資在一系列付款期內的累計利息。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"利息率。\"\r\n                },\r\n                {\r\n                    \"name\": \"nper\",\r\n                    \"detail\": \"總付款期數。\"\r\n                },\r\n                {\r\n                    \"name\": \"pv\",\r\n                    \"detail\": \"現值。\"\r\n                },\r\n                {\r\n                    \"name\": \"start_period\",\r\n                    \"detail\": \"開始累計計算的付款期序號。\\n\\n首期必須大於等於1。\"\r\n                },\r\n                {\r\n                    \"name\": \"end_period\",\r\n                    \"detail\": \"結束累計計算的付款期序號。\\n\\n末期必須大於首期。\"\r\n                },\r\n                {\r\n                    \"name\": \"type\",\r\n                    \"detail\": \"指定各期的付款時間是在期初還是期末。\\n\\n0表示期末；\\n\\n1表示期初。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PMT\": {\r\n            \"d\": \"用於根據固定付款額和固定利率計算貸款的付款額。\",\r\n            \"a\": \"用於根據固定付款額和固定利率計算貸款的付款額。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"貸款利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"nper\",\r\n                    \"detail\": \"該項貸款的付款總數。\"\r\n                },\r\n                {\r\n                    \"name\": \"pv\",\r\n                    \"detail\": \"現值,或一系列未來付款額現在所值的總額,也叫本金。\"\r\n                },\r\n                {\r\n                    \"name\": \"fv\",\r\n                    \"detail\": \"[可選 - 預設值為0] - 未來值,或在最後一次付款後希望得到的現金餘額。\"\r\n                },\r\n                {\r\n                    \"name\": \"type\",\r\n                    \"detail\": \"[可選 - 預設值為0] - 指定各期的付款時間是在期初還是期末。\\n\\n0表示期末；\\n\\n1表示期初。\"\r\n                }\r\n            ]\r\n        },\r\n        \"IPMT\": {\r\n            \"d\": \"基於固定利率及等額分期付款管道,返回給定期數內對投資的利息償還額。\",\r\n            \"a\": \"基於固定利率及等額分期付款管道,返回給定期數內對投資的利息償還額。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"各期利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"per\",\r\n                    \"detail\": \"用於計算其利息數額的期數,必須在1到nper之間。\"\r\n                },\r\n                {\r\n                    \"name\": \"nper\",\r\n                    \"detail\": \"年金的付款總期數。\"\r\n                },\r\n                {\r\n                    \"name\": \"pv\",\r\n                    \"detail\": \"現值,或一系列未來付款的當前值的累積和。\"\r\n                },\r\n                {\r\n                    \"name\": \"fv\",\r\n                    \"detail\": \"[可選 - 預設值為0] - 未來值,或在最後一次付款後希望得到的現金餘額。\"\r\n                },\r\n                {\r\n                    \"name\": \"type\",\r\n                    \"detail\": \"[可選 - 預設值為0] - 指定各期的付款時間是在期初還是期末。\\n\\n0表示期末；\\n\\n1表示期初。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PPMT\": {\r\n            \"d\": \"返回根據定期固定付款和固定利率而定的投資在已知期間內的本金償付額。\",\r\n            \"a\": \"返回根據定期固定付款和固定利率而定的投資在已知期間內的本金償付額。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"各期利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"per\",\r\n                    \"detail\": \"指定期數,該值必須在 1 到 nper 範圍內。\"\r\n                },\r\n                {\r\n                    \"name\": \"nper\",\r\n                    \"detail\": \"年金的付款總期數。\"\r\n                },\r\n                {\r\n                    \"name\": \"pv\",\r\n                    \"detail\": \"現值即一系列未來付款當前值的總和。\"\r\n                },\r\n                {\r\n                    \"name\": \"fv\",\r\n                    \"detail\": \"[可選 - 預設值為0] - 未來值,或在最後一次付款後希望得到的現金餘額。\"\r\n                },\r\n                {\r\n                    \"name\": \"type\",\r\n                    \"detail\": \"[可選 - 預設值為0] - 指定各期的付款時間是在期初還是期末。\\n\\n0表示期末；\\n\\n1表示期初。\"\r\n                }\r\n            ]\r\n        },\r\n        \"INTRATE\": {\r\n            \"d\": \"返回完全投資型證券的利率。\",\r\n            \"a\": \"返回完全投資型證券的利率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"investment\",\r\n                    \"detail\": \"有價證券的投資額。\"\r\n                },\r\n                {\r\n                    \"name\": \"redemption\",\r\n                    \"detail\": \"有價證券到期時的兌換值。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法-此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法 - 此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法-此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PRICE\": {\r\n            \"d\": \"返回定期付息的面值￥100的有價證券的價格。\",\r\n            \"a\": \"返回定期付息的面值￥100的有價證券的價格。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"有價證券的年息票利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"yld\",\r\n                    \"detail\": \"有價證券的年收益率。\"\r\n                },\r\n                {\r\n                    \"name\": \"redemption\",\r\n                    \"detail\": \"面值￥100的有價證券的清償價值。\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"年付息次數。\\n\\n如果按年支付,frequency = 1；\\n\\n按半年期支付,frequency = 2；\\n\\n按季支付,frequency = 4。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PRICEDISC\": {\r\n            \"d\": \"返回折價發行的面值￥100的有價證券的價格。\",\r\n            \"a\": \"返回折價發行的面值￥100的有價證券的價格。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"discount\",\r\n                    \"detail\": \"有价证券的贴现率。\"\r\n                },\r\n                {\r\n                    \"name\": \"redemption\",\r\n                    \"detail\": \"面值￥100的有價證券的清償價值。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PRICEMAT\": {\r\n            \"d\": \"返回到期付息的面值￥100的有價證券的價格。\",\r\n            \"a\": \"返回到期付息的面值￥100的有價證券的價格。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"issue\",\r\n                    \"detail\": \"有價證券的發行日。\"\r\n                },\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"有價證券在發行日的利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"yld\",\r\n                    \"detail\": \"有價證券的年收益率。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"RECEIVED\": {\r\n            \"d\": \"返回一次性付息的有價證券到期收回的金額。\",\r\n            \"a\": \"返回一次性付息的有價證券到期收回的金額。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"investment\",\r\n                    \"detail\": \"有價證券的投資額。\"\r\n                },\r\n                {\r\n                    \"name\": \"discount\",\r\n                    \"detail\": \"有價證券的貼現率。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DISC\": {\r\n            \"d\": \"返回有價證券的貼現率。\",\r\n            \"a\": \"返回有價證券的貼現率。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"pr\",\r\n                    \"detail\": \"有價證券的價格（按面值為￥100計算）。\"\r\n                },\r\n                {\r\n                    \"name\": \"redemption\",\r\n                    \"detail\": \"面值￥100的有價證券的清償價值。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"NPER\": {\r\n            \"d\": \"基於固定利率及等額分期付款管道,返回某項投資的總期數。\",\r\n            \"a\": \"基於固定利率及等額分期付款管道,返回某項投資的總期數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rate\",\r\n                    \"detail\": \"各期利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"pmt\",\r\n                    \"detail\": \"各期所應支付的金額,在整個年金期間保持不變。\"\r\n                },\r\n                {\r\n                    \"name\": \"pv\",\r\n                    \"detail\": \"現值,或一系列未來付款的當前值的累積和。\"\r\n                },\r\n                {\r\n                    \"name\": \"fv\",\r\n                    \"detail\": \"[可選 - 預設值為0] - 未來值,或在最後一次付款後希望得到的現金餘額。\"\r\n                },\r\n                {\r\n                    \"name\": \"type\",\r\n                    \"detail\": \"[可選 - 預設值為0] - 指定各期的付款時間是在期初還是期末。\\n\\n0表示期末；\\n\\n1表示期初。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SLN\": {\r\n            \"d\": \"返回一個期間內的資產的直線折舊。\",\r\n            \"a\": \"返回一個期間內的資產的直線折舊。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cost\",\r\n                    \"detail\": \"資產原值。\"\r\n                },\r\n                {\r\n                    \"name\": \"salvage\",\r\n                    \"detail\": \"折舊末尾時的值（有時也稱為資產殘值）。\"\r\n                },\r\n                {\r\n                    \"name\": \"life\",\r\n                    \"detail\": \"資產的折舊期數（有時也稱作資產的使用壽命）。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DURATION\": {\r\n            \"d\": \"返回假設面值￥100的定期付息有價證券的修正期限。\",\r\n            \"a\": \"返回假設面值￥100的定期付息有價證券的修正期限。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"coupon\",\r\n                    \"detail\": \"有價證券的年息票利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"yld\",\r\n                    \"detail\": \"有價證券的年收益率。\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"年付息次數。\\n\\n如果按年支付,frequency = 1；\\n\\n按半年期支付,frequency = 2；\\n\\n按季支付,frequency = 4。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MDURATION\": {\r\n            \"d\": \"返回假設面值￥100的有價證券的Macauley修正期限。\",\r\n            \"a\": \"返回假設面值￥100的有價證券的Macauley修正期限。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"settlement\",\r\n                    \"detail\": \"有價證券的結算日。有價證券結算日是在發行日之後,有價證券賣給購買者的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"maturity\",\r\n                    \"detail\": \"有價證券的到期日。到期日是有價證券有效期截止時的日期。\"\r\n                },\r\n                {\r\n                    \"name\": \"coupon\",\r\n                    \"detail\": \"有價證券的年息票利率。\"\r\n                },\r\n                {\r\n                    \"name\": \"yld\",\r\n                    \"detail\": \"有價證券的年收益率。\"\r\n                },\r\n                {\r\n                    \"name\": \"frequency\",\r\n                    \"detail\": \"年付息次數。\\n\\n如果按年支付,frequency = 1；\\n\\n按半年期支付,frequency = 2；\\n\\n按季支付,frequency = 4。\"\r\n                },\r\n                {\r\n                    \"name\": \"basis\",\r\n                    \"detail\": \"[可選 - 默認為0] - 訓示要使用哪種天數計算方法。\\n\\n0表示\\\"美國（NASD）30/360\\\"方法 - 此方法按照美國全國證券交易商協會標準,假設每月30天、每年360天,並對所輸入的月末日期進行具體調整。\\n\\n1表示\\\"實際/實際\\\"方法-此方法計算基於指定日期之間的實際天數和所涉及的年份中的實際天數進行計算。此方法用於美國長期債券,也是在非財經用途方面使用最多的方法。\\n\\n2表示\\\"實際/360\\\"方法 - 此方法基於指定日期之間的實際天數進行計算, 但假定每年為360天。\\n\\n3表示\\\"實際/365\\\"方法 - 此方法基於指定日期之間的實際天數進行計算,但假定每年為365天。\\n\\n4表示\\\"歐洲30 / 360\\\"方法-類似於0,此方法基於每月30天、每年360天進行計算,但按照歐洲金融慣例對月末日期進行調整。\"\r\n                }\r\n            ]\r\n        },\r\n        \"BIN2DEC\": {\r\n            \"d\": \"將二進位數轉換為十進位數。\",\r\n            \"a\": \"將二進位數轉換為十進位數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要轉換為十進位數的帶符號的10位二進位數值（以字串形式提供）。\\n\\n帶符號的二進位數的最高位是符號位；也就是說,負數是以二的補數形式表示的。\\n\\n對於此函數,最大的正數輸入值為0111111111,最小的負數輸入值為1000000000。\\n\\n如果所提供的帶符號的二進位數是有效的二進位數,會自動將其轉換為相應的字串輸入。例如,BIN2DEC（100）和BIN2DEC（\\\"100\\\"）得出的結果相同,均為4。\"\r\n                }\r\n            ]\r\n        },\r\n        \"BIN2HEX\": {\r\n            \"d\": \"將二進位數轉換為十六進位數。\",\r\n            \"a\": \"將二進位數轉換為十六進位數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要轉換為帶符號的十六進位數的帶符號的10位二進位數值（以字串形式提供）。\\n\\n帶符號的二進位數的最高位是符號位；也就是說,負數是以二的補數形式表示的。\\n\\n對於此函數,最大的正數輸入值為0111111111,最小的負數輸入值為1000000000。\\n\\n如果所提供的帶符號的二進位數是有效的二進位數,會自動將其轉換為相應的字串輸入。例如,BIN2HEX（11111）和BIN2HEX（\\\"11111\\\"）得出的結果相同,均為1F。\"\r\n                },\r\n                {\r\n                    \"name\": \"places\",\r\n                    \"detail\": \"[ 可選 ] -結果中要確保的有效位數。\\n\\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。例如,BIN2HEX（\\\"11111\\\",8）所得的結果值為0000001F。\\n\\n如果帶符號的二進位數的最高位為1,則忽略此值；即當提供的帶符號的二進位數大於等於1000000000時忽略此值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"BIN2OCT\": {\r\n            \"d\": \"二進位數轉換為八進制數。\",\r\n            \"a\": \"二進位數轉換為八進制數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要轉換為帶符號的八進制數的帶符號的10位二進位數值（以字串形式提供）。\\n\\n帶符號的二進位數的最高位是符號位；也就是說,負數是以二的補數形式表示的。\\n\\n對於此函數,最大的正數輸入值為0111111111,最小的負數輸入值為1000000000。\\n\\n如果所提供的帶符號的二進位數是有效的二進位數,會自動將其轉換為相應的字串輸入。例如,BIN2OCT（11111）和BIN2OCT（\\\"11111\\\"）得出的結果相同,均為37。\"\r\n                },\r\n                {\r\n                    \"name\": \"places\",\r\n                    \"detail\": \"[ 可選 ] - 結果中要確保的有效位數。\\n\\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。例如,BIN2OCT（\\\"11111\\\"）得到的結果值為00000037。\\n\\n如果帶符號的二進位數的最高位為1,則忽略此值；即當提供的帶符號的二進位數大於等於1000000000時忽略此值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DEC2BIN\": {\r\n            \"d\": \"將十進位數轉換為二進位數。\",\r\n            \"a\": \"將十進位數轉換為二進位數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要轉換為帶符號的二進位數的十進位數值（以字串形式提供）。\\n\\n對於此函數,最大的正數輸入值為511,最小的負數輸入值為-512。\\n\\n如果所提供的十進位數是有效的十進位數,會自動將其轉換為相應的字串輸入。例如,DEC2BIN（199）和DEC2BIN（\\\"199\\\"）得出的結果相同,均為11000111。\"\r\n                },\r\n                {\r\n                    \"name\": \"places\",\r\n                    \"detail\": \"[ 可選 ] - 結果中要確保的有效位數。\\n\\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\\n\\n如果十進位數為負數,則忽略此值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DEC2HEX\": {\r\n            \"d\": \"將十進位數轉換為十六進位數。\",\r\n            \"a\": \"將十進位數轉換為十六進位數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要轉換為帶符號的十六進位數的十進位數值（以字串形式提供）。\\n\\n此函數可接受的最大正數值為549755813887,最小負數值為-549755814888。\\n\\n如果所提供的十進位數是有效的十進位數,會自動將其轉換為相應的字串輸入。例如,DEC2HEX（100）和DEC2HEX（\\\"100\\\"）得出的結果相同,均為64。\"\r\n                },\r\n                {\r\n                    \"name\": \"places\",\r\n                    \"detail\": \"[ 可選 ] - 結果中要確保的有效位數。\\n\\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\\n\\n如果十進位數為負數,則忽略此值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DEC2OCT\": {\r\n            \"d\": \"將十進位數轉換為八進制數。\",\r\n            \"a\": \"將十進位數轉換為八進制數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要轉換為帶符號的八進制數的十進位數值（以字串形式提供）。\\n\\n此函數可接受的最大正數值為536870911,最小負數值為-53687092。\\n\\n如果所提供的十進位數是有效的十進位數,會自動將其轉換為相應的字串輸入。例如,DEC2OCT（199）和DEC2OCT（\\\"199\\\"）得出的結果相同,均為307。\"\r\n                },\r\n                {\r\n                    \"name\": \"places\",\r\n                    \"detail\": \"[ 可選 ] -結果中要確保的有效位數。\\n\\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\\n\\n如果十進位數為負數,則忽略此值 。\"\r\n                }\r\n            ]\r\n        },\r\n        \"HEX2BIN\": {\r\n            \"d\": \"將十六進位數轉換為二進位數。\",\r\n            \"a\": \"將十六進位數轉換為二進位數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要轉換為帶符號的二進位數的帶符號的40位十六進位數值（以字串形式提供）。\\n\\n帶符號的十六進位數的最高位是符號位；也就是說,負數是以二的補數形式表示的。\\n\\n此函數可接受的最大正數值為1FF,最小負數值為FFFFFFFE00。\\n\\n如果所提供的帶符號的十六進位數是有效的十六進位數,函數會自動將其轉換為相應的字串輸入。例如,HEX2BIN（199）和HEX2BIN（\\\"199\\\"）得出的結果相同,均為110011001。\"\r\n                },\r\n                {\r\n                    \"name\": \"places\",\r\n                    \"detail\": \"[ 可選 ] - 結果中要確保的有效位數。\\n\\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\\n\\n如果帶符號的十六進位數的最高位為1,則忽略此值；即當提供的帶符號的十六進位數大於等於8000000000時忽略此值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"HEX2DEC\": {\r\n            \"d\": \"將十六進位數轉換為十進位數。\",\r\n            \"a\": \"將十六進位數轉換為十進位數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要轉換為十進位數的帶符號的40位十六進位數值（以字串形式提供）。\\n\\n帶符號的十六進位數的最高位是符號位；也就是說,負數是以二的補數形式表示的。\\n\\n此函數可接受的最大正數值為7fffffffff,最小負數值為8000000000。\\n\\n如果所提供的帶符號的十六進位數是有效的十六進位數,函數會自動將其轉換為相應的字串輸入。例如,HEX2DEC（199）和HEX2DEC（\\\"199\\\"）得出的結果相同,均為409 。\"\r\n                }\r\n            ]\r\n        },\r\n        \"HEX2OCT\": {\r\n            \"d\": \"將十六進位數轉換為八進制數。\",\r\n            \"a\": \"將十六進位數轉換為八進制數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要轉換為帶符號的八進制數的帶符號的40位十六進位數值（以字串形式提供）。\\n\\n帶符號的十六進位數的最高位是符號位；也就是說,負數是以二的補數形式表示的。\\n\\n此函數可接受的最大正數值為1FFFFFFF,最小負數值為FFE0000000。\\n\\n如果所提供的帶符號的十六進位數是有效的十六進位數,函數會自動將其轉換為相應的字串輸入。例如,HEX2OCT（199）和HEX2OCT（\\\"199\\\"）得出的結果相同,均為631。\"\r\n                },\r\n                {\r\n                    \"name\": \"places\",\r\n                    \"detail\": \"[ 可選 ] - 結果中要確保的有效位數。\\n\\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\\n\\n如果帶符號的十六進位數的最高位為1,則忽略此值；即當給定的帶符號的十六進位數大於等於8000000000時忽略此值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"OCT2BIN\": {\r\n            \"d\": \"將八進制數轉換為二進位數。\",\r\n            \"a\": \"將八進制數轉換為二進位數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要轉換為帶符號的二進位數的帶符號的30位八進制數值（以字串形式提供）。\\n\\n帶符號的八進制數的最高位是符號位；也就是說,負數是以二的補數形式表示的。\\n\\n此函數可接受的最大正數值為777,最小負數值為7777777000。\\n\\n如果所提供的帶符號的八進制數是有效的八進制數,函數會自動將其轉換為相應的字串輸入。例如,OCT2BIN（177）和OCT2BIN（\\\"177\\\"）得出的結果相同,均為1111111。\"\r\n                },\r\n                {\r\n                    \"name\": \"places\",\r\n                    \"detail\": \"[ 可選 ] - 結果中要確保的有效位數。\\n\\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\\n\\n如果帶符號的八進制數的最高位為1,則忽略此值；即當給定的帶符號的八進制數大於等於4000000000時忽略此值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"OCT2DEC\": {\r\n            \"d\": \"將八進制數轉換為十進位數。\",\r\n            \"a\": \"將八進制數轉換為十進位數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要轉換為十進位數的帶符號的30位八進制數值（以字串形式提供）。\\n\\n帶符號的ba進制數的最高位是符號位；也就是說,負數是以二的補數形式表示的。\\n\\n此函數可接受的最大正數值為3777777777,最小負數值為4000000000。\\n\\n如果所提供的帶符號的八進制數是有效的八進制數,函數會自動將其轉換為相應的字串輸入。例如,OCT2DEC（177）和OCT2DEC（\\\"177\\\"）得出的結果相同,均為127。\"\r\n                }\r\n            ]\r\n        },\r\n        \"OCT2HEX\": {\r\n            \"d\": \"將八進制數轉換為十六進位數。\",\r\n            \"a\": \"將八進制數轉換為十六進位數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要轉換為帶符號的十六進位數的帶符號的30位八進制數值（以字串形式提供）。\\n\\n帶符號的ba進制數的最高位是符號位；也就是說,負數是以二的補數形式表示的。\\n\\n此函數可接受的最大正數值為3777777777,最小負數值為4000000000。\\n\\n如果所提供的帶符號的八進制數是有效的八進制數,函數會自動將其轉換為相應的字串輸入。例如,OCT2HEX（177）和OCT2HEX（\\\"177\\\"）得出的結果相同,均為7F。\"\r\n                },\r\n                {\r\n                    \"name\": \"places\",\r\n                    \"detail\": \"[ 可選 ] - 結果中要確保的有效位數。\\n\\n如果設定的有效位數大於結果中的有效位數,則在結果的左側填充0,使總有效位數達到有效位數。\\n\\n如果帶符號的八進制數的最高位為1,則忽略此值；即當給定的帶符號的八進制數大於等於4000000000時忽略此值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"COMPLEX\": {\r\n            \"d\": \"將實係數及虛係數轉換為 x+yi 或 x+yj 形式的複數。\",\r\n            \"a\": \"將實係數及虛係數轉換為 x+yi 或 x+yj 形式的複數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"real_num\",\r\n                    \"detail\": \"複數的實係數。\"\r\n                },\r\n                {\r\n                    \"name\": \"i_num\",\r\n                    \"detail\": \"複數的虛係數。\"\r\n                },\r\n                {\r\n                    \"name\": \"suffix\",\r\n                    \"detail\": \"[可選 - 默認為\\\"i\\\"] - 複數中虛係數的尾碼。\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMREAL\": {\r\n            \"d\": \"返回以 x+yi 或 x+yj 文本格式表示的複數的實係數。\",\r\n            \"a\": \"返回以 x+yi 或 x+yj 文本格式表示的複數的實係數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"inumber\",\r\n                    \"detail\": \"需要計算其實係數的複數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMAGINARY\": {\r\n            \"d\": \"返回以 x+yi 或 x+yj 文本格式表示的複數的虛係數。\",\r\n            \"a\": \"返回以 x+yi 或 x+yj 文本格式表示的複數的虛係數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"inumber\",\r\n                    \"detail\": \"需要計算其虛係數的複數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMCONJUGATE\": {\r\n            \"d\": \"返回以 x+yi 或 x+yj 文本格式表示的複數的共軛複數。\",\r\n            \"a\": \"返回以 x+yi 或 x+yj 文本格式表示的複數的共軛複數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"inumber\",\r\n                    \"detail\": \"需要計算其共軛數的複數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMABS\": {\r\n            \"d\": \"返回以 x+yi 或 x+yj 文本格式表示的複數的絕對值（模）。\",\r\n            \"a\": \"返回以 x+yi 或 x+yj 文本格式表示的複數的絕對值（模）。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"inumber\",\r\n                    \"detail\": \"要計算其絕對值的複數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DELTA\": {\r\n            \"d\": \"檢驗兩個值是否相等。如果 number1=number2,則返回1；否則返回0。\",\r\n            \"a\": \"檢驗兩個值是否相等。如果 number1=number2,則返回1；否則返回0。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number1\",\r\n                    \"detail\": \"第一個數位。\"\r\n                },\r\n                {\r\n                    \"name\": \"number2\",\r\n                    \"detail\": \"[可選 - 默認為0] - 第二個數位。\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMSUM\": {\r\n            \"d\": \"返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 個複數的和。\",\r\n            \"a\": \"返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 個複數的和。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"inumber1\",\r\n                    \"detail\": \"要相加的第一個複數\"\r\n                },\r\n                {\r\n                    \"name\": \"inumber2, …\",\r\n                    \"detail\": \"[可選] -要與值1相加的其他複數\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMSUB\": {\r\n            \"d\": \"返回以 x+yi 或 x+yj 文本格式表示的兩個複數的差。\",\r\n            \"a\": \"返回以 x+yi 或 x+yj 文本格式表示的兩個複數的差。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"inumber1\",\r\n                    \"detail\": \"從（複）數中减去 inumber2。\"\r\n                },\r\n                {\r\n                    \"name\": \"inumber2\",\r\n                    \"detail\": \"從 inumber1 中减（複）數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMPRODUCT\": {\r\n            \"d\": \"返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 個複數的乘積。\",\r\n            \"a\": \"返回以 x+yi 或 x+yj 文本格式表示的 1 至 255 個複數的乘積。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"inumber1\",\r\n                    \"detail\": \"用於計算乘積的第一個複數\"\r\n                },\r\n                {\r\n                    \"name\": \"inumber2, …\",\r\n                    \"detail\": \"[可選] -要相乘的其他複數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"IMDIV\": {\r\n            \"d\": \"返回以 x+yi 或 x+yj 文本格式表示的兩個複數的商。\",\r\n            \"a\": \"返回以 x+yi 或 x+yj 文本格式表示的兩個複數的商。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"inumber1\",\r\n                    \"detail\": \"複數分子或被除數。\"\r\n                },\r\n                {\r\n                    \"name\": \"inumber2\",\r\n                    \"detail\": \"複數分母或除數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"NOT\": {\r\n            \"d\": \"返回某個邏輯值的相反值-\\\"NOT（TRUE（））\\\"將返回FALSE；\\\"NOT（FALSE（））\\\"將返回TRUE。\",\r\n            \"a\": \"返回某個邏輯值的相反值-\\\"NOT（TRUE（））\\\"將返回FALSE；\\\"NOT（FALSE（））\\\"將返回TRUE。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"logical\",\r\n                    \"detail\": \"計算結果為TRUE或FALSE的任何值或運算式。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TRUE\": {\r\n            \"d\": \"返回邏輯值 TRUE。\",\r\n            \"a\": \"返回邏輯值 TRUE。\",\r\n            \"p\": []\r\n        },\r\n        \"FALSE\": {\r\n            \"d\": \"返回邏輯值 FALSE。\",\r\n            \"a\": \"返回邏輯值 FALSE。\",\r\n            \"p\": []\r\n        },\r\n        \"AND\": {\r\n            \"d\": \"所有參數的計算結果為TRUE時,返回TRUE；只要有一個參數的計算結果為FALSE,即返回FALSE。\",\r\n            \"a\": \"所有參數的計算結果為TRUE時,返回TRUE；只要有一個參數的計算結果為FALSE,即返回FALSE。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"logical1\",\r\n                    \"detail\": \"要測試的第一個條件,其計算結果可以為TRUE或FALSE。\"\r\n                },\r\n                {\r\n                    \"name\": \"logical2,...\",\r\n                    \"detail\": \"[可選] - 要測試的其他條件,其計算結果可以為TRUE或FALSE,最多可包含255個條件。\"\r\n                }\r\n            ]\r\n        },\r\n        \"IFERROR\": {\r\n            \"d\": \"如果第一個參數不是錯誤值,就返回第一個參數；否則,返回第二個參數。\",\r\n            \"a\": \"如果第一個參數不是錯誤值\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"檢查是否存在錯誤的參數。\"\r\n                },\r\n                {\r\n                    \"name\": \"value_if_error\",\r\n                    \"detail\": \"公式的計算結果錯誤時返回的值。計算以下錯誤類型:#N/A、#VALUE！、#REF！、#DIV/0！、#NUM！、#NAME？或#NULL！。\"\r\n                }\r\n            ]\r\n        },\r\n        \"IF\": {\r\n            \"d\": \"當邏輯運算式的值為TRUE時返回一個值,而當其為FALSE時返回另一個值。\",\r\n            \"a\": \"當邏輯運算式的值為TRUE時返回一個值,而當其為FALSE時返回另一個值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"logical_test\",\r\n                    \"detail\": \"一個運算式或對包含運算式的儲存格的引用,該運算式代表某種邏輯值（即TRUE或FALSE）。\"\r\n                },\r\n                {\r\n                    \"name\": \"value_if_true\",\r\n                    \"detail\": \"當邏輯運算式為TRUE時的返回值。\"\r\n                },\r\n                {\r\n                    \"name\": \"value_if_false\",\r\n                    \"detail\": \"[可選 - 默認為空白] - 當邏輯運算式等於FALSE時的函數返回值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"OR\": {\r\n            \"d\": \"只要有一個參數的計算結果為TRUE時,返回TRUE；所有參數的計算結果為FALSE,即返回FALSE。\",\r\n            \"a\": \"只要有一個參數的計算結果為TRUE時,返回TRUE；所有參數的計算結果為FALSE,即返回FALSE。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"logical1\",\r\n                    \"detail\": \"要測試的第一個條件,其計算結果可以為TRUE或FALSE。\"\r\n                },\r\n                {\r\n                    \"name\": \"邏輯運算式2\",\r\n                    \"detail\": \"[可選] - 其他運算式或對包含運算式的儲存格的引用,這些運算式代表某種邏輯值（即TRUE或FALSE）或者可以強制轉換為邏輯值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"NE\": {\r\n            \"d\": \"如果指定的值不相等,則返回\\\"TRUE\\\"；否則返回\\\"FALSE\\\"。相當於\\\"<>\\\"運算子。\",\r\n            \"a\": \"如果指定的值不相等,則返回\\\"TRUE\\\"；否則返回\\\"FALSE\\\"。相當於\\\"<>\\\"運算子。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"第一個值。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"要檢查是否與 value1 不相等的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"EQ\": {\r\n            \"d\": \"如果指定的值相等,則返回\\\"TRUE\\\"；否則返回\\\"FALSE\\\"。相當於\\\"=\\\"運算子。\",\r\n            \"a\": \"如果指定的值相等,則返回\\\"TRUE\\\"；否則返回\\\"FALSE\\\"。相當於\\\"=\\\"運算子。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"第一個值。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"要檢查是否與value1相等的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"GT\": {\r\n            \"d\": false,\r\n            \"a\": false,\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"要測試其是否大於 value2 的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"第二個值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"GTE\": {\r\n            \"d\": \"如果第一個參數大於或等於第二個，則返回TRUE；否則返回FALSE。相當於\\\">=\\\"運算子。\",\r\n            \"a\": \"如果第一個參數大於或等於第二個，則返回TRUE；否則返回FALSE。相當於\\\">=\\\"運算子。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"要测试其是否大于等于 value2 的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"第二個值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LT\": {\r\n            \"d\": \"如果第一個參數嚴格小於第二個，則返回TRUE；否則返回FALSE。相當於\\\"<\\\"運算子。\",\r\n            \"a\": \"如果第一個參數嚴格小於第二個，則返回TRUE；否則返回FALSE。相當於\\\"<\\\"運算子。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"要测试其是否小于 value2 的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"第二個值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LTE\": {\r\n            \"d\": \"如果第一個參數小於或等於第二個，則返回TRUE；否則返回FALSE。相當於\\\"<=\\\"運算子。\",\r\n            \"a\": \"如果第一個參數小於或等於第二個，則返回TRUE；否則返回FALSE。相當於\\\"<=\\\"運算子。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"要测试其是否小于等于 value2 的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"第二個值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ADD\": {\r\n            \"d\": \"返回兩個數值之和。相當於\\\"+\\\"運算子。\",\r\n            \"a\": \"返回兩個數值之和。相當於\\\"+\\\"運算子。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"第一個加數。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"第二個加數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MINUS\": {\r\n            \"d\": \"返回兩個數值之差。相當於\\\"-\\\"運算子。\",\r\n            \"a\": \"返回兩個數值之差。相當於\\\"-\\\"運算子。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"被減數,即要對其計减的數值。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"減數,即要從value1中减除的數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MULTIPLY\": {\r\n            \"d\": \"返回兩個數的乘積。相當於\\\"*\\\"運算子。\",\r\n            \"a\": \"返回兩個數的乘積。相當於\\\"*\\\"運算子。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"第一個乘數。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"第二個乘數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DIVIDE\": {\r\n            \"d\": \"返回兩個參數相除所得的結果。相當於`/`運算子。\",\r\n            \"a\": \"返回兩個參數相除所得的結果。相當於`/`運算子。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"要被除的數值。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"用於除其他數的數值。\\n\\n除數不得為0。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CONCAT\": {\r\n            \"d\": \"返回兩個值的串聯。相當於`&`運算子。\",\r\n            \"a\": \"返回兩個值的串聯。相當於`&`運算子。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value1\",\r\n                    \"detail\": \"value2 將附於其後的值。\"\r\n                },\r\n                {\r\n                    \"name\": \"value2\",\r\n                    \"detail\": \"要附於 value1 之後的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"UNARY_PERCENT\": {\r\n            \"d\": \"返回按百分比解釋的數值。例如,\\\"UNARY_PERCENT（100）\\\"等於1。\",\r\n            \"a\": \"返回按百分比解釋的數值。例如,\\\"UNARY_PERCENT（100）\\\"等於1。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要作為百分比解釋的數值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CONCATENATE\": {\r\n            \"d\": \"將兩個或多個文字字串聯接為一個字串。\",\r\n            \"a\": \"將兩個或多個文字字串聯接為一個字串。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text1\",\r\n                    \"detail\": \"初始字串。\"\r\n                },\r\n                {\r\n                    \"name\": \"text2…\",\r\n                    \"detail\": \"[可選] - 要按順序連接在一起的其他字串。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CODE\": {\r\n            \"d\": \"返回所提供的字串中首字元的Unicode映射值。\",\r\n            \"a\": \"返回所提供的字串中首字元的Unicode映射值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"要返回其首字元的Unicode映射值的字串。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CHAR\": {\r\n            \"d\": \"按照當前Unicode編碼表,將數位轉換為對應的字元。\",\r\n            \"a\": \"按照當前Unicode編碼表,將數位轉換為對應的字元。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"介於1到255之間的數位。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ARABIC\": {\r\n            \"d\": \"將羅馬數字轉換為阿拉伯數字。\",\r\n            \"a\": \"將羅馬數字轉換為阿拉伯數字。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"要轉換格式的羅馬數字\"\r\n                }\r\n            ]\r\n        },\r\n        \"ROMAN\": {\r\n            \"d\": \"將數位格式設定為羅馬數字形式。\",\r\n            \"a\": \"將數位格式設定為羅馬數字形式。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要設定格式的數位,介於1到3999之間（包括這兩個數位）。\"\r\n                }\r\n            ]\r\n        },\r\n        \"REGEXEXTRACT\": {\r\n            \"d\": \"按照規則運算式選取匹配的子串。\",\r\n            \"a\": \"按照規則運算式選取匹配的子串。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"輸入文字。\"\r\n                },\r\n                {\r\n                    \"name\": \"regular_expression\",\r\n                    \"detail\": \"此函數將返回文字中符合此運算式的第一個子串。\"\r\n                }\r\n            ]\r\n        },\r\n        \"REGEXMATCH\": {\r\n            \"d\": \"判斷一段文字是否與規則運算式相匹配。\",\r\n            \"a\": \"判斷一段文字是否與規則運算式相匹配。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"要用規則運算式測試的文字。\"\r\n                },\r\n                {\r\n                    \"name\": \"regular_expression\",\r\n                    \"detail\": \"用來測試文字的規則運算式。\"\r\n                }\r\n            ]\r\n        },\r\n        \"REGEXREPLACE\": {\r\n            \"d\": \"使用規則運算式將文字字串中的一部分替換為其他文字字串。\",\r\n            \"a\": \"使用規則運算式將文字字串中的一部分替換為其他文字字串。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"要對其局部進行替換操作的文字。\"\r\n                },\r\n                {\r\n                    \"name\": \"regular_expression\",\r\n                    \"detail\": \"規則運算式。text中所有匹配的實例都將被替換。\"\r\n                },\r\n                {\r\n                    \"name\": \"replacement\",\r\n                    \"detail\": \"要插入到原有文字中的文字。\"\r\n                }\r\n            ]\r\n        },\r\n        \"T\": {\r\n            \"d\": \"返回文本格式的字串參數。\",\r\n            \"a\": \"返回文本格式的字串參數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要轉換為文字的參數。\\n\\n如果值為文字,T將返回值本身。\\n\\n如果值為指向包含文字的儲存格的引用,T將返回值中的內容。\\n\\n如果值為錯誤值或包含錯誤值的儲存格,T將返回該錯誤值。\\n\\n對於所有其他情况,T將返回空串。\"\r\n                }\r\n            ]\r\n        },\r\n        \"FIXED\": {\r\n            \"d\": \"以固定的小數位數設定數位的格式。\",\r\n            \"a\": \"以固定的小數位數設定數位的格式。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"要進行舍入並轉換為文字的數位。\"\r\n                },\r\n                {\r\n                    \"name\": \"decimals\",\r\n                    \"detail\": \"[可選-預設值為2] - 結果中要顯示的小數位數。\\n\\n如果數值的有效位數小於小數位數,將以零填充。如果數值的有效位數大於小數位數,則將其舍入到所需的小數位數而不是將其截斷。\"\r\n                },\r\n                {\r\n                    \"name\": \"no_commas\",\r\n                    \"detail\": \"[可選-預設值為FALSE（）] - 一個邏輯值,如果為TRUE（）,則會禁止FIXED在返回的文字中包含逗號。\"\r\n                }\r\n            ]\r\n        },\r\n        \"FIND\": {\r\n            \"d\": \"返回字串在文字中首次出現的位置（區分大小寫）。\",\r\n            \"a\": \"返回字串在文字中首次出現的位置（區分大小寫）。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"find_text\",\r\n                    \"detail\": \"要在要蒐索的文字中查找的字串。\"\r\n                },\r\n                {\r\n                    \"name\": \"within_text\",\r\n                    \"detail\": \"要在其中蒐索蒐索字串的首次出現位置的文字。\"\r\n                },\r\n                {\r\n                    \"name\": \"start_num\",\r\n                    \"detail\": \"[可選-預設值為1] - 要在要蒐索的文字中開始蒐索的字元位置。\"\r\n                }\r\n            ]\r\n        },\r\n        \"FINDB\": {\r\n            \"d\": \"返回某個字串在文字中首次出現的位置（每個雙位元組字元占兩個位置）。\",\r\n            \"a\": \"返回某個字串在文字中首次出現的位置（每個雙位元組字元占兩個位置）。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"find_text\",\r\n                    \"detail\": \"要在要蒐索的文字中查找的字串。\"\r\n                },\r\n                {\r\n                    \"name\": \"within_text\",\r\n                    \"detail\": \"要在其中蒐索蒐索字串的首次出現位置的文字。\"\r\n                },\r\n                {\r\n                    \"name\": \"start_num\",\r\n                    \"detail\": \"[可選-預設值為1] - 要在要蒐索的文字中開始蒐索的字元位置。\"\r\n                }\r\n            ]\r\n        },\r\n        \"JOIN\": {\r\n            \"d\": \"將一個或多個使用指定定界符的一維數組的元素連接到一起。\",\r\n            \"a\": \"將一個或多個使用指定定界符的一維數組的元素連接到一起。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"separator\",\r\n                    \"detail\": \"置於相互連接的值之間的字元或字串。\\n\\n定界符可以為空,例如JOIN（,{1,2,3}）。\"\r\n                },\r\n                {\r\n                    \"name\": \"array1\",\r\n                    \"detail\": \"要使用定界符連接的一個或多個值。\"\r\n                },\r\n                {\r\n                    \"name\": \"array2,…\",\r\n                    \"detail\": \"[可選] - 要使用定界符連接的其他值或數組。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LEFT\": {\r\n            \"d\": \"從文字字串的第一個字元開始返回指定個數的字元。\",\r\n            \"a\": \"從文字字串的第一個字元開始返回指定個數的字元。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"包含要選取的字元的文字字串。\"\r\n                },\r\n                {\r\n                    \"name\": \"num_chars\",\r\n                    \"detail\": \"[可選-預設值為1] - 指定要由LEFT選取的字元的數量。\"\r\n                }\r\n            ]\r\n        },\r\n        \"RIGHT\": {\r\n            \"d\": \"根據所指定的字元數返回文字字串中最後一個或多個字元。\",\r\n            \"a\": \"根據所指定的字元數返回文字字串中最後一個或多個字元。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"包含要選取的字元的文字字串。\"\r\n                },\r\n                {\r\n                    \"name\": \"num_chars\",\r\n                    \"detail\": \"[可選-預設值為1] - 指定要由RIGHT選取的字元的數量。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MID\": {\r\n            \"d\": \"返回文字字串中從指定位置開始的特定數目的字元。\",\r\n            \"a\": \"返回文字字串中從指定位置開始的特定數目的字元。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"包含要選取的字元的文字字串。\"\r\n                },\r\n                {\r\n                    \"name\": \"start_num\",\r\n                    \"detail\": \"要從字串中開始選取的位置。字串中第一個字元的索引為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"num_chars\",\r\n                    \"detail\": \"指定要由MID選取的字元的數量。\\n\\n如果選取的字元數尚不足選取長度個字元時就到達了字串尾部,則MID返回從開始位置到字串尾部的字元。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LEN\": {\r\n            \"d\": \"返回給定字串的長度。\",\r\n            \"a\": \"返回給定字串的長度。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"要返回其長度的字串。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LENB\": {\r\n            \"d\": \"返回文字中所包含的字元數。與雙位元組字元集（DBCS）一起使用。\",\r\n            \"a\": \"返回文字中所包含的字元數。與雙位元組字元集（DBCS）一起使用。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"要返回其位元組數的字串。（一個漢字為兩個位元組數）\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOWER\": {\r\n            \"d\": \"將指定字串中的字母轉換為小寫。\",\r\n            \"a\": \"將指定字串中的字母轉換為小寫。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"要轉換為小寫的字串。\"\r\n                }\r\n            ]\r\n        },\r\n        \"UPPER\": {\r\n            \"d\": \"將指定字串中的字母轉換為大寫。\",\r\n            \"a\": \"將指定字串中的字母轉換為大寫。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"要轉換為大寫的字串。\"\r\n                }\r\n            ]\r\n        },\r\n        \"EXACT\": {\r\n            \"d\": \"比較兩個字串是否相同。\",\r\n            \"a\": \"比較兩個字串是否相同。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text1\",\r\n                    \"detail\": \"要比較的第一個字串。\"\r\n                },\r\n                {\r\n                    \"name\": \"text2\",\r\n                    \"detail\": \"要比較的第二個字串。\"\r\n                }\r\n            ]\r\n        },\r\n        \"REPLACE\": {\r\n            \"d\": \"將文字字串的一部分替換為其他文字字串。\",\r\n            \"a\": \"將文字字串的一部分替換為其他文字字串。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"old_text\",\r\n                    \"detail\": \"要對其局部進行替換操作的文字。\"\r\n                },\r\n                {\r\n                    \"name\": \"start_num\",\r\n                    \"detail\": \"開始進行替換操作的位置（文字開頭位置為1）。\"\r\n                },\r\n                {\r\n                    \"name\": \"num_chars\",\r\n                    \"detail\": \"要在文字中替換的字元個數。\"\r\n                },\r\n                {\r\n                    \"name\": \"new_text\",\r\n                    \"detail\": \"要插入到原有文字中的文字。\"\r\n                }\r\n            ]\r\n        },\r\n        \"REPT\": {\r\n            \"d\": \"返回指定文字的多次重複。\",\r\n            \"a\": \"返回指定文字的多次重複。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"要重複的字元或字串。\"\r\n                },\r\n                {\r\n                    \"name\": \"number_times\",\r\n                    \"detail\": \"要重複的文字要在返回值中出現的次數。\\n\\n最大重複次數為100。即使重複次數大於100,REPT也僅將相應文字重複100次。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SEARCH\": {\r\n            \"d\": \"返回字串在文字中首次出現的位置（不區分大小寫）。\",\r\n            \"a\": \"返回字串在文字中首次出現的位置（不區分大小寫）。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"find_text\",\r\n                    \"detail\": \"要在要蒐索的文字中查找的字串。\"\r\n                },\r\n                {\r\n                    \"name\": \"within_text\",\r\n                    \"detail\": \"要在其中蒐索蒐索字串的首次出現位置的文字。\"\r\n                },\r\n                {\r\n                    \"name\": \"start_num\",\r\n                    \"detail\": \"[可選-預設值為1 ] - 要在要蒐索的文字中開始蒐索的字元位置。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUBSTITUTE\": {\r\n            \"d\": \"在文字字串中用new_text替換old_text。\",\r\n            \"a\": \"在文字字串中用new_text替換old_text。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"需要替換其中字元的文字,或對含有文字（需要替換其中字元）的儲存格的引用。\"\r\n                },\r\n                {\r\n                    \"name\": \"old_text\",\r\n                    \"detail\": \"需要替換的文字。\"\r\n                },\r\n                {\r\n                    \"name\": \"new_text\",\r\n                    \"detail\": \"用於替換old_text的文字。\"\r\n                },\r\n                {\r\n                    \"name\": \"instance_num\",\r\n                    \"detail\": \"[可選] - 指定要用new_text替換old_text的事件。如果指定了instance_num,則只有滿足要求的old_text被替換。否則,文字中出現的所有old_text都會更改為new_text。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CLEAN\": {\r\n            \"d\": \"移除文字中的不可列印ASCII字元後將其返回。\",\r\n            \"a\": \"移除文字中的不可列印ASCII字元後將其返回。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"要移除其中不可列印字元的文字。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TEXT\": {\r\n            \"d\": \"按照指定格式將數位轉換為文字。\",\r\n            \"a\": \"按照指定格式將數位轉換為文字。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要設定格式的數位、日期或時間。\"\r\n                },\r\n                {\r\n                    \"name\": \"format_text\",\r\n                    \"detail\": \"以括弧括起來的模式串,將按該模式設定數位的格式。\\n\\n0表示在數值位數少於格式指定的位數時必定以零填充。例如,TEXT（12.3,“000.00\\\"）將返回012.30。當數值的小數位數超過模式指定的小數位數時,四捨五入為指定的小數位數。例如,TEXT（12.305,“00.00\\\"）將返回12.31。\\n\\n#類似於0,但並不是在小數點的兩側都以零填充。例如,TEXT（12.3,“###.##\\\"）將返回12.3。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TRIM\": {\r\n            \"d\": \"删除指定字串前後的空格。\",\r\n            \"a\": \"删除指定字串前後的空格。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"要修剪的字串或指向包含該字串的儲存格的引用。\"\r\n                }\r\n            ]\r\n        },\r\n        \"VALUE\": {\r\n            \"d\": \"將可識別的任何日期、時間或數位格式的字串轉換為數位。\",\r\n            \"a\": \"將可識別的任何日期、時間或數位格式的字串轉換為數位。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"包含要轉換的值的字串。\"\r\n                }\r\n            ]\r\n        },\r\n        \"PROPER\": {\r\n            \"d\": \"將指定字串中每個單詞的首字母轉為大寫。\",\r\n            \"a\": \"將指定字串中每個單詞的首字母轉為大寫。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"text\",\r\n                    \"detail\": \"要轉換的文字,其中每個單詞的首字母都將轉為大寫,所有其他字母則轉為小寫。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CONVERT\": {\r\n            \"d\": \"將數位從一種度量系統轉換為另一種度量系統。\",\r\n            \"a\": \"將數位從一種度量系統轉換為另一種度量系統。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"number\",\r\n                    \"detail\": \"是以from_unit為組織的需要進行轉換的數值。\"\r\n                },\r\n                {\r\n                    \"name\": \"from_unit\",\r\n                    \"detail\": \"是數值的組織。\"\r\n                },\r\n                {\r\n                    \"name\": \"to_unit\",\r\n                    \"detail\": \"是結果的組織。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUMX2MY2\": {\r\n            \"d\": \"返回兩數組中對應數值的平方差之和。\",\r\n            \"a\": \"返回兩數組中對應數值的平方差之和。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array_x\",\r\n                    \"detail\": \"第一個數組或數值區域。\"\r\n                },\r\n                {\r\n                    \"name\": \"array_y\",\r\n                    \"detail\": \"第二個數組或數值區域。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUMX2PY2\": {\r\n            \"d\": \"返回兩數組中對應數值的平方和之和。\",\r\n            \"a\": \"返回兩數組中對應數值的平方和之和。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array_x\",\r\n                    \"detail\": \"第一個數組或數值區域。\"\r\n                },\r\n                {\r\n                    \"name\": \"array_y\",\r\n                    \"detail\": \"第二個數組或數值區域。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUMXMY2\": {\r\n            \"d\": \"返回兩數組中對應數值之差的平方和。\",\r\n            \"a\": \"返回兩數組中對應數值之差的平方和。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array_x\",\r\n                    \"detail\": \"第一個數組或數值區域。\"\r\n                },\r\n                {\r\n                    \"name\": \"array_y\",\r\n                    \"detail\": \"第二個數組或數值區域。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TRANSPOSE\": {\r\n            \"d\": \"將數組或儲存格範圍的行列轉置。\",\r\n            \"a\": \"將數組或儲存格範圍的行列轉置。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"要將其行列互換的數組或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TREND\": {\r\n            \"d\": \"返回線性趨勢值。\",\r\n            \"a\": \"返回線性趨勢值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"known_y\",\r\n                    \"detail\": \"關係運算式y = mx + b 中已知的y值集合。\\n\\n如果known_y為二維陣列或範圍,則known_x的維數必須與之相同,或者省略此參數。\\n\\n如果known_y為一維數組或範圍,known_x則可代表二維陣列或範圍中的多個引數。也就是說,如果known_y為單行,則將known_x中的每行解釋為各自獨立的值,類似情况也適用於known_y為單列的情况。\"\r\n                },\r\n                {\r\n                    \"name\": \"known_x\",\r\n                    \"detail\": \"[可選-默認該數組為{1,2,3,…},其大小與known_y相同] -關係運算式y = mx + b 中已知的可選x值集合。\\n\\n如果known_y為一維數組或範圍,known_x則可代表二維陣列或範圍中的多個引數。也就是說,如果known_y為單行,則將known_x中的每行解釋為各自獨立的值,類似情况也適用於known_y為單列的情况。\"\r\n                },\r\n                {\r\n                    \"name\": \"new_x\",\r\n                    \"detail\": \"[可選 - 默認與known_x相同] - 需要函數TREND返回對應y值的新x值。\"\r\n                },\r\n                {\r\n                    \"name\": \"const\",\r\n                    \"detail\": \"[可選 - 預設值為TRUE（）] - 一個邏輯值,用於指定是否將常數b強制設為0。\\n\\nTRUE（）表示b將按正常計算；\\n\\nFALSE（）表示b將被設為0（零）,m 將被調整以使y = mx。\"\r\n                }\r\n            ]\r\n        },\r\n        \"FREQUENCY\": {\r\n            \"d\": \"計算數值在某個區域內的出現頻率,然後返回一個垂直數組。\",\r\n            \"a\": \"計算數值在某個區域內的出現頻率,然後返回一個垂直數組。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"data_array\",\r\n                    \"detail\": \"要對其頻率進行計數的一組數值或對這組數值的引用。\"\r\n                },\r\n                {\r\n                    \"name\": \"bins_array\",\r\n                    \"detail\": \"要將data_array中的值插入到的間隔數組或對間隔的引用。\\n\\n為清晰起見,應將類別排序,但如果未排序,FREQUENCY會在內部對這些指定的值進行排序並返回正確結果。\"\r\n                }\r\n            ]\r\n        },\r\n        \"GROWTH\": {\r\n            \"d\": \"使用現有數據計算預測的指數等比。\",\r\n            \"a\": \"使用現有數據計算預測的指數等比。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"known_y\",\r\n                    \"detail\": \"關係運算式y = b*m^x 中已知的y值集合。\\n\\n如果已知數據_y為二維陣列或範圍,則已知數據_x的維數必須與之相同,或者省略此參數。\\n\\n如果已知數據_y為一維數組或範圍,已知數據_x則可代表二維陣列或範圍中的多個引數。也就是說,如果已知數據_y為單行,則將已知數據_x中的每行解釋為各自獨立的值,類似情况也適用於已知數據_y為單列的情况。\"\r\n                },\r\n                {\r\n                    \"name\": \"known_x\",\r\n                    \"detail\": \"[可選 - 默認該數組為{1,2,3,…},其大小與known_y相同] - 關係運算式y = b*m^x 中已知的可選x值集合。\\n\\n如果已知數據_y為一維數組或範圍,已知數據_x則可代表二維陣列或範圍中的多個引數。也就是說,如果已知數據_y為單行,則將已知數據_x中的每行解釋為各自獨立的值,類似情况也適用於已知數據_y為單列的情况。\"\r\n                },\r\n                {\r\n                    \"name\": \"new_x\",\r\n                    \"detail\": \"[可選 - 默認與known_x相同] - 需要函數GROWTH返回對應y值的新x值。\"\r\n                },\r\n                {\r\n                    \"name\": \"const\",\r\n                    \"detail\": \"[可選 - 預設值為TRUE（）] - 一個邏輯值,用於指定是否將常數b強制設為1。\\n\\nTRUE（）表示b將按正常計算；\\n\\nFALSE（）表示b將被設為1,m將被調整以使y = m^x。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LINEST\": {\r\n            \"d\": \"可通過使用最小二乘法計算與現有數據最佳擬合的直線,來計算某直線的統計值,然後返回描述此直線的數組。\",\r\n            \"a\": \"可通過使用最小二乘法計算與現有數據最佳擬合的直線,來計算某直線的統計值,然後返回描述此直線的數組。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"known_y\",\r\n                    \"detail\": \"關係運算式y = mx + b 中已知的y值集合。\\n\\n如果known_y為二維陣列或範圍,則known_x的維數必須與之相同,或者省略此參數。\\n\\n如果known_y為一維數組或範圍,known_x則可代表二維陣列或範圍中的多個引數。也就是說,如果known_y為單行,則將known_x中的每行解釋為各自獨立的值,類似情况也適用於known_y為單列的情况。\"\r\n                },\r\n                {\r\n                    \"name\": \"known_x\",\r\n                    \"detail\": \"[可選 - 默認該數組為{1,2,3,…},其大小與known_y相同] - 關係運算式y = mx + b中已知的可選x值集合。\\n\\n如果known_y為一維數組或範圍,known_x則可代表二維陣列或範圍中的多個引數。也就是說,如果known_y為單行,則將known_x中的每行解釋為各自獨立的值,類似情况也適用於known_y為單列的情况。\"\r\n                },\r\n                {\r\n                    \"name\": \"const\",\r\n                    \"detail\": \"[可選 - 預設值為TRUE（）] - 一個邏輯值,用於指定是否將常數b強制設為0。\\n\\nTRUE（）表示b將按正常計算；\\n\\nFALSE（）表示b將被設為0（零）,m將被調整以使y = mx。\"\r\n                },\r\n                {\r\n                    \"name\": \"stats\",\r\n                    \"detail\": \"[可選 - 預設值為FALSE（）] - 一個邏輯值,用於指定是否返回附加回歸統計值。\\n\\n如果詳細為TRUE,除了對應於每個引數的一組線性係數和y截距之外,LINEST還返回以下資訊:\\n\\n每項係數和截距的標準誤差、\\n\\n限定係數（介於0和1之間,1表示完全相關）、\\n\\n因變數值的標准誤差、\\n\\nF統計或F觀測值,訓示所觀測到的因變數和引數變數之間的關係是隨機的還是線性的、\\n\\n自由度,用於在參照錶中查找F統計值以估算可信度、\\n\\n回歸平方和,以及\\n\\n殘差平方和。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LOGEST\": {\r\n            \"d\": \"在回歸分析中,計算最符合數據的指數回歸擬合曲線,並返回描述該曲線的數值數組。\",\r\n            \"a\": \"在回歸分析中,計算最符合數據的指數回歸擬合曲線,並返回描述該曲線的數值數組。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"known_y\",\r\n                    \"detail\": \"關係運算式y = mx + b 中已知的y值集合。\\n\\n如果known_y為二維陣列或範圍,則known_x的維數必須與之相同,或者省略此參數。\\n\\n如果known_y為一維數組或範圍,known_x則可代表二維陣列或範圍中的多個引數。也就是說,如果known_y為單行,則將known_x中的每行解釋為各自獨立的值,類似情况也適用於known_y為單列的情况。\"\r\n                },\r\n                {\r\n                    \"name\": \"known_x\",\r\n                    \"detail\": \"[可選 - 默認該數組為{1,2,3,…},其大小與known_y相同] - 關係運算式y = mx + b中已知的可選x值集合。\\n\\n如果known_y為一維數組或範圍,known_x則可代表二維陣列或範圍中的多個引數。也就是說,如果known_y為單行,則將known_x中的每行解釋為各自獨立的值,類似情况也適用於known_y為單列的情况。\"\r\n                },\r\n                {\r\n                    \"name\": \"const\",\r\n                    \"detail\": \"[可選 - 預設值為TRUE（）] - 一個邏輯值,用於指定是否將常數b強制設為0。\\n\\nTRUE（）表示b將按正常計算；\\n\\nFALSE（）表示b將被設為0（零）,m將被調整以使y = mx。\"\r\n                },\r\n                {\r\n                    \"name\": \"stats\",\r\n                    \"detail\": \"[可選 - 預設值為FALSE（）] - 一個邏輯值,用於指定是否返回附加回歸統計值。\\n\\n如果詳細為TRUE,則除了為每個引數和係數b返回一組指數值之外,LOGEST還將返回以下數據:\\n\\n每項指數和係數的標準誤差、\\n\\n限定係數（介於0和1之間,1表示完全相關）、\\n\\n因變數值的標准誤差、\\n\\nF統計或F觀測值,訓示所觀測到的因變數和引數之間的關係是隨機的還是指數的、\\n\\n自由度-用於在參照錶中查找F統計值以估算可信度、\\n\\n回歸平方和,以及\\n\\n殘差平方和。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MDETERM\": {\r\n            \"d\": \"返回一個數組的矩陣行列式的值。\",\r\n            \"a\": \"返回一個數組的矩陣行列式的值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"行數和列數相等的數值數組。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MINVERSE\": {\r\n            \"d\": \"返回數組中存儲的矩陣的逆矩陣。\",\r\n            \"a\": \"返回數組中存儲的矩陣的逆矩陣。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"行數和列數相等的數值數組。\"\r\n                }\r\n            ]\r\n        },\r\n        \"MMULT\": {\r\n            \"d\": \"返回兩個數組的矩陣乘積。結果矩陣的行數與array1的行數相同,矩陣的列數與array2的列數相同。\",\r\n            \"a\": \"返回兩個數組的矩陣乘積。結果矩陣的行數與array1的行數相同,矩陣的列數與array2的列數相同。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array1\",\r\n                    \"detail\": \"要進行矩陣乘法運算的第一個矩陣數組。\\n\\narray1列數必須與array2的行數相同\"\r\n                },\r\n                {\r\n                    \"name\": \"array2\",\r\n                    \"detail\": \"要進行矩陣乘法運算的第二個矩陣數組。\\n\\narray2的行數必須與array1列數相同\"\r\n                }\r\n            ]\r\n        },\r\n        \"SUMPRODUCT\": {\r\n            \"d\": \"在給定的幾組數組中,將數組間對應的元素相乘,並返回乘積之和。\",\r\n            \"a\": \"在給定的幾組數組中,將數組間對應的元素相乘,並返回乘積之和。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array1\",\r\n                    \"detail\": \"其相應元素需要進行相乘並求和的第一個數組參數。\"\r\n                },\r\n                {\r\n                    \"name\": \"array2\",\r\n                    \"detail\": \"[可選] - 其相應元素需要進行相乘並求和的其它數組參數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISFORMULA\": {\r\n            \"d\": \"檢查公式是否位於引用的儲存格中。\",\r\n            \"a\": \"檢查公式是否位於引用的儲存格中。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"cell\",\r\n                    \"detail\": \"要檢查是否存在公式的儲存格。\\n\\n如果 cell 為包含公式的儲存格,則 ISFORMULA 將返回TRUE。如果 cell 為相應儲存格範圍,則當該範圍內的首個儲存格包含公式時,系統會返回TRUE。如果是任何其他值,系統都將返回FALSE。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CELL\": {\r\n            \"d\": \"返回有關儲存格的格式、位置或內容的資訊。\",\r\n            \"a\": \"返回有關儲存格的格式、位置或內容的資訊。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"info_type\",\r\n                    \"detail\": \"一個文字值,指定要返回的儲存格資訊的類型。\"\r\n                },\r\n                {\r\n                    \"name\": \"reference\",\r\n                    \"detail\": \"需要其相關資訊的儲存格。\"\r\n                }\r\n            ]\r\n        },\r\n        \"NA\": {\r\n            \"d\": \"返回錯誤值#N/A。\",\r\n            \"a\": \"返回錯誤值#N/A。\",\r\n            \"p\": []\r\n        },\r\n        \"ERROR_TYPE\": {\r\n            \"d\": \"返回與其他儲存格中的錯誤值相對應的數位。\",\r\n            \"a\": \"返回與其他儲存格中的錯誤值相對應的數位。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"error_val\",\r\n                    \"detail\": \"用於查找錯誤號的儲存格,雖然您也可以直接提供錯誤值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISBLANK\": {\r\n            \"d\": \"檢查所引用的儲存格是否為空。\",\r\n            \"a\": \"檢查所引用的儲存格是否為空。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"對要檢查其是否為空的儲存格的引用。\\n\\n如果是空儲存格,則TRUE；否則返回FALSE。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISERR\": {\r\n            \"d\": \"檢查某個值是否為#N/A以外的錯誤值。\",\r\n            \"a\": \"檢查某個值是否為#N/A以外的錯誤值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要驗證其是否為#N/A以外的錯誤類型的值。\\n\\n如果值是除#N/A之外的任何錯誤（包括#DIV/0！、#NAME？、#NULL！、#NUM！、#VALUE！和#REF！）,ISERR將返回TRUE。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISERROR\": {\r\n            \"d\": \"檢查某個值是否為錯誤值。\",\r\n            \"a\": \"檢查某個值是否為錯誤值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要驗證其是否為錯誤類型的值。\\n\\n只要值是某種錯誤值（包括#DIV/0！、#N/A、#NAME？、#NULL！、#NUM！、#VALUE！和#REF！）,ISERROR就會返回TRUE。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISLOGICAL\": {\r\n            \"d\": \"檢查某個值是TRUE還是FALSE。\",\r\n            \"a\": \"檢查某個值是TRUE還是FALSE。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要驗證其為邏輯 TRUE 還是邏輯 FALSE 的值。\\n\\n*如果值為TRUE或FALSE,或為指向值為TRUE或FALSE的儲存格的引用,ISLOGICAL將返回TRUE。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISNA\": {\r\n            \"d\": \"檢查某個值是否為錯誤值#N/A。\",\r\n            \"a\": \"檢查某個值是否為錯誤值#N/A。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要與錯誤值#N/A進行比較的值。\\n\\n*如果值為#N/A或指向包含#N/A的儲存格的引用,則ISNA將返回TRUE,否則返回FALSE。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISNONTEXT\": {\r\n            \"d\": \"檢查某個值是否為非文字。\",\r\n            \"a\": \"檢查某個值是否為非文字。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要檢查的文字。\\n\\n*如果參數為文字值或指向包含文字的儲存格的引用,ISNONTEXT將返回FALSE,否則返回TRUE。\\n\\n當值為指向空儲存格的引用時,ISNONTEXT會返回TRUE。\\n\\n當值為空字串時,ISNONTEXT將返回FALSE,因為空串被視作文字。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISNUMBER\": {\r\n            \"d\": \"檢查某個值是否為數位。\",\r\n            \"a\": \"檢查某個值是否為數位。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要驗證其是否為數位的值。\\n\\n*如果參數為數位或指向內容為數位值的儲存格的引用,ISNUMBER將返回TRUE,否則返回FALSE。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISREF\": {\r\n            \"d\": \"檢查某個值是否為有效的儲存格引用。\",\r\n            \"a\": \"檢查某個值是否為有效的儲存格引用。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要驗證其是否為儲存格引用的值。\\n\\n*如果參數是有效的儲存格引用,ISREF將返回TRUE,否則返回FALSE。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISTEXT\": {\r\n            \"d\": \"檢查某個值是否為文字。\",\r\n            \"a\": \"檢查某個值是否為文字。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要驗證其是否為文字的值。\\n\\n如果參數為文字值或指向包含文字值的儲存格的引用,ISTEXT將返回TRUE,否則返回FALSE。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TYPE\": {\r\n            \"d\": \"返回數值的類型。\",\r\n            \"a\": \"返回數值的類型。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要確定其類型的數據。\\n\\n數位返回1；\\n\\n文字返回2；\\n\\n邏輯值返回4；\\n\\n錯誤值返回16；\\n\\n數組返回64；\"\r\n                }\r\n            ]\r\n        },\r\n        \"N\": {\r\n            \"d\": \"返回轉化為數值後的值。\",\r\n            \"a\": \"返回轉化為數值後的值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要轉換為數位的參數。\\n\\n如果值為數位,則返回該數位。\\n\\n如果值為日期,則返回該日期的序號。\\n\\n如果值為TRUE,則返回1。\\n\\n如果值為FALSE,則返回0。\\n\\n如果值為錯誤值,則返回錯誤值。\\n\\n如果值為其他值,則返回0。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TO_DATE\": {\r\n            \"d\": \"將指定的數位轉換為日期。\",\r\n            \"a\": \"將指定的數位轉換為日期。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要轉換為日期的參數或其儲存格引用。\\n\\n如果值為數位或指向內容為數值的儲存格的引用,TO_DATE會將值轉換為相應的日期並返回,值代表從十二月30日到對應的日期之間的天數,\\n\\n負值表示對應的日期在十二月30日之前,而小數值則代表一天中從午夜算起的時間。\\n如果值不是數位或指向內容為數值的儲存格的引用,則TO_DATE將在不做任何修改的情况下返回值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TO_PURE_NUMBER\": {\r\n            \"d\": \"將給定的日期/時間、百分比、貨幣金額或其他格式的數值轉換為不帶格式的純數位。\",\r\n            \"a\": \"將給定的日期/時間、百分比、貨幣金額或其他格式的數值轉換為不帶格式的純數位。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要轉換為純數位的參數或其儲存格引用。\\n\\n如果值為數位或指向包含數值的儲存格的引用,TO_PURE_NUMBER將以不帶任何格式與解釋的形式返回值。\\n\\n如果值不是數位或指向內容為數值的儲存格的引用,則TO_PERCENT將在不做任何修改的情况下返回值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TO_TEXT\": {\r\n            \"d\": \"將給定的數位值轉換為文本格式。\",\r\n            \"a\": \"將給定的數位值轉換為文本格式。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要轉換為文字的參數或其儲存格引用。\\n\\n如果值為數位或指向包含數值的儲存格的引用,TO_TEXT將返回字串形式的值,並保持現有格式。即原為貨幣的仍為貨幣,原為十進位數的仍為十進位數,原為百分比的仍為百分比,原為日期的仍為日期。\\n\\n如果值不是數位或指向內容為數值的儲存格的引用,則TO_TEXT將在不做任何修改的情况下返回值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TO_DOLLARS\": {\r\n            \"d\": \"將指定的數位轉換為美元金額。\",\r\n            \"a\": \"將指定的數位轉換為美元金額。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要轉換為美元金額的參數或其儲存格引用。\\n\\n如果值不是數位或指向內容為數值的儲存格的引用,則TO_DOLLARS將在不做任何修改的情况下返回值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"TO_PERCENT\": {\r\n            \"d\": \"將指定的數位轉換為百分比。\",\r\n            \"a\": \"將指定的數位轉換為百分比。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"value\",\r\n                    \"detail\": \"要轉換為百分比的參數或其儲存格引用。\\n\\n如果值為數位或指向包含數值的儲存格的引用,TO_PERCENT會以1 = 100%為標準,將值轉換為百分比。\\n\\n如果值不是數位或指向內容為數值的儲存格的引用,則TO_PERCENT將在不做任何修改的情况下返回值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DGET\": {\r\n            \"d\": \"使用SQL式査詢,從清單或資料庫的列中選取符合指定條件的單個值。\",\r\n            \"a\": \"使用SQL式査詢,從清單或資料庫的列中選取符合指定條件的單個值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"指定database中的哪一列包含要選取和用於計算的值。\\n\\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DMAX\": {\r\n            \"d\": \"使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位（列）中的最大數位。\",\r\n            \"a\": \"使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位（列）中的最大數位。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"指定database中的哪一列包含要選取和用於計算的值。\\n\\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DMIN\": {\r\n            \"d\": \"使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位（列）中的最小數位。\",\r\n            \"a\": \"使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位（列）中的最小數位。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"指定database中的哪一列包含要選取和用於計算的值。\\n\\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DAVERAGE\": {\r\n            \"d\": \"使用SQL式査詢,對清單或資料庫中滿足指定條件的記錄欄位（列）中的數值求平均值。\",\r\n            \"a\": \"使用SQL式査詢,對清單或資料庫中滿足指定條件的記錄欄位（列）中的數值求平均值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"指定database中的哪一列包含要選取和用於計算的值。\\n\\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DCOUNT\": {\r\n            \"d\": \"使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位（列）中包含數位的儲存格的個數。\",\r\n            \"a\": \"使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位（列）中包含數位的儲存格的個數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"指定database中的哪一列包含要選取和用於計算的值。\\n\\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DCOUNTA\": {\r\n            \"d\": \"使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位（列）中的非空儲存格的個數。\",\r\n            \"a\": \"使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位（列）中的非空儲存格的個數。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"指定database中的哪一列包含要選取和用於計算的值。\\n\\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DPRODUCT\": {\r\n            \"d\": \"使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位（列）中的數值的乘積。\",\r\n            \"a\": \"使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位（列）中的數值的乘積。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"指定database中的哪一列包含要選取和用於計算的值。\\n\\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DSTDEV\": {\r\n            \"d\": \"使用SQL式査詢,返回利用清單或資料庫中滿足指定條件的記錄欄位（列）中的數位作為一個樣本估算出的總體標準差。\",\r\n            \"a\": \"使用SQL式査詢,返回利用清單或資料庫中滿足指定條件的記錄欄位（列）中的數位作為一個樣本估算出的總體標準差。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"指定database中的哪一列包含要選取和用於計算的值。\\n\\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DSTDEVP\": {\r\n            \"d\": \"使用SQL式査詢,返回利用清單或資料庫中滿足指定條件的記錄欄位（列）中的數位作為樣本總體計算出的總體標準差。\",\r\n            \"a\": \"使用SQL式査詢,返回利用清單或資料庫中滿足指定條件的記錄欄位（列）中的數位作為樣本總體計算出的總體標準差。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"指定database中的哪一列包含要選取和用於計算的值。\\n\\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DSUM\": {\r\n            \"d\": \"使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位（列）中的數位之和。\",\r\n            \"a\": \"使用SQL式査詢,返回列表或資料庫中滿足指定條件的記錄欄位（列）中的數位之和。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"指定database中的哪一列包含要選取和用於計算的值。\\n\\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DVAR\": {\r\n            \"d\": \"使用SQL式査詢,返回利用清單或資料庫中滿足指定條件的記錄欄位（列）中的數位作為一個樣本估算出的總體方差。\",\r\n            \"a\": \"使用SQL式査詢,返回利用清單或資料庫中滿足指定條件的記錄欄位（列）中的數位作為一個樣本估算出的總體方差。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"指定database中的哪一列包含要選取和用於計算的值。\\n\\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DVARP\": {\r\n            \"d\": \"使用SQL式査詢,通過使用清單或資料庫中滿足指定條件的記錄欄位（列）中的數位計算樣本總體的樣本總體方差。\",\r\n            \"a\": \"使用SQL式査詢,通過使用清單或資料庫中滿足指定條件的記錄欄位（列）中的數位計算樣本總體的樣本總體方差。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"database\",\r\n                    \"detail\": \"構成清單或資料庫的儲存格區域,清單的第一行包含每一列的標籤。\"\r\n                },\r\n                {\r\n                    \"name\": \"field\",\r\n                    \"detail\": \"指定database中的哪一列包含要選取和用於計算的值。\\n\\nfield可以是與database第一行中某個列標題對應的文字標籤,也可以是指定相關列的數位索引,第一列的索引值為1。\"\r\n                },\r\n                {\r\n                    \"name\": \"criteria\",\r\n                    \"detail\": \"包含所指定條件的儲存格區域。計算之前將使用這些條件來過濾database中的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"AGE_BY_IDCARD\": {\r\n            \"d\": \"據中國身份證號計算出年齡。支持15位或18位身份證\",\r\n            \"a\": \"據中國身份證號計算出年齡\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"身份證號\",\r\n                    \"detail\": \"15位或者18位的身份證號或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"截止日期\",\r\n                    \"detail\": \"年齡計算的截止日期或範圍,默認為當日。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SEX_BY_IDCARD\": {\r\n            \"d\": \"根據中國身份證號計算出性別。支持15位或18位身份證\",\r\n            \"a\": \"根據身份證號得到性別。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"身份證號\",\r\n                    \"detail\": \"15位或者18位的身份證號或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"BIRTHDAY_BY_IDCARD\": {\r\n            \"d\": \"根據中國身份證號計算出生日。支持15位或18位身份證\",\r\n            \"a\": \"根據身份證號得到生日。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"身份證號\",\r\n                    \"detail\": \"15位或者18位的身份證號或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"生日格式\",\r\n                    \"detail\": \"日期類型,默認0:[1900/01/01],1:[1900-01-01],2:[1900年1月1日]\"\r\n                }\r\n            ]\r\n        },\r\n        \"PROVINCE_BY_IDCARD\": {\r\n            \"d\": \"根據中國身份證號計算出籍貫的省份。支持15位或18位身份證\",\r\n            \"a\": \"根據身份證號得到籍貫的省份。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"身份證號\",\r\n                    \"detail\": \"15位或者18位的身份證號或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"CITY_BY_IDCARD\": {\r\n            \"d\": \"根據中國身份證號計算出籍貫的都市。支持15位或18位身份證\",\r\n            \"a\": \"根據身份證號得到籍貫的都市。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"身份證號\",\r\n                    \"detail\": \"15位或者18位的身份證號或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"STAR_BY_IDCARD\": {\r\n            \"d\": \"根據中國身份證號計算出星座。支持15位或18位身份證\",\r\n            \"a\": \"根據身份證號得到星座。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"身份證號\",\r\n                    \"detail\": \"15位或者18位的身份證號或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ANIMAL_BY_IDCARD\": {\r\n            \"d\": \"根據中國身份證號計算出生肖（鼠、牛、虎、兔…）。支持15位或18位身份證\",\r\n            \"a\": \"根據身份證號得到生肖。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"身份證號\",\r\n                    \"detail\": \"15位或者18位的身份證號或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISIDCARD\": {\r\n            \"d\": \"驗證身份證的格式是否正確。支持15位或18位身份證\",\r\n            \"a\": \"驗證身份證格式正確性。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"身份證號\",\r\n                    \"detail\": \"15位或者18位的身份證號或範圍。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DM_TEXT_CUTWORD\": {\r\n            \"d\": \"文字分詞。把一連串文字折開為一系列單獨詞語\",\r\n            \"a\": \"中文文字分詞。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"文字\",\r\n                    \"detail\": \"任意需要分詞的文字。\"\r\n                },\r\n                {\r\n                    \"name\": \"分詞模式\",\r\n                    \"detail\": \"默認為0[精確模式]，1[全模式]，2[搜尋引擎模式]。\"\r\n                }\r\n            ]\r\n        },\r\n        \"DM_TEXT_TFIDF\": {\r\n            \"d\": \"採用tf-idf算灋進行關鍵字選取。從一連串文字中識別關鍵字\",\r\n            \"a\": \"tf-idf關鍵字識別。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"文字\",\r\n                    \"detail\": \"任意需要分詞的文字。\"\r\n                },\r\n                {\r\n                    \"name\": \"關鍵字個數\",\r\n                    \"detail\": \"算灋返回的關鍵字個數，默認20\"\r\n                },\r\n                {\r\n                    \"name\": \"語料庫\",\r\n                    \"detail\": \"選擇特定領域的語料庫，默認0[通用]，1[金融]，2[醫療]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DM_TEXT_TEXTRANK\": {\r\n            \"d\": \"採用TextRank算灋進行關鍵字選取。從一連串文字中識別關鍵字\",\r\n            \"a\": \"TextRank關鍵字識別。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"文字\",\r\n                    \"detail\": \"任意需要分詞的文字。\"\r\n                },\r\n                {\r\n                    \"name\": \"關鍵字個數\",\r\n                    \"detail\": \"算灋返回的關鍵字個數，默認20\"\r\n                },\r\n                {\r\n                    \"name\": \"語料庫\",\r\n                    \"detail\": \"選擇特定領域的語料庫，默認0[通用]，1[金融]，2[醫療]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATA_CN_STOCK_CLOSE\": {\r\n            \"d\": \"根據股票代碼和日期，返回A股對應股票收盤價。\",\r\n            \"a\": \"返回A股對應股票收盤價。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"股票代碼\",\r\n                    \"detail\": \"6位股票代碼，必填項。\"\r\n                },\r\n                {\r\n                    \"name\": \"日期\",\r\n                    \"detail\": \"股票的交易日，默認為最新交易日\"\r\n                },\r\n                {\r\n                    \"name\": \"複權除權\",\r\n                    \"detail\": \"選擇股票的除權複權類型，默認0[前複權]，1[原始價格]，2[後複權]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATA_CN_STOCK_OPEN\": {\r\n            \"d\": \"根據股票代碼和日期，返回A股對應股票開盤價。\",\r\n            \"a\": \"返回A股對應股票開盤價。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"股票代碼\",\r\n                    \"detail\": \"6位股票代碼，必填項。\"\r\n                },\r\n                {\r\n                    \"name\": \"日期\",\r\n                    \"detail\": \"股票的交易日，默認為最新交易日\"\r\n                },\r\n                {\r\n                    \"name\": \"複權除權\",\r\n                    \"detail\": \"選擇股票的除權複權類型，默認0[前複權]，1[原始價格]，2[後複權]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATA_CN_STOCK_MAX\": {\r\n            \"d\": \"根據股票代碼和日期，返回A股對應股票最高價。\",\r\n            \"a\": \"返回A股對應股票最高價。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"股票代碼\",\r\n                    \"detail\": \"6位股票代碼，必填項。\"\r\n                },\r\n                {\r\n                    \"name\": \"日期\",\r\n                    \"detail\": \"股票的交易日，默認為最新交易日\"\r\n                },\r\n                {\r\n                    \"name\": \"複權除權\",\r\n                    \"detail\": \"選擇股票的除權複權類型，默認0[前複權]，1[原始價格]，2[後複權]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATA_CN_STOCK_MIN\": {\r\n            \"d\": \"根據股票代碼和日期，返回A股對應股票最低價。\",\r\n            \"a\": \"返回A股對應股票最低價。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"股票代碼\",\r\n                    \"detail\": \"6位股票代碼，必填項。\"\r\n                },\r\n                {\r\n                    \"name\": \"日期\",\r\n                    \"detail\": \"股票的交易日,默认为最新交易日\"\r\n                },\r\n                {\r\n                    \"name\": \"複權除權\",\r\n                    \"detail\": \"選擇股票的除權複權類型，默認0[前複權]，1[原始價格]，2[後複權]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATA_CN_STOCK_VOLUMN\": {\r\n            \"d\": \"根據股票代碼和日期，返回A股對應股票成交量。\",\r\n            \"a\": \"返回A股對應股票成交量。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"股票代碼\",\r\n                    \"detail\": \"6位股票代碼，必填項。\"\r\n                },\r\n                {\r\n                    \"name\": \"日期\",\r\n                    \"detail\": \"股票的交易日，默認為最新交易日\"\r\n                },\r\n                {\r\n                    \"name\": \"複權除權\",\r\n                    \"detail\": \"選擇股票的除權複權類型，默認0[前複權]，1[原始價格]，2[後複權]\"\r\n                }\r\n            ]\r\n        },\r\n        \"DATA_CN_STOCK_AMOUNT\": {\r\n            \"d\": \"根據股票代碼和日期，返回A股對應股票成交額。\",\r\n            \"a\": \"返回A股對應股票成交額。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"股票代碼\",\r\n                    \"detail\": \"6位股票代碼，必填項。\"\r\n                },\r\n                {\r\n                    \"name\": \"日期\",\r\n                    \"detail\": \"股票的交易日，默認為最新交易日\"\r\n                },\r\n                {\r\n                    \"name\": \"複權除權\",\r\n                    \"detail\": \"選擇股票的除權複權類型，默認0[前複權]，1[原始價格]，2[後複權]\"\r\n                }\r\n            ]\r\n        },\r\n        \"ISDATE\": {\r\n            \"d\": \"驗證日期的格式是否正確。支持多種日期格式\",\r\n            \"a\": \"驗證日期格式正確性。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"日期\",\r\n                    \"detail\": \"日期值,例如1990/01/01, 1990年1月1日等。\"\r\n                }\r\n            ]\r\n        },\r\n        \"LINESPLINES\": {\r\n            \"d\": \"生成嵌入在儲存格內的折線圖sparklines，用於描述數據的連續走勢\",\r\n            \"a\": \"生成儲存格折線圖\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據範圍\",\r\n                    \"detail\": \"數據範圍，數值才能被有效計算，例如A1:A20，{1,2,3,4,5}等。\"\r\n                },\r\n                {\r\n                    \"name\": \"線條顏色\",\r\n                    \"detail\": \"線圖的線條顏色，可以是否個範圍A1、色錶索引數值或者具體顏色值，設定為0或false則不顯示，支持regx、rgb、rgba等。默認#2ec7c9\"\r\n                },\r\n                {\r\n                    \"name\": \"線條粗細\",\r\n                    \"detail\": \"折線圖線段粗細，默認為1px\"\r\n                },\r\n                {\r\n                    \"name\": \"輔助線\",\r\n                    \"detail\": \"一條橫線，可以是min、max、avg、median、範圍或自定義數值，默認0無\"\r\n                },\r\n                {\r\n                    \"name\": \"輔助線顏色\",\r\n                    \"detail\": \"輔助線的顏色設定，同線條顏色配寘，默認#000\"\r\n                },\r\n                {\r\n                    \"name\": \"最大值標識\",\r\n                    \"detail\": \"標識線圖最大值，同線條顏色配寘，默認0不顯示\"\r\n                },\r\n                {\r\n                    \"name\": \"最小值標識\",\r\n                    \"detail\": \"標識線圖最小值，同線條顏色配寘，默認0不顯示\"\r\n                },\r\n                {\r\n                    \"name\": \"標識大小\",\r\n                    \"detail\": \"最大值和最小值的標識大小設定，默認為1.5\"\r\n                }\r\n            ]\r\n        },\r\n        \"AREASPLINES\": {\r\n            \"d\": \"生成嵌入在儲存格內的面積圖sparklines，一般用於描述數據的連續累積值走勢\",\r\n            \"a\": \"生成儲存格面積圖\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據範圍\",\r\n                    \"detail\": \"數據範圍，數值才能被有效計算，例如A1:A20，{1,2,3,4,5}等。\"\r\n                },\r\n                {\r\n                    \"name\": \"線條顏色\",\r\n                    \"detail\": \"線圖的線條顏色，可以是否個範圍A1、色錶索引數值或者具體顏色值，設定為0或false則不顯示，支持regx、rgb、rgba等。默認#2ec7c9\"\r\n                },\r\n                {\r\n                    \"name\": \"填充顏色\",\r\n                    \"detail\": \"形成面積圖，同線條顏色配寘，默認0不顯示\"\r\n                },\r\n                {\r\n                    \"name\": \"線條粗細\",\r\n                    \"detail\": \"折線圖線段粗細，默認為1px\"\r\n                },\r\n                {\r\n                    \"name\": \"輔助線\",\r\n                    \"detail\": \"一條橫線，可以是min、max、avg、median、範圍或自定義數值，默認0無\"\r\n                },\r\n                {\r\n                    \"name\": \"輔助線顏色\",\r\n                    \"detail\": \"輔助線的顏色設定，同線條顏色配寘，默認#000\"\r\n                }\r\n            ]\r\n        },\r\n        \"COLUMNSPLINES\": {\r\n            \"d\": \"生成嵌入在儲存格內的垂直柱狀圖sparklines，一般用於描述離散數據之間的大小情况\",\r\n            \"a\": \"生成儲存格垂直柱狀圖\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據範圍\",\r\n                    \"detail\": \"數據範圍，數值才能被有效計算，例如A1:A20，{1,2,3,4,5}等。\"\r\n                },\r\n                {\r\n                    \"name\": \"柱條間隔\",\r\n                    \"detail\": \"柱條之間的間隔距離，默認為1\"\r\n                },\r\n                {\r\n                    \"name\": \"柱條顏色\",\r\n                    \"detail\": \"線圖的線條顏色，可以是否個範圍A1、色錶索引數值或者具體顏色值，設定為0或false則不顯示，支持regx、rgb、rgba等。默認#fc5c5c\"\r\n                },\r\n                {\r\n                    \"name\": \"負向柱條顏色\",\r\n                    \"detail\": \"負向柱條顏色設定，代表負值的顏色，同柱條顏色配寘，默認#97b552\"\r\n                },\r\n                {\r\n                    \"name\": \"最大值\",\r\n                    \"detail\": \"柱圖最大值，用於規範柱圖長度，默認為自動計算false、auto、null\"\r\n                },\r\n                {\r\n                    \"name\": \"色板\",\r\n                    \"detail\": \"調色板可以單獨設定每個柱條的顏色，可設定多個，支持兩種格式:1顏色例如#000，代表第一個柱的顏色是黑色；2數值範圍:顏色，例如-2:#000表示數值為-2的柱為黑色，0:5:#000表示數值0-5的柱為黑色，默認為空\"\r\n                }\r\n            ]\r\n        },\r\n        \"STACKCOLUMNSPLINES\": {\r\n            \"d\": \"生成嵌入在儲存格內的累積垂直柱狀圖sparklines，一般用於描述離散數據多個維度的數值大小\",\r\n            \"a\": \"生成儲存格累積垂直柱狀圖\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據範圍\",\r\n                    \"detail\": \"數據範圍，數值才能被有效計算，例如A1:A20，{1,2,3,4,5}等。\"\r\n                },\r\n                {\r\n                    \"name\": \"按列堆積\",\r\n                    \"detail\": \"如果需要按行堆積則本項設為false或0，默認為是1\"\r\n                },\r\n                {\r\n                    \"name\": \"柱條間隔\",\r\n                    \"detail\": \"柱條之間的間隔距離，默認為1\"\r\n                },\r\n                {\r\n                    \"name\": \"最大值\",\r\n                    \"detail\": \"累積柱圖最大值，用於規範柱圖長度，默認為自動計算false、auto、null\"\r\n                },\r\n                {\r\n                    \"name\": \"累積色板\",\r\n                    \"detail\": \"調色板可以單獨設定每個維度的柱條顏色，可設定為A1:A10等範圍，默認為#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\"\r\n                }\r\n            ]\r\n        },\r\n        \"BARSPLINES\": {\r\n            \"d\": \"生成嵌入在儲存格內的橫向條形圖sparklines，一般用於描述離散數據之間的大小情况\",\r\n            \"a\": \"生成儲存格橫向條形圖\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據範圍\",\r\n                    \"detail\": \"數據範圍,數值才能被有效計算，例如A1:A20, {1,2,3,4,5}等。\"\r\n                },\r\n                {\r\n                    \"name\": \"柱條間隔\",\r\n                    \"detail\": \"柱條之間的間隔距離，默認為1\"\r\n                },\r\n                {\r\n                    \"name\": \"柱條顏色\",\r\n                    \"detail\": \"線圖的線條顏色，可以是否個範圍A1、色錶索引數值或者具體顏色值，設定為0或false則不顯示，支持regx、rgb、rgba等。默認#fc5c5c\"\r\n                },\r\n                {\r\n                    \"name\": \"負向柱條顏色\",\r\n                    \"detail\": \"負向柱條顏色設定，代表負值的顏色，同柱條顏色配寘，默認#97b552\"\r\n                },\r\n                {\r\n                    \"name\": \"最大值\",\r\n                    \"detail\": \"柱圖最大值，用於規範柱圖長度，默認為自動計算false、auto、null\"\r\n                },\r\n                {\r\n                    \"name\": \"色板\",\r\n                    \"detail\": \"調色板可以單獨設定每個柱條的顏色，可設定多個，支持兩種格式:1顏色例如#000，代表第一個柱的顏色是黑色；2數值範圍:顏色，例如-2:#000表示數值為-2的柱為黑色，0:5:#000表示數值0-5的柱為黑色，默認為空\"\r\n                }\r\n            ]\r\n        },\r\n        \"STACKBARSPLINES\": {\r\n            \"d\": \"生成嵌入在儲存格內的累積橫向條形圖sparklines，一般用於描述離散數據多個維度的數值大小\",\r\n            \"a\": \"生成儲存格累積橫向條形圖\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據範圍\",\r\n                    \"detail\": \"數據範圍,數值才能被有效計算，例如A1:A20, {1,2,3,4,5}等。\"\r\n                },\r\n                {\r\n                    \"name\": \"按列堆積\",\r\n                    \"detail\": \"如果需要按行堆積則本項設為false或0，默認為是1\"\r\n                },\r\n                {\r\n                    \"name\": \"柱條間隔\",\r\n                    \"detail\": \"柱條之間的間隔距離，默認為1\"\r\n                },\r\n                {\r\n                    \"name\": \"最大值\",\r\n                    \"detail\": \"累積柱圖最大值，用於規範柱圖長度，默認為自動計算false、auto、null\"\r\n                },\r\n                {\r\n                    \"name\": \"累積色板\",\r\n                    \"detail\": \"調色板可以單獨設定每個維度的柱條顏色，可設定為A1:A10等範圍，默認為#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\"\r\n                }\r\n            ]\r\n        },\r\n        \"DISCRETESPLINES\": {\r\n            \"d\": \"生成嵌入在儲存格內的離散圖sparklines，一般用於描述離散數據走勢\",\r\n            \"a\": \"生成儲存格離散圖\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據範圍\",\r\n                    \"detail\": \"數據範圍,數值才能被有效計算，例如A1:A20, {1,2,3,4,5}等。\"\r\n                },\r\n                {\r\n                    \"name\": \"分割閾值\",\r\n                    \"detail\": \"離散圖柱形顏色的區分，例如:該值為0，則大於0為藍色，小於0為紅色，默認為0\"\r\n                },\r\n                {\r\n                    \"name\": \"閾值以上顏色\",\r\n                    \"detail\": \"線圖的線條顏色，可以是否個範圍A1、色錶索引數值或者具體顏色值，設定為0或false則不顯示，支持regx、rgb、rgba等。默認#2ec7c9\"\r\n                },\r\n                {\r\n                    \"name\": \"閾值以下顏色\",\r\n                    \"detail\": \"閾值以下柱條顏色設定，同閾值以上顏色，默認#fc5c5c\"\r\n                }\r\n            ]\r\n        },\r\n        \"TRISTATESPLINES\": {\r\n            \"d\": \"生成嵌入在儲存格內的三態圖sparklines，一般用於描述三種態勢的走勢例如勝負平\",\r\n            \"a\": \"生成儲存格三態圖\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據範圍\",\r\n                    \"detail\": \"數據範圍,數值才能被有效計算，例如A1:A20, {1,2,3,4,5}等。\"\r\n                },\r\n                {\r\n                    \"name\": \"柱條間隔\",\r\n                    \"detail\": \"柱條之間的間隔距離，默認為1\"\r\n                },\r\n                {\r\n                    \"name\": \"柱條顏色\",\r\n                    \"detail\": \"線圖的線條顏色，可以是否個範圍A1、色錶索引數值或者具體顏色值，設定為0或false則不顯示，支持regx、rgb、rgba等。默認#fc5c5c\"\r\n                },\r\n                {\r\n                    \"name\": \"负向柱條顏色\",\r\n                    \"detail\": \"負向柱條顏色設定，代表負值的顏色，同柱條顏色配寘，默認#97b552\"\r\n                },\r\n                {\r\n                    \"name\": \"零值柱條顏色\",\r\n                    \"detail\": \"零值柱條顏色設定，代表0值顏色，同柱條顏色配寘，默認#999\"\r\n                },\r\n                {\r\n                    \"name\": \"色板\",\r\n                    \"detail\": \"調色板可以單獨設定每個柱條的顏色，可設定多個，支持兩種格式:1顏色例如#000，代表第一個柱的顏色是黑色；2數值範圍:顏色，例如-2:#000表示數值為-2的柱為黑色，0-5:#000表示數值0-5的柱為黑色，默認為空\"\r\n                }\r\n            ]\r\n        },\r\n        \"PIESPLINES\": {\r\n            \"d\": \"生成嵌入在儲存格內的餅圖sparklines，一般用於描述數據占比\",\r\n            \"a\": \"生成儲存格餅圖\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據範圍\",\r\n                    \"detail\": \"數據範圍,數值才能被有效計算，例如A1:A20, {1,2,3,4,5}等。\"\r\n                },\r\n                {\r\n                    \"name\": \"旋轉角度\",\r\n                    \"detail\": \"餅圖的旋轉角度，默認為0\"\r\n                },\r\n                {\r\n                    \"name\": \"餅圖邊框\",\r\n                    \"detail\": \"餅圖邊框大小，默認為無0\"\r\n                },\r\n                {\r\n                    \"name\": \"邊框顏色\",\r\n                    \"detail\": \"餅圖邊框顏色，默認為#000\"\r\n                },\r\n                {\r\n                    \"name\": \"餅圖色板\",\r\n                    \"detail\": \"調色板可以設定切片的顏色，可設定為A1:A10等範圍，默認為#2ec7c9, #fc5c5c, #5ab1ef, #ffb980...\"\r\n                }\r\n            ]\r\n        },\r\n        \"BOXSPLINES\": {\r\n            \"d\": \"生成嵌入在儲存格內的箱線圖sparklines，一般用於描述數據集的統計分佈\",\r\n            \"a\": \"生成儲存格箱線圖\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"數據範圍\",\r\n                    \"detail\": \"數據範圍,數值才能被有效計算，例如A1:A20, {1,2,3,4,5}等。\"\r\n                },\r\n                {\r\n                    \"name\": \"離群點比例\",\r\n                    \"detail\": \"離群點的閾值範圍，如果為0或false則不顯示，默認為1.5倍\"\r\n                },\r\n                {\r\n                    \"name\": \"目標點值\",\r\n                    \"detail\": \"箱線圖上的目標值設定，默認為false不顯示\"\r\n                },\r\n                {\r\n                    \"name\": \"數據點大小\",\r\n                    \"detail\": \"目標點和離群點的半徑大小設定，默認為1.5\"\r\n                }\r\n            ]\r\n        },\r\n        \"BULLETSPLINES\": {\r\n            \"d\": \"生成嵌入在儲存格內的子彈圖sparklines，一般用於描述任務達成率\",\r\n            \"a\": \"生成儲存格子彈圖\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"目標\",\r\n                    \"detail\": \"達成的目標值，數值才能被有效計算，例如A1，100等。\"\r\n                },\r\n                {\r\n                    \"name\": \"實際完成\",\r\n                    \"detail\": \"現時完成值，數值才能被有效計算，例如A1，100等。\"\r\n                },\r\n                {\r\n                    \"name\": \"對比值\",\r\n                    \"detail\": \"對比值，例如超額、最低、獲獎底線等，數值才能被有效計算，例如A1，100等。可以設定最多9個對比值\"\r\n                }\r\n            ]\r\n        },\r\n        \"COMPOSESPLINES\": {\r\n            \"d\": \"支持多個類型的圖畫在同一個儲存格，每個參數代表一個sparklines圖\",\r\n            \"a\": \"組合sparklines圖到一個儲存格\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"圖設定\",\r\n                    \"detail\": \"sparklines圖設定，例如A1:A20，一個完成的餅圖、線圖設定等。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SORT\": {\r\n            \"d\": \"返回數組中元素的排序數組。返回的數組與提供的數組參數形狀相同。\",\r\n            \"a\": \"返回數組中元素的排序數組。返回的數組與提供的數組參數形狀相同。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"要排序的範圍或數組。\"\r\n                },\r\n                {\r\n                    \"name\": \"sort_index\",\r\n                    \"detail\": \"[可選] - 表示要排序的行或列的數位。（默認row1/col1）\"\r\n                },\r\n                {\r\n                    \"name\": \"sort_order\",\r\n                    \"detail\": \"[可選] - 表示所需排序順序的數位；1表示昇冪（默認），-1表示降序。\"\r\n                },\r\n                {\r\n                    \"name\": \"by_col\",\r\n                    \"detail\": \"[可選] - 表示所需排序方向的邏輯值；按行排序為FALSE（）（默認），按列排序為TRUE（）。\"\r\n                }\r\n            ]\r\n        },\r\n        \"FILTER\": {\r\n            \"d\": \"基於一個布林（真/假）數組過濾一個數組。\",\r\n            \"a\": \"基於一個布林（真/假）數組過濾一個數組。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"要篩選的數組或範圍。\"\r\n                },\r\n                {\r\n                    \"name\": \"include\",\r\n                    \"detail\": \"布林數組，其高度或寬度與數組相同\"\r\n                },\r\n                {\r\n                    \"name\": \"if_empty\",\r\n                    \"detail\": \"[可選] - 如果包含數組中的所有值都為空（filter不返回任何值），則返回的值。\"\r\n                }\r\n            ]\r\n        },\r\n        \"UNIQUE\": {\r\n            \"d\": \"返回列表或區域中的唯一值的清單。\",\r\n            \"a\": \"返回列表或區域中的唯一值的清單。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"array\",\r\n                    \"detail\": \"從其返回唯一值的數組或區域。\"\r\n                },\r\n                {\r\n                    \"name\": \"by_col\",\r\n                    \"detail\": \"[可選] - 邏輯值，訓示如何比較；按行= FALSE（）或省略；按列= TRUE（）。\"\r\n                },\r\n                {\r\n                    \"name\": \"occurs_once\",\r\n                    \"detail\": \"[可選] - 邏輯值，僅返回唯一值中出現一次= TRUE（）；包括所有唯一值= FALSE（）或省略。\"\r\n                }\r\n            ]\r\n        },\r\n        \"RANDARRAY\": {\r\n            \"d\": \"返回0到1之間的隨機數位數組。\",\r\n            \"a\": \"返回0到1之間的隨機數位數組\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rows\",\r\n                    \"detail\": \"[可選] - 要返回的行數。\"\r\n                },\r\n                {\r\n                    \"name\": \"cols\",\r\n                    \"detail\": \"[可選] - 要返回的列數。\"\r\n                }\r\n            ]\r\n        },\r\n        \"SEQUENCE\": {\r\n            \"d\": \"生成數位序列的清單。\",\r\n            \"a\": \"生成數位序列的清單。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"rows\",\r\n                    \"detail\": \"要返回的行數。\"\r\n                },\r\n                {\r\n                    \"name\": \"cols\",\r\n                    \"detail\": \"[可選] - 要返回的列數。\"\r\n                },\r\n                {\r\n                    \"name\": \"start\",\r\n                    \"detail\": \"[可選] - 序列中的第一個數位。\"\r\n                },\r\n                {\r\n                    \"name\": \"step\",\r\n                    \"detail\": \"[可選] -序列中每個序列值的增量。\"\r\n                }\r\n            ]\r\n        },\r\n        \"EVALUATE\": {\r\n            \"d\": \"對以文字表示的公式或者表達式求值，並返回結果。\",\r\n            \"a\": \"根據文字公式或者表達式求值。\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"公式\",\r\n                    \"detail\": \"公式或表達式\"\r\n                }\r\n            ]\r\n        },\r\n        \"REMOTE\": {\r\n            \"d\": \"Calls a function on a remote server\",\r\n            \"a\": \"Calls a function on a remote back end server/API.\",\r\n            \"p\": [\r\n                {\r\n                    \"name\": \"remote_expression\",\r\n                    \"detail\": \"Formula\"\r\n                }\r\n            ]\r\n        }\r\n    },\r\n    toolbar: {\r\n        undo               : '撤銷',\r\n        redo               : '重做',\r\n        paintFormat        : '格式刷',\r\n        currencyFormat     : '貨幣格式',\r\n        percentageFormat   : '百分比格式',\r\n        numberDecrease     : '减少小數位數',\r\n        numberIncrease     : '新增小數位數',\r\n        moreFormats        : '更多格式',\r\n        font               : '字體',\r\n        fontSize           : '字型大小',\r\n        bold               : '粗體（Ctrl+B）',\r\n        italic             : '斜體（Ctrl+I）',\r\n        strikethrough      : '删除線（Alt+Shift+5）',\r\n        underline          : '底線',\r\n        textColor          : '文字顏色',\r\n        chooseColor        : '顏色選擇',\r\n        resetColor         : '重置顏色',\r\n        customColor        : '自定義',\r\n        alternatingColors  : '交替顏色',\r\n        confirmColor       : '確定顏色',\r\n        cancelColor        : '取消',\r\n        collapse           : '收起',\r\n        fillColor          : '儲存格顏色',\r\n        border             : '邊框',\r\n        borderStyle        : '邊框類型',\r\n        mergeCell          : '合併儲存格',\r\n        chooseMergeType    : '選擇合併類型',\r\n        horizontalAlign    : '水准對齊',\r\n        verticalAlign      : '垂直對齊',\r\n        alignment          : '對齊管道',\r\n        textWrap           : '文字換行',\r\n        textWrapMode       : '換行管道',\r\n        textRotate         : '文字旋轉',\r\n        textRotateMode     : '旋轉管道',\r\n        freezeTopRow       : '凍結第一行',\r\n        sortAndFilter      : '排序和篩選',\r\n        findAndReplace     : '查找替換',\r\n        sum                : '求和',\r\n        autoSum            : '自動求和',\r\n        moreFunction       : '更多函數',\r\n        conditionalFormat  : '條件格式',\r\n        postil             : '批註',\r\n        pivotTable         : '數據透視錶',\r\n        chart              : '圖表',\r\n        screenshot         : '截圖',\r\n        splitColumn        : '分列',\r\n        insertImage        : '插入圖片',\r\n        exportXlsx         : \"導出Xlsx\",\r\n        insertLink         : '插入連結',\r\n        dataVerification   : '數據驗證',\r\n        protection         : '保護工作表內容',\r\n        clearText          : '清除顏色選擇',\r\n        noColorSelectedText: '沒有顏色被選擇',\r\n        toolMore           : '更多',\r\n        toolLess           : '少於',\r\n        toolClose          : '收起',\r\n        toolMoreTip        : '更多功能',\r\n        moreOptions        : '更多選項',\r\n        cellFormat         : '設定儲存格格式',\r\n        print              : '列印'\r\n    },\r\n    alternatingColors: {\r\n        applyRange        : '應用範圍',\r\n        selectRange       : '選擇應用範圍',\r\n        header            : '頁眉',\r\n        footer            : '頁腳',\r\n        errorInfo         : '不能對多重選擇區域執行此操作,請選擇單個區域,然後再試',\r\n        textTitle         : '格式樣式',\r\n        custom            : '自定義',\r\n        close             : '關閉',\r\n        selectionTextColor: '選擇文字顏色',\r\n        selectionCellColor: '選擇儲存格顏色',\r\n        removeColor       : '移除交替顏色',\r\n        colorShow         : '顏色',\r\n        currentColor      : '當前顏色',\r\n        tipSelectRange    : '請選擇交替顏色應用範圍',\r\n        errorNoRange      : '您選擇的應用範圍不是選區！',\r\n        errorExistColors  : '您選擇的應用範圍已存在交替顏色且不屬於你要編輯的應用範圍！',\r\n    },\r\n    button: {\r\n        confirm: '確定',\r\n        cancel : '取消',\r\n        close  : \"關閉\",\r\n        update : \"Update\",\r\n        delete : \"Delete\",\r\n        insert : \"新建\",\r\n        prevPage: \"上一頁\",\r\n        nextPage: \"下一頁\",\r\n        total: \"總共：\"\r\n    },\r\n    paint: {\r\n        start         : '格式刷開啟',\r\n        end           : 'ESC鍵退出',\r\n        tipSelectRange: '請選擇需要複製格式的區域',\r\n        tipNotMulti   : '無法對多重選擇區域執行此操作',\r\n    },\r\n    format: {\r\n        moreCurrency : '更多貨幣格式',\r\n        moreDateTime : '更多日期與時間格式',\r\n        moreNumber   : '更多數位格式',\r\n        titleCurrency: '貨幣格式',\r\n        decimalPlaces: '小數位數',\r\n        titleDateTime: '日期與時間格式',\r\n        titleNumber  : '數位格式'\r\n    },\r\n    info: {\r\n        detailUpdate: '新打開',\r\n        detailSave  : '已恢復本地緩存',\r\n        row         : '行',\r\n        column      : '列',\r\n        loading     : '渲染中···',\r\n\r\n        copy  : '副本',\r\n        return: '返回',\r\n        rename: '重命名',\r\n        tips  : '表格重命名',\r\n        noName: '無標題的試算表',\r\n        wait  : '待更新',\r\n\r\n        add     : '添加',\r\n        addLast : '在底部添加',\r\n        backTop : '回到頂部',\r\n        pageInfo: '共${total}條,${totalPage}頁,當前已顯示${currentPage}頁',\r\n        nextPage: '下一頁',\r\n\r\n        tipInputNumber     : '請輸入數位',\r\n        tipInputNumberLimit: '新增範圍限制在1-100',\r\n\r\n        tipRowHeightLimit  : '行高必須在0 ~ 545之間',\r\n        tipColumnWidthLimit: '列寬必須在0 ~ 2038之間',\r\n        pageInfoFull       : '共${total}條,${totalPage}頁,已顯示全部數據',\r\n    },\r\n    currencyDetail: {\r\n        RMB                             : '人民幣',\r\n        USdollar                        : '美元',\r\n        EUR                             : '歐元',\r\n        GBP                             : '英鎊',\r\n        HK                              : '港元',\r\n        JPY                             : '日元',\r\n        AlbanianLek                     : '阿爾巴尼亞列克',\r\n        AlgerianDinar                   : '阿爾及利亞第納爾',\r\n        Afghani                         : '阿富汗尼',\r\n        ArgentinePeso                   : '阿根廷比索',\r\n        UnitedArabEmiratesDirham        : '阿拉伯聯合大公國迪拉姆',\r\n        ArubanFlorin                    : '阿魯巴弗羅林',\r\n        OmaniRial                       : '阿曼裡亞爾',\r\n        Azerbaijanimanat                : '阿塞拜疆馬納特',\r\n        EgyptianPound                   : '埃及鎊',\r\n        EthiopianBirr                   : '衣索比亞比爾',\r\n        AngolaKwanza                    : '安哥拉寬紮',\r\n        AustralianDollar                : '澳大利亞元',\r\n        Patacas                         : '澳門元',\r\n        BarbadosDollar                  : '巴巴多斯元',\r\n        PapuaNewGuineaKina              : '巴布亞新幾內亞基那',\r\n        BahamianDollar                  : '巴哈馬元',\r\n        PakistanRupee                   : '巴基斯坦盧比',\r\n        ParaguayanGuarani               : '巴拉圭瓜拉尼',\r\n        BahrainiDinar                   : '巴林第納爾',\r\n        PanamanianBalboa                : '巴拿馬巴波亞',\r\n        Brazilianreal                   : '巴西裏亞伊',\r\n        Belarusianruble                 : '白俄羅斯盧布',\r\n        BermudianDollar                 : '百慕大元',\r\n        BulgarianLev                    : '保加利亞列弗',\r\n        IcelandKrona                    : '冰島克朗',\r\n        BosniaHerzegovinaConvertibleMark: '波黑可兌換馬克',\r\n        PolishZloty                     : '波蘭茲羅提',\r\n        Boliviano                       : '玻利維亞諾',\r\n        BelizeDollar                    : '貝裡斯元',\r\n        BotswanaPula                    : '波劄那普拉',\r\n        NotDannuzhamu                   : '不丹努紮姆',\r\n        BurundiFranc                    : '布隆迪法郎',\r\n        NorthKoreanWon                  : '朝鮮圓',\r\n        DanishKrone                     : '丹麥克朗',\r\n        EastCaribbeanDollar             : '東加勒比元',\r\n        DominicaPeso                    : '多明尼加比索',\r\n        RussianRuble                    : '俄國盧布',\r\n        EritreanNakfa                   : '厄利垂亞納克法',\r\n        CFAfranc                        : '非洲金融共同體法郎',\r\n        PhilippinePeso                  : '菲律賓比索',\r\n        FijiDollar                      : '斐濟元',\r\n        CapeVerdeEscudo                 : '佛得角埃斯庫多',\r\n        FalklandIslandsPound            : '福克蘭群島鎊',\r\n        GambianDalasi                   : '岡比亞達拉西',\r\n        Congolesefranc                  : '剛果法郎',\r\n        ColombianPeso                   : '哥倫比亞比索',\r\n        CostaRicanColon                 : '哥斯大黎加科朗',\r\n        CubanPeso                       : '古巴比索',\r\n        Cubanconvertiblepeso            : '古巴可兌換比索',\r\n        GuyanaDollar                    : '蓋亞那元',\r\n        KazakhstanTenge                 : '哈薩克共和國堅戈',\r\n        Haitiangourde                   : '海地古德',\r\n        won                             : '韓元',\r\n        NetherlandsAntillesGuilder      : '荷屬安的列斯盾',\r\n        Honduraslempiras                : '洪都拉斯拉倫皮拉',\r\n        DjiboutiFranc                   : '吉布提法郎',\r\n        KyrgyzstanSom                   : '吉爾吉斯斯坦索姆',\r\n        GuineaFranc                     : '幾內亞法郎',\r\n        CanadianDollar                  : '加拿大元',\r\n        GhanaianCedi                    : '加納塞地',\r\n        Cambodianriel                   : '高棉瑞爾',\r\n        CzechKoruna                     : '捷克克朗',\r\n        ZimbabweDollar                  : '辛巴威元',\r\n        QatariRiyal                     : '卡塔爾裡亞爾',\r\n        CaymanIslandsDollar             : '開曼群島元',\r\n        Comorianfranc                   : '科摩羅法郎',\r\n        KuwaitiDinar                    : '科威特第納爾',\r\n        CroatianKuna                    : '克羅地亞庫納',\r\n        KenyanShilling                  : '肯雅先令',\r\n        LesothoLoti                     : '萊索托洛蒂',\r\n        LaoKip                          : '老撾基普',\r\n        LebanesePound                   : '黎巴嫩鎊',\r\n        Lithuanianlitas                 : '立陶宛立特',\r\n        LibyanDinar                     : '利比亞第納爾',\r\n        LiberianDollar                  : '利比亞元',\r\n        RwandaFranc                     : '盧安達法郎',\r\n        RomanianLeu                     : '羅馬尼亞列伊',\r\n        MalagasyAriary                  : '馬拉加西阿裏亞裏',\r\n        MaldivianRufiyaa                : '瑪律地夫拉菲亞',\r\n        MalawiKwacha                    : '馬拉威克瓦查',\r\n        MalaysianRinggit                : '馬來西亞林吉特',\r\n        MacedoniawearingDinar           : '馬其頓戴第納爾',\r\n        MauritiusRupee                  : '模裡西斯盧比',\r\n        MauritanianOuguiya              : '茅利塔尼亞烏吉亞',\r\n        MongolianTugrik                 : '蒙古圖格裡克',\r\n        BangladeshiTaka                 : '孟加拉塔卡',\r\n        PeruvianNuevoSol                : '秘魯新索爾',\r\n        MyanmarKyat                     : '緬甸開亞特',\r\n        MoldovanLeu                     : '莫爾達瓦列伊',\r\n        MoroccanDirham                  : '摩洛哥迪拉姆',\r\n        MozambiqueMetical               : '莫三比克梅蒂卡爾',\r\n        MexicanPeso                     : '墨西哥比索',\r\n        NamibianDollar                  : '納米比亞元',\r\n        SouthAfricanRand                : '南非蘭特',\r\n        SouthSudanesePound              : '南蘇丹鎊',\r\n        NicaraguaCordoba                : '尼加拉瓜科多巴',\r\n        NepaleseRupee                   : '尼泊爾盧比',\r\n        NigerianNaira                   : '奈及利亞奈拉',\r\n        NorwegianKrone                  : '挪威克朗',\r\n        GeorgianLari                    : '喬治亞拉瑞',\r\n        RMBOffshore                     : '人民幣（離岸）',\r\n        SwedishKrona                    : '瑞典克朗',\r\n        SwissFranc                      : '瑞士法郎',\r\n        SerbianDinar                    : '塞爾維亞第納爾',\r\n        SierraLeone                     : '塞拉里昂利昂',\r\n        SeychellesRupee                 : '塞舌耳盧比',\r\n        SaudiRiyal                      : '沙特裡亞爾',\r\n        SaoTomeDobra                    : '聖多美多布拉',\r\n        SaintHelenapound                : '聖赫倫那群島磅',\r\n        SriLankaRupee                   : '斯里蘭卡盧比',\r\n        SwazilandLilangeni              : '史瓦濟蘭裏蘭吉尼',\r\n        SudanesePound                   : '蘇丹鎊',\r\n        Surinamesedollar                : '蘇利南元',\r\n        SolomonIslandsDollar            : '所羅門群島元',\r\n        SomaliShilling                  : '索馬利亞先令',\r\n        TajikistanSomoni                : '塔吉克共和國索莫尼',\r\n        PacificFranc                    : '太平洋法郎',\r\n        ThaiBaht                        : '泰國銖',\r\n        TanzanianShilling               : '坦尚尼亞先令',\r\n        TonganPaanga                    : '東加潘加',\r\n        TrinidadandTobagoDollar         : '千裡達托貝哥元',\r\n        TunisianDinar                   : '突尼斯第納爾',\r\n        TurkishLira                     : '土耳其里拉',\r\n        VanuatuVatu                     : '瓦努阿圖瓦圖',\r\n        GuatemalanQuetzal               : '瓜地馬拉格查爾',\r\n        CommissionBolivar               : '委內瑞拉博利瓦',\r\n        BruneiDollar                    : '汶萊元',\r\n        UgandanShilling                 : '烏干達先令',\r\n        UkrainianHryvnia                : '烏克蘭格裡夫尼亞',\r\n        UruguayanPeso                   : '烏拉圭比索',\r\n        Uzbekistansom                   : '烏茲別克蘇姆',\r\n        WesternSamoaTala                : '薩摩亞塔拉',\r\n        SingaporeDollar                 : '新加坡元',\r\n        NT                              : '新臺幣',\r\n        NewZealandDollar                : '新西蘭元',\r\n        HungarianForint                 : '匈牙利福林',\r\n        SyrianPound                     : '敘利亞鎊',\r\n        JamaicanDollar                  : '牙買加元',\r\n        ArmenianDram                    : '亞美尼亞德拉姆',\r\n        YemeniRial                      : '葉門裡亞爾',\r\n        IraqiDinar                      : '伊拉克第納爾',\r\n        IranianRial                     : '伊朗裡亞爾',\r\n        NewIsraeliShekel                : '以色列新謝克爾',\r\n        IndianRupee                     : '印度盧比',\r\n        IndonesianRupiah                : '印尼盧比',\r\n        JordanianDinar                  : '約旦第納爾',\r\n        VND                             : '越南盾',\r\n        ZambianKwacha                   : '尚比亞克瓦查',\r\n        GibraltarPound                  : '直布羅陀鎊',\r\n        ChileanPeso                     : '智利比索',\r\n        CFAFrancBEAC                    : '中非金融合作法郎',\r\n    },\r\n    defaultFmt: [\r\n        { \"text\": '自動', \"value\": \"General\", \"example\": \"\" },\r\n        { \"text\": '純文字', \"value\": \"@\", \"example\": \"\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": '數位', \"value\": \"##0.00\", \"example\": \"1000.12\" },\r\n        { \"text\": '百分比', \"value\": \"#0.00%\", \"example\": \"12.21%\" },\r\n        { \"text\": '科學計數', \"value\": \"0.00E+00\", \"example\": \"1.01E+5\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": '會計', \"value\": \"¥(0.00)\", \"example\": \"¥(1200.09)\" },\r\n        //{ \"text\": \"財務\", \"value\": \"(#.####)\", \"example\": \"(1200.09)\" },\r\n        { \"text\": '萬元', \"value\": \"w\", \"example\": \"1亿2000万2500\" },\r\n        { \"text\": '貨幣', \"value\": \"¥0.00\", \"example\": \"¥1200.09\" },\r\n        //{ \"text\": \"貨幣整數\", \"value\": \"¥####\", \"example\": \"¥1200\" },\r\n        { \"text\": '萬元2位小數', \"value\": \"w0.00\", \"example\": \"2万2500.55\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": '日期', \"value\": \"yyyy-MM-dd\", \"example\": \"2017-11-29\" },\r\n        { \"text\": '時間', \"value\": \"hh:mm AM/PM\", \"example\": \"3:00 PM\" },\r\n        { \"text\": '時間24H', \"value\": \"hh:mm\", \"example\": \"15:00\" },\r\n        { \"text\": '日期時間', \"value\": \"yyyy-MM-dd hh:mm AM/PM\", \"example\": \"2017-11-29 3:00 PM\" },\r\n        { \"text\": '日期時間24H', \"value\": \"yyyy-MM-dd hh:mm\", \"example\": \"2017-11-29 15:00\" },\r\n        { \"text\": \"\", \"value\": \"split\", \"example\": \"\" },\r\n        { \"text\": '自定義格式', \"value\": \"fmtOtherSelf\", \"example\": \"more\" }\r\n    ],\r\n    dateFmtList: [\r\n        {\r\n            \"name\" : \"1930-08-05\",\r\n            \"value\": \"yyyy-MM-dd\"\r\n        },\r\n        {\r\n            \"name\" : \"1930/8/5\",\r\n            \"value\": \"yyyy/MM/dd\"\r\n        },\r\n        {\r\n            \"name\" : \"1930年8月5日\",\r\n            \"value\": 'yyyy\"年\"M\"月\"d\"日\"'\r\n        },\r\n        {\r\n            \"name\" : \"08-05\",\r\n            \"value\": \"MM-dd\"\r\n        },\r\n        {\r\n            \"name\" : \"8-5\",\r\n            \"value\": \"M-d\"\r\n        },\r\n        {\r\n            \"name\" : \"8月5日\",\r\n            \"value\": 'M\"月\"d\"日\"'\r\n        },\r\n        {\r\n            \"name\" : \"13:30:30\",\r\n            \"value\": \"h:mm:ss\"\r\n        },\r\n        {\r\n            \"name\" : \"13:30\",\r\n            \"value\": \"h:mm\"\r\n        },\r\n        {\r\n            \"name\" : \"下午01:30\",\r\n            \"value\": '上午/下午 hh:mm'\r\n        },\r\n        {\r\n            \"name\" : \"下午1:30\",\r\n            \"value\": '上午/下午 h:mm'\r\n        },\r\n        {\r\n            \"name\" : \"下午1:30:30\",\r\n            \"value\": '上午/下午 h:mm:ss'\r\n        },\r\n        {\r\n            \"name\" : \"08-05 下午01:30\",\r\n            \"value\": \"MM-dd 上午/下午 hh:mm\"\r\n        },\r\n        // {\r\n        //     \"name\": \"1930年8月5日星期二\",\r\n        //     \"value\": ''\r\n        // },\r\n        // {\r\n        //     \"name\": \"1930年8月5日星期二 下午1:30:30\",\r\n        //     \"value\": ''\r\n        // },\r\n    ],\r\n    fontFamily: {\r\n        MicrosoftYaHei: \"Microsoft YaHei\",\r\n    },\r\n    fontarray: [\"Times New Roman\", \"Arial\", \"Tahoma\", \"Verdana\", \"微軟雅黑\", \"宋體\", \"黑體\", \"楷體\", \"仿宋\", \"新宋體\", \"華文新魏\", \"華文行楷\", \"華文隸書\"],\r\n    fontjson : { \"times new roman\": 0, \"arial\": 1, \"tahoma\": 2, \"verdana\": 3, \"微軟雅黑\": 4, \"microsoft yahei\": 4, \"宋體\": 5, \"simsun\": 5, \"黑體\": 6, \"simhei\": 6, \"楷體\": 7, \"kaiti\": 7, \"仿宋\": 8, \"fangsong\": 8, \"新宋體\": 9, \"nsimsun\": 9, \"華文新魏\": 10, \"stxinwei\": 10, \"華文行楷\": 11, \"stxingkai\": 11, \"華文隸書\": 12, \"stliti\": 12, },\r\n    border   : {\r\n        borderTop       : '上框線',\r\n        borderBottom    : '下框線',\r\n        borderLeft      : '左框線',\r\n        borderRight     : '右框線',\r\n        borderNone      : '無',\r\n        borderAll       : '所有',\r\n        borderOutside   : '外側',\r\n        borderInside    : '內側',\r\n        borderHorizontal: '內側橫線',\r\n        borderVertical  : '內側分隔號',\r\n        borderColor     : '邊框顏色',\r\n        borderSize      : '邊框粗細'\r\n    },\r\n    merge: {\r\n        mergeAll        : \"全部合併\",\r\n        mergeV          : \"垂直合併\",\r\n        mergeH          : \"水平合併\",\r\n        mergeCancel     : \"取消合併\",\r\n        overlappingError: \"不能合併重疊區域\",\r\n        partiallyError  : \"無法對部分合併儲存格執行此操作\",\r\n    },\r\n    align: {\r\n        left  : \"左對齊\",\r\n        center: \"中間對齊\",\r\n        right : \"右對齊\",\r\n\r\n        top   : \"頂部對齊\",\r\n        middle: \"居中對齊\",\r\n        bottom: \"底部對齊\",\r\n    },\r\n    textWrap: {\r\n        \"overflow\": \"溢出\",\r\n        \"wrap\"    : \"自動換行\",\r\n        \"clip\"    : \"截斷\",\r\n    },\r\n    rotation: {\r\n        \"none\"        : \"無旋轉\",\r\n        \"angleup\"     : \"向上傾斜\",\r\n        \"angledown\"   : \"向下傾斜\",\r\n        \"vertical\"    : \"豎排文字\",\r\n        \"rotationUp\"  : \"向上90°\",\r\n        \"rotationDown\": \"向下90°\"\r\n    },\r\n    freezen: {\r\n        default           : \"凍結第一行\",\r\n        freezenRow        : \"凍結第一行\",\r\n        freezenColumn     : \"凍結第A列\",\r\n        freezenRC         : \"凍結行列\",\r\n        freezenRowRange   : \"凍結行到選區\",\r\n        freezenColumnRange: \"凍結列到選區\",\r\n        freezenRCRange    : \"凍結行列到選區\",\r\n        freezenCancel     : \"取消凍結\",\r\n\r\n        noSeletionError: \"没有選區\",\r\n        rangeRCOverErrorTitle: \"凍結提醒\",\r\n        rangeRCOverError: \"凍結窗格超過可見範圍，會導致無法正常操作，請重新設定凍結區域。\"\r\n    },\r\n    sort: {\r\n        \"asc\"   : \"昇冪\",\r\n        \"desc\"  : \"降序\",\r\n        \"custom\": \"自定義排序\",\r\n\r\n        \"hasTitle\" : \"數據具有標題行\",\r\n        \"sortBy\"   : \"排序依據\",\r\n        \"addOthers\": \"添加其他排序列\",\r\n        \"close\"    : \"關閉\",\r\n        \"confirm\"  : \"排序\",\r\n\r\n        \"columnOperation\": \"列\",\r\n        \"secondaryTitle\" : \"次要排序\",\r\n\r\n        \"sortTitle\": \"排序範圍\",\r\n\r\n        \"sortRangeTitle\"  : \"排序範圍從\",\r\n        \"sortRangeTitleTo\": \"到\",\r\n\r\n\r\n        \"noRangeError\": \"不能對多重選擇區域執行此操作,請選擇單個區域,然後再試\",\r\n        \"mergeError\"  : \"選區有合併儲存格,無法執行此操作！\",\r\n        \"columnSortMergeError\": \"列排序會擴展至整個表格選區，選區有合並單元格，無法執行此操作，請選擇功能欄排序功能！\",\r\n    },\r\n    filter: {\r\n        \"filter\"     : \"篩選\",\r\n        \"clearFilter\": \"清除篩選\",\r\n\r\n        sortByAsc        : \"以A-Z昇冪排列\",\r\n        sortByDesc       : \"以Z-A降序排列\",\r\n        filterByColor    : \"按顏色篩選\",\r\n        filterByCondition: \"按條件過濾\",\r\n        filterByValues   : \"按值過濾\",\r\n\r\n        filiterInputNone: \"無\",\r\n\r\n        filiterInputTip     : \"輸入篩選值\",\r\n        filiterRangeStart   : \"從\",\r\n        filiterRangeStartTip: \"範圍開始\",\r\n        filiterRangeEnd     : \"到\",\r\n        filiterRangeEndTip  : \"範圍结束\",\r\n\r\n        filterValueByAllBtn    : \"全選\",\r\n        filterValueByClearBtn  : \"清除\",\r\n        filterValueByInverseBtn: \"反選\",\r\n        filterValueByTip       : \"按照值進行篩選\",\r\n        filterConform          : \"確 認\",\r\n        filterCancel           : \"取 消\",\r\n\r\n        conditionNone              : \"無\",\r\n        conditionCellIsNull        : \"儲存格為空\",\r\n        conditionCellNotNull       : \"儲存格有數據\",\r\n        conditionCellTextContain   : \"文字包含\",\r\n        conditionCellTextNotContain: \"文字不包含\",\r\n        conditionCellTextStart     : \"文字開頭為\",\r\n        conditionCellTextEnd       : \"文字結尾為\",\r\n        conditionCellTextEqual     : \"文字等於\",\r\n        conditionCellDateEqual     : \"日期等於\",\r\n        conditionCellDateBefore    : \"日期早於\",\r\n        conditionCellDateAfter     : \"日期晚於\",\r\n        conditionCellGreater       : \"大於\",\r\n        conditionCellGreaterEqual  : \"大於等於\",\r\n        conditionCellLess          : \"小於\",\r\n        conditionCellLessEqual     : \"小于等於\",\r\n        conditionCellEqual         : \"等於\",\r\n        conditionCellNotEqual      : \"不等於\",\r\n        conditionCellBetween       : \"介於\",\r\n        conditionCellNotBetween    : \"不在其中\",\r\n\r\n        filiterMoreDataTip        : \"數據量大！請稍後\",\r\n        filiterMonthText          : \"月\",\r\n        filiterYearText           : \"年\",\r\n        filiterByColorTip         : \"按儲存格顏色篩選\",\r\n        filiterByTextColorTip     : \"按儲存格字體顏色篩選\",\r\n        filterContainerOneColorTip: \"本列僅包含一種顏色\",\r\n        filterDateFormatTip       : \"日期格式\",\r\n\r\n        valueBlank: \"(空白)\",\r\n        mergeError: \"篩選選區有合併儲存格,無法執行此操作！\",\r\n    },\r\n    rightclick: {\r\n        copy             : '複製',\r\n        copyAs           : '複製為',\r\n        paste            : '粘貼',\r\n        insert           : '插入',\r\n        delete           : '删除',\r\n        deleteCell       : '删除儲存格',\r\n        deleteSelected   : '删除選中',\r\n        hide             : '隱藏',\r\n        hideSelected     : '隱藏選中',\r\n        showHide         : '顯示隱藏',\r\n        to               : '向',\r\n        left             : '左',\r\n        right            : '右',\r\n        top              : '上',\r\n        bottom           : '下',\r\n        moveLeft         : '左移',\r\n        moveUp           : '上移',\r\n        add              : '新增',\r\n        row              : '行',\r\n        column           : '列',\r\n        width            : '寬',\r\n        height           : '高',\r\n        number           : '數位',\r\n        confirm          : '確認',\r\n        orderAZ          : 'A-Z順序排列',\r\n        orderZA          : 'Z-A降序排列',\r\n        clearContent     : '清除內容',\r\n        matrix           : '矩陣操作選區',\r\n        sortSelection    : '排序選區',\r\n        filterSelection  : '篩選選區',\r\n        chartGeneration  : '圖表生成',\r\n        firstLineTitle   : '首行為標題',\r\n        untitled         : '無標題',\r\n        array1           : '一維數組',\r\n        array2           : '二維陣列',\r\n        array3           : '多元數組',\r\n        diagonal         : '對角線',\r\n        antiDiagonal     : '反對角線',\r\n        diagonalOffset   : '對角偏移',\r\n        offset           : '偏移量',\r\n        boolean          : '布林值',\r\n        flip             : '翻轉',\r\n        upAndDown        : '上下',\r\n        leftAndRight     : '左右',\r\n        clockwise        : '順時針',\r\n        counterclockwise : '逆時針',\r\n        transpose        : '轉置',\r\n        matrixCalculation: '矩陣計算',\r\n        plus             : '加',\r\n        minus            : '减',\r\n        multiply         : '乘',\r\n        divided          : '除',\r\n        power            : '次方',\r\n        root             : '次方根',\r\n        log              : 'log',\r\n        delete0          : '删除兩端0值',\r\n        removeDuplicate  : '删除重複值',\r\n        byRow            : '按行',\r\n        byCol            : '按列',\r\n        generateNewMatrix: '生成新矩陣',\r\n    },\r\n    comment: {\r\n        \"insert\" : \"新建批註\",\r\n        \"edit\"   : \"編輯批註\",\r\n        \"delete\" : \"删除\",\r\n        \"showOne\": \"顯示/隱藏批註\",\r\n        \"showAll\": \"顯示/隱藏所有批註\"\r\n    },\r\n    screenshot: {\r\n        screenshotTipNoSelection: \"請框選需要截圖的範圍\",\r\n        screenshotTipTitle      : \"提示！\",\r\n        screenshotTipHasMerge   : \"無法對合併儲存格執行此操作\",\r\n        screenshotTipHasMulti   : \"無法對多重選擇區域執行此操作\",\r\n        screenshotTipSuccess    : \"截取成功\",\r\n        screenshotImageName     : \"截圖\",\r\n\r\n        downLoadClose: \"關閉\",\r\n        downLoadCopy : \"複製到剪切板\",\r\n        downLoadBtn  : \"下載\",\r\n        browserNotTip: \"下載功能IE瀏覽器不支持！\",\r\n        rightclickTip: \"請在圖片上右鍵點擊'複製'\",\r\n        successTip   : \"已成功複製（如果粘貼失敗,請在圖片上右鍵點擊'複製圖片'）\",\r\n    },\r\n    splitText: {\r\n        splitDelimiters    : \"分割符號\",\r\n        splitOther         : \"其它\",\r\n        splitContinueSymbol: \"連續分隔符號視為單個處理\",\r\n        splitDataPreview   : \"數據預覽\",\r\n        splitTextTitle     : \"文字分列\",\r\n        splitConfirmToExe  : \"此處已有數據,是否替換它？\",\r\n\r\n        tipNoMulti      : \"能對多重選擇區域執行此操作,請選擇單個區域,然後再試\",\r\n        tipNoMultiColumn: \"一次只能轉換一列數據,選定區域可以有多行,但不能有多列,請在選定單列區域以後再試\",\r\n    },\r\n    imageText: {\r\n        imageSetting: '圖片設定',\r\n        close       : '關閉',\r\n        conventional: '常規',\r\n        moveCell1   : '移動並調整儲存格大小',\r\n        moveCell2   : '移動並且不調整儲存格的大小',\r\n        moveCell3   : '不要移動儲存格並調整其大小',\r\n        fixedPos    : '固定位置',\r\n        border      : '邊框',\r\n        width       : '寬度',\r\n        radius      : '半徑',\r\n        style       : '樣式',\r\n        solid       : '實線',\r\n        dashed      : '虛線',\r\n        dotted      : '點狀',\r\n        double      : '雙線',\r\n        color       : '顏色',\r\n    },\r\n    punctuation: {\r\n        \"tab\"      : \"Tab 鍵\",\r\n        \"semicolon\": \"分號\",\r\n        \"comma\"    : \"逗號\",\r\n        \"space\"    : \"空格\",\r\n\r\n    },\r\n    findAndReplace: {\r\n        find            : \"查找\",\r\n        replace         : \"替換\",\r\n        goto            : \"轉到\",\r\n        location        : \"定位條件\",\r\n        formula         : \"公式\",\r\n        date            : \"日期\",\r\n        number          : \"數位\",\r\n        string          : \"字元\",\r\n        error           : \"錯誤\",\r\n        condition       : \"條件格式\",\r\n        rowSpan         : \"間隔行\",\r\n        columnSpan      : \"間隔列\",\r\n        locationExample : \"定位\",\r\n        lessTwoRowTip   : \"請選擇最少兩行\",\r\n        lessTwoColumnTip: \"請選擇最少兩行\",\r\n\r\n        findTextbox   : \"查找内容\",\r\n        replaceTextbox: \"替換內容\",\r\n\r\n        regexTextbox      : \"規則運算式匹配\",\r\n        wholeTextbox      : \"整詞匹配\",\r\n        distinguishTextbox: \"區分大小寫匹配\",\r\n\r\n        allReplaceBtn: \"全部替換\",\r\n        replaceBtn   : \"替換\",\r\n        allFindBtn   : \"查找全部\",\r\n        findBtn      : \"查找下一個\",\r\n\r\n        noFindTip: \"沒有查找到該內容\",\r\n        modeTip  : \"該模式下不可進行此操作\",\r\n\r\n        searchTargetSheet: \"工作表\",\r\n        searchTargetCell : \"儲存格\",\r\n        searchTargetValue: \"值\",\r\n\r\n        searchInputTip: \"請輸入查找內容\",\r\n\r\n        noReplceTip: \"沒有可替換的內容\",\r\n        noMatchTip : \"找不到匹配項\",\r\n\r\n        successTip: \"已經幫您蒐索並進行了${xlength}處替換\",\r\n\r\n        locationConstant  : \"常數\",\r\n        locationFormula   : \"公式\",\r\n        locationDate      : \"日期\",\r\n        locationDigital   : \"數位\",\r\n        locationString    : \"字元\",\r\n        locationBool      : \"邏輯值\",\r\n        locationError     : \"錯誤\",\r\n        locationNull      : \"空值\",\r\n        locationCondition : \"條件格式\",\r\n        locationRowSpan   : \"間隔行\",\r\n        locationColumnSpan: \"間隔列\",\r\n\r\n        locationTiplessTwoRow   : \"請選擇最少兩行\",\r\n        locationTiplessTwoColumn: \"請選擇最少兩列\",\r\n        locationTipNotFindCell  : \"未找到儲存格\"\r\n\r\n    },\r\n    sheetconfig: {\r\n        delete     : '删除',\r\n        copy       : '複製',\r\n        rename     : '重命名',\r\n        changeColor: '更改顏色',\r\n        hide       : '隱藏',\r\n        unhide     : '取消隱藏',\r\n        moveLeft   : '向左移',\r\n        moveRight  : '向右移',\r\n        resetColor : '重置顏色',\r\n        cancelText : '取消',\r\n        chooseText : '確定顏色',\r\n\r\n        tipNameRepeat              : \"籤頁的名稱不能重複！請重新修改\",\r\n        noMoreSheet                : \"工作薄內至少含有一張可視工作表。若需删除選定的工作表,請先插入一張新工作表或顯示一張隱藏的工作表。。\",\r\n        confirmDelete              : \"是否删除\",\r\n        redoDelete                 : \"可以通過Ctrl+Z撤銷删除\",\r\n        noHide                     : \"不能隱藏,至少保留一個sheet標籤\",\r\n        chartEditNoOpt             : \"圖表編輯模式下不允許該操作！\",\r\n        sheetNameSpecCharError     : \"名稱不能包含:[ ] : \\ ? * / ' \\\"\",\r\n        sheetNamecannotIsEmptyError: \"名稱不能為空\"\r\n    },\r\n    conditionformat: {\r\n        conditionformat_greaterThan         : '條件格式——大於',\r\n        conditionformat_greaterThan_title   : '為大於以下值的儲存格設定格式',\r\n        conditionformat_lessThan            : '條件格式——小於',\r\n        conditionformat_lessThan_title      : '為小於以下值的儲存格設定格式',\r\n        conditionformat_betweenness         : '條件格式——介於',\r\n        conditionformat_betweenness_title   : '為介於以下值的儲存格設定格式',\r\n        conditionformat_equal               : '條件格式——等於',\r\n        conditionformat_equal_title         : '為等於以下值的儲存格設定格式',\r\n        conditionformat_textContains        : '條件格式——文字包含',\r\n        conditionformat_textContains_title  : '為包含以下文字的儲存格設定格式',\r\n        conditionformat_occurrenceDate      : '條件格式——發生日期',\r\n        conditionformat_occurrenceDate_title: '為包含以下日期的儲存格設定格式',\r\n        conditionformat_duplicateValue      : '條件格式——重複值',\r\n        conditionformat_duplicateValue_title: '為包含以下類型值的儲存格設定格式',\r\n        conditionformat_top10               : '條件格式——前10項',\r\n        conditionformat_top10_percent       : '條件格式——前10%',\r\n        conditionformat_top10_title         : '為值最大的那些儲存格設定格式',\r\n        conditionformat_last10              : '條件格式——最後10項',\r\n        conditionformat_last10_percent      : '條件格式——最後10%',\r\n        conditionformat_last10_title        : '為值最小的那些儲存格設定格式',\r\n        conditionformat_AboveAverage        : '條件格式——高於平均值',\r\n        conditionformat_AboveAverage_title  : '為高於平均值的儲存格設定格式',\r\n        conditionformat_SubAverage          : '條件格式——低於平均值',\r\n        conditionformat_SubAverage_title    : '為低於平均值的儲存格設定格式',\r\n        rule                                : '規則',\r\n        newRule                             : '新建規則',\r\n        editRule                            : '編輯規則',\r\n        deleteRule                          : '删除規則',\r\n        deleteCellRule                      : '清除所選儲存格的規則',\r\n        deleteSheetRule                     : '清除整個工作表的規則',\r\n        manageRules                         : '管理規則',\r\n        showRules                           : '顯示其格式規則',\r\n        highlightCellRules                  : '突出顯示儲存格規則',\r\n        itemSelectionRules                  : '項目選取規則',\r\n        conditionformatManageRules          : '條件格式規則管理器',\r\n        format                              : '格式',\r\n        setFormat                           : '設定格式',\r\n        setAs                               : '設定為',\r\n        setAsByArea                         : '針對選定區域,設定為',\r\n        applyRange                          : '應用範圍',\r\n        selectRange                         : '點擊選擇應用範圍',\r\n        selectRange_percent                 : '所選範圍的百分比',\r\n        selectRange_average                 : '選定範圍的平均值',\r\n        selectRange_value                   : '選定範圍中的數值',\r\n        pleaseSelectRange                   : '請選擇應用範圍',\r\n        selectDataRange                     : '點擊選擇數據範圍',\r\n        selectCell                          : '選擇儲存格',\r\n        pleaseSelectCell                    : '請選擇儲存格',\r\n        pleaseSelectADate                   : '請選擇日期',\r\n        pleaseEnterInteger                  : '請輸入一個介於1和1000之間的整數',\r\n        onlySingleCell                      : '只能對單個儲存格進行引用',\r\n        conditionValueCanOnly               : '條件值只能是數位或者單個儲存格',\r\n        ruleTypeItem1                       : '基於各自值設定所有儲存格的格式',\r\n        ruleTypeItem2                       : '只為包含以下內容的儲存格設定格式',\r\n        ruleTypeItem2_title                 : '只為滿足以下條件的儲存格',\r\n        ruleTypeItem3                       : '僅對排名靠前或靠後的數值設定格式',\r\n        ruleTypeItem3_title                 : '為以下排名內的值',\r\n        ruleTypeItem4                       : '僅對高於或低於平均值的數值設定格式',\r\n        ruleTypeItem4_title                 : '為滿足以下條件的值',\r\n        ruleTypeItem5                       : '僅對唯一值或重複值設定格式',\r\n        ruleTypeItem6                       : '使用公式確定要設置格式的單元格',\r\n        formula                             : '公式',\r\n        textColor                           : '文字顏色',\r\n        cellColor                           : '儲存格顏色',\r\n        confirm                             : '確定',\r\n        confirmColor                        : '確定顏色',\r\n        cancel                              : '取消',\r\n        close                               : '關閉',\r\n        clearColorSelect                    : '清除顏色選擇',\r\n        sheet                               : '錶',\r\n        currentSheet                        : '當前工作表',\r\n        dataBar                             : '數據條',\r\n        dataBarColor                        : '數據條顏色',\r\n        gradientDataBar_1                   : '藍-白漸變數據條',\r\n        gradientDataBar_2                   : '綠-白漸變數據條',\r\n        gradientDataBar_3                   : '紅-白漸變數據條',\r\n        gradientDataBar_4                   : '柳丁-白漸變數據條',\r\n        gradientDataBar_5                   : '淺藍-白漸變數據條',\r\n        gradientDataBar_6                   : '紫-白漸變數據條',\r\n        solidColorDataBar_1                 : '藍色數據條',\r\n        solidColorDataBar_2                 : '綠色數據條',\r\n        solidColorDataBar_3                 : '紅色數據條',\r\n        solidColorDataBar_4                 : '橙色數據條',\r\n        solidColorDataBar_5                 : '淺藍色數據條',\r\n        solidColorDataBar_6                 : '紫色數據條',\r\n        colorGradation                      : '色階',\r\n        colorGradation_1                    : '綠-黃-紅色階',\r\n        colorGradation_2                    : '紅-黃-綠色階',\r\n        colorGradation_3                    : '綠-白-紅色階',\r\n        colorGradation_4                    : '紅-白-綠色階',\r\n        colorGradation_5                    : '藍-白-紅色階',\r\n        colorGradation_6                    : '紅-白-藍色階',\r\n        colorGradation_7                    : '白-紅色階',\r\n        colorGradation_8                    : '紅-白色階',\r\n        colorGradation_9                    : '綠-白色階',\r\n        colorGradation_10                   : '白-綠色階',\r\n        colorGradation_11                   : '綠-黃色階',\r\n        colorGradation_12                   : '黃-綠色階',\r\n        icons                               : '圖標集',\r\n        pleaseSelectIcon                    : '請點擊選擇一組圖標:',\r\n        cellValue                           : '儲存格值',\r\n        specificText                        : '特定文字',\r\n        occurrence                          : '發生日期',\r\n        greaterThan                         : '大於',\r\n        lessThan                            : '小於',\r\n        between                             : '介於',\r\n        equal                               : '等於',\r\n        in                                  : '和',\r\n        to                                  : '到',\r\n        between2                            : '之間',\r\n        contain                             : '包含',\r\n        textContains                        : '文字包含',\r\n        duplicateValue                      : '重複值',\r\n        uniqueValue                         : '唯一值',\r\n        top                                 : '前',\r\n        top10                               : '前10項',\r\n        top10_percent                       : '前10%',\r\n        last                                : '後',\r\n        last10                              : '後10項',\r\n        last10_percent                      : '後10%',\r\n        oneself                             : '個',\r\n        above                               : '高於',\r\n        aboveAverage                        : '高於平均值',\r\n        below                               : '低於',\r\n        belowAverage                        : '低於平均值',\r\n        all                                 : '全部',\r\n        yesterday                           : '昨天',\r\n        today                               : '今天',\r\n        tomorrow                            : '明天',\r\n        lastWeek                            : '上周',\r\n        thisWeek                            : '本周',\r\n        lastMonth                           : '上月',\r\n        thisMonth                           : '本月',\r\n        lastYear                            : '去年',\r\n        thisYear                            : '本年',\r\n        last7days                           : '最近7天',\r\n        last30days                          : '最近30天',\r\n        next7days                           : '未來7天',\r\n        next30days                          : '未來30天',\r\n        next60days                          : '未來60天',\r\n        chooseRuleType                      : '選擇規則類型',\r\n        editRuleDescription                 : '編輯規則說明',\r\n        newFormatRule                       : '新建格式規則',\r\n        editFormatRule                      : '編輯格式規則',\r\n        formatStyle                         : '格式樣式',\r\n        fillType                            : '填充類型',\r\n        color                               : '顏色',\r\n        twocolor                            : '雙色',\r\n        tricolor                            : '三色',\r\n        multicolor                          : '彩色',\r\n        grayColor                           : '灰色',\r\n        gradient                            : '漸變',\r\n        solid                               : '實心',\r\n        maxValue                            : '最大值',\r\n        medianValue                         : '中間值',\r\n        minValue                            : '最小值',\r\n        direction                           : '方向',\r\n        threeWayArrow                       : '三向箭頭',\r\n        fourWayArrow                        : '四向箭頭',\r\n        fiveWayArrow                        : '五向箭頭',\r\n        threeTriangles                      : '3個三角形',\r\n        shape                               : '形狀',\r\n        threeColorTrafficLight              : '三色交通燈',\r\n        fourColorTrafficLight               : '四色交通燈',\r\n        threeSigns                          : '三標誌',\r\n        greenRedBlackGradient               : '綠-紅-黑漸變',\r\n        rimless                             : '無邊框',\r\n        bordered                            : '有邊框',\r\n        mark                                : '標記',\r\n        threeSymbols                        : '三個符號',\r\n        tricolorFlag                        : '三色旗',\r\n        circled                             : '有圓圈',\r\n        noCircle                            : '無圓圈',\r\n        grade                               : '等級',\r\n        grade4                              : '四等級',\r\n        grade5                              : '五等級',\r\n        threeStars                          : '3個星形',\r\n        fiveQuadrantDiagram                 : '五象限圖',\r\n        fiveBoxes                           : '5個框',\r\n    },\r\n    insertLink: {\r\n        linkText    : \"文字\",\r\n        linkType    : \"連結類型\",\r\n        external    : \"外部連結\",\r\n        internal    : \"内部連結\",\r\n        linkAddress : \"連結地址\",\r\n        linkSheet   : \"工作表\",\r\n        linkCell    : \"儲存格引用\",\r\n        linkTooltip : \"提示\",\r\n        placeholder1: \"請輸入網頁連結位址\",\r\n        placeholder2: \"請輸入要引用的儲存格,例A1\",\r\n        placeholder3: \"請輸入提示內容\",\r\n        tooltipInfo1: \"請輸入有效的連結\",\r\n        tooltipInfo2: \"請輸入正確的儲存格引用\",\r\n    },\r\n    dataVerification: {\r\n        cellRange            : '儲存格範圍',\r\n        selectCellRange      : '點擊選擇儲存格範圍',\r\n        selectCellRange2     : '請選擇儲存格範圍',\r\n        verificationCondition: '驗證條件',\r\n        allowMultiSelect     : \"是否允許多選\",\r\n        dropdown             : '下拉清單',\r\n        checkbox             : '核取方塊',\r\n        number               : '數位',\r\n        number_integer       : '數位-整數',\r\n        number_decimal       : '數位-小數',\r\n        text_content         : '文字-內容',\r\n        text_length          : '文字-長度',\r\n        date                 : '日期',\r\n        validity             : '有效性',\r\n        placeholder1         : '請輸入選項,以英文逗號分隔,如1,2,3,4,5',\r\n        placeholder2         : '請輸入內容',\r\n        placeholder3         : '數值,如10',\r\n        placeholder4         : '請輸入指定的文字',\r\n        placeholder5         : '請輸入選中儲存格時顯示的提示語',\r\n        selected             : '選擇時',\r\n        notSelected          : '未選擇',\r\n        between              : '介於',\r\n        notBetween           : '不介於',\r\n        equal                : '等於',\r\n        notEqualTo           : '不等於',\r\n        moreThanThe          : '大於',\r\n        lessThan             : '小於',\r\n        greaterOrEqualTo     : '大於等於',\r\n        lessThanOrEqualTo    : '小於等於',\r\n        include              : '包括',\r\n        exclude              : '不包括',\r\n        earlierThan          : '早於',\r\n        noEarlierThan        : '不早於',\r\n        laterThan            : '晚於',\r\n        noLaterThan          : '不晚於',\r\n        identificationNumber : '身份證號碼',\r\n        phoneNumber          : '手機號',\r\n        remote               : '自動遠程獲取選項',\r\n        prohibitInput        : '輸入數據無效時禁止輸入',\r\n        hintShow             : '選中儲存格時顯示提示語',\r\n        deleteVerification   : '删除驗證',\r\n        tooltipInfo1         : '下拉清單選項不可為空',\r\n        tooltipInfo2         : '核取方塊內容不可為空',\r\n        tooltipInfo3         : '輸入的值不是數值類型',\r\n        tooltipInfo4         : '數值2不能小於數值1',\r\n        tooltipInfo5         : '文字內容不能為空',\r\n        tooltipInfo6         : '輸入的值不是日期類型',\r\n        tooltipInfo7         : '日期2不能小於日期1',\r\n        textlengthInteger    : '文字長度必須是大於等於0的整數',\r\n    },\r\n    formula: {\r\n        sum       : \"求和\",\r\n        average   : \"平均值\",\r\n        count     : \"計數\",\r\n        max       : \"最大值\",\r\n        min       : \"最小值\",\r\n        ifGenerate: \"if公式生成器\",\r\n        find      : \"更多函數\",\r\n\r\n        tipNotBelongToIf: \"該儲存格函數不屬於if公式!\",\r\n        tipSelectCell   : \"請選擇儲存格插入函數\",\r\n\r\n        ifGenCompareValueTitle: \"比较值\",\r\n        ifGenSelectCellTitle  : \"點擊選擇儲存格\",\r\n        ifGenRangeTitle       : \"範圍\",\r\n        ifGenRangeTo          : \"至\",\r\n        ifGenRangeEvaluate    : \"範圍評估\",\r\n        ifGenSelectRangeTitle : \"點擊選擇範圍\",\r\n        ifGenCutWay           : \"劃分管道\",\r\n        ifGenCutSame          : \"劃分值相同\",\r\n        ifGenCutNpiece        : \"劃分为N份\",\r\n        ifGenCutCustom        : \"自定義輸入\",\r\n        ifGenCutConfirm       : \"生成\",\r\n\r\n        ifGenTipSelectCell     : \"選擇儲存格\",\r\n        ifGenTipSelectCellPlace: \"請選擇儲存格\",\r\n\r\n        ifGenTipSelectRange     : \"選擇單範圍\",\r\n        ifGenTipSelectRangePlace: \"請選擇範圍\",\r\n\r\n        ifGenTipNotNullValue      : \"比較值不能為空!\",\r\n        ifGenTipLableTitile       : \"標籤\",\r\n        ifGenTipRangeNotforNull   : \"範圍不能為空!\",\r\n        ifGenTipCutValueNotforNull: \"劃分值不能為空！\",\r\n        ifGenTipNotGenCondition   : \"沒有生成可用的條件！\",\r\n    },\r\n    formulaMore: {\r\n        valueTitle          : \"值\",\r\n        tipSelectDataRange  : \"選取數據範圍\",\r\n        tipDataRangeTile    : \"數據範圍\",\r\n        findFunctionTitle   : \"查找函數\",\r\n        tipInputFunctionName: \"請輸入您要查找的函數名稱或函數功能的簡要描述\",\r\n\r\n        Array      : \"數組\",\r\n        Database   : \"資料來源\",\r\n        Date       : \"日期\",\r\n        Engineering: \"工程計算\",\r\n        Filter     : \"篩檢程式\",\r\n        Financial  : \"財務\",\r\n        luckysheet : \"Luckysheet內寘\",\r\n        other      : \"其它\",\r\n        Logical    : \"邏輯\",\r\n        Lookup     : \"查找\",\r\n        Math       : \"數學\",\r\n        Operator   : \"運算子\",\r\n        Parser     : \"轉換工具\",\r\n        Statistical: \"統計\",\r\n        Text       : \"文字\",\r\n        dataMining : \"資料挖掘\",\r\n\r\n        selectFunctionTitle: \"選擇函數\",\r\n        calculationResult  : \"計算結果\",\r\n\r\n        tipSuccessText   : \"成功\",\r\n        tipParamErrorText: \"參數類型錯誤\",\r\n\r\n        helpClose   : \"關閉\",\r\n        helpCollapse: \"收起\",\r\n        helpExample : \"示例\",\r\n        helpAbstract: \"摘要\",\r\n\r\n        execfunctionError          : '提示\", \"公式存在錯誤',\r\n        execfunctionSelfError      : '公式不可引用其本身的儲存格',\r\n        execfunctionSelfErrorResult: '公式不可引用其本身的儲存格,會導致計算結果不準確',\r\n\r\n        allowRepeatText: \"可重複\",\r\n        allowOptionText: \"可選\",\r\n\r\n        selectCategory: \"或選擇類別\",\r\n    },\r\n    drag: {\r\n        noMerge    : \"無法對合併儲存格執行此操作\",\r\n        affectPivot: \"無法對所選儲存格進行此更改,因為它會影響數據透視錶！\",\r\n        noMulti    : \"無法對多重選擇區域執行此操作,請選擇單個區域\",\r\n        noPaste    : \"無法在此處粘貼此內容,請選擇粘貼區域的一個儲存格,然後再次嘗試粘貼\",\r\n        noPartMerge: \"無法對部分合併儲存格執行此操作\",\r\n\r\n        inputCorrect        : \"請輸入正確的數值\",\r\n        notLessOne          : \"行列數不能小於1\",\r\n        offsetColumnLessZero: \"偏移列不能為負數！\",\r\n\r\n        pasteMustKeybordAlert         : \"Copy and paste in the Sheet: Ctrl + C to copy, Ctrl + V to paste, Ctrl + X to cut\",\r\n        pasteMustKeybordAlertHTMLTitle: \"Copy and paste in the Sheet\",\r\n        pasteMustKeybordAlertHTML     : \"<span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + C</span>&nbsp;&nbsp;to copy<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + V</span>&nbsp;&nbsp;to paste<br/><span style='line-height: 1.0;font-size:36px;font-weight: bold;color:#666;'>Ctrl + X</span>&nbsp;&nbsp;to cut\",\r\n    },\r\n    paste: {\r\n        warning            : \"提示\",\r\n        errorNotAllowMulti : \"不能對多重選擇區域執行此操作,請選擇單個區域,然後再試\",\r\n        errorNotAllowMerged: \"不能对合并单元格做部分更改\",\r\n    },\r\n    pivotTable: {\r\n        title                : \"數據透視錶\",\r\n        closePannel          : \"關閉\",\r\n        editRange            : \"編輯範圍\",\r\n        tipPivotFieldSelected: \"選擇需要添加到數據透視錶的欄位\",\r\n        tipClearSelectedField: \"清除所有已選欄位\",\r\n        btnClearSelectedField: \"清除\",\r\n        btnFilter            : \"篩選\",\r\n        titleRow             : \"行\",\r\n        titleColumn          : \"列\",\r\n        titleValue           : \"數值\",\r\n        tipShowColumn        : \"統計欄位顯示為列\",\r\n        tipShowRow           : \"統計欄位顯示為行\",\r\n\r\n        titleSelectionDataRange: \"選取數據範圍\",\r\n        titleDataRange         : \"數據範圍\",\r\n\r\n        valueSum: \"總計\",\r\n\r\n        valueStatisticsSUM        : \"求和\",\r\n        valueStatisticsCOUNT      : \"數值計數\",\r\n        valueStatisticsCOUNTA     : \"計數\",\r\n        valueStatisticsCOUNTUNIQUE: \"去重計數\",\r\n        valueStatisticsAVERAGE    : \"平均值\",\r\n        valueStatisticsMAX        : \"最大值\",\r\n        valueStatisticsMIN        : \"最小值\",\r\n        valueStatisticsMEDIAN     : \"中位數\",\r\n        valueStatisticsPRODUCT    : \"乘積\",\r\n        valueStatisticsSTDEV      : \"標準差\",\r\n\r\n        valueStatisticsSTDEVP: \"整體標準差\",\r\n        valueStatisticslet   : \"方差\",\r\n        valueStatisticsVARP  : \"整體方差\",\r\n\r\n        errorNotAllowEdit     : \"非編輯模式下禁止該操作!\",\r\n        errorNotAllowMulti    : \"不能對多重選擇區域執行此操作,請選擇單個區域,然後再試\",\r\n        errorSelectRange      : \"請選擇新建透視錶的區域\",\r\n        errorIsDamage         : \"此數據透視錶的源數據已損壞！\",\r\n        errorNotAllowPivotData: \"不可選擇數據透視錶為源數據!\",\r\n        errorSelectionRange   : \"選擇失敗,輸入範圍錯誤！\",\r\n        errorIncreaseRange    : \"請擴大選擇的數據範圍!\",\r\n\r\n        titleAddColumn        : \"添加列到數據透視錶\",\r\n        titleMoveColumn       : \"移動該列到下方白框\",\r\n        titleClearColumnFilter: \"清除該列的篩選條件\",\r\n        titleFilterColumn     : \"篩選該列\",\r\n\r\n        titleSort        : \"排序\",\r\n        titleNoSort      : \"無排序\",\r\n        titleSortAsc     : \"昇冪\",\r\n        titleSortDesc    : \"降序\",\r\n        titleSortBy      : \"排序依據\",\r\n        titleShowSum     : \"顯示總計\",\r\n        titleStasticTrue : \"是\",\r\n        titleStasticFalse: \"否\",\r\n    },\r\n    dropCell: {\r\n        copyCell     : \"複製儲存格\",\r\n        sequence     : \"填充序列\",\r\n        onlyFormat   : \"僅填充格式\",\r\n        noFormat     : \"不帶格式填充\",\r\n        day          : \"以天數填充\",\r\n        workDay      : \"以工作日填充\",\r\n        month        : \"以月填充\",\r\n        year         : \"以年填充\",\r\n        chineseNumber: \"以中文小寫數位填充\"\r\n    },\r\n    imageCtrl: {\r\n        borderTile: \"圖片邊框顏色選擇\",\r\n        borderCur : \"當前顏色\",\r\n    },\r\n    protection: {\r\n        protectiontTitle    : \"保護工作表\",\r\n        enterPassword       : \"請輸入密碼（可留空）\",\r\n        enterHint           : \"您試圖更改的儲存格或圖表位於受保護的工作表中。若要更改,請取消工作表保護。您可能需要輸入密碼\",\r\n        swichProtectionTip  : \"保護工作表及鎖定的儲存格內容\",\r\n        authorityTitle      : \"允許此工作表的用戶進行:\",\r\n        selectLockedCells   : \"定鎖定儲存格\",\r\n        selectunLockedCells : \"選定解除鎖定的儲存格\",\r\n        formatCells         : \"設定儲存格格式\",\r\n        formatColumns       : \"設定列格式\",\r\n        formatRows          : \"設定行格式\",\r\n        insertColumns       : \"插入列\",\r\n        insertRows          : \"插入行\",\r\n        insertHyperlinks    : \"插入超連結\",\r\n        deleteColumns       : \"删除列\",\r\n        deleteRows          : \"删除行\",\r\n        sort                : \"排序\",\r\n        filter              : \"使用自動篩選\",\r\n        usePivotTablereports: \"使用數據透視錶和報表\",\r\n        editObjects         : \"編輯對象\",\r\n        editScenarios       : \"編輯方案\",\r\n\r\n        allowRangeTitle: \"允許用戶編輯區域\",\r\n        allowRangeAdd  : \"新建...\",\r\n\r\n        allowRangeAddTitle         : \"標題\",\r\n        allowRangeAddSqrf          : \"引用儲存格\",\r\n        selectCellRange            : '點擊選擇儲存格範圍',\r\n        selectCellRangeHolder      : \"請輸入儲存格範圍\",\r\n        allowRangeAddTitlePassword : \"密碼\",\r\n        allowRangeAddTitleHint     : \"提示\",\r\n        allowRangeAddTitleHintTitle: \"設置密碼後,提示用戶輸入密碼（可留空）\",\r\n        allowRangeAddtitleDefault  : \"請輸入區域名稱\",\r\n\r\n        rangeItemDblclick   : \"按兩下進行編輯\",\r\n        rangeItemHasPassword: \"已設置密碼\",\r\n\r\n        rangeItemErrorTitleNull: \"標題不能為空\",\r\n        rangeItemErrorRangeNull: \"儲存格範圍不能為空\",\r\n        rangeItemErrorRange    : \"儲存格範圍格式錯誤\",\r\n\r\n        validationTitle    : \"驗證提示\",\r\n        validationTips     : \"需要輸入密碼來撤銷工作表的保護\",\r\n        validationInputHint: \"請輸入密碼\",\r\n\r\n        checkPasswordNullalert : \"密碼不能為空!\",\r\n        checkPasswordWrongalert: \"密碼錯誤,請重試！\",\r\n\r\n        checkPasswordSucceedalert: \"解鎖成功,可以編輯該區域!\",\r\n        defaultRangeHintText     : \"該儲存格正在受密碼保護\",\r\n        defaultSheetHintText     : \"該儲存格或圖表位於受保護的工作表中,若要進行更改,請取消工作表保護,您可能需要輸入密碼。\",\r\n    },\r\n    cellFormat: {\r\n        cellFormatTitle     : \"設定儲存格格式\",\r\n        protection          : \"保護\",\r\n        locked              : \"鎖定儲存格\",\r\n        hidden              : \"隱藏公式\",\r\n        protectionTips      : \"只有保護工作表功能（在功能表列點擊保護工作表按鈕進行設定）開啟後,鎖定儲存格或隱藏公式才能生效\",\r\n        tipsPart            : \"部分選中\",\r\n        tipsAll             : \"全部選中\",\r\n        selectionIsNullAlert: \"請選擇一個範圍！\",\r\n        sheetDataIsNullAlert: \"數據為空無法設定！\",\r\n    },\r\n    print: {\r\n        normalBtn: \"常規視圖\",\r\n        layoutBtn: \"頁面佈局\",\r\n        pageBtn  : \"分頁預覽\",\r\n\r\n        menuItemPrint  : \"列印(Ctrl+P)\",\r\n        menuItemAreas  : \"列印區域\",\r\n        menuItemRows   : \"列印標題行\",\r\n        menuItemColumns: \"列印標題列\",\r\n    },\r\n    edit: {\r\n        typing: \"正在輸入\",\r\n    },\r\n    websocket: {\r\n        success: 'WebSocket連接成功',\r\n        refresh: 'WebSocket連接發生錯誤,請刷新頁面！',\r\n        wait   : 'WebSocket連接發生錯誤,請耐心等待！',\r\n        close  : 'WebSocket連接關閉',\r\n        contact: '服務器通信發生錯誤,請刷新頁面後再試,如若不行請聯系管理員！',\r\n        support: '當前瀏覽器不支持WebSocket',\r\n    },\r\n    exportXlsx:{\r\n        notice:'請配置導出插件',\r\n        serverError:'服務器正在維護',\r\n        title:'導出XLSX',\r\n        range: \"範圍\",\r\n        currentSheet: \"當前工作表\",\r\n        allSheets: \"所有工作表\",\r\n    }\r\n\r\n};\r\n"
  },
  {
    "path": "src/methods/get.js",
    "content": "import { chatatABC } from '../utils/util';\r\nimport Store from '../store';\r\n\r\nfunction getSheetIndex(index) {\r\n    for (let i = 0; i < Store.luckysheetfile.length; i++) {\r\n        if (Store.luckysheetfile[i][\"index\"] == index) {\r\n            return i;\r\n        }\r\n    }\r\n\r\n    return null;\r\n}\r\n\r\nfunction getRangetxt(sheetIndex, range, currentIndex) {\r\n    let sheettxt = \"\";\r\n\r\n    if (currentIndex == null) {\r\n        currentIndex = Store.currentSheetIndex;\r\n    }\r\n\r\n    if (sheetIndex != currentIndex) {\r\n        //sheet名字包含'的，引用时应该替换为''\r\n        sheettxt = Store.luckysheetfile[getSheetIndex(sheetIndex)].name.replace(/'/g,\"''\");\r\n        //如果包含除a-z、A-Z、0-9、下划线等以外的字符那么就用单引号包起来\r\n        if(/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/.test(sheettxt))\r\n        {\r\n            sheettxt = sheettxt+\"!\";\r\n        }\r\n        else\r\n        {\r\n            sheettxt=\"'\"+sheettxt+\"'!\";\r\n        }\r\n    }\r\n\r\n    let row0 = range[\"row\"][0], row1 = range[\"row\"][1];\r\n    let column0 = range[\"column\"][0], column1 = range[\"column\"][1];\r\n\r\n    if (row0 == null && row1 == null) {\r\n        return sheettxt + chatatABC(column0) + \":\" + chatatABC(column1);\r\n    }\r\n    else if (column0 == null && column1 == null) {\r\n        return sheettxt + (row0 + 1) + \":\" + (row1 + 1);\r\n    }\r\n    else {\r\n        if (column0 == column1 && row0 == row1) {\r\n            return sheettxt + chatatABC(column0) + (row0 + 1);\r\n        }\r\n        else {\r\n            return sheettxt + chatatABC(column0) + (row0 + 1) + \":\" + chatatABC(column1) + (row1 + 1);\r\n        }\r\n    }\r\n}\r\n\r\nfunction getluckysheet_select_save() {\r\n    return Store.luckysheet_select_save;\r\n}\r\n\r\nfunction getluckysheet_scroll_status() {\r\n    return Store.luckysheet_scroll_status;\r\n}\r\n\r\nfunction getluckysheetfile(plugin) {\r\n    // 获取图表数据\r\n    if(plugin){\r\n        Store.luckysheetfile.forEach(file => {\r\n            if(!!file.chart){\r\n                file.chart.forEach((chartObj)=>{\r\n                    const chartJson = Store.getChartJson(chartObj.chart_id);\r\n                    chartObj.chartOptions = chartJson;\r\n                })\r\n            }\r\n        });\r\n    }\r\n    \r\n    return Store.luckysheetfile;\r\n}\r\n\r\nfunction getconfig() {\r\n    return Store.config;\r\n}\r\n\r\nfunction getvisibledatarow() {\r\n    return Store.visibledatarow;\r\n}\r\n\r\nfunction getvisibledatacolumn() {\r\n    return Store.visibledatacolumn;\r\n}\r\n\r\nfunction getConditionFormatCells() {\r\n    return Store.conditionFormatCells;\r\n}\r\n\r\nexport {\r\n    getSheetIndex,\r\n    getRangetxt,\r\n    getluckysheet_select_save,\r\n    getluckysheet_scroll_status,\r\n    getluckysheetfile,\r\n    getconfig,\r\n    getvisibledatarow,\r\n    getvisibledatacolumn,\r\n    getConditionFormatCells,\r\n}\r\n"
  },
  {
    "path": "src/methods/set.js",
    "content": "import { getSheetIndex } from '../methods/get';\r\nimport Store from '../store';\r\n\r\nfunction setluckysheet_select_save(v) {\r\n    Store.luckysheet_select_save = v;\r\n}\r\n\r\nfunction setluckysheet_scroll_status(v) {\r\n    Store.luckysheet_scroll_status = v;\r\n}\r\n\r\nfunction setluckysheetfile(d) {\r\n    Store.luckysheetfile = d;\r\n}\r\n\r\nfunction setconfig(v) {\r\n    Store.config = v;\r\n\r\n    if(Store.luckysheetfile != null){\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = v;\r\n    }\r\n}\r\n\r\nfunction setvisibledatarow(v) {\r\n    Store.visibledatarow = v;\r\n\r\n    if(Store.luckysheetfile != null){\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].visibledatarow = v;\r\n    }\r\n}\r\n\r\nfunction setvisibledatacolumn(v) {\r\n    Store.visibledatacolumn = v;\r\n\r\n    if(Store.luckysheetfile != null){\r\n        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].visibledatacolumn = v;\r\n    }\r\n}\r\n\r\nexport {\r\n    setluckysheet_select_save,\r\n    setluckysheet_scroll_status,\r\n    setluckysheetfile,\r\n    setconfig,\r\n    setvisibledatarow,\r\n    setvisibledatacolumn,\r\n}"
  },
  {
    "path": "src/plugins/jquery.sPage.css",
    "content": ".spage-total {\r\n    display: inline-block;\r\n    margin-right: 10px;\r\n    line-height: 29px;\r\n    color: #666;\r\n    font-size: 14px\r\n}\r\n\r\n.spage-number {\r\n    display: inline-block;\r\n    color: #666;\r\n    font-size: 14px\r\n}\r\n.selectNum {\r\n    font-size: 14px;\r\n    height: 27px;\r\n    box-sizing: border-box;\r\n    vertical-align: top;\r\n    line-height: 27px;\r\n    border: 1px solid #ddd;\r\n    margin-left: 5px;\r\n    vertical-align: middle;\r\n}\r\n.spage-number button {\r\n    position: relative;\r\n    box-sizing: border-box;\r\n    display: inline-block;\r\n    margin-left: -1px;\r\n    padding: 0 10px;\r\n    line-height: 27px;\r\n    border: 1px solid #ddd;\r\n    text-align: center;\r\n    transition: all .2s;\r\n    cursor: pointer;\r\n    outline: none;\r\n    background: 0 0;\r\n    user-select: none;\r\n    color: #333;\r\n    background: #fff;\r\n    vertical-align: middle;\r\n}\r\n.prevBtn, .nextBtn {\r\n    width: 16px;\r\n    height: 27px;\r\n    background: url(images/js.png) no-repeat center center;\r\n    background-size: 100% auto;\r\n    display: block;\r\n    transform: rotate(180deg);\r\n}\r\n.nextBtn {\r\n    transform: rotate(0);\r\n}\r\n.spage-number button.active {\r\n    background: #2d98e6;\r\n    color: #fff;\r\n    border-color: #2d98e6;\r\n    z-index: 3\r\n}\r\n\r\n.spage-number button.active:hover {\r\n    background: #2d98e6;\r\n    color: #fff;\r\n    border-color: #2d98e6;\r\n    z-index: 3\r\n}\r\n\r\n.spage-number button:hover {\r\n    background-color: #eee\r\n}\r\n\r\n.spage-number button.button-disabled {\r\n    cursor: not-allowed;\r\n    color: #ccc\r\n}\r\n\r\n.spage-number .spage-after,\r\n.spage-before {\r\n    padding: 0;\r\n    width: 40px\r\n}\r\n\r\n.spage-skip {\r\n    display: inline-block;\r\n    margin-left: 5px;\r\n    line-height: 27px;\r\n    color: #666;\r\n    font-size: 14px\r\n}\r\n\r\n.spage-skip input {\r\n    box-sizing: border-box;\r\n    display: inline-block;\r\n    width: 45px;\r\n    height: 29px;\r\n    text-align: center;\r\n    vertical-align: top;\r\n    border: 1px solid #ddd;\r\n    background: 0 0;\r\n    outline: none;\r\n    transition: all .2s\r\n}\r\n\r\n.spage-skip input:focus {\r\n    border-color: #2d98e6\r\n}\r\n\r\n.spage-skip button {\r\n    display: inline-block;\r\n    padding: 0 14px;\r\n    line-height: 27px;\r\n    vertical-align: top;\r\n    color: #333;\r\n    border: 1px solid #ddd;\r\n    cursor: pointer;\r\n    transition: all .2s;\r\n    outline: none;\r\n    background: 0 0;\r\n    user-select: none;\r\n    background-color: #fff;\r\n}\r\n\r\n.spage-skip button:hover {\r\n    background: #2d98e6;\r\n    color: #fff;\r\n    border: 1px solid #2d98e6\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "src/store/index.js",
    "content": "const Store = {\r\n    container: null, \r\n    loadingObj:{},\r\n    luckysheetfile: null, \r\n    defaultcolumnNum: 60, \r\n    defaultrowNum: 84, \r\n    fullscreenmode: true,\r\n    devicePixelRatio: 1,\r\n\r\n    currentSheetIndex: 0,\r\n    calculateSheetIndex: 0,\r\n\tflowdata: [],\r\n    config: {},\r\n\r\n    visibledatarow: [],\r\n    visibledatacolumn: [],\r\n    ch_width: 0,\r\n    rh_height: 0,\r\n\r\n    cellmainWidth: 0,\r\n    cellmainHeight: 0,\r\n    toolbarHeight: 0,\r\n    infobarHeight: 0,\r\n    calculatebarHeight: 0,\r\n    rowHeaderWidth: 46,\r\n    columnHeaderHeight: 20,\r\n    cellMainSrollBarSize: 12,\r\n    sheetBarHeight: 31,\r\n    statisticBarHeight: 23,\r\n    luckysheetTableContentHW: [0, 0], \r\n\r\n    defaultcollen: 73,\r\n    defaultrowlen: 19,\r\n\r\n    jfcountfuncTimeout: null, \r\n    jfautoscrollTimeout: null,\r\n\r\n    luckysheet_select_status: false,\r\n    luckysheet_select_save: [{ \"row\": [0, 0], \"column\": [0, 0] }],\r\n    luckysheet_selection_range: [],\r\n\r\n    luckysheet_copy_save: {}, //复制粘贴\r\n    luckysheet_paste_iscut: false,\r\n\r\n    filterchage: true, //筛选\r\n    luckysheet_filter_save: { \"row\": [], \"column\": [] },\r\n\r\n    luckysheet_sheet_move_status: false,\r\n    luckysheet_sheet_move_data: [],\r\n    luckysheet_scroll_status: false,\r\n\r\n    luckysheetisrefreshdetail: true,\r\n    luckysheetisrefreshtheme: true,\r\n    luckysheetcurrentisPivotTable: false,\r\n\r\n    luckysheet_rows_selected_status: false,  //行列标题相关参\r\n    luckysheet_cols_selected_status: false,  \r\n    luckysheet_rows_change_size: false,\r\n    luckysheet_rows_change_size_start: [],\r\n    luckysheet_cols_change_size: false,\r\n    luckysheet_cols_change_size_start: [],\r\n    luckysheet_cols_dbclick_timeout: null,\r\n    luckysheet_cols_dbclick_times: 0,\r\n\r\n    luckysheetCellUpdate: [],\r\n    \r\n    luckysheet_shiftpositon: null,\r\n\r\n    iscopyself: true,\r\n\r\n    orderbyindex: 0, //排序下标\r\n\r\n    luckysheet_model_move_state: false, //模态框拖动\r\n    luckysheet_model_xy: [0, 0],\r\n    luckysheet_model_move_obj: null,\r\n\r\n    luckysheet_cell_selected_move: false,  //选区拖动替换\r\n    luckysheet_cell_selected_move_index: [],\r\n\r\n    luckysheet_cell_selected_extend: false,  //选区下拉\r\n    luckysheet_cell_selected_extend_index: [],\r\n    luckysheet_cell_selected_extend_time: null,\r\n\r\n    clearjfundo: true,\r\n    jfundo: [],\r\n    jfredo: [],\r\n    lang: 'en', //language\r\n    createChart: '',\r\n    highlightChart: '',\r\n    zIndex: 15,\r\n    chartparam: {\r\n        luckysheetCurrentChart: null, //current chart_id\r\n        luckysheetCurrentChartActive: false,\r\n        luckysheetCurrentChartMove: null, // Debounce state\r\n        luckysheetCurrentChartMoveTimeout: null,//拖动图表框的节流定时器\r\n        luckysheetCurrentChartMoveObj: null, //chart DOM object\r\n        luckysheetCurrentChartMoveXy: null, //上一次操作结束的图表信息，x,y: chart框位置，scrollLeft1,scrollTop1: 滚动条位置\r\n        luckysheetCurrentChartMoveWinH: null, //左右滚动条滑动距离\r\n        luckysheetCurrentChartMoveWinW: null, //上下滚动条滑动距离\r\n        luckysheetCurrentChartResize: null,\r\n        luckysheetCurrentChartResizeObj: null,\r\n        luckysheetCurrentChartResizeXy: null,\r\n        luckysheetCurrentChartResizeWinH: null,\r\n        luckysheetCurrentChartResizeWinW: null,\r\n        luckysheetInsertChartTosheetChange: true, // 正在执行撤销\r\n        luckysheetCurrentChartZIndexRank : 100,\r\n        luckysheet_chart_redo_click:false, //撤销重做时标识\r\n        luckysheetCurrentChartMaxState: false, //图表全屏状态\r\n        jfrefreshchartall: '',\r\n        changeChartCellData: '',\r\n        renderChart: '',\r\n        getChartJson: ''\r\n    },\r\n    functionList:null, //function list explanation\r\n    luckysheet_function:null,\r\n    chart_selection: {},\r\n    currentChart: '',\r\n    scrollRefreshSwitch:true,\r\n\r\n    measureTextCache:{},\r\n    measureTextCellInfoCache:{},\r\n    measureTextCacheTimeOut:null,\r\n    cellOverflowMapCache:{},\r\n\r\n    zoomRatio:1,\r\n\r\n    visibledatacolumn_unique:null,\r\n    visibledatarow_unique:null,\r\n\r\n    showGridLines:true,\r\n\r\n    toobarObject: {}, //toolbar constant\r\n    inlineStringEditCache:null,\r\n    inlineStringEditRange:null,\r\n\r\n    fontList:[],\r\n    defaultFontSize: 10,\r\n\r\n    currentSheetView:\"viewNormal\",\r\n\r\n    // cooperative editing\r\n    cooperativeEdit:{\r\n        usernameTimeout:{\r\n\r\n        },\r\n        changeCollaborationSize:[], //改变行高或者列宽时，协同提示框需要跟随改变所需数据\r\n        allDataColumnlen:[],//列宽发生过改变的列\r\n        merge_range:{},//合并时单元格信息\r\n        checkoutData:[],//切换表格页时所需数据\r\n    },\r\n\r\n    // Resources that currently need to be loaded asynchronously, especially plugins. 'Core' marks the core rendering process.\r\n    asyncLoad:['core'],\r\n    // 默认单元格\r\n    defaultCell: {\r\n        bg: null,\r\n        bl: 0,\r\n        ct: {fa: \"General\", t: \"n\"},\r\n        fc: \"rgb(51, 51, 51)\",\r\n        ff: 0,\r\n        fs: 11,\r\n        ht: 1,\r\n        it: 0,\r\n        vt: 1,\r\n        m: '',\r\n        v: ''\r\n    },\r\n    conditionFormatCells: {}, // 条件格式高亮的单元格\r\n\r\n}\r\n\r\nexport default Store;"
  },
  {
    "path": "src/utils/chartUtil.js",
    "content": "/**\r\n * 生成随机图表id\r\n */\r\nfunction generateRandomKey(prefix) {\r\n    if (prefix == null) {\r\n        prefix = 'chart'\r\n    }\r\n\r\n    var userAgent = window.navigator.userAgent\r\n        .replace(/[^a-zA-Z0-9]/g, '')\r\n        .split('')\r\n    var mid = ''\r\n    for (var i = 0; i < 12; i++) {\r\n        mid += userAgent[Math.round(Math.random() * (userAgent.length - 1))]\r\n    }\r\n    var time = new Date().getTime()\r\n\r\n    return prefix + '_' + mid + '_' + time\r\n}\r\n/**\r\n * 深度克隆数据,包括对象，数组，map\r\n * @param {*} obj 对象，数组，map\r\n */\r\nfunction deepCopy(obj) {\r\n    if (!isObject(obj) && !isMap(obj)) {\r\n        return obj;\r\n    }\r\n\r\n    let cloneObj;\r\n    if (isMap(obj)) {\r\n        cloneObj = new Map();\r\n        for (let key of obj.keys()) {\r\n            let value = obj.get(key);\r\n            if (isMap(value) || isObject(value) || Array.isArray(obj)) {\r\n                let copyVal = deepCopy(value);\r\n                cloneObj.set(key, copyVal);\r\n            } else {\r\n                cloneObj.set(key, value);\r\n            }\r\n        }\r\n    } else if (typeof obj === \"function\") {\r\n        cloneObj = obj\r\n    } else {\r\n        cloneObj = Array.isArray(obj) ? [] : {};\r\n        if (obj instanceof HTMLElement) {\r\n            cloneObj = obj.cloneNode(true)\r\n        } else {\r\n            for (let key in obj) {\r\n                // if (obj.hasOwnProperty(key)) {\r\n                if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n                    cloneObj[key] =\r\n                        isMap(obj[key]) || isObject(obj[key])\r\n                            ? deepCopy(obj[key])\r\n                            : obj[key];\r\n                }\r\n            }\r\n\r\n        }\r\n    }\r\n    return cloneObj;\r\n}\r\n\r\n/**\r\n * 判断参数是否是Object类型\r\n * @param {*} o \r\n */\r\nfunction isObject(o) {\r\n    return (\r\n        !isMap(o) &&\r\n        (typeof o === 'object' || typeof o === 'function') &&\r\n        o !== null\r\n    );\r\n}\r\n\r\n/**\r\n * 判断参数是否是Map类型\r\n * @param {*} obj \r\n */\r\nfunction isMap(obj) {\r\n    if (obj instanceof Map) {\r\n        return true;\r\n    } else {\r\n        return false;\r\n    }\r\n}\r\n\r\n// 替换temp中的${xxx}为指定内容 ,temp:字符串，这里指html代码，dataarry：一个对象{\"xxx\":\"替换的内容\"}\r\n// 例：luckysheet.replaceHtml(\"${image}\",{\"image\":\"abc\",\"jskdjslf\":\"abc\"})   ==>  abc\r\nfunction replaceHtml(temp, dataarry) {\r\n    return temp.replace(/\\$\\{([\\w]+)\\}/g, function (s1, s2) { var s = dataarry[s2]; if (typeof (s) != \"undefined\") { return s; } else { return s1; } });\r\n}\r\n\r\nfunction hasChinaword(s) {\r\n    var patrn = /[\\u4E00-\\u9FA5]|[\\uFE30-\\uFFA0]/gi;\r\n    if (!patrn.exec(s)) {\r\n        return false;\r\n    }\r\n    else {\r\n        return true;\r\n    }\r\n}\r\n\r\nexport {\r\n    isMap,\r\n    isObject,\r\n    deepCopy,\r\n    generateRandomKey,\r\n    replaceHtml\r\n}"
  },
  {
    "path": "src/utils/math.js",
    "content": "import { isRealNum } from '../global/validate';\r\n\r\n/*\r\n * 判断obj是否为一个整数\r\n */\r\nfunction isInteger(obj) {\r\n    return Math.floor(obj) === obj;\r\n}\r\n\r\n/*\r\n * 将一个浮点数转成整数，返回整数和倍数。如 3.14 >> 314，倍数是 100\r\n * @param floatNum {number} 小数\r\n * @return {object}\r\n *   {times:100, num: 314}\r\n */\r\nfunction toInteger(floatNum) {\r\n    var ret = { times: 1, num: 0 };\r\n\r\n    if (isInteger(floatNum)) {\r\n        ret.num = floatNum;\r\n        return ret;\r\n    }\r\n\r\n    var strfi = floatNum + '';\r\n    var dotPos = strfi.indexOf('.');\r\n    var len = strfi.substr(dotPos + 1).length;\r\n    var times = Math.pow(10, len);\r\n    var intNum = parseInt(floatNum * times + 0.5, 10);\r\n\r\n    ret.times = times;\r\n    ret.num = intNum;\r\n\r\n    return ret;\r\n}\r\n\r\n/*\r\n * 核心方法，实现加减乘除运算，确保不丢失精度\r\n * 思路：把小数放大为整数（乘），进行算术运算，再缩小为小数（除）\r\n *\r\n * @param a {number} 运算数1\r\n * @param b {number} 运算数2\r\n * @param digits {number} 精度，保留的小数点数，比如 2, 即保留为两位小数\r\n * @param op {string} 运算类型，有加减乘除（add/subtract/multiply/divide）\r\n *\r\n */\r\nfunction operation(a, b, op) {\r\n    var o1 = toInteger(a);\r\n    var o2 = toInteger(b);\r\n    var n1 = o1.num;\r\n    var n2 = o2.num;\r\n    var t1 = o1.times;\r\n    var t2 = o2.times;\r\n    var max = t1 > t2 ? t1 : t2;\r\n    var result = null;\r\n\r\n    switch (op) {\r\n        case 'add':\r\n            if (t1 === t2) { // 两个小数位数相同\r\n                result = n1 + n2;\r\n            }\r\n            else if (t1 > t2) { // o1 小数位 大于 o2\r\n                result = n1 + n2 * (t1 / t2);\r\n            }\r\n            else { // o1 小数位 小于 o2\r\n                result = n1 * (t2 / t1) + n2;\r\n            }\r\n\r\n            return result / max;\r\n        case 'subtract':\r\n            if (t1 === t2) {\r\n                result = n1 - n2;\r\n            }\r\n            else if (t1 > t2) {\r\n                result = n1 - n2 * (t1 / t2);\r\n            }\r\n            else {\r\n                result = n1 * (t2 / t1) - n2;\r\n            }\r\n\r\n            return result / max;\r\n        case 'multiply':\r\n            result = (n1 * n2) / (t1 * t2);\r\n\r\n            return result;\r\n        case 'divide':\r\n            return result = function () {\r\n                var r1 = n1 / n2;\r\n                var r2 = t2 / t1;\r\n                return operation(r1, r2, 'multiply');\r\n            }();\r\n    }\r\n}\r\n/**\r\n * 做小数点的四舍五入计算\r\n * @param {*} num\r\n * @param {*} precision\r\n */\r\nfunction fixed(num, precision) {\r\n    if (!precision) {\r\n        precision = 2;\r\n    }\r\n    if (!isRealNum(num)) return num;\r\n    let s = num.toFixed(precision);\r\n    let index = s.indexOf('.');\r\n    let prefix = s.substring(0, index);\r\n    let suffix = s.substring(index + 1, s.length);\r\n    if (suffix) {\r\n        for (let i = suffix.length - 1; i != 0; i--) {\r\n            //最末位不为0，直接break;\r\n            if (suffix.charAt(i) != '0' && i == suffix.length - 1) {\r\n                break;\r\n            } else {\r\n                suffix = suffix.substring(0, i);\r\n            }\r\n        }\r\n    }\r\n    return Number(prefix + '.' + suffix);\r\n}\r\n\r\n\r\n/**\r\n * Calculation +-/* Solve the problem of js accuracy\r\n */\r\nNumber.prototype.add = function (value) {\r\n    let  number = parseFloat(value);\r\n    if (typeof number !== 'number' || Number.isNaN(number)) {\r\n        throw new Error('请输入数字或者数字字符串～');\r\n    };\r\n    return operation(this, number, 'add');\r\n};\r\nNumber.prototype.subtract = function (value) {\r\n    let  number = parseFloat(value);\r\n    if (typeof number !== 'number' || Number.isNaN(number)) {\r\n        throw new Error('请输入数字或者数字字符串～');\r\n    }\r\n    return operation(this, number, 'subtract');\r\n};\r\nNumber.prototype.multiply = function (value) {\r\n    let  number = parseFloat(value);\r\n    if (typeof number !== 'number' || Number.isNaN(number)) {\r\n        throw new Error('请输入数字或者数字字符串～');\r\n    }\r\n    return operation(this, number, 'multiply');\r\n};\r\nNumber.prototype.divide = function (value) {\r\n    let  number = parseFloat(value);\r\n    if (typeof number !== 'number' || Number.isNaN(number)) {\r\n        throw new Error('请输入数字或者数字字符串～');\r\n    }\r\n    return operation(this, number, 'divide');\r\n};\r\nNumber.prototype.tofixed = function (value) {\r\n    let  precision = parseFloat(value);\r\n    if (typeof precision !== 'number' || Number.isNaN(precision)) {\r\n        throw new Error('请输入数字或者数字字符串～');\r\n    }\r\n    return fixed(this, precision);\r\n};"
  },
  {
    "path": "src/utils/polyfill.js",
    "content": "    /**\r\n     * polyfill event in firefox\r\n     */\r\n\tfunction __firefox(){\r\n        HTMLElement.prototype.__defineGetter__(\"runtimeStyle\", __element_style);\r\n        window.constructor.prototype.__defineGetter__(\"event\", __window_event);\r\n        Event.prototype.__defineGetter__(\"srcElement\", __event_srcElement);\r\n    }\r\n\r\n    function __element_style(){\r\n        return this.style;\r\n    }\r\n\r\n    function __window_event(){\r\n        return __window_event_constructor();\r\n    }\r\n\r\n    function __event_srcElement(){\r\n        return this.target;\r\n    }\r\n\r\n    function __window_event_constructor(){\r\n        if(document.all){\r\n            return window.event;\r\n        }\r\n\r\n        var _caller = __window_event_constructor.caller;\r\n        \r\n        while(_caller != null){\r\n            var _argument = _caller.arguments[0];\r\n\r\n            if(_argument){\r\n                var _temp = _argument.constructor;\r\n                \r\n                if(_temp.toString().indexOf(\"Event\") != -1){\r\n                    return _argument;\r\n                }\r\n            }\r\n\r\n            _caller = _caller.caller;\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n    export default __firefox;"
  },
  {
    "path": "src/utils/util.js",
    "content": "import { columeHeader_word, columeHeader_word_index, luckysheetdefaultFont } from \"../controllers/constant\";\r\nimport menuButton from \"../controllers/menuButton\";\r\nimport { isdatatype, isdatatypemulti } from \"../global/datecontroll\";\r\nimport { hasChinaword, isRealNum } from \"../global/validate\";\r\nimport Store from \"../store\";\r\nimport locale from \"../locale/locale\";\r\nimport numeral from \"numeral\";\r\n// import method from '../global/method';\r\n\r\n/**\r\n * Common tool methods\r\n */\r\n\r\n/**\r\n * Determine whether a string is in standard JSON format\r\n * @param {String} str\r\n */\r\nfunction isJsonString(str) {\r\n    try {\r\n        if (typeof JSON.parse(str) == \"object\") {\r\n            return true;\r\n        }\r\n    } catch (e) {}\r\n    return false;\r\n}\r\n\r\n/**\r\n * extend two objects\r\n * @param {Object } jsonbject1\r\n * @param {Object } jsonbject2\r\n */\r\nfunction common_extend(jsonbject1, jsonbject2) {\r\n    let resultJsonObject = {};\r\n\r\n    for (let attr in jsonbject1) {\r\n        resultJsonObject[attr] = jsonbject1[attr];\r\n    }\r\n\r\n    for (let attr in jsonbject2) {\r\n        // undefined is equivalent to no setting\r\n        if (jsonbject2[attr] == undefined) {\r\n            continue;\r\n        }\r\n        resultJsonObject[attr] = jsonbject2[attr];\r\n    }\r\n\r\n    return resultJsonObject;\r\n}\r\n\r\n// 替换temp中的${xxx}为指定内容 ,temp:字符串，这里指html代码，dataarry：一个对象{\"xxx\":\"替换的内容\"}\r\n// 例：luckysheet.replaceHtml(\"${image}\",{\"image\":\"abc\",\"jskdjslf\":\"abc\"})   ==>  abc\r\nfunction replaceHtml(temp, dataarry) {\r\n    return temp.replace(/\\$\\{([\\w]+)\\}/g, function(s1, s2) {\r\n        let s = dataarry[s2];\r\n        if (typeof s != \"undefined\") {\r\n            return s;\r\n        } else {\r\n            return s1;\r\n        }\r\n    });\r\n}\r\n\r\n//获取数据类型\r\nfunction getObjType(obj) {\r\n    let toString = Object.prototype.toString;\r\n\r\n    let map = {\r\n        \"[object Boolean]\": \"boolean\",\r\n        \"[object Number]\": \"number\",\r\n        \"[object String]\": \"string\",\r\n        \"[object Function]\": \"function\",\r\n        \"[object Array]\": \"array\",\r\n        \"[object Date]\": \"date\",\r\n        \"[object RegExp]\": \"regExp\",\r\n        \"[object Undefined]\": \"undefined\",\r\n        \"[object Null]\": \"null\",\r\n        \"[object Object]\": \"object\",\r\n    };\r\n\r\n    // if(obj instanceof Element){\r\n    //     return 'element';\r\n    // }\r\n\r\n    return map[toString.call(obj)];\r\n}\r\n\r\n//获取当前日期时间\r\nfunction getNowDateTime(format) {\r\n    let now = new Date();\r\n    let year = now.getFullYear(); //得到年份\r\n    let month = now.getMonth(); //得到月份\r\n    let date = now.getDate(); //得到日期\r\n    let day = now.getDay(); //得到周几\r\n    let hour = now.getHours(); //得到小时\r\n    let minu = now.getMinutes(); //得到分钟\r\n    let sec = now.getSeconds(); //得到秒\r\n\r\n    month = month + 1;\r\n    if (month < 10) month = \"0\" + month;\r\n    if (date < 10) date = \"0\" + date;\r\n    if (hour < 10) hour = \"0\" + hour;\r\n    if (minu < 10) minu = \"0\" + minu;\r\n    if (sec < 10) sec = \"0\" + sec;\r\n\r\n    let time = \"\";\r\n\r\n    //日期\r\n    if (format == 1) {\r\n        time = year + \"-\" + month + \"-\" + date;\r\n    }\r\n    //日期时间\r\n    else if (format == 2) {\r\n        time = year + \"-\" + month + \"-\" + date + \" \" + hour + \":\" + minu + \":\" + sec;\r\n    }\r\n\r\n    return time;\r\n}\r\n\r\n//颜色 16进制转rgb\r\nfunction hexToRgb(hex) {\r\n    let color = [],\r\n        rgb = [];\r\n    hex = hex.replace(/#/, \"\");\r\n\r\n    if (hex.length == 3) {\r\n        // 处理 \"#abc\" 成 \"#aabbcc\"\r\n        let tmp = [];\r\n\r\n        for (let i = 0; i < 3; i++) {\r\n            tmp.push(hex.charAt(i) + hex.charAt(i));\r\n        }\r\n\r\n        hex = tmp.join(\"\");\r\n    }\r\n\r\n    for (let i = 0; i < 3; i++) {\r\n        color[i] = \"0x\" + hex.substr(i + 2, 2);\r\n        rgb.push(parseInt(Number(color[i])));\r\n    }\r\n\r\n    return \"rgb(\" + rgb.join(\",\") + \")\";\r\n}\r\n\r\n//颜色 rgb转16进制\r\nfunction rgbTohex(color) {\r\n    let rgb;\r\n\r\n    if (color.indexOf(\"rgba\") > -1) {\r\n        rgb = color\r\n            .replace(\"rgba(\", \"\")\r\n            .replace(\")\", \"\")\r\n            .split(\",\");\r\n    } else {\r\n        rgb = color\r\n            .replace(\"rgb(\", \"\")\r\n            .replace(\")\", \"\")\r\n            .split(\",\");\r\n    }\r\n\r\n    let r = parseInt(rgb[0]);\r\n    let g = parseInt(rgb[1]);\r\n    let b = parseInt(rgb[2]);\r\n\r\n    let hex = \"#\" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);\r\n\r\n    return hex;\r\n}\r\n\r\n//列下标  字母转数字\r\nfunction ABCatNum(a) {\r\n    // abc = abc.toUpperCase();\r\n\r\n    // let abc_len = abc.length;\r\n    // if (abc_len == 0) {\r\n    //     return NaN;\r\n    // }\r\n\r\n    // let abc_array = abc.split(\"\");\r\n    // let wordlen = columeHeader_word.length;\r\n    // let ret = 0;\r\n\r\n    // for (let i = abc_len - 1; i >= 0; i--) {\r\n    //     if (i == abc_len - 1) {\r\n    //         ret += columeHeader_word_index[abc_array[i]];\r\n    //     }\r\n    //     else {\r\n    //         ret += Math.pow(wordlen, abc_len - i - 1) * (columeHeader_word_index[abc_array[i]] + 1);\r\n    //     }\r\n    // }\r\n\r\n    // return ret;\r\n    if (a == null || a.length == 0) {\r\n        return NaN;\r\n    }\r\n    var str = a.toLowerCase().split(\"\");\r\n    var num = 0;\r\n    var al = str.length;\r\n    var getCharNumber = function(charx) {\r\n        return charx.charCodeAt() - 96;\r\n    };\r\n    var numout = 0;\r\n    var charnum = 0;\r\n    for (var i = 0; i < al; i++) {\r\n        charnum = getCharNumber(str[i]);\r\n        numout += charnum * Math.pow(26, al - i - 1);\r\n    }\r\n    // console.log(a, numout-1);\r\n    if (numout == 0) {\r\n        return NaN;\r\n    }\r\n    return numout - 1;\r\n}\r\n\r\n//列下标  数字转字母\r\nfunction chatatABC(n) {\r\n    // let wordlen = columeHeader_word.length;\r\n\r\n    // if (index < wordlen) {\r\n    //     return columeHeader_word[index];\r\n    // }\r\n    // else {\r\n    //     let last = 0, pre = 0, ret = \"\";\r\n    //     let i = 1, n = 0;\r\n\r\n    //     while (index >= (wordlen / (wordlen - 1)) * (Math.pow(wordlen, i++) - 1)) {\r\n    //         n = i;\r\n    //     }\r\n\r\n    //     let index_ab = index - (wordlen / (wordlen - 1)) * (Math.pow(wordlen, n - 1) - 1);//970\r\n    //     last = index_ab + 1;\r\n\r\n    //     for (let x = n; x > 0; x--) {\r\n    //         let last1 = last, x1 = x;//-702=268, 3\r\n\r\n    //         if (x == 1) {\r\n    //             last1 = last1 % wordlen;\r\n\r\n    //             if (last1 == 0) {\r\n    //                 last1 = 26;\r\n    //             }\r\n\r\n    //             return ret + columeHeader_word[last1 - 1];\r\n    //         }\r\n\r\n    //         last1 = Math.ceil(last1 / Math.pow(wordlen, x - 1));\r\n    //         //last1 = last1 % wordlen;\r\n    //         ret += columeHeader_word[last1 - 1];\r\n\r\n    //         if (x > 1) {\r\n    //             last = last - (last1 - 1) * wordlen;\r\n    //         }\r\n    //     }\r\n    // }\r\n\r\n    var orda = \"a\".charCodeAt(0);\r\n\r\n    var ordz = \"z\".charCodeAt(0);\r\n\r\n    var len = ordz - orda + 1;\r\n\r\n    var s = \"\";\r\n\r\n    while (n >= 0) {\r\n        s = String.fromCharCode((n % len) + orda) + s;\r\n\r\n        n = Math.floor(n / len) - 1;\r\n    }\r\n\r\n    return s.toUpperCase();\r\n}\r\n\r\nfunction ceateABC(index) {\r\n    let wordlen = columeHeader_word.length;\r\n\r\n    if (index < wordlen) {\r\n        return columeHeader_word;\r\n    } else {\r\n        let relist = [];\r\n        let i = 2,\r\n            n = 0;\r\n\r\n        while (index < (wordlen / (wordlen - 1)) * (Math.pow(wordlen, i) - 1)) {\r\n            n = i;\r\n            i++;\r\n        }\r\n\r\n        for (let x = 0; x < n; x++) {\r\n            if (x == 0) {\r\n                relist = relist.concat(columeHeader_word);\r\n            } else {\r\n                relist = relist.concat(createABCdim(x), index);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nfunction createABCdim(x, count) {\r\n    let chwl = columeHeader_word.length;\r\n\r\n    if (x == 1) {\r\n        let ret = [];\r\n        let c = 0,\r\n            con = true;\r\n\r\n        for (let i = 0; i < chwl; i++) {\r\n            let b = columeHeader_word[i];\r\n\r\n            for (let n = 0; n < chwl; n++) {\r\n                let bq = b + columeHeader_word[n];\r\n                ret.push(bq);\r\n                c++;\r\n\r\n                if (c > index) {\r\n                    return ret;\r\n                }\r\n            }\r\n        }\r\n    } else if (x == 2) {\r\n        let ret = [];\r\n        let c = 0,\r\n            con = true;\r\n\r\n        for (let i = 0; i < chwl; i++) {\r\n            let bb = columeHeader_word[i];\r\n\r\n            for (let w = 0; w < chwl; w++) {\r\n                let aa = columeHeader_word[w];\r\n\r\n                for (let n = 0; n < chwl; n++) {\r\n                    let bqa = bb + aa + columeHeader_word[n];\r\n                    ret.push(bqa);\r\n                    c++;\r\n\r\n                    if (c > index) {\r\n                        return ret;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * 计算字符串字节长度\r\n * @param {*} val 字符串\r\n * @param {*} subLen 要截取的字符串长度\r\n */\r\nfunction getByteLen(val, subLen) {\r\n    if (subLen === 0) {\r\n        return \"\";\r\n    }\r\n\r\n    if (val == null) {\r\n        return 0;\r\n    }\r\n\r\n    let len = 0;\r\n    for (let i = 0; i < val.length; i++) {\r\n        let a = val.charAt(i);\r\n\r\n        if (a.match(/[^\\x00-\\xff]/gi) != null) {\r\n            len += 2;\r\n        } else {\r\n            len += 1;\r\n        }\r\n\r\n        if (isRealNum(subLen) && len === ~~subLen) {\r\n            return val.substring(0, i);\r\n        }\r\n    }\r\n\r\n    return len;\r\n}\r\n\r\n//数组去重\r\nfunction ArrayUnique(dataArr) {\r\n    let result = [];\r\n    let obj = {};\r\n    if (dataArr.length > 0) {\r\n        for (let i = 0; i < dataArr.length; i++) {\r\n            let item = dataArr[i];\r\n            if (!obj[item]) {\r\n                result.push(item);\r\n                obj[item] = 1;\r\n            }\r\n        }\r\n    }\r\n    return result;\r\n}\r\n\r\n//获取字体配置\r\nfunction luckysheetfontformat(format) {\r\n    let fontarray = locale().fontarray;\r\n    if (getObjType(format) == \"object\") {\r\n        let font = \"\";\r\n\r\n        //font-style\r\n        if (format.it == \"0\" || format.it == null) {\r\n            font += \"normal \";\r\n        } else {\r\n            font += \"italic \";\r\n        }\r\n\r\n        //font-variant\r\n        font += \"normal \";\r\n\r\n        //font-weight\r\n        if (format.bl == \"0\" || format.bl == null) {\r\n            font += \"normal \";\r\n        } else {\r\n            font += \"bold \";\r\n        }\r\n\r\n        //font-size/line-height\r\n        if (!format.fs) {\r\n            font += Store.defaultFontSize + \"pt \";\r\n        } else {\r\n            font += Math.ceil(format.fs) + \"pt \";\r\n        }\r\n\r\n        if (!format.ff) {\r\n            font +=\r\n                fontarray[0] +\r\n                ', \"Helvetica Neue\", Helvetica, Arial, \"PingFang SC\", \"Hiragino Sans GB\", \"Heiti SC\", \"Microsoft YaHei\", \"WenQuanYi Micro Hei\", sans-serif';\r\n        } else {\r\n            let fontfamily = null;\r\n            let fontjson = locale().fontjson;\r\n            if (isdatatypemulti(format.ff)[\"num\"]) {\r\n                fontfamily = fontarray[parseInt(format.ff)];\r\n            } else {\r\n                // fontfamily = fontarray[fontjson[format.ff]];\r\n                fontfamily = format.ff;\r\n\r\n                fontfamily = fontfamily.replace(/\"/g, \"\").replace(/'/g, \"\");\r\n\r\n                if (fontfamily.indexOf(\" \") > -1) {\r\n                    fontfamily = '\"' + fontfamily + '\"';\r\n                }\r\n\r\n                if (fontfamily != null && document.fonts && !document.fonts.check(\"12px \" + fontfamily)) {\r\n                    menuButton.addFontTolist(fontfamily);\r\n                }\r\n            }\r\n\r\n            if (fontfamily == null) {\r\n                fontfamily = fontarray[0];\r\n            }\r\n\r\n            font +=\r\n                fontfamily +\r\n                ', \"Helvetica Neue\", Helvetica, Arial, \"PingFang SC\", \"Hiragino Sans GB\", \"Heiti SC\", \"Microsoft YaHei\", \"WenQuanYi Micro Hei\", sans-serif';\r\n        }\r\n\r\n        return font;\r\n    } else {\r\n        return luckysheetdefaultFont();\r\n    }\r\n}\r\n\r\n//右键菜单\r\nfunction showrightclickmenu($menu, x, y) {\r\n    let winH = $(window).height(),\r\n        winW = $(window).width();\r\n    let menuW = $menu.width(),\r\n        menuH = $menu.height();\r\n    let top = y,\r\n        left = x;\r\n\r\n    if (x + menuW > winW) {\r\n        left = x - menuW;\r\n    }\r\n\r\n    if (y + menuH > winH) {\r\n        top = y - menuH;\r\n    }\r\n\r\n    if (top < 0) {\r\n        top = 0;\r\n    }\r\n\r\n    $menu.css({ top: top, left: left }).show();\r\n}\r\n\r\n//单元格编辑聚焦\r\nfunction luckysheetactiveCell() {\r\n    if (!!Store.fullscreenmode) {\r\n        setTimeout(function() {\r\n            // need preventScroll:true,fix Luckysheet has been set top, and clicking the cell will trigger the scrolling problem\r\n            const input = document.getElementById(\"luckysheet-rich-text-editor\");\r\n            input.focus({ preventScroll: true });\r\n            $(\"#luckysheet-rich-text-editor\").select();\r\n            // $(\"#luckysheet-rich-text-editor\").focus().select();\r\n        }, 50);\r\n    }\r\n}\r\n\r\n//单元格编辑聚焦\r\nfunction luckysheetContainerFocus() {\r\n    // $(\"#\" + Store.container).focus({\r\n    //     preventScroll: true\r\n    // });\r\n\r\n    // fix jquery error: Uncaught TypeError: ((n.event.special[g.origType] || {}).handle || g.handler).apply is not a function\r\n    // $(\"#\" + Store.container).attr(\"tabindex\", 0).focus();\r\n\r\n    // need preventScroll:true,fix Luckysheet has been set top, and clicking the cell will trigger the scrolling problem fix #794 #152\r\n    document.getElementById(Store.container).focus({ preventScroll: true });\r\n}\r\n\r\n//数字格式\r\nfunction numFormat(num, type) {\r\n    if (num == null || isNaN(parseFloat(num)) || hasChinaword(num) || num == -Infinity || num == Infinity) {\r\n        return null;\r\n    }\r\n\r\n    let floatlen = 6,\r\n        ismustfloat = false;\r\n    if (type == null || type == \"auto\") {\r\n        if (num < 1) {\r\n            floatlen = 6;\r\n        } else {\r\n            floatlen = 1;\r\n        }\r\n    } else {\r\n        if (isdatatype(type) == \"num\") {\r\n            floatlen = parseInt(type);\r\n            ismustfloat = true;\r\n        } else {\r\n            floatlen = 6;\r\n        }\r\n    }\r\n\r\n    let format = \"\",\r\n        value = null;\r\n    for (let i = 0; i < floatlen; i++) {\r\n        format += \"0\";\r\n    }\r\n\r\n    if (!ismustfloat) {\r\n        format = \"[\" + format + \"]\";\r\n    }\r\n\r\n    if (num >= 1e21) {\r\n        value = parseFloat(numeral(num).value());\r\n    } else {\r\n        value = parseFloat(numeral(num).format(\"0.\" + format));\r\n    }\r\n\r\n    return value;\r\n}\r\n\r\nfunction numfloatlen(n) {\r\n    if (n != null && !isNaN(parseFloat(n)) && !hasChinaword(n)) {\r\n        let value = numeral(n).value();\r\n        let lens = value.toString().split(\".\");\r\n\r\n        if (lens.length == 1) {\r\n            lens = 0;\r\n        } else {\r\n            lens = lens[1].length;\r\n        }\r\n\r\n        return lens;\r\n    } else {\r\n        return null;\r\n    }\r\n}\r\n\r\n//二级菜单显示位置\r\nfunction mouseclickposition($menu, x, y, p) {\r\n    let winH = $(window).height(),\r\n        winW = $(window).width();\r\n    let menuW = $menu.width(),\r\n        menuH = $menu.height();\r\n    let top = y,\r\n        left = x;\r\n\r\n    if (p == null) {\r\n        p = \"lefttop\";\r\n    }\r\n\r\n    if (p == \"lefttop\") {\r\n        $menu.css({ top: y, left: x }).show();\r\n    } else if (p == \"righttop\") {\r\n        $menu.css({ top: y, left: x - menuW }).show();\r\n    } else if (p == \"leftbottom\") {\r\n        $menu.css({ bottom: winH - y - 12, left: x }).show();\r\n    } else if (p == \"rightbottom\") {\r\n        $menu.css({ bottom: winH - y - 12, left: x - menuW }).show();\r\n    }\r\n}\r\n\r\n/**\r\n * 元素选择器\r\n * @param {String}  selector css选择器\r\n * @param {String}  context  指定父级DOM\r\n */\r\nfunction $$(selector, context) {\r\n    context = context || document;\r\n    var elements = context.querySelectorAll(selector);\r\n    return elements.length == 1 ? Array.prototype.slice.call(elements)[0] : Array.prototype.slice.call(elements);\r\n}\r\n\r\n/**\r\n * 串行加载指定的脚本\r\n * 串行加载[异步]逐个加载，每个加载完成后加载下一个\r\n * 全部加载完成后执行回调\r\n * @param {Array|String}  scripts 指定要加载的脚本\r\n * @param {Object} options 属性设置\r\n * @param {Function} callback 成功后回调的函数\r\n * @return {Array} 所有生成的脚本元素对象数组\r\n */\r\n\r\nfunction seriesLoadScripts(scripts, options, callback) {\r\n    if (typeof scripts !== \"object\") {\r\n        var scripts = [scripts];\r\n    }\r\n    var HEAD = document.getElementsByTagName(\"head\")[0] || document.documentElement;\r\n    var s = [];\r\n    var last = scripts.length - 1;\r\n    //递归\r\n    var recursiveLoad = function(i) {\r\n        s[i] = document.createElement(\"script\");\r\n        s[i].setAttribute(\"type\", \"text/javascript\");\r\n        // Attach handlers for all browsers\r\n        // 异步\r\n        s[i].onload = s[i].onreadystatechange = function() {\r\n            if (!(/*@cc_on!@*/ 0) || this.readyState === \"loaded\" || this.readyState === \"complete\") {\r\n                this.onload = this.onreadystatechange = null;\r\n                this.parentNode.removeChild(this);\r\n                if (i !== last) {\r\n                    recursiveLoad(i + 1);\r\n                } else if (typeof callback === \"function\") {\r\n                    callback();\r\n                }\r\n            }\r\n        };\r\n        // 同步\r\n        s[i].setAttribute(\"src\", scripts[i]);\r\n\r\n        // 设置属性\r\n        if (typeof options === \"object\") {\r\n            for (var attr in options) {\r\n                s[i].setAttribute(attr, options[attr]);\r\n            }\r\n        }\r\n\r\n        HEAD.appendChild(s[i]);\r\n    };\r\n    recursiveLoad(0);\r\n}\r\n\r\n/**\r\n * 并行加载指定的脚本\r\n * 并行加载[同步]同时加载，不管上个是否加载完成，直接加载全部\r\n * 全部加载完成后执行回调\r\n * @param {Array|String}  scripts 指定要加载的脚本\r\n * @param {Object} options 属性设置\r\n * @param {Function} callback 成功后回调的函数\r\n * @return {Array} 所有生成的脚本元素对象数组\r\n */\r\n\r\nfunction parallelLoadScripts(scripts, options, callback) {\r\n    if (typeof scripts !== \"object\") {\r\n        var scripts = [scripts];\r\n    }\r\n    var HEAD = document.getElementsByTagName(\"head\")[0] || document.documentElement;\r\n    var s = [];\r\n    var loaded = 0;\r\n    for (var i = 0; i < scripts.length; i++) {\r\n        s[i] = document.createElement(\"script\");\r\n        s[i].setAttribute(\"type\", \"text/javascript\");\r\n        // Attach handlers for all browsers\r\n        // 异步\r\n        s[i].onload = s[i].onreadystatechange = function() {\r\n            if (!(/*@cc_on!@*/ 0) || this.readyState === \"loaded\" || this.readyState === \"complete\") {\r\n                loaded++;\r\n                this.onload = this.onreadystatechange = null;\r\n                this.parentNode.removeChild(this);\r\n                if (loaded === scripts.length && typeof callback === \"function\") callback();\r\n            }\r\n        };\r\n        // 同步\r\n        s[i].setAttribute(\"src\", scripts[i]);\r\n\r\n        // 设置属性\r\n        if (typeof options === \"object\") {\r\n            for (var attr in options) {\r\n                s[i].setAttribute(attr, options[attr]);\r\n            }\r\n        }\r\n\r\n        HEAD.appendChild(s[i]);\r\n    }\r\n}\r\n\r\n/**\r\n * 动态添加css\r\n * @param {String}  url 指定要加载的css地址\r\n */\r\nfunction loadLink(url) {\r\n    var doc = document;\r\n    var link = doc.createElement(\"link\");\r\n    link.setAttribute(\"rel\", \"stylesheet\");\r\n    link.setAttribute(\"type\", \"text/css\");\r\n    link.setAttribute(\"href\", url);\r\n\r\n    var heads = doc.getElementsByTagName(\"head\");\r\n    if (heads.length) {\r\n        heads[0].appendChild(link);\r\n    } else {\r\n        doc.documentElement.appendChild(link);\r\n    }\r\n}\r\n\r\n/**\r\n * 动态添加一组css\r\n * @param {String}  url 指定要加载的css地址\r\n */\r\nfunction loadLinks(urls) {\r\n    if (typeof urls !== \"object\") {\r\n        urls = [urls];\r\n    }\r\n    if (urls.length) {\r\n        urls.forEach((url) => {\r\n            loadLink(url);\r\n        });\r\n    }\r\n}\r\n\r\nfunction transformRangeToAbsolute(txt1) {\r\n    if (txt1 == null || txt1.length == 0) {\r\n        return null;\r\n    }\r\n\r\n    let txtArray = txt1.split(\",\");\r\n    let ret = \"\";\r\n    for (let i = 0; i < txtArray.length; i++) {\r\n        let txt = txtArray[i];\r\n        let txtSplit = txt.split(\"!\"),\r\n            sheetName = \"\",\r\n            rangeTxt = \"\";\r\n        if (txtSplit.length > 1) {\r\n            sheetName = txtSplit[0];\r\n            rangeTxt = txtSplit[1];\r\n        } else {\r\n            rangeTxt = txtSplit[0];\r\n        }\r\n\r\n        let rangeTxtArray = rangeTxt.split(\":\");\r\n\r\n        let rangeRet = \"\";\r\n        for (let a = 0; a < rangeTxtArray.length; a++) {\r\n            let t = rangeTxtArray[a];\r\n\r\n            let row = t.replace(/[^0-9]/g, \"\");\r\n            let col = t.replace(/[^A-Za-z]/g, \"\");\r\n            let rangeTT = \"\";\r\n            if (col != \"\") {\r\n                rangeTT += \"$\" + col;\r\n            }\r\n\r\n            if (row != \"\") {\r\n                rangeTT += \"$\" + row;\r\n            }\r\n\r\n            rangeRet += rangeTT + \":\";\r\n        }\r\n\r\n        rangeRet = rangeRet.substr(0, rangeRet.length - 1);\r\n\r\n        ret += sheetName + rangeRet + \",\";\r\n    }\r\n\r\n    return ret.substr(0, ret.length - 1);\r\n}\r\n\r\nfunction openSelfModel(id, isshowMask = true) {\r\n    let $t = $(\"#\" + id)\r\n            .find(\".luckysheet-modal-dialog-content\")\r\n            .css(\"min-width\", 300)\r\n            .end(),\r\n        myh = $t.outerHeight(),\r\n        myw = $t.outerWidth();\r\n    let winw = $(window).width(),\r\n        winh = $(window).height();\r\n    let scrollLeft = $(document).scrollLeft(),\r\n        scrollTop = $(document).scrollTop();\r\n    $t.css({\r\n        left: (winw + scrollLeft - myw) / 2,\r\n        top: (winh + scrollTop - myh) / 3,\r\n    }).show();\r\n\r\n    if (isshowMask) {\r\n        $(\"#luckysheet-modal-dialog-mask\").show();\r\n    }\r\n}\r\n\r\n/**\r\n * 监控对象变更\r\n * @param {*} data\r\n */\r\n// const createProxy = (data,list=[]) => {\r\n//     if (typeof data === 'object' && data.toString() === '[object Object]') {\r\n//       for (let k in data) {\r\n//         if(list.includes(k)){\r\n//             if (typeof data[k] === 'object') {\r\n//               defineObjectReactive(data, k, data[k])\r\n//             } else {\r\n//               defineBasicReactive(data, k, data[k])\r\n//             }\r\n//         }\r\n//       }\r\n//     }\r\n// }\r\n\r\nconst createProxy = (data, k, callback) => {\r\n    if (!data.hasOwnProperty(k)) {\r\n        console.info(\"No %s in data\", k);\r\n        return;\r\n    }\r\n\r\n    if (getObjType(data) === \"object\") {\r\n        if (getObjType(data[k]) === \"object\" || getObjType(data[k]) === \"array\") {\r\n            defineObjectReactive(data, k, data[k], callback);\r\n        } else {\r\n            defineBasicReactive(data, k, data[k], callback);\r\n        }\r\n    }\r\n};\r\n\r\nfunction defineObjectReactive(obj, key, value, callback) {\r\n    // 递归\r\n    obj[key] = new Proxy(value, {\r\n        set(target, property, val, receiver) {\r\n            setTimeout(() => {\r\n                callback(target, property, val, receiver);\r\n            }, 0);\r\n\r\n            return Reflect.set(target, property, val, receiver);\r\n        },\r\n    });\r\n}\r\n\r\nfunction defineBasicReactive(obj, key, value, callback) {\r\n    Object.defineProperty(obj, key, {\r\n        enumerable: true,\r\n        configurable: false,\r\n        get() {\r\n            return value;\r\n        },\r\n        set(newValue) {\r\n            if (value === newValue) return;\r\n            console.log(`发现 ${key} 属性 ${value} -> ${newValue}`);\r\n\r\n            setTimeout(() => {\r\n                callback(value, newValue);\r\n            }, 0);\r\n\r\n            value = newValue;\r\n        },\r\n    });\r\n}\r\n\r\n/**\r\n * Remove an item in the specified array\r\n * @param {array} array Target array\r\n * @param {string} item What needs to be removed\r\n */\r\nfunction arrayRemoveItem(array, item) {\r\n    array.some((curr, index, arr) => {\r\n        if (curr === item) {\r\n            arr.splice(index, 1);\r\n            return curr === item;\r\n        }\r\n    });\r\n}\r\n\r\n/**\r\n * camel 形式的单词转换为 - 形式 如 fillColor -> fill-color\r\n * @param {string} camel camel 形式\r\n * @returns\r\n */\r\nfunction camel2split(camel) {\r\n    return camel.replace(/([A-Z])/g, function(all, group) {\r\n        return \"-\" + group.toLowerCase();\r\n    });\r\n}\r\n\r\nexport {\r\n    isJsonString,\r\n    common_extend,\r\n    replaceHtml,\r\n    getObjType,\r\n    getNowDateTime,\r\n    hexToRgb,\r\n    rgbTohex,\r\n    ABCatNum,\r\n    chatatABC,\r\n    ceateABC,\r\n    createABCdim,\r\n    getByteLen,\r\n    ArrayUnique,\r\n    luckysheetfontformat,\r\n    showrightclickmenu,\r\n    luckysheetactiveCell,\r\n    numFormat,\r\n    numfloatlen,\r\n    mouseclickposition,\r\n    $$,\r\n    seriesLoadScripts,\r\n    parallelLoadScripts,\r\n    loadLinks,\r\n    luckysheetContainerFocus,\r\n    transformRangeToAbsolute,\r\n    openSelfModel,\r\n    createProxy,\r\n    arrayRemoveItem,\r\n    camel2split,\r\n};\r\n"
  }
]